@adcp/sdk 15.2.0 → 15.2.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 (1814) hide show
  1. package/ADCP_VERSION +1 -1
  2. package/compliance/cache/{3.2.1/protocols → 3.2.3/domains}/creative/scenarios/evaluator_auth.yaml +2 -2
  3. package/compliance/cache/{3.2.1/protocols → 3.2.3/domains}/media-buy/scenarios/acceptance_policy_discovery.yaml +20 -2
  4. package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/advanced_delivery_reporting.yaml +8 -1
  5. package/compliance/cache/{3.2.1/protocols → 3.2.3/domains}/media-buy/scenarios/proposal_finalize.yaml +16 -1
  6. package/compliance/cache/{3.2.1 → 3.2.3}/index.json +6 -4
  7. package/compliance/cache/{3.2.1/domains → 3.2.3/protocols}/creative/scenarios/evaluator_auth.yaml +2 -2
  8. package/compliance/cache/{3.2.1/domains → 3.2.3/protocols}/media-buy/scenarios/acceptance_policy_discovery.yaml +20 -2
  9. package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/advanced_delivery_reporting.yaml +8 -1
  10. package/compliance/cache/{3.2.1/domains → 3.2.3/protocols}/media-buy/scenarios/proposal_finalize.yaml +16 -1
  11. package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/sales-guaranteed/index.yaml +267 -153
  12. package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/README.md +19 -0
  13. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/negative/001-unsigned-sendmessage-required.json +38 -0
  14. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/negative/002-unsigned-message-send-v0-3-required.json +36 -0
  15. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/negative/003-unsigned-sendstreamingmessage-required.json +38 -0
  16. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/negative/004-duplicate-invocation-datapart.json +37 -0
  17. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/negative/005-signed-duplicate-invocation-datapart.json +41 -0
  18. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/negative/006-missing-skill.json +37 -0
  19. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/negative/007-protocol-method-required-covers-sendmessage.json +44 -0
  20. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/negative/008-no-extension-header.json +37 -0
  21. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/negative/009-extra-non-invocation-datapart.json +37 -0
  22. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/negative/010-filepart-present.json +37 -0
  23. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/negative/011-part-with-text-and-data.json +37 -0
  24. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/negative/012-non-object-data.json +37 -0
  25. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/negative/013-v0-3-kind-mismatch.json +35 -0
  26. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/negative/014-duplicate-skill-key.json +37 -0
  27. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/negative/015-non-string-skill.json +37 -0
  28. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/negative/016-text-only-message.json +37 -0
  29. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/negative/017-unsigned-message-stream-v0-3-required.json +36 -0
  30. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/negative/018-unresolvable-with-lone-signature-header.json +38 -0
  31. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/negative/019-raw-part-present.json +37 -0
  32. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/negative/020-case-variant-member-name.json +37 -0
  33. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/negative/021-escaped-duplicate-skill-key.json +37 -0
  34. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/negative/022-unsigned-http-json-message-send-required.json +38 -0
  35. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/negative/023-batch-body.json +37 -0
  36. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/negative/024-duplicate-method-key.json +37 -0
  37. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/negative/025-missing-method.json +37 -0
  38. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/negative/026-empty-skill.json +37 -0
  39. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/positive/001-signed-sendmessage-create-media-buy.json +41 -0
  40. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/positive/002-signed-message-send-v0-3-create-media-buy.json +39 -0
  41. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/positive/003-unsigned-sendmessage-get-products-not-required.json +37 -0
  42. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/positive/004-unsigned-decoy-text-and-metadata.json +38 -0
  43. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/positive/005-unsigned-alias-skill-not-in-lists.json +38 -0
  44. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/positive/006-unsigned-message-send-v0-3-legacy-parameters.json +35 -0
  45. package/compliance/cache/3.2.3/test-vectors/request-signing/a2a/positive/007-unsigned-method-case-variant.json +38 -0
  46. package/compliance/cache/{3.2.1 → 3.2.3}/universal/ctv-experience-validate-input.yaml +0 -1
  47. package/compliance/cache/{3.2.1 → 3.2.3}/universal/premium-display-canonical-validation.yaml +0 -1
  48. package/dist/lib/compliance-fixtures/canonical-storyboards-provenance.json +4 -4
  49. package/dist/lib/compliance-fixtures/canonical-storyboards.d.mts +2 -2
  50. package/dist/lib/compliance-fixtures/canonical-storyboards.d.ts +2 -2
  51. package/dist/lib/negotiation/commercial-terms-semantics.d.mts +1 -1
  52. package/dist/lib/negotiation/commercial-terms-semantics.d.ts +1 -1
  53. package/dist/lib/negotiation/commercial-terms-semantics.js +11 -0
  54. package/dist/lib/negotiation/commercial-terms-semantics.mjs +11 -0
  55. package/dist/lib/schemas-data/3.2/a2ui/bound-value.json +1 -1
  56. package/dist/lib/schemas-data/3.2/a2ui/component.json +1 -1
  57. package/dist/lib/schemas-data/3.2/a2ui/si-catalog.json +25 -25
  58. package/dist/lib/schemas-data/3.2/a2ui/surface.json +2 -2
  59. package/dist/lib/schemas-data/3.2/a2ui/user-action.json +1 -1
  60. package/dist/lib/schemas-data/3.2/aao/agent-publishers.json +1 -1
  61. package/dist/lib/schemas-data/3.2/account/get-account-financials-request.json +6 -6
  62. package/dist/lib/schemas-data/3.2/account/get-account-financials-response.json +12 -12
  63. package/dist/lib/schemas-data/3.2/account/list-account-changes-request.json +4 -4
  64. package/dist/lib/schemas-data/3.2/account/list-account-changes-response.json +7 -7
  65. package/dist/lib/schemas-data/3.2/account/list-accounts-request.json +6 -6
  66. package/dist/lib/schemas-data/3.2/account/list-accounts-response.json +8 -8
  67. package/dist/lib/schemas-data/3.2/account/report-usage-request.json +6 -6
  68. package/dist/lib/schemas-data/3.2/account/report-usage-response.json +6 -6
  69. package/dist/lib/schemas-data/3.2/account/sync-accounts-request.json +16 -16
  70. package/dist/lib/schemas-data/3.2/account/sync-accounts-response.json +22 -22
  71. package/dist/lib/schemas-data/3.2/account/sync-governance-request.json +5 -5
  72. package/dist/lib/schemas-data/3.2/account/sync-governance-response.json +10 -10
  73. package/dist/lib/schemas-data/3.2/adagents.json +30 -30
  74. package/dist/lib/schemas-data/3.2/brand/acquire-rights-request.json +12 -12
  75. package/dist/lib/schemas-data/3.2/brand/acquire-rights-response.json +16 -16
  76. package/dist/lib/schemas-data/3.2/brand/creative-approval-request.json +5 -5
  77. package/dist/lib/schemas-data/3.2/brand/creative-approval-response.json +12 -12
  78. package/dist/lib/schemas-data/3.2/brand/get-brand-identity-request.json +4 -4
  79. package/dist/lib/schemas-data/3.2/brand/get-brand-identity-response.json +10 -10
  80. package/dist/lib/schemas-data/3.2/brand/get-rights-request.json +8 -8
  81. package/dist/lib/schemas-data/3.2/brand/get-rights-response.json +11 -11
  82. package/dist/lib/schemas-data/3.2/brand/revocation-notification.json +4 -4
  83. package/dist/lib/schemas-data/3.2/brand/rights-pricing-option.json +5 -5
  84. package/dist/lib/schemas-data/3.2/brand/rights-terms.json +3 -3
  85. package/dist/lib/schemas-data/3.2/brand/search-brands-request.json +6 -6
  86. package/dist/lib/schemas-data/3.2/brand/search-brands-response.json +11 -11
  87. package/dist/lib/schemas-data/3.2/brand/update-rights-request.json +6 -6
  88. package/dist/lib/schemas-data/3.2/brand/update-rights-response.json +11 -11
  89. package/dist/lib/schemas-data/3.2/brand/verification-status.json +1 -1
  90. package/dist/lib/schemas-data/3.2/brand/verify-brand-claim-request.json +3 -3
  91. package/dist/lib/schemas-data/3.2/brand/verify-brand-claim-response.json +13 -13
  92. package/dist/lib/schemas-data/3.2/brand/verify-brand-claims-request.json +3 -3
  93. package/dist/lib/schemas-data/3.2/brand/verify-brand-claims-response.json +13 -13
  94. package/dist/lib/schemas-data/3.2/brand.json +31 -28
  95. package/dist/lib/schemas-data/3.2/bundled.schemas.br +0 -0
  96. package/dist/lib/schemas-data/3.2/collection/base-collection-source.json +3 -3
  97. package/dist/lib/schemas-data/3.2/collection/collection-list-changed-webhook.json +3 -3
  98. package/dist/lib/schemas-data/3.2/collection/collection-list-filters.json +7 -7
  99. package/dist/lib/schemas-data/3.2/collection/collection-list.json +5 -5
  100. package/dist/lib/schemas-data/3.2/collection/create-collection-list-request.json +8 -8
  101. package/dist/lib/schemas-data/3.2/collection/create-collection-list-response.json +6 -6
  102. package/dist/lib/schemas-data/3.2/collection/delete-collection-list-request.json +5 -5
  103. package/dist/lib/schemas-data/3.2/collection/delete-collection-list-response.json +5 -5
  104. package/dist/lib/schemas-data/3.2/collection/get-collection-list-request.json +5 -5
  105. package/dist/lib/schemas-data/3.2/collection/get-collection-list-response.json +12 -12
  106. package/dist/lib/schemas-data/3.2/collection/list-collection-lists-request.json +6 -6
  107. package/dist/lib/schemas-data/3.2/collection/list-collection-lists-response.json +7 -7
  108. package/dist/lib/schemas-data/3.2/collection/update-collection-list-request.json +9 -9
  109. package/dist/lib/schemas-data/3.2/collection/update-collection-list-response.json +6 -6
  110. package/dist/lib/schemas-data/3.2/content-standards/artifact-webhook-payload.json +3 -3
  111. package/dist/lib/schemas-data/3.2/content-standards/artifact.json +8 -8
  112. package/dist/lib/schemas-data/3.2/content-standards/calibrate-content-request.json +5 -5
  113. package/dist/lib/schemas-data/3.2/content-standards/calibrate-content-response.json +10 -10
  114. package/dist/lib/schemas-data/3.2/content-standards/content-standards.json +7 -7
  115. package/dist/lib/schemas-data/3.2/content-standards/create-content-standards-request.json +8 -8
  116. package/dist/lib/schemas-data/3.2/content-standards/create-content-standards-response.json +8 -8
  117. package/dist/lib/schemas-data/3.2/content-standards/get-content-standards-request.json +4 -4
  118. package/dist/lib/schemas-data/3.2/content-standards/get-content-standards-response.json +9 -9
  119. package/dist/lib/schemas-data/3.2/content-standards/get-media-buy-artifacts-request.json +5 -5
  120. package/dist/lib/schemas-data/3.2/content-standards/get-media-buy-artifacts-response.json +10 -10
  121. package/dist/lib/schemas-data/3.2/content-standards/list-content-standards-request.json +6 -6
  122. package/dist/lib/schemas-data/3.2/content-standards/list-content-standards-response.json +10 -10
  123. package/dist/lib/schemas-data/3.2/content-standards/update-content-standards-request.json +8 -8
  124. package/dist/lib/schemas-data/3.2/content-standards/update-content-standards-response.json +8 -8
  125. package/dist/lib/schemas-data/3.2/content-standards/validate-content-delivery-request.json +5 -5
  126. package/dist/lib/schemas-data/3.2/content-standards/validate-content-delivery-response.json +10 -10
  127. package/dist/lib/schemas-data/3.2/core/acceptance-policy-profile-ids.json +1 -1
  128. package/dist/lib/schemas-data/3.2/core/account-authorization.json +1 -1
  129. package/dist/lib/schemas-data/3.2/core/account-change-recorded-webhook.json +2 -2
  130. package/dist/lib/schemas-data/3.2/core/account-change.json +2 -2
  131. package/dist/lib/schemas-data/3.2/core/account-identity-change-preview.json +4 -4
  132. package/dist/lib/schemas-data/3.2/core/account-identity-change.json +3 -3
  133. package/dist/lib/schemas-data/3.2/core/account-ref.json +4 -4
  134. package/dist/lib/schemas-data/3.2/core/account-status-changed-webhook.json +4 -4
  135. package/dist/lib/schemas-data/3.2/core/account-timezone-capability.json +1 -1
  136. package/dist/lib/schemas-data/3.2/core/account-with-authorization.json +3 -3
  137. package/dist/lib/schemas-data/3.2/core/account.json +14 -14
  138. package/dist/lib/schemas-data/3.2/core/activation-key.json +1 -1
  139. package/dist/lib/schemas-data/3.2/core/ad-inventory-config.json +1 -1
  140. package/dist/lib/schemas-data/3.2/core/agent-encryption-key.json +1 -1
  141. package/dist/lib/schemas-data/3.2/core/agent-notification-config-state.json +4 -4
  142. package/dist/lib/schemas-data/3.2/core/agent-notification-config.json +4 -4
  143. package/dist/lib/schemas-data/3.2/core/agent-reporting-destination-state.json +4 -4
  144. package/dist/lib/schemas-data/3.2/core/agent-reporting-destination.json +8 -8
  145. package/dist/lib/schemas-data/3.2/core/agent-signing-key.json +1 -1
  146. package/dist/lib/schemas-data/3.2/core/agent-webhook-challenge.json +1 -1
  147. package/dist/lib/schemas-data/3.2/core/app-item.json +4 -4
  148. package/dist/lib/schemas-data/3.2/core/applicable-package-id.json +1 -1
  149. package/dist/lib/schemas-data/3.2/core/asset-group-vocabulary.json +1 -1
  150. package/dist/lib/schemas-data/3.2/core/assets/asset-union.json +22 -22
  151. package/dist/lib/schemas-data/3.2/core/assets/audio-asset.json +3 -3
  152. package/dist/lib/schemas-data/3.2/core/assets/brief-asset.json +2 -2
  153. package/dist/lib/schemas-data/3.2/core/assets/card-asset.json +6 -6
  154. package/dist/lib/schemas-data/3.2/core/assets/catalog-asset.json +2 -2
  155. package/dist/lib/schemas-data/3.2/core/assets/css-asset.json +2 -2
  156. package/dist/lib/schemas-data/3.2/core/assets/daast-asset.json +6 -6
  157. package/dist/lib/schemas-data/3.2/core/assets/daast-tracker-asset.json +5 -5
  158. package/dist/lib/schemas-data/3.2/core/assets/display-tag-asset.json +12 -12
  159. package/dist/lib/schemas-data/3.2/core/assets/html-asset.json +2 -2
  160. package/dist/lib/schemas-data/3.2/core/assets/image-asset.json +2 -2
  161. package/dist/lib/schemas-data/3.2/core/assets/javascript-asset.json +3 -3
  162. package/dist/lib/schemas-data/3.2/core/assets/markdown-asset.json +2 -2
  163. package/dist/lib/schemas-data/3.2/core/assets/pixel-tracker-asset.json +5 -5
  164. package/dist/lib/schemas-data/3.2/core/assets/published-post-asset.json +2 -2
  165. package/dist/lib/schemas-data/3.2/core/assets/text-asset.json +2 -2
  166. package/dist/lib/schemas-data/3.2/core/assets/url-asset.json +5 -5
  167. package/dist/lib/schemas-data/3.2/core/assets/vast-asset.json +6 -6
  168. package/dist/lib/schemas-data/3.2/core/assets/vast-tracker-asset.json +5 -5
  169. package/dist/lib/schemas-data/3.2/core/assets/video-asset.json +7 -7
  170. package/dist/lib/schemas-data/3.2/core/assets/webhook-asset.json +7 -7
  171. package/dist/lib/schemas-data/3.2/core/assets/zip-asset.json +2 -2
  172. package/dist/lib/schemas-data/3.2/core/async-response-data.json +43 -43
  173. package/dist/lib/schemas-data/3.2/core/async-response-refs/creative/get-creative-features-async-response-submitted.json +3 -3
  174. package/dist/lib/schemas-data/3.2/core/async-response-refs/creative/sync-creatives-async-response-input-required.json +3 -3
  175. package/dist/lib/schemas-data/3.2/core/async-response-refs/creative/sync-creatives-async-response-submitted.json +4 -4
  176. package/dist/lib/schemas-data/3.2/core/async-response-refs/creative/sync-creatives-async-response-working.json +3 -3
  177. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/accept-proposal-async-response-input-required.json +2 -2
  178. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/accept-proposal-async-response-submitted.json +2 -2
  179. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/accept-proposal-async-response-working.json +2 -2
  180. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/build-creative-async-response-input-required.json +4 -4
  181. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/build-creative-async-response-submitted.json +4 -4
  182. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/build-creative-async-response-working.json +3 -3
  183. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/buy-products-async-response-input-required.json +2 -2
  184. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/buy-products-async-response-submitted.json +2 -2
  185. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/buy-products-async-response-working.json +2 -2
  186. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/control-media-buy-async-response-input-required.json +2 -2
  187. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/control-media-buy-async-response-submitted.json +2 -2
  188. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/control-media-buy-async-response-working.json +2 -2
  189. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/create-media-buy-async-response-input-required.json +4 -4
  190. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/create-media-buy-async-response-submitted.json +4 -4
  191. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/create-media-buy-async-response-working.json +3 -3
  192. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/decline-proposals-async-response-input-required.json +2 -2
  193. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/decline-proposals-async-response-submitted.json +2 -2
  194. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/decline-proposals-async-response-working.json +2 -2
  195. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/get-products-async-response-input-required.json +4 -4
  196. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/get-products-async-response-submitted.json +4 -4
  197. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/get-products-async-response-working.json +3 -3
  198. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/refine-proposals-async-response-input-required.json +2 -2
  199. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/refine-proposals-async-response-submitted.json +2 -2
  200. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/refine-proposals-async-response-working.json +2 -2
  201. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/request-proposals-async-response-input-required.json +2 -2
  202. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/request-proposals-async-response-submitted.json +2 -2
  203. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/request-proposals-async-response-working.json +2 -2
  204. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/sync-catalogs-async-response-input-required.json +3 -3
  205. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/sync-catalogs-async-response-submitted.json +4 -4
  206. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/sync-catalogs-async-response-working.json +3 -3
  207. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/update-media-buy-async-response-input-required.json +3 -3
  208. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/update-media-buy-async-response-submitted.json +4 -4
  209. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/update-media-buy-async-response-working.json +3 -3
  210. package/dist/lib/schemas-data/3.2/core/async-response-refs/signals/get-signals-async-response-submitted.json +4 -4
  211. package/dist/lib/schemas-data/3.2/core/async-response-refs/signals/get-signals-async-response-working.json +3 -3
  212. package/dist/lib/schemas-data/3.2/core/attestation-capabilities.json +5 -5
  213. package/dist/lib/schemas-data/3.2/core/attestation-evaluation.json +2 -2
  214. package/dist/lib/schemas-data/3.2/core/attestation-issuer.json +5 -5
  215. package/dist/lib/schemas-data/3.2/core/attestation-reference.json +7 -7
  216. package/dist/lib/schemas-data/3.2/core/attestation-subject.json +5 -5
  217. package/dist/lib/schemas-data/3.2/core/attribution-window.json +4 -4
  218. package/dist/lib/schemas-data/3.2/core/audience-activation-method.json +6 -6
  219. package/dist/lib/schemas-data/3.2/core/audience-characteristic.json +1 -1
  220. package/dist/lib/schemas-data/3.2/core/audience-evidence-pin.json +2 -2
  221. package/dist/lib/schemas-data/3.2/core/audience-evidence-requirements.json +10 -10
  222. package/dist/lib/schemas-data/3.2/core/audience-evidence-selection.json +5 -5
  223. package/dist/lib/schemas-data/3.2/core/audience-evidence.json +10 -10
  224. package/dist/lib/schemas-data/3.2/core/audience-member.json +3 -3
  225. package/dist/lib/schemas-data/3.2/core/audience-selector.json +7 -7
  226. package/dist/lib/schemas-data/3.2/core/audience-source.json +3 -3
  227. package/dist/lib/schemas-data/3.2/core/authorized-agent-base.json +4 -4
  228. package/dist/lib/schemas-data/3.2/core/bidding-policy-capability.json +1 -1
  229. package/dist/lib/schemas-data/3.2/core/bidding-policy.json +1 -1
  230. package/dist/lib/schemas-data/3.2/core/brand-id.json +1 -1
  231. package/dist/lib/schemas-data/3.2/core/brand-key.json +2 -2
  232. package/dist/lib/schemas-data/3.2/core/brand-ref.json +3 -3
  233. package/dist/lib/schemas-data/3.2/core/brand-response-authorization-result.json +1 -1
  234. package/dist/lib/schemas-data/3.2/core/budget-allocation.json +2 -2
  235. package/dist/lib/schemas-data/3.2/core/budget-range.json +1 -1
  236. package/dist/lib/schemas-data/3.2/core/business-entity.json +2 -2
  237. package/dist/lib/schemas-data/3.2/core/cancellation-policy.json +2 -2
  238. package/dist/lib/schemas-data/3.2/core/canonical-account-ref.json +3 -3
  239. package/dist/lib/schemas-data/3.2/core/canonical-audience-evidence-selection.json +3 -3
  240. package/dist/lib/schemas-data/3.2/core/canonical-audience-evidence.json +8 -8
  241. package/dist/lib/schemas-data/3.2/core/canonical-budget-allocation.json +2 -2
  242. package/dist/lib/schemas-data/3.2/core/canonical-delivery-forecast.json +7 -7
  243. package/dist/lib/schemas-data/3.2/core/canonical-forecast-point.json +12 -12
  244. package/dist/lib/schemas-data/3.2/core/canonical-forecast-vendor-metric-value.json +5 -5
  245. package/dist/lib/schemas-data/3.2/core/canonical-format-kind.json +1 -1
  246. package/dist/lib/schemas-data/3.2/core/canonical-format-option.json +6 -6
  247. package/dist/lib/schemas-data/3.2/core/canonical-measurement-terms.json +3 -3
  248. package/dist/lib/schemas-data/3.2/core/canonical-media-buy-action-fields.json +6 -6
  249. package/dist/lib/schemas-data/3.2/core/canonical-media-buy-action.json +4 -4
  250. package/dist/lib/schemas-data/3.2/core/canonical-media-buy-features.json +2 -2
  251. package/dist/lib/schemas-data/3.2/core/canonical-metric-qualifier.json +6 -6
  252. package/dist/lib/schemas-data/3.2/core/canonical-optimization-goal.json +9 -9
  253. package/dist/lib/schemas-data/3.2/core/canonical-performance-standard.json +4 -4
  254. package/dist/lib/schemas-data/3.2/core/canonical-placement.json +9 -9
  255. package/dist/lib/schemas-data/3.2/core/canonical-pricing-option.json +5 -5
  256. package/dist/lib/schemas-data/3.2/core/canonical-product-action.json +6 -6
  257. package/dist/lib/schemas-data/3.2/core/canonical-product.json +31 -31
  258. package/dist/lib/schemas-data/3.2/core/canonical-projection-ref.json +3 -3
  259. package/dist/lib/schemas-data/3.2/core/canonical-projection-slot-override.json +1 -1
  260. package/dist/lib/schemas-data/3.2/core/canonical-proposal.json +5 -5
  261. package/dist/lib/schemas-data/3.2/core/canonical-reporting-capabilities.json +11 -11
  262. package/dist/lib/schemas-data/3.2/core/canonical-reporting-commitment.json +6 -6
  263. package/dist/lib/schemas-data/3.2/core/canvas-constraint.json +1 -1
  264. package/dist/lib/schemas-data/3.2/core/capabilities-changed-webhook.json +2 -2
  265. package/dist/lib/schemas-data/3.2/core/catalog-field-mapping.json +2 -2
  266. package/dist/lib/schemas-data/3.2/core/catalog-item-availability-error.json +3 -3
  267. package/dist/lib/schemas-data/3.2/core/catalog-item-availability-ref.json +1 -1
  268. package/dist/lib/schemas-data/3.2/core/catalog-item-availability-state.json +4 -4
  269. package/dist/lib/schemas-data/3.2/core/catalog-item-availability-update-result.json +4 -4
  270. package/dist/lib/schemas-data/3.2/core/catalog-item-availability-update.json +2 -2
  271. package/dist/lib/schemas-data/3.2/core/catalog-item-delivery-metrics.json +3 -3
  272. package/dist/lib/schemas-data/3.2/core/catalog-item-reference-not-found-error.json +1 -1
  273. package/dist/lib/schemas-data/3.2/core/catalog-selection.json +7 -7
  274. package/dist/lib/schemas-data/3.2/core/catalog.json +7 -7
  275. package/dist/lib/schemas-data/3.2/core/catchment.json +5 -5
  276. package/dist/lib/schemas-data/3.2/core/collection-delivery-metrics.json +3 -3
  277. package/dist/lib/schemas-data/3.2/core/collection-distribution.json +3 -3
  278. package/dist/lib/schemas-data/3.2/core/collection-list-ref.json +1 -1
  279. package/dist/lib/schemas-data/3.2/core/collection-property-delivery-metrics.json +5 -5
  280. package/dist/lib/schemas-data/3.2/core/collection-ref.json +1 -1
  281. package/dist/lib/schemas-data/3.2/core/collection-selection.json +4 -4
  282. package/dist/lib/schemas-data/3.2/core/collection-selector.json +1 -1
  283. package/dist/lib/schemas-data/3.2/core/collection.json +13 -13
  284. package/dist/lib/schemas-data/3.2/core/committed-metric.json +14 -14
  285. package/dist/lib/schemas-data/3.2/core/compact-task-input-required.json +4 -4
  286. package/dist/lib/schemas-data/3.2/core/compact-task-submitted.json +4 -4
  287. package/dist/lib/schemas-data/3.2/core/compact-task-working.json +3 -3
  288. package/dist/lib/schemas-data/3.2/core/content-rating.json +2 -2
  289. package/dist/lib/schemas-data/3.2/core/context.json +1 -1
  290. package/dist/lib/schemas-data/3.2/core/creative-approval-scope.json +3 -3
  291. package/dist/lib/schemas-data/3.2/core/creative-asset.json +13 -13
  292. package/dist/lib/schemas-data/3.2/core/creative-assets.json +3 -3
  293. package/dist/lib/schemas-data/3.2/core/creative-assignment.json +2 -2
  294. package/dist/lib/schemas-data/3.2/core/creative-brief.json +4 -4
  295. package/dist/lib/schemas-data/3.2/core/creative-consumption.json +1 -1
  296. package/dist/lib/schemas-data/3.2/core/creative-delivery-metrics.json +2 -2
  297. package/dist/lib/schemas-data/3.2/core/creative-filters.json +8 -8
  298. package/dist/lib/schemas-data/3.2/core/creative-item.json +1 -1
  299. package/dist/lib/schemas-data/3.2/core/creative-locale-policy.json +2 -2
  300. package/dist/lib/schemas-data/3.2/core/creative-localization-readback.json +6 -6
  301. package/dist/lib/schemas-data/3.2/core/creative-localization.json +6 -6
  302. package/dist/lib/schemas-data/3.2/core/creative-manifest.json +13 -13
  303. package/dist/lib/schemas-data/3.2/core/creative-operation-format-declaration.json +7 -7
  304. package/dist/lib/schemas-data/3.2/core/creative-policy.json +3 -3
  305. package/dist/lib/schemas-data/3.2/core/creative-representation-set.json +4 -4
  306. package/dist/lib/schemas-data/3.2/core/creative-representation.json +2 -2
  307. package/dist/lib/schemas-data/3.2/core/creative-revision-id.json +1 -1
  308. package/dist/lib/schemas-data/3.2/core/creative-variable.json +1 -1
  309. package/dist/lib/schemas-data/3.2/core/creative-variant.json +6 -6
  310. package/dist/lib/schemas-data/3.2/core/daast-tracker-constraints.json +2 -2
  311. package/dist/lib/schemas-data/3.2/core/data-provider-signal-selector.json +1 -1
  312. package/dist/lib/schemas-data/3.2/core/date-range.json +1 -1
  313. package/dist/lib/schemas-data/3.2/core/datetime-range.json +1 -1
  314. package/dist/lib/schemas-data/3.2/core/daypart-target.json +3 -3
  315. package/dist/lib/schemas-data/3.2/core/deadline-policy.json +1 -1
  316. package/dist/lib/schemas-data/3.2/core/delivery-breakdown-controls.json +3 -3
  317. package/dist/lib/schemas-data/3.2/core/delivery-forecast.json +7 -7
  318. package/dist/lib/schemas-data/3.2/core/delivery-metric-aggregate.json +14 -14
  319. package/dist/lib/schemas-data/3.2/core/delivery-metrics.json +11 -11
  320. package/dist/lib/schemas-data/3.2/core/delivery-provider.json +1 -1
  321. package/dist/lib/schemas-data/3.2/core/delivery-recipient.json +2 -2
  322. package/dist/lib/schemas-data/3.2/core/demographic-age-range.json +1 -1
  323. package/dist/lib/schemas-data/3.2/core/demographic-predicate.json +2 -2
  324. package/dist/lib/schemas-data/3.2/core/demographic-reporting-capability.json +4 -4
  325. package/dist/lib/schemas-data/3.2/core/demographic-targeting-capability.json +4 -4
  326. package/dist/lib/schemas-data/3.2/core/demographic-targeting-intent.json +4 -4
  327. package/dist/lib/schemas-data/3.2/core/demographic-targeting-resolution.json +10 -10
  328. package/dist/lib/schemas-data/3.2/core/deployment.json +3 -3
  329. package/dist/lib/schemas-data/3.2/core/destination-item.json +4 -4
  330. package/dist/lib/schemas-data/3.2/core/destination.json +1 -1
  331. package/dist/lib/schemas-data/3.2/core/diagnostic-issue.json +1 -1
  332. package/dist/lib/schemas-data/3.2/core/downstream-connection-requirement.json +1 -1
  333. package/dist/lib/schemas-data/3.2/core/duration.json +1 -1
  334. package/dist/lib/schemas-data/3.2/core/education-item.json +4 -4
  335. package/dist/lib/schemas-data/3.2/core/error.json +1 -1
  336. package/dist/lib/schemas-data/3.2/core/evaluator-spec.json +5 -5
  337. package/dist/lib/schemas-data/3.2/core/event-custom-data.json +2 -2
  338. package/dist/lib/schemas-data/3.2/core/event-source-health.json +3 -3
  339. package/dist/lib/schemas-data/3.2/core/event-surface.json +2 -2
  340. package/dist/lib/schemas-data/3.2/core/event.json +8 -8
  341. package/dist/lib/schemas-data/3.2/core/experimental-feature-id.json +1 -1
  342. package/dist/lib/schemas-data/3.2/core/ext.json +1 -1
  343. package/dist/lib/schemas-data/3.2/core/feature-requirement.json +1 -1
  344. package/dist/lib/schemas-data/3.2/core/flight-item.json +4 -4
  345. package/dist/lib/schemas-data/3.2/core/forecast-dimension-audience.json +2 -2
  346. package/dist/lib/schemas-data/3.2/core/forecast-dimension-device-platform.json +2 -2
  347. package/dist/lib/schemas-data/3.2/core/forecast-dimension-device-type.json +2 -2
  348. package/dist/lib/schemas-data/3.2/core/forecast-dimension-geo.json +5 -5
  349. package/dist/lib/schemas-data/3.2/core/forecast-dimension-placement.json +2 -2
  350. package/dist/lib/schemas-data/3.2/core/forecast-dimension-signal.json +2 -2
  351. package/dist/lib/schemas-data/3.2/core/forecast-dimension-time.json +1 -1
  352. package/dist/lib/schemas-data/3.2/core/forecast-point-dimensions.json +8 -8
  353. package/dist/lib/schemas-data/3.2/core/forecast-point.json +28 -28
  354. package/dist/lib/schemas-data/3.2/core/forecast-range.json +1 -1
  355. package/dist/lib/schemas-data/3.2/core/forecast-rate-range.json +2 -2
  356. package/dist/lib/schemas-data/3.2/core/forecast-vendor-metric-value.json +7 -7
  357. package/dist/lib/schemas-data/3.2/core/format-id.json +1 -1
  358. package/dist/lib/schemas-data/3.2/core/format-option-ref.json +1 -1
  359. package/dist/lib/schemas-data/3.2/core/format-shape-vocabulary.json +1 -1
  360. package/dist/lib/schemas-data/3.2/core/format.json +45 -45
  361. package/dist/lib/schemas-data/3.2/core/frequency-cap-constraints.json +8 -8
  362. package/dist/lib/schemas-data/3.2/core/frequency-cap-duration-unit.json +1 -1
  363. package/dist/lib/schemas-data/3.2/core/frequency-cap-impression-constraints.json +2 -2
  364. package/dist/lib/schemas-data/3.2/core/frequency-cap-interval-constraints.json +3 -3
  365. package/dist/lib/schemas-data/3.2/core/frequency-cap-requirements.json +6 -6
  366. package/dist/lib/schemas-data/3.2/core/frequency-cap.json +4 -4
  367. package/dist/lib/schemas-data/3.2/core/generation-credential.json +3 -3
  368. package/dist/lib/schemas-data/3.2/core/geo-breakdown-support.json +3 -3
  369. package/dist/lib/schemas-data/3.2/core/geo-delivery-metrics.json +6 -6
  370. package/dist/lib/schemas-data/3.2/core/geo-metro.json +2 -2
  371. package/dist/lib/schemas-data/3.2/core/geo-place-area.json +4 -4
  372. package/dist/lib/schemas-data/3.2/core/geo-place-catalog-capability.json +2 -2
  373. package/dist/lib/schemas-data/3.2/core/geo-place-catalog-entry.json +3 -3
  374. package/dist/lib/schemas-data/3.2/core/geo-place-requirement.json +3 -3
  375. package/dist/lib/schemas-data/3.2/core/geo-place-resolver.json +1 -1
  376. package/dist/lib/schemas-data/3.2/core/geo-place-support.json +3 -3
  377. package/dist/lib/schemas-data/3.2/core/geo-place-system.json +1 -1
  378. package/dist/lib/schemas-data/3.2/core/geo-place-type.json +1 -1
  379. package/dist/lib/schemas-data/3.2/core/geo-region-requirement.json +1 -1
  380. package/dist/lib/schemas-data/3.2/core/geo-region-support.json +2 -2
  381. package/dist/lib/schemas-data/3.2/core/get-geo-place-resolution-request.json +3 -3
  382. package/dist/lib/schemas-data/3.2/core/get-geo-place-resolution-response.json +4 -4
  383. package/dist/lib/schemas-data/3.2/core/hotel-item.json +4 -4
  384. package/dist/lib/schemas-data/3.2/core/iana-timezone.json +1 -1
  385. package/dist/lib/schemas-data/3.2/core/identifier.json +2 -2
  386. package/dist/lib/schemas-data/3.2/core/impairment.json +3 -3
  387. package/dist/lib/schemas-data/3.2/core/indicator-bearing.json +4 -4
  388. package/dist/lib/schemas-data/3.2/core/indicator-scope.json +1 -1
  389. package/dist/lib/schemas-data/3.2/core/indicator.json +4 -4
  390. package/dist/lib/schemas-data/3.2/core/indicators-changed-webhook.json +3 -3
  391. package/dist/lib/schemas-data/3.2/core/industry-identifier.json +2 -2
  392. package/dist/lib/schemas-data/3.2/core/insertion-order.json +1 -1
  393. package/dist/lib/schemas-data/3.2/core/installment-deadlines.json +2 -2
  394. package/dist/lib/schemas-data/3.2/core/installment-delivery-metrics.json +3 -3
  395. package/dist/lib/schemas-data/3.2/core/installment-property-delivery-metrics.json +5 -5
  396. package/dist/lib/schemas-data/3.2/core/installment-ref.json +2 -2
  397. package/dist/lib/schemas-data/3.2/core/installment.json +10 -10
  398. package/dist/lib/schemas-data/3.2/core/inventory-list-application.json +1 -1
  399. package/dist/lib/schemas-data/3.2/core/job-item.json +3 -3
  400. package/dist/lib/schemas-data/3.2/core/keyword-delivery-metrics.json +3 -3
  401. package/dist/lib/schemas-data/3.2/core/keyword-target.json +2 -2
  402. package/dist/lib/schemas-data/3.2/core/limited-series.json +1 -1
  403. package/dist/lib/schemas-data/3.2/core/locale-tag.json +1 -1
  404. package/dist/lib/schemas-data/3.2/core/localized-creative-asset.json +3 -3
  405. package/dist/lib/schemas-data/3.2/core/macro-bearing-url.json +1 -1
  406. package/dist/lib/schemas-data/3.2/core/macro-declaration.json +10 -10
  407. package/dist/lib/schemas-data/3.2/core/macro-encoding.json +1 -1
  408. package/dist/lib/schemas-data/3.2/core/macro-resolution-capability.json +8 -8
  409. package/dist/lib/schemas-data/3.2/core/macro-resolution-result.json +10 -10
  410. package/dist/lib/schemas-data/3.2/core/macro-translation-target.json +7 -7
  411. package/dist/lib/schemas-data/3.2/core/material-deadline.json +1 -1
  412. package/dist/lib/schemas-data/3.2/core/mcp-webhook-payload.json +6 -6
  413. package/dist/lib/schemas-data/3.2/core/measurement-readiness.json +5 -5
  414. package/dist/lib/schemas-data/3.2/core/measurement-terms.json +3 -3
  415. package/dist/lib/schemas-data/3.2/core/measurement-window.json +1 -1
  416. package/dist/lib/schemas-data/3.2/core/media-buy-available-action-id.json +2 -2
  417. package/dist/lib/schemas-data/3.2/core/media-buy-available-action.json +7 -7
  418. package/dist/lib/schemas-data/3.2/core/media-buy-change-term-id.json +1 -1
  419. package/dist/lib/schemas-data/3.2/core/media-buy-features.json +2 -2
  420. package/dist/lib/schemas-data/3.2/core/media-buy-frequency-cap-capability.json +3 -3
  421. package/dist/lib/schemas-data/3.2/core/media-buy-frequency-cap-requirement.json +3 -3
  422. package/dist/lib/schemas-data/3.2/core/media-buy-frequency-cap-support.json +3 -3
  423. package/dist/lib/schemas-data/3.2/core/media-buy-frequency-cap.json +2 -2
  424. package/dist/lib/schemas-data/3.2/core/media-buy-legacy-terms-ref.json +1 -1
  425. package/dist/lib/schemas-data/3.2/core/media-buy-support-requirements.json +2 -2
  426. package/dist/lib/schemas-data/3.2/core/media-buy-support.json +3 -3
  427. package/dist/lib/schemas-data/3.2/core/media-buy.json +14 -14
  428. package/dist/lib/schemas-data/3.2/core/missing-metric.json +14 -14
  429. package/dist/lib/schemas-data/3.2/core/negative-keyword.json +2 -2
  430. package/dist/lib/schemas-data/3.2/core/notification-config.json +3 -3
  431. package/dist/lib/schemas-data/3.2/core/offering-asset-group.json +16 -16
  432. package/dist/lib/schemas-data/3.2/core/offering.json +5 -5
  433. package/dist/lib/schemas-data/3.2/core/operator-identity.json +2 -2
  434. package/dist/lib/schemas-data/3.2/core/operator-unit.json +1 -1
  435. package/dist/lib/schemas-data/3.2/core/opportunity-context.json +2 -2
  436. package/dist/lib/schemas-data/3.2/core/optimization-goal.json +9 -9
  437. package/dist/lib/schemas-data/3.2/core/outcome-measurement.json +2 -2
  438. package/dist/lib/schemas-data/3.2/core/outcome-target-cost-per.json +2 -2
  439. package/dist/lib/schemas-data/3.2/core/overlay.json +1 -1
  440. package/dist/lib/schemas-data/3.2/core/package-delivery-metric-value.json +2 -2
  441. package/dist/lib/schemas-data/3.2/core/package-format-snapshot.json +5 -5
  442. package/dist/lib/schemas-data/3.2/core/package-signal-targeting-group.json +2 -2
  443. package/dist/lib/schemas-data/3.2/core/package-signal-targeting-groups.json +2 -2
  444. package/dist/lib/schemas-data/3.2/core/package-signal-targeting.json +3 -3
  445. package/dist/lib/schemas-data/3.2/core/package-targeting-resolution.json +3 -3
  446. package/dist/lib/schemas-data/3.2/core/package.json +23 -23
  447. package/dist/lib/schemas-data/3.2/core/pagination-request.json +1 -1
  448. package/dist/lib/schemas-data/3.2/core/pagination-response.json +1 -1
  449. package/dist/lib/schemas-data/3.2/core/performance-feedback-assertion.json +8 -8
  450. package/dist/lib/schemas-data/3.2/core/performance-feedback-metric.json +14 -14
  451. package/dist/lib/schemas-data/3.2/core/performance-feedback.json +17 -17
  452. package/dist/lib/schemas-data/3.2/core/performance-standard.json +4 -4
  453. package/dist/lib/schemas-data/3.2/core/placement-definition.json +15 -15
  454. package/dist/lib/schemas-data/3.2/core/placement-delivery-metrics.json +3 -3
  455. package/dist/lib/schemas-data/3.2/core/placement-evidence.json +1 -1
  456. package/dist/lib/schemas-data/3.2/core/placement-identity.json +2 -2
  457. package/dist/lib/schemas-data/3.2/core/placement-presentation.json +1 -1
  458. package/dist/lib/schemas-data/3.2/core/placement-property-delivery-metrics.json +5 -5
  459. package/dist/lib/schemas-data/3.2/core/placement-ref.json +1 -1
  460. package/dist/lib/schemas-data/3.2/core/placement-selection.json +5 -5
  461. package/dist/lib/schemas-data/3.2/core/placement.json +10 -10
  462. package/dist/lib/schemas-data/3.2/core/planned-delivery.json +8 -8
  463. package/dist/lib/schemas-data/3.2/core/platform-extension-ref.json +1 -1
  464. package/dist/lib/schemas-data/3.2/core/positive-postal-area-support.json +2 -2
  465. package/dist/lib/schemas-data/3.2/core/postal-area-support.json +2 -2
  466. package/dist/lib/schemas-data/3.2/core/postal-area.json +4 -4
  467. package/dist/lib/schemas-data/3.2/core/postal-country-system.json +2 -2
  468. package/dist/lib/schemas-data/3.2/core/presentation-ref.json +1 -1
  469. package/dist/lib/schemas-data/3.2/core/preview-provider.json +1 -1
  470. package/dist/lib/schemas-data/3.2/core/preview-renderer-metadata.json +1 -1
  471. package/dist/lib/schemas-data/3.2/core/price.json +1 -1
  472. package/dist/lib/schemas-data/3.2/core/pricing-option.json +11 -11
  473. package/dist/lib/schemas-data/3.2/core/principal-changed-webhook.json +2 -2
  474. package/dist/lib/schemas-data/3.2/core/principal-declarations-state.json +3 -3
  475. package/dist/lib/schemas-data/3.2/core/principal-declarations.json +2 -2
  476. package/dist/lib/schemas-data/3.2/core/principal-state.json +4 -4
  477. package/dist/lib/schemas-data/3.2/core/product-allocation.json +5 -5
  478. package/dist/lib/schemas-data/3.2/core/product-allowed-action.json +6 -6
  479. package/dist/lib/schemas-data/3.2/core/product-audience-evidence-requirements.json +13 -13
  480. package/dist/lib/schemas-data/3.2/core/product-card-reference-asset.json +5 -5
  481. package/dist/lib/schemas-data/3.2/core/product-change-map.json +1 -1
  482. package/dist/lib/schemas-data/3.2/core/product-execution-requirement.json +7 -7
  483. package/dist/lib/schemas-data/3.2/core/product-filters.json +36 -36
  484. package/dist/lib/schemas-data/3.2/core/product-format-declaration.json +22 -22
  485. package/dist/lib/schemas-data/3.2/core/product-identity.json +1 -1
  486. package/dist/lib/schemas-data/3.2/core/product-offer-filters.json +26 -26
  487. package/dist/lib/schemas-data/3.2/core/product-signal-targeting-option.json +3 -3
  488. package/dist/lib/schemas-data/3.2/core/product-targeting-resolution.json +3 -3
  489. package/dist/lib/schemas-data/3.2/core/product.json +54 -54
  490. package/dist/lib/schemas-data/3.2/core/property-delivery-metrics.json +4 -4
  491. package/dist/lib/schemas-data/3.2/core/property-id.json +1 -1
  492. package/dist/lib/schemas-data/3.2/core/property-list-ref.json +1 -1
  493. package/dist/lib/schemas-data/3.2/core/property-ref.json +2 -2
  494. package/dist/lib/schemas-data/3.2/core/property-tag.json +1 -1
  495. package/dist/lib/schemas-data/3.2/core/property.json +6 -6
  496. package/dist/lib/schemas-data/3.2/core/proposal.json +9 -9
  497. package/dist/lib/schemas-data/3.2/core/protocol-envelope.json +5 -5
  498. package/dist/lib/schemas-data/3.2/core/provenance.json +9 -9
  499. package/dist/lib/schemas-data/3.2/core/publisher-property-selector.json +3 -3
  500. package/dist/lib/schemas-data/3.2/core/push-notification-config.json +2 -2
  501. package/dist/lib/schemas-data/3.2/core/real-estate-item.json +4 -4
  502. package/dist/lib/schemas-data/3.2/core/reference-asset.json +1 -1
  503. package/dist/lib/schemas-data/3.2/core/reference-renderer.json +1 -1
  504. package/dist/lib/schemas-data/3.2/core/registry-event.json +15 -15
  505. package/dist/lib/schemas-data/3.2/core/registry-feed-response.json +2 -2
  506. package/dist/lib/schemas-data/3.2/core/reporting-adjustment-receipt.json +1 -1
  507. package/dist/lib/schemas-data/3.2/core/reporting-adjustment.json +2 -2
  508. package/dist/lib/schemas-data/3.2/core/reporting-canonical-content-digest.json +1 -1
  509. package/dist/lib/schemas-data/3.2/core/reporting-canonicalization-contract.json +1 -1
  510. package/dist/lib/schemas-data/3.2/core/reporting-capabilities.json +12 -12
  511. package/dist/lib/schemas-data/3.2/core/reporting-consumer-status.json +1 -1
  512. package/dist/lib/schemas-data/3.2/core/reporting-control-total.json +1 -1
  513. package/dist/lib/schemas-data/3.2/core/reporting-coverage.json +1 -1
  514. package/dist/lib/schemas-data/3.2/core/reporting-dataset-share-destination.json +1 -1
  515. package/dist/lib/schemas-data/3.2/core/reporting-delivery-capabilities.json +3 -3
  516. package/dist/lib/schemas-data/3.2/core/reporting-delivery-config-state.json +4 -4
  517. package/dist/lib/schemas-data/3.2/core/reporting-delivery-config.json +7 -7
  518. package/dist/lib/schemas-data/3.2/core/reporting-delivery-method.json +4 -4
  519. package/dist/lib/schemas-data/3.2/core/reporting-delivery-offering-id.json +1 -1
  520. package/dist/lib/schemas-data/3.2/core/reporting-delivery-offering.json +8 -8
  521. package/dist/lib/schemas-data/3.2/core/reporting-delivery-ready-webhook.json +3 -3
  522. package/dist/lib/schemas-data/3.2/core/reporting-file-compression.json +1 -1
  523. package/dist/lib/schemas-data/3.2/core/reporting-file-entry.json +3 -3
  524. package/dist/lib/schemas-data/3.2/core/reporting-file-manifest.json +4 -4
  525. package/dist/lib/schemas-data/3.2/core/reporting-file-object-ref.json +1 -1
  526. package/dist/lib/schemas-data/3.2/core/reporting-ledger-changed-webhook.json +3 -3
  527. package/dist/lib/schemas-data/3.2/core/reporting-materialization.json +4 -4
  528. package/dist/lib/schemas-data/3.2/core/reporting-native-version-ref.json +1 -1
  529. package/dist/lib/schemas-data/3.2/core/reporting-obligation.json +9 -9
  530. package/dist/lib/schemas-data/3.2/core/reporting-receipt.json +5 -5
  531. package/dist/lib/schemas-data/3.2/core/reporting-reconciliation-mode.json +1 -1
  532. package/dist/lib/schemas-data/3.2/core/reporting-reliability-statistics.json +1 -1
  533. package/dist/lib/schemas-data/3.2/core/reporting-report-definition.json +1 -1
  534. package/dist/lib/schemas-data/3.2/core/reporting-resource.json +2 -2
  535. package/dist/lib/schemas-data/3.2/core/reporting-revision.json +6 -6
  536. package/dist/lib/schemas-data/3.2/core/reporting-schedule-offering.json +2 -2
  537. package/dist/lib/schemas-data/3.2/core/reporting-schedule.json +1 -1
  538. package/dist/lib/schemas-data/3.2/core/reporting-status-changed-webhook.json +5 -5
  539. package/dist/lib/schemas-data/3.2/core/reporting-status-issue.json +4 -4
  540. package/dist/lib/schemas-data/3.2/core/reporting-verification-profile-set.json +1 -1
  541. package/dist/lib/schemas-data/3.2/core/reporting-verification-profile.json +1 -1
  542. package/dist/lib/schemas-data/3.2/core/reporting-verification.json +7 -7
  543. package/dist/lib/schemas-data/3.2/core/reporting-webhook.json +4 -4
  544. package/dist/lib/schemas-data/3.2/core/reporting-write-destination.json +1 -1
  545. package/dist/lib/schemas-data/3.2/core/representation-destination.json +5 -5
  546. package/dist/lib/schemas-data/3.2/core/representation-rejection.json +1 -1
  547. package/dist/lib/schemas-data/3.2/core/representation-selection.json +5 -5
  548. package/dist/lib/schemas-data/3.2/core/requirements/asset-requirements.json +13 -13
  549. package/dist/lib/schemas-data/3.2/core/requirements/audio-asset-requirements.json +1 -1
  550. package/dist/lib/schemas-data/3.2/core/requirements/catalog-field-binding.json +4 -4
  551. package/dist/lib/schemas-data/3.2/core/requirements/catalog-requirements.json +5 -5
  552. package/dist/lib/schemas-data/3.2/core/requirements/css-asset-requirements.json +1 -1
  553. package/dist/lib/schemas-data/3.2/core/requirements/daast-asset-requirements.json +3 -3
  554. package/dist/lib/schemas-data/3.2/core/requirements/html-asset-requirements.json +1 -1
  555. package/dist/lib/schemas-data/3.2/core/requirements/image-asset-requirements.json +2 -2
  556. package/dist/lib/schemas-data/3.2/core/requirements/javascript-asset-requirements.json +1 -1
  557. package/dist/lib/schemas-data/3.2/core/requirements/markdown-asset-requirements.json +1 -1
  558. package/dist/lib/schemas-data/3.2/core/requirements/offering-asset-constraint.json +4 -4
  559. package/dist/lib/schemas-data/3.2/core/requirements/text-asset-requirements.json +1 -1
  560. package/dist/lib/schemas-data/3.2/core/requirements/url-asset-requirements.json +1 -1
  561. package/dist/lib/schemas-data/3.2/core/requirements/vast-asset-requirements.json +4 -4
  562. package/dist/lib/schemas-data/3.2/core/requirements/video-asset-requirements.json +6 -6
  563. package/dist/lib/schemas-data/3.2/core/requirements/webhook-asset-requirements.json +1 -1
  564. package/dist/lib/schemas-data/3.2/core/response-payload-jws-envelope.json +1 -1
  565. package/dist/lib/schemas-data/3.2/core/response.json +1 -1
  566. package/dist/lib/schemas-data/3.2/core/rights-attestation-evaluation.json +5 -5
  567. package/dist/lib/schemas-data/3.2/core/rights-constraint.json +7 -7
  568. package/dist/lib/schemas-data/3.2/core/seller-agent-ref.json +1 -1
  569. package/dist/lib/schemas-data/3.2/core/signal-coverage-forecast.json +5 -5
  570. package/dist/lib/schemas-data/3.2/core/signal-definition-enrichment.json +5 -5
  571. package/dist/lib/schemas-data/3.2/core/signal-definition.json +8 -8
  572. package/dist/lib/schemas-data/3.2/core/signal-filters.json +3 -3
  573. package/dist/lib/schemas-data/3.2/core/signal-id.json +1 -1
  574. package/dist/lib/schemas-data/3.2/core/signal-listing.json +6 -6
  575. package/dist/lib/schemas-data/3.2/core/signal-modeling-disclosure.json +1 -1
  576. package/dist/lib/schemas-data/3.2/core/signal-pricing-option.json +2 -2
  577. package/dist/lib/schemas-data/3.2/core/signal-pricing.json +6 -6
  578. package/dist/lib/schemas-data/3.2/core/signal-ref.json +1 -1
  579. package/dist/lib/schemas-data/3.2/core/signal-selection-group-rule.json +1 -1
  580. package/dist/lib/schemas-data/3.2/core/signal-targeting-expression.json +4 -4
  581. package/dist/lib/schemas-data/3.2/core/signal-targeting-rules.json +2 -2
  582. package/dist/lib/schemas-data/3.2/core/signal-targeting.json +7 -7
  583. package/dist/lib/schemas-data/3.2/core/sla-window.json +1 -1
  584. package/dist/lib/schemas-data/3.2/core/special.json +2 -2
  585. package/dist/lib/schemas-data/3.2/core/spot-reporting-capability.json +2 -2
  586. package/dist/lib/schemas-data/3.2/core/start-timing.json +1 -1
  587. package/dist/lib/schemas-data/3.2/core/store-item.json +3 -3
  588. package/dist/lib/schemas-data/3.2/core/talent.json +2 -2
  589. package/dist/lib/schemas-data/3.2/core/targeting-input.json +40 -40
  590. package/dist/lib/schemas-data/3.2/core/targeting-modification.json +3 -3
  591. package/dist/lib/schemas-data/3.2/core/targeting-overlay-requirements.json +15 -15
  592. package/dist/lib/schemas-data/3.2/core/targeting-overlay-support.json +25 -25
  593. package/dist/lib/schemas-data/3.2/core/targeting-unknown-age-eligibility-constraint.json +1 -1
  594. package/dist/lib/schemas-data/3.2/core/targeting-verified-age-basis-constraint.json +1 -1
  595. package/dist/lib/schemas-data/3.2/core/targeting.json +34 -34
  596. package/dist/lib/schemas-data/3.2/core/tasks-get-request.json +5 -5
  597. package/dist/lib/schemas-data/3.2/core/tasks-get-response.json +10 -10
  598. package/dist/lib/schemas-data/3.2/core/tasks-list-request.json +13 -13
  599. package/dist/lib/schemas-data/3.2/core/tasks-list-response.json +8 -8
  600. package/dist/lib/schemas-data/3.2/core/tracker-execution-contract.json +2 -2
  601. package/dist/lib/schemas-data/3.2/core/tracker-execution-selector.json +18 -18
  602. package/dist/lib/schemas-data/3.2/core/transformer-param.json +1 -1
  603. package/dist/lib/schemas-data/3.2/core/transformer.json +6 -6
  604. package/dist/lib/schemas-data/3.2/core/truncation-sentinel.json +1 -1
  605. package/dist/lib/schemas-data/3.2/core/user-match.json +3 -3
  606. package/dist/lib/schemas-data/3.2/core/vast-media-file-requirements.json +2 -2
  607. package/dist/lib/schemas-data/3.2/core/vast-tracker-constraints.json +2 -2
  608. package/dist/lib/schemas-data/3.2/core/vehicle-item.json +4 -4
  609. package/dist/lib/schemas-data/3.2/core/vendor-metric-id.json +1 -1
  610. package/dist/lib/schemas-data/3.2/core/vendor-metric-optimization-supported-metric.json +3 -3
  611. package/dist/lib/schemas-data/3.2/core/vendor-metric-optimization.json +2 -2
  612. package/dist/lib/schemas-data/3.2/core/vendor-metric-value.json +9 -9
  613. package/dist/lib/schemas-data/3.2/core/vendor-pricing-option.json +3 -3
  614. package/dist/lib/schemas-data/3.2/core/verification-token-claims.json +1 -1
  615. package/dist/lib/schemas-data/3.2/core/version-envelope.json +1 -1
  616. package/dist/lib/schemas-data/3.2/core/warning-resource.json +1 -1
  617. package/dist/lib/schemas-data/3.2/core/warning.json +4 -4
  618. package/dist/lib/schemas-data/3.2/core/webhook-activity-record.json +3 -3
  619. package/dist/lib/schemas-data/3.2/core/webhook-challenge-response.json +1 -1
  620. package/dist/lib/schemas-data/3.2/core/webhook-challenge.json +2 -2
  621. package/dist/lib/schemas-data/3.2/core/wholesale-feed-event.json +20 -20
  622. package/dist/lib/schemas-data/3.2/core/wholesale-feed-webhook.json +3 -3
  623. package/dist/lib/schemas-data/3.2/core/x-entity-types.json +1 -1
  624. package/dist/lib/schemas-data/3.2/creative/asset-types/index.json +6 -6
  625. package/dist/lib/schemas-data/3.2/creative/audit-observation.json +2 -2
  626. package/dist/lib/schemas-data/3.2/creative/creative-assignment-changed-webhook.json +2 -2
  627. package/dist/lib/schemas-data/3.2/creative/creative-feature-result.json +2 -2
  628. package/dist/lib/schemas-data/3.2/creative/creative-purged-webhook.json +3 -3
  629. package/dist/lib/schemas-data/3.2/creative/creative-status-changed-webhook.json +5 -5
  630. package/dist/lib/schemas-data/3.2/creative/get-creative-delivery-request.json +6 -6
  631. package/dist/lib/schemas-data/3.2/creative/get-creative-delivery-response.json +11 -11
  632. package/dist/lib/schemas-data/3.2/creative/get-creative-features-async-response-submitted.json +3 -3
  633. package/dist/lib/schemas-data/3.2/creative/get-creative-features-request.json +7 -7
  634. package/dist/lib/schemas-data/3.2/creative/get-creative-features-response.json +9 -9
  635. package/dist/lib/schemas-data/3.2/creative/get-creative-features-terminal-success.json +6 -6
  636. package/dist/lib/schemas-data/3.2/creative/list-creative-formats-request.json +13 -13
  637. package/dist/lib/schemas-data/3.2/creative/list-creative-formats-response.json +9 -9
  638. package/dist/lib/schemas-data/3.2/creative/list-creatives-request.json +9 -9
  639. package/dist/lib/schemas-data/3.2/creative/list-creatives-response.json +34 -34
  640. package/dist/lib/schemas-data/3.2/creative/list-transformers-request.json +9 -9
  641. package/dist/lib/schemas-data/3.2/creative/list-transformers-response.json +8 -8
  642. package/dist/lib/schemas-data/3.2/creative/preview-creative-request.json +13 -13
  643. package/dist/lib/schemas-data/3.2/creative/preview-creative-response.json +18 -18
  644. package/dist/lib/schemas-data/3.2/creative/preview-render.json +4 -4
  645. package/dist/lib/schemas-data/3.2/creative/sync-creatives-async-response-input-required.json +3 -3
  646. package/dist/lib/schemas-data/3.2/creative/sync-creatives-async-response-submitted.json +4 -4
  647. package/dist/lib/schemas-data/3.2/creative/sync-creatives-async-response-working.json +3 -3
  648. package/dist/lib/schemas-data/3.2/creative/sync-creatives-request.json +10 -10
  649. package/dist/lib/schemas-data/3.2/creative/sync-creatives-response.json +18 -18
  650. package/dist/lib/schemas-data/3.2/creative/validate-input-request.json +4 -4
  651. package/dist/lib/schemas-data/3.2/creative/validate-input-response.json +4 -4
  652. package/dist/lib/schemas-data/3.2/creative/validate-input-result.json +2 -2
  653. package/dist/lib/schemas-data/3.2/creative/video-brief.json +1 -1
  654. package/dist/lib/schemas-data/3.2/enums/account-currency-mode.json +1 -1
  655. package/dist/lib/schemas-data/3.2/enums/account-scope.json +1 -1
  656. package/dist/lib/schemas-data/3.2/enums/account-status.json +1 -1
  657. package/dist/lib/schemas-data/3.2/enums/action-not-allowed-reason.json +1 -1
  658. package/dist/lib/schemas-data/3.2/enums/action-source.json +1 -1
  659. package/dist/lib/schemas-data/3.2/enums/activation-method.json +1 -1
  660. package/dist/lib/schemas-data/3.2/enums/adcp-protocol.json +1 -1
  661. package/dist/lib/schemas-data/3.2/enums/adjustment-kind.json +1 -1
  662. package/dist/lib/schemas-data/3.2/enums/advertiser-industry.json +1 -1
  663. package/dist/lib/schemas-data/3.2/enums/age-determination-basis.json +1 -1
  664. package/dist/lib/schemas-data/3.2/enums/age-verification-method.json +1 -1
  665. package/dist/lib/schemas-data/3.2/enums/assessment-status.json +1 -1
  666. package/dist/lib/schemas-data/3.2/enums/asset-content-type.json +1 -1
  667. package/dist/lib/schemas-data/3.2/enums/attestation-claim.json +1 -1
  668. package/dist/lib/schemas-data/3.2/enums/attribution-methodology.json +1 -1
  669. package/dist/lib/schemas-data/3.2/enums/attribution-model.json +1 -1
  670. package/dist/lib/schemas-data/3.2/enums/audience-evidence-methodology.json +1 -1
  671. package/dist/lib/schemas-data/3.2/enums/audience-resolution-method.json +1 -1
  672. package/dist/lib/schemas-data/3.2/enums/audience-source.json +1 -1
  673. package/dist/lib/schemas-data/3.2/enums/audience-status.json +1 -1
  674. package/dist/lib/schemas-data/3.2/enums/audience-subject-type.json +1 -1
  675. package/dist/lib/schemas-data/3.2/enums/audio-channel-layout.json +1 -1
  676. package/dist/lib/schemas-data/3.2/enums/audio-distribution-type.json +1 -1
  677. package/dist/lib/schemas-data/3.2/enums/auth-scheme.json +1 -1
  678. package/dist/lib/schemas-data/3.2/enums/availability-status.json +1 -1
  679. package/dist/lib/schemas-data/3.2/enums/available-metric.json +1 -1
  680. package/dist/lib/schemas-data/3.2/enums/billing-party.json +1 -1
  681. package/dist/lib/schemas-data/3.2/enums/binary-verdict.json +1 -1
  682. package/dist/lib/schemas-data/3.2/enums/brand-agent-type.json +1 -1
  683. package/dist/lib/schemas-data/3.2/enums/browser-family.json +1 -1
  684. package/dist/lib/schemas-data/3.2/enums/c2pa-watermark-action.json +1 -1
  685. package/dist/lib/schemas-data/3.2/enums/canceled-by.json +1 -1
  686. package/dist/lib/schemas-data/3.2/enums/canonical-media-buy-action-mode.json +1 -1
  687. package/dist/lib/schemas-data/3.2/enums/canonical-media-buy-action.json +1 -1
  688. package/dist/lib/schemas-data/3.2/enums/catalog-action.json +1 -1
  689. package/dist/lib/schemas-data/3.2/enums/catalog-item-status.json +1 -1
  690. package/dist/lib/schemas-data/3.2/enums/catalog-type.json +1 -1
  691. package/dist/lib/schemas-data/3.2/enums/channels.json +1 -1
  692. package/dist/lib/schemas-data/3.2/enums/cloud-storage-protocol.json +1 -1
  693. package/dist/lib/schemas-data/3.2/enums/co-branding-requirement.json +1 -1
  694. package/dist/lib/schemas-data/3.2/enums/collection-cadence.json +1 -1
  695. package/dist/lib/schemas-data/3.2/enums/collection-kind.json +1 -1
  696. package/dist/lib/schemas-data/3.2/enums/collection-relationship.json +1 -1
  697. package/dist/lib/schemas-data/3.2/enums/collection-status.json +1 -1
  698. package/dist/lib/schemas-data/3.2/enums/completion-source.json +1 -1
  699. package/dist/lib/schemas-data/3.2/enums/consent-basis.json +1 -1
  700. package/dist/lib/schemas-data/3.2/enums/content-id-type.json +1 -1
  701. package/dist/lib/schemas-data/3.2/enums/content-rating-system.json +1 -1
  702. package/dist/lib/schemas-data/3.2/enums/creative-action.json +1 -1
  703. package/dist/lib/schemas-data/3.2/enums/creative-agent-capability.json +1 -1
  704. package/dist/lib/schemas-data/3.2/enums/creative-approval-status.json +1 -1
  705. package/dist/lib/schemas-data/3.2/enums/creative-event-reason-code.json +1 -1
  706. package/dist/lib/schemas-data/3.2/enums/creative-identifier-type.json +1 -1
  707. package/dist/lib/schemas-data/3.2/enums/creative-quality.json +1 -1
  708. package/dist/lib/schemas-data/3.2/enums/creative-selection-strategy.json +1 -1
  709. package/dist/lib/schemas-data/3.2/enums/creative-sort-field.json +1 -1
  710. package/dist/lib/schemas-data/3.2/enums/creative-status.json +1 -1
  711. package/dist/lib/schemas-data/3.2/enums/ctv-ad-experience.json +1 -1
  712. package/dist/lib/schemas-data/3.2/enums/daast-tracking-event.json +1 -1
  713. package/dist/lib/schemas-data/3.2/enums/daast-version.json +1 -1
  714. package/dist/lib/schemas-data/3.2/enums/day-of-week.json +1 -1
  715. package/dist/lib/schemas-data/3.2/enums/daypart-timezone-mode.json +1 -1
  716. package/dist/lib/schemas-data/3.2/enums/delegation-authority.json +1 -1
  717. package/dist/lib/schemas-data/3.2/enums/delivery-recipient-cloud.json +1 -1
  718. package/dist/lib/schemas-data/3.2/enums/delivery-status.json +1 -1
  719. package/dist/lib/schemas-data/3.2/enums/delivery-type.json +1 -1
  720. package/dist/lib/schemas-data/3.2/enums/demographic-system.json +1 -1
  721. package/dist/lib/schemas-data/3.2/enums/derivative-type.json +1 -1
  722. package/dist/lib/schemas-data/3.2/enums/device-platform.json +1 -1
  723. package/dist/lib/schemas-data/3.2/enums/device-type.json +1 -1
  724. package/dist/lib/schemas-data/3.2/enums/digital-source-type.json +1 -1
  725. package/dist/lib/schemas-data/3.2/enums/dimension-unit.json +1 -1
  726. package/dist/lib/schemas-data/3.2/enums/disclosure-persistence.json +1 -1
  727. package/dist/lib/schemas-data/3.2/enums/disclosure-position.json +1 -1
  728. package/dist/lib/schemas-data/3.2/enums/distance-unit.json +1 -1
  729. package/dist/lib/schemas-data/3.2/enums/distribution-identifier-type.json +1 -1
  730. package/dist/lib/schemas-data/3.2/enums/dooh-motion-type.json +1 -1
  731. package/dist/lib/schemas-data/3.2/enums/embedded-provenance-method.json +1 -1
  732. package/dist/lib/schemas-data/3.2/enums/error-code.json +3 -3
  733. package/dist/lib/schemas-data/3.2/enums/error-scope.json +1 -1
  734. package/dist/lib/schemas-data/3.2/enums/escalation-severity.json +1 -1
  735. package/dist/lib/schemas-data/3.2/enums/event-type.json +1 -1
  736. package/dist/lib/schemas-data/3.2/enums/exclusivity.json +1 -1
  737. package/dist/lib/schemas-data/3.2/enums/feature-check-status.json +1 -1
  738. package/dist/lib/schemas-data/3.2/enums/feed-format.json +1 -1
  739. package/dist/lib/schemas-data/3.2/enums/feedback-source.json +1 -1
  740. package/dist/lib/schemas-data/3.2/enums/forecast-method.json +1 -1
  741. package/dist/lib/schemas-data/3.2/enums/forecast-range-unit.json +1 -1
  742. package/dist/lib/schemas-data/3.2/enums/forecastable-metric.json +1 -1
  743. package/dist/lib/schemas-data/3.2/enums/format-id-parameter.json +1 -1
  744. package/dist/lib/schemas-data/3.2/enums/frame-rate-type.json +1 -1
  745. package/dist/lib/schemas-data/3.2/enums/frequency-cap-control-mode.json +1 -1
  746. package/dist/lib/schemas-data/3.2/enums/frequency-cap-mutable-field.json +1 -1
  747. package/dist/lib/schemas-data/3.2/enums/frequency-cap-scope.json +1 -1
  748. package/dist/lib/schemas-data/3.2/enums/genre-taxonomy.json +1 -1
  749. package/dist/lib/schemas-data/3.2/enums/geo-level.json +1 -1
  750. package/dist/lib/schemas-data/3.2/enums/gop-type.json +1 -1
  751. package/dist/lib/schemas-data/3.2/enums/governance-decision.json +1 -1
  752. package/dist/lib/schemas-data/3.2/enums/governance-domain.json +1 -1
  753. package/dist/lib/schemas-data/3.2/enums/governance-mode.json +1 -1
  754. package/dist/lib/schemas-data/3.2/enums/governance-phase.json +1 -1
  755. package/dist/lib/schemas-data/3.2/enums/history-entry-type.json +1 -1
  756. package/dist/lib/schemas-data/3.2/enums/http-method.json +1 -1
  757. package/dist/lib/schemas-data/3.2/enums/identifier-types.json +1 -1
  758. package/dist/lib/schemas-data/3.2/enums/impairment-offline-state.json +1 -1
  759. package/dist/lib/schemas-data/3.2/enums/impairment-reason-code.json +1 -1
  760. package/dist/lib/schemas-data/3.2/enums/indicator-type.json +1 -1
  761. package/dist/lib/schemas-data/3.2/enums/installment-status.json +1 -1
  762. package/dist/lib/schemas-data/3.2/enums/javascript-module-type.json +1 -1
  763. package/dist/lib/schemas-data/3.2/enums/landing-page-requirement.json +1 -1
  764. package/dist/lib/schemas-data/3.2/enums/legacy-postal-system.json +1 -1
  765. package/dist/lib/schemas-data/3.2/enums/lift-dimension.json +1 -1
  766. package/dist/lib/schemas-data/3.2/enums/logo-slot.json +1 -1
  767. package/dist/lib/schemas-data/3.2/enums/macro-dialect.json +1 -1
  768. package/dist/lib/schemas-data/3.2/enums/macro-mapping-status.json +1 -1
  769. package/dist/lib/schemas-data/3.2/enums/macro-processing-operation.json +1 -1
  770. package/dist/lib/schemas-data/3.2/enums/macro-resolution-reason.json +1 -1
  771. package/dist/lib/schemas-data/3.2/enums/macro-resolver.json +1 -1
  772. package/dist/lib/schemas-data/3.2/enums/macro-value-context.json +1 -1
  773. package/dist/lib/schemas-data/3.2/enums/makegood-remedy.json +1 -1
  774. package/dist/lib/schemas-data/3.2/enums/markdown-flavor.json +1 -1
  775. package/dist/lib/schemas-data/3.2/enums/match-id-type.json +1 -1
  776. package/dist/lib/schemas-data/3.2/enums/match-type.json +1 -1
  777. package/dist/lib/schemas-data/3.2/enums/media-buy-action-mode.json +1 -1
  778. package/dist/lib/schemas-data/3.2/enums/media-buy-frequency-cap-control-mode.json +1 -1
  779. package/dist/lib/schemas-data/3.2/enums/media-buy-health.json +1 -1
  780. package/dist/lib/schemas-data/3.2/enums/media-buy-status.json +1 -1
  781. package/dist/lib/schemas-data/3.2/enums/media-buy-valid-action.json +1 -1
  782. package/dist/lib/schemas-data/3.2/enums/metric-scope.json +1 -1
  783. package/dist/lib/schemas-data/3.2/enums/metric-type.json +1 -1
  784. package/dist/lib/schemas-data/3.2/enums/metro-system.json +1 -1
  785. package/dist/lib/schemas-data/3.2/enums/moov-atom-position.json +1 -1
  786. package/dist/lib/schemas-data/3.2/enums/motion-level.json +1 -1
  787. package/dist/lib/schemas-data/3.2/enums/notification-type.json +1 -1
  788. package/dist/lib/schemas-data/3.2/enums/offering-availability-status.json +1 -1
  789. package/dist/lib/schemas-data/3.2/enums/outcome-target-cost-strength.json +1 -1
  790. package/dist/lib/schemas-data/3.2/enums/outcome-type.json +1 -1
  791. package/dist/lib/schemas-data/3.2/enums/pacing.json +1 -1
  792. package/dist/lib/schemas-data/3.2/enums/payment-terms.json +1 -1
  793. package/dist/lib/schemas-data/3.2/enums/performance-baseline.json +1 -1
  794. package/dist/lib/schemas-data/3.2/enums/performance-standard-metric.json +1 -1
  795. package/dist/lib/schemas-data/3.2/enums/pixel-tracking-event.json +1 -1
  796. package/dist/lib/schemas-data/3.2/enums/policy-category.json +1 -1
  797. package/dist/lib/schemas-data/3.2/enums/policy-enforcement.json +1 -1
  798. package/dist/lib/schemas-data/3.2/enums/postal-system.json +1 -1
  799. package/dist/lib/schemas-data/3.2/enums/preview-output-format.json +1 -1
  800. package/dist/lib/schemas-data/3.2/enums/pricing-model.json +1 -1
  801. package/dist/lib/schemas-data/3.2/enums/pricing-structure.json +1 -1
  802. package/dist/lib/schemas-data/3.2/enums/principal-kind.json +1 -1
  803. package/dist/lib/schemas-data/3.2/enums/production-quality.json +1 -1
  804. package/dist/lib/schemas-data/3.2/enums/property-type.json +1 -1
  805. package/dist/lib/schemas-data/3.2/enums/proposal-decline-reason.json +1 -1
  806. package/dist/lib/schemas-data/3.2/enums/proposal-refinement-reason.json +1 -1
  807. package/dist/lib/schemas-data/3.2/enums/proposal-status.json +1 -1
  808. package/dist/lib/schemas-data/3.2/enums/publisher-identifier-types.json +1 -1
  809. package/dist/lib/schemas-data/3.2/enums/purchase-type.json +1 -1
  810. package/dist/lib/schemas-data/3.2/enums/reach-aggregation.json +1 -1
  811. package/dist/lib/schemas-data/3.2/enums/reach-unit.json +1 -1
  812. package/dist/lib/schemas-data/3.2/enums/reporting-destination-setup-state.json +1 -1
  813. package/dist/lib/schemas-data/3.2/enums/reporting-finality.json +1 -1
  814. package/dist/lib/schemas-data/3.2/enums/reporting-frequency.json +1 -1
  815. package/dist/lib/schemas-data/3.2/enums/reporting-health.json +1 -1
  816. package/dist/lib/schemas-data/3.2/enums/representation-selection-strategy.json +1 -1
  817. package/dist/lib/schemas-data/3.2/enums/request-signing-error-code.json +3 -3
  818. package/dist/lib/schemas-data/3.2/enums/response-type.json +1 -1
  819. package/dist/lib/schemas-data/3.2/enums/restricted-attribute.json +1 -1
  820. package/dist/lib/schemas-data/3.2/enums/right-type.json +1 -1
  821. package/dist/lib/schemas-data/3.2/enums/right-use.json +1 -1
  822. package/dist/lib/schemas-data/3.2/enums/rights-billing-period.json +1 -1
  823. package/dist/lib/schemas-data/3.2/enums/scan-type.json +1 -1
  824. package/dist/lib/schemas-data/3.2/enums/seller-policy-decline-reason.json +1 -1
  825. package/dist/lib/schemas-data/3.2/enums/si-session-status.json +1 -1
  826. package/dist/lib/schemas-data/3.2/enums/signal-catalog-type.json +1 -1
  827. package/dist/lib/schemas-data/3.2/enums/signal-source.json +1 -1
  828. package/dist/lib/schemas-data/3.2/enums/signal-value-type.json +1 -1
  829. package/dist/lib/schemas-data/3.2/enums/snapshot-unavailable-reason.json +1 -1
  830. package/dist/lib/schemas-data/3.2/enums/social-placement-surface.json +1 -1
  831. package/dist/lib/schemas-data/3.2/enums/sort-direction.json +1 -1
  832. package/dist/lib/schemas-data/3.2/enums/sort-metric.json +1 -1
  833. package/dist/lib/schemas-data/3.2/enums/special-category.json +1 -1
  834. package/dist/lib/schemas-data/3.2/enums/specialism.json +1 -1
  835. package/dist/lib/schemas-data/3.2/enums/sponsored-placement-type.json +1 -1
  836. package/dist/lib/schemas-data/3.2/enums/talent-role.json +1 -1
  837. package/dist/lib/schemas-data/3.2/enums/task-status.json +1 -1
  838. package/dist/lib/schemas-data/3.2/enums/task-type.json +1 -1
  839. package/dist/lib/schemas-data/3.2/enums/tracker-execution-actor.json +1 -1
  840. package/dist/lib/schemas-data/3.2/enums/tracker-firing-path.json +1 -1
  841. package/dist/lib/schemas-data/3.2/enums/transport-mode.json +1 -1
  842. package/dist/lib/schemas-data/3.2/enums/travel-time-unit.json +1 -1
  843. package/dist/lib/schemas-data/3.2/enums/uid-type.json +1 -1
  844. package/dist/lib/schemas-data/3.2/enums/universal-macro.json +1 -1
  845. package/dist/lib/schemas-data/3.2/enums/update-frequency.json +1 -1
  846. package/dist/lib/schemas-data/3.2/enums/url-asset-type.json +1 -1
  847. package/dist/lib/schemas-data/3.2/enums/validation-mode.json +1 -1
  848. package/dist/lib/schemas-data/3.2/enums/vast-media-delivery-method.json +1 -1
  849. package/dist/lib/schemas-data/3.2/enums/vast-tracking-event.json +1 -1
  850. package/dist/lib/schemas-data/3.2/enums/vast-version.json +1 -1
  851. package/dist/lib/schemas-data/3.2/enums/vendor-relationship.json +1 -1
  852. package/dist/lib/schemas-data/3.2/enums/video-placement-type.json +1 -1
  853. package/dist/lib/schemas-data/3.2/enums/view-threshold-basis.json +1 -1
  854. package/dist/lib/schemas-data/3.2/enums/viewability-standard.json +1 -1
  855. package/dist/lib/schemas-data/3.2/enums/warning-code.json +1 -1
  856. package/dist/lib/schemas-data/3.2/enums/watermark-media-type.json +1 -1
  857. package/dist/lib/schemas-data/3.2/enums/wcag-level.json +1 -1
  858. package/dist/lib/schemas-data/3.2/enums/webhook-response-type.json +1 -1
  859. package/dist/lib/schemas-data/3.2/enums/webhook-security-method.json +1 -1
  860. package/dist/lib/schemas-data/3.2/error-details/accessibility-violation.json +1 -1
  861. package/dist/lib/schemas-data/3.2/error-details/account-moved.json +2 -2
  862. package/dist/lib/schemas-data/3.2/error-details/account-setup-required.json +1 -1
  863. package/dist/lib/schemas-data/3.2/error-details/action-not-allowed.json +5 -5
  864. package/dist/lib/schemas-data/3.2/error-details/agent-permission-denied.json +1 -1
  865. package/dist/lib/schemas-data/3.2/error-details/audience-too-small.json +1 -1
  866. package/dist/lib/schemas-data/3.2/error-details/authorization-required.json +3 -3
  867. package/dist/lib/schemas-data/3.2/error-details/billing-not-permitted-for-agent.json +3 -3
  868. package/dist/lib/schemas-data/3.2/error-details/billing-not-supported.json +2 -2
  869. package/dist/lib/schemas-data/3.2/error-details/budget-too-low.json +1 -1
  870. package/dist/lib/schemas-data/3.2/error-details/conflict.json +1 -1
  871. package/dist/lib/schemas-data/3.2/error-details/creative-rejected.json +1 -1
  872. package/dist/lib/schemas-data/3.2/error-details/creative-representation-unresolved.json +2 -2
  873. package/dist/lib/schemas-data/3.2/error-details/creative-revision-content-mismatch.json +2 -2
  874. package/dist/lib/schemas-data/3.2/error-details/execution-requirement-unmet.json +2 -2
  875. package/dist/lib/schemas-data/3.2/error-details/governance-agent-not-accepted.json +2 -2
  876. package/dist/lib/schemas-data/3.2/error-details/macro-resolution-failed.json +2 -2
  877. package/dist/lib/schemas-data/3.2/error-details/policy-violation.json +1 -1
  878. package/dist/lib/schemas-data/3.2/error-details/rate-limited.json +1 -1
  879. package/dist/lib/schemas-data/3.2/error-details/requote-required.json +3 -3
  880. package/dist/lib/schemas-data/3.2/error-details/stale-response.json +1 -1
  881. package/dist/lib/schemas-data/3.2/error-details/unsupported-refinement-dimension.json +1 -1
  882. package/dist/lib/schemas-data/3.2/error-details/vast-version-mismatch.json +6 -6
  883. package/dist/lib/schemas-data/3.2/error-details/vendor-error-codes.json +1 -1
  884. package/dist/lib/schemas-data/3.2/error-details/version-unsupported.json +2 -2
  885. package/dist/lib/schemas-data/3.2/extensions/extension-meta.json +1 -1
  886. package/dist/lib/schemas-data/3.2/extensions/index.json +2 -2
  887. package/dist/lib/schemas-data/3.2/formats/canonical/_base.json +5 -5
  888. package/dist/lib/schemas-data/3.2/formats/canonical/agent_placement.json +2 -2
  889. package/dist/lib/schemas-data/3.2/formats/canonical/audio_daast.json +4 -4
  890. package/dist/lib/schemas-data/3.2/formats/canonical/audio_hosted.json +2 -2
  891. package/dist/lib/schemas-data/3.2/formats/canonical/audio_vast.json +5 -5
  892. package/dist/lib/schemas-data/3.2/formats/canonical/coordinated_placements.json +18 -18
  893. package/dist/lib/schemas-data/3.2/formats/canonical/display_tag.json +2 -2
  894. package/dist/lib/schemas-data/3.2/formats/canonical/html5.json +2 -2
  895. package/dist/lib/schemas-data/3.2/formats/canonical/image.json +5 -5
  896. package/dist/lib/schemas-data/3.2/formats/canonical/image_carousel.json +2 -2
  897. package/dist/lib/schemas-data/3.2/formats/canonical/native_in_feed.json +5 -5
  898. package/dist/lib/schemas-data/3.2/formats/canonical/responsive_creative.json +2 -2
  899. package/dist/lib/schemas-data/3.2/formats/canonical/seller_rendered_stateful_display.json +3 -3
  900. package/dist/lib/schemas-data/3.2/formats/canonical/sponsored_placement.json +4 -4
  901. package/dist/lib/schemas-data/3.2/formats/canonical/video_hosted.json +3 -3
  902. package/dist/lib/schemas-data/3.2/formats/canonical/video_vast.json +8 -8
  903. package/dist/lib/schemas-data/3.2/governance/accepted-governance-agents.json +1 -1
  904. package/dist/lib/schemas-data/3.2/governance/attribute-definition.json +1 -1
  905. package/dist/lib/schemas-data/3.2/governance/audience-constraints.json +3 -3
  906. package/dist/lib/schemas-data/3.2/governance/check-governance-request.json +10 -10
  907. package/dist/lib/schemas-data/3.2/governance/check-governance-response.json +8 -8
  908. package/dist/lib/schemas-data/3.2/governance/get-plan-audit-logs-request.json +5 -5
  909. package/dist/lib/schemas-data/3.2/governance/get-plan-audit-logs-response.json +14 -14
  910. package/dist/lib/schemas-data/3.2/governance/policy-category-definition.json +2 -2
  911. package/dist/lib/schemas-data/3.2/governance/policy-entry.json +7 -7
  912. package/dist/lib/schemas-data/3.2/governance/policy-ref.json +1 -1
  913. package/dist/lib/schemas-data/3.2/governance/report-plan-adjustment-request.json +4 -4
  914. package/dist/lib/schemas-data/3.2/governance/report-plan-adjustment-response.json +4 -4
  915. package/dist/lib/schemas-data/3.2/governance/report-plan-outcome-request.json +8 -8
  916. package/dist/lib/schemas-data/3.2/governance/report-plan-outcome-response.json +5 -5
  917. package/dist/lib/schemas-data/3.2/governance/reported-outcome-error.json +1 -1
  918. package/dist/lib/schemas-data/3.2/governance/sync-plans-request.json +14 -14
  919. package/dist/lib/schemas-data/3.2/governance/sync-plans-response.json +6 -6
  920. package/dist/lib/schemas-data/3.2/index.json +639 -639
  921. package/dist/lib/schemas-data/3.2/manifest.json +16 -8
  922. package/dist/lib/schemas-data/3.2/manifest.schema.json +1 -1
  923. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/account/get-account-financials-request.json +31 -31
  924. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/account/list-account-changes-request.json +29 -29
  925. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/account/list-accounts-request.json +31 -31
  926. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/account/report-usage-request.json +31 -31
  927. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/account/sync-accounts-request.json +94 -94
  928. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/account/sync-governance-request.json +30 -30
  929. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/brand/acquire-rights-request.json +37 -37
  930. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/brand/get-brand-identity-request.json +4 -4
  931. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/brand/get-rights-request.json +28 -28
  932. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/brand/search-brands-request.json +26 -26
  933. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/brand/update-rights-request.json +33 -33
  934. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/brand/verify-brand-claim-request.json +3 -3
  935. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/brand/verify-brand-claims-request.json +3 -3
  936. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/collection/create-collection-list-request.json +47 -47
  937. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/collection/delete-collection-list-request.json +30 -30
  938. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/collection/get-collection-list-request.json +30 -30
  939. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/collection/list-collection-lists-request.json +31 -31
  940. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/collection/update-collection-list-request.json +48 -48
  941. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/compliance/comply-test-controller-request.json +1209 -1209
  942. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/content-standards/calibrate-content-request.json +32 -32
  943. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/content-standards/create-content-standards-request.json +55 -55
  944. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/content-standards/get-content-standards-request.json +4 -4
  945. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/content-standards/get-media-buy-artifacts-request.json +30 -30
  946. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/content-standards/list-content-standards-request.json +6 -6
  947. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/content-standards/update-content-standards-request.json +55 -55
  948. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/content-standards/validate-content-delivery-request.json +32 -32
  949. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/creative/get-creative-delivery-request.json +31 -31
  950. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/creative/get-creative-features-request.json +257 -257
  951. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/creative/list-creatives-request.json +46 -46
  952. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/creative/list-transformers-request.json +33 -33
  953. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/creative/preview-creative-request.json +254 -254
  954. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/creative/sync-creatives-request.json +270 -270
  955. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/creative/validate-input-request.json +252 -252
  956. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/governance/check-governance-request.json +376 -376
  957. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/governance/get-plan-audit-logs-request.json +5 -5
  958. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/governance/report-plan-adjustment-request.json +4 -4
  959. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/governance/report-plan-outcome-request.json +86 -86
  960. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/governance/sync-plans-request.json +62 -62
  961. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/accept-proposal-request.json +22 -22
  962. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/build-creative-request.json +447 -447
  963. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/buy-products-request.json +279 -279
  964. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/control-media-buy-request.json +211 -211
  965. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/create-media-buy-request.json +511 -511
  966. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/decline-proposals-request.json +12 -12
  967. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/get-media-buy-delivery-request.json +48 -48
  968. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/get-media-buys-request.json +33 -33
  969. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/get-products-request.json +338 -338
  970. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/get-reporting-status-request.json +57 -57
  971. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/list-creative-formats-request.json +35 -35
  972. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/list-products-request.json +323 -323
  973. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/log-event-request.json +22 -22
  974. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/provide-performance-feedback-request.json +65 -65
  975. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/refine-proposals-request.json +324 -324
  976. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/request-proposals-request.json +325 -325
  977. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/sync-audiences-request.json +38 -38
  978. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/sync-catalogs-request.json +51 -51
  979. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/sync-event-sources-request.json +34 -34
  980. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/sync-reporting-receipts-request.json +22 -22
  981. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/sync-reporting-status-request.json +12 -12
  982. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/update-media-buy-request.json +520 -520
  983. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/account/get-account-financials-request.json +30 -30
  984. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/account/list-accounts-request.json +30 -30
  985. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/account/report-usage-request.json +30 -30
  986. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/account/sync-accounts-request.json +93 -93
  987. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/account/sync-governance-request.json +29 -29
  988. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/creative/list-creatives-request.json +45 -45
  989. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/creative/sync-creatives-request.json +269 -269
  990. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/manifest.json +1 -1
  991. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/accept-proposal-request.json +21 -21
  992. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/buy-products-request.json +278 -278
  993. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/control-media-buy-request.json +210 -210
  994. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/decline-proposals-request.json +12 -12
  995. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/get-media-buy-delivery-request.json +47 -47
  996. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/get-media-buys-request.json +32 -32
  997. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/get-reporting-status-request.json +57 -57
  998. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/list-products-request.json +323 -323
  999. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/log-event-request.json +22 -22
  1000. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/provide-performance-feedback-request.json +65 -65
  1001. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/refine-proposals-request.json +324 -324
  1002. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/request-proposals-request.json +325 -325
  1003. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/sync-audiences-request.json +37 -37
  1004. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/sync-catalogs-request.json +50 -50
  1005. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/sync-event-sources-request.json +33 -33
  1006. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/sync-reporting-receipts-request.json +22 -22
  1007. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/sync-reporting-status-request.json +12 -12
  1008. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/protocol/get-adcp-capabilities-request.json +4 -4
  1009. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/protocol/get-principal-request.json +4 -4
  1010. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/protocol/get-task-status-request.json +29 -29
  1011. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/protocol/list-tasks-request.json +34 -34
  1012. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/protocol/sync-principal-request.json +27 -27
  1013. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/property/create-property-list-request.json +47 -47
  1014. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/property/delete-property-list-request.json +30 -30
  1015. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/property/get-property-list-request.json +30 -30
  1016. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/property/list-property-lists-request.json +31 -31
  1017. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/property/update-property-list-request.json +47 -47
  1018. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/property/validate-property-delivery-request.json +36 -36
  1019. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/protocol/get-adcp-capabilities-request.json +4 -4
  1020. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/protocol/get-principal-request.json +4 -4
  1021. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/protocol/get-task-status-request.json +30 -30
  1022. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/protocol/list-tasks-request.json +35 -35
  1023. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/protocol/sync-agent-notification-configs-request.json +10 -10
  1024. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/protocol/sync-principal-request.json +27 -27
  1025. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/signals/activate-signal-request.json +31 -31
  1026. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/signals/get-signals-request.json +42 -42
  1027. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/sponsored-intelligence/si-get-offering-request.json +4 -4
  1028. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/sponsored-intelligence/si-initiate-session-request.json +36 -36
  1029. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/sponsored-intelligence/si-send-message-request.json +34 -34
  1030. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/sponsored-intelligence/si-terminate-session-request.json +4 -4
  1031. package/dist/lib/schemas-data/3.2/media-buy/accept-proposal-async-response-input-required.json +2 -2
  1032. package/dist/lib/schemas-data/3.2/media-buy/accept-proposal-async-response-submitted.json +2 -2
  1033. package/dist/lib/schemas-data/3.2/media-buy/accept-proposal-async-response-working.json +2 -2
  1034. package/dist/lib/schemas-data/3.2/media-buy/accept-proposal-request.json +9 -9
  1035. package/dist/lib/schemas-data/3.2/media-buy/accept-proposal-response.json +2 -2
  1036. package/dist/lib/schemas-data/3.2/media-buy/acceptance-context.json +3 -3
  1037. package/dist/lib/schemas-data/3.2/media-buy/acceptance-policy-catalog.json +4 -4
  1038. package/dist/lib/schemas-data/3.2/media-buy/acceptance-policy-profile-ref.json +1 -1
  1039. package/dist/lib/schemas-data/3.2/media-buy/acceptance-policy-profile.json +3 -3
  1040. package/dist/lib/schemas-data/3.2/media-buy/acceptance-policy-requirement.json +3 -3
  1041. package/dist/lib/schemas-data/3.2/media-buy/acceptance-policy-rule.json +3 -3
  1042. package/dist/lib/schemas-data/3.2/media-buy/build-creative-async-response-input-required.json +4 -4
  1043. package/dist/lib/schemas-data/3.2/media-buy/build-creative-async-response-submitted.json +4 -4
  1044. package/dist/lib/schemas-data/3.2/media-buy/build-creative-async-response-working.json +3 -3
  1045. package/dist/lib/schemas-data/3.2/media-buy/build-creative-request.json +19 -19
  1046. package/dist/lib/schemas-data/3.2/media-buy/build-creative-response.json +35 -35
  1047. package/dist/lib/schemas-data/3.2/media-buy/buy-products-async-response-input-required.json +2 -2
  1048. package/dist/lib/schemas-data/3.2/media-buy/buy-products-async-response-submitted.json +2 -2
  1049. package/dist/lib/schemas-data/3.2/media-buy/buy-products-async-response-working.json +2 -2
  1050. package/dist/lib/schemas-data/3.2/media-buy/buy-products-request.json +18 -18
  1051. package/dist/lib/schemas-data/3.2/media-buy/buy-products-response.json +2 -2
  1052. package/dist/lib/schemas-data/3.2/media-buy/change-term-constraints.json +4 -4
  1053. package/dist/lib/schemas-data/3.2/media-buy/change-term.json +6 -6
  1054. package/dist/lib/schemas-data/3.2/media-buy/commercial-terms.json +12 -12
  1055. package/dist/lib/schemas-data/3.2/media-buy/control-media-buy-async-response-input-required.json +2 -2
  1056. package/dist/lib/schemas-data/3.2/media-buy/control-media-buy-async-response-submitted.json +2 -2
  1057. package/dist/lib/schemas-data/3.2/media-buy/control-media-buy-async-response-working.json +2 -2
  1058. package/dist/lib/schemas-data/3.2/media-buy/control-media-buy-request.json +13 -13
  1059. package/dist/lib/schemas-data/3.2/media-buy/control-media-buy-response.json +12 -12
  1060. package/dist/lib/schemas-data/3.2/media-buy/create-media-buy-async-response-input-required.json +4 -4
  1061. package/dist/lib/schemas-data/3.2/media-buy/create-media-buy-async-response-submitted.json +4 -4
  1062. package/dist/lib/schemas-data/3.2/media-buy/create-media-buy-async-response-working.json +3 -3
  1063. package/dist/lib/schemas-data/3.2/media-buy/create-media-buy-request.json +20 -20
  1064. package/dist/lib/schemas-data/3.2/media-buy/create-media-buy-response.json +23 -23
  1065. package/dist/lib/schemas-data/3.2/media-buy/decline-proposals-async-response-input-required.json +2 -2
  1066. package/dist/lib/schemas-data/3.2/media-buy/decline-proposals-async-response-submitted.json +2 -2
  1067. package/dist/lib/schemas-data/3.2/media-buy/decline-proposals-async-response-working.json +2 -2
  1068. package/dist/lib/schemas-data/3.2/media-buy/decline-proposals-request.json +7 -7
  1069. package/dist/lib/schemas-data/3.2/media-buy/decline-proposals-response.json +5 -5
  1070. package/dist/lib/schemas-data/3.2/media-buy/get-media-buy-delivery-request.json +47 -47
  1071. package/dist/lib/schemas-data/3.2/media-buy/get-media-buy-delivery-response.json +81 -81
  1072. package/dist/lib/schemas-data/3.2/media-buy/get-media-buys-request.json +9 -9
  1073. package/dist/lib/schemas-data/3.2/media-buy/get-media-buys-response.json +52 -52
  1074. package/dist/lib/schemas-data/3.2/media-buy/get-products-async-response-input-required.json +4 -4
  1075. package/dist/lib/schemas-data/3.2/media-buy/get-products-async-response-submitted.json +4 -4
  1076. package/dist/lib/schemas-data/3.2/media-buy/get-products-async-response-working.json +3 -3
  1077. package/dist/lib/schemas-data/3.2/media-buy/get-products-rejected.json +5 -5
  1078. package/dist/lib/schemas-data/3.2/media-buy/get-products-request.json +20 -20
  1079. package/dist/lib/schemas-data/3.2/media-buy/get-products-response.json +13 -13
  1080. package/dist/lib/schemas-data/3.2/media-buy/get-products-targeting-resolution.json +3 -3
  1081. package/dist/lib/schemas-data/3.2/media-buy/get-reporting-status-request.json +10 -10
  1082. package/dist/lib/schemas-data/3.2/media-buy/get-reporting-status-response.json +27 -27
  1083. package/dist/lib/schemas-data/3.2/media-buy/legacy-purchase-continuation-input.json +2 -2
  1084. package/dist/lib/schemas-data/3.2/media-buy/list-creative-formats-request.json +14 -14
  1085. package/dist/lib/schemas-data/3.2/media-buy/list-creative-formats-response.json +9 -9
  1086. package/dist/lib/schemas-data/3.2/media-buy/list-products-request.json +9 -9
  1087. package/dist/lib/schemas-data/3.2/media-buy/list-products-response.json +5 -5
  1088. package/dist/lib/schemas-data/3.2/media-buy/log-event-request.json +5 -5
  1089. package/dist/lib/schemas-data/3.2/media-buy/log-event-response.json +8 -8
  1090. package/dist/lib/schemas-data/3.2/media-buy/media-buy-commitment-response.json +13 -13
  1091. package/dist/lib/schemas-data/3.2/media-buy/media-buy-delivery-webhook-result.json +11 -11
  1092. package/dist/lib/schemas-data/3.2/media-buy/outcome-target.json +4 -4
  1093. package/dist/lib/schemas-data/3.2/media-buy/package-control.json +9 -9
  1094. package/dist/lib/schemas-data/3.2/media-buy/package-request.json +31 -31
  1095. package/dist/lib/schemas-data/3.2/media-buy/package-update.json +14 -14
  1096. package/dist/lib/schemas-data/3.2/media-buy/product-discovery-criteria.json +9 -9
  1097. package/dist/lib/schemas-data/3.2/media-buy/product-fields.json +1 -1
  1098. package/dist/lib/schemas-data/3.2/media-buy/product-purchase-input.json +22 -22
  1099. package/dist/lib/schemas-data/3.2/media-buy/product-purchase.json +13 -13
  1100. package/dist/lib/schemas-data/3.2/media-buy/product-refinement.json +1 -1
  1101. package/dist/lib/schemas-data/3.2/media-buy/proposal-budget-constraint.json +1 -1
  1102. package/dist/lib/schemas-data/3.2/media-buy/proposal-decline.json +2 -2
  1103. package/dist/lib/schemas-data/3.2/media-buy/proposal-refinement.json +4 -4
  1104. package/dist/lib/schemas-data/3.2/media-buy/provide-performance-feedback-request.json +5 -5
  1105. package/dist/lib/schemas-data/3.2/media-buy/provide-performance-feedback-response.json +8 -8
  1106. package/dist/lib/schemas-data/3.2/media-buy/refine-proposals-async-response-input-required.json +2 -2
  1107. package/dist/lib/schemas-data/3.2/media-buy/refine-proposals-async-response-submitted.json +2 -2
  1108. package/dist/lib/schemas-data/3.2/media-buy/refine-proposals-async-response-working.json +2 -2
  1109. package/dist/lib/schemas-data/3.2/media-buy/refine-proposals-request.json +6 -6
  1110. package/dist/lib/schemas-data/3.2/media-buy/refine-proposals-response.json +12 -12
  1111. package/dist/lib/schemas-data/3.2/media-buy/request-proposals-async-response-input-required.json +2 -2
  1112. package/dist/lib/schemas-data/3.2/media-buy/request-proposals-async-response-submitted.json +2 -2
  1113. package/dist/lib/schemas-data/3.2/media-buy/request-proposals-async-response-working.json +2 -2
  1114. package/dist/lib/schemas-data/3.2/media-buy/request-proposals-request.json +9 -9
  1115. package/dist/lib/schemas-data/3.2/media-buy/request-proposals-response.json +10 -10
  1116. package/dist/lib/schemas-data/3.2/media-buy/sync-audiences-request.json +9 -9
  1117. package/dist/lib/schemas-data/3.2/media-buy/sync-audiences-response.json +15 -15
  1118. package/dist/lib/schemas-data/3.2/media-buy/sync-catalogs-async-response-input-required.json +3 -3
  1119. package/dist/lib/schemas-data/3.2/media-buy/sync-catalogs-async-response-submitted.json +4 -4
  1120. package/dist/lib/schemas-data/3.2/media-buy/sync-catalogs-async-response-working.json +3 -3
  1121. package/dist/lib/schemas-data/3.2/media-buy/sync-catalogs-request.json +10 -10
  1122. package/dist/lib/schemas-data/3.2/media-buy/sync-catalogs-response.json +20 -20
  1123. package/dist/lib/schemas-data/3.2/media-buy/sync-event-sources-request.json +8 -8
  1124. package/dist/lib/schemas-data/3.2/media-buy/sync-event-sources-response.json +14 -14
  1125. package/dist/lib/schemas-data/3.2/media-buy/sync-reporting-receipts-request.json +9 -9
  1126. package/dist/lib/schemas-data/3.2/media-buy/sync-reporting-receipts-response.json +10 -10
  1127. package/dist/lib/schemas-data/3.2/media-buy/sync-reporting-status-request.json +7 -7
  1128. package/dist/lib/schemas-data/3.2/media-buy/sync-reporting-status-response.json +8 -8
  1129. package/dist/lib/schemas-data/3.2/media-buy/update-media-buy-async-response-input-required.json +3 -3
  1130. package/dist/lib/schemas-data/3.2/media-buy/update-media-buy-async-response-submitted.json +4 -4
  1131. package/dist/lib/schemas-data/3.2/media-buy/update-media-buy-async-response-working.json +3 -3
  1132. package/dist/lib/schemas-data/3.2/media-buy/update-media-buy-request.json +15 -15
  1133. package/dist/lib/schemas-data/3.2/media-buy/update-media-buy-response.json +21 -21
  1134. package/dist/lib/schemas-data/3.2/pricing-options/cpa-option.json +4 -4
  1135. package/dist/lib/schemas-data/3.2/pricing-options/cpc-option.json +4 -4
  1136. package/dist/lib/schemas-data/3.2/pricing-options/cpcv-option.json +4 -4
  1137. package/dist/lib/schemas-data/3.2/pricing-options/cpm-option.json +4 -4
  1138. package/dist/lib/schemas-data/3.2/pricing-options/cpp-option.json +5 -5
  1139. package/dist/lib/schemas-data/3.2/pricing-options/cpv-option.json +4 -4
  1140. package/dist/lib/schemas-data/3.2/pricing-options/flat-rate-option.json +4 -4
  1141. package/dist/lib/schemas-data/3.2/pricing-options/price-breakdown.json +2 -2
  1142. package/dist/lib/schemas-data/3.2/pricing-options/price-guidance.json +1 -1
  1143. package/dist/lib/schemas-data/3.2/pricing-options/revenue-share-option.json +2 -2
  1144. package/dist/lib/schemas-data/3.2/pricing-options/time-option.json +4 -4
  1145. package/dist/lib/schemas-data/3.2/pricing-options/vcpm-option.json +4 -4
  1146. package/dist/lib/schemas-data/3.2/property/authorization-result.json +1 -1
  1147. package/dist/lib/schemas-data/3.2/property/base-property-source.json +4 -4
  1148. package/dist/lib/schemas-data/3.2/property/create-property-list-request.json +8 -8
  1149. package/dist/lib/schemas-data/3.2/property/create-property-list-response.json +6 -6
  1150. package/dist/lib/schemas-data/3.2/property/delete-property-list-request.json +5 -5
  1151. package/dist/lib/schemas-data/3.2/property/delete-property-list-response.json +5 -5
  1152. package/dist/lib/schemas-data/3.2/property/delivery-record.json +3 -3
  1153. package/dist/lib/schemas-data/3.2/property/get-property-list-request.json +5 -5
  1154. package/dist/lib/schemas-data/3.2/property/get-property-list-response.json +9 -9
  1155. package/dist/lib/schemas-data/3.2/property/list-property-lists-request.json +6 -6
  1156. package/dist/lib/schemas-data/3.2/property/list-property-lists-response.json +7 -7
  1157. package/dist/lib/schemas-data/3.2/property/property-error.json +2 -2
  1158. package/dist/lib/schemas-data/3.2/property/property-feature-definition.json +2 -2
  1159. package/dist/lib/schemas-data/3.2/property/property-feature-result.json +4 -4
  1160. package/dist/lib/schemas-data/3.2/property/property-feature-value.json +2 -2
  1161. package/dist/lib/schemas-data/3.2/property/property-feature.json +1 -1
  1162. package/dist/lib/schemas-data/3.2/property/property-list-changed-webhook.json +2 -2
  1163. package/dist/lib/schemas-data/3.2/property/property-list-filters.json +5 -5
  1164. package/dist/lib/schemas-data/3.2/property/property-list.json +6 -6
  1165. package/dist/lib/schemas-data/3.2/property/update-property-list-request.json +8 -8
  1166. package/dist/lib/schemas-data/3.2/property/update-property-list-response.json +6 -6
  1167. package/dist/lib/schemas-data/3.2/property/validate-property-delivery-request.json +6 -6
  1168. package/dist/lib/schemas-data/3.2/property/validate-property-delivery-response.json +6 -6
  1169. package/dist/lib/schemas-data/3.2/property/validation-result.json +5 -5
  1170. package/dist/lib/schemas-data/3.2/protocol/get-adcp-capabilities-request.json +4 -4
  1171. package/dist/lib/schemas-data/3.2/protocol/get-adcp-capabilities-response.json +60 -60
  1172. package/dist/lib/schemas-data/3.2/protocol/get-principal-request.json +4 -4
  1173. package/dist/lib/schemas-data/3.2/protocol/get-principal-response.json +9 -9
  1174. package/dist/lib/schemas-data/3.2/protocol/get-task-status-request.json +5 -5
  1175. package/dist/lib/schemas-data/3.2/protocol/get-task-status-response.json +10 -10
  1176. package/dist/lib/schemas-data/3.2/protocol/list-tasks-request.json +13 -13
  1177. package/dist/lib/schemas-data/3.2/protocol/list-tasks-response.json +8 -8
  1178. package/dist/lib/schemas-data/3.2/protocol/sync-agent-notification-configs-request.json +5 -5
  1179. package/dist/lib/schemas-data/3.2/protocol/sync-agent-notification-configs-response.json +7 -7
  1180. package/dist/lib/schemas-data/3.2/protocol/sync-principal-request.json +8 -8
  1181. package/dist/lib/schemas-data/3.2/protocol/sync-principal-response.json +10 -10
  1182. package/dist/lib/schemas-data/3.2/registries/v1-canonical-mapping.json +2 -2
  1183. package/dist/lib/schemas-data/3.2/signals/activate-signal-request.json +6 -6
  1184. package/dist/lib/schemas-data/3.2/signals/activate-signal-response.json +9 -9
  1185. package/dist/lib/schemas-data/3.2/signals/get-signals-async-response-submitted.json +4 -4
  1186. package/dist/lib/schemas-data/3.2/signals/get-signals-async-response-working.json +3 -3
  1187. package/dist/lib/schemas-data/3.2/signals/get-signals-request.json +12 -12
  1188. package/dist/lib/schemas-data/3.2/signals/get-signals-response.json +17 -17
  1189. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-capabilities.json +1 -1
  1190. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-context-use.json +1 -1
  1191. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-get-offering-request.json +4 -4
  1192. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-get-offering-response.json +9 -9
  1193. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-identity.json +1 -1
  1194. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-initiate-session-request.json +7 -7
  1195. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-initiate-session-response.json +10 -10
  1196. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-send-message-request.json +5 -5
  1197. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-send-message-response.json +10 -10
  1198. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-sponsored-context-receipt.json +4 -4
  1199. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-sponsored-context.json +4 -4
  1200. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-terminate-session-request.json +4 -4
  1201. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-terminate-session-response.json +7 -7
  1202. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-ui-element.json +1 -1
  1203. package/dist/lib/schemas-data/3.2/trusted-match/available-package.json +5 -5
  1204. package/dist/lib/schemas-data/3.2/trusted-match/context-match-request.json +5 -5
  1205. package/dist/lib/schemas-data/3.2/trusted-match/context-match-response.json +4 -4
  1206. package/dist/lib/schemas-data/3.2/trusted-match/error.json +1 -1
  1207. package/dist/lib/schemas-data/3.2/trusted-match/identity-match-request.json +4 -4
  1208. package/dist/lib/schemas-data/3.2/trusted-match/identity-match-response.json +4 -4
  1209. package/dist/lib/schemas-data/3.2/trusted-match/offer-price.json +1 -1
  1210. package/dist/lib/schemas-data/3.2/trusted-match/offer.json +5 -5
  1211. package/dist/lib/schemas-data/3.2/trusted-match/provider-context-match-response.json +4 -4
  1212. package/dist/lib/schemas-data/3.2/trusted-match/provider-identity-match-response.json +4 -4
  1213. package/dist/lib/schemas-data/3.2/trusted-match/provider-registration.json +3 -3
  1214. package/dist/lib/schemas-data/3.2/trusted-match/publisher-targeting-kv-config.json +1 -1
  1215. package/dist/lib/schemas-data/3.2/trusted-match/publisher-tmpx-config.json +1 -1
  1216. package/dist/lib/schemas-data/3.2/trusted-match/tmpx-chunk.json +1 -1
  1217. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  1218. package/dist/lib/server/wire-spec-fields.generated.d.mts +32 -32
  1219. package/dist/lib/server/wire-spec-fields.generated.d.ts +32 -32
  1220. package/dist/lib/server/wire-spec-fields.generated.js +32 -32
  1221. package/dist/lib/server/wire-spec-fields.generated.mjs +32 -32
  1222. package/dist/lib/signing/agent-resolver/fetch-helpers.js +1 -1
  1223. package/dist/lib/signing/agent-resolver/fetch-helpers.mjs +1 -1
  1224. package/dist/lib/testing/storyboard/validations.d.mts +1 -1
  1225. package/dist/lib/testing/storyboard/validations.d.ts +1 -1
  1226. package/dist/lib/types/accept-proposal.d.ts +1 -1
  1227. package/dist/lib/types/acquire-rights.d.ts +1 -1
  1228. package/dist/lib/types/activate-signal.d.ts +1 -1
  1229. package/dist/lib/types/build-creative.d.ts +1 -1
  1230. package/dist/lib/types/buy-products.d.ts +1 -1
  1231. package/dist/lib/types/control-media-buy.d.ts +1 -1
  1232. package/dist/lib/types/core.generated.d.mts +5 -5
  1233. package/dist/lib/types/core.generated.d.ts +5 -5
  1234. package/dist/lib/types/create-collection-list.d.ts +1 -1
  1235. package/dist/lib/types/create-media-buy.d.ts +3 -3
  1236. package/dist/lib/types/create-property-list.d.ts +1 -1
  1237. package/dist/lib/types/delete-collection-list.d.ts +1 -1
  1238. package/dist/lib/types/delete-property-list.d.ts +1 -1
  1239. package/dist/lib/types/enums.generated.d.mts +1 -1
  1240. package/dist/lib/types/enums.generated.d.ts +1 -1
  1241. package/dist/lib/types/enums.generated.js +1 -1
  1242. package/dist/lib/types/enums.generated.mjs +1 -1
  1243. package/dist/lib/types/error-codes.d.mts +2 -2
  1244. package/dist/lib/types/error-codes.d.ts +2 -2
  1245. package/dist/lib/types/get-account-financials.d.ts +1 -1
  1246. package/dist/lib/types/get-adcp-capabilities.d.ts +3 -3
  1247. package/dist/lib/types/get-collection-list.d.ts +1 -1
  1248. package/dist/lib/types/get-creative-delivery.d.ts +1 -1
  1249. package/dist/lib/types/get-creative-features.d.ts +1 -1
  1250. package/dist/lib/types/get-media-buy-artifacts.d.ts +1 -1
  1251. package/dist/lib/types/get-media-buy-delivery.d.ts +1 -1
  1252. package/dist/lib/types/get-media-buys.d.ts +1 -1
  1253. package/dist/lib/types/get-products.d.ts +1 -1
  1254. package/dist/lib/types/get-property-list.d.ts +1 -1
  1255. package/dist/lib/types/get-signals.d.ts +1 -1
  1256. package/dist/lib/types/get-task-status.d.ts +1 -1
  1257. package/dist/lib/types/list-account-changes.d.ts +1 -1
  1258. package/dist/lib/types/list-accounts.d.ts +1 -1
  1259. package/dist/lib/types/list-collection-lists.d.ts +1 -1
  1260. package/dist/lib/types/list-creative-formats.d.ts +1 -1
  1261. package/dist/lib/types/list-creatives.d.ts +1 -1
  1262. package/dist/lib/types/list-property-lists.d.ts +1 -1
  1263. package/dist/lib/types/list-tasks.d.ts +1 -1
  1264. package/dist/lib/types/list-transformers.d.ts +1 -1
  1265. package/dist/lib/types/manifest.generated.d.mts +5 -5
  1266. package/dist/lib/types/manifest.generated.d.ts +5 -5
  1267. package/dist/lib/types/manifest.generated.js +2 -2
  1268. package/dist/lib/types/manifest.generated.mjs +2 -2
  1269. package/dist/lib/types/per-tool-index.json +1 -1
  1270. package/dist/lib/types/report-usage.d.ts +1 -1
  1271. package/dist/lib/types/sync-accounts.d.ts +2 -2
  1272. package/dist/lib/types/sync-audiences.d.ts +1 -1
  1273. package/dist/lib/types/sync-catalogs.d.ts +1 -1
  1274. package/dist/lib/types/sync-creatives.d.ts +1 -1
  1275. package/dist/lib/types/sync-event-sources.d.ts +1 -1
  1276. package/dist/lib/types/sync-governance.d.ts +1 -1
  1277. package/dist/lib/types/tools.generated.d.mts +7 -7
  1278. package/dist/lib/types/tools.generated.d.ts +7 -7
  1279. package/dist/lib/types/update-collection-list.d.ts +2 -2
  1280. package/dist/lib/types/update-media-buy.d.ts +2 -2
  1281. package/dist/lib/types/update-property-list.d.ts +1 -1
  1282. package/dist/lib/types/update-rights.d.ts +1 -1
  1283. package/dist/lib/types/validate-input.d.ts +1 -1
  1284. package/dist/lib/types/validate-property-delivery.d.ts +1 -1
  1285. package/dist/lib/types/wellknown-schemas.generated.js +2 -2
  1286. package/dist/lib/types/wellknown-schemas.generated.mjs +2 -2
  1287. package/dist/lib/version.d.mts +7 -7
  1288. package/dist/lib/version.d.ts +7 -7
  1289. package/dist/lib/version.js +8 -6
  1290. package/dist/lib/version.mjs +8 -6
  1291. package/docs/CLI.md +1 -1
  1292. package/docs/TYPE-SUMMARY.md +2 -2
  1293. package/docs/guides/MEDIA-BUY-3.2-COMPATIBILITY.md +1 -1
  1294. package/docs/guides/REPORTING-LEDGER.md +1 -1
  1295. package/docs/llms.txt +4 -4
  1296. package/docs/migration-14.x-rc-worksheet.md +8 -8
  1297. package/docs/recipes/verifying-inbound-webhooks.md +8 -0
  1298. package/package.json +3 -3
  1299. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/brand/index.yaml +0 -0
  1300. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/brand/scenarios/distributed_brand_resolution.yaml +0 -0
  1301. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/brand/scenarios/signed_response_envelope_vectors.yaml +0 -0
  1302. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/brand/scenarios/single_side_trust_extension.yaml +0 -0
  1303. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/creative/index.yaml +0 -0
  1304. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/creative/scenarios/asset_type_filtering.yaml +0 -0
  1305. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/creative/scenarios/billing_out_of_band.yaml +0 -0
  1306. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/creative/scenarios/canonical_supported_formats.yaml +0 -0
  1307. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/creative/scenarios/creative_features_idempotency.yaml +0 -0
  1308. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
  1309. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/creative/scenarios/creative_revision_identity.yaml +0 -0
  1310. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/creative/scenarios/list_creatives_filter_behavior.yaml +0 -0
  1311. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/creative/scenarios/native_in_feed.yaml +0 -0
  1312. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/creative/scenarios/native_localization.yaml +0 -0
  1313. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/creative/scenarios/policy_backed_rejections.yaml +0 -0
  1314. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/governance/index.yaml +0 -0
  1315. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/governance/scenarios/failed_outcome_audit_persistence.yaml +0 -0
  1316. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/governance/scenarios/property_list_change_webhook_signing.yaml +0 -0
  1317. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/index.yaml +0 -0
  1318. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/account_change_feed.yaml +0 -0
  1319. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/account_timezone_buyer_selected.yaml +0 -0
  1320. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/account_timezone_seller_assigned.yaml +0 -0
  1321. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/account_timezone_seller_fixed.yaml +0 -0
  1322. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/audience_activation_discovery.yaml +0 -0
  1323. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/audience_buy_flow.yaml +0 -0
  1324. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/availability_windows.yaml +0 -0
  1325. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/available_actions.yaml +0 -0
  1326. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/bidding_cost_binding.yaml +0 -0
  1327. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/bidding_policy_placement.yaml +0 -0
  1328. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
  1329. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/budget_cap_timezone_account.yaml +0 -0
  1330. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/budget_cap_timezone_fixed.yaml +0 -0
  1331. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/budget_cap_timezone_override.yaml +0 -0
  1332. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/budget_cap_timezone_override_rejected.yaml +0 -0
  1333. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/canonical_formats.yaml +0 -0
  1334. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/catalog_item_availability_updates.yaml +0 -0
  1335. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/change_rights_state_projection.yaml +0 -0
  1336. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
  1337. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/collection_selection.yaml +0 -0
  1338. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/compact_direct_buy_lifecycle.yaml +0 -0
  1339. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/compact_product_lifecycle.yaml +0 -0
  1340. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
  1341. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/create_media_buy_async.yaml +0 -0
  1342. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/create_media_buy_async_lifecycle.yaml +0 -0
  1343. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +0 -0
  1344. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/creative_reception.yaml +0 -0
  1345. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/cross_path_targeting_provenance.yaml +0 -0
  1346. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/declined_proposal_execution.yaml +0 -0
  1347. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/declined_proposal_refinement.yaml +0 -0
  1348. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/delivery_reporting.yaml +0 -0
  1349. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/demographic_targeting.yaml +0 -0
  1350. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/dependency_impairment.yaml +0 -0
  1351. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/dependency_impairment_audience.yaml +0 -0
  1352. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +0 -0
  1353. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/event_dedup_flow.yaml +0 -0
  1354. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/expired_proposal_execution.yaml +0 -0
  1355. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/external_audience_source_binding.yaml +0 -0
  1356. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/frequency_cap_capability_updates.yaml +0 -0
  1357. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
  1358. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/geo_place_targeting.yaml +0 -0
  1359. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/geo_region_all_values_support.yaml +0 -0
  1360. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/geo_region_exclusion_support.yaml +0 -0
  1361. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/geo_region_targeting.yaml +0 -0
  1362. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/get_products_async.yaml +0 -0
  1363. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/get_products_rejected.yaml +0 -0
  1364. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/governance_agent_binding_acceptance.yaml +0 -0
  1365. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/governance_approved.yaml +0 -0
  1366. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/governance_conditions.yaml +0 -0
  1367. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/governance_denied.yaml +0 -0
  1368. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
  1369. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/inline_creatives_without_sync.yaml +0 -0
  1370. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/invalid_transitions.yaml +0 -0
  1371. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/inventory_list_no_match.yaml +0 -0
  1372. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/inventory_list_targeting.yaml +0 -0
  1373. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/measurement_accountability.yaml +0 -0
  1374. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/measurement_terms_accepted.yaml +0 -0
  1375. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/measurement_terms_rejected.yaml +0 -0
  1376. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/media_buy_frequency_cap_readback.yaml +0 -0
  1377. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/media_buy_frequency_cap_updates.yaml +0 -0
  1378. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/metric_container_subsumption.yaml +0 -0
  1379. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/outcome_target.yaml +0 -0
  1380. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/outcome_target_list_products_inert.yaml +0 -0
  1381. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/owner_sold_channel_carriage.yaml +0 -0
  1382. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/package_automatic_bidding.yaml +0 -0
  1383. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
  1384. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/pending_creatives_to_start.yaml +0 -0
  1385. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
  1386. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/performance_buy_flow.yaml +0 -0
  1387. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
  1388. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/portfolio_routing_scope.yaml +0 -0
  1389. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
  1390. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/product_coverage_filters.yaml +0 -0
  1391. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/product_filter_behavior.yaml +0 -0
  1392. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/product_signal_targeting.yaml +0 -0
  1393. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
  1394. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
  1395. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/provenance_audit_observation.yaml +0 -0
  1396. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/provenance_enforcement.yaml +0 -0
  1397. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -0
  1398. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/reach_buy_flow.yaml +0 -0
  1399. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/read_filter_behavior.yaml +0 -0
  1400. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
  1401. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/refine_frequency_cap_negotiation.yaml +0 -0
  1402. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/refine_products.yaml +0 -0
  1403. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/revenue_share_pricing.yaml +0 -0
  1404. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/seller_optimized_budget.yaml +0 -0
  1405. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/seller_optimized_min_spend_target_exceeds_package_cap.yaml +0 -0
  1406. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/seller_optimized_proposal_package_pacing.yaml +0 -0
  1407. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/targeting_aware_discovery.yaml +0 -0
  1408. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/total_budget_redistribution.yaml +0 -0
  1409. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/typed_proposal_negotiation.yaml +0 -0
  1410. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/vendor_metric_accountability.yaml +0 -0
  1411. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
  1412. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
  1413. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/media-buy/state-machine.yaml +0 -0
  1414. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/signals/index.yaml +0 -0
  1415. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/signals/scenarios/get_signals_async.yaml +0 -0
  1416. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/sponsored-intelligence/index.yaml +0 -0
  1417. /package/compliance/cache/{3.2.1 → 3.2.3}/domains/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
  1418. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/brand/index.yaml +0 -0
  1419. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/brand/scenarios/distributed_brand_resolution.yaml +0 -0
  1420. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/brand/scenarios/signed_response_envelope_vectors.yaml +0 -0
  1421. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/brand/scenarios/single_side_trust_extension.yaml +0 -0
  1422. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/creative/index.yaml +0 -0
  1423. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/creative/scenarios/asset_type_filtering.yaml +0 -0
  1424. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/creative/scenarios/billing_out_of_band.yaml +0 -0
  1425. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/creative/scenarios/canonical_supported_formats.yaml +0 -0
  1426. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/creative/scenarios/creative_features_idempotency.yaml +0 -0
  1427. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
  1428. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/creative/scenarios/creative_revision_identity.yaml +0 -0
  1429. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/creative/scenarios/list_creatives_filter_behavior.yaml +0 -0
  1430. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/creative/scenarios/native_in_feed.yaml +0 -0
  1431. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/creative/scenarios/native_localization.yaml +0 -0
  1432. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/creative/scenarios/policy_backed_rejections.yaml +0 -0
  1433. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/governance/index.yaml +0 -0
  1434. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/governance/scenarios/failed_outcome_audit_persistence.yaml +0 -0
  1435. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/governance/scenarios/property_list_change_webhook_signing.yaml +0 -0
  1436. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/index.yaml +0 -0
  1437. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/account_change_feed.yaml +0 -0
  1438. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/account_timezone_buyer_selected.yaml +0 -0
  1439. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/account_timezone_seller_assigned.yaml +0 -0
  1440. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/account_timezone_seller_fixed.yaml +0 -0
  1441. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/audience_activation_discovery.yaml +0 -0
  1442. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/audience_buy_flow.yaml +0 -0
  1443. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/availability_windows.yaml +0 -0
  1444. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/available_actions.yaml +0 -0
  1445. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/bidding_cost_binding.yaml +0 -0
  1446. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/bidding_policy_placement.yaml +0 -0
  1447. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
  1448. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/budget_cap_timezone_account.yaml +0 -0
  1449. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/budget_cap_timezone_fixed.yaml +0 -0
  1450. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/budget_cap_timezone_override.yaml +0 -0
  1451. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/budget_cap_timezone_override_rejected.yaml +0 -0
  1452. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/canonical_formats.yaml +0 -0
  1453. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/catalog_item_availability_updates.yaml +0 -0
  1454. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/change_rights_state_projection.yaml +0 -0
  1455. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
  1456. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/collection_selection.yaml +0 -0
  1457. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/compact_direct_buy_lifecycle.yaml +0 -0
  1458. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/compact_product_lifecycle.yaml +0 -0
  1459. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
  1460. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/create_media_buy_async.yaml +0 -0
  1461. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/create_media_buy_async_lifecycle.yaml +0 -0
  1462. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +0 -0
  1463. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/creative_reception.yaml +0 -0
  1464. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/cross_path_targeting_provenance.yaml +0 -0
  1465. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/declined_proposal_execution.yaml +0 -0
  1466. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/declined_proposal_refinement.yaml +0 -0
  1467. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/delivery_reporting.yaml +0 -0
  1468. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/demographic_targeting.yaml +0 -0
  1469. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/dependency_impairment.yaml +0 -0
  1470. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/dependency_impairment_audience.yaml +0 -0
  1471. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +0 -0
  1472. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/event_dedup_flow.yaml +0 -0
  1473. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/expired_proposal_execution.yaml +0 -0
  1474. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/external_audience_source_binding.yaml +0 -0
  1475. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/frequency_cap_capability_updates.yaml +0 -0
  1476. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
  1477. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/geo_place_targeting.yaml +0 -0
  1478. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/geo_region_all_values_support.yaml +0 -0
  1479. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/geo_region_exclusion_support.yaml +0 -0
  1480. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/geo_region_targeting.yaml +0 -0
  1481. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/get_products_async.yaml +0 -0
  1482. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/get_products_rejected.yaml +0 -0
  1483. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/governance_agent_binding_acceptance.yaml +0 -0
  1484. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/governance_approved.yaml +0 -0
  1485. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/governance_conditions.yaml +0 -0
  1486. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/governance_denied.yaml +0 -0
  1487. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
  1488. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/inline_creatives_without_sync.yaml +0 -0
  1489. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/invalid_transitions.yaml +0 -0
  1490. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/inventory_list_no_match.yaml +0 -0
  1491. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/inventory_list_targeting.yaml +0 -0
  1492. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/measurement_accountability.yaml +0 -0
  1493. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/measurement_terms_accepted.yaml +0 -0
  1494. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +0 -0
  1495. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/media_buy_frequency_cap_readback.yaml +0 -0
  1496. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/media_buy_frequency_cap_updates.yaml +0 -0
  1497. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/metric_container_subsumption.yaml +0 -0
  1498. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/outcome_target.yaml +0 -0
  1499. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/outcome_target_list_products_inert.yaml +0 -0
  1500. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/owner_sold_channel_carriage.yaml +0 -0
  1501. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/package_automatic_bidding.yaml +0 -0
  1502. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
  1503. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +0 -0
  1504. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
  1505. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/performance_buy_flow.yaml +0 -0
  1506. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
  1507. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/portfolio_routing_scope.yaml +0 -0
  1508. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
  1509. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/product_coverage_filters.yaml +0 -0
  1510. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/product_filter_behavior.yaml +0 -0
  1511. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/product_signal_targeting.yaml +0 -0
  1512. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
  1513. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
  1514. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/provenance_audit_observation.yaml +0 -0
  1515. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/provenance_enforcement.yaml +0 -0
  1516. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -0
  1517. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/reach_buy_flow.yaml +0 -0
  1518. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/read_filter_behavior.yaml +0 -0
  1519. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
  1520. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/refine_frequency_cap_negotiation.yaml +0 -0
  1521. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/refine_products.yaml +0 -0
  1522. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/revenue_share_pricing.yaml +0 -0
  1523. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/seller_optimized_budget.yaml +0 -0
  1524. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/seller_optimized_min_spend_target_exceeds_package_cap.yaml +0 -0
  1525. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/seller_optimized_proposal_package_pacing.yaml +0 -0
  1526. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/targeting_aware_discovery.yaml +0 -0
  1527. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/total_budget_redistribution.yaml +0 -0
  1528. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/typed_proposal_negotiation.yaml +0 -0
  1529. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +0 -0
  1530. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
  1531. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
  1532. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/media-buy/state-machine.yaml +0 -0
  1533. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/signals/index.yaml +0 -0
  1534. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/signals/scenarios/get_signals_async.yaml +0 -0
  1535. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/sponsored-intelligence/index.yaml +0 -0
  1536. /package/compliance/cache/{3.2.1 → 3.2.3}/protocols/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
  1537. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/audience-sync/index.yaml +0 -0
  1538. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/brand-rights/index.yaml +0 -0
  1539. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/brand-rights/scenarios/governance_approved.yaml +0 -0
  1540. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/brand-rights/scenarios/governance_denied.yaml +0 -0
  1541. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/brand-rights/scenarios/update_rights_lifecycle.yaml +0 -0
  1542. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/buyer-activation/index.yaml +0 -0
  1543. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/buyer-discovery/index.yaml +0 -0
  1544. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/buyer-monitoring/index.yaml +0 -0
  1545. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/buyer-negotiation/index.yaml +0 -0
  1546. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/buyer-recovery/index.yaml +0 -0
  1547. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/collection-lists/index.yaml +0 -0
  1548. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/content-standards/index.yaml +0 -0
  1549. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/creative-ad-server/index.yaml +0 -0
  1550. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/creative-generative/generative-seller.yaml +0 -0
  1551. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/creative-generative/index.yaml +0 -0
  1552. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/creative-template/index.yaml +0 -0
  1553. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/creative-transformers/index.yaml +0 -0
  1554. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/creative-transformers/scenarios/governance_approved.yaml +0 -0
  1555. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/creative-transformers/scenarios/governance_denied.yaml +0 -0
  1556. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/governance-aware-seller/index.yaml +0 -0
  1557. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +0 -0
  1558. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/governance-delivery-monitor/index.yaml +0 -0
  1559. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/governance-spend-authority/denied.yaml +0 -0
  1560. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/governance-spend-authority/index.yaml +0 -0
  1561. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/orchestrator-multi-agent/index.yaml +0 -0
  1562. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/property-lists/index.yaml +0 -0
  1563. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/sales-broadcast-tv/index.yaml +0 -0
  1564. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/sales-catalog-driven/index.yaml +0 -0
  1565. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/sales-dooh/index.yaml +0 -0
  1566. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/sales-exchange/index.yaml +0 -0
  1567. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/sales-non-guaranteed/index.yaml +0 -0
  1568. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/sales-proposal-mode/index.yaml +0 -0
  1569. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/sales-retail-media/index.yaml +0 -0
  1570. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/sales-social/index.yaml +0 -0
  1571. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/sales-streaming-tv/index.yaml +0 -0
  1572. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/signal-marketplace/index.yaml +0 -0
  1573. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/signal-marketplace/scenarios/governance_approved.yaml +0 -0
  1574. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/signal-marketplace/scenarios/governance_denied.yaml +0 -0
  1575. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/signal-owned/index.yaml +0 -0
  1576. /package/compliance/cache/{3.2.1 → 3.2.3}/specialisms/sponsored-intelligence/index.yaml +0 -0
  1577. /package/compliance/cache/{3.2.1 → 3.2.3}/test-kits/acme-outdoor-live.yaml +0 -0
  1578. /package/compliance/cache/{3.2.1 → 3.2.3}/test-kits/acme-outdoor.yaml +0 -0
  1579. /package/compliance/cache/{3.2.1 → 3.2.3}/test-kits/billing-gate-runner.yaml +0 -0
  1580. /package/compliance/cache/{3.2.1 → 3.2.3}/test-kits/bistro-oranje.yaml +0 -0
  1581. /package/compliance/cache/{3.2.1 → 3.2.3}/test-kits/distributed-brand-runner.yaml +0 -0
  1582. /package/compliance/cache/{3.2.1 → 3.2.3}/test-kits/hosted-grader.yaml +0 -0
  1583. /package/compliance/cache/{3.2.1 → 3.2.3}/test-kits/nova-motors.yaml +0 -0
  1584. /package/compliance/cache/{3.2.1 → 3.2.3}/test-kits/oauth-setup-runner.yaml +0 -0
  1585. /package/compliance/cache/{3.2.1 → 3.2.3}/test-kits/osei-natural.yaml +0 -0
  1586. /package/compliance/cache/{3.2.1 → 3.2.3}/test-kits/parallel-dispatch-runner.yaml +0 -0
  1587. /package/compliance/cache/{3.2.1 → 3.2.3}/test-kits/rate-limit-trip-runner.yaml +0 -0
  1588. /package/compliance/cache/{3.2.1 → 3.2.3}/test-kits/signed-requests-runner.yaml +0 -0
  1589. /package/compliance/cache/{3.2.1 → 3.2.3}/test-kits/signed-responses-runner.yaml +0 -0
  1590. /package/compliance/cache/{3.2.1 → 3.2.3}/test-kits/single-side-trust-runner.yaml +0 -0
  1591. /package/compliance/cache/{3.2.1 → 3.2.3}/test-kits/substitution-observer-runner.yaml +0 -0
  1592. /package/compliance/cache/{3.2.1 → 3.2.3}/test-kits/summit-foods.yaml +0 -0
  1593. /package/compliance/cache/{3.2.1 → 3.2.3}/test-kits/trusted-match-router-runner.yaml +0 -0
  1594. /package/compliance/cache/{3.2.1 → 3.2.3}/test-kits/webhook-receiver-runner.yaml +0 -0
  1595. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/attestations/README.md +0 -0
  1596. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/attestations/vectors.json +0 -0
  1597. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/audience-evidence/README.md +0 -0
  1598. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/audience-evidence/vectors.json +0 -0
  1599. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/brand-response-signing/brand-authorization-cross-check.json +0 -0
  1600. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/catalog-macro-substitution.json +0 -0
  1601. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/creative-representation-resolution.json +0 -0
  1602. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/creative-representation-resolution.schema.json +0 -0
  1603. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/error-recovery/README.md +0 -0
  1604. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/error-recovery/vectors.json +0 -0
  1605. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/governance-authorization.json +0 -0
  1606. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/governance-runtime-attestations/README.md +0 -0
  1607. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/governance-runtime-attestations/vectors.json +0 -0
  1608. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/macro-processing.json +0 -0
  1609. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/macro-processing.schema.json +0 -0
  1610. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/oauth-setup/vectors.json +0 -0
  1611. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/plan-hash/001-minimal-plan.json +0 -0
  1612. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/plan-hash/002-full-plan.json +0 -0
  1613. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/plan-hash/003-bookkeeping-stripped.json +0 -0
  1614. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/plan-hash/004a-human-review-omitted.json +0 -0
  1615. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/plan-hash/004b-human-review-explicit-null.json +0 -0
  1616. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/plan-hash/005a-policy-categories-order-1.json +0 -0
  1617. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/plan-hash/005b-policy-categories-order-2.json +0 -0
  1618. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/plan-hash/006a-ext-trace-v1.json +0 -0
  1619. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/plan-hash/006b-ext-trace-v2.json +0 -0
  1620. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/plan-hash/007-unicode-objectives.json +0 -0
  1621. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/plan-hash/008-numeric-canonicalization.json +0 -0
  1622. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/products-only-brief-compatibility/README.md +0 -0
  1623. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/products-only-brief-compatibility/vectors.json +0 -0
  1624. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/relationship-scoped-indicators.json +0 -0
  1625. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/reporting-reconciliation/README.md +0 -0
  1626. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/reporting-reconciliation/adjustment.json +0 -0
  1627. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/reporting-reconciliation/canonicalization.json +0 -0
  1628. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/reporting-reconciliation/coverage-aggregation.json +0 -0
  1629. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/reporting-reconciliation/manifest.json +0 -0
  1630. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/reporting-reconciliation/materialization.json +0 -0
  1631. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/reporting-reconciliation/obligation.json +0 -0
  1632. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/reporting-reconciliation/receipts/accepted-recorded-response.json +0 -0
  1633. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/reporting-reconciliation/receipts/accepted-request.json +0 -0
  1634. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/reporting-reconciliation/receipts/accepted-unchanged-response.json +0 -0
  1635. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/reporting-reconciliation/receipts/adjustment-accepted-recorded-response.json +0 -0
  1636. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/reporting-reconciliation/receipts/adjustment-accepted-request.json +0 -0
  1637. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/reporting-reconciliation/receipts/rejected-recorded-response.json +0 -0
  1638. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/reporting-reconciliation/receipts/rejected-request.json +0 -0
  1639. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/reporting-reconciliation/report-definition.json +0 -0
  1640. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/reporting-reconciliation/revision.json +0 -0
  1641. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/reporting-reconciliation/row-schema.json +0 -0
  1642. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/reporting-reconciliation/rows.jsonl +0 -0
  1643. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/reporting-reconciliation/scenario-index.json +0 -0
  1644. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/reporting-reconciliation/scenario-index.schema.json +0 -0
  1645. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/reporting-summary/complete-summary.json +0 -0
  1646. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/body-integrity-policy.json +0 -0
  1647. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/canonicalization.json +0 -0
  1648. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/keys.json +0 -0
  1649. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/negative/001-no-signature-header.json +0 -0
  1650. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/negative/002-wrong-tag.json +0 -0
  1651. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/negative/003-expired-signature.json +0 -0
  1652. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/negative/004-window-too-long.json +0 -0
  1653. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/negative/005-alg-not-allowed.json +0 -0
  1654. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/negative/006-missing-covered-component.json +0 -0
  1655. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/negative/007-missing-content-digest.json +0 -0
  1656. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/negative/008-unknown-keyid.json +0 -0
  1657. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +0 -0
  1658. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/negative/010-content-digest-mismatch.json +0 -0
  1659. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/negative/011-malformed-header.json +0 -0
  1660. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/negative/012-missing-expires-param.json +0 -0
  1661. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/negative/013-expires-le-created.json +0 -0
  1662. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/negative/014-missing-nonce-param.json +0 -0
  1663. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/negative/015-signature-invalid.json +0 -0
  1664. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/negative/016-replayed-nonce.json +0 -0
  1665. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/negative/017-key-revoked.json +0 -0
  1666. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +0 -0
  1667. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/negative/019-signature-without-signature-input.json +0 -0
  1668. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/negative/020-rate-abuse.json +0 -0
  1669. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +0 -0
  1670. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/negative/022-multi-valued-content-type.json +0 -0
  1671. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +0 -0
  1672. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/negative/024-unquoted-string-param.json +0 -0
  1673. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +0 -0
  1674. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/negative/026-non-ascii-host.json +0 -0
  1675. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +0 -0
  1676. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +0 -0
  1677. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/positive/001-basic-post.json +0 -0
  1678. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/positive/002-post-with-content-digest.json +0 -0
  1679. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/positive/003-es256-post.json +0 -0
  1680. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/positive/004-multiple-signature-labels.json +0 -0
  1681. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/positive/005-default-port-stripped.json +0 -0
  1682. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/positive/006-dot-segment-path.json +0 -0
  1683. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/positive/007-query-byte-preserved.json +0 -0
  1684. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/positive/008-percent-encoded-path.json +0 -0
  1685. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +0 -0
  1686. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +0 -0
  1687. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/positive/011-ipv6-authority.json +0 -0
  1688. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +0 -0
  1689. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/negative/001-base64url-sf-binary.json +0 -0
  1690. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/negative/002-multiple-trailing-dots.json +0 -0
  1691. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/negative/002-wrong-tag.json +0 -0
  1692. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/negative/003-expired-signature.json +0 -0
  1693. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/negative/004-window-too-long.json +0 -0
  1694. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/negative/005-alg-not-allowed.json +0 -0
  1695. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/negative/006-missing-covered-component.json +0 -0
  1696. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/negative/007-missing-content-digest.json +0 -0
  1697. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/negative/008-unknown-keyid.json +0 -0
  1698. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/negative/009-key-ops-missing-verify.json +0 -0
  1699. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/negative/010-content-digest-mismatch.json +0 -0
  1700. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/negative/012-missing-expires-param.json +0 -0
  1701. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/negative/013-expires-le-created.json +0 -0
  1702. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/negative/014-missing-nonce-param.json +0 -0
  1703. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/negative/015-signature-invalid.json +0 -0
  1704. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/negative/016-replayed-nonce.json +0 -0
  1705. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/negative/017-key-revoked.json +0 -0
  1706. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/negative/020-rate-abuse.json +0 -0
  1707. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/negative/025-jwk-alg-crv-mismatch.json +0 -0
  1708. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/positive/001-post-with-content-digest.json +0 -0
  1709. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/positive/003-es256-post.json +0 -0
  1710. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/positive/004-multiple-signature-labels.json +0 -0
  1711. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/positive/005-default-port-stripped.json +0 -0
  1712. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/positive/006-dot-segment-path.json +0 -0
  1713. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/positive/007-query-byte-preserved.json +0 -0
  1714. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/positive/008-percent-encoded-path.json +0 -0
  1715. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/positive/009-percent-encoded-unreserved-decoded.json +0 -0
  1716. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/positive/010-percent-encoded-slash-preserved.json +0 -0
  1717. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/positive/011-ipv6-authority.json +0 -0
  1718. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/profile-3.2/positive/012-ipv6-authority-default-port-stripped.json +0 -0
  1719. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/request-signing/protocol-method-names.json +0 -0
  1720. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/rights-attestations/README.md +0 -0
  1721. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/rights-attestations/vectors.json +0 -0
  1722. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/supply-path/README.md +0 -0
  1723. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/supply-path/vectors.json +0 -0
  1724. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/tracker-execution-contracts.json +0 -0
  1725. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/tracker-execution-contracts.schema.json +0 -0
  1726. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/trusted-match-context-merge/README.md +0 -0
  1727. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/trusted-match-context-merge/vectors.json +0 -0
  1728. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/universal-macro-translation.json +0 -0
  1729. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/universal-macro-translation.schema.json +0 -0
  1730. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-receiver-envelope.json +0 -0
  1731. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/README.md +0 -0
  1732. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/keys.json +0 -0
  1733. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/negative/001-wrong-tag.json +0 -0
  1734. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/negative/002-expired-signature.json +0 -0
  1735. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/negative/003-window-too-long.json +0 -0
  1736. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +0 -0
  1737. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/negative/005-missing-authority-component.json +0 -0
  1738. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/negative/006-missing-content-digest.json +0 -0
  1739. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/negative/007-unknown-keyid.json +0 -0
  1740. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +0 -0
  1741. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +0 -0
  1742. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +0 -0
  1743. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/negative/011-signature-without-input.json +0 -0
  1744. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/negative/012-missing-expires-param.json +0 -0
  1745. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/negative/013-expires-le-created.json +0 -0
  1746. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +0 -0
  1747. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/negative/015-signature-invalid.json +0 -0
  1748. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/negative/016-replayed-nonce.json +0 -0
  1749. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/negative/017-key-revoked.json +0 -0
  1750. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/negative/018-rate-abuse.json +0 -0
  1751. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/negative/019-revocation-stale.json +0 -0
  1752. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +0 -0
  1753. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +0 -0
  1754. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/positive/001-basic-post.json +0 -0
  1755. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/positive/002-es256-post.json +0 -0
  1756. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +0 -0
  1757. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/positive/004-default-port-stripped.json +0 -0
  1758. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +0 -0
  1759. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +0 -0
  1760. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +0 -0
  1761. /package/compliance/cache/{3.2.1 → 3.2.3}/test-vectors/webhook-signing/positive/008-request-signing-key-reuse.json +0 -0
  1762. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/account-identity-reconciliation.yaml +0 -0
  1763. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/agent-notification-configs.yaml +0 -0
  1764. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/billing-gate-dispatch.yaml +0 -0
  1765. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/buyer-fixture-publisher.yaml +0 -0
  1766. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/buyer-orchestrator-track.yaml +0 -0
  1767. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/canonical-format-validate-input.yaml +0 -0
  1768. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/capability-discovery.yaml +0 -0
  1769. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/collection-lists-pagination-integrity.yaml +0 -0
  1770. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/comply-controller-mode-gate.yaml +0 -0
  1771. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/content-standards-pagination-integrity.yaml +0 -0
  1772. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/deterministic-testing.yaml +0 -0
  1773. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/error-compliance-signals.yaml +0 -0
  1774. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/error-compliance.yaml +0 -0
  1775. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/fictional-entities.yaml +0 -0
  1776. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/get-media-buys-pagination-integrity.yaml +0 -0
  1777. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/get-products-pagination-integrity.yaml +0 -0
  1778. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/get-signals-pagination-integrity.yaml +0 -0
  1779. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/governance.yaml +0 -0
  1780. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/idempotency.yaml +0 -0
  1781. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/notification-config-event-scope.yaml +0 -0
  1782. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/notification-config-lifecycle.yaml +0 -0
  1783. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/notification-config-rejections.yaml +0 -0
  1784. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/oauth-setup.yaml +0 -0
  1785. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/pagination-integrity-creative-formats.yaml +0 -0
  1786. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/pagination-integrity-list-accounts.yaml +0 -0
  1787. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/pagination-integrity.yaml +0 -0
  1788. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/principal.yaml +0 -0
  1789. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/property-lists-pagination-integrity.yaml +0 -0
  1790. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/read-tool-idempotency.yaml +0 -0
  1791. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/reliable-reporting-managed-delivery.yaml +0 -0
  1792. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/reliable-reporting-reconciled-billing.yaml +0 -0
  1793. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/reporting-consumer-status.yaml +0 -0
  1794. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/reporting-core-declaration.yaml +0 -0
  1795. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/reporting-core.yaml +0 -0
  1796. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/runner-output-contract.yaml +0 -0
  1797. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/schema-validation-signals.yaml +0 -0
  1798. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/schema-validation.yaml +0 -0
  1799. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/security.yaml +0 -0
  1800. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/signed-requests.yaml +0 -0
  1801. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/stale-response-advisory.yaml +0 -0
  1802. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/storyboard-schema.yaml +0 -0
  1803. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/trusted-match-publisher-authentication.yaml +0 -0
  1804. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/v3-envelope-integrity.yaml +0 -0
  1805. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/version-negotiation.yaml +0 -0
  1806. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/webhook-emission.yaml +0 -0
  1807. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/webhook-receiver-envelope.yaml +0 -0
  1808. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/wholesale-feed-bulk-webhooks.yaml +0 -0
  1809. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/wholesale-feed-product-webhooks.yaml +0 -0
  1810. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/wholesale-feed-products-scope-isolation.yaml +0 -0
  1811. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/wholesale-feed-products.yaml +0 -0
  1812. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/wholesale-feed-signal-webhooks.yaml +0 -0
  1813. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/wholesale-feed-signals-scope-isolation.yaml +0 -0
  1814. /package/compliance/cache/{3.2.1 → 3.2.3}/universal/wholesale-feed-signals.yaml +0 -0
@@ -23,7 +23,7 @@ __export(wellknown_schemas_generated_exports, {
23
23
  });
24
24
  module.exports = __toCommonJS(wellknown_schemas_generated_exports);
25
25
  var import_zod = require("zod");
26
- const BrandJsonSchema = import_zod.z.union([import_zod.z.object({ "$schema": import_zod.z.string().optional(), "authoritative_location": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL of the authoritative brand.json file"), "redirect_reason": import_zod.z.enum(["acquisition", "divestiture", "rebrand", "regional", "legacy", "consolidation", "other"]).describe("Optional structured signal indicating why this redirect was put in place. Consumers SHOULD use this to inform cache TTL decisions: 'acquisition' / 'divestiture' / 'rebrand' / 'consolidation' suggest the resolved target is in transition and consumers SHOULD shorten cache TTL until stable. 'regional' / 'legacy' suggest a stable redirect with no special cache handling needed. Free-text rationale belongs in 'note'.").optional(), "redirect_effective_at": import_zod.z.string().datetime().describe("Optional timestamp when this redirect became effective. Caches MUST treat any entry cached before this timestamp as stale and re-fetch through the redirect.").optional(), "note": import_zod.z.string().describe("Optional human-readable rationale for the redirect.").optional(), "last_updated": import_zod.z.string().datetime().optional() }).strict().describe("Redirects to a hosted brand.json file at another URL"), import_zod.z.object({ "$schema": import_zod.z.string().optional(), "house": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("House domain to fetch brand portfolio from"), "region": import_zod.z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code if this is a regional domain").optional(), "redirect_reason": import_zod.z.enum(["acquisition", "divestiture", "rebrand", "regional", "legacy", "consolidation", "other"]).describe("Optional structured signal indicating why this redirect was put in place. Consumers SHOULD use this to inform cache TTL decisions: 'acquisition' / 'divestiture' / 'rebrand' / 'consolidation' suggest the resolved target is in transition and consumers SHOULD shorten cache TTL until stable. 'regional' / 'legacy' suggest a stable redirect with no special cache handling needed. Free-text rationale belongs in 'note'.").optional(), "redirect_effective_at": import_zod.z.string().datetime().describe("Optional timestamp when this redirect became effective. Caches MUST treat any entry cached before this timestamp as stale and re-fetch through the redirect.").optional(), "note": import_zod.z.string().describe("Optional human-readable rationale for the redirect.").optional(), "last_updated": import_zod.z.string().datetime().optional() }).strict().describe("Redirects to the house domain that contains the full brand portfolio"), import_zod.z.object({ "$schema": import_zod.z.string().optional(), "version": import_zod.z.string().optional(), "agents": import_zod.z.array(import_zod.z.object({ "type": import_zod.z.enum(["brand", "rights", "measurement", "governance", "creative", "sales", "buying", "signals"]).describe("Functional role of this agent"), "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("Agent endpoint URL (MCP or A2A). Callers comparing a brand's declared agent URL against another value (e.g., resolving 'is this the agent that signed this artifact?' or matching against a discovery cache) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. After the publication chain and an authorized request-signing key verify, this exact entry's canonical URL is the stable Agent identity input for principal mapping; the domain, JWKS URI, kid, and key material are credential or trust facts beneath it, not the Agent identity. See docs/reference/url-canonicalization."), "id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).max(100).describe("Agent identifier (useful for logging, multi-tenant platforms)"), "description": import_zod.z.string().max(500).describe("Human-readable description of this agent's capabilities or scope").optional(), "jwks_uri": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL of the agent's JWKS (RFC 7517) containing public keys used to verify artifacts this agent signs or requests it sends. Verified artifacts include signed governance_context tokens (for governance agents) and RFC 9421 HTTP Signatures on outgoing requests (for any agent). When absent, verifiers MUST default to /.well-known/jwks.json on the origin of `url`. Keys are identified by `kid` in the JWS header or RFC 9421 `keyid` parameter; JWKS MAY contain multiple keys to support rotation and per-purpose separation via `key_ops` and `use`.").optional(), "available_uses": import_zod.z.array(import_zod.z.enum(["likeness", "voice", "name", "endorsement", "motion_capture", "signature", "catchphrase", "sync", "background_music", "editorial", "commercial", "ai_generated_image"]).describe("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.")).describe("For rights agents: rights uses available for licensing").optional(), "right_types": import_zod.z.array(import_zod.z.enum(["talent", "character", "brand_ip", "music", "stock_media"]).describe("Categories of intellectual property rights that can be licensed through the brand protocol.")).describe("For rights agents: types of rights available").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).describe("ISO 3166-1 alpha-2 country codes where this agent operates. Omit for global scope.").optional() }).catchall(import_zod.z.any()).describe("An agent declared by a brand or house. Each entry identifies one agent endpoint and its functional role in the advertising ecosystem.")).describe("Agents declared by this brand or house. Multiple entries with the same type are permitted when they have distinct url values, such as one endpoint URL per tenant or property scope. Agent url values MUST be unique within this array; duplicate urls are invalid because signature verifiers resolve a signing key by matching one agent url to one agents[] entry and reject ambiguous matches.").optional(), "brand_agent": import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("Brand agent MCP endpoint URL. Callers comparing this URL against another value (e.g., resolving 'is this the brand's declared agent?' against a discovery cache) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. See docs/reference/url-canonicalization."), "id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Agent identifier (useful for logging, multi-tenant DAMs)") }).catchall(import_zod.z.any()).describe("Reference to a brand agent that provides brand data via MCP").optional(), "contact": import_zod.z.object({ "name": import_zod.z.string().min(1).max(255), "email": import_zod.z.string().email().max(255).optional(), "domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("A valid domain name").optional() }).catchall(import_zod.z.any()).describe("Contact information").optional(), "data_subject_contestation": import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL to a human-accessible contestation form or information page.").optional(), "email": import_zod.z.string().email().describe("Email address for contestation requests. Deployer MUST monitor and respond within the timelines set by applicable law (e.g., 1 month under GDPR Art. 12(3)).").optional(), "languages": import_zod.z.array(import_zod.z.string()).describe("BCP 47 language tags the contestation channel supports (e.g., ['en', 'de', 'fr']). At minimum SHOULD include a language spoken in every jurisdiction where the brand runs regulated-vertical campaigns.").optional() }).strict().and(import_zod.z.union([import_zod.z.any(), import_zod.z.any()])).describe("Contact point where a data subject can request human intervention, express their view, or contest an automated decision \u2014 satisfying GDPR Article 22(3) and EU AI Act Article 26(11) transparency obligations. This is a contact reference (URL, email, or both), not a machine-callable API. AdCP surfaces the pointer; the deployer runs the contestation workflow.").optional(), "last_updated": import_zod.z.string().datetime().optional() }).strict().and(import_zod.z.union([import_zod.z.any(), import_zod.z.any()])).describe("Brand represented by agents that provide brand info via MCP"), import_zod.z.object({ "$schema": import_zod.z.string().optional(), "version": import_zod.z.string().optional(), "default_language": import_zod.z.string().regex(new RegExp("^(?:[a-z]{2,8}(?:-[A-Z][a-z]{3})?(?:-(?:[A-Z]{2}|[0-9]{3}))?(?:-(?:[a-z0-9]{5,8}|[0-9][a-z0-9]{3}))*(?:-[0-9a-wy-z](?:-[a-z0-9]{2,8})+)*(?:-x(?:-[a-z0-9]{1,8})+)?|x(?:-[a-z0-9]{1,8})+)$")).min(2).max(63).describe("A well-formed BCP 47 language tag used by AdCP only as language identity. Script and region may refine that identity; other valid BCP 47 subtags remain part of tag matching but do not make this a general locale-settings object. It does not determine currency, time zone, number/date formatting, market, or legal jurisdiction. The AdCP canonical wire profile requires lower-case language and variants, title-case script, and upper-case region (for example `en-US`, `zh-Hant-TW`, or `x-private`). RFC 5646 comparisons are case-insensitive and its case regularization is optional; AdCP intentionally requires this stricter single wire spelling and receivers MUST reject differently cased tags rather than silently normalizing them. The schema pattern enforces the AdCP casing profile and extension structure for commonly used tags; conforming receivers additionally validate the complete RFC 5646 grammar and registry rules. Every new AdCP field carrying BCP 47 language identity or a concrete language range MUST reference this schema instead of declaring independent string constraints.").describe("BCP 47 language tag for legacy plain-string and plain-array content in this document. Readers assume en when omitted.").default("en"), "house": import_zod.z.object({ "domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("The house's domain where brand.json is hosted"), "name": import_zod.z.string().min(1).describe("Primary display name of the house"), "names": import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.string().min(1)).describe("A localized name using the legacy underscore-separated language/region key convention (for example 'en_US', 'fr_CA', or 'zh_CN') and a name value. Bare language codes such as 'en' are also accepted for backwards compatibility. These keys are not AdCP locale-tag values: a bridge to /schemas/core/locale-tag.json replaces '_' with '-', applies the AdCP canonical wire profile, and validates the result rather than passing the key through unchanged.")).describe("Localized house names including legal name, stock symbol, etc.").optional(), "architecture": import_zod.z.enum(["branded_house", "house_of_brands", "hybrid"]).describe("Brand architecture model: branded_house (Google), house_of_brands (P&G), hybrid (Nike)").optional(), "agents": import_zod.z.array(import_zod.z.object({ "type": import_zod.z.enum(["brand", "rights", "measurement", "governance", "creative", "sales", "buying", "signals"]).describe("Functional role of this agent"), "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("Agent endpoint URL (MCP or A2A). Callers comparing a brand's declared agent URL against another value (e.g., resolving 'is this the agent that signed this artifact?' or matching against a discovery cache) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. After the publication chain and an authorized request-signing key verify, this exact entry's canonical URL is the stable Agent identity input for principal mapping; the domain, JWKS URI, kid, and key material are credential or trust facts beneath it, not the Agent identity. See docs/reference/url-canonicalization."), "id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).max(100).describe("Agent identifier (useful for logging, multi-tenant platforms)"), "description": import_zod.z.string().max(500).describe("Human-readable description of this agent's capabilities or scope").optional(), "jwks_uri": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL of the agent's JWKS (RFC 7517) containing public keys used to verify artifacts this agent signs or requests it sends. Verified artifacts include signed governance_context tokens (for governance agents) and RFC 9421 HTTP Signatures on outgoing requests (for any agent). When absent, verifiers MUST default to /.well-known/jwks.json on the origin of `url`. Keys are identified by `kid` in the JWS header or RFC 9421 `keyid` parameter; JWKS MAY contain multiple keys to support rotation and per-purpose separation via `key_ops` and `use`.").optional(), "available_uses": import_zod.z.array(import_zod.z.enum(["likeness", "voice", "name", "endorsement", "motion_capture", "signature", "catchphrase", "sync", "background_music", "editorial", "commercial", "ai_generated_image"]).describe("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.")).describe("For rights agents: rights uses available for licensing").optional(), "right_types": import_zod.z.array(import_zod.z.enum(["talent", "character", "brand_ip", "music", "stock_media"]).describe("Categories of intellectual property rights that can be licensed through the brand protocol.")).describe("For rights agents: types of rights available").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).describe("ISO 3166-1 alpha-2 country codes where this agent operates. Omit for global scope.").optional() }).catchall(import_zod.z.any()).describe("An agent declared by a brand or house. Each entry identifies one agent endpoint and its functional role in the advertising ecosystem.")).describe("House-level agents that apply to all brands unless overridden at the brand level").optional(), "data_subject_contestation": import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL to a human-accessible contestation form or information page.").optional(), "email": import_zod.z.string().email().describe("Email address for contestation requests. Deployer MUST monitor and respond within the timelines set by applicable law (e.g., 1 month under GDPR Art. 12(3)).").optional(), "languages": import_zod.z.array(import_zod.z.string()).describe("BCP 47 language tags the contestation channel supports (e.g., ['en', 'de', 'fr']). At minimum SHOULD include a language spoken in every jurisdiction where the brand runs regulated-vertical campaigns.").optional() }).strict().and(import_zod.z.union([import_zod.z.any(), import_zod.z.any()])).describe("House-level fallback contestation contact. Governance agents resolve in order: brand.data_subject_contestation \u2192 house.data_subject_contestation \u2192 missing (critical finding when human review required).").optional(), "identity_relying_parties": import_zod.z.array(import_zod.z.object({ "issuer": import_zod.z.object({ "domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where /.well-known/brand.json is hosted, or the brand's operating domain"), "brand_id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand identifier within the house portfolio. Optional for single-brand domains.").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("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.").optional(), "industries": import_zod.z.array(import_zod.z.string()).describe("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.").optional(), "data_subject_contestation": import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).optional(), "email": import_zod.z.string().email().optional(), "languages": import_zod.z.array(import_zod.z.string()).optional() }).strict().and(import_zod.z.union([import_zod.z.any(), import_zod.z.any()])).describe("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.").optional(), "brand_kit_override": import_zod.z.object({ "logo": import_zod.z.object({ "asset_type": import_zod.z.literal("image").describe("Discriminator identifying this as an image asset. See /schemas/creative/asset-types for the registry."), "url": import_zod.z.string().url().describe("URL to the image asset"), "width": import_zod.z.number().int().gte(1).describe("Width in pixels"), "height": import_zod.z.number().int().gte(1).describe("Height in pixels"), "file_size_bytes": import_zod.z.number().int().gte(1).describe("Image file size in bytes. Required by agents that advertise a max_file_size_kb constraint.").optional(), "pixel_ratio": import_zod.z.number().gt(0).describe("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.").optional(), "state_id": import_zod.z.string().describe("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.").optional(), "breakpoint_id": import_zod.z.string().describe("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.").optional(), "focal_point": import_zod.z.array(import_zod.z.number().gte(0).lte(1)).max(2).describe("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.").optional(), "format": import_zod.z.string().describe("Image file format (jpg, png, gif, webp, etc.)").optional(), "alt_text": import_zod.z.string().describe("Alternative text for accessibility").optional(), "provenance": import_zod.z.object({ "digital_source_type": import_zod.z.enum(["digital_capture", "digital_creation", "trained_algorithmic_media", "composite_with_trained_algorithmic_media", "algorithmic_media", "composite_capture", "composite_synthetic", "human_edits", "data_driven_media"]).describe("IPTC-aligned classification of AI involvement in producing this content").optional(), "synthetic_depiction": import_zod.z.boolean().describe("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`.").optional(), "ai_tool": import_zod.z.object({ "name": import_zod.z.string().describe("Name of the AI tool or model (e.g., 'DALL-E 3', 'Stable Diffusion XL', 'Gemini')"), "version": import_zod.z.string().describe("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.").optional(), "provider": import_zod.z.string().describe("Organization that provides the AI tool (e.g., 'OpenAI', 'Stability AI', 'Google')").optional() }).describe("AI system used to generate or modify this content. Aligns with IPTC 2025.1 AI metadata fields and C2PA claim_generator.").optional(), "human_oversight": import_zod.z.enum(["none", "prompt_only", "selected", "edited", "directed"]).describe("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`.").optional(), "declared_by": import_zod.z.object({ "agent_url": import_zod.z.string().url().describe("URL of the agent or service that declared this provenance").optional(), "role": import_zod.z.enum(["creator", "advertiser", "agency", "platform", "tool"]).describe("Role of the declaring party in the supply chain") }).describe("Party declaring this provenance. Identifies who attached the provenance claim, enabling receiving parties to assess trust.").optional(), "declared_at": import_zod.z.string().datetime().describe("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.").optional(), "created_time": import_zod.z.string().datetime().describe("When this content was created or generated (ISO 8601)").optional(), "c2pa": import_zod.z.object({ "manifest_url": import_zod.z.string().url().describe("URL to the C2PA manifest store for this content") }).describe("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.").optional(), "embedded_provenance": import_zod.z.array(import_zod.z.object({ "method": import_zod.z.enum(["manifest_wrapper", "provenance_markers"]).describe("How provenance data is carried within the content"), "standard": import_zod.z.string().describe("Standard the embedding conforms to, if any (e.g., 'c2pa' for C2PA Section A.7 text manifest embedding)").optional(), "provider": import_zod.z.string().describe("Organization that performed the embedding (e.g., 'Encypher', 'Digimarc'). Display label and audit context \u2014 not a wire identifier."), "verify_agent": import_zod.z.object({ "agent_url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("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."), "feature_id": import_zod.z.string().describe("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.").optional() }).strict().describe("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).").optional(), "embedded_at": import_zod.z.string().datetime().describe("When the provenance data was embedded (ISO 8601)").optional() })).describe("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`).").optional(), "watermarks": import_zod.z.array(import_zod.z.object({ "media_type": import_zod.z.enum(["audio", "image", "video", "text"]).describe("Media category of the watermarked content"), "provider": import_zod.z.string().describe("Organization that applied the watermark (e.g., 'Imatag', 'Steg.AI', 'Encypher'). Display label and audit context \u2014 not a wire identifier."), "verify_agent": import_zod.z.object({ "agent_url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("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."), "feature_id": import_zod.z.string().describe("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.").optional() }).strict().describe("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).").optional(), "c2pa_action": import_zod.z.enum(["c2pa.watermarked.bound", "c2pa.watermarked.unbound"]).describe("C2PA action classification for this watermark").optional(), "embedded_at": import_zod.z.string().datetime().describe("When the watermark was applied (ISO 8601)").optional() })).describe("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`).").optional(), "disclosure": import_zod.z.object({ "required": import_zod.z.boolean().describe("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."), "jurisdictions": import_zod.z.array(import_zod.z.object({ "country": import_zod.z.string().describe("ISO 3166-1 alpha-2 country code (e.g., 'US', 'DE', 'CN')"), "region": import_zod.z.string().describe("Sub-national region code (e.g., 'CA' for California, 'BY' for Bavaria)").optional(), "regulation": import_zod.z.string().describe("Regulation identifier (e.g., 'eu_ai_act_article_50', 'ca_sb_942', 'cn_deep_synthesis')"), "label_text": import_zod.z.string().describe("Required disclosure label text for this jurisdiction, in the local language").optional(), "render_guidance": import_zod.z.object({ "persistence": import_zod.z.enum(["continuous", "initial", "flexible"]).describe("How long the disclosure must persist during content playback or display").optional(), "min_duration_ms": import_zod.z.number().int().gte(1).describe("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.").optional(), "positions": import_zod.z.array(import_zod.z.enum(["prominent", "footer", "audio", "subtitle", "overlay", "end_card", "pre_roll", "companion"]).describe("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.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Preferred disclosure positions in priority order. The first position a format supports should be used.").optional(), "ext": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).describe("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.").optional() }).describe("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.").optional() })).describe("Jurisdictions where disclosure obligations apply").optional() }).describe("Regulatory disclosure requirements for this content. Indicates whether AI disclosure is required and under which jurisdictions.").optional(), "verification": import_zod.z.array(import_zod.z.object({ "verified_by": import_zod.z.string().describe("Name of the verification service (e.g., 'DoubleVerify', 'Hive Moderation', 'Reality Defender')"), "verified_time": import_zod.z.string().datetime().describe("When the verification was performed (ISO 8601)").optional(), "result": import_zod.z.enum(["authentic", "ai_generated", "ai_modified", "inconclusive"]).describe("Verification outcome"), "confidence": import_zod.z.number().gte(0).lte(1).describe("Confidence score of the verification result (0.0 to 1.0)").optional(), "details_url": import_zod.z.string().url().describe("URL to the full verification report").optional() })).describe("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.").optional(), "ext": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).describe("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.").optional() }).describe("Provenance metadata for this asset, overrides manifest-level provenance").optional() }).catchall(import_zod.z.any()).describe("Override logo asset.").optional(), "colors": import_zod.z.object({ "primary": import_zod.z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional(), "secondary": import_zod.z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional(), "accent": import_zod.z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional() }).catchall(import_zod.z.any()).describe("Override brand colors (hex strings).").optional(), "voice": import_zod.z.string().describe("Override brand-voice description for surface-composed text/audio output.").optional(), "tagline": import_zod.z.string().describe("Override tagline.").optional() }).catchall(import_zod.z.any()).describe("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.").optional() }).strict().describe(`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).`), "scheme": import_zod.z.string().describe('Proof scheme and version, e.g. "world_id_v4".').optional(), "relying_party_id": import_zod.z.string().describe("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."), "scope": import_zod.z.enum(["entity", "property"]).describe("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).").optional() }).strict().describe("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.")).describe("Verified-identity relying parties this house/entity operates, so a buyer can verify that a forwarded TMP identity attestation's relying_party_id genuinely belongs to this entity (provenance) rather than being replayed under another owner. For network-as-RP, the network publishes its own relying_party_id here. See specs/tmp-verified-identity-attestation.md.").optional() }).catchall(import_zod.z.any()).describe("Corporate or organizational entity that owns brands"), "brands": import_zod.z.array(import_zod.z.object({ "id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand identifier within the house. House chooses this ID."), "url": import_zod.z.string().url().describe("Primary brand URL for context and asset discovery").optional(), "identity_relying_parties": import_zod.z.array(import_zod.z.object({ "issuer": import_zod.z.object({ "domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where /.well-known/brand.json is hosted, or the brand's operating domain"), "brand_id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand identifier within the house portfolio. Optional for single-brand domains.").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("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.").optional(), "industries": import_zod.z.array(import_zod.z.string()).describe("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.").optional(), "data_subject_contestation": import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).optional(), "email": import_zod.z.string().email().optional(), "languages": import_zod.z.array(import_zod.z.string()).optional() }).strict().and(import_zod.z.union([import_zod.z.any(), import_zod.z.any()])).describe("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.").optional(), "brand_kit_override": import_zod.z.object({ "logo": import_zod.z.object({ "asset_type": import_zod.z.literal("image").describe("Discriminator identifying this as an image asset. See /schemas/creative/asset-types for the registry."), "url": import_zod.z.string().url().describe("URL to the image asset"), "width": import_zod.z.number().int().gte(1).describe("Width in pixels"), "height": import_zod.z.number().int().gte(1).describe("Height in pixels"), "file_size_bytes": import_zod.z.number().int().gte(1).describe("Image file size in bytes. Required by agents that advertise a max_file_size_kb constraint.").optional(), "pixel_ratio": import_zod.z.number().gt(0).describe("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.").optional(), "state_id": import_zod.z.string().describe("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.").optional(), "breakpoint_id": import_zod.z.string().describe("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.").optional(), "focal_point": import_zod.z.array(import_zod.z.number().gte(0).lte(1)).max(2).describe("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.").optional(), "format": import_zod.z.string().describe("Image file format (jpg, png, gif, webp, etc.)").optional(), "alt_text": import_zod.z.string().describe("Alternative text for accessibility").optional(), "provenance": import_zod.z.object({ "digital_source_type": import_zod.z.enum(["digital_capture", "digital_creation", "trained_algorithmic_media", "composite_with_trained_algorithmic_media", "algorithmic_media", "composite_capture", "composite_synthetic", "human_edits", "data_driven_media"]).describe("IPTC-aligned classification of AI involvement in producing this content").optional(), "synthetic_depiction": import_zod.z.boolean().describe("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`.").optional(), "ai_tool": import_zod.z.object({ "name": import_zod.z.string().describe("Name of the AI tool or model (e.g., 'DALL-E 3', 'Stable Diffusion XL', 'Gemini')"), "version": import_zod.z.string().describe("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.").optional(), "provider": import_zod.z.string().describe("Organization that provides the AI tool (e.g., 'OpenAI', 'Stability AI', 'Google')").optional() }).describe("AI system used to generate or modify this content. Aligns with IPTC 2025.1 AI metadata fields and C2PA claim_generator.").optional(), "human_oversight": import_zod.z.enum(["none", "prompt_only", "selected", "edited", "directed"]).describe("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`.").optional(), "declared_by": import_zod.z.object({ "agent_url": import_zod.z.string().url().describe("URL of the agent or service that declared this provenance").optional(), "role": import_zod.z.enum(["creator", "advertiser", "agency", "platform", "tool"]).describe("Role of the declaring party in the supply chain") }).describe("Party declaring this provenance. Identifies who attached the provenance claim, enabling receiving parties to assess trust.").optional(), "declared_at": import_zod.z.string().datetime().describe("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.").optional(), "created_time": import_zod.z.string().datetime().describe("When this content was created or generated (ISO 8601)").optional(), "c2pa": import_zod.z.object({ "manifest_url": import_zod.z.string().url().describe("URL to the C2PA manifest store for this content") }).describe("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.").optional(), "embedded_provenance": import_zod.z.array(import_zod.z.object({ "method": import_zod.z.enum(["manifest_wrapper", "provenance_markers"]).describe("How provenance data is carried within the content"), "standard": import_zod.z.string().describe("Standard the embedding conforms to, if any (e.g., 'c2pa' for C2PA Section A.7 text manifest embedding)").optional(), "provider": import_zod.z.string().describe("Organization that performed the embedding (e.g., 'Encypher', 'Digimarc'). Display label and audit context \u2014 not a wire identifier."), "verify_agent": import_zod.z.object({ "agent_url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("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."), "feature_id": import_zod.z.string().describe("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.").optional() }).strict().describe("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).").optional(), "embedded_at": import_zod.z.string().datetime().describe("When the provenance data was embedded (ISO 8601)").optional() })).describe("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`).").optional(), "watermarks": import_zod.z.array(import_zod.z.object({ "media_type": import_zod.z.enum(["audio", "image", "video", "text"]).describe("Media category of the watermarked content"), "provider": import_zod.z.string().describe("Organization that applied the watermark (e.g., 'Imatag', 'Steg.AI', 'Encypher'). Display label and audit context \u2014 not a wire identifier."), "verify_agent": import_zod.z.object({ "agent_url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("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."), "feature_id": import_zod.z.string().describe("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.").optional() }).strict().describe("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).").optional(), "c2pa_action": import_zod.z.enum(["c2pa.watermarked.bound", "c2pa.watermarked.unbound"]).describe("C2PA action classification for this watermark").optional(), "embedded_at": import_zod.z.string().datetime().describe("When the watermark was applied (ISO 8601)").optional() })).describe("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`).").optional(), "disclosure": import_zod.z.object({ "required": import_zod.z.boolean().describe("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."), "jurisdictions": import_zod.z.array(import_zod.z.object({ "country": import_zod.z.string().describe("ISO 3166-1 alpha-2 country code (e.g., 'US', 'DE', 'CN')"), "region": import_zod.z.string().describe("Sub-national region code (e.g., 'CA' for California, 'BY' for Bavaria)").optional(), "regulation": import_zod.z.string().describe("Regulation identifier (e.g., 'eu_ai_act_article_50', 'ca_sb_942', 'cn_deep_synthesis')"), "label_text": import_zod.z.string().describe("Required disclosure label text for this jurisdiction, in the local language").optional(), "render_guidance": import_zod.z.object({ "persistence": import_zod.z.enum(["continuous", "initial", "flexible"]).describe("How long the disclosure must persist during content playback or display").optional(), "min_duration_ms": import_zod.z.number().int().gte(1).describe("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.").optional(), "positions": import_zod.z.array(import_zod.z.enum(["prominent", "footer", "audio", "subtitle", "overlay", "end_card", "pre_roll", "companion"]).describe("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.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Preferred disclosure positions in priority order. The first position a format supports should be used.").optional(), "ext": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).describe("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.").optional() }).describe("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.").optional() })).describe("Jurisdictions where disclosure obligations apply").optional() }).describe("Regulatory disclosure requirements for this content. Indicates whether AI disclosure is required and under which jurisdictions.").optional(), "verification": import_zod.z.array(import_zod.z.object({ "verified_by": import_zod.z.string().describe("Name of the verification service (e.g., 'DoubleVerify', 'Hive Moderation', 'Reality Defender')"), "verified_time": import_zod.z.string().datetime().describe("When the verification was performed (ISO 8601)").optional(), "result": import_zod.z.enum(["authentic", "ai_generated", "ai_modified", "inconclusive"]).describe("Verification outcome"), "confidence": import_zod.z.number().gte(0).lte(1).describe("Confidence score of the verification result (0.0 to 1.0)").optional(), "details_url": import_zod.z.string().url().describe("URL to the full verification report").optional() })).describe("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.").optional(), "ext": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).describe("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.").optional() }).describe("Provenance metadata for this asset, overrides manifest-level provenance").optional() }).catchall(import_zod.z.any()).describe("Override logo asset.").optional(), "colors": import_zod.z.object({ "primary": import_zod.z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional(), "secondary": import_zod.z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional(), "accent": import_zod.z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional() }).catchall(import_zod.z.any()).describe("Override brand colors (hex strings).").optional(), "voice": import_zod.z.string().describe("Override brand-voice description for surface-composed text/audio output.").optional(), "tagline": import_zod.z.string().describe("Override tagline.").optional() }).catchall(import_zod.z.any()).describe("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.").optional() }).strict().describe(`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).`), "scheme": import_zod.z.string().describe('Proof scheme and version, e.g. "world_id_v4".').optional(), "relying_party_id": import_zod.z.string().describe("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."), "scope": import_zod.z.enum(["entity", "property"]).describe("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).").optional() }).strict().describe("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.")).describe("Verified-identity relying parties scoped to this brand/property, for attestation provenance in TMP Identity Match. Use when a brand or property runs its own relying_party_id (per-property pseudonyms); entity-wide relying parties live on the house object. See specs/tmp-verified-identity-attestation.md.").optional(), "names": import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.string().min(1)).describe("A localized name using the legacy underscore-separated language/region key convention (for example 'en_US', 'fr_CA', or 'zh_CN') and a name value. Bare language codes such as 'en' are also accepted for backwards compatibility. These keys are not AdCP locale-tag values: a bridge to /schemas/core/locale-tag.json replaces '_' with '-', applies the AdCP canonical wire profile, and validates the result rather than passing the key through unchanged.")).describe("Localized brand names. Multiple entries per language allowed for aliases."), "keller_type": import_zod.z.enum(["master", "sub_brand", "endorsed", "independent"]).describe("Brand architecture type from Keller's theory. master: primary brand of house. sub_brand: carries parent name (Nike SB). endorsed: independent identity backed by parent (Air Jordan 'by Nike'). independent: operates separately (Converse under Nike, Inc.)").optional(), "parent_brand": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Parent brand ID for sub-brands and endorsed brands").optional(), "description": import_zod.z.string().describe("Brand description").optional(), "industries": import_zod.z.array(import_zod.z.string()).describe("Brand industries (e.g., ['automotive'] or ['pharmaceutical', 'cpg'] for a consumer health company). Describes what the company does \u2014 not what regulatory regimes apply (use policy_categories for that).").optional(), "target_audience": import_zod.z.string().describe("Primary target audience").optional(), "logos": import_zod.z.array(import_zod.z.object({ "id": import_zod.z.string().regex(new RegExp("^[a-z0-9][a-z0-9_-]*$")).describe("Stable identifier for this logo entry. Recommended when logo usage rules or mark lockups need to bind to a specific logo asset.").optional(), "url": import_zod.z.string().url().describe("URL to the logo asset"), "orientation": import_zod.z.enum(["square", "horizontal", "vertical", "stacked"]).describe("Logo aspect ratio orientation. square: ~1:1, horizontal: wide, vertical: tall, stacked: vertically arranged elements").optional(), "background": import_zod.z.enum(["dark-bg", "light-bg", "transparent-bg"]).describe("Background compatibility. dark-bg: use on dark backgrounds, light-bg: use on light backgrounds, transparent-bg: has transparent background").optional(), "variant": import_zod.z.enum(["primary", "secondary", "icon", "wordmark", "full-lockup"]).describe("Logo variant type. primary: main logo, secondary: alternative, icon: symbol only, wordmark: text only, full-lockup: complete logo").optional(), "tags": import_zod.z.array(import_zod.z.string()).describe("Additional semantic tags for custom categorization beyond the standard orientation, background, and variant fields").optional(), "slots": import_zod.z.array(import_zod.z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical renderer slots where this logo is appropriate. Consumers SHOULD prefer this over inferring from tags or usage prose when selecting a logo for a specific UI surface.").optional(), "usage": import_zod.z.string().describe("Human-readable description of when to use this logo variant (e.g., 'Primary logo for use on light backgrounds')").optional(), "width": import_zod.z.number().int().describe("Width in pixels").optional(), "height": import_zod.z.number().int().describe("Height in pixels").optional() }).catchall(import_zod.z.any()).describe("Brand logo asset with structured fields for orientation, background compatibility, and variant type")).describe("Brand logo assets").optional(), "colors": import_zod.z.object({ "primary": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "secondary": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "accent": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "background": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "text": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "heading": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "body": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "label": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "border": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "divider": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "surface_1": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "surface_2": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional() }).catchall(import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))])).describe("Brand color palette. Each role accepts a single hex color or an array of hex colors for brands with multiple values per role. Beyond the core five roles, brands can provide additional color roles for finer granularity \u2014 heading, body, label, border, divider, surface_1, surface_2, etc.").optional(), "fonts": import_zod.z.object({ "primary": import_zod.z.union([import_zod.z.string().describe("CSS font-family name (e.g., 'Montserrat', 'Arial, sans-serif')"), import_zod.z.object({ "family": import_zod.z.string().describe("CSS font-family name (e.g., 'Brand Sans')"), "files": import_zod.z.array(import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL to the font file (WOFF2, TTF, or OTF)"), "weight": import_zod.z.number().int().gte(100).lte(900).describe("CSS numeric font-weight for static fonts (100-900)").optional(), "weight_range": import_zod.z.array(import_zod.z.number().int().gte(100).lte(900)).max(2).describe("Variable font weight axis range as [min, max] (e.g., [100, 900]). Use instead of weight for variable fonts.").optional(), "style": import_zod.z.enum(["normal", "italic", "oblique"]).describe("CSS font-style").optional() }).catchall(import_zod.z.any()).describe("A font file with weight, style, and variable font metadata")).max(36).describe("Font files for different weights and styles").optional(), "opentype_features": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9]{4}$"))).max(20).describe("OpenType feature tags to enable (e.g., ['ss01', 'tnum', 'cv01']). These are four-character tags per the OpenType spec.").optional(), "fallbacks": import_zod.z.array(import_zod.z.string().max(100)).max(10).describe("Ordered fallback font-family names for when the primary font is unavailable or does not support the required script (e.g., ['Noto Sans Arabic', 'Noto Sans SC', 'sans-serif'])").optional() }).catchall(import_zod.z.any()).describe("Structured font with family name, downloadable font files, and typographic metadata")]).describe("Primary font family").optional(), "secondary": import_zod.z.union([import_zod.z.string().describe("CSS font-family name (e.g., 'Montserrat', 'Arial, sans-serif')"), import_zod.z.object({ "family": import_zod.z.string().describe("CSS font-family name (e.g., 'Brand Sans')"), "files": import_zod.z.array(import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL to the font file (WOFF2, TTF, or OTF)"), "weight": import_zod.z.number().int().gte(100).lte(900).describe("CSS numeric font-weight for static fonts (100-900)").optional(), "weight_range": import_zod.z.array(import_zod.z.number().int().gte(100).lte(900)).max(2).describe("Variable font weight axis range as [min, max] (e.g., [100, 900]). Use instead of weight for variable fonts.").optional(), "style": import_zod.z.enum(["normal", "italic", "oblique"]).describe("CSS font-style").optional() }).catchall(import_zod.z.any()).describe("A font file with weight, style, and variable font metadata")).max(36).describe("Font files for different weights and styles").optional(), "opentype_features": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9]{4}$"))).max(20).describe("OpenType feature tags to enable (e.g., ['ss01', 'tnum', 'cv01']). These are four-character tags per the OpenType spec.").optional(), "fallbacks": import_zod.z.array(import_zod.z.string().max(100)).max(10).describe("Ordered fallback font-family names for when the primary font is unavailable or does not support the required script (e.g., ['Noto Sans Arabic', 'Noto Sans SC', 'sans-serif'])").optional() }).catchall(import_zod.z.any()).describe("Structured font with family name, downloadable font files, and typographic metadata")]).describe("Secondary font family").optional() }).catchall(import_zod.z.union([import_zod.z.string().describe("CSS font-family name (e.g., 'Montserrat', 'Arial, sans-serif')"), import_zod.z.object({ "family": import_zod.z.string().describe("CSS font-family name (e.g., 'Brand Sans')"), "files": import_zod.z.array(import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL to the font file (WOFF2, TTF, or OTF)"), "weight": import_zod.z.number().int().gte(100).lte(900).describe("CSS numeric font-weight for static fonts (100-900)").optional(), "weight_range": import_zod.z.array(import_zod.z.number().int().gte(100).lte(900)).max(2).describe("Variable font weight axis range as [min, max] (e.g., [100, 900]). Use instead of weight for variable fonts.").optional(), "style": import_zod.z.enum(["normal", "italic", "oblique"]).describe("CSS font-style").optional() }).catchall(import_zod.z.any()).describe("A font file with weight, style, and variable font metadata")).max(36).describe("Font files for different weights and styles").optional(), "opentype_features": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9]{4}$"))).max(20).describe("OpenType feature tags to enable (e.g., ['ss01', 'tnum', 'cv01']). These are four-character tags per the OpenType spec.").optional(), "fallbacks": import_zod.z.array(import_zod.z.string().max(100)).max(10).describe("Ordered fallback font-family names for when the primary font is unavailable or does not support the required script (e.g., ['Noto Sans Arabic', 'Noto Sans SC', 'sans-serif'])").optional() }).catchall(import_zod.z.any()).describe("Structured font with family name, downloadable font files, and typographic metadata")]).describe("A font role entry. Either a CSS font-family string (simple) or a structured object with family name and font files (rich).")).describe("Brand typography. Each key is a role name (e.g., 'primary', 'secondary') referenced by type_scale entries. Values are either a CSS font-family string or a structured object with font files for reliable resolution.").optional(), "tone": import_zod.z.union([import_zod.z.string().describe("Simple tone descriptors for backwards compatibility"), import_zod.z.object({ "voice": import_zod.z.union([import_zod.z.string(), import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.string().min(1)).describe("A localized name using the legacy underscore-separated language/region key convention (for example 'en_US', 'fr_CA', or 'zh_CN') and a name value. Bare language codes such as 'en' are also accepted for backwards compatibility. These keys are not AdCP locale-tag values: a bridge to /schemas/core/locale-tag.json replaces '_' with '-', applies the AdCP canonical wire profile, and validates the result rather than passing the key through unchanged."))]).describe("High-level voice descriptor, either a legacy plain string or localized values.").optional(), "attributes": import_zod.z.union([import_zod.z.array(import_zod.z.string()), import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.array(import_zod.z.string())).describe("One locale mapped to a complete ordered string list. The list is selected as a unit so readers never assemble mixed-language output from independently localized elements."))]).describe("Personality traits that characterize the brand voice. Localized lists are selected as a whole.").optional(), "dos": import_zod.z.union([import_zod.z.array(import_zod.z.string()), import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.array(import_zod.z.string())).describe("One locale mapped to a complete ordered string list. The list is selected as a unit so readers never assemble mixed-language output from independently localized elements."))]).describe("Guidance for copy generation - what TO do. Localized lists are selected as a whole.").optional(), "donts": import_zod.z.union([import_zod.z.array(import_zod.z.string()), import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.array(import_zod.z.string())).describe("One locale mapped to a complete ordered string list. The list is selected as a unit so readers never assemble mixed-language output from independently localized elements."))]).describe("Guardrails to avoid brand violations - what NOT to do. Localized lists are selected as a whole.").optional() }).describe("Structured brand voice guidelines")]).describe("Brand voice and messaging tone guidelines").optional(), "tagline": import_zod.z.union([import_zod.z.string().describe("Plain tagline string for backwards compatibility"), import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.string().min(1)).describe("A localized name using the legacy underscore-separated language/region key convention (for example 'en_US', 'fr_CA', or 'zh_CN') and a name value. Bare language codes such as 'en' are also accepted for backwards compatibility. These keys are not AdCP locale-tag values: a bridge to /schemas/core/locale-tag.json replaces '_' with '-', applies the AdCP canonical wire profile, and validates the result rather than passing the key through unchanged.")).describe("Localized taglines with BCP 47 locale codes")]).describe("Brand tagline or slogan. Accepts a plain string or a localized array matching the names pattern.").optional(), "assets": import_zod.z.array(import_zod.z.object({ "asset_id": import_zod.z.string().describe("Unique identifier"), "asset_type": import_zod.z.enum(["image", "video", "audio", "text", "markdown", "html", "css", "javascript", "zip", "vast", "daast", "url", "webhook", "brief", "catalog", "published_post"]).describe("Type of asset content"), "url": import_zod.z.string().url().describe("URL to CDN-hosted asset file"), "tags": import_zod.z.array(import_zod.z.string()).describe("Tags for discovery (e.g., 'hero', 'lifestyle', 'product', 'holiday')").optional(), "name": import_zod.z.union([import_zod.z.string(), import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.string().min(1)).describe("A localized name using the legacy underscore-separated language/region key convention (for example 'en_US', 'fr_CA', or 'zh_CN') and a name value. Bare language codes such as 'en' are also accepted for backwards compatibility. These keys are not AdCP locale-tag values: a bridge to /schemas/core/locale-tag.json replaces '_' with '-', applies the AdCP canonical wire profile, and validates the result rather than passing the key through unchanged."))]).describe("Human-readable name, either a legacy plain string or localized values.").optional(), "description": import_zod.z.union([import_zod.z.string(), import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.string().min(1)).describe("A localized name using the legacy underscore-separated language/region key convention (for example 'en_US', 'fr_CA', or 'zh_CN') and a name value. Bare language codes such as 'en' are also accepted for backwards compatibility. These keys are not AdCP locale-tag values: a bridge to /schemas/core/locale-tag.json replaces '_' with '-', applies the AdCP canonical wire profile, and validates the result rather than passing the key through unchanged."))]).describe("Asset description or usage notes, either a legacy plain string or localized values.").optional(), "width": import_zod.z.number().int().describe("Image/video width in pixels").optional(), "height": import_zod.z.number().int().describe("Image/video height in pixels").optional(), "duration_seconds": import_zod.z.number().describe("Video/audio duration in seconds").optional(), "file_size_bytes": import_zod.z.number().int().describe("File size in bytes").optional(), "format": import_zod.z.string().describe("File format (e.g., 'jpg', 'mp4', 'mp3')").optional(), "metadata": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).describe("Additional asset-specific metadata").optional() }).catchall(import_zod.z.any()).describe("Brand asset (image, video, audio, text)")).describe("Brand asset library").optional(), "properties": import_zod.z.array(import_zod.z.object({ "type": import_zod.z.enum(["website", "mobile_app", "ctv_app", "desktop_app", "dooh", "podcast", "radio", "linear_tv", "streaming_audio", "ai_assistant"]).describe("Property type"), "identifier": import_zod.z.string().min(1).describe("Property identifier - domain for websites, bundle ID for apps"), "store": import_zod.z.enum(["apple", "google", "amazon", "roku", "samsung", "lg", "other"]).describe("App store for mobile/CTV apps").optional(), "region": import_zod.z.string().regex(new RegExp("^([A-Z]{2}|global)$")).describe("ISO 3166-1 alpha-2 country code or 'global'").optional(), "primary": import_zod.z.boolean().describe("Whether this is the primary property for the brand").default(false), "relationship": import_zod.z.enum(["owned", "direct", "delegated", "ad_network"]).describe("How this brand relates to the property. 'owned': the brand owns and operates this property (default) and has no adagents.json delegation_type counterpart. 'direct': the brand is the direct sales path for this property, even if a third party operates the software (e.g., a publisher's in-house ad team using a vendor's tech). 'delegated': the brand manages monetization for this property \u2014 they are in charge of ad sales (e.g., Mediavine managing a food blog). 'ad_network': the brand sells this property's inventory as part of a network or exchange \u2014 they are a path to the inventory, not the path (e.g., PubMatic as an SSP). For non-owned properties, the publisher confirms the relationship by setting the matching delegation_type on the agent's authorization in their adagents.json.").default("owned") }).catchall(import_zod.z.any()).describe("A digital property associated with a brand. Defaults to owned; use 'relationship' to declare direct, delegated, or ad_network properties. For delegated and network paths, these values match the delegation_type field in adagents.json, creating a bilateral verification chain: the operator declares the relationship here, the publisher confirms by setting the same delegation_type on the agent's authorization in their adagents.json. 'owned' is an inline ownership declaration with no adagents.json counterpart.")).describe("Digital properties associated with this brand \u2014 owned, managed, or represented").optional(), "product_catalog": import_zod.z.object({ "feed_url": import_zod.z.string().url().describe("URL to product catalog feed"), "feed_format": import_zod.z.enum(["google_merchant_center", "facebook_catalog", "shopify", "linkedin_jobs", "tiktok_shop", "pinterest_catalog", "openai_product_feed", "custom"]).describe("Format of the product feed").optional(), "categories": import_zod.z.array(import_zod.z.string()).describe("Product categories available in the catalog").optional(), "last_updated": import_zod.z.string().datetime().describe("When the product catalog was last updated").optional(), "update_frequency": import_zod.z.enum(["realtime", "hourly", "daily", "weekly"]).describe("How frequently the product catalog is updated").optional(), "agentic_checkout": import_zod.z.object({ "endpoint": import_zod.z.string().url().describe("Base URL for checkout session API"), "spec": import_zod.z.string().describe("Checkout API specification identifier. Use a namespaced string to identify the checkout protocol (e.g., vendor-prefixed or custom). Vendor-specific values belong under ext.{vendor}."), "supported_payment_providers": import_zod.z.array(import_zod.z.string()).describe("Payment providers supported by this checkout endpoint").optional() }).describe("Agentic checkout endpoint configuration").optional() }).catchall(import_zod.z.any()).describe("Product catalog for e-commerce brands").optional(), "privacy_policy_url": import_zod.z.string().url().describe("URL to the brand's privacy policy").optional(), "data_subject_contestation": import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL to a human-accessible contestation form or information page.").optional(), "email": import_zod.z.string().email().describe("Email address for contestation requests. Deployer MUST monitor and respond within the timelines set by applicable law (e.g., 1 month under GDPR Art. 12(3)).").optional(), "languages": import_zod.z.array(import_zod.z.string()).describe("BCP 47 language tags the contestation channel supports (e.g., ['en', 'de', 'fr']). At minimum SHOULD include a language spoken in every jurisdiction where the brand runs regulated-vertical campaigns.").optional() }).strict().and(import_zod.z.union([import_zod.z.any(), import_zod.z.any()])).describe("Contact point where a data subject can request human intervention, express their view, or contest an automated decision \u2014 satisfying GDPR Article 22(3) and EU AI Act Article 26(11) transparency obligations. This is a contact reference (URL, email, or both), not a machine-callable API. AdCP surfaces the pointer; the deployer runs the contestation workflow.").optional(), "disclaimers": import_zod.z.array(import_zod.z.object({ "text": import_zod.z.string(), "context": import_zod.z.string().optional(), "required": import_zod.z.boolean().default(true) })).describe("Legal disclaimers for creatives").optional(), "trademarks": import_zod.z.array(import_zod.z.object({ "registry": import_zod.z.string().describe("Trademark registry (e.g., 'USPTO', 'EUIPO', 'JPO', 'CNIPA')"), "number": import_zod.z.string().describe("Registration number as issued by the registry"), "mark": import_zod.z.string().describe("The registered mark as published"), "status": import_zod.z.enum(["active", "pending", "abandoned", "cancelled", "expired"]).describe("Registration status. Omit for active marks if status tracking is not maintained.").optional(), "license_type": import_zod.z.enum(["owned", "licensed_in", "licensed_out"]).describe("Whether the publisher owns the mark, licenses it from another entity, or licenses it to others. 'owned' is the default if omitted.").optional(), "licensor_domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain of the entity that licenses this mark to the publisher. Meaningful when license_type=licensed_in; omit otherwise.").optional(), "countries": import_zod.z.array(import_zod.z.string().min(2).max(2)).describe("ISO 3166-1 alpha-2 country codes where this registration applies. Omit for global or where the registry's jurisdiction is implicit.").optional(), "nice_classes": import_zod.z.array(import_zod.z.number().int().gte(1).lte(45)).describe("Nice Classification class numbers (1-45) covered by this registration. Disambiguates marks across industries (e.g., Delta-airline vs Delta-faucet). Omit if scope is implicit from registry.").optional() }).catchall(import_zod.z.any()).describe("A registered trademark. May appear at house level (corporate marks, e.g., 'NIKE' owned by Nike, Inc.) or at brand level (brand-specific marks, e.g., 'CONVERSE' owned by Converse). Resolution between house- and brand-level trademarks is union \u2014 both lists are valid claims about marks the publisher controls.")).describe("Brand-level registered trademarks. Use for marks the brand owns or controls (e.g., a sub-brand's own marks distinct from the corporate parent). House-level trademarks live on the house object; resolution between the two is union \u2014 both lists are valid claims.").optional(), "voice_synthesis": import_zod.z.object({ "provider": import_zod.z.string().optional(), "voice_id": import_zod.z.string().optional(), "settings": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).optional() }).catchall(import_zod.z.any()).describe("TTS voice synthesis configuration for AI-generated audio").optional(), "avatar": import_zod.z.object({ "provider": import_zod.z.string().optional(), "avatar_id": import_zod.z.string().optional(), "settings": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).optional() }).catchall(import_zod.z.any()).describe("Visual avatar configuration").optional(), "visual_guidelines": import_zod.z.object({ "photography": import_zod.z.object({ "realism": import_zod.z.enum(["natural", "stylized", "hyperreal", "abstract"]).describe("Level of photographic realism").optional(), "lighting": import_zod.z.string().describe("Lighting style (e.g., 'soft daylight', 'studio', 'golden hour', 'high-key', 'low-key')").optional(), "color_temperature": import_zod.z.enum(["warm", "neutral", "cool"]).describe("Overall color temperature of photography").optional(), "contrast": import_zod.z.enum(["low", "medium", "high"]).describe("Contrast level in photography").optional(), "depth_of_field": import_zod.z.enum(["shallow", "medium", "deep"]).describe("Depth of field preference. shallow: blurred background with subject isolation, deep: everything in focus").optional(), "subject": import_zod.z.object({ "people": import_zod.z.object({ "age_range": import_zod.z.string().describe("Target age range (e.g., '20-35')").optional(), "diversity": import_zod.z.string().describe("Diversity representation (e.g., 'mixed', 'varied')").optional(), "mood": import_zod.z.array(import_zod.z.string()).describe("Mood descriptors (e.g., ['confident', 'relaxed'])").optional() }).catchall(import_zod.z.any()).describe("People photography guidelines").optional(), "product_focus": import_zod.z.enum(["in-use", "isolated", "lifestyle", "detail"]).describe("How products are shown").optional(), "setting": import_zod.z.string().describe("Environmental context for photography (e.g., 'indoor', 'outdoor', 'studio', 'urban', 'nature', 'workplace')").optional() }).catchall(import_zod.z.any()).describe("Subject matter guidelines").optional(), "framing": import_zod.z.object({ "subject_position": import_zod.z.string().describe("Where the subject sits in frame (e.g., 'center', 'center-left', 'rule-of-thirds')").optional(), "crop_style": import_zod.z.string().describe("Cropping convention (e.g., 'waist-up', 'full-body', 'close-up', 'wide')").optional(), "perspective": import_zod.z.string().describe("Camera perspective (e.g., 'eye-level', 'overhead', 'low-angle')").optional() }).catchall(import_zod.z.any()).describe("Camera framing rules").optional(), "preferred_aspect_ratios": import_zod.z.array(import_zod.z.string().regex(new RegExp("^\\d+:\\d+$"))).describe("Preferred aspect ratios for brand photography (e.g., '16:9', '4:5', '1:1')").optional(), "tags": import_zod.z.array(import_zod.z.string()).describe("Additional style descriptors").optional() }).catchall(import_zod.z.any()).describe("Photography style rules for generative creative systems. Defines how brand photography should look when selected or generated.").optional(), "graphic_style": import_zod.z.object({ "style_type": import_zod.z.enum(["flat_illustration", "geometric", "gradient_mesh", "editorial_collage", "hand_drawn", "minimal_line_art", "3d_render", "isometric", "photographic_composite"]).describe("Primary graphic style").optional(), "stroke_style": import_zod.z.enum(["rounded", "square", "mixed", "none"]).describe("Stroke end/join style").optional(), "stroke_weight": import_zod.z.string().describe("Stroke weight (e.g., '2px', 'thin', 'bold')").optional(), "corner_radius": import_zod.z.string().describe("Default corner radius for graphic and illustration elements (e.g., '12px', '8px', 'sharp'). For UI component radii (buttons, cards, inputs), see visual_guidelines.border_radius.").optional(), "tags": import_zod.z.array(import_zod.z.string()).describe("Additional style descriptors").optional() }).catchall(import_zod.z.any()).describe("Visual language for brand graphics and illustrations").optional(), "shapes": import_zod.z.object({ "primary_shape": import_zod.z.string().describe("Primary brand shape (e.g., 'rounded_rectangle', 'circle', 'hexagon')").optional(), "secondary_shapes": import_zod.z.array(import_zod.z.string()).describe("Secondary shapes in the brand vocabulary").optional(), "usage": import_zod.z.object({ "max_per_layout": import_zod.z.number().int().describe("Maximum distinct shapes per layout").optional(), "overlap_allowed": import_zod.z.boolean().describe("Whether shapes may overlap").optional() }).catchall(import_zod.z.any()).describe("Shape usage rules").optional() }).catchall(import_zod.z.any()).describe("Distinctive shapes used as part of brand visual identity").optional(), "iconography": import_zod.z.object({ "style": import_zod.z.enum(["outline", "filled", "duotone", "flat", "glyph", "hand_drawn"]).describe("Icon rendering style").optional(), "stroke_weight": import_zod.z.string().describe("Icon stroke weight (e.g., '2px', '1.5px')").optional(), "corner_style": import_zod.z.enum(["rounded", "square", "mixed"]).describe("Corner style for icon paths").optional(), "usage": import_zod.z.object({ "max_per_frame": import_zod.z.number().int().describe("Maximum icons per creative frame").optional(), "size_ratio": import_zod.z.string().describe("Icon-to-layout size ratio (e.g., '1:8')").optional() }).catchall(import_zod.z.any()).describe("Icon usage rules").optional() }).catchall(import_zod.z.any()).describe("Icon style system and usage rules").optional(), "composition": import_zod.z.object({ "overlays": import_zod.z.object({ "gradient_style": import_zod.z.enum(["linear", "radial", "conic", "none"]).describe("Gradient type for overlays").optional(), "gradient_direction": import_zod.z.string().describe("Gradient direction (e.g., '45deg', 'to-bottom-right')").optional(), "opacity": import_zod.z.string().describe("Overlay opacity (e.g., '70%')").optional() }).catchall(import_zod.z.any()).describe("Graphic overlay rules").optional(), "texture": import_zod.z.object({ "style": import_zod.z.enum(["none", "subtle_grain", "noise", "paper", "fabric", "concrete"]).describe("Texture style applied to creative assets").optional(), "intensity": import_zod.z.enum(["low", "medium", "high"]).describe("Texture intensity").optional() }).catchall(import_zod.z.any()).describe("Texture treatment rules").optional(), "backgrounds": import_zod.z.object({ "types_allowed": import_zod.z.array(import_zod.z.enum(["solid_color", "gradient", "blurred_photo", "image", "video", "pattern", "transparent"])).describe("Permitted background types").optional() }).catchall(import_zod.z.any()).describe("Background treatment rules").optional() }).catchall(import_zod.z.any()).describe("Layout composition rules including overlays, textures, and backgrounds").optional(), "border_radius": import_zod.z.object({ "none": import_zod.z.string().describe("Explicitly sharp corners (e.g., '0')").optional(), "default": import_zod.z.string().describe("Default border radius for UI components (e.g., '8px', '12px', '0'). For graphic/illustration elements, see graphic_style.corner_radius.").optional(), "small": import_zod.z.string().describe("Small border radius for compact elements (e.g., '4px')").optional(), "large": import_zod.z.string().describe("Large border radius for cards and containers (e.g., '16px', '24px')").optional(), "pill": import_zod.z.string().describe("Fully rounded / pill shape (e.g., '999px')").optional() }).catchall(import_zod.z.string()).describe("Named border radius presets for UI components and layout elements. One of the most visible brand differentiators \u2014 Airbnb uses generous 20px, Stripe uses precise 4\u20138px, Spotify uses pill/999px.").optional(), "elevation": import_zod.z.object({ "none": import_zod.z.string().describe("No shadow (e.g., 'none')").optional(), "subtle": import_zod.z.string().describe("Subtle shadow for slight lift (e.g., '0 1px 2px rgba(0,0,0,0.05)')").optional(), "card": import_zod.z.string().describe("Card-level shadow (e.g., '0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.1)')").optional(), "modal": import_zod.z.string().describe("Modal/overlay shadow (e.g., '0 20px 25px -5px rgba(0,0,0,0.1), 0 8px 10px -6px rgba(0,0,0,0.1)')").optional() }).catchall(import_zod.z.string()).describe("Named shadow/elevation levels. Brands use elevation as identity \u2014 from Stripe's blue-tinted multi-layer shadows to Apple's single diffuse shadow. Values are CSS box-shadow syntax.").optional(), "spacing": import_zod.z.object({ "unit": import_zod.z.string().describe("Base grid unit this scale was designed from (e.g., '8px', '4px'). Informational \u2014 agents should use the named scale values, not compute from this.").optional(), "scale": import_zod.z.object({ "xs": import_zod.z.string().describe("Extra small spacing (e.g., '4px')").optional(), "sm": import_zod.z.string().describe("Small spacing (e.g., '8px')").optional(), "md": import_zod.z.string().describe("Medium spacing (e.g., '16px')").optional(), "lg": import_zod.z.string().describe("Large spacing (e.g., '24px')").optional(), "xl": import_zod.z.string().describe("Extra large spacing (e.g., '32px')").optional(), "2xl": import_zod.z.string().describe("Section-level spacing (e.g., '48px', '64px')").optional() }).catchall(import_zod.z.string()).describe("Named spacing scale built from the base unit").optional() }).strict().describe("Spacing system for consistent layout rhythm. Most design systems use an 8px base grid.").optional(), "graphic_elements": import_zod.z.array(import_zod.z.object({ "name": import_zod.z.string().describe("Element name (e.g., 'Paper Tear', 'Brand Watermark', 'Section Divider')"), "type": import_zod.z.enum(["border", "divider", "frame", "watermark", "pattern", "texture_overlay", "decorative"]).describe("Element type").optional(), "description": import_zod.z.string().describe("How the element is used in layouts").optional(), "orientation": import_zod.z.enum(["horizontal", "vertical", "any"]).describe("Preferred orientation when used in layouts").optional(), "colors": import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("A single hex color value")).describe("Colors this element may appear in").optional(), "max_per_layout": import_zod.z.number().int().describe("Maximum instances per layout").optional() }).catchall(import_zod.z.any()).describe("A reusable decorative or structural visual element that is part of the brand identity (e.g., torn paper edges, watermarks, dividers, background patterns)")).describe("Reusable decorative elements that are part of the brand visual identity (e.g., torn paper edges, watermarks, dividers)").optional(), "motion": import_zod.z.object({ "transition_style": import_zod.z.enum(["cut", "dissolve", "slide", "wipe", "zoom", "fade"]).describe("Primary transition style between scenes").optional(), "animation_speed": import_zod.z.enum(["slow", "moderate", "fast"]).describe("Overall animation pacing").optional(), "easing": import_zod.z.string().describe("Default easing function (e.g., 'ease-in-out', 'spring', 'linear')").optional(), "text_entrance": import_zod.z.enum(["fade", "typewriter", "slide_up", "slide_left", "scale", "none"]).describe("How text enters the frame").optional(), "pacing": import_zod.z.enum(["lingering", "moderate", "fast_cuts"]).describe("Overall editing rhythm").optional(), "kinetic_typography": import_zod.z.boolean().describe("Whether animated/kinetic typography is allowed").optional(), "tags": import_zod.z.array(import_zod.z.string()).describe("Additional motion style descriptors").optional() }).catchall(import_zod.z.any()).describe("Motion and animation rules for video, animated display, and interactive formats").optional(), "logo_placement": import_zod.z.object({ "preferred_position": import_zod.z.enum(["top-left", "top-center", "top-right", "bottom-left", "bottom-center", "bottom-right", "center"]).describe("Preferred logo position in layouts").optional(), "min_clear_space": import_zod.z.string().describe("Minimum clear space around the logo, expressed as a multiple of logo height (e.g., '0.5x', '1x') or fixed value (e.g., '16px')").optional(), "min_height": import_zod.z.string().describe("Minimum logo height to maintain legibility (e.g., '40px', '24px')").optional(), "background_contrast": import_zod.z.enum(["light_only", "dark_only", "any"]).describe("Permitted background contrast behind logo").optional() }).catchall(import_zod.z.any()).describe("Logo placement and clear space rules for automated creative production").optional(), "colorways": import_zod.z.array(import_zod.z.object({ "name": import_zod.z.string().describe("Colorway name (e.g., 'primary', 'inverted', 'subtle')"), "foreground": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("A single hex color value"), "background": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("A single hex color value"), "accent": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("A single hex color value").optional(), "border": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("A single hex color value").optional(), "cta_foreground": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("CTA text/icon color, if different from foreground").optional(), "cta_background": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("CTA button/container color, if different from accent").optional(), "channels": import_zod.z.array(import_zod.z.string()).describe("Channels or contexts where this colorway applies (e.g., 'online', 'print', 'pos', 'social', 'outdoor'). Omit for universal colorways.").optional() }).catchall(import_zod.z.any()).describe("A named color pairing that defines how colors work together. Colorways ensure foreground/background combinations are always on-brand and accessible.")).describe("Named color pairings for consistent foreground/background combinations").optional(), "color_constraints": import_zod.z.array(import_zod.z.object({ "color": import_zod.z.object({ "kind": import_zod.z.enum(["name", "value", "surface"]).describe("Discriminator for the color reference variant.").optional(), "name": import_zod.z.string().describe("Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}.").optional(), "value": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("Literal hex color when no palette key exists.").optional(), "surface": import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]).describe("Usage surface rather than a specific color value.").optional() }).strict().and(import_zod.z.union([import_zod.z.object({ "kind": import_zod.z.literal("name") }), import_zod.z.object({ "kind": import_zod.z.literal("value") }), import_zod.z.object({ "kind": import_zod.z.literal("surface") })])).describe("Color role or value this constraint governs."), "applies_to": import_zod.z.array(import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"])).describe("Surfaces where this color may be used.").optional(), "allowed_on": import_zod.z.array(import_zod.z.object({ "kind": import_zod.z.enum(["name", "value", "surface"]).describe("Discriminator for the color reference variant.").optional(), "name": import_zod.z.string().describe("Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}.").optional(), "value": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("Literal hex color when no palette key exists.").optional(), "surface": import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]).describe("Usage surface rather than a specific color value.").optional() }).strict().and(import_zod.z.union([import_zod.z.object({ "kind": import_zod.z.literal("name") }), import_zod.z.object({ "kind": import_zod.z.literal("value") }), import_zod.z.object({ "kind": import_zod.z.literal("surface") })])).describe("Reference to a brand color or usage surface for machine-readable guideline constraints. Use kind=name for palette lookup keys in colors, kind=value for a literal hex color, and kind=surface for layout surfaces such as background or text.")).describe("Backgrounds, surfaces, or color roles where this color is allowed.").optional(), "forbidden_on": import_zod.z.array(import_zod.z.object({ "kind": import_zod.z.enum(["name", "value", "surface"]).describe("Discriminator for the color reference variant.").optional(), "name": import_zod.z.string().describe("Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}.").optional(), "value": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("Literal hex color when no palette key exists.").optional(), "surface": import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]).describe("Usage surface rather than a specific color value.").optional() }).strict().and(import_zod.z.union([import_zod.z.object({ "kind": import_zod.z.literal("name") }), import_zod.z.object({ "kind": import_zod.z.literal("value") }), import_zod.z.object({ "kind": import_zod.z.literal("surface") })])).describe("Reference to a brand color or usage surface for machine-readable guideline constraints. Use kind=name for palette lookup keys in colors, kind=value for a literal hex color, and kind=surface for layout surfaces such as background or text.")).describe("Backgrounds, surfaces, or color roles where this color is forbidden.").optional(), "never_pair_with": import_zod.z.array(import_zod.z.object({ "kind": import_zod.z.enum(["name", "value", "surface"]).describe("Discriminator for the color reference variant.").optional(), "name": import_zod.z.string().describe("Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}.").optional(), "value": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("Literal hex color when no palette key exists.").optional(), "surface": import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]).describe("Usage surface rather than a specific color value.").optional() }).strict().and(import_zod.z.union([import_zod.z.object({ "kind": import_zod.z.literal("name") }), import_zod.z.object({ "kind": import_zod.z.literal("value") }), import_zod.z.object({ "kind": import_zod.z.literal("surface") })])).describe("Reference to a brand color or usage surface for machine-readable guideline constraints. Use kind=name for palette lookup keys in colors, kind=value for a literal hex color, and kind=surface for layout surfaces such as background or text.")).describe("Color roles or values that must not be paired with this color.").optional(), "contexts": import_zod.z.array(import_zod.z.string()).describe("Channels or creative contexts where this constraint applies, such as digital, print, social, or ctv_end_card.").optional(), "severity": import_zod.z.enum(["must", "should"]).describe("Strength of a machine-readable brand guideline constraint.").optional(), "description": import_zod.z.string().describe("Human-readable rationale or source-language summary for the rule.").optional() }).catchall(import_zod.z.any()).describe("Machine-readable rule constraining how a brand color may be used or paired. Use for accent-only colors, forbidden foreground/background combinations, and palette pairs that should never appear together.")).describe("Machine-readable constraints for color usage and pairings, such as accent-only rules or forbidden foreground/background combinations.").optional(), "logo_usage_rules": import_zod.z.array(import_zod.z.object({ "logo_url": import_zod.z.string().url().describe("Specific logo asset URL this rule applies to. Omit when the rule applies by variant or tags.").optional(), "logo_id": import_zod.z.string().regex(new RegExp("^[a-z0-9][a-z0-9_-]*$")).describe("Stable `logos[].id` this rule applies to. Prefer this over logo_url when the rule targets a specific logo entry.").optional(), "logo_variant": import_zod.z.enum(["primary", "secondary", "icon", "wordmark", "full-lockup"]).describe("Logo variant this rule applies to.").optional(), "logo_tags": import_zod.z.array(import_zod.z.string()).describe("Logo tags this rule applies to.").optional(), "contexts": import_zod.z.array(import_zod.z.string()).describe("Creative contexts where this rule applies.").optional(), "slots": import_zod.z.array(import_zod.z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical renderer slots where this rule applies. Use this for deterministic logo-card, profile-mark, end-card, and lockup selection.").optional(), "minimum_size": import_zod.z.object({ "width": import_zod.z.string().describe("Minimum width, such as 48px or 12mm.").optional(), "height": import_zod.z.string().describe("Minimum height, such as 18px or 6mm.").optional() }).strict().describe("Minimum rendered size needed for legibility.").optional(), "clear_space": import_zod.z.string().describe("Minimum clear space around the logo, expressed in brand terms or units.").optional(), "allowed_backgrounds": import_zod.z.array(import_zod.z.object({ "kind": import_zod.z.enum(["name", "value", "surface"]).describe("Discriminator for the color reference variant.").optional(), "name": import_zod.z.string().describe("Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}.").optional(), "value": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("Literal hex color when no palette key exists.").optional(), "surface": import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]).describe("Usage surface rather than a specific color value.").optional() }).strict().and(import_zod.z.union([import_zod.z.object({ "kind": import_zod.z.literal("name") }), import_zod.z.object({ "kind": import_zod.z.literal("value") }), import_zod.z.object({ "kind": import_zod.z.literal("surface") })])).describe("Reference to a brand color or usage surface for machine-readable guideline constraints. Use kind=name for palette lookup keys in colors, kind=value for a literal hex color, and kind=surface for layout surfaces such as background or text.")).describe("Background color roles, values, or surfaces where this logo may be placed.").optional(), "forbidden_backgrounds": import_zod.z.array(import_zod.z.object({ "kind": import_zod.z.enum(["name", "value", "surface"]).describe("Discriminator for the color reference variant.").optional(), "name": import_zod.z.string().describe("Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}.").optional(), "value": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("Literal hex color when no palette key exists.").optional(), "surface": import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]).describe("Usage surface rather than a specific color value.").optional() }).strict().and(import_zod.z.union([import_zod.z.object({ "kind": import_zod.z.literal("name") }), import_zod.z.object({ "kind": import_zod.z.literal("value") }), import_zod.z.object({ "kind": import_zod.z.literal("surface") })])).describe("Reference to a brand color or usage surface for machine-readable guideline constraints. Use kind=name for palette lookup keys in colors, kind=value for a literal hex color, and kind=surface for layout surfaces such as background or text.")).describe("Background color roles, values, or surfaces where this logo must not be placed.").optional(), "forbidden_contexts": import_zod.z.array(import_zod.z.string()).describe("Contexts where this logo must not be used, such as photography_without_knockout.").optional(), "severity": import_zod.z.enum(["must", "should"]).describe("Strength of a machine-readable brand guideline constraint.").optional(), "description": import_zod.z.string().describe("Human-readable rationale or source-language summary for the rule.").optional() }).catchall(import_zod.z.any()).and(import_zod.z.union([import_zod.z.any(), import_zod.z.any(), import_zod.z.any(), import_zod.z.any(), import_zod.z.any()])).describe("Machine-readable logo selection and placement rule. Complements logos[].usage by making enforceable minimum size, clear-space, background, and context constraints queryable.")).describe("Machine-readable logo selection and placement constraints for minimum size, clear space, backgrounds, and contexts.").optional(), "mark_lockups": import_zod.z.array(import_zod.z.object({ "lockup_type": import_zod.z.enum(["co_brand", "secondary_mark", "partner", "sponsor", "program", "talent", "custom"]).describe("Type of mark relationship governed by this lockup rule."), "ordering": import_zod.z.enum(["brand_first", "partner_first", "equal", "contextual"]).describe("Required visual ordering of the brand mark relative to partner or secondary marks.").optional(), "contexts": import_zod.z.array(import_zod.z.string()).describe("Creative contexts where this lockup rule applies.").optional(), "brand_logo_id": import_zod.z.string().regex(new RegExp("^[a-z0-9][a-z0-9_-]*$")).describe("Stable `logos[].id` for the brand logo this lockup rule is anchored on.").optional(), "secondary_logo_ids": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9][a-z0-9_-]*$")).describe("Stable identifier for a logo entry within this brand.json document. Use lowercase words separated by underscores or hyphens; do not key integrations on mutable asset URLs.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable `logos[].id` values for secondary, program, sponsor, or partner marks governed by this lockup rule when those marks are represented in this brand.json.").optional(), "separator": import_zod.z.object({ "type": import_zod.z.enum(["none", "keyline", "space", "divider"]).describe("Separator style."), "color": import_zod.z.object({ "kind": import_zod.z.enum(["name", "value", "surface"]).describe("Discriminator for the color reference variant.").optional(), "name": import_zod.z.string().describe("Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}.").optional(), "value": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("Literal hex color when no palette key exists.").optional(), "surface": import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]).describe("Usage surface rather than a specific color value.").optional() }).strict().and(import_zod.z.union([import_zod.z.object({ "kind": import_zod.z.literal("name") }), import_zod.z.object({ "kind": import_zod.z.literal("value") }), import_zod.z.object({ "kind": import_zod.z.literal("surface") })])).describe("Reference to a brand color or usage surface for machine-readable guideline constraints. Use kind=name for palette lookup keys in colors, kind=value for a literal hex color, and kind=surface for layout surfaces such as background or text.").optional(), "width": import_zod.z.string().describe("Separator width, such as 1px.").optional() }).catchall(import_zod.z.any()).describe("Separator between marks, when required.").optional(), "min_gap": import_zod.z.string().describe("Minimum gap between marks, expressed in brand terms or units.").optional(), "brand_min_optical_weight_ratio": import_zod.z.number().gt(0).describe("Minimum optical weight of the brand mark relative to partner marks. 1 means at least equal.").optional(), "partner_max_optical_weight_ratio": import_zod.z.number().gt(0).describe("Maximum optical weight of partner marks relative to the brand mark. 1 means no larger than the brand mark. Enforcement is at layout time, not parse time \u2014 this value signals to renderers and creative agents how much space to provision for each mark.").optional(), "severity": import_zod.z.enum(["must", "should"]).describe("Strength of a machine-readable brand guideline constraint.").optional(), "description": import_zod.z.string().describe("Human-readable rationale or source-language summary for the lockup rule.").optional() }).catchall(import_zod.z.any()).describe("Machine-readable layout constraints for co-brand, partner, sponsor, program, or secondary-mark lockups.")).describe("Machine-readable co-brand, partner, sponsor, program, or secondary-mark lockup rules.").optional(), "type_scale": import_zod.z.object({ "base_width": import_zod.z.string().describe("Reference canvas width these sizes were designed for (e.g., '1080px'). Generative systems should scale proportionally for other canvas sizes.").optional(), "heading": import_zod.z.object({ "font": import_zod.z.string().describe("Font reference. Use a key from the fonts object (e.g., 'primary', 'secondary') to reference a defined font role, or a literal CSS font-family string as a fallback.").optional(), "size": import_zod.z.string().describe("Font size (e.g., '48px', '2rem')").optional(), "weight": import_zod.z.string().describe("Font weight (e.g., '700', 'bold')").optional(), "line_height": import_zod.z.string().describe("Line height (e.g., '1.2', '56px')").optional(), "letter_spacing": import_zod.z.string().describe("Letter spacing (e.g., '-0.02em', '0.5px')").optional(), "text_transform": import_zod.z.enum(["none", "uppercase", "lowercase", "capitalize"]).describe("Text transformation").optional() }).catchall(import_zod.z.any()).describe("A single entry in the type scale").optional(), "subheading": import_zod.z.object({ "font": import_zod.z.string().describe("Font reference. Use a key from the fonts object (e.g., 'primary', 'secondary') to reference a defined font role, or a literal CSS font-family string as a fallback.").optional(), "size": import_zod.z.string().describe("Font size (e.g., '48px', '2rem')").optional(), "weight": import_zod.z.string().describe("Font weight (e.g., '700', 'bold')").optional(), "line_height": import_zod.z.string().describe("Line height (e.g., '1.2', '56px')").optional(), "letter_spacing": import_zod.z.string().describe("Letter spacing (e.g., '-0.02em', '0.5px')").optional(), "text_transform": import_zod.z.enum(["none", "uppercase", "lowercase", "capitalize"]).describe("Text transformation").optional() }).catchall(import_zod.z.any()).describe("A single entry in the type scale").optional(), "body": import_zod.z.object({ "font": import_zod.z.string().describe("Font reference. Use a key from the fonts object (e.g., 'primary', 'secondary') to reference a defined font role, or a literal CSS font-family string as a fallback.").optional(), "size": import_zod.z.string().describe("Font size (e.g., '48px', '2rem')").optional(), "weight": import_zod.z.string().describe("Font weight (e.g., '700', 'bold')").optional(), "line_height": import_zod.z.string().describe("Line height (e.g., '1.2', '56px')").optional(), "letter_spacing": import_zod.z.string().describe("Letter spacing (e.g., '-0.02em', '0.5px')").optional(), "text_transform": import_zod.z.enum(["none", "uppercase", "lowercase", "capitalize"]).describe("Text transformation").optional() }).catchall(import_zod.z.any()).describe("A single entry in the type scale").optional(), "caption": import_zod.z.object({ "font": import_zod.z.string().describe("Font reference. Use a key from the fonts object (e.g., 'primary', 'secondary') to reference a defined font role, or a literal CSS font-family string as a fallback.").optional(), "size": import_zod.z.string().describe("Font size (e.g., '48px', '2rem')").optional(), "weight": import_zod.z.string().describe("Font weight (e.g., '700', 'bold')").optional(), "line_height": import_zod.z.string().describe("Line height (e.g., '1.2', '56px')").optional(), "letter_spacing": import_zod.z.string().describe("Letter spacing (e.g., '-0.02em', '0.5px')").optional(), "text_transform": import_zod.z.enum(["none", "uppercase", "lowercase", "capitalize"]).describe("Text transformation").optional() }).catchall(import_zod.z.any()).describe("A single entry in the type scale").optional(), "cta": import_zod.z.object({ "font": import_zod.z.string().describe("Font reference. Use a key from the fonts object (e.g., 'primary', 'secondary') to reference a defined font role, or a literal CSS font-family string as a fallback.").optional(), "size": import_zod.z.string().describe("Font size (e.g., '48px', '2rem')").optional(), "weight": import_zod.z.string().describe("Font weight (e.g., '700', 'bold')").optional(), "line_height": import_zod.z.string().describe("Line height (e.g., '1.2', '56px')").optional(), "letter_spacing": import_zod.z.string().describe("Letter spacing (e.g., '-0.02em', '0.5px')").optional(), "text_transform": import_zod.z.enum(["none", "uppercase", "lowercase", "capitalize"]).describe("Text transformation").optional() }).catchall(import_zod.z.any()).describe("A single entry in the type scale").optional() }).catchall(import_zod.z.object({ "font": import_zod.z.string().describe("Font reference. Use a key from the fonts object (e.g., 'primary', 'secondary') to reference a defined font role, or a literal CSS font-family string as a fallback.").optional(), "size": import_zod.z.string().describe("Font size (e.g., '48px', '2rem')").optional(), "weight": import_zod.z.string().describe("Font weight (e.g., '700', 'bold')").optional(), "line_height": import_zod.z.string().describe("Line height (e.g., '1.2', '56px')").optional(), "letter_spacing": import_zod.z.string().describe("Letter spacing (e.g., '-0.02em', '0.5px')").optional(), "text_transform": import_zod.z.enum(["none", "uppercase", "lowercase", "capitalize"]).describe("Text transformation").optional() }).catchall(import_zod.z.any()).describe("A single entry in the type scale")).describe("Typography scale defining sizes and weights for different text roles. When sizes are in px, use base_width to indicate the reference canvas.").optional(), "asset_libraries": import_zod.z.array(import_zod.z.object({ "name": import_zod.z.string().describe("Display name of the asset library"), "type": import_zod.z.enum(["icon_set", "illustration_system", "image_library", "video_library", "template_library"]).describe("Type of asset library").optional(), "url": import_zod.z.string().url().describe("URL to the asset library (for human access)"), "description": import_zod.z.string().describe("Description of the library contents and usage").optional(), "color_guide": import_zod.z.object({ "roles": import_zod.z.array(import_zod.z.string()).describe("Named color roles used in the library (e.g., base, shadow_1, highlight_1, stroke)").optional(), "palettes": import_zod.z.array(import_zod.z.object({ "name": import_zod.z.string().describe("Palette name"), "colors": import_zod.z.record(import_zod.z.string(), import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("A single hex color value")).describe("Map of role names to hex color values") }).catchall(import_zod.z.any())).describe("Named color palettes mapping roles to specific colors").optional() }).catchall(import_zod.z.any()).describe("Color guide for the asset library defining roles and palettes").optional() }).catchall(import_zod.z.any()).describe("A managed asset library (icon set, illustration system, image collection). The URL is for human access; agent-facing DAM integration is under investigation.")).describe("References to managed asset libraries (icon sets, illustration systems, image collections). URLs are intended for human access; agent-facing DAM integration is under investigation.").optional(), "restrictions": import_zod.z.array(import_zod.z.string()).describe("Visual prohibitions and guardrails (e.g., 'Never use black backgrounds', 'Do not crop the logo', 'No stock photography of people on phones')").optional() }).catchall(import_zod.z.any()).describe("Structured visual rules for generative creative systems").optional(), "agents": import_zod.z.array(import_zod.z.object({ "type": import_zod.z.enum(["brand", "rights", "measurement", "governance", "creative", "sales", "buying", "signals"]).describe("Functional role of this agent"), "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("Agent endpoint URL (MCP or A2A). Callers comparing a brand's declared agent URL against another value (e.g., resolving 'is this the agent that signed this artifact?' or matching against a discovery cache) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. After the publication chain and an authorized request-signing key verify, this exact entry's canonical URL is the stable Agent identity input for principal mapping; the domain, JWKS URI, kid, and key material are credential or trust facts beneath it, not the Agent identity. See docs/reference/url-canonicalization."), "id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).max(100).describe("Agent identifier (useful for logging, multi-tenant platforms)"), "description": import_zod.z.string().max(500).describe("Human-readable description of this agent's capabilities or scope").optional(), "jwks_uri": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL of the agent's JWKS (RFC 7517) containing public keys used to verify artifacts this agent signs or requests it sends. Verified artifacts include signed governance_context tokens (for governance agents) and RFC 9421 HTTP Signatures on outgoing requests (for any agent). When absent, verifiers MUST default to /.well-known/jwks.json on the origin of `url`. Keys are identified by `kid` in the JWS header or RFC 9421 `keyid` parameter; JWKS MAY contain multiple keys to support rotation and per-purpose separation via `key_ops` and `use`.").optional(), "available_uses": import_zod.z.array(import_zod.z.enum(["likeness", "voice", "name", "endorsement", "motion_capture", "signature", "catchphrase", "sync", "background_music", "editorial", "commercial", "ai_generated_image"]).describe("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.")).describe("For rights agents: rights uses available for licensing").optional(), "right_types": import_zod.z.array(import_zod.z.enum(["talent", "character", "brand_ip", "music", "stock_media"]).describe("Categories of intellectual property rights that can be licensed through the brand protocol.")).describe("For rights agents: types of rights available").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).describe("ISO 3166-1 alpha-2 country codes where this agent operates. Omit for global scope.").optional() }).catchall(import_zod.z.any()).describe("An agent declared by a brand or house. Each entry identifies one agent endpoint and its functional role in the advertising ecosystem.")).describe("Agents authorized to act on behalf of this brand. Consumers resolving an agent by URL use the matching brand-level entry; do not infer a type-wide override of unrelated house-level entries when multiple same-type entries exist.").optional(), "brand_agent": import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("Brand agent MCP endpoint URL. Callers comparing this URL against another value (e.g., resolving 'is this the brand's declared agent?' against a discovery cache) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. See docs/reference/url-canonicalization."), "id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Agent identifier (useful for logging, multi-tenant DAMs)") }).catchall(import_zod.z.any()).describe("Deprecated: use agents array with type 'brand' instead. Brand agent that provides dynamic brand data via MCP.").optional(), "rights_agent": import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("Rights agent MCP endpoint URL. Callers comparing this URL against another value (e.g., matching against a brand's declared rights endpoint) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. See docs/reference/url-canonicalization."), "id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Agent identifier"), "available_uses": import_zod.z.array(import_zod.z.enum(["likeness", "voice", "name", "endorsement", "motion_capture", "signature", "catchphrase", "sync", "background_music", "editorial", "commercial", "ai_generated_image"]).describe("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.")).describe("Rights uses available for licensing through this agent"), "right_types": import_zod.z.array(import_zod.z.enum(["talent", "character", "brand_ip", "music", "stock_media"]).describe("Categories of intellectual property rights that can be licensed through the brand protocol.")).describe("Types of rights available").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).describe("Countries where rights are available (ISO 3166-1 alpha-2)").optional() }).catchall(import_zod.z.any()).describe("Deprecated: use agents array with type 'rights' instead. Rights licensing agent for this brand.").optional(), "contact": import_zod.z.object({ "email": import_zod.z.string().email().describe("Contact email").optional(), "phone": import_zod.z.string().describe("Contact phone number").optional() }).describe("Brand-level contact information").optional(), "collections": import_zod.z.array(import_zod.z.object({ "collection_id": import_zod.z.string().describe("Collection identifier as used in the seller's get_products responses").optional(), "name": import_zod.z.string().describe("Human-readable collection name"), "role": import_zod.z.enum(["host", "guest", "creator", "cast", "narrator", "producer", "correspondent", "commentator", "analyst"]).describe("This person's role on the collection").optional(), "seller_agent_url": import_zod.z.string().url().describe("URL of the sales agent that sells inventory for this collection. Buyer agents can query this agent for collection products.").optional() }).catchall(import_zod.z.any())).describe("Collections this person or brand is associated with. Enables bidirectional linking: a collection's talent references brand.json via brand_url, and brand.json links back to collections.").optional() }).catchall(import_zod.z.any()).describe("A brand within a house portfolio. Combines identity (who) with creative assets (how to represent). Referenced as domain + brand_id.")).describe("Inline brands owned by this house (parent-owned data). Use for sub-brands without their own canonical document \u2014 typically those without a dedicated domain or that the holdco wants to manage centrally. A brand_id MUST NOT appear in both brands[] and brand_refs[].").optional(), "brand_refs": import_zod.z.array(import_zod.z.object({ "domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the child's canonical brand.json lives"), "brand_id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Stable brand identifier within the house portfolio. Required so the cross-array uniqueness invariant (brand_id MUST NOT appear in both brands[] and brand_refs[]) is enforceable."), "managed_by": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Optional domain of the entity that operationally manages this brand (e.g., an agency network within a holdco). House-declared. Consumers MUST NOT use it for trust or authorization decisions. Aggregation across houses ('show me everything BBH manages') is the intended use; trust is unaffected.").optional(), "effective_at": import_zod.z.string().datetime().describe("ISO 8601 timestamp when the house established this ownership claim. Consumers age mutual-assertion edges from this date for TTL purposes and MUST NOT extend relationship trust before a future effective_at is reached. Optional; absent means the consumer ages from its own durable first observation.").optional() }).strict().describe("A house's ownership entry for a brand that publishes its own canonical brand.json elsewhere. The publisher (the house) asserts 'I own this brand, hosted at this domain, effective on this date.' Mutual-assertion trust requires the child's house_domain to reciprocate. Distinct from core/brand-ref.json (which identifies brands in media-buy plans). See docs/brand-protocol/brand-json.mdx")).describe("Portfolio entries for brands owned by this house that publish their own canonical brand.json elsewhere (child-owned data). Each entry asserts ownership plus where the child's document lives. Mutual-assertion trust: the pointed-to document's house_domain must equal this house's domain. Invariants: a brand_id MUST NOT appear in both brands[] and brand_refs[]; brand_id and domain MUST each be unique within brand_refs[]. See docs/brand-protocol/brand-json.mdx").optional(), "contact": import_zod.z.object({ "name": import_zod.z.string().min(1).max(255), "email": import_zod.z.string().email().max(255).optional(), "domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("A valid domain name").optional() }).catchall(import_zod.z.any()).describe("Contact information").optional(), "authorized_operators": import_zod.z.array(import_zod.z.object({ "domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain of the authorized operator (e.g., 'groupm.com')"), "brands": import_zod.z.array(import_zod.z.string().regex(new RegExp("^([a-z0-9_]+|\\*)$"))).describe("Brand IDs this operator is authorized for. Use ['*'] for all brands in the portfolio."), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).describe("ISO 3166-1 alpha-2 country codes where this authorization applies. Omit for global authorization.").optional(), "scopes": import_zod.z.array(import_zod.z.enum(["all", "media_buying", "creative_generation", "rights_clearance", "governance", "measurement", "agent_operations"])).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Activities this operator is authorized to perform for the listed brands and countries. Omit for backwards-compatible broad authorization. Use ['all'] only when every listed scope is delegated.").optional(), "valid_from": import_zod.z.string().datetime().describe("ISO 8601 timestamp when this operator authorization starts. Omit when authorization is already active or the start date is not tracked.").optional(), "valid_until": import_zod.z.string().datetime().describe("ISO 8601 timestamp when this operator authorization expires. Consumers MUST treat entries at or after this timestamp as inactive for authorization decisions.").optional() }).catchall(import_zod.z.any()).describe("An entity authorized to represent brands from this house. Verified by resolving the operator's domain. Optional validity fields let houses time-box agency-of-record and delegated-operator relationships without changing historical entries.")).describe("Entities authorized to represent brands from this house. Third parties (sellers, platforms) can verify an operator's authorization by checking this list. Operators are identified by domain.").optional(), "trademarks": import_zod.z.array(import_zod.z.object({ "registry": import_zod.z.string().describe("Trademark registry (e.g., 'USPTO', 'EUIPO', 'JPO', 'CNIPA')"), "number": import_zod.z.string().describe("Registration number as issued by the registry"), "mark": import_zod.z.string().describe("The registered mark as published"), "status": import_zod.z.enum(["active", "pending", "abandoned", "cancelled", "expired"]).describe("Registration status. Omit for active marks if status tracking is not maintained.").optional(), "license_type": import_zod.z.enum(["owned", "licensed_in", "licensed_out"]).describe("Whether the publisher owns the mark, licenses it from another entity, or licenses it to others. 'owned' is the default if omitted.").optional(), "licensor_domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain of the entity that licenses this mark to the publisher. Meaningful when license_type=licensed_in; omit otherwise.").optional(), "countries": import_zod.z.array(import_zod.z.string().min(2).max(2)).describe("ISO 3166-1 alpha-2 country codes where this registration applies. Omit for global or where the registry's jurisdiction is implicit.").optional(), "nice_classes": import_zod.z.array(import_zod.z.number().int().gte(1).lte(45)).describe("Nice Classification class numbers (1-45) covered by this registration. Disambiguates marks across industries (e.g., Delta-airline vs Delta-faucet). Omit if scope is implicit from registry.").optional() }).catchall(import_zod.z.any()).describe("A registered trademark. May appear at house level (corporate marks, e.g., 'NIKE' owned by Nike, Inc.) or at brand level (brand-specific marks, e.g., 'CONVERSE' owned by Converse). Resolution between house- and brand-level trademarks is union \u2014 both lists are valid claims about marks the publisher controls.")).describe("House-level (corporate) registered trademarks. Brand-level marks live on individual brand entries; resolution is union.").optional(), "last_updated": import_zod.z.string().datetime().optional() }).strict().and(import_zod.z.union([import_zod.z.any(), import_zod.z.any()])).describe("Full house/brand portfolio with hierarchy, creative assets, and properties. May carry inline brands (parent-owned, brands[]) and/or pointer brands (child-owned canonical documents, brand_refs[]). At least one of brands[] or brand_refs[] is required. A brand_id MUST NOT appear in both. See docs/brand-protocol/brand-json.mdx"), import_zod.z.record(import_zod.z.string(), import_zod.z.any()).and(import_zod.z.intersection(import_zod.z.object({ "$schema": import_zod.z.string().optional(), "version": import_zod.z.string().optional(), "default_language": import_zod.z.string().regex(new RegExp("^(?:[a-z]{2,8}(?:-[A-Z][a-z]{3})?(?:-(?:[A-Z]{2}|[0-9]{3}))?(?:-(?:[a-z0-9]{5,8}|[0-9][a-z0-9]{3}))*(?:-[0-9a-wy-z](?:-[a-z0-9]{2,8})+)*(?:-x(?:-[a-z0-9]{1,8})+)?|x(?:-[a-z0-9]{1,8})+)$")).min(2).max(63).describe("A well-formed BCP 47 language tag used by AdCP only as language identity. Script and region may refine that identity; other valid BCP 47 subtags remain part of tag matching but do not make this a general locale-settings object. It does not determine currency, time zone, number/date formatting, market, or legal jurisdiction. The AdCP canonical wire profile requires lower-case language and variants, title-case script, and upper-case region (for example `en-US`, `zh-Hant-TW`, or `x-private`). RFC 5646 comparisons are case-insensitive and its case regularization is optional; AdCP intentionally requires this stricter single wire spelling and receivers MUST reject differently cased tags rather than silently normalizing them. The schema pattern enforces the AdCP casing profile and extension structure for commonly used tags; conforming receivers additionally validate the complete RFC 5646 grammar and registry rules. Every new AdCP field carrying BCP 47 language identity or a concrete language range MUST reference this schema instead of declaring independent string constraints.").describe("BCP 47 language tag for legacy plain-string and plain-array content in this document. Readers assume en when omitted.").default("en"), "house_domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Optional pointer to the corporate house this brand belongs to. The named house's brand_refs[] MUST reciprocate for mutual-assertion trust. Single-hop only \u2014 a brand cannot itself declare brand_refs[]. Omit for standalone brands (no house).").optional(), "last_updated": import_zod.z.string().datetime().optional() }), import_zod.z.object({ "id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand identifier within the house. House chooses this ID."), "url": import_zod.z.string().url().describe("Primary brand URL for context and asset discovery").optional(), "identity_relying_parties": import_zod.z.array(import_zod.z.object({ "issuer": import_zod.z.object({ "domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where /.well-known/brand.json is hosted, or the brand's operating domain"), "brand_id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand identifier within the house portfolio. Optional for single-brand domains.").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("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.").optional(), "industries": import_zod.z.array(import_zod.z.string()).describe("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.").optional(), "data_subject_contestation": import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).optional(), "email": import_zod.z.string().email().optional(), "languages": import_zod.z.array(import_zod.z.string()).optional() }).strict().and(import_zod.z.union([import_zod.z.any(), import_zod.z.any()])).describe("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.").optional(), "brand_kit_override": import_zod.z.object({ "logo": import_zod.z.object({ "asset_type": import_zod.z.literal("image").describe("Discriminator identifying this as an image asset. See /schemas/creative/asset-types for the registry."), "url": import_zod.z.string().url().describe("URL to the image asset"), "width": import_zod.z.number().int().gte(1).describe("Width in pixels"), "height": import_zod.z.number().int().gte(1).describe("Height in pixels"), "file_size_bytes": import_zod.z.number().int().gte(1).describe("Image file size in bytes. Required by agents that advertise a max_file_size_kb constraint.").optional(), "pixel_ratio": import_zod.z.number().gt(0).describe("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.").optional(), "state_id": import_zod.z.string().describe("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.").optional(), "breakpoint_id": import_zod.z.string().describe("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.").optional(), "focal_point": import_zod.z.array(import_zod.z.number().gte(0).lte(1)).max(2).describe("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.").optional(), "format": import_zod.z.string().describe("Image file format (jpg, png, gif, webp, etc.)").optional(), "alt_text": import_zod.z.string().describe("Alternative text for accessibility").optional(), "provenance": import_zod.z.object({ "digital_source_type": import_zod.z.enum(["digital_capture", "digital_creation", "trained_algorithmic_media", "composite_with_trained_algorithmic_media", "algorithmic_media", "composite_capture", "composite_synthetic", "human_edits", "data_driven_media"]).describe("IPTC-aligned classification of AI involvement in producing this content").optional(), "synthetic_depiction": import_zod.z.boolean().describe("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`.").optional(), "ai_tool": import_zod.z.object({ "name": import_zod.z.string().describe("Name of the AI tool or model (e.g., 'DALL-E 3', 'Stable Diffusion XL', 'Gemini')"), "version": import_zod.z.string().describe("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.").optional(), "provider": import_zod.z.string().describe("Organization that provides the AI tool (e.g., 'OpenAI', 'Stability AI', 'Google')").optional() }).describe("AI system used to generate or modify this content. Aligns with IPTC 2025.1 AI metadata fields and C2PA claim_generator.").optional(), "human_oversight": import_zod.z.enum(["none", "prompt_only", "selected", "edited", "directed"]).describe("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`.").optional(), "declared_by": import_zod.z.object({ "agent_url": import_zod.z.string().url().describe("URL of the agent or service that declared this provenance").optional(), "role": import_zod.z.enum(["creator", "advertiser", "agency", "platform", "tool"]).describe("Role of the declaring party in the supply chain") }).describe("Party declaring this provenance. Identifies who attached the provenance claim, enabling receiving parties to assess trust.").optional(), "declared_at": import_zod.z.string().datetime().describe("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.").optional(), "created_time": import_zod.z.string().datetime().describe("When this content was created or generated (ISO 8601)").optional(), "c2pa": import_zod.z.object({ "manifest_url": import_zod.z.string().url().describe("URL to the C2PA manifest store for this content") }).describe("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.").optional(), "embedded_provenance": import_zod.z.array(import_zod.z.object({ "method": import_zod.z.enum(["manifest_wrapper", "provenance_markers"]).describe("How provenance data is carried within the content"), "standard": import_zod.z.string().describe("Standard the embedding conforms to, if any (e.g., 'c2pa' for C2PA Section A.7 text manifest embedding)").optional(), "provider": import_zod.z.string().describe("Organization that performed the embedding (e.g., 'Encypher', 'Digimarc'). Display label and audit context \u2014 not a wire identifier."), "verify_agent": import_zod.z.object({ "agent_url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("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."), "feature_id": import_zod.z.string().describe("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.").optional() }).strict().describe("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).").optional(), "embedded_at": import_zod.z.string().datetime().describe("When the provenance data was embedded (ISO 8601)").optional() })).describe("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`).").optional(), "watermarks": import_zod.z.array(import_zod.z.object({ "media_type": import_zod.z.enum(["audio", "image", "video", "text"]).describe("Media category of the watermarked content"), "provider": import_zod.z.string().describe("Organization that applied the watermark (e.g., 'Imatag', 'Steg.AI', 'Encypher'). Display label and audit context \u2014 not a wire identifier."), "verify_agent": import_zod.z.object({ "agent_url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("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."), "feature_id": import_zod.z.string().describe("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.").optional() }).strict().describe("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).").optional(), "c2pa_action": import_zod.z.enum(["c2pa.watermarked.bound", "c2pa.watermarked.unbound"]).describe("C2PA action classification for this watermark").optional(), "embedded_at": import_zod.z.string().datetime().describe("When the watermark was applied (ISO 8601)").optional() })).describe("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`).").optional(), "disclosure": import_zod.z.object({ "required": import_zod.z.boolean().describe("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."), "jurisdictions": import_zod.z.array(import_zod.z.object({ "country": import_zod.z.string().describe("ISO 3166-1 alpha-2 country code (e.g., 'US', 'DE', 'CN')"), "region": import_zod.z.string().describe("Sub-national region code (e.g., 'CA' for California, 'BY' for Bavaria)").optional(), "regulation": import_zod.z.string().describe("Regulation identifier (e.g., 'eu_ai_act_article_50', 'ca_sb_942', 'cn_deep_synthesis')"), "label_text": import_zod.z.string().describe("Required disclosure label text for this jurisdiction, in the local language").optional(), "render_guidance": import_zod.z.object({ "persistence": import_zod.z.enum(["continuous", "initial", "flexible"]).describe("How long the disclosure must persist during content playback or display").optional(), "min_duration_ms": import_zod.z.number().int().gte(1).describe("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.").optional(), "positions": import_zod.z.array(import_zod.z.enum(["prominent", "footer", "audio", "subtitle", "overlay", "end_card", "pre_roll", "companion"]).describe("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.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Preferred disclosure positions in priority order. The first position a format supports should be used.").optional(), "ext": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).describe("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.").optional() }).describe("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.").optional() })).describe("Jurisdictions where disclosure obligations apply").optional() }).describe("Regulatory disclosure requirements for this content. Indicates whether AI disclosure is required and under which jurisdictions.").optional(), "verification": import_zod.z.array(import_zod.z.object({ "verified_by": import_zod.z.string().describe("Name of the verification service (e.g., 'DoubleVerify', 'Hive Moderation', 'Reality Defender')"), "verified_time": import_zod.z.string().datetime().describe("When the verification was performed (ISO 8601)").optional(), "result": import_zod.z.enum(["authentic", "ai_generated", "ai_modified", "inconclusive"]).describe("Verification outcome"), "confidence": import_zod.z.number().gte(0).lte(1).describe("Confidence score of the verification result (0.0 to 1.0)").optional(), "details_url": import_zod.z.string().url().describe("URL to the full verification report").optional() })).describe("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.").optional(), "ext": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).describe("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.").optional() }).describe("Provenance metadata for this asset, overrides manifest-level provenance").optional() }).catchall(import_zod.z.any()).describe("Override logo asset.").optional(), "colors": import_zod.z.object({ "primary": import_zod.z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional(), "secondary": import_zod.z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional(), "accent": import_zod.z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional() }).catchall(import_zod.z.any()).describe("Override brand colors (hex strings).").optional(), "voice": import_zod.z.string().describe("Override brand-voice description for surface-composed text/audio output.").optional(), "tagline": import_zod.z.string().describe("Override tagline.").optional() }).catchall(import_zod.z.any()).describe("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.").optional() }).strict().describe(`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).`), "scheme": import_zod.z.string().describe('Proof scheme and version, e.g. "world_id_v4".').optional(), "relying_party_id": import_zod.z.string().describe("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."), "scope": import_zod.z.enum(["entity", "property"]).describe("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).").optional() }).strict().describe("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.")).describe("Verified-identity relying parties scoped to this brand/property, for attestation provenance in TMP Identity Match. Use when a brand or property runs its own relying_party_id (per-property pseudonyms); entity-wide relying parties live on the house object. See specs/tmp-verified-identity-attestation.md.").optional(), "names": import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.string().min(1)).describe("A localized name using the legacy underscore-separated language/region key convention (for example 'en_US', 'fr_CA', or 'zh_CN') and a name value. Bare language codes such as 'en' are also accepted for backwards compatibility. These keys are not AdCP locale-tag values: a bridge to /schemas/core/locale-tag.json replaces '_' with '-', applies the AdCP canonical wire profile, and validates the result rather than passing the key through unchanged.")).describe("Localized brand names. Multiple entries per language allowed for aliases."), "keller_type": import_zod.z.enum(["master", "sub_brand", "endorsed", "independent"]).describe("Brand architecture type from Keller's theory. master: primary brand of house. sub_brand: carries parent name (Nike SB). endorsed: independent identity backed by parent (Air Jordan 'by Nike'). independent: operates separately (Converse under Nike, Inc.)").optional(), "parent_brand": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Parent brand ID for sub-brands and endorsed brands").optional(), "description": import_zod.z.string().describe("Brand description").optional(), "industries": import_zod.z.array(import_zod.z.string()).describe("Brand industries (e.g., ['automotive'] or ['pharmaceutical', 'cpg'] for a consumer health company). Describes what the company does \u2014 not what regulatory regimes apply (use policy_categories for that).").optional(), "target_audience": import_zod.z.string().describe("Primary target audience").optional(), "logos": import_zod.z.array(import_zod.z.object({ "id": import_zod.z.string().regex(new RegExp("^[a-z0-9][a-z0-9_-]*$")).describe("Stable identifier for this logo entry. Recommended when logo usage rules or mark lockups need to bind to a specific logo asset.").optional(), "url": import_zod.z.string().url().describe("URL to the logo asset"), "orientation": import_zod.z.enum(["square", "horizontal", "vertical", "stacked"]).describe("Logo aspect ratio orientation. square: ~1:1, horizontal: wide, vertical: tall, stacked: vertically arranged elements").optional(), "background": import_zod.z.enum(["dark-bg", "light-bg", "transparent-bg"]).describe("Background compatibility. dark-bg: use on dark backgrounds, light-bg: use on light backgrounds, transparent-bg: has transparent background").optional(), "variant": import_zod.z.enum(["primary", "secondary", "icon", "wordmark", "full-lockup"]).describe("Logo variant type. primary: main logo, secondary: alternative, icon: symbol only, wordmark: text only, full-lockup: complete logo").optional(), "tags": import_zod.z.array(import_zod.z.string()).describe("Additional semantic tags for custom categorization beyond the standard orientation, background, and variant fields").optional(), "slots": import_zod.z.array(import_zod.z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical renderer slots where this logo is appropriate. Consumers SHOULD prefer this over inferring from tags or usage prose when selecting a logo for a specific UI surface.").optional(), "usage": import_zod.z.string().describe("Human-readable description of when to use this logo variant (e.g., 'Primary logo for use on light backgrounds')").optional(), "width": import_zod.z.number().int().describe("Width in pixels").optional(), "height": import_zod.z.number().int().describe("Height in pixels").optional() }).catchall(import_zod.z.any()).describe("Brand logo asset with structured fields for orientation, background compatibility, and variant type")).describe("Brand logo assets").optional(), "colors": import_zod.z.object({ "primary": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "secondary": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "accent": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "background": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "text": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "heading": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "body": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "label": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "border": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "divider": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "surface_1": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "surface_2": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional() }).catchall(import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))])).describe("Brand color palette. Each role accepts a single hex color or an array of hex colors for brands with multiple values per role. Beyond the core five roles, brands can provide additional color roles for finer granularity \u2014 heading, body, label, border, divider, surface_1, surface_2, etc.").optional(), "fonts": import_zod.z.object({ "primary": import_zod.z.union([import_zod.z.string().describe("CSS font-family name (e.g., 'Montserrat', 'Arial, sans-serif')"), import_zod.z.object({ "family": import_zod.z.string().describe("CSS font-family name (e.g., 'Brand Sans')"), "files": import_zod.z.array(import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL to the font file (WOFF2, TTF, or OTF)"), "weight": import_zod.z.number().int().gte(100).lte(900).describe("CSS numeric font-weight for static fonts (100-900)").optional(), "weight_range": import_zod.z.array(import_zod.z.number().int().gte(100).lte(900)).max(2).describe("Variable font weight axis range as [min, max] (e.g., [100, 900]). Use instead of weight for variable fonts.").optional(), "style": import_zod.z.enum(["normal", "italic", "oblique"]).describe("CSS font-style").optional() }).catchall(import_zod.z.any()).describe("A font file with weight, style, and variable font metadata")).max(36).describe("Font files for different weights and styles").optional(), "opentype_features": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9]{4}$"))).max(20).describe("OpenType feature tags to enable (e.g., ['ss01', 'tnum', 'cv01']). These are four-character tags per the OpenType spec.").optional(), "fallbacks": import_zod.z.array(import_zod.z.string().max(100)).max(10).describe("Ordered fallback font-family names for when the primary font is unavailable or does not support the required script (e.g., ['Noto Sans Arabic', 'Noto Sans SC', 'sans-serif'])").optional() }).catchall(import_zod.z.any()).describe("Structured font with family name, downloadable font files, and typographic metadata")]).describe("Primary font family").optional(), "secondary": import_zod.z.union([import_zod.z.string().describe("CSS font-family name (e.g., 'Montserrat', 'Arial, sans-serif')"), import_zod.z.object({ "family": import_zod.z.string().describe("CSS font-family name (e.g., 'Brand Sans')"), "files": import_zod.z.array(import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL to the font file (WOFF2, TTF, or OTF)"), "weight": import_zod.z.number().int().gte(100).lte(900).describe("CSS numeric font-weight for static fonts (100-900)").optional(), "weight_range": import_zod.z.array(import_zod.z.number().int().gte(100).lte(900)).max(2).describe("Variable font weight axis range as [min, max] (e.g., [100, 900]). Use instead of weight for variable fonts.").optional(), "style": import_zod.z.enum(["normal", "italic", "oblique"]).describe("CSS font-style").optional() }).catchall(import_zod.z.any()).describe("A font file with weight, style, and variable font metadata")).max(36).describe("Font files for different weights and styles").optional(), "opentype_features": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9]{4}$"))).max(20).describe("OpenType feature tags to enable (e.g., ['ss01', 'tnum', 'cv01']). These are four-character tags per the OpenType spec.").optional(), "fallbacks": import_zod.z.array(import_zod.z.string().max(100)).max(10).describe("Ordered fallback font-family names for when the primary font is unavailable or does not support the required script (e.g., ['Noto Sans Arabic', 'Noto Sans SC', 'sans-serif'])").optional() }).catchall(import_zod.z.any()).describe("Structured font with family name, downloadable font files, and typographic metadata")]).describe("Secondary font family").optional() }).catchall(import_zod.z.union([import_zod.z.string().describe("CSS font-family name (e.g., 'Montserrat', 'Arial, sans-serif')"), import_zod.z.object({ "family": import_zod.z.string().describe("CSS font-family name (e.g., 'Brand Sans')"), "files": import_zod.z.array(import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL to the font file (WOFF2, TTF, or OTF)"), "weight": import_zod.z.number().int().gte(100).lte(900).describe("CSS numeric font-weight for static fonts (100-900)").optional(), "weight_range": import_zod.z.array(import_zod.z.number().int().gte(100).lte(900)).max(2).describe("Variable font weight axis range as [min, max] (e.g., [100, 900]). Use instead of weight for variable fonts.").optional(), "style": import_zod.z.enum(["normal", "italic", "oblique"]).describe("CSS font-style").optional() }).catchall(import_zod.z.any()).describe("A font file with weight, style, and variable font metadata")).max(36).describe("Font files for different weights and styles").optional(), "opentype_features": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9]{4}$"))).max(20).describe("OpenType feature tags to enable (e.g., ['ss01', 'tnum', 'cv01']). These are four-character tags per the OpenType spec.").optional(), "fallbacks": import_zod.z.array(import_zod.z.string().max(100)).max(10).describe("Ordered fallback font-family names for when the primary font is unavailable or does not support the required script (e.g., ['Noto Sans Arabic', 'Noto Sans SC', 'sans-serif'])").optional() }).catchall(import_zod.z.any()).describe("Structured font with family name, downloadable font files, and typographic metadata")]).describe("A font role entry. Either a CSS font-family string (simple) or a structured object with family name and font files (rich).")).describe("Brand typography. Each key is a role name (e.g., 'primary', 'secondary') referenced by type_scale entries. Values are either a CSS font-family string or a structured object with font files for reliable resolution.").optional(), "tone": import_zod.z.union([import_zod.z.string().describe("Simple tone descriptors for backwards compatibility"), import_zod.z.object({ "voice": import_zod.z.union([import_zod.z.string(), import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.string().min(1)).describe("A localized name using the legacy underscore-separated language/region key convention (for example 'en_US', 'fr_CA', or 'zh_CN') and a name value. Bare language codes such as 'en' are also accepted for backwards compatibility. These keys are not AdCP locale-tag values: a bridge to /schemas/core/locale-tag.json replaces '_' with '-', applies the AdCP canonical wire profile, and validates the result rather than passing the key through unchanged."))]).describe("High-level voice descriptor, either a legacy plain string or localized values.").optional(), "attributes": import_zod.z.union([import_zod.z.array(import_zod.z.string()), import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.array(import_zod.z.string())).describe("One locale mapped to a complete ordered string list. The list is selected as a unit so readers never assemble mixed-language output from independently localized elements."))]).describe("Personality traits that characterize the brand voice. Localized lists are selected as a whole.").optional(), "dos": import_zod.z.union([import_zod.z.array(import_zod.z.string()), import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.array(import_zod.z.string())).describe("One locale mapped to a complete ordered string list. The list is selected as a unit so readers never assemble mixed-language output from independently localized elements."))]).describe("Guidance for copy generation - what TO do. Localized lists are selected as a whole.").optional(), "donts": import_zod.z.union([import_zod.z.array(import_zod.z.string()), import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.array(import_zod.z.string())).describe("One locale mapped to a complete ordered string list. The list is selected as a unit so readers never assemble mixed-language output from independently localized elements."))]).describe("Guardrails to avoid brand violations - what NOT to do. Localized lists are selected as a whole.").optional() }).describe("Structured brand voice guidelines")]).describe("Brand voice and messaging tone guidelines").optional(), "tagline": import_zod.z.union([import_zod.z.string().describe("Plain tagline string for backwards compatibility"), import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.string().min(1)).describe("A localized name using the legacy underscore-separated language/region key convention (for example 'en_US', 'fr_CA', or 'zh_CN') and a name value. Bare language codes such as 'en' are also accepted for backwards compatibility. These keys are not AdCP locale-tag values: a bridge to /schemas/core/locale-tag.json replaces '_' with '-', applies the AdCP canonical wire profile, and validates the result rather than passing the key through unchanged.")).describe("Localized taglines with BCP 47 locale codes")]).describe("Brand tagline or slogan. Accepts a plain string or a localized array matching the names pattern.").optional(), "assets": import_zod.z.array(import_zod.z.object({ "asset_id": import_zod.z.string().describe("Unique identifier"), "asset_type": import_zod.z.enum(["image", "video", "audio", "text", "markdown", "html", "css", "javascript", "zip", "vast", "daast", "url", "webhook", "brief", "catalog", "published_post"]).describe("Type of asset content"), "url": import_zod.z.string().url().describe("URL to CDN-hosted asset file"), "tags": import_zod.z.array(import_zod.z.string()).describe("Tags for discovery (e.g., 'hero', 'lifestyle', 'product', 'holiday')").optional(), "name": import_zod.z.union([import_zod.z.string(), import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.string().min(1)).describe("A localized name using the legacy underscore-separated language/region key convention (for example 'en_US', 'fr_CA', or 'zh_CN') and a name value. Bare language codes such as 'en' are also accepted for backwards compatibility. These keys are not AdCP locale-tag values: a bridge to /schemas/core/locale-tag.json replaces '_' with '-', applies the AdCP canonical wire profile, and validates the result rather than passing the key through unchanged."))]).describe("Human-readable name, either a legacy plain string or localized values.").optional(), "description": import_zod.z.union([import_zod.z.string(), import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.string().min(1)).describe("A localized name using the legacy underscore-separated language/region key convention (for example 'en_US', 'fr_CA', or 'zh_CN') and a name value. Bare language codes such as 'en' are also accepted for backwards compatibility. These keys are not AdCP locale-tag values: a bridge to /schemas/core/locale-tag.json replaces '_' with '-', applies the AdCP canonical wire profile, and validates the result rather than passing the key through unchanged."))]).describe("Asset description or usage notes, either a legacy plain string or localized values.").optional(), "width": import_zod.z.number().int().describe("Image/video width in pixels").optional(), "height": import_zod.z.number().int().describe("Image/video height in pixels").optional(), "duration_seconds": import_zod.z.number().describe("Video/audio duration in seconds").optional(), "file_size_bytes": import_zod.z.number().int().describe("File size in bytes").optional(), "format": import_zod.z.string().describe("File format (e.g., 'jpg', 'mp4', 'mp3')").optional(), "metadata": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).describe("Additional asset-specific metadata").optional() }).catchall(import_zod.z.any()).describe("Brand asset (image, video, audio, text)")).describe("Brand asset library").optional(), "properties": import_zod.z.array(import_zod.z.object({ "type": import_zod.z.enum(["website", "mobile_app", "ctv_app", "desktop_app", "dooh", "podcast", "radio", "linear_tv", "streaming_audio", "ai_assistant"]).describe("Property type"), "identifier": import_zod.z.string().min(1).describe("Property identifier - domain for websites, bundle ID for apps"), "store": import_zod.z.enum(["apple", "google", "amazon", "roku", "samsung", "lg", "other"]).describe("App store for mobile/CTV apps").optional(), "region": import_zod.z.string().regex(new RegExp("^([A-Z]{2}|global)$")).describe("ISO 3166-1 alpha-2 country code or 'global'").optional(), "primary": import_zod.z.boolean().describe("Whether this is the primary property for the brand").default(false), "relationship": import_zod.z.enum(["owned", "direct", "delegated", "ad_network"]).describe("How this brand relates to the property. 'owned': the brand owns and operates this property (default) and has no adagents.json delegation_type counterpart. 'direct': the brand is the direct sales path for this property, even if a third party operates the software (e.g., a publisher's in-house ad team using a vendor's tech). 'delegated': the brand manages monetization for this property \u2014 they are in charge of ad sales (e.g., Mediavine managing a food blog). 'ad_network': the brand sells this property's inventory as part of a network or exchange \u2014 they are a path to the inventory, not the path (e.g., PubMatic as an SSP). For non-owned properties, the publisher confirms the relationship by setting the matching delegation_type on the agent's authorization in their adagents.json.").default("owned") }).catchall(import_zod.z.any()).describe("A digital property associated with a brand. Defaults to owned; use 'relationship' to declare direct, delegated, or ad_network properties. For delegated and network paths, these values match the delegation_type field in adagents.json, creating a bilateral verification chain: the operator declares the relationship here, the publisher confirms by setting the same delegation_type on the agent's authorization in their adagents.json. 'owned' is an inline ownership declaration with no adagents.json counterpart.")).describe("Digital properties associated with this brand \u2014 owned, managed, or represented").optional(), "product_catalog": import_zod.z.object({ "feed_url": import_zod.z.string().url().describe("URL to product catalog feed"), "feed_format": import_zod.z.enum(["google_merchant_center", "facebook_catalog", "shopify", "linkedin_jobs", "tiktok_shop", "pinterest_catalog", "openai_product_feed", "custom"]).describe("Format of the product feed").optional(), "categories": import_zod.z.array(import_zod.z.string()).describe("Product categories available in the catalog").optional(), "last_updated": import_zod.z.string().datetime().describe("When the product catalog was last updated").optional(), "update_frequency": import_zod.z.enum(["realtime", "hourly", "daily", "weekly"]).describe("How frequently the product catalog is updated").optional(), "agentic_checkout": import_zod.z.object({ "endpoint": import_zod.z.string().url().describe("Base URL for checkout session API"), "spec": import_zod.z.string().describe("Checkout API specification identifier. Use a namespaced string to identify the checkout protocol (e.g., vendor-prefixed or custom). Vendor-specific values belong under ext.{vendor}."), "supported_payment_providers": import_zod.z.array(import_zod.z.string()).describe("Payment providers supported by this checkout endpoint").optional() }).describe("Agentic checkout endpoint configuration").optional() }).catchall(import_zod.z.any()).describe("Product catalog for e-commerce brands").optional(), "privacy_policy_url": import_zod.z.string().url().describe("URL to the brand's privacy policy").optional(), "data_subject_contestation": import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL to a human-accessible contestation form or information page.").optional(), "email": import_zod.z.string().email().describe("Email address for contestation requests. Deployer MUST monitor and respond within the timelines set by applicable law (e.g., 1 month under GDPR Art. 12(3)).").optional(), "languages": import_zod.z.array(import_zod.z.string()).describe("BCP 47 language tags the contestation channel supports (e.g., ['en', 'de', 'fr']). At minimum SHOULD include a language spoken in every jurisdiction where the brand runs regulated-vertical campaigns.").optional() }).strict().and(import_zod.z.union([import_zod.z.any(), import_zod.z.any()])).describe("Contact point where a data subject can request human intervention, express their view, or contest an automated decision \u2014 satisfying GDPR Article 22(3) and EU AI Act Article 26(11) transparency obligations. This is a contact reference (URL, email, or both), not a machine-callable API. AdCP surfaces the pointer; the deployer runs the contestation workflow.").optional(), "disclaimers": import_zod.z.array(import_zod.z.object({ "text": import_zod.z.string(), "context": import_zod.z.string().optional(), "required": import_zod.z.boolean().default(true) })).describe("Legal disclaimers for creatives").optional(), "trademarks": import_zod.z.array(import_zod.z.object({ "registry": import_zod.z.string().describe("Trademark registry (e.g., 'USPTO', 'EUIPO', 'JPO', 'CNIPA')"), "number": import_zod.z.string().describe("Registration number as issued by the registry"), "mark": import_zod.z.string().describe("The registered mark as published"), "status": import_zod.z.enum(["active", "pending", "abandoned", "cancelled", "expired"]).describe("Registration status. Omit for active marks if status tracking is not maintained.").optional(), "license_type": import_zod.z.enum(["owned", "licensed_in", "licensed_out"]).describe("Whether the publisher owns the mark, licenses it from another entity, or licenses it to others. 'owned' is the default if omitted.").optional(), "licensor_domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain of the entity that licenses this mark to the publisher. Meaningful when license_type=licensed_in; omit otherwise.").optional(), "countries": import_zod.z.array(import_zod.z.string().min(2).max(2)).describe("ISO 3166-1 alpha-2 country codes where this registration applies. Omit for global or where the registry's jurisdiction is implicit.").optional(), "nice_classes": import_zod.z.array(import_zod.z.number().int().gte(1).lte(45)).describe("Nice Classification class numbers (1-45) covered by this registration. Disambiguates marks across industries (e.g., Delta-airline vs Delta-faucet). Omit if scope is implicit from registry.").optional() }).catchall(import_zod.z.any()).describe("A registered trademark. May appear at house level (corporate marks, e.g., 'NIKE' owned by Nike, Inc.) or at brand level (brand-specific marks, e.g., 'CONVERSE' owned by Converse). Resolution between house- and brand-level trademarks is union \u2014 both lists are valid claims about marks the publisher controls.")).describe("Brand-level registered trademarks. Use for marks the brand owns or controls (e.g., a sub-brand's own marks distinct from the corporate parent). House-level trademarks live on the house object; resolution between the two is union \u2014 both lists are valid claims.").optional(), "voice_synthesis": import_zod.z.object({ "provider": import_zod.z.string().optional(), "voice_id": import_zod.z.string().optional(), "settings": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).optional() }).catchall(import_zod.z.any()).describe("TTS voice synthesis configuration for AI-generated audio").optional(), "avatar": import_zod.z.object({ "provider": import_zod.z.string().optional(), "avatar_id": import_zod.z.string().optional(), "settings": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).optional() }).catchall(import_zod.z.any()).describe("Visual avatar configuration").optional(), "visual_guidelines": import_zod.z.object({ "photography": import_zod.z.object({ "realism": import_zod.z.enum(["natural", "stylized", "hyperreal", "abstract"]).describe("Level of photographic realism").optional(), "lighting": import_zod.z.string().describe("Lighting style (e.g., 'soft daylight', 'studio', 'golden hour', 'high-key', 'low-key')").optional(), "color_temperature": import_zod.z.enum(["warm", "neutral", "cool"]).describe("Overall color temperature of photography").optional(), "contrast": import_zod.z.enum(["low", "medium", "high"]).describe("Contrast level in photography").optional(), "depth_of_field": import_zod.z.enum(["shallow", "medium", "deep"]).describe("Depth of field preference. shallow: blurred background with subject isolation, deep: everything in focus").optional(), "subject": import_zod.z.object({ "people": import_zod.z.object({ "age_range": import_zod.z.string().describe("Target age range (e.g., '20-35')").optional(), "diversity": import_zod.z.string().describe("Diversity representation (e.g., 'mixed', 'varied')").optional(), "mood": import_zod.z.array(import_zod.z.string()).describe("Mood descriptors (e.g., ['confident', 'relaxed'])").optional() }).catchall(import_zod.z.any()).describe("People photography guidelines").optional(), "product_focus": import_zod.z.enum(["in-use", "isolated", "lifestyle", "detail"]).describe("How products are shown").optional(), "setting": import_zod.z.string().describe("Environmental context for photography (e.g., 'indoor', 'outdoor', 'studio', 'urban', 'nature', 'workplace')").optional() }).catchall(import_zod.z.any()).describe("Subject matter guidelines").optional(), "framing": import_zod.z.object({ "subject_position": import_zod.z.string().describe("Where the subject sits in frame (e.g., 'center', 'center-left', 'rule-of-thirds')").optional(), "crop_style": import_zod.z.string().describe("Cropping convention (e.g., 'waist-up', 'full-body', 'close-up', 'wide')").optional(), "perspective": import_zod.z.string().describe("Camera perspective (e.g., 'eye-level', 'overhead', 'low-angle')").optional() }).catchall(import_zod.z.any()).describe("Camera framing rules").optional(), "preferred_aspect_ratios": import_zod.z.array(import_zod.z.string().regex(new RegExp("^\\d+:\\d+$"))).describe("Preferred aspect ratios for brand photography (e.g., '16:9', '4:5', '1:1')").optional(), "tags": import_zod.z.array(import_zod.z.string()).describe("Additional style descriptors").optional() }).catchall(import_zod.z.any()).describe("Photography style rules for generative creative systems. Defines how brand photography should look when selected or generated.").optional(), "graphic_style": import_zod.z.object({ "style_type": import_zod.z.enum(["flat_illustration", "geometric", "gradient_mesh", "editorial_collage", "hand_drawn", "minimal_line_art", "3d_render", "isometric", "photographic_composite"]).describe("Primary graphic style").optional(), "stroke_style": import_zod.z.enum(["rounded", "square", "mixed", "none"]).describe("Stroke end/join style").optional(), "stroke_weight": import_zod.z.string().describe("Stroke weight (e.g., '2px', 'thin', 'bold')").optional(), "corner_radius": import_zod.z.string().describe("Default corner radius for graphic and illustration elements (e.g., '12px', '8px', 'sharp'). For UI component radii (buttons, cards, inputs), see visual_guidelines.border_radius.").optional(), "tags": import_zod.z.array(import_zod.z.string()).describe("Additional style descriptors").optional() }).catchall(import_zod.z.any()).describe("Visual language for brand graphics and illustrations").optional(), "shapes": import_zod.z.object({ "primary_shape": import_zod.z.string().describe("Primary brand shape (e.g., 'rounded_rectangle', 'circle', 'hexagon')").optional(), "secondary_shapes": import_zod.z.array(import_zod.z.string()).describe("Secondary shapes in the brand vocabulary").optional(), "usage": import_zod.z.object({ "max_per_layout": import_zod.z.number().int().describe("Maximum distinct shapes per layout").optional(), "overlap_allowed": import_zod.z.boolean().describe("Whether shapes may overlap").optional() }).catchall(import_zod.z.any()).describe("Shape usage rules").optional() }).catchall(import_zod.z.any()).describe("Distinctive shapes used as part of brand visual identity").optional(), "iconography": import_zod.z.object({ "style": import_zod.z.enum(["outline", "filled", "duotone", "flat", "glyph", "hand_drawn"]).describe("Icon rendering style").optional(), "stroke_weight": import_zod.z.string().describe("Icon stroke weight (e.g., '2px', '1.5px')").optional(), "corner_style": import_zod.z.enum(["rounded", "square", "mixed"]).describe("Corner style for icon paths").optional(), "usage": import_zod.z.object({ "max_per_frame": import_zod.z.number().int().describe("Maximum icons per creative frame").optional(), "size_ratio": import_zod.z.string().describe("Icon-to-layout size ratio (e.g., '1:8')").optional() }).catchall(import_zod.z.any()).describe("Icon usage rules").optional() }).catchall(import_zod.z.any()).describe("Icon style system and usage rules").optional(), "composition": import_zod.z.object({ "overlays": import_zod.z.object({ "gradient_style": import_zod.z.enum(["linear", "radial", "conic", "none"]).describe("Gradient type for overlays").optional(), "gradient_direction": import_zod.z.string().describe("Gradient direction (e.g., '45deg', 'to-bottom-right')").optional(), "opacity": import_zod.z.string().describe("Overlay opacity (e.g., '70%')").optional() }).catchall(import_zod.z.any()).describe("Graphic overlay rules").optional(), "texture": import_zod.z.object({ "style": import_zod.z.enum(["none", "subtle_grain", "noise", "paper", "fabric", "concrete"]).describe("Texture style applied to creative assets").optional(), "intensity": import_zod.z.enum(["low", "medium", "high"]).describe("Texture intensity").optional() }).catchall(import_zod.z.any()).describe("Texture treatment rules").optional(), "backgrounds": import_zod.z.object({ "types_allowed": import_zod.z.array(import_zod.z.enum(["solid_color", "gradient", "blurred_photo", "image", "video", "pattern", "transparent"])).describe("Permitted background types").optional() }).catchall(import_zod.z.any()).describe("Background treatment rules").optional() }).catchall(import_zod.z.any()).describe("Layout composition rules including overlays, textures, and backgrounds").optional(), "border_radius": import_zod.z.object({ "none": import_zod.z.string().describe("Explicitly sharp corners (e.g., '0')").optional(), "default": import_zod.z.string().describe("Default border radius for UI components (e.g., '8px', '12px', '0'). For graphic/illustration elements, see graphic_style.corner_radius.").optional(), "small": import_zod.z.string().describe("Small border radius for compact elements (e.g., '4px')").optional(), "large": import_zod.z.string().describe("Large border radius for cards and containers (e.g., '16px', '24px')").optional(), "pill": import_zod.z.string().describe("Fully rounded / pill shape (e.g., '999px')").optional() }).catchall(import_zod.z.string()).describe("Named border radius presets for UI components and layout elements. One of the most visible brand differentiators \u2014 Airbnb uses generous 20px, Stripe uses precise 4\u20138px, Spotify uses pill/999px.").optional(), "elevation": import_zod.z.object({ "none": import_zod.z.string().describe("No shadow (e.g., 'none')").optional(), "subtle": import_zod.z.string().describe("Subtle shadow for slight lift (e.g., '0 1px 2px rgba(0,0,0,0.05)')").optional(), "card": import_zod.z.string().describe("Card-level shadow (e.g., '0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.1)')").optional(), "modal": import_zod.z.string().describe("Modal/overlay shadow (e.g., '0 20px 25px -5px rgba(0,0,0,0.1), 0 8px 10px -6px rgba(0,0,0,0.1)')").optional() }).catchall(import_zod.z.string()).describe("Named shadow/elevation levels. Brands use elevation as identity \u2014 from Stripe's blue-tinted multi-layer shadows to Apple's single diffuse shadow. Values are CSS box-shadow syntax.").optional(), "spacing": import_zod.z.object({ "unit": import_zod.z.string().describe("Base grid unit this scale was designed from (e.g., '8px', '4px'). Informational \u2014 agents should use the named scale values, not compute from this.").optional(), "scale": import_zod.z.object({ "xs": import_zod.z.string().describe("Extra small spacing (e.g., '4px')").optional(), "sm": import_zod.z.string().describe("Small spacing (e.g., '8px')").optional(), "md": import_zod.z.string().describe("Medium spacing (e.g., '16px')").optional(), "lg": import_zod.z.string().describe("Large spacing (e.g., '24px')").optional(), "xl": import_zod.z.string().describe("Extra large spacing (e.g., '32px')").optional(), "2xl": import_zod.z.string().describe("Section-level spacing (e.g., '48px', '64px')").optional() }).catchall(import_zod.z.string()).describe("Named spacing scale built from the base unit").optional() }).strict().describe("Spacing system for consistent layout rhythm. Most design systems use an 8px base grid.").optional(), "graphic_elements": import_zod.z.array(import_zod.z.object({ "name": import_zod.z.string().describe("Element name (e.g., 'Paper Tear', 'Brand Watermark', 'Section Divider')"), "type": import_zod.z.enum(["border", "divider", "frame", "watermark", "pattern", "texture_overlay", "decorative"]).describe("Element type").optional(), "description": import_zod.z.string().describe("How the element is used in layouts").optional(), "orientation": import_zod.z.enum(["horizontal", "vertical", "any"]).describe("Preferred orientation when used in layouts").optional(), "colors": import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("A single hex color value")).describe("Colors this element may appear in").optional(), "max_per_layout": import_zod.z.number().int().describe("Maximum instances per layout").optional() }).catchall(import_zod.z.any()).describe("A reusable decorative or structural visual element that is part of the brand identity (e.g., torn paper edges, watermarks, dividers, background patterns)")).describe("Reusable decorative elements that are part of the brand visual identity (e.g., torn paper edges, watermarks, dividers)").optional(), "motion": import_zod.z.object({ "transition_style": import_zod.z.enum(["cut", "dissolve", "slide", "wipe", "zoom", "fade"]).describe("Primary transition style between scenes").optional(), "animation_speed": import_zod.z.enum(["slow", "moderate", "fast"]).describe("Overall animation pacing").optional(), "easing": import_zod.z.string().describe("Default easing function (e.g., 'ease-in-out', 'spring', 'linear')").optional(), "text_entrance": import_zod.z.enum(["fade", "typewriter", "slide_up", "slide_left", "scale", "none"]).describe("How text enters the frame").optional(), "pacing": import_zod.z.enum(["lingering", "moderate", "fast_cuts"]).describe("Overall editing rhythm").optional(), "kinetic_typography": import_zod.z.boolean().describe("Whether animated/kinetic typography is allowed").optional(), "tags": import_zod.z.array(import_zod.z.string()).describe("Additional motion style descriptors").optional() }).catchall(import_zod.z.any()).describe("Motion and animation rules for video, animated display, and interactive formats").optional(), "logo_placement": import_zod.z.object({ "preferred_position": import_zod.z.enum(["top-left", "top-center", "top-right", "bottom-left", "bottom-center", "bottom-right", "center"]).describe("Preferred logo position in layouts").optional(), "min_clear_space": import_zod.z.string().describe("Minimum clear space around the logo, expressed as a multiple of logo height (e.g., '0.5x', '1x') or fixed value (e.g., '16px')").optional(), "min_height": import_zod.z.string().describe("Minimum logo height to maintain legibility (e.g., '40px', '24px')").optional(), "background_contrast": import_zod.z.enum(["light_only", "dark_only", "any"]).describe("Permitted background contrast behind logo").optional() }).catchall(import_zod.z.any()).describe("Logo placement and clear space rules for automated creative production").optional(), "colorways": import_zod.z.array(import_zod.z.object({ "name": import_zod.z.string().describe("Colorway name (e.g., 'primary', 'inverted', 'subtle')"), "foreground": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("A single hex color value"), "background": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("A single hex color value"), "accent": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("A single hex color value").optional(), "border": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("A single hex color value").optional(), "cta_foreground": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("CTA text/icon color, if different from foreground").optional(), "cta_background": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("CTA button/container color, if different from accent").optional(), "channels": import_zod.z.array(import_zod.z.string()).describe("Channels or contexts where this colorway applies (e.g., 'online', 'print', 'pos', 'social', 'outdoor'). Omit for universal colorways.").optional() }).catchall(import_zod.z.any()).describe("A named color pairing that defines how colors work together. Colorways ensure foreground/background combinations are always on-brand and accessible.")).describe("Named color pairings for consistent foreground/background combinations").optional(), "color_constraints": import_zod.z.array(import_zod.z.object({ "color": import_zod.z.object({ "kind": import_zod.z.enum(["name", "value", "surface"]).describe("Discriminator for the color reference variant.").optional(), "name": import_zod.z.string().describe("Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}.").optional(), "value": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("Literal hex color when no palette key exists.").optional(), "surface": import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]).describe("Usage surface rather than a specific color value.").optional() }).strict().and(import_zod.z.union([import_zod.z.object({ "kind": import_zod.z.literal("name") }), import_zod.z.object({ "kind": import_zod.z.literal("value") }), import_zod.z.object({ "kind": import_zod.z.literal("surface") })])).describe("Color role or value this constraint governs."), "applies_to": import_zod.z.array(import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"])).describe("Surfaces where this color may be used.").optional(), "allowed_on": import_zod.z.array(import_zod.z.object({ "kind": import_zod.z.enum(["name", "value", "surface"]).describe("Discriminator for the color reference variant.").optional(), "name": import_zod.z.string().describe("Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}.").optional(), "value": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("Literal hex color when no palette key exists.").optional(), "surface": import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]).describe("Usage surface rather than a specific color value.").optional() }).strict().and(import_zod.z.union([import_zod.z.object({ "kind": import_zod.z.literal("name") }), import_zod.z.object({ "kind": import_zod.z.literal("value") }), import_zod.z.object({ "kind": import_zod.z.literal("surface") })])).describe("Reference to a brand color or usage surface for machine-readable guideline constraints. Use kind=name for palette lookup keys in colors, kind=value for a literal hex color, and kind=surface for layout surfaces such as background or text.")).describe("Backgrounds, surfaces, or color roles where this color is allowed.").optional(), "forbidden_on": import_zod.z.array(import_zod.z.object({ "kind": import_zod.z.enum(["name", "value", "surface"]).describe("Discriminator for the color reference variant.").optional(), "name": import_zod.z.string().describe("Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}.").optional(), "value": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("Literal hex color when no palette key exists.").optional(), "surface": import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]).describe("Usage surface rather than a specific color value.").optional() }).strict().and(import_zod.z.union([import_zod.z.object({ "kind": import_zod.z.literal("name") }), import_zod.z.object({ "kind": import_zod.z.literal("value") }), import_zod.z.object({ "kind": import_zod.z.literal("surface") })])).describe("Reference to a brand color or usage surface for machine-readable guideline constraints. Use kind=name for palette lookup keys in colors, kind=value for a literal hex color, and kind=surface for layout surfaces such as background or text.")).describe("Backgrounds, surfaces, or color roles where this color is forbidden.").optional(), "never_pair_with": import_zod.z.array(import_zod.z.object({ "kind": import_zod.z.enum(["name", "value", "surface"]).describe("Discriminator for the color reference variant.").optional(), "name": import_zod.z.string().describe("Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}.").optional(), "value": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("Literal hex color when no palette key exists.").optional(), "surface": import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]).describe("Usage surface rather than a specific color value.").optional() }).strict().and(import_zod.z.union([import_zod.z.object({ "kind": import_zod.z.literal("name") }), import_zod.z.object({ "kind": import_zod.z.literal("value") }), import_zod.z.object({ "kind": import_zod.z.literal("surface") })])).describe("Reference to a brand color or usage surface for machine-readable guideline constraints. Use kind=name for palette lookup keys in colors, kind=value for a literal hex color, and kind=surface for layout surfaces such as background or text.")).describe("Color roles or values that must not be paired with this color.").optional(), "contexts": import_zod.z.array(import_zod.z.string()).describe("Channels or creative contexts where this constraint applies, such as digital, print, social, or ctv_end_card.").optional(), "severity": import_zod.z.enum(["must", "should"]).describe("Strength of a machine-readable brand guideline constraint.").optional(), "description": import_zod.z.string().describe("Human-readable rationale or source-language summary for the rule.").optional() }).catchall(import_zod.z.any()).describe("Machine-readable rule constraining how a brand color may be used or paired. Use for accent-only colors, forbidden foreground/background combinations, and palette pairs that should never appear together.")).describe("Machine-readable constraints for color usage and pairings, such as accent-only rules or forbidden foreground/background combinations.").optional(), "logo_usage_rules": import_zod.z.array(import_zod.z.object({ "logo_url": import_zod.z.string().url().describe("Specific logo asset URL this rule applies to. Omit when the rule applies by variant or tags.").optional(), "logo_id": import_zod.z.string().regex(new RegExp("^[a-z0-9][a-z0-9_-]*$")).describe("Stable `logos[].id` this rule applies to. Prefer this over logo_url when the rule targets a specific logo entry.").optional(), "logo_variant": import_zod.z.enum(["primary", "secondary", "icon", "wordmark", "full-lockup"]).describe("Logo variant this rule applies to.").optional(), "logo_tags": import_zod.z.array(import_zod.z.string()).describe("Logo tags this rule applies to.").optional(), "contexts": import_zod.z.array(import_zod.z.string()).describe("Creative contexts where this rule applies.").optional(), "slots": import_zod.z.array(import_zod.z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical renderer slots where this rule applies. Use this for deterministic logo-card, profile-mark, end-card, and lockup selection.").optional(), "minimum_size": import_zod.z.object({ "width": import_zod.z.string().describe("Minimum width, such as 48px or 12mm.").optional(), "height": import_zod.z.string().describe("Minimum height, such as 18px or 6mm.").optional() }).strict().describe("Minimum rendered size needed for legibility.").optional(), "clear_space": import_zod.z.string().describe("Minimum clear space around the logo, expressed in brand terms or units.").optional(), "allowed_backgrounds": import_zod.z.array(import_zod.z.object({ "kind": import_zod.z.enum(["name", "value", "surface"]).describe("Discriminator for the color reference variant.").optional(), "name": import_zod.z.string().describe("Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}.").optional(), "value": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("Literal hex color when no palette key exists.").optional(), "surface": import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]).describe("Usage surface rather than a specific color value.").optional() }).strict().and(import_zod.z.union([import_zod.z.object({ "kind": import_zod.z.literal("name") }), import_zod.z.object({ "kind": import_zod.z.literal("value") }), import_zod.z.object({ "kind": import_zod.z.literal("surface") })])).describe("Reference to a brand color or usage surface for machine-readable guideline constraints. Use kind=name for palette lookup keys in colors, kind=value for a literal hex color, and kind=surface for layout surfaces such as background or text.")).describe("Background color roles, values, or surfaces where this logo may be placed.").optional(), "forbidden_backgrounds": import_zod.z.array(import_zod.z.object({ "kind": import_zod.z.enum(["name", "value", "surface"]).describe("Discriminator for the color reference variant.").optional(), "name": import_zod.z.string().describe("Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}.").optional(), "value": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("Literal hex color when no palette key exists.").optional(), "surface": import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]).describe("Usage surface rather than a specific color value.").optional() }).strict().and(import_zod.z.union([import_zod.z.object({ "kind": import_zod.z.literal("name") }), import_zod.z.object({ "kind": import_zod.z.literal("value") }), import_zod.z.object({ "kind": import_zod.z.literal("surface") })])).describe("Reference to a brand color or usage surface for machine-readable guideline constraints. Use kind=name for palette lookup keys in colors, kind=value for a literal hex color, and kind=surface for layout surfaces such as background or text.")).describe("Background color roles, values, or surfaces where this logo must not be placed.").optional(), "forbidden_contexts": import_zod.z.array(import_zod.z.string()).describe("Contexts where this logo must not be used, such as photography_without_knockout.").optional(), "severity": import_zod.z.enum(["must", "should"]).describe("Strength of a machine-readable brand guideline constraint.").optional(), "description": import_zod.z.string().describe("Human-readable rationale or source-language summary for the rule.").optional() }).catchall(import_zod.z.any()).and(import_zod.z.union([import_zod.z.any(), import_zod.z.any(), import_zod.z.any(), import_zod.z.any(), import_zod.z.any()])).describe("Machine-readable logo selection and placement rule. Complements logos[].usage by making enforceable minimum size, clear-space, background, and context constraints queryable.")).describe("Machine-readable logo selection and placement constraints for minimum size, clear space, backgrounds, and contexts.").optional(), "mark_lockups": import_zod.z.array(import_zod.z.object({ "lockup_type": import_zod.z.enum(["co_brand", "secondary_mark", "partner", "sponsor", "program", "talent", "custom"]).describe("Type of mark relationship governed by this lockup rule."), "ordering": import_zod.z.enum(["brand_first", "partner_first", "equal", "contextual"]).describe("Required visual ordering of the brand mark relative to partner or secondary marks.").optional(), "contexts": import_zod.z.array(import_zod.z.string()).describe("Creative contexts where this lockup rule applies.").optional(), "brand_logo_id": import_zod.z.string().regex(new RegExp("^[a-z0-9][a-z0-9_-]*$")).describe("Stable `logos[].id` for the brand logo this lockup rule is anchored on.").optional(), "secondary_logo_ids": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9][a-z0-9_-]*$")).describe("Stable identifier for a logo entry within this brand.json document. Use lowercase words separated by underscores or hyphens; do not key integrations on mutable asset URLs.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable `logos[].id` values for secondary, program, sponsor, or partner marks governed by this lockup rule when those marks are represented in this brand.json.").optional(), "separator": import_zod.z.object({ "type": import_zod.z.enum(["none", "keyline", "space", "divider"]).describe("Separator style."), "color": import_zod.z.object({ "kind": import_zod.z.enum(["name", "value", "surface"]).describe("Discriminator for the color reference variant.").optional(), "name": import_zod.z.string().describe("Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}.").optional(), "value": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("Literal hex color when no palette key exists.").optional(), "surface": import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]).describe("Usage surface rather than a specific color value.").optional() }).strict().and(import_zod.z.union([import_zod.z.object({ "kind": import_zod.z.literal("name") }), import_zod.z.object({ "kind": import_zod.z.literal("value") }), import_zod.z.object({ "kind": import_zod.z.literal("surface") })])).describe("Reference to a brand color or usage surface for machine-readable guideline constraints. Use kind=name for palette lookup keys in colors, kind=value for a literal hex color, and kind=surface for layout surfaces such as background or text.").optional(), "width": import_zod.z.string().describe("Separator width, such as 1px.").optional() }).catchall(import_zod.z.any()).describe("Separator between marks, when required.").optional(), "min_gap": import_zod.z.string().describe("Minimum gap between marks, expressed in brand terms or units.").optional(), "brand_min_optical_weight_ratio": import_zod.z.number().gt(0).describe("Minimum optical weight of the brand mark relative to partner marks. 1 means at least equal.").optional(), "partner_max_optical_weight_ratio": import_zod.z.number().gt(0).describe("Maximum optical weight of partner marks relative to the brand mark. 1 means no larger than the brand mark. Enforcement is at layout time, not parse time \u2014 this value signals to renderers and creative agents how much space to provision for each mark.").optional(), "severity": import_zod.z.enum(["must", "should"]).describe("Strength of a machine-readable brand guideline constraint.").optional(), "description": import_zod.z.string().describe("Human-readable rationale or source-language summary for the lockup rule.").optional() }).catchall(import_zod.z.any()).describe("Machine-readable layout constraints for co-brand, partner, sponsor, program, or secondary-mark lockups.")).describe("Machine-readable co-brand, partner, sponsor, program, or secondary-mark lockup rules.").optional(), "type_scale": import_zod.z.object({ "base_width": import_zod.z.string().describe("Reference canvas width these sizes were designed for (e.g., '1080px'). Generative systems should scale proportionally for other canvas sizes.").optional(), "heading": import_zod.z.object({ "font": import_zod.z.string().describe("Font reference. Use a key from the fonts object (e.g., 'primary', 'secondary') to reference a defined font role, or a literal CSS font-family string as a fallback.").optional(), "size": import_zod.z.string().describe("Font size (e.g., '48px', '2rem')").optional(), "weight": import_zod.z.string().describe("Font weight (e.g., '700', 'bold')").optional(), "line_height": import_zod.z.string().describe("Line height (e.g., '1.2', '56px')").optional(), "letter_spacing": import_zod.z.string().describe("Letter spacing (e.g., '-0.02em', '0.5px')").optional(), "text_transform": import_zod.z.enum(["none", "uppercase", "lowercase", "capitalize"]).describe("Text transformation").optional() }).catchall(import_zod.z.any()).describe("A single entry in the type scale").optional(), "subheading": import_zod.z.object({ "font": import_zod.z.string().describe("Font reference. Use a key from the fonts object (e.g., 'primary', 'secondary') to reference a defined font role, or a literal CSS font-family string as a fallback.").optional(), "size": import_zod.z.string().describe("Font size (e.g., '48px', '2rem')").optional(), "weight": import_zod.z.string().describe("Font weight (e.g., '700', 'bold')").optional(), "line_height": import_zod.z.string().describe("Line height (e.g., '1.2', '56px')").optional(), "letter_spacing": import_zod.z.string().describe("Letter spacing (e.g., '-0.02em', '0.5px')").optional(), "text_transform": import_zod.z.enum(["none", "uppercase", "lowercase", "capitalize"]).describe("Text transformation").optional() }).catchall(import_zod.z.any()).describe("A single entry in the type scale").optional(), "body": import_zod.z.object({ "font": import_zod.z.string().describe("Font reference. Use a key from the fonts object (e.g., 'primary', 'secondary') to reference a defined font role, or a literal CSS font-family string as a fallback.").optional(), "size": import_zod.z.string().describe("Font size (e.g., '48px', '2rem')").optional(), "weight": import_zod.z.string().describe("Font weight (e.g., '700', 'bold')").optional(), "line_height": import_zod.z.string().describe("Line height (e.g., '1.2', '56px')").optional(), "letter_spacing": import_zod.z.string().describe("Letter spacing (e.g., '-0.02em', '0.5px')").optional(), "text_transform": import_zod.z.enum(["none", "uppercase", "lowercase", "capitalize"]).describe("Text transformation").optional() }).catchall(import_zod.z.any()).describe("A single entry in the type scale").optional(), "caption": import_zod.z.object({ "font": import_zod.z.string().describe("Font reference. Use a key from the fonts object (e.g., 'primary', 'secondary') to reference a defined font role, or a literal CSS font-family string as a fallback.").optional(), "size": import_zod.z.string().describe("Font size (e.g., '48px', '2rem')").optional(), "weight": import_zod.z.string().describe("Font weight (e.g., '700', 'bold')").optional(), "line_height": import_zod.z.string().describe("Line height (e.g., '1.2', '56px')").optional(), "letter_spacing": import_zod.z.string().describe("Letter spacing (e.g., '-0.02em', '0.5px')").optional(), "text_transform": import_zod.z.enum(["none", "uppercase", "lowercase", "capitalize"]).describe("Text transformation").optional() }).catchall(import_zod.z.any()).describe("A single entry in the type scale").optional(), "cta": import_zod.z.object({ "font": import_zod.z.string().describe("Font reference. Use a key from the fonts object (e.g., 'primary', 'secondary') to reference a defined font role, or a literal CSS font-family string as a fallback.").optional(), "size": import_zod.z.string().describe("Font size (e.g., '48px', '2rem')").optional(), "weight": import_zod.z.string().describe("Font weight (e.g., '700', 'bold')").optional(), "line_height": import_zod.z.string().describe("Line height (e.g., '1.2', '56px')").optional(), "letter_spacing": import_zod.z.string().describe("Letter spacing (e.g., '-0.02em', '0.5px')").optional(), "text_transform": import_zod.z.enum(["none", "uppercase", "lowercase", "capitalize"]).describe("Text transformation").optional() }).catchall(import_zod.z.any()).describe("A single entry in the type scale").optional() }).catchall(import_zod.z.object({ "font": import_zod.z.string().describe("Font reference. Use a key from the fonts object (e.g., 'primary', 'secondary') to reference a defined font role, or a literal CSS font-family string as a fallback.").optional(), "size": import_zod.z.string().describe("Font size (e.g., '48px', '2rem')").optional(), "weight": import_zod.z.string().describe("Font weight (e.g., '700', 'bold')").optional(), "line_height": import_zod.z.string().describe("Line height (e.g., '1.2', '56px')").optional(), "letter_spacing": import_zod.z.string().describe("Letter spacing (e.g., '-0.02em', '0.5px')").optional(), "text_transform": import_zod.z.enum(["none", "uppercase", "lowercase", "capitalize"]).describe("Text transformation").optional() }).catchall(import_zod.z.any()).describe("A single entry in the type scale")).describe("Typography scale defining sizes and weights for different text roles. When sizes are in px, use base_width to indicate the reference canvas.").optional(), "asset_libraries": import_zod.z.array(import_zod.z.object({ "name": import_zod.z.string().describe("Display name of the asset library"), "type": import_zod.z.enum(["icon_set", "illustration_system", "image_library", "video_library", "template_library"]).describe("Type of asset library").optional(), "url": import_zod.z.string().url().describe("URL to the asset library (for human access)"), "description": import_zod.z.string().describe("Description of the library contents and usage").optional(), "color_guide": import_zod.z.object({ "roles": import_zod.z.array(import_zod.z.string()).describe("Named color roles used in the library (e.g., base, shadow_1, highlight_1, stroke)").optional(), "palettes": import_zod.z.array(import_zod.z.object({ "name": import_zod.z.string().describe("Palette name"), "colors": import_zod.z.record(import_zod.z.string(), import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("A single hex color value")).describe("Map of role names to hex color values") }).catchall(import_zod.z.any())).describe("Named color palettes mapping roles to specific colors").optional() }).catchall(import_zod.z.any()).describe("Color guide for the asset library defining roles and palettes").optional() }).catchall(import_zod.z.any()).describe("A managed asset library (icon set, illustration system, image collection). The URL is for human access; agent-facing DAM integration is under investigation.")).describe("References to managed asset libraries (icon sets, illustration systems, image collections). URLs are intended for human access; agent-facing DAM integration is under investigation.").optional(), "restrictions": import_zod.z.array(import_zod.z.string()).describe("Visual prohibitions and guardrails (e.g., 'Never use black backgrounds', 'Do not crop the logo', 'No stock photography of people on phones')").optional() }).catchall(import_zod.z.any()).describe("Structured visual rules for generative creative systems").optional(), "agents": import_zod.z.array(import_zod.z.object({ "type": import_zod.z.enum(["brand", "rights", "measurement", "governance", "creative", "sales", "buying", "signals"]).describe("Functional role of this agent"), "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("Agent endpoint URL (MCP or A2A). Callers comparing a brand's declared agent URL against another value (e.g., resolving 'is this the agent that signed this artifact?' or matching against a discovery cache) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. After the publication chain and an authorized request-signing key verify, this exact entry's canonical URL is the stable Agent identity input for principal mapping; the domain, JWKS URI, kid, and key material are credential or trust facts beneath it, not the Agent identity. See docs/reference/url-canonicalization."), "id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).max(100).describe("Agent identifier (useful for logging, multi-tenant platforms)"), "description": import_zod.z.string().max(500).describe("Human-readable description of this agent's capabilities or scope").optional(), "jwks_uri": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL of the agent's JWKS (RFC 7517) containing public keys used to verify artifacts this agent signs or requests it sends. Verified artifacts include signed governance_context tokens (for governance agents) and RFC 9421 HTTP Signatures on outgoing requests (for any agent). When absent, verifiers MUST default to /.well-known/jwks.json on the origin of `url`. Keys are identified by `kid` in the JWS header or RFC 9421 `keyid` parameter; JWKS MAY contain multiple keys to support rotation and per-purpose separation via `key_ops` and `use`.").optional(), "available_uses": import_zod.z.array(import_zod.z.enum(["likeness", "voice", "name", "endorsement", "motion_capture", "signature", "catchphrase", "sync", "background_music", "editorial", "commercial", "ai_generated_image"]).describe("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.")).describe("For rights agents: rights uses available for licensing").optional(), "right_types": import_zod.z.array(import_zod.z.enum(["talent", "character", "brand_ip", "music", "stock_media"]).describe("Categories of intellectual property rights that can be licensed through the brand protocol.")).describe("For rights agents: types of rights available").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).describe("ISO 3166-1 alpha-2 country codes where this agent operates. Omit for global scope.").optional() }).catchall(import_zod.z.any()).describe("An agent declared by a brand or house. Each entry identifies one agent endpoint and its functional role in the advertising ecosystem.")).describe("Agents authorized to act on behalf of this brand. Consumers resolving an agent by URL use the matching brand-level entry; do not infer a type-wide override of unrelated house-level entries when multiple same-type entries exist.").optional(), "brand_agent": import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("Brand agent MCP endpoint URL. Callers comparing this URL against another value (e.g., resolving 'is this the brand's declared agent?' against a discovery cache) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. See docs/reference/url-canonicalization."), "id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Agent identifier (useful for logging, multi-tenant DAMs)") }).catchall(import_zod.z.any()).describe("Deprecated: use agents array with type 'brand' instead. Brand agent that provides dynamic brand data via MCP.").optional(), "rights_agent": import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("Rights agent MCP endpoint URL. Callers comparing this URL against another value (e.g., matching against a brand's declared rights endpoint) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. See docs/reference/url-canonicalization."), "id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Agent identifier"), "available_uses": import_zod.z.array(import_zod.z.enum(["likeness", "voice", "name", "endorsement", "motion_capture", "signature", "catchphrase", "sync", "background_music", "editorial", "commercial", "ai_generated_image"]).describe("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.")).describe("Rights uses available for licensing through this agent"), "right_types": import_zod.z.array(import_zod.z.enum(["talent", "character", "brand_ip", "music", "stock_media"]).describe("Categories of intellectual property rights that can be licensed through the brand protocol.")).describe("Types of rights available").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).describe("Countries where rights are available (ISO 3166-1 alpha-2)").optional() }).catchall(import_zod.z.any()).describe("Deprecated: use agents array with type 'rights' instead. Rights licensing agent for this brand.").optional(), "contact": import_zod.z.object({ "email": import_zod.z.string().email().describe("Contact email").optional(), "phone": import_zod.z.string().describe("Contact phone number").optional() }).describe("Brand-level contact information").optional(), "collections": import_zod.z.array(import_zod.z.object({ "collection_id": import_zod.z.string().describe("Collection identifier as used in the seller's get_products responses").optional(), "name": import_zod.z.string().describe("Human-readable collection name"), "role": import_zod.z.enum(["host", "guest", "creator", "cast", "narrator", "producer", "correspondent", "commentator", "analyst"]).describe("This person's role on the collection").optional(), "seller_agent_url": import_zod.z.string().url().describe("URL of the sales agent that sells inventory for this collection. Buyer agents can query this agent for collection products.").optional() }).catchall(import_zod.z.any())).describe("Collections this person or brand is associated with. Enables bidirectional linking: a collection's talent references brand.json via brand_url, and brand.json links back to collections.").optional() }).catchall(import_zod.z.any()).describe("A brand within a house portfolio. Combines identity (who) with creative assets (how to represent). Referenced as domain + brand_id."))).describe("Self-published brand document where the brand owns its own identity attributes. Optionally declares its house via house_domain; for trust, the named house's brand_refs[] must reciprocate (mutual assertion). Standalone brands (no parent house) omit house_domain. Hosted at the brand's own /.well-known/brand.json (or via authoritative_location indirection). See docs/brand-protocol/brand-json.mdx")]).describe("Brand identity and discovery file. Hosted at /.well-known/brand.json on house domains. Contains the full brand portfolio with identity, creative assets, and digital properties. Brands are identified by house + brand_id (like properties are identified by publisher + property_id). Supports variants: house portfolio (full brand data), brand agent (agent provides brand info via MCP), house redirect (pointer to house domain), or authoritative location redirect.");
26
+ const BrandJsonSchema = import_zod.z.union([import_zod.z.object({ "$schema": import_zod.z.string().optional(), "authoritative_location": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL of the authoritative brand.json file"), "redirect_reason": import_zod.z.enum(["acquisition", "divestiture", "rebrand", "regional", "legacy", "consolidation", "other"]).describe("Optional structured signal indicating why this redirect was put in place. Consumers SHOULD use this to inform cache TTL decisions: 'acquisition' / 'divestiture' / 'rebrand' / 'consolidation' suggest the resolved target is in transition and consumers SHOULD shorten cache TTL until stable. 'regional' / 'legacy' suggest a stable redirect with no special cache handling needed. Free-text rationale belongs in 'note'.").optional(), "redirect_effective_at": import_zod.z.string().datetime().describe("Optional timestamp when this redirect became effective. Caches MUST treat any entry cached before this timestamp as stale and re-fetch through the redirect.").optional(), "note": import_zod.z.string().describe("Optional human-readable rationale for the redirect.").optional(), "last_updated": import_zod.z.string().datetime().optional() }).strict().describe("Redirects to a hosted brand.json file at another URL"), import_zod.z.object({ "$schema": import_zod.z.string().optional(), "house": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("House domain to fetch brand portfolio from"), "region": import_zod.z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code if this is a regional domain").optional(), "redirect_reason": import_zod.z.enum(["acquisition", "divestiture", "rebrand", "regional", "legacy", "consolidation", "other"]).describe("Optional structured signal indicating why this redirect was put in place. Consumers SHOULD use this to inform cache TTL decisions: 'acquisition' / 'divestiture' / 'rebrand' / 'consolidation' suggest the resolved target is in transition and consumers SHOULD shorten cache TTL until stable. 'regional' / 'legacy' suggest a stable redirect with no special cache handling needed. Free-text rationale belongs in 'note'.").optional(), "redirect_effective_at": import_zod.z.string().datetime().describe("Optional timestamp when this redirect became effective. Caches MUST treat any entry cached before this timestamp as stale and re-fetch through the redirect.").optional(), "note": import_zod.z.string().describe("Optional human-readable rationale for the redirect.").optional(), "last_updated": import_zod.z.string().datetime().optional() }).strict().describe("Redirects to the house domain that contains the full brand portfolio"), import_zod.z.object({ "$schema": import_zod.z.string().optional(), "version": import_zod.z.string().optional(), "agents": import_zod.z.array(import_zod.z.object({ "type": import_zod.z.enum(["brand", "rights", "measurement", "governance", "creative", "sales", "buying", "signals"]).describe("Functional role of this agent"), "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("Agent endpoint URL (MCP or A2A). Callers comparing a brand's declared agent URL against another value (e.g., resolving 'is this the agent that signed this artifact?' or matching against a discovery cache) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. After the publication chain and an authorized request-signing key verify, this exact entry's canonical URL is the stable Agent identity input for principal mapping; the domain, JWKS URI, kid, and key material are credential or trust facts beneath it, not the Agent identity. See docs/reference/url-canonicalization."), "id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).max(100).describe("Agent identifier (useful for logging, multi-tenant platforms)"), "description": import_zod.z.string().max(500).describe("Human-readable description of this agent's capabilities or scope").optional(), "jwks_uri": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL of the agent's JWKS (RFC 7517) containing public keys used to verify artifacts this agent signs or requests it sends. Verified artifacts include signed governance_context tokens (for governance agents) and RFC 9421 HTTP Signatures on outgoing requests (for any agent). When absent, verifiers MUST default to /.well-known/jwks.json on the origin of `url`. Keys are identified by `kid` in the JWS header or RFC 9421 `keyid` parameter; JWKS MAY contain multiple keys to support rotation and per-purpose separation via `key_ops` and `use`.").optional(), "available_uses": import_zod.z.array(import_zod.z.enum(["likeness", "voice", "name", "endorsement", "motion_capture", "signature", "catchphrase", "sync", "background_music", "editorial", "commercial", "ai_generated_image"]).describe("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.")).describe("For rights agents: rights uses available for licensing").optional(), "right_types": import_zod.z.array(import_zod.z.enum(["talent", "character", "brand_ip", "music", "stock_media"]).describe("Categories of intellectual property rights that can be licensed through the brand protocol.")).describe("For rights agents: types of rights available").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).describe("ISO 3166-1 alpha-2 country codes where this agent operates. Omit for global scope.").optional() }).catchall(import_zod.z.any()).describe("An agent declared by a brand or house. Each entry identifies one agent endpoint and its functional role in the advertising ecosystem.")).describe("Agents declared by this brand or house. Multiple entries with the same type are permitted when they have distinct url values, such as one endpoint URL per tenant or property scope. Agent url values MUST be unique within this array; duplicate urls are invalid because signature verifiers resolve a signing key by matching one agent url to one agents[] entry and reject ambiguous matches.").optional(), "brand_agent": import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("Brand agent MCP endpoint URL. Callers comparing this URL against another value (e.g., resolving 'is this the brand's declared agent?' against a discovery cache) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. See docs/reference/url-canonicalization."), "id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Agent identifier (useful for logging, multi-tenant DAMs)") }).catchall(import_zod.z.any()).describe("Reference to a brand agent that provides brand data via MCP").optional(), "contact": import_zod.z.object({ "name": import_zod.z.string().min(1).max(255), "email": import_zod.z.string().email().max(255).optional(), "domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("A valid domain name").optional() }).catchall(import_zod.z.any()).describe("Contact information").optional(), "data_subject_contestation": import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL to a human-accessible contestation form or information page.").optional(), "email": import_zod.z.string().email().describe("Email address for contestation requests. Deployer MUST monitor and respond within the timelines set by applicable law (e.g., 1 month under GDPR Art. 12(3)).").optional(), "languages": import_zod.z.array(import_zod.z.string()).describe("BCP 47 language tags the contestation channel supports (e.g., ['en', 'de', 'fr']). At minimum SHOULD include a language spoken in every jurisdiction where the brand runs regulated-vertical campaigns.").optional() }).strict().and(import_zod.z.union([import_zod.z.any(), import_zod.z.any()])).describe("Contact point where a data subject can request human intervention, express their view, or contest an automated decision \u2014 satisfying GDPR Article 22(3) and EU AI Act Article 26(11) transparency obligations. This is a contact reference (URL, email, or both), not a machine-callable API. AdCP surfaces the pointer; the deployer runs the contestation workflow.").optional(), "last_updated": import_zod.z.string().datetime().optional() }).strict().and(import_zod.z.union([import_zod.z.any(), import_zod.z.any()])).describe("Brand represented by agents that provide brand info via MCP"), import_zod.z.object({ "$schema": import_zod.z.string().optional(), "version": import_zod.z.string().optional(), "default_language": import_zod.z.string().regex(new RegExp("^(?:[a-z]{2,8}(?:-[A-Z][a-z]{3})?(?:-(?:[A-Z]{2}|[0-9]{3}))?(?:-(?:[a-z0-9]{5,8}|[0-9][a-z0-9]{3}))*(?:-[0-9a-wy-z](?:-[a-z0-9]{2,8})+)*(?:-x(?:-[a-z0-9]{1,8})+)?|x(?:-[a-z0-9]{1,8})+)$")).min(2).max(63).describe("A well-formed BCP 47 language tag used by AdCP only as language identity. Script and region may refine that identity; other valid BCP 47 subtags remain part of tag matching but do not make this a general locale-settings object. It does not determine currency, time zone, number/date formatting, market, or legal jurisdiction. The AdCP canonical wire profile requires lower-case language and variants, title-case script, and upper-case region (for example `en-US`, `zh-Hant-TW`, or `x-private`). RFC 5646 comparisons are case-insensitive and its case regularization is optional; AdCP intentionally requires this stricter single wire spelling and receivers MUST reject differently cased tags rather than silently normalizing them. The schema pattern enforces the AdCP casing profile and extension structure for commonly used tags; conforming receivers additionally validate the complete RFC 5646 grammar and registry rules. Every new AdCP field carrying BCP 47 language identity or a concrete language range MUST reference this schema instead of declaring independent string constraints.").describe("BCP 47 language tag for legacy plain-string and plain-array content in this document. Readers assume en when omitted.").default("en"), "house": import_zod.z.object({ "domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("The house's domain where brand.json is hosted"), "name": import_zod.z.string().min(1).describe("Primary display name of the house"), "names": import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.string().min(1)).describe("A localized name using the legacy underscore-separated language/region key convention (for example 'en_US', 'fr_CA', or 'zh_CN') and a name value. Bare language codes such as 'en' are also accepted for backwards compatibility. These keys are not AdCP locale-tag values: a bridge to /schemas/core/locale-tag.json replaces '_' with '-', applies the AdCP canonical wire profile, and validates the result rather than passing the key through unchanged.")).describe("Localized house names including legal name, stock symbol, etc.").optional(), "architecture": import_zod.z.enum(["branded_house", "house_of_brands", "hybrid"]).describe("Brand architecture model: branded_house (Google), house_of_brands (P&G), hybrid (Nike)").optional(), "agents": import_zod.z.array(import_zod.z.object({ "type": import_zod.z.enum(["brand", "rights", "measurement", "governance", "creative", "sales", "buying", "signals"]).describe("Functional role of this agent"), "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("Agent endpoint URL (MCP or A2A). Callers comparing a brand's declared agent URL against another value (e.g., resolving 'is this the agent that signed this artifact?' or matching against a discovery cache) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. After the publication chain and an authorized request-signing key verify, this exact entry's canonical URL is the stable Agent identity input for principal mapping; the domain, JWKS URI, kid, and key material are credential or trust facts beneath it, not the Agent identity. See docs/reference/url-canonicalization."), "id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).max(100).describe("Agent identifier (useful for logging, multi-tenant platforms)"), "description": import_zod.z.string().max(500).describe("Human-readable description of this agent's capabilities or scope").optional(), "jwks_uri": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL of the agent's JWKS (RFC 7517) containing public keys used to verify artifacts this agent signs or requests it sends. Verified artifacts include signed governance_context tokens (for governance agents) and RFC 9421 HTTP Signatures on outgoing requests (for any agent). When absent, verifiers MUST default to /.well-known/jwks.json on the origin of `url`. Keys are identified by `kid` in the JWS header or RFC 9421 `keyid` parameter; JWKS MAY contain multiple keys to support rotation and per-purpose separation via `key_ops` and `use`.").optional(), "available_uses": import_zod.z.array(import_zod.z.enum(["likeness", "voice", "name", "endorsement", "motion_capture", "signature", "catchphrase", "sync", "background_music", "editorial", "commercial", "ai_generated_image"]).describe("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.")).describe("For rights agents: rights uses available for licensing").optional(), "right_types": import_zod.z.array(import_zod.z.enum(["talent", "character", "brand_ip", "music", "stock_media"]).describe("Categories of intellectual property rights that can be licensed through the brand protocol.")).describe("For rights agents: types of rights available").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).describe("ISO 3166-1 alpha-2 country codes where this agent operates. Omit for global scope.").optional() }).catchall(import_zod.z.any()).describe("An agent declared by a brand or house. Each entry identifies one agent endpoint and its functional role in the advertising ecosystem.")).describe("House-level agents that apply to all brands unless overridden at the brand level").optional(), "data_subject_contestation": import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL to a human-accessible contestation form or information page.").optional(), "email": import_zod.z.string().email().describe("Email address for contestation requests. Deployer MUST monitor and respond within the timelines set by applicable law (e.g., 1 month under GDPR Art. 12(3)).").optional(), "languages": import_zod.z.array(import_zod.z.string()).describe("BCP 47 language tags the contestation channel supports (e.g., ['en', 'de', 'fr']). At minimum SHOULD include a language spoken in every jurisdiction where the brand runs regulated-vertical campaigns.").optional() }).strict().and(import_zod.z.union([import_zod.z.any(), import_zod.z.any()])).describe("House-level fallback contestation contact. Governance agents resolve in order: brand.data_subject_contestation \u2192 house.data_subject_contestation \u2192 missing (critical finding when human review required).").optional(), "identity_relying_parties": import_zod.z.array(import_zod.z.object({ "issuer": import_zod.z.object({ "domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where /.well-known/brand.json is hosted, or the brand's operating domain"), "brand_id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand identifier within the house portfolio. Optional for single-brand domains.").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("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.").optional(), "industries": import_zod.z.array(import_zod.z.string()).describe("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.").optional(), "data_subject_contestation": import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).optional(), "email": import_zod.z.string().email().optional(), "languages": import_zod.z.array(import_zod.z.string()).optional() }).strict().and(import_zod.z.union([import_zod.z.any(), import_zod.z.any()])).describe("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.").optional(), "brand_kit_override": import_zod.z.object({ "logo": import_zod.z.object({ "asset_type": import_zod.z.literal("image").describe("Discriminator identifying this as an image asset. See /schemas/creative/asset-types for the registry."), "url": import_zod.z.string().url().describe("URL to the image asset"), "width": import_zod.z.number().int().gte(1).describe("Width in pixels"), "height": import_zod.z.number().int().gte(1).describe("Height in pixels"), "file_size_bytes": import_zod.z.number().int().gte(1).describe("Image file size in bytes. Required by agents that advertise a max_file_size_kb constraint.").optional(), "pixel_ratio": import_zod.z.number().gt(0).describe("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.").optional(), "state_id": import_zod.z.string().describe("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.").optional(), "breakpoint_id": import_zod.z.string().describe("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.").optional(), "focal_point": import_zod.z.array(import_zod.z.number().gte(0).lte(1)).max(2).describe("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.").optional(), "format": import_zod.z.string().describe("Image file format (jpg, png, gif, webp, etc.)").optional(), "alt_text": import_zod.z.string().describe("Alternative text for accessibility").optional(), "provenance": import_zod.z.object({ "digital_source_type": import_zod.z.enum(["digital_capture", "digital_creation", "trained_algorithmic_media", "composite_with_trained_algorithmic_media", "algorithmic_media", "composite_capture", "composite_synthetic", "human_edits", "data_driven_media"]).describe("IPTC-aligned classification of AI involvement in producing this content").optional(), "synthetic_depiction": import_zod.z.boolean().describe("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`.").optional(), "ai_tool": import_zod.z.object({ "name": import_zod.z.string().describe("Name of the AI tool or model (e.g., 'DALL-E 3', 'Stable Diffusion XL', 'Gemini')"), "version": import_zod.z.string().describe("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.").optional(), "provider": import_zod.z.string().describe("Organization that provides the AI tool (e.g., 'OpenAI', 'Stability AI', 'Google')").optional() }).describe("AI system used to generate or modify this content. Aligns with IPTC 2025.1 AI metadata fields and C2PA claim_generator.").optional(), "human_oversight": import_zod.z.enum(["none", "prompt_only", "selected", "edited", "directed"]).describe("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`.").optional(), "declared_by": import_zod.z.object({ "agent_url": import_zod.z.string().url().describe("URL of the agent or service that declared this provenance").optional(), "role": import_zod.z.enum(["creator", "advertiser", "agency", "platform", "tool"]).describe("Role of the declaring party in the supply chain") }).describe("Party declaring this provenance. Identifies who attached the provenance claim, enabling receiving parties to assess trust.").optional(), "declared_at": import_zod.z.string().datetime().describe("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.").optional(), "created_time": import_zod.z.string().datetime().describe("When this content was created or generated (ISO 8601)").optional(), "c2pa": import_zod.z.object({ "manifest_url": import_zod.z.string().url().describe("URL to the C2PA manifest store for this content") }).describe("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.").optional(), "embedded_provenance": import_zod.z.array(import_zod.z.object({ "method": import_zod.z.enum(["manifest_wrapper", "provenance_markers"]).describe("How provenance data is carried within the content"), "standard": import_zod.z.string().describe("Standard the embedding conforms to, if any (e.g., 'c2pa' for C2PA Section A.7 text manifest embedding)").optional(), "provider": import_zod.z.string().describe("Organization that performed the embedding (e.g., 'Encypher', 'Digimarc'). Display label and audit context \u2014 not a wire identifier."), "verify_agent": import_zod.z.object({ "agent_url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("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."), "feature_id": import_zod.z.string().describe("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.").optional() }).strict().describe("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).").optional(), "embedded_at": import_zod.z.string().datetime().describe("When the provenance data was embedded (ISO 8601)").optional() })).describe("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`).").optional(), "watermarks": import_zod.z.array(import_zod.z.object({ "media_type": import_zod.z.enum(["audio", "image", "video", "text"]).describe("Media category of the watermarked content"), "provider": import_zod.z.string().describe("Organization that applied the watermark (e.g., 'Imatag', 'Steg.AI', 'Encypher'). Display label and audit context \u2014 not a wire identifier."), "verify_agent": import_zod.z.object({ "agent_url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("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."), "feature_id": import_zod.z.string().describe("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.").optional() }).strict().describe("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).").optional(), "c2pa_action": import_zod.z.enum(["c2pa.watermarked.bound", "c2pa.watermarked.unbound"]).describe("C2PA action classification for this watermark").optional(), "embedded_at": import_zod.z.string().datetime().describe("When the watermark was applied (ISO 8601)").optional() })).describe("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`).").optional(), "disclosure": import_zod.z.object({ "required": import_zod.z.boolean().describe("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."), "jurisdictions": import_zod.z.array(import_zod.z.object({ "country": import_zod.z.string().describe("ISO 3166-1 alpha-2 country code (e.g., 'US', 'DE', 'CN')"), "region": import_zod.z.string().describe("Sub-national region code (e.g., 'CA' for California, 'BY' for Bavaria)").optional(), "regulation": import_zod.z.string().describe("Regulation identifier (e.g., 'eu_ai_act_article_50', 'ca_sb_942', 'cn_deep_synthesis')"), "label_text": import_zod.z.string().describe("Required disclosure label text for this jurisdiction, in the local language").optional(), "render_guidance": import_zod.z.object({ "persistence": import_zod.z.enum(["continuous", "initial", "flexible"]).describe("How long the disclosure must persist during content playback or display").optional(), "min_duration_ms": import_zod.z.number().int().gte(1).describe("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.").optional(), "positions": import_zod.z.array(import_zod.z.enum(["prominent", "footer", "audio", "subtitle", "overlay", "end_card", "pre_roll", "companion"]).describe("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.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Preferred disclosure positions in priority order. The first position a format supports should be used.").optional(), "ext": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).describe("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.").optional() }).describe("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.").optional() })).describe("Jurisdictions where disclosure obligations apply").optional() }).describe("Regulatory disclosure requirements for this content. Indicates whether AI disclosure is required and under which jurisdictions.").optional(), "verification": import_zod.z.array(import_zod.z.object({ "verified_by": import_zod.z.string().describe("Name of the verification service (e.g., 'DoubleVerify', 'Hive Moderation', 'Reality Defender')"), "verified_time": import_zod.z.string().datetime().describe("When the verification was performed (ISO 8601)").optional(), "result": import_zod.z.enum(["authentic", "ai_generated", "ai_modified", "inconclusive"]).describe("Verification outcome"), "confidence": import_zod.z.number().gte(0).lte(1).describe("Confidence score of the verification result (0.0 to 1.0)").optional(), "details_url": import_zod.z.string().url().describe("URL to the full verification report").optional() })).describe("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.").optional(), "ext": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).describe("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.").optional() }).describe("Provenance metadata for this asset, overrides manifest-level provenance").optional() }).catchall(import_zod.z.any()).describe("Override logo asset.").optional(), "colors": import_zod.z.object({ "primary": import_zod.z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional(), "secondary": import_zod.z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional(), "accent": import_zod.z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional() }).catchall(import_zod.z.any()).describe("Override brand colors (hex strings).").optional(), "voice": import_zod.z.string().describe("Override brand-voice description for surface-composed text/audio output.").optional(), "tagline": import_zod.z.string().describe("Override tagline.").optional() }).catchall(import_zod.z.any()).describe("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.").optional() }).strict().describe(`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).`), "scheme": import_zod.z.string().describe('Proof scheme and version, e.g. "world_id_v4".').optional(), "relying_party_id": import_zod.z.string().describe("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."), "scope": import_zod.z.enum(["entity", "property"]).describe("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).").optional() }).strict().describe("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.")).describe("Verified-identity relying parties this house/entity operates, so a buyer can verify that a forwarded TMP identity attestation's relying_party_id genuinely belongs to this entity (provenance) rather than being replayed under another owner. For network-as-RP, the network publishes its own relying_party_id here. See specs/tmp-verified-identity-attestation.md.").optional() }).catchall(import_zod.z.any()).describe("Corporate or organizational entity that owns brands"), "brands": import_zod.z.array(import_zod.z.object({ "id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand identifier within the house. House chooses this ID."), "url": import_zod.z.string().url().describe("Primary brand URL for context and asset discovery").optional(), "identity_relying_parties": import_zod.z.array(import_zod.z.object({ "issuer": import_zod.z.object({ "domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where /.well-known/brand.json is hosted, or the brand's operating domain"), "brand_id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand identifier within the house portfolio. Optional for single-brand domains.").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("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.").optional(), "industries": import_zod.z.array(import_zod.z.string()).describe("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.").optional(), "data_subject_contestation": import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).optional(), "email": import_zod.z.string().email().optional(), "languages": import_zod.z.array(import_zod.z.string()).optional() }).strict().and(import_zod.z.union([import_zod.z.any(), import_zod.z.any()])).describe("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.").optional(), "brand_kit_override": import_zod.z.object({ "logo": import_zod.z.object({ "asset_type": import_zod.z.literal("image").describe("Discriminator identifying this as an image asset. See /schemas/creative/asset-types for the registry."), "url": import_zod.z.string().url().describe("URL to the image asset"), "width": import_zod.z.number().int().gte(1).describe("Width in pixels"), "height": import_zod.z.number().int().gte(1).describe("Height in pixels"), "file_size_bytes": import_zod.z.number().int().gte(1).describe("Image file size in bytes. Required by agents that advertise a max_file_size_kb constraint.").optional(), "pixel_ratio": import_zod.z.number().gt(0).describe("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.").optional(), "state_id": import_zod.z.string().describe("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.").optional(), "breakpoint_id": import_zod.z.string().describe("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.").optional(), "focal_point": import_zod.z.array(import_zod.z.number().gte(0).lte(1)).max(2).describe("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.").optional(), "format": import_zod.z.string().describe("Image file format (jpg, png, gif, webp, etc.)").optional(), "alt_text": import_zod.z.string().describe("Alternative text for accessibility").optional(), "provenance": import_zod.z.object({ "digital_source_type": import_zod.z.enum(["digital_capture", "digital_creation", "trained_algorithmic_media", "composite_with_trained_algorithmic_media", "algorithmic_media", "composite_capture", "composite_synthetic", "human_edits", "data_driven_media"]).describe("IPTC-aligned classification of AI involvement in producing this content").optional(), "synthetic_depiction": import_zod.z.boolean().describe("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`.").optional(), "ai_tool": import_zod.z.object({ "name": import_zod.z.string().describe("Name of the AI tool or model (e.g., 'DALL-E 3', 'Stable Diffusion XL', 'Gemini')"), "version": import_zod.z.string().describe("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.").optional(), "provider": import_zod.z.string().describe("Organization that provides the AI tool (e.g., 'OpenAI', 'Stability AI', 'Google')").optional() }).describe("AI system used to generate or modify this content. Aligns with IPTC 2025.1 AI metadata fields and C2PA claim_generator.").optional(), "human_oversight": import_zod.z.enum(["none", "prompt_only", "selected", "edited", "directed"]).describe("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`.").optional(), "declared_by": import_zod.z.object({ "agent_url": import_zod.z.string().url().describe("URL of the agent or service that declared this provenance").optional(), "role": import_zod.z.enum(["creator", "advertiser", "agency", "platform", "tool"]).describe("Role of the declaring party in the supply chain") }).describe("Party declaring this provenance. Identifies who attached the provenance claim, enabling receiving parties to assess trust.").optional(), "declared_at": import_zod.z.string().datetime().describe("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.").optional(), "created_time": import_zod.z.string().datetime().describe("When this content was created or generated (ISO 8601)").optional(), "c2pa": import_zod.z.object({ "manifest_url": import_zod.z.string().url().describe("URL to the C2PA manifest store for this content") }).describe("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.").optional(), "embedded_provenance": import_zod.z.array(import_zod.z.object({ "method": import_zod.z.enum(["manifest_wrapper", "provenance_markers"]).describe("How provenance data is carried within the content"), "standard": import_zod.z.string().describe("Standard the embedding conforms to, if any (e.g., 'c2pa' for C2PA Section A.7 text manifest embedding)").optional(), "provider": import_zod.z.string().describe("Organization that performed the embedding (e.g., 'Encypher', 'Digimarc'). Display label and audit context \u2014 not a wire identifier."), "verify_agent": import_zod.z.object({ "agent_url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("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."), "feature_id": import_zod.z.string().describe("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.").optional() }).strict().describe("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).").optional(), "embedded_at": import_zod.z.string().datetime().describe("When the provenance data was embedded (ISO 8601)").optional() })).describe("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`).").optional(), "watermarks": import_zod.z.array(import_zod.z.object({ "media_type": import_zod.z.enum(["audio", "image", "video", "text"]).describe("Media category of the watermarked content"), "provider": import_zod.z.string().describe("Organization that applied the watermark (e.g., 'Imatag', 'Steg.AI', 'Encypher'). Display label and audit context \u2014 not a wire identifier."), "verify_agent": import_zod.z.object({ "agent_url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("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."), "feature_id": import_zod.z.string().describe("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.").optional() }).strict().describe("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).").optional(), "c2pa_action": import_zod.z.enum(["c2pa.watermarked.bound", "c2pa.watermarked.unbound"]).describe("C2PA action classification for this watermark").optional(), "embedded_at": import_zod.z.string().datetime().describe("When the watermark was applied (ISO 8601)").optional() })).describe("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`).").optional(), "disclosure": import_zod.z.object({ "required": import_zod.z.boolean().describe("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."), "jurisdictions": import_zod.z.array(import_zod.z.object({ "country": import_zod.z.string().describe("ISO 3166-1 alpha-2 country code (e.g., 'US', 'DE', 'CN')"), "region": import_zod.z.string().describe("Sub-national region code (e.g., 'CA' for California, 'BY' for Bavaria)").optional(), "regulation": import_zod.z.string().describe("Regulation identifier (e.g., 'eu_ai_act_article_50', 'ca_sb_942', 'cn_deep_synthesis')"), "label_text": import_zod.z.string().describe("Required disclosure label text for this jurisdiction, in the local language").optional(), "render_guidance": import_zod.z.object({ "persistence": import_zod.z.enum(["continuous", "initial", "flexible"]).describe("How long the disclosure must persist during content playback or display").optional(), "min_duration_ms": import_zod.z.number().int().gte(1).describe("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.").optional(), "positions": import_zod.z.array(import_zod.z.enum(["prominent", "footer", "audio", "subtitle", "overlay", "end_card", "pre_roll", "companion"]).describe("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.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Preferred disclosure positions in priority order. The first position a format supports should be used.").optional(), "ext": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).describe("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.").optional() }).describe("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.").optional() })).describe("Jurisdictions where disclosure obligations apply").optional() }).describe("Regulatory disclosure requirements for this content. Indicates whether AI disclosure is required and under which jurisdictions.").optional(), "verification": import_zod.z.array(import_zod.z.object({ "verified_by": import_zod.z.string().describe("Name of the verification service (e.g., 'DoubleVerify', 'Hive Moderation', 'Reality Defender')"), "verified_time": import_zod.z.string().datetime().describe("When the verification was performed (ISO 8601)").optional(), "result": import_zod.z.enum(["authentic", "ai_generated", "ai_modified", "inconclusive"]).describe("Verification outcome"), "confidence": import_zod.z.number().gte(0).lte(1).describe("Confidence score of the verification result (0.0 to 1.0)").optional(), "details_url": import_zod.z.string().url().describe("URL to the full verification report").optional() })).describe("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.").optional(), "ext": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).describe("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.").optional() }).describe("Provenance metadata for this asset, overrides manifest-level provenance").optional() }).catchall(import_zod.z.any()).describe("Override logo asset.").optional(), "colors": import_zod.z.object({ "primary": import_zod.z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional(), "secondary": import_zod.z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional(), "accent": import_zod.z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional() }).catchall(import_zod.z.any()).describe("Override brand colors (hex strings).").optional(), "voice": import_zod.z.string().describe("Override brand-voice description for surface-composed text/audio output.").optional(), "tagline": import_zod.z.string().describe("Override tagline.").optional() }).catchall(import_zod.z.any()).describe("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.").optional() }).strict().describe(`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).`), "scheme": import_zod.z.string().describe('Proof scheme and version, e.g. "world_id_v4".').optional(), "relying_party_id": import_zod.z.string().describe("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."), "scope": import_zod.z.enum(["entity", "property"]).describe("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).").optional() }).strict().describe("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.")).describe("Verified-identity relying parties scoped to this brand/property, for attestation provenance in TMP Identity Match. Use when a brand or property runs its own relying_party_id (per-property pseudonyms); entity-wide relying parties live on the house object. See specs/tmp-verified-identity-attestation.md.").optional(), "names": import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.string().min(1)).describe("A localized name using the legacy underscore-separated language/region key convention (for example 'en_US', 'fr_CA', or 'zh_CN') and a name value. Bare language codes such as 'en' are also accepted for backwards compatibility. These keys are not AdCP locale-tag values: a bridge to /schemas/core/locale-tag.json replaces '_' with '-', applies the AdCP canonical wire profile, and validates the result rather than passing the key through unchanged.")).describe("Localized brand names. Multiple entries per language allowed for aliases."), "keller_type": import_zod.z.enum(["master", "sub_brand", "endorsed", "independent"]).describe("Brand architecture type from Keller's theory. master: primary brand of house. sub_brand: carries parent name (Nike SB). endorsed: independent identity backed by parent (Air Jordan 'by Nike'). independent: operates separately (Converse under Nike, Inc.)").optional(), "parent_brand": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Parent brand ID for sub-brands and endorsed brands").optional(), "description": import_zod.z.string().describe("Brand description").optional(), "industries": import_zod.z.array(import_zod.z.string()).describe("Brand industries (e.g., ['automotive'] or ['pharmaceutical', 'cpg'] for a consumer health company). Describes what the company does \u2014 not what regulatory regimes apply (use policy_categories for that).").optional(), "target_audience": import_zod.z.string().describe("Primary target audience").optional(), "logos": import_zod.z.array(import_zod.z.object({ "id": import_zod.z.string().regex(new RegExp("^[a-z0-9][a-z0-9_-]*$")).describe("Stable identifier for this logo entry. Recommended when logo usage rules or mark lockups need to bind to a specific logo asset.").optional(), "url": import_zod.z.string().url().describe("URL to the logo asset"), "orientation": import_zod.z.enum(["square", "horizontal", "vertical", "stacked"]).describe("Logo aspect ratio orientation. square: ~1:1, horizontal: wide, vertical: tall, stacked: vertically arranged elements").optional(), "background": import_zod.z.enum(["dark-bg", "light-bg", "transparent-bg"]).describe("Background compatibility. dark-bg: use on dark backgrounds, light-bg: use on light backgrounds, transparent-bg: has transparent background").optional(), "variant": import_zod.z.enum(["primary", "secondary", "icon", "wordmark", "full-lockup"]).describe("Logo variant type. primary: main logo, secondary: alternative, icon: symbol only, wordmark: text only, full-lockup: complete logo").optional(), "tags": import_zod.z.array(import_zod.z.string()).describe("Additional semantic tags for custom categorization beyond the standard orientation, background, and variant fields").optional(), "slots": import_zod.z.array(import_zod.z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical renderer slots where this logo is appropriate. Consumers SHOULD prefer this over inferring from tags or usage prose when selecting a logo for a specific UI surface.").optional(), "usage": import_zod.z.string().describe("Human-readable description of when to use this logo variant (e.g., 'Primary logo for use on light backgrounds')").optional(), "width": import_zod.z.number().int().describe("Width in pixels").optional(), "height": import_zod.z.number().int().describe("Height in pixels").optional() }).catchall(import_zod.z.any()).describe("Brand logo asset with structured fields for orientation, background compatibility, and variant type")).describe("Brand logo assets").optional(), "colors": import_zod.z.object({ "primary": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "secondary": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "accent": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "background": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "text": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "heading": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "body": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "label": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "border": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "divider": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "surface_1": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "surface_2": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional() }).catchall(import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))])).describe("Brand color palette. Each role accepts a single hex color or an array of hex colors for brands with multiple values per role. Beyond the core five roles, brands can provide additional color roles for finer granularity \u2014 heading, body, label, border, divider, surface_1, surface_2, etc.").optional(), "fonts": import_zod.z.object({ "primary": import_zod.z.union([import_zod.z.string().describe("CSS font-family name (e.g., 'Montserrat', 'Arial, sans-serif')"), import_zod.z.object({ "family": import_zod.z.string().describe("CSS font-family name (e.g., 'Brand Sans')"), "files": import_zod.z.array(import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL to the font file (WOFF2, TTF, or OTF)"), "weight": import_zod.z.number().int().gte(100).lte(900).describe("CSS numeric font-weight for static fonts (100-900)").optional(), "weight_range": import_zod.z.array(import_zod.z.number().int().gte(100).lte(900)).max(2).describe("Variable font weight axis range as [min, max] (e.g., [100, 900]). Use instead of weight for variable fonts.").optional(), "style": import_zod.z.enum(["normal", "italic", "oblique"]).describe("CSS font-style").optional() }).catchall(import_zod.z.any()).describe("A font file with weight, style, and variable font metadata")).max(36).describe("Font files for different weights and styles").optional(), "opentype_features": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9]{4}$"))).max(20).describe("OpenType feature tags to enable (e.g., ['ss01', 'tnum', 'cv01']). These are four-character tags per the OpenType spec.").optional(), "fallbacks": import_zod.z.array(import_zod.z.string().max(100)).max(10).describe("Ordered fallback font-family names for when the primary font is unavailable or does not support the required script (e.g., ['Noto Sans Arabic', 'Noto Sans SC', 'sans-serif'])").optional() }).catchall(import_zod.z.any()).describe("Structured font with family name, downloadable font files, and typographic metadata")]).describe("Primary font family").optional(), "secondary": import_zod.z.union([import_zod.z.string().describe("CSS font-family name (e.g., 'Montserrat', 'Arial, sans-serif')"), import_zod.z.object({ "family": import_zod.z.string().describe("CSS font-family name (e.g., 'Brand Sans')"), "files": import_zod.z.array(import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL to the font file (WOFF2, TTF, or OTF)"), "weight": import_zod.z.number().int().gte(100).lte(900).describe("CSS numeric font-weight for static fonts (100-900)").optional(), "weight_range": import_zod.z.array(import_zod.z.number().int().gte(100).lte(900)).max(2).describe("Variable font weight axis range as [min, max] (e.g., [100, 900]). Use instead of weight for variable fonts.").optional(), "style": import_zod.z.enum(["normal", "italic", "oblique"]).describe("CSS font-style").optional() }).catchall(import_zod.z.any()).describe("A font file with weight, style, and variable font metadata")).max(36).describe("Font files for different weights and styles").optional(), "opentype_features": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9]{4}$"))).max(20).describe("OpenType feature tags to enable (e.g., ['ss01', 'tnum', 'cv01']). These are four-character tags per the OpenType spec.").optional(), "fallbacks": import_zod.z.array(import_zod.z.string().max(100)).max(10).describe("Ordered fallback font-family names for when the primary font is unavailable or does not support the required script (e.g., ['Noto Sans Arabic', 'Noto Sans SC', 'sans-serif'])").optional() }).catchall(import_zod.z.any()).describe("Structured font with family name, downloadable font files, and typographic metadata")]).describe("Secondary font family").optional() }).catchall(import_zod.z.union([import_zod.z.string().describe("CSS font-family name (e.g., 'Montserrat', 'Arial, sans-serif')"), import_zod.z.object({ "family": import_zod.z.string().describe("CSS font-family name (e.g., 'Brand Sans')"), "files": import_zod.z.array(import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL to the font file (WOFF2, TTF, or OTF)"), "weight": import_zod.z.number().int().gte(100).lte(900).describe("CSS numeric font-weight for static fonts (100-900)").optional(), "weight_range": import_zod.z.array(import_zod.z.number().int().gte(100).lte(900)).max(2).describe("Variable font weight axis range as [min, max] (e.g., [100, 900]). Use instead of weight for variable fonts.").optional(), "style": import_zod.z.enum(["normal", "italic", "oblique"]).describe("CSS font-style").optional() }).catchall(import_zod.z.any()).describe("A font file with weight, style, and variable font metadata")).max(36).describe("Font files for different weights and styles").optional(), "opentype_features": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9]{4}$"))).max(20).describe("OpenType feature tags to enable (e.g., ['ss01', 'tnum', 'cv01']). These are four-character tags per the OpenType spec.").optional(), "fallbacks": import_zod.z.array(import_zod.z.string().max(100)).max(10).describe("Ordered fallback font-family names for when the primary font is unavailable or does not support the required script (e.g., ['Noto Sans Arabic', 'Noto Sans SC', 'sans-serif'])").optional() }).catchall(import_zod.z.any()).describe("Structured font with family name, downloadable font files, and typographic metadata")]).describe("A font role entry. Either a CSS font-family string (simple) or a structured object with family name and font files (rich).")).describe("Brand typography. Each key is a role name (e.g., 'primary', 'secondary') referenced by type_scale entries. Values are either a CSS font-family string or a structured object with font files for reliable resolution.").optional(), "tone": import_zod.z.union([import_zod.z.string().describe("Simple tone descriptors for backwards compatibility"), import_zod.z.object({ "voice": import_zod.z.union([import_zod.z.string(), import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.string().min(1)).describe("A localized name using the legacy underscore-separated language/region key convention (for example 'en_US', 'fr_CA', or 'zh_CN') and a name value. Bare language codes such as 'en' are also accepted for backwards compatibility. These keys are not AdCP locale-tag values: a bridge to /schemas/core/locale-tag.json replaces '_' with '-', applies the AdCP canonical wire profile, and validates the result rather than passing the key through unchanged."))]).describe("High-level voice descriptor, either a legacy plain string or localized values.").optional(), "attributes": import_zod.z.union([import_zod.z.array(import_zod.z.string()), import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.array(import_zod.z.string())).describe("One locale mapped to a complete ordered string list. The list is selected as a unit so readers never assemble mixed-language output from independently localized elements."))]).describe("Personality traits that characterize the brand voice. Localized lists are selected as a whole.").optional(), "dos": import_zod.z.union([import_zod.z.array(import_zod.z.string()), import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.array(import_zod.z.string())).describe("One locale mapped to a complete ordered string list. The list is selected as a unit so readers never assemble mixed-language output from independently localized elements."))]).describe("Guidance for copy generation - what TO do. Localized lists are selected as a whole.").optional(), "donts": import_zod.z.union([import_zod.z.array(import_zod.z.string()), import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.array(import_zod.z.string())).describe("One locale mapped to a complete ordered string list. The list is selected as a unit so readers never assemble mixed-language output from independently localized elements."))]).describe("Guardrails to avoid brand violations - what NOT to do. Localized lists are selected as a whole.").optional() }).describe("Structured brand voice guidelines")]).describe("Brand voice and messaging tone guidelines").optional(), "tagline": import_zod.z.union([import_zod.z.string().describe("Plain tagline string for backwards compatibility"), import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.string().min(1)).describe("A localized name using the legacy underscore-separated language/region key convention (for example 'en_US', 'fr_CA', or 'zh_CN') and a name value. Bare language codes such as 'en' are also accepted for backwards compatibility. These keys are not AdCP locale-tag values: a bridge to /schemas/core/locale-tag.json replaces '_' with '-', applies the AdCP canonical wire profile, and validates the result rather than passing the key through unchanged.")).describe("Localized taglines with BCP 47 locale codes")]).describe("Brand tagline or slogan. Accepts a plain string or a localized array matching the names pattern.").optional(), "assets": import_zod.z.array(import_zod.z.object({ "asset_id": import_zod.z.string().describe("Unique identifier"), "asset_type": import_zod.z.enum(["image", "video", "audio", "text", "markdown", "html", "css", "javascript", "zip", "vast", "daast", "url", "webhook", "brief", "catalog", "published_post"]).describe("Type of asset content"), "url": import_zod.z.string().url().describe("URL to CDN-hosted asset file"), "tags": import_zod.z.array(import_zod.z.string()).describe("Tags for discovery (e.g., 'hero', 'lifestyle', 'product', 'holiday')").optional(), "name": import_zod.z.union([import_zod.z.string(), import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.string().min(1)).describe("A localized name using the legacy underscore-separated language/region key convention (for example 'en_US', 'fr_CA', or 'zh_CN') and a name value. Bare language codes such as 'en' are also accepted for backwards compatibility. These keys are not AdCP locale-tag values: a bridge to /schemas/core/locale-tag.json replaces '_' with '-', applies the AdCP canonical wire profile, and validates the result rather than passing the key through unchanged."))]).describe("Human-readable name, either a legacy plain string or localized values.").optional(), "description": import_zod.z.union([import_zod.z.string(), import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.string().min(1)).describe("A localized name using the legacy underscore-separated language/region key convention (for example 'en_US', 'fr_CA', or 'zh_CN') and a name value. Bare language codes such as 'en' are also accepted for backwards compatibility. These keys are not AdCP locale-tag values: a bridge to /schemas/core/locale-tag.json replaces '_' with '-', applies the AdCP canonical wire profile, and validates the result rather than passing the key through unchanged."))]).describe("Asset description or usage notes, either a legacy plain string or localized values.").optional(), "width": import_zod.z.number().int().describe("Image/video width in pixels").optional(), "height": import_zod.z.number().int().describe("Image/video height in pixels").optional(), "duration_seconds": import_zod.z.number().describe("Video/audio duration in seconds").optional(), "file_size_bytes": import_zod.z.number().int().describe("File size in bytes").optional(), "format": import_zod.z.string().describe("File format (e.g., 'jpg', 'mp4', 'mp3')").optional(), "metadata": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).describe("Additional asset-specific metadata").optional() }).catchall(import_zod.z.any()).describe("Brand asset (image, video, audio, text)")).describe("Brand asset library").optional(), "properties": import_zod.z.array(import_zod.z.object({ "type": import_zod.z.enum(["website", "mobile_app", "ctv_app", "desktop_app", "dooh", "podcast", "radio", "linear_tv", "streaming_audio", "ai_assistant"]).describe("Property type"), "identifier": import_zod.z.string().min(1).describe("Property identifier - domain for websites, bundle ID for apps"), "store": import_zod.z.enum(["apple", "google", "amazon", "roku", "samsung", "lg", "other"]).describe("App store for mobile/CTV apps").optional(), "region": import_zod.z.string().regex(new RegExp("^([A-Z]{2}|global)$")).describe("ISO 3166-1 alpha-2 country code or 'global'").optional(), "primary": import_zod.z.boolean().describe("Whether this is the primary property for the brand").default(false), "relationship": import_zod.z.enum(["owned", "direct", "delegated", "ad_network"]).describe("How this brand relates to the property. 'owned': the brand owns and operates this property (default) and has no adagents.json delegation_type counterpart. 'direct': the brand is the direct sales path for this property, even if a third party operates the software (e.g., a publisher's in-house ad team using a vendor's tech). 'delegated': the brand manages monetization for this property \u2014 they are in charge of ad sales (e.g., Mediavine managing a food blog). 'ad_network': the brand sells this property's inventory as part of a network or exchange \u2014 they are a path to the inventory, not the path (e.g., PubMatic as an SSP). For non-owned properties, the publisher confirms the relationship by setting the matching delegation_type on the agent's authorization in their adagents.json.").default("owned") }).catchall(import_zod.z.any()).describe("A digital property associated with a brand. Defaults to owned; use 'relationship' to declare direct, delegated, or ad_network properties. For direct, delegated, and network paths, these values match the delegation_type field in adagents.json, creating a bilateral verification chain: the operator declares the relationship here, the publisher confirms by setting the same delegation_type on the agent's authorization in their adagents.json. 'owned' is an inline ownership declaration with no adagents.json counterpart.")).describe("Digital properties associated with this brand \u2014 owned, managed, or represented").optional(), "product_catalog": import_zod.z.object({ "feed_url": import_zod.z.string().url().describe("URL to product catalog feed"), "feed_format": import_zod.z.enum(["google_merchant_center", "facebook_catalog", "shopify", "linkedin_jobs", "tiktok_shop", "pinterest_catalog", "openai_product_feed", "custom"]).describe("Format of the product feed").optional(), "categories": import_zod.z.array(import_zod.z.string()).describe("Product categories available in the catalog").optional(), "last_updated": import_zod.z.string().datetime().describe("When the product catalog was last updated").optional(), "update_frequency": import_zod.z.enum(["realtime", "hourly", "daily", "weekly"]).describe("How frequently the product catalog is updated").optional(), "agentic_checkout": import_zod.z.object({ "endpoint": import_zod.z.string().url().describe("Base URL for checkout session API"), "spec": import_zod.z.string().describe("Checkout API specification identifier. Use a namespaced string to identify the checkout protocol (e.g., vendor-prefixed or custom). Vendor-specific values belong under ext.{vendor}."), "supported_payment_providers": import_zod.z.array(import_zod.z.string()).describe("Payment providers supported by this checkout endpoint").optional() }).describe("Agentic checkout endpoint configuration").optional() }).catchall(import_zod.z.any()).describe("Product catalog for e-commerce brands").optional(), "privacy_policy_url": import_zod.z.string().url().describe("URL to the brand's privacy policy").optional(), "data_subject_contestation": import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL to a human-accessible contestation form or information page.").optional(), "email": import_zod.z.string().email().describe("Email address for contestation requests. Deployer MUST monitor and respond within the timelines set by applicable law (e.g., 1 month under GDPR Art. 12(3)).").optional(), "languages": import_zod.z.array(import_zod.z.string()).describe("BCP 47 language tags the contestation channel supports (e.g., ['en', 'de', 'fr']). At minimum SHOULD include a language spoken in every jurisdiction where the brand runs regulated-vertical campaigns.").optional() }).strict().and(import_zod.z.union([import_zod.z.any(), import_zod.z.any()])).describe("Contact point where a data subject can request human intervention, express their view, or contest an automated decision \u2014 satisfying GDPR Article 22(3) and EU AI Act Article 26(11) transparency obligations. This is a contact reference (URL, email, or both), not a machine-callable API. AdCP surfaces the pointer; the deployer runs the contestation workflow.").optional(), "disclaimers": import_zod.z.array(import_zod.z.object({ "text": import_zod.z.string(), "context": import_zod.z.string().optional(), "required": import_zod.z.boolean().default(true) })).describe("Legal disclaimers for creatives").optional(), "trademarks": import_zod.z.array(import_zod.z.object({ "registry": import_zod.z.string().describe("Trademark registry (e.g., 'USPTO', 'EUIPO', 'JPO', 'CNIPA')"), "number": import_zod.z.string().describe("Registration number as issued by the registry"), "mark": import_zod.z.string().describe("The registered mark as published"), "status": import_zod.z.enum(["active", "pending", "abandoned", "cancelled", "expired"]).describe("Registration status. Omit for active marks if status tracking is not maintained.").optional(), "license_type": import_zod.z.enum(["owned", "licensed_in", "licensed_out"]).describe("Whether the publisher owns the mark, licenses it from another entity, or licenses it to others. 'owned' is the default if omitted.").optional(), "licensor_domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain of the entity that licenses this mark to the publisher. Meaningful when license_type=licensed_in; omit otherwise.").optional(), "countries": import_zod.z.array(import_zod.z.string().min(2).max(2)).describe("ISO 3166-1 alpha-2 country codes where this registration applies. Omit for global or where the registry's jurisdiction is implicit.").optional(), "nice_classes": import_zod.z.array(import_zod.z.number().int().gte(1).lte(45)).describe("Nice Classification class numbers (1-45) covered by this registration. Disambiguates marks across industries (e.g., Delta-airline vs Delta-faucet). Omit if scope is implicit from registry.").optional() }).catchall(import_zod.z.any()).describe("A registered trademark. May appear at house level (corporate marks, e.g., 'NIKE' owned by Nike, Inc.) or at brand level (brand-specific marks, e.g., 'CONVERSE' owned by Converse). Resolution between house- and brand-level trademarks is union \u2014 both lists are valid claims about marks the publisher controls.")).describe("Brand-level registered trademarks. Use for marks the brand owns or controls (e.g., a sub-brand's own marks distinct from the corporate parent). House-level trademarks live on the house object; resolution between the two is union \u2014 both lists are valid claims.").optional(), "voice_synthesis": import_zod.z.object({ "provider": import_zod.z.string().optional(), "voice_id": import_zod.z.string().optional(), "settings": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).optional() }).catchall(import_zod.z.any()).describe("TTS voice synthesis configuration for AI-generated audio").optional(), "avatar": import_zod.z.object({ "provider": import_zod.z.string().optional(), "avatar_id": import_zod.z.string().optional(), "settings": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).optional() }).catchall(import_zod.z.any()).describe("Visual avatar configuration").optional(), "visual_guidelines": import_zod.z.object({ "photography": import_zod.z.object({ "realism": import_zod.z.enum(["natural", "stylized", "hyperreal", "abstract"]).describe("Level of photographic realism").optional(), "lighting": import_zod.z.string().describe("Lighting style (e.g., 'soft daylight', 'studio', 'golden hour', 'high-key', 'low-key')").optional(), "color_temperature": import_zod.z.enum(["warm", "neutral", "cool"]).describe("Overall color temperature of photography").optional(), "contrast": import_zod.z.enum(["low", "medium", "high"]).describe("Contrast level in photography").optional(), "depth_of_field": import_zod.z.enum(["shallow", "medium", "deep"]).describe("Depth of field preference. shallow: blurred background with subject isolation, deep: everything in focus").optional(), "subject": import_zod.z.object({ "people": import_zod.z.object({ "age_range": import_zod.z.string().describe("Target age range (e.g., '20-35')").optional(), "diversity": import_zod.z.string().describe("Diversity representation (e.g., 'mixed', 'varied')").optional(), "mood": import_zod.z.array(import_zod.z.string()).describe("Mood descriptors (e.g., ['confident', 'relaxed'])").optional() }).catchall(import_zod.z.any()).describe("People photography guidelines").optional(), "product_focus": import_zod.z.enum(["in-use", "isolated", "lifestyle", "detail"]).describe("How products are shown").optional(), "setting": import_zod.z.string().describe("Environmental context for photography (e.g., 'indoor', 'outdoor', 'studio', 'urban', 'nature', 'workplace')").optional() }).catchall(import_zod.z.any()).describe("Subject matter guidelines").optional(), "framing": import_zod.z.object({ "subject_position": import_zod.z.string().describe("Where the subject sits in frame (e.g., 'center', 'center-left', 'rule-of-thirds')").optional(), "crop_style": import_zod.z.string().describe("Cropping convention (e.g., 'waist-up', 'full-body', 'close-up', 'wide')").optional(), "perspective": import_zod.z.string().describe("Camera perspective (e.g., 'eye-level', 'overhead', 'low-angle')").optional() }).catchall(import_zod.z.any()).describe("Camera framing rules").optional(), "preferred_aspect_ratios": import_zod.z.array(import_zod.z.string().regex(new RegExp("^\\d+:\\d+$"))).describe("Preferred aspect ratios for brand photography (e.g., '16:9', '4:5', '1:1')").optional(), "tags": import_zod.z.array(import_zod.z.string()).describe("Additional style descriptors").optional() }).catchall(import_zod.z.any()).describe("Photography style rules for generative creative systems. Defines how brand photography should look when selected or generated.").optional(), "graphic_style": import_zod.z.object({ "style_type": import_zod.z.enum(["flat_illustration", "geometric", "gradient_mesh", "editorial_collage", "hand_drawn", "minimal_line_art", "3d_render", "isometric", "photographic_composite"]).describe("Primary graphic style").optional(), "stroke_style": import_zod.z.enum(["rounded", "square", "mixed", "none"]).describe("Stroke end/join style").optional(), "stroke_weight": import_zod.z.string().describe("Stroke weight (e.g., '2px', 'thin', 'bold')").optional(), "corner_radius": import_zod.z.string().describe("Default corner radius for graphic and illustration elements (e.g., '12px', '8px', 'sharp'). For UI component radii (buttons, cards, inputs), see visual_guidelines.border_radius.").optional(), "tags": import_zod.z.array(import_zod.z.string()).describe("Additional style descriptors").optional() }).catchall(import_zod.z.any()).describe("Visual language for brand graphics and illustrations").optional(), "shapes": import_zod.z.object({ "primary_shape": import_zod.z.string().describe("Primary brand shape (e.g., 'rounded_rectangle', 'circle', 'hexagon')").optional(), "secondary_shapes": import_zod.z.array(import_zod.z.string()).describe("Secondary shapes in the brand vocabulary").optional(), "usage": import_zod.z.object({ "max_per_layout": import_zod.z.number().int().describe("Maximum distinct shapes per layout").optional(), "overlap_allowed": import_zod.z.boolean().describe("Whether shapes may overlap").optional() }).catchall(import_zod.z.any()).describe("Shape usage rules").optional() }).catchall(import_zod.z.any()).describe("Distinctive shapes used as part of brand visual identity").optional(), "iconography": import_zod.z.object({ "style": import_zod.z.enum(["outline", "filled", "duotone", "flat", "glyph", "hand_drawn"]).describe("Icon rendering style").optional(), "stroke_weight": import_zod.z.string().describe("Icon stroke weight (e.g., '2px', '1.5px')").optional(), "corner_style": import_zod.z.enum(["rounded", "square", "mixed"]).describe("Corner style for icon paths").optional(), "usage": import_zod.z.object({ "max_per_frame": import_zod.z.number().int().describe("Maximum icons per creative frame").optional(), "size_ratio": import_zod.z.string().describe("Icon-to-layout size ratio (e.g., '1:8')").optional() }).catchall(import_zod.z.any()).describe("Icon usage rules").optional() }).catchall(import_zod.z.any()).describe("Icon style system and usage rules").optional(), "composition": import_zod.z.object({ "overlays": import_zod.z.object({ "gradient_style": import_zod.z.enum(["linear", "radial", "conic", "none"]).describe("Gradient type for overlays").optional(), "gradient_direction": import_zod.z.string().describe("Gradient direction (e.g., '45deg', 'to-bottom-right')").optional(), "opacity": import_zod.z.string().describe("Overlay opacity (e.g., '70%')").optional() }).catchall(import_zod.z.any()).describe("Graphic overlay rules").optional(), "texture": import_zod.z.object({ "style": import_zod.z.enum(["none", "subtle_grain", "noise", "paper", "fabric", "concrete"]).describe("Texture style applied to creative assets").optional(), "intensity": import_zod.z.enum(["low", "medium", "high"]).describe("Texture intensity").optional() }).catchall(import_zod.z.any()).describe("Texture treatment rules").optional(), "backgrounds": import_zod.z.object({ "types_allowed": import_zod.z.array(import_zod.z.enum(["solid_color", "gradient", "blurred_photo", "image", "video", "pattern", "transparent"])).describe("Permitted background types").optional() }).catchall(import_zod.z.any()).describe("Background treatment rules").optional() }).catchall(import_zod.z.any()).describe("Layout composition rules including overlays, textures, and backgrounds").optional(), "border_radius": import_zod.z.object({ "none": import_zod.z.string().describe("Explicitly sharp corners (e.g., '0')").optional(), "default": import_zod.z.string().describe("Default border radius for UI components (e.g., '8px', '12px', '0'). For graphic/illustration elements, see graphic_style.corner_radius.").optional(), "small": import_zod.z.string().describe("Small border radius for compact elements (e.g., '4px')").optional(), "large": import_zod.z.string().describe("Large border radius for cards and containers (e.g., '16px', '24px')").optional(), "pill": import_zod.z.string().describe("Fully rounded / pill shape (e.g., '999px')").optional() }).catchall(import_zod.z.string()).describe("Named border radius presets for UI components and layout elements. One of the most visible brand differentiators \u2014 Airbnb uses generous 20px, Stripe uses precise 4\u20138px, Spotify uses pill/999px.").optional(), "elevation": import_zod.z.object({ "none": import_zod.z.string().describe("No shadow (e.g., 'none')").optional(), "subtle": import_zod.z.string().describe("Subtle shadow for slight lift (e.g., '0 1px 2px rgba(0,0,0,0.05)')").optional(), "card": import_zod.z.string().describe("Card-level shadow (e.g., '0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.1)')").optional(), "modal": import_zod.z.string().describe("Modal/overlay shadow (e.g., '0 20px 25px -5px rgba(0,0,0,0.1), 0 8px 10px -6px rgba(0,0,0,0.1)')").optional() }).catchall(import_zod.z.string()).describe("Named shadow/elevation levels. Brands use elevation as identity \u2014 from Stripe's blue-tinted multi-layer shadows to Apple's single diffuse shadow. Values are CSS box-shadow syntax.").optional(), "spacing": import_zod.z.object({ "unit": import_zod.z.string().describe("Base grid unit this scale was designed from (e.g., '8px', '4px'). Informational \u2014 agents should use the named scale values, not compute from this.").optional(), "scale": import_zod.z.object({ "xs": import_zod.z.string().describe("Extra small spacing (e.g., '4px')").optional(), "sm": import_zod.z.string().describe("Small spacing (e.g., '8px')").optional(), "md": import_zod.z.string().describe("Medium spacing (e.g., '16px')").optional(), "lg": import_zod.z.string().describe("Large spacing (e.g., '24px')").optional(), "xl": import_zod.z.string().describe("Extra large spacing (e.g., '32px')").optional(), "2xl": import_zod.z.string().describe("Section-level spacing (e.g., '48px', '64px')").optional() }).catchall(import_zod.z.string()).describe("Named spacing scale built from the base unit").optional() }).strict().describe("Spacing system for consistent layout rhythm. Most design systems use an 8px base grid.").optional(), "graphic_elements": import_zod.z.array(import_zod.z.object({ "name": import_zod.z.string().describe("Element name (e.g., 'Paper Tear', 'Brand Watermark', 'Section Divider')"), "type": import_zod.z.enum(["border", "divider", "frame", "watermark", "pattern", "texture_overlay", "decorative"]).describe("Element type").optional(), "description": import_zod.z.string().describe("How the element is used in layouts").optional(), "orientation": import_zod.z.enum(["horizontal", "vertical", "any"]).describe("Preferred orientation when used in layouts").optional(), "colors": import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("A single hex color value")).describe("Colors this element may appear in").optional(), "max_per_layout": import_zod.z.number().int().describe("Maximum instances per layout").optional() }).catchall(import_zod.z.any()).describe("A reusable decorative or structural visual element that is part of the brand identity (e.g., torn paper edges, watermarks, dividers, background patterns)")).describe("Reusable decorative elements that are part of the brand visual identity (e.g., torn paper edges, watermarks, dividers)").optional(), "motion": import_zod.z.object({ "transition_style": import_zod.z.enum(["cut", "dissolve", "slide", "wipe", "zoom", "fade"]).describe("Primary transition style between scenes").optional(), "animation_speed": import_zod.z.enum(["slow", "moderate", "fast"]).describe("Overall animation pacing").optional(), "easing": import_zod.z.string().describe("Default easing function (e.g., 'ease-in-out', 'spring', 'linear')").optional(), "text_entrance": import_zod.z.enum(["fade", "typewriter", "slide_up", "slide_left", "scale", "none"]).describe("How text enters the frame").optional(), "pacing": import_zod.z.enum(["lingering", "moderate", "fast_cuts"]).describe("Overall editing rhythm").optional(), "kinetic_typography": import_zod.z.boolean().describe("Whether animated/kinetic typography is allowed").optional(), "tags": import_zod.z.array(import_zod.z.string()).describe("Additional motion style descriptors").optional() }).catchall(import_zod.z.any()).describe("Motion and animation rules for video, animated display, and interactive formats").optional(), "logo_placement": import_zod.z.object({ "preferred_position": import_zod.z.enum(["top-left", "top-center", "top-right", "bottom-left", "bottom-center", "bottom-right", "center"]).describe("Preferred logo position in layouts").optional(), "min_clear_space": import_zod.z.string().describe("Minimum clear space around the logo, expressed as a multiple of logo height (e.g., '0.5x', '1x') or fixed value (e.g., '16px')").optional(), "min_height": import_zod.z.string().describe("Minimum logo height to maintain legibility (e.g., '40px', '24px')").optional(), "background_contrast": import_zod.z.enum(["light_only", "dark_only", "any"]).describe("Permitted background contrast behind logo").optional() }).catchall(import_zod.z.any()).describe("Logo placement and clear space rules for automated creative production").optional(), "colorways": import_zod.z.array(import_zod.z.object({ "name": import_zod.z.string().describe("Colorway name (e.g., 'primary', 'inverted', 'subtle')"), "foreground": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("A single hex color value"), "background": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("A single hex color value"), "accent": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("A single hex color value").optional(), "border": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("A single hex color value").optional(), "cta_foreground": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("CTA text/icon color, if different from foreground").optional(), "cta_background": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("CTA button/container color, if different from accent").optional(), "channels": import_zod.z.array(import_zod.z.string()).describe("Channels or contexts where this colorway applies (e.g., 'online', 'print', 'pos', 'social', 'outdoor'). Omit for universal colorways.").optional() }).catchall(import_zod.z.any()).describe("A named color pairing that defines how colors work together. Colorways ensure foreground/background combinations are always on-brand and accessible.")).describe("Named color pairings for consistent foreground/background combinations").optional(), "color_constraints": import_zod.z.array(import_zod.z.object({ "color": import_zod.z.object({ "kind": import_zod.z.enum(["name", "value", "surface"]).describe("Discriminator for the color reference variant.").optional(), "name": import_zod.z.string().describe("Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}.").optional(), "value": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("Literal hex color when no palette key exists.").optional(), "surface": import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]).describe("Usage surface rather than a specific color value.").optional() }).strict().and(import_zod.z.union([import_zod.z.object({ "kind": import_zod.z.literal("name") }), import_zod.z.object({ "kind": import_zod.z.literal("value") }), import_zod.z.object({ "kind": import_zod.z.literal("surface") })])).describe("Color role or value this constraint governs."), "applies_to": import_zod.z.array(import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"])).describe("Surfaces where this color may be used.").optional(), "allowed_on": import_zod.z.array(import_zod.z.object({ "kind": import_zod.z.enum(["name", "value", "surface"]).describe("Discriminator for the color reference variant.").optional(), "name": import_zod.z.string().describe("Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}.").optional(), "value": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("Literal hex color when no palette key exists.").optional(), "surface": import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]).describe("Usage surface rather than a specific color value.").optional() }).strict().and(import_zod.z.union([import_zod.z.object({ "kind": import_zod.z.literal("name") }), import_zod.z.object({ "kind": import_zod.z.literal("value") }), import_zod.z.object({ "kind": import_zod.z.literal("surface") })])).describe("Reference to a brand color or usage surface for machine-readable guideline constraints. Use kind=name for palette lookup keys in colors, kind=value for a literal hex color, and kind=surface for layout surfaces such as background or text.")).describe("Backgrounds, surfaces, or color roles where this color is allowed.").optional(), "forbidden_on": import_zod.z.array(import_zod.z.object({ "kind": import_zod.z.enum(["name", "value", "surface"]).describe("Discriminator for the color reference variant.").optional(), "name": import_zod.z.string().describe("Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}.").optional(), "value": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("Literal hex color when no palette key exists.").optional(), "surface": import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]).describe("Usage surface rather than a specific color value.").optional() }).strict().and(import_zod.z.union([import_zod.z.object({ "kind": import_zod.z.literal("name") }), import_zod.z.object({ "kind": import_zod.z.literal("value") }), import_zod.z.object({ "kind": import_zod.z.literal("surface") })])).describe("Reference to a brand color or usage surface for machine-readable guideline constraints. Use kind=name for palette lookup keys in colors, kind=value for a literal hex color, and kind=surface for layout surfaces such as background or text.")).describe("Backgrounds, surfaces, or color roles where this color is forbidden.").optional(), "never_pair_with": import_zod.z.array(import_zod.z.object({ "kind": import_zod.z.enum(["name", "value", "surface"]).describe("Discriminator for the color reference variant.").optional(), "name": import_zod.z.string().describe("Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}.").optional(), "value": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("Literal hex color when no palette key exists.").optional(), "surface": import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]).describe("Usage surface rather than a specific color value.").optional() }).strict().and(import_zod.z.union([import_zod.z.object({ "kind": import_zod.z.literal("name") }), import_zod.z.object({ "kind": import_zod.z.literal("value") }), import_zod.z.object({ "kind": import_zod.z.literal("surface") })])).describe("Reference to a brand color or usage surface for machine-readable guideline constraints. Use kind=name for palette lookup keys in colors, kind=value for a literal hex color, and kind=surface for layout surfaces such as background or text.")).describe("Color roles or values that must not be paired with this color.").optional(), "contexts": import_zod.z.array(import_zod.z.string()).describe("Channels or creative contexts where this constraint applies, such as digital, print, social, or ctv_end_card.").optional(), "severity": import_zod.z.enum(["must", "should"]).describe("Strength of a machine-readable brand guideline constraint.").optional(), "description": import_zod.z.string().describe("Human-readable rationale or source-language summary for the rule.").optional() }).catchall(import_zod.z.any()).describe("Machine-readable rule constraining how a brand color may be used or paired. Use for accent-only colors, forbidden foreground/background combinations, and palette pairs that should never appear together.")).describe("Machine-readable constraints for color usage and pairings, such as accent-only rules or forbidden foreground/background combinations.").optional(), "logo_usage_rules": import_zod.z.array(import_zod.z.object({ "logo_url": import_zod.z.string().url().describe("Specific logo asset URL this rule applies to. Omit when the rule applies by variant or tags.").optional(), "logo_id": import_zod.z.string().regex(new RegExp("^[a-z0-9][a-z0-9_-]*$")).describe("Stable `logos[].id` this rule applies to. Prefer this over logo_url when the rule targets a specific logo entry.").optional(), "logo_variant": import_zod.z.enum(["primary", "secondary", "icon", "wordmark", "full-lockup"]).describe("Logo variant this rule applies to.").optional(), "logo_tags": import_zod.z.array(import_zod.z.string()).describe("Logo tags this rule applies to.").optional(), "contexts": import_zod.z.array(import_zod.z.string()).describe("Creative contexts where this rule applies.").optional(), "slots": import_zod.z.array(import_zod.z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical renderer slots where this rule applies. Use this for deterministic logo-card, profile-mark, end-card, and lockup selection.").optional(), "minimum_size": import_zod.z.object({ "width": import_zod.z.string().describe("Minimum width, such as 48px or 12mm.").optional(), "height": import_zod.z.string().describe("Minimum height, such as 18px or 6mm.").optional() }).strict().describe("Minimum rendered size needed for legibility.").optional(), "clear_space": import_zod.z.string().describe("Minimum clear space around the logo, expressed in brand terms or units.").optional(), "allowed_backgrounds": import_zod.z.array(import_zod.z.object({ "kind": import_zod.z.enum(["name", "value", "surface"]).describe("Discriminator for the color reference variant.").optional(), "name": import_zod.z.string().describe("Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}.").optional(), "value": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("Literal hex color when no palette key exists.").optional(), "surface": import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]).describe("Usage surface rather than a specific color value.").optional() }).strict().and(import_zod.z.union([import_zod.z.object({ "kind": import_zod.z.literal("name") }), import_zod.z.object({ "kind": import_zod.z.literal("value") }), import_zod.z.object({ "kind": import_zod.z.literal("surface") })])).describe("Reference to a brand color or usage surface for machine-readable guideline constraints. Use kind=name for palette lookup keys in colors, kind=value for a literal hex color, and kind=surface for layout surfaces such as background or text.")).describe("Background color roles, values, or surfaces where this logo may be placed.").optional(), "forbidden_backgrounds": import_zod.z.array(import_zod.z.object({ "kind": import_zod.z.enum(["name", "value", "surface"]).describe("Discriminator for the color reference variant.").optional(), "name": import_zod.z.string().describe("Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}.").optional(), "value": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("Literal hex color when no palette key exists.").optional(), "surface": import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]).describe("Usage surface rather than a specific color value.").optional() }).strict().and(import_zod.z.union([import_zod.z.object({ "kind": import_zod.z.literal("name") }), import_zod.z.object({ "kind": import_zod.z.literal("value") }), import_zod.z.object({ "kind": import_zod.z.literal("surface") })])).describe("Reference to a brand color or usage surface for machine-readable guideline constraints. Use kind=name for palette lookup keys in colors, kind=value for a literal hex color, and kind=surface for layout surfaces such as background or text.")).describe("Background color roles, values, or surfaces where this logo must not be placed.").optional(), "forbidden_contexts": import_zod.z.array(import_zod.z.string()).describe("Contexts where this logo must not be used, such as photography_without_knockout.").optional(), "severity": import_zod.z.enum(["must", "should"]).describe("Strength of a machine-readable brand guideline constraint.").optional(), "description": import_zod.z.string().describe("Human-readable rationale or source-language summary for the rule.").optional() }).catchall(import_zod.z.any()).and(import_zod.z.union([import_zod.z.any(), import_zod.z.any(), import_zod.z.any(), import_zod.z.any(), import_zod.z.any()])).describe("Machine-readable logo selection and placement rule. Complements logos[].usage by making enforceable minimum size, clear-space, background, and context constraints queryable.")).describe("Machine-readable logo selection and placement constraints for minimum size, clear space, backgrounds, and contexts.").optional(), "mark_lockups": import_zod.z.array(import_zod.z.object({ "lockup_type": import_zod.z.enum(["co_brand", "secondary_mark", "partner", "sponsor", "program", "talent", "custom"]).describe("Type of mark relationship governed by this lockup rule."), "ordering": import_zod.z.enum(["brand_first", "partner_first", "equal", "contextual"]).describe("Required visual ordering of the brand mark relative to partner or secondary marks.").optional(), "contexts": import_zod.z.array(import_zod.z.string()).describe("Creative contexts where this lockup rule applies.").optional(), "brand_logo_id": import_zod.z.string().regex(new RegExp("^[a-z0-9][a-z0-9_-]*$")).describe("Stable `logos[].id` for the brand logo this lockup rule is anchored on.").optional(), "secondary_logo_ids": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9][a-z0-9_-]*$")).describe("Stable identifier for a logo entry within this brand.json document. Use lowercase words separated by underscores or hyphens; do not key integrations on mutable asset URLs.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable `logos[].id` values for secondary, program, sponsor, or partner marks governed by this lockup rule when those marks are represented in this brand.json.").optional(), "separator": import_zod.z.object({ "type": import_zod.z.enum(["none", "keyline", "space", "divider"]).describe("Separator style."), "color": import_zod.z.object({ "kind": import_zod.z.enum(["name", "value", "surface"]).describe("Discriminator for the color reference variant.").optional(), "name": import_zod.z.string().describe("Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}.").optional(), "value": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("Literal hex color when no palette key exists.").optional(), "surface": import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]).describe("Usage surface rather than a specific color value.").optional() }).strict().and(import_zod.z.union([import_zod.z.object({ "kind": import_zod.z.literal("name") }), import_zod.z.object({ "kind": import_zod.z.literal("value") }), import_zod.z.object({ "kind": import_zod.z.literal("surface") })])).describe("Reference to a brand color or usage surface for machine-readable guideline constraints. Use kind=name for palette lookup keys in colors, kind=value for a literal hex color, and kind=surface for layout surfaces such as background or text.").optional(), "width": import_zod.z.string().describe("Separator width, such as 1px.").optional() }).catchall(import_zod.z.any()).describe("Separator between marks, when required.").optional(), "min_gap": import_zod.z.string().describe("Minimum gap between marks, expressed in brand terms or units.").optional(), "brand_min_optical_weight_ratio": import_zod.z.number().gt(0).describe("Minimum optical weight of the brand mark relative to partner marks. 1 means at least equal.").optional(), "partner_max_optical_weight_ratio": import_zod.z.number().gt(0).describe("Maximum optical weight of partner marks relative to the brand mark. 1 means no larger than the brand mark. Enforcement is at layout time, not parse time \u2014 this value signals to renderers and creative agents how much space to provision for each mark.").optional(), "severity": import_zod.z.enum(["must", "should"]).describe("Strength of a machine-readable brand guideline constraint.").optional(), "description": import_zod.z.string().describe("Human-readable rationale or source-language summary for the lockup rule.").optional() }).catchall(import_zod.z.any()).describe("Machine-readable layout constraints for co-brand, partner, sponsor, program, or secondary-mark lockups.")).describe("Machine-readable co-brand, partner, sponsor, program, or secondary-mark lockup rules.").optional(), "type_scale": import_zod.z.object({ "base_width": import_zod.z.string().describe("Reference canvas width these sizes were designed for (e.g., '1080px'). Generative systems should scale proportionally for other canvas sizes.").optional(), "heading": import_zod.z.object({ "font": import_zod.z.string().describe("Font reference. Use a key from the fonts object (e.g., 'primary', 'secondary') to reference a defined font role, or a literal CSS font-family string as a fallback.").optional(), "size": import_zod.z.string().describe("Font size (e.g., '48px', '2rem')").optional(), "weight": import_zod.z.string().describe("Font weight (e.g., '700', 'bold')").optional(), "line_height": import_zod.z.string().describe("Line height (e.g., '1.2', '56px')").optional(), "letter_spacing": import_zod.z.string().describe("Letter spacing (e.g., '-0.02em', '0.5px')").optional(), "text_transform": import_zod.z.enum(["none", "uppercase", "lowercase", "capitalize"]).describe("Text transformation").optional() }).catchall(import_zod.z.any()).describe("A single entry in the type scale").optional(), "subheading": import_zod.z.object({ "font": import_zod.z.string().describe("Font reference. Use a key from the fonts object (e.g., 'primary', 'secondary') to reference a defined font role, or a literal CSS font-family string as a fallback.").optional(), "size": import_zod.z.string().describe("Font size (e.g., '48px', '2rem')").optional(), "weight": import_zod.z.string().describe("Font weight (e.g., '700', 'bold')").optional(), "line_height": import_zod.z.string().describe("Line height (e.g., '1.2', '56px')").optional(), "letter_spacing": import_zod.z.string().describe("Letter spacing (e.g., '-0.02em', '0.5px')").optional(), "text_transform": import_zod.z.enum(["none", "uppercase", "lowercase", "capitalize"]).describe("Text transformation").optional() }).catchall(import_zod.z.any()).describe("A single entry in the type scale").optional(), "body": import_zod.z.object({ "font": import_zod.z.string().describe("Font reference. Use a key from the fonts object (e.g., 'primary', 'secondary') to reference a defined font role, or a literal CSS font-family string as a fallback.").optional(), "size": import_zod.z.string().describe("Font size (e.g., '48px', '2rem')").optional(), "weight": import_zod.z.string().describe("Font weight (e.g., '700', 'bold')").optional(), "line_height": import_zod.z.string().describe("Line height (e.g., '1.2', '56px')").optional(), "letter_spacing": import_zod.z.string().describe("Letter spacing (e.g., '-0.02em', '0.5px')").optional(), "text_transform": import_zod.z.enum(["none", "uppercase", "lowercase", "capitalize"]).describe("Text transformation").optional() }).catchall(import_zod.z.any()).describe("A single entry in the type scale").optional(), "caption": import_zod.z.object({ "font": import_zod.z.string().describe("Font reference. Use a key from the fonts object (e.g., 'primary', 'secondary') to reference a defined font role, or a literal CSS font-family string as a fallback.").optional(), "size": import_zod.z.string().describe("Font size (e.g., '48px', '2rem')").optional(), "weight": import_zod.z.string().describe("Font weight (e.g., '700', 'bold')").optional(), "line_height": import_zod.z.string().describe("Line height (e.g., '1.2', '56px')").optional(), "letter_spacing": import_zod.z.string().describe("Letter spacing (e.g., '-0.02em', '0.5px')").optional(), "text_transform": import_zod.z.enum(["none", "uppercase", "lowercase", "capitalize"]).describe("Text transformation").optional() }).catchall(import_zod.z.any()).describe("A single entry in the type scale").optional(), "cta": import_zod.z.object({ "font": import_zod.z.string().describe("Font reference. Use a key from the fonts object (e.g., 'primary', 'secondary') to reference a defined font role, or a literal CSS font-family string as a fallback.").optional(), "size": import_zod.z.string().describe("Font size (e.g., '48px', '2rem')").optional(), "weight": import_zod.z.string().describe("Font weight (e.g., '700', 'bold')").optional(), "line_height": import_zod.z.string().describe("Line height (e.g., '1.2', '56px')").optional(), "letter_spacing": import_zod.z.string().describe("Letter spacing (e.g., '-0.02em', '0.5px')").optional(), "text_transform": import_zod.z.enum(["none", "uppercase", "lowercase", "capitalize"]).describe("Text transformation").optional() }).catchall(import_zod.z.any()).describe("A single entry in the type scale").optional() }).catchall(import_zod.z.object({ "font": import_zod.z.string().describe("Font reference. Use a key from the fonts object (e.g., 'primary', 'secondary') to reference a defined font role, or a literal CSS font-family string as a fallback.").optional(), "size": import_zod.z.string().describe("Font size (e.g., '48px', '2rem')").optional(), "weight": import_zod.z.string().describe("Font weight (e.g., '700', 'bold')").optional(), "line_height": import_zod.z.string().describe("Line height (e.g., '1.2', '56px')").optional(), "letter_spacing": import_zod.z.string().describe("Letter spacing (e.g., '-0.02em', '0.5px')").optional(), "text_transform": import_zod.z.enum(["none", "uppercase", "lowercase", "capitalize"]).describe("Text transformation").optional() }).catchall(import_zod.z.any()).describe("A single entry in the type scale")).describe("Typography scale defining sizes and weights for different text roles. When sizes are in px, use base_width to indicate the reference canvas.").optional(), "asset_libraries": import_zod.z.array(import_zod.z.object({ "name": import_zod.z.string().describe("Display name of the asset library"), "type": import_zod.z.enum(["icon_set", "illustration_system", "image_library", "video_library", "template_library"]).describe("Type of asset library").optional(), "url": import_zod.z.string().url().describe("URL to the asset library (for human access)"), "description": import_zod.z.string().describe("Description of the library contents and usage").optional(), "color_guide": import_zod.z.object({ "roles": import_zod.z.array(import_zod.z.string()).describe("Named color roles used in the library (e.g., base, shadow_1, highlight_1, stroke)").optional(), "palettes": import_zod.z.array(import_zod.z.object({ "name": import_zod.z.string().describe("Palette name"), "colors": import_zod.z.record(import_zod.z.string(), import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("A single hex color value")).describe("Map of role names to hex color values") }).catchall(import_zod.z.any())).describe("Named color palettes mapping roles to specific colors").optional() }).catchall(import_zod.z.any()).describe("Color guide for the asset library defining roles and palettes").optional() }).catchall(import_zod.z.any()).describe("A managed asset library (icon set, illustration system, image collection). The URL is for human access; agent-facing DAM integration is under investigation.")).describe("References to managed asset libraries (icon sets, illustration systems, image collections). URLs are intended for human access; agent-facing DAM integration is under investigation.").optional(), "restrictions": import_zod.z.array(import_zod.z.string()).describe("Visual prohibitions and guardrails (e.g., 'Never use black backgrounds', 'Do not crop the logo', 'No stock photography of people on phones')").optional() }).catchall(import_zod.z.any()).describe("Structured visual rules for generative creative systems").optional(), "agents": import_zod.z.array(import_zod.z.object({ "type": import_zod.z.enum(["brand", "rights", "measurement", "governance", "creative", "sales", "buying", "signals"]).describe("Functional role of this agent"), "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("Agent endpoint URL (MCP or A2A). Callers comparing a brand's declared agent URL against another value (e.g., resolving 'is this the agent that signed this artifact?' or matching against a discovery cache) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. After the publication chain and an authorized request-signing key verify, this exact entry's canonical URL is the stable Agent identity input for principal mapping; the domain, JWKS URI, kid, and key material are credential or trust facts beneath it, not the Agent identity. See docs/reference/url-canonicalization."), "id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).max(100).describe("Agent identifier (useful for logging, multi-tenant platforms)"), "description": import_zod.z.string().max(500).describe("Human-readable description of this agent's capabilities or scope").optional(), "jwks_uri": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL of the agent's JWKS (RFC 7517) containing public keys used to verify artifacts this agent signs or requests it sends. Verified artifacts include signed governance_context tokens (for governance agents) and RFC 9421 HTTP Signatures on outgoing requests (for any agent). When absent, verifiers MUST default to /.well-known/jwks.json on the origin of `url`. Keys are identified by `kid` in the JWS header or RFC 9421 `keyid` parameter; JWKS MAY contain multiple keys to support rotation and per-purpose separation via `key_ops` and `use`.").optional(), "available_uses": import_zod.z.array(import_zod.z.enum(["likeness", "voice", "name", "endorsement", "motion_capture", "signature", "catchphrase", "sync", "background_music", "editorial", "commercial", "ai_generated_image"]).describe("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.")).describe("For rights agents: rights uses available for licensing").optional(), "right_types": import_zod.z.array(import_zod.z.enum(["talent", "character", "brand_ip", "music", "stock_media"]).describe("Categories of intellectual property rights that can be licensed through the brand protocol.")).describe("For rights agents: types of rights available").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).describe("ISO 3166-1 alpha-2 country codes where this agent operates. Omit for global scope.").optional() }).catchall(import_zod.z.any()).describe("An agent declared by a brand or house. Each entry identifies one agent endpoint and its functional role in the advertising ecosystem.")).describe("Agents authorized to act on behalf of this brand. Consumers resolving an agent by URL use the matching brand-level entry; do not infer a type-wide override of unrelated house-level entries when multiple same-type entries exist.").optional(), "brand_agent": import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("Brand agent MCP endpoint URL. Callers comparing this URL against another value (e.g., resolving 'is this the brand's declared agent?' against a discovery cache) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. See docs/reference/url-canonicalization."), "id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Agent identifier (useful for logging, multi-tenant DAMs)") }).catchall(import_zod.z.any()).describe("Deprecated: use agents array with type 'brand' instead. Brand agent that provides dynamic brand data via MCP.").optional(), "rights_agent": import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("Rights agent MCP endpoint URL. Callers comparing this URL against another value (e.g., matching against a brand's declared rights endpoint) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. See docs/reference/url-canonicalization."), "id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Agent identifier"), "available_uses": import_zod.z.array(import_zod.z.enum(["likeness", "voice", "name", "endorsement", "motion_capture", "signature", "catchphrase", "sync", "background_music", "editorial", "commercial", "ai_generated_image"]).describe("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.")).describe("Rights uses available for licensing through this agent"), "right_types": import_zod.z.array(import_zod.z.enum(["talent", "character", "brand_ip", "music", "stock_media"]).describe("Categories of intellectual property rights that can be licensed through the brand protocol.")).describe("Types of rights available").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).describe("Countries where rights are available (ISO 3166-1 alpha-2)").optional() }).catchall(import_zod.z.any()).describe("Deprecated: use agents array with type 'rights' instead. Rights licensing agent for this brand.").optional(), "contact": import_zod.z.object({ "email": import_zod.z.string().email().describe("Contact email").optional(), "phone": import_zod.z.string().describe("Contact phone number").optional() }).describe("Brand-level contact information").optional(), "collections": import_zod.z.array(import_zod.z.object({ "collection_id": import_zod.z.string().describe("Collection identifier as used in the seller's get_products responses").optional(), "name": import_zod.z.string().describe("Human-readable collection name"), "role": import_zod.z.enum(["host", "guest", "creator", "cast", "narrator", "producer", "correspondent", "commentator", "analyst"]).describe("This person's role on the collection").optional(), "seller_agent_url": import_zod.z.string().url().describe("URL of the sales agent that sells inventory for this collection. Buyer agents can query this agent for collection products.").optional() }).catchall(import_zod.z.any())).describe("Collections this person or brand is associated with. Enables bidirectional linking: a collection's talent references brand.json via brand_url, and brand.json links back to collections.").optional() }).catchall(import_zod.z.any()).describe("A brand within a house portfolio. Combines identity (who) with creative assets (how to represent). Referenced as domain + brand_id.")).describe("Inline brands owned by this house (parent-owned data). Use for sub-brands without their own canonical document \u2014 typically those without a dedicated domain or that the holdco wants to manage centrally. A brand_id MUST NOT appear in both brands[] and brand_refs[].").optional(), "brand_refs": import_zod.z.array(import_zod.z.object({ "domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the child's canonical brand.json lives"), "brand_id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Stable brand identifier within the house portfolio. Required so the cross-array uniqueness invariant (brand_id MUST NOT appear in both brands[] and brand_refs[]) is enforceable."), "managed_by": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Optional domain of the entity that operationally manages this brand (e.g., an agency network within a holdco). House-declared. Consumers MUST NOT use it for trust or authorization decisions. Aggregation across houses ('show me everything BBH manages') is the intended use; trust is unaffected.").optional(), "effective_at": import_zod.z.string().datetime().describe("ISO 8601 timestamp when the house established this ownership claim. Consumers age mutual-assertion edges from this date for TTL purposes and MUST NOT extend relationship trust before a future effective_at is reached. Optional; absent means the consumer ages from its own durable first observation.").optional() }).strict().describe("A house's ownership entry for a brand that publishes its own canonical brand.json elsewhere. The publisher (the house) asserts 'I own this brand, hosted at this domain, effective on this date.' Mutual-assertion trust requires the child's house_domain to reciprocate. Distinct from core/brand-ref.json (which identifies brands in media-buy plans). See docs/brand-protocol/brand-json.mdx")).describe("Portfolio entries for brands owned by this house that publish their own canonical brand.json elsewhere (child-owned data). Each entry asserts ownership plus where the child's document lives. Mutual-assertion trust: the pointed-to document's house_domain must equal this house's domain. Invariants: a brand_id MUST NOT appear in both brands[] and brand_refs[]; brand_id and domain MUST each be unique within brand_refs[]. See docs/brand-protocol/brand-json.mdx").optional(), "contact": import_zod.z.object({ "name": import_zod.z.string().min(1).max(255), "email": import_zod.z.string().email().max(255).optional(), "domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("A valid domain name").optional() }).catchall(import_zod.z.any()).describe("Contact information").optional(), "authorized_operators": import_zod.z.array(import_zod.z.object({ "domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain of the authorized operator (e.g., 'groupm.com')"), "brands": import_zod.z.array(import_zod.z.string().regex(new RegExp("^([a-z0-9_]+|\\*)$"))).describe("Brand IDs this operator is authorized for. Use ['*'] for all brands in the portfolio."), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).describe("ISO 3166-1 alpha-2 country codes where this authorization applies. Omit for global authorization.").optional(), "scopes": import_zod.z.array(import_zod.z.enum(["all", "media_buying", "creative_generation", "rights_clearance", "governance", "measurement", "agent_operations"])).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Activities this operator is authorized to perform for the listed brands and countries. Omit for backwards-compatible broad authorization. Use ['all'] only when every listed scope is delegated.").optional(), "valid_from": import_zod.z.string().datetime().describe("ISO 8601 timestamp when this operator authorization starts. Omit when authorization is already active or the start date is not tracked.").optional(), "valid_until": import_zod.z.string().datetime().describe("ISO 8601 timestamp when this operator authorization expires. Consumers MUST treat entries at or after this timestamp as inactive for authorization decisions.").optional() }).catchall(import_zod.z.any()).describe("An entity authorized to represent brands from this house. Verified by resolving the operator's domain. Optional validity fields let houses time-box agency-of-record and delegated-operator relationships without changing historical entries.")).describe("Entities authorized to represent brands from this house. Third parties (sellers, platforms) can verify an operator's authorization by checking this list. Operators are identified by domain.").optional(), "trademarks": import_zod.z.array(import_zod.z.object({ "registry": import_zod.z.string().describe("Trademark registry (e.g., 'USPTO', 'EUIPO', 'JPO', 'CNIPA')"), "number": import_zod.z.string().describe("Registration number as issued by the registry"), "mark": import_zod.z.string().describe("The registered mark as published"), "status": import_zod.z.enum(["active", "pending", "abandoned", "cancelled", "expired"]).describe("Registration status. Omit for active marks if status tracking is not maintained.").optional(), "license_type": import_zod.z.enum(["owned", "licensed_in", "licensed_out"]).describe("Whether the publisher owns the mark, licenses it from another entity, or licenses it to others. 'owned' is the default if omitted.").optional(), "licensor_domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain of the entity that licenses this mark to the publisher. Meaningful when license_type=licensed_in; omit otherwise.").optional(), "countries": import_zod.z.array(import_zod.z.string().min(2).max(2)).describe("ISO 3166-1 alpha-2 country codes where this registration applies. Omit for global or where the registry's jurisdiction is implicit.").optional(), "nice_classes": import_zod.z.array(import_zod.z.number().int().gte(1).lte(45)).describe("Nice Classification class numbers (1-45) covered by this registration. Disambiguates marks across industries (e.g., Delta-airline vs Delta-faucet). Omit if scope is implicit from registry.").optional() }).catchall(import_zod.z.any()).describe("A registered trademark. May appear at house level (corporate marks, e.g., 'NIKE' owned by Nike, Inc.) or at brand level (brand-specific marks, e.g., 'CONVERSE' owned by Converse). Resolution between house- and brand-level trademarks is union \u2014 both lists are valid claims about marks the publisher controls.")).describe("House-level (corporate) registered trademarks. Brand-level marks live on individual brand entries; resolution is union.").optional(), "last_updated": import_zod.z.string().datetime().optional() }).strict().and(import_zod.z.union([import_zod.z.any(), import_zod.z.any()])).describe("Full house/brand portfolio with hierarchy, creative assets, and properties. May carry inline brands (parent-owned, brands[]) and/or pointer brands (child-owned canonical documents, brand_refs[]). At least one of brands[] or brand_refs[] is required. A brand_id MUST NOT appear in both. See docs/brand-protocol/brand-json.mdx"), import_zod.z.record(import_zod.z.string(), import_zod.z.any()).and(import_zod.z.intersection(import_zod.z.object({ "$schema": import_zod.z.string().optional(), "version": import_zod.z.string().optional(), "default_language": import_zod.z.string().regex(new RegExp("^(?:[a-z]{2,8}(?:-[A-Z][a-z]{3})?(?:-(?:[A-Z]{2}|[0-9]{3}))?(?:-(?:[a-z0-9]{5,8}|[0-9][a-z0-9]{3}))*(?:-[0-9a-wy-z](?:-[a-z0-9]{2,8})+)*(?:-x(?:-[a-z0-9]{1,8})+)?|x(?:-[a-z0-9]{1,8})+)$")).min(2).max(63).describe("A well-formed BCP 47 language tag used by AdCP only as language identity. Script and region may refine that identity; other valid BCP 47 subtags remain part of tag matching but do not make this a general locale-settings object. It does not determine currency, time zone, number/date formatting, market, or legal jurisdiction. The AdCP canonical wire profile requires lower-case language and variants, title-case script, and upper-case region (for example `en-US`, `zh-Hant-TW`, or `x-private`). RFC 5646 comparisons are case-insensitive and its case regularization is optional; AdCP intentionally requires this stricter single wire spelling and receivers MUST reject differently cased tags rather than silently normalizing them. The schema pattern enforces the AdCP casing profile and extension structure for commonly used tags; conforming receivers additionally validate the complete RFC 5646 grammar and registry rules. Every new AdCP field carrying BCP 47 language identity or a concrete language range MUST reference this schema instead of declaring independent string constraints.").describe("BCP 47 language tag for legacy plain-string and plain-array content in this document. Readers assume en when omitted.").default("en"), "house_domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Optional pointer to the corporate house this brand belongs to. The named house's brand_refs[] MUST reciprocate for mutual-assertion trust. Single-hop only \u2014 a brand cannot itself declare brand_refs[]. Omit for standalone brands (no house).").optional(), "last_updated": import_zod.z.string().datetime().optional() }), import_zod.z.object({ "id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand identifier within the house. House chooses this ID."), "url": import_zod.z.string().url().describe("Primary brand URL for context and asset discovery").optional(), "identity_relying_parties": import_zod.z.array(import_zod.z.object({ "issuer": import_zod.z.object({ "domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where /.well-known/brand.json is hosted, or the brand's operating domain"), "brand_id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand identifier within the house portfolio. Optional for single-brand domains.").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("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.").optional(), "industries": import_zod.z.array(import_zod.z.string()).describe("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.").optional(), "data_subject_contestation": import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).optional(), "email": import_zod.z.string().email().optional(), "languages": import_zod.z.array(import_zod.z.string()).optional() }).strict().and(import_zod.z.union([import_zod.z.any(), import_zod.z.any()])).describe("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.").optional(), "brand_kit_override": import_zod.z.object({ "logo": import_zod.z.object({ "asset_type": import_zod.z.literal("image").describe("Discriminator identifying this as an image asset. See /schemas/creative/asset-types for the registry."), "url": import_zod.z.string().url().describe("URL to the image asset"), "width": import_zod.z.number().int().gte(1).describe("Width in pixels"), "height": import_zod.z.number().int().gte(1).describe("Height in pixels"), "file_size_bytes": import_zod.z.number().int().gte(1).describe("Image file size in bytes. Required by agents that advertise a max_file_size_kb constraint.").optional(), "pixel_ratio": import_zod.z.number().gt(0).describe("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.").optional(), "state_id": import_zod.z.string().describe("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.").optional(), "breakpoint_id": import_zod.z.string().describe("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.").optional(), "focal_point": import_zod.z.array(import_zod.z.number().gte(0).lte(1)).max(2).describe("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.").optional(), "format": import_zod.z.string().describe("Image file format (jpg, png, gif, webp, etc.)").optional(), "alt_text": import_zod.z.string().describe("Alternative text for accessibility").optional(), "provenance": import_zod.z.object({ "digital_source_type": import_zod.z.enum(["digital_capture", "digital_creation", "trained_algorithmic_media", "composite_with_trained_algorithmic_media", "algorithmic_media", "composite_capture", "composite_synthetic", "human_edits", "data_driven_media"]).describe("IPTC-aligned classification of AI involvement in producing this content").optional(), "synthetic_depiction": import_zod.z.boolean().describe("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`.").optional(), "ai_tool": import_zod.z.object({ "name": import_zod.z.string().describe("Name of the AI tool or model (e.g., 'DALL-E 3', 'Stable Diffusion XL', 'Gemini')"), "version": import_zod.z.string().describe("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.").optional(), "provider": import_zod.z.string().describe("Organization that provides the AI tool (e.g., 'OpenAI', 'Stability AI', 'Google')").optional() }).describe("AI system used to generate or modify this content. Aligns with IPTC 2025.1 AI metadata fields and C2PA claim_generator.").optional(), "human_oversight": import_zod.z.enum(["none", "prompt_only", "selected", "edited", "directed"]).describe("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`.").optional(), "declared_by": import_zod.z.object({ "agent_url": import_zod.z.string().url().describe("URL of the agent or service that declared this provenance").optional(), "role": import_zod.z.enum(["creator", "advertiser", "agency", "platform", "tool"]).describe("Role of the declaring party in the supply chain") }).describe("Party declaring this provenance. Identifies who attached the provenance claim, enabling receiving parties to assess trust.").optional(), "declared_at": import_zod.z.string().datetime().describe("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.").optional(), "created_time": import_zod.z.string().datetime().describe("When this content was created or generated (ISO 8601)").optional(), "c2pa": import_zod.z.object({ "manifest_url": import_zod.z.string().url().describe("URL to the C2PA manifest store for this content") }).describe("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.").optional(), "embedded_provenance": import_zod.z.array(import_zod.z.object({ "method": import_zod.z.enum(["manifest_wrapper", "provenance_markers"]).describe("How provenance data is carried within the content"), "standard": import_zod.z.string().describe("Standard the embedding conforms to, if any (e.g., 'c2pa' for C2PA Section A.7 text manifest embedding)").optional(), "provider": import_zod.z.string().describe("Organization that performed the embedding (e.g., 'Encypher', 'Digimarc'). Display label and audit context \u2014 not a wire identifier."), "verify_agent": import_zod.z.object({ "agent_url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("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."), "feature_id": import_zod.z.string().describe("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.").optional() }).strict().describe("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).").optional(), "embedded_at": import_zod.z.string().datetime().describe("When the provenance data was embedded (ISO 8601)").optional() })).describe("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`).").optional(), "watermarks": import_zod.z.array(import_zod.z.object({ "media_type": import_zod.z.enum(["audio", "image", "video", "text"]).describe("Media category of the watermarked content"), "provider": import_zod.z.string().describe("Organization that applied the watermark (e.g., 'Imatag', 'Steg.AI', 'Encypher'). Display label and audit context \u2014 not a wire identifier."), "verify_agent": import_zod.z.object({ "agent_url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("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."), "feature_id": import_zod.z.string().describe("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.").optional() }).strict().describe("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).").optional(), "c2pa_action": import_zod.z.enum(["c2pa.watermarked.bound", "c2pa.watermarked.unbound"]).describe("C2PA action classification for this watermark").optional(), "embedded_at": import_zod.z.string().datetime().describe("When the watermark was applied (ISO 8601)").optional() })).describe("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`).").optional(), "disclosure": import_zod.z.object({ "required": import_zod.z.boolean().describe("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."), "jurisdictions": import_zod.z.array(import_zod.z.object({ "country": import_zod.z.string().describe("ISO 3166-1 alpha-2 country code (e.g., 'US', 'DE', 'CN')"), "region": import_zod.z.string().describe("Sub-national region code (e.g., 'CA' for California, 'BY' for Bavaria)").optional(), "regulation": import_zod.z.string().describe("Regulation identifier (e.g., 'eu_ai_act_article_50', 'ca_sb_942', 'cn_deep_synthesis')"), "label_text": import_zod.z.string().describe("Required disclosure label text for this jurisdiction, in the local language").optional(), "render_guidance": import_zod.z.object({ "persistence": import_zod.z.enum(["continuous", "initial", "flexible"]).describe("How long the disclosure must persist during content playback or display").optional(), "min_duration_ms": import_zod.z.number().int().gte(1).describe("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.").optional(), "positions": import_zod.z.array(import_zod.z.enum(["prominent", "footer", "audio", "subtitle", "overlay", "end_card", "pre_roll", "companion"]).describe("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.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Preferred disclosure positions in priority order. The first position a format supports should be used.").optional(), "ext": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).describe("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.").optional() }).describe("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.").optional() })).describe("Jurisdictions where disclosure obligations apply").optional() }).describe("Regulatory disclosure requirements for this content. Indicates whether AI disclosure is required and under which jurisdictions.").optional(), "verification": import_zod.z.array(import_zod.z.object({ "verified_by": import_zod.z.string().describe("Name of the verification service (e.g., 'DoubleVerify', 'Hive Moderation', 'Reality Defender')"), "verified_time": import_zod.z.string().datetime().describe("When the verification was performed (ISO 8601)").optional(), "result": import_zod.z.enum(["authentic", "ai_generated", "ai_modified", "inconclusive"]).describe("Verification outcome"), "confidence": import_zod.z.number().gte(0).lte(1).describe("Confidence score of the verification result (0.0 to 1.0)").optional(), "details_url": import_zod.z.string().url().describe("URL to the full verification report").optional() })).describe("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.").optional(), "ext": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).describe("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.").optional() }).describe("Provenance metadata for this asset, overrides manifest-level provenance").optional() }).catchall(import_zod.z.any()).describe("Override logo asset.").optional(), "colors": import_zod.z.object({ "primary": import_zod.z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional(), "secondary": import_zod.z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional(), "accent": import_zod.z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional() }).catchall(import_zod.z.any()).describe("Override brand colors (hex strings).").optional(), "voice": import_zod.z.string().describe("Override brand-voice description for surface-composed text/audio output.").optional(), "tagline": import_zod.z.string().describe("Override tagline.").optional() }).catchall(import_zod.z.any()).describe("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.").optional() }).strict().describe(`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).`), "scheme": import_zod.z.string().describe('Proof scheme and version, e.g. "world_id_v4".').optional(), "relying_party_id": import_zod.z.string().describe("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."), "scope": import_zod.z.enum(["entity", "property"]).describe("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).").optional() }).strict().describe("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.")).describe("Verified-identity relying parties scoped to this brand/property, for attestation provenance in TMP Identity Match. Use when a brand or property runs its own relying_party_id (per-property pseudonyms); entity-wide relying parties live on the house object. See specs/tmp-verified-identity-attestation.md.").optional(), "names": import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.string().min(1)).describe("A localized name using the legacy underscore-separated language/region key convention (for example 'en_US', 'fr_CA', or 'zh_CN') and a name value. Bare language codes such as 'en' are also accepted for backwards compatibility. These keys are not AdCP locale-tag values: a bridge to /schemas/core/locale-tag.json replaces '_' with '-', applies the AdCP canonical wire profile, and validates the result rather than passing the key through unchanged.")).describe("Localized brand names. Multiple entries per language allowed for aliases."), "keller_type": import_zod.z.enum(["master", "sub_brand", "endorsed", "independent"]).describe("Brand architecture type from Keller's theory. master: primary brand of house. sub_brand: carries parent name (Nike SB). endorsed: independent identity backed by parent (Air Jordan 'by Nike'). independent: operates separately (Converse under Nike, Inc.)").optional(), "parent_brand": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Parent brand ID for sub-brands and endorsed brands").optional(), "description": import_zod.z.string().describe("Brand description").optional(), "industries": import_zod.z.array(import_zod.z.string()).describe("Brand industries (e.g., ['automotive'] or ['pharmaceutical', 'cpg'] for a consumer health company). Describes what the company does \u2014 not what regulatory regimes apply (use policy_categories for that).").optional(), "target_audience": import_zod.z.string().describe("Primary target audience").optional(), "logos": import_zod.z.array(import_zod.z.object({ "id": import_zod.z.string().regex(new RegExp("^[a-z0-9][a-z0-9_-]*$")).describe("Stable identifier for this logo entry. Recommended when logo usage rules or mark lockups need to bind to a specific logo asset.").optional(), "url": import_zod.z.string().url().describe("URL to the logo asset"), "orientation": import_zod.z.enum(["square", "horizontal", "vertical", "stacked"]).describe("Logo aspect ratio orientation. square: ~1:1, horizontal: wide, vertical: tall, stacked: vertically arranged elements").optional(), "background": import_zod.z.enum(["dark-bg", "light-bg", "transparent-bg"]).describe("Background compatibility. dark-bg: use on dark backgrounds, light-bg: use on light backgrounds, transparent-bg: has transparent background").optional(), "variant": import_zod.z.enum(["primary", "secondary", "icon", "wordmark", "full-lockup"]).describe("Logo variant type. primary: main logo, secondary: alternative, icon: symbol only, wordmark: text only, full-lockup: complete logo").optional(), "tags": import_zod.z.array(import_zod.z.string()).describe("Additional semantic tags for custom categorization beyond the standard orientation, background, and variant fields").optional(), "slots": import_zod.z.array(import_zod.z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical renderer slots where this logo is appropriate. Consumers SHOULD prefer this over inferring from tags or usage prose when selecting a logo for a specific UI surface.").optional(), "usage": import_zod.z.string().describe("Human-readable description of when to use this logo variant (e.g., 'Primary logo for use on light backgrounds')").optional(), "width": import_zod.z.number().int().describe("Width in pixels").optional(), "height": import_zod.z.number().int().describe("Height in pixels").optional() }).catchall(import_zod.z.any()).describe("Brand logo asset with structured fields for orientation, background compatibility, and variant type")).describe("Brand logo assets").optional(), "colors": import_zod.z.object({ "primary": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "secondary": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "accent": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "background": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "text": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "heading": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "body": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "label": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "border": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "divider": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "surface_1": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional(), "surface_2": import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))]).optional() }).catchall(import_zod.z.union([import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")), import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")))])).describe("Brand color palette. Each role accepts a single hex color or an array of hex colors for brands with multiple values per role. Beyond the core five roles, brands can provide additional color roles for finer granularity \u2014 heading, body, label, border, divider, surface_1, surface_2, etc.").optional(), "fonts": import_zod.z.object({ "primary": import_zod.z.union([import_zod.z.string().describe("CSS font-family name (e.g., 'Montserrat', 'Arial, sans-serif')"), import_zod.z.object({ "family": import_zod.z.string().describe("CSS font-family name (e.g., 'Brand Sans')"), "files": import_zod.z.array(import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL to the font file (WOFF2, TTF, or OTF)"), "weight": import_zod.z.number().int().gte(100).lte(900).describe("CSS numeric font-weight for static fonts (100-900)").optional(), "weight_range": import_zod.z.array(import_zod.z.number().int().gte(100).lte(900)).max(2).describe("Variable font weight axis range as [min, max] (e.g., [100, 900]). Use instead of weight for variable fonts.").optional(), "style": import_zod.z.enum(["normal", "italic", "oblique"]).describe("CSS font-style").optional() }).catchall(import_zod.z.any()).describe("A font file with weight, style, and variable font metadata")).max(36).describe("Font files for different weights and styles").optional(), "opentype_features": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9]{4}$"))).max(20).describe("OpenType feature tags to enable (e.g., ['ss01', 'tnum', 'cv01']). These are four-character tags per the OpenType spec.").optional(), "fallbacks": import_zod.z.array(import_zod.z.string().max(100)).max(10).describe("Ordered fallback font-family names for when the primary font is unavailable or does not support the required script (e.g., ['Noto Sans Arabic', 'Noto Sans SC', 'sans-serif'])").optional() }).catchall(import_zod.z.any()).describe("Structured font with family name, downloadable font files, and typographic metadata")]).describe("Primary font family").optional(), "secondary": import_zod.z.union([import_zod.z.string().describe("CSS font-family name (e.g., 'Montserrat', 'Arial, sans-serif')"), import_zod.z.object({ "family": import_zod.z.string().describe("CSS font-family name (e.g., 'Brand Sans')"), "files": import_zod.z.array(import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL to the font file (WOFF2, TTF, or OTF)"), "weight": import_zod.z.number().int().gte(100).lte(900).describe("CSS numeric font-weight for static fonts (100-900)").optional(), "weight_range": import_zod.z.array(import_zod.z.number().int().gte(100).lte(900)).max(2).describe("Variable font weight axis range as [min, max] (e.g., [100, 900]). Use instead of weight for variable fonts.").optional(), "style": import_zod.z.enum(["normal", "italic", "oblique"]).describe("CSS font-style").optional() }).catchall(import_zod.z.any()).describe("A font file with weight, style, and variable font metadata")).max(36).describe("Font files for different weights and styles").optional(), "opentype_features": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9]{4}$"))).max(20).describe("OpenType feature tags to enable (e.g., ['ss01', 'tnum', 'cv01']). These are four-character tags per the OpenType spec.").optional(), "fallbacks": import_zod.z.array(import_zod.z.string().max(100)).max(10).describe("Ordered fallback font-family names for when the primary font is unavailable or does not support the required script (e.g., ['Noto Sans Arabic', 'Noto Sans SC', 'sans-serif'])").optional() }).catchall(import_zod.z.any()).describe("Structured font with family name, downloadable font files, and typographic metadata")]).describe("Secondary font family").optional() }).catchall(import_zod.z.union([import_zod.z.string().describe("CSS font-family name (e.g., 'Montserrat', 'Arial, sans-serif')"), import_zod.z.object({ "family": import_zod.z.string().describe("CSS font-family name (e.g., 'Brand Sans')"), "files": import_zod.z.array(import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL to the font file (WOFF2, TTF, or OTF)"), "weight": import_zod.z.number().int().gte(100).lte(900).describe("CSS numeric font-weight for static fonts (100-900)").optional(), "weight_range": import_zod.z.array(import_zod.z.number().int().gte(100).lte(900)).max(2).describe("Variable font weight axis range as [min, max] (e.g., [100, 900]). Use instead of weight for variable fonts.").optional(), "style": import_zod.z.enum(["normal", "italic", "oblique"]).describe("CSS font-style").optional() }).catchall(import_zod.z.any()).describe("A font file with weight, style, and variable font metadata")).max(36).describe("Font files for different weights and styles").optional(), "opentype_features": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9]{4}$"))).max(20).describe("OpenType feature tags to enable (e.g., ['ss01', 'tnum', 'cv01']). These are four-character tags per the OpenType spec.").optional(), "fallbacks": import_zod.z.array(import_zod.z.string().max(100)).max(10).describe("Ordered fallback font-family names for when the primary font is unavailable or does not support the required script (e.g., ['Noto Sans Arabic', 'Noto Sans SC', 'sans-serif'])").optional() }).catchall(import_zod.z.any()).describe("Structured font with family name, downloadable font files, and typographic metadata")]).describe("A font role entry. Either a CSS font-family string (simple) or a structured object with family name and font files (rich).")).describe("Brand typography. Each key is a role name (e.g., 'primary', 'secondary') referenced by type_scale entries. Values are either a CSS font-family string or a structured object with font files for reliable resolution.").optional(), "tone": import_zod.z.union([import_zod.z.string().describe("Simple tone descriptors for backwards compatibility"), import_zod.z.object({ "voice": import_zod.z.union([import_zod.z.string(), import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.string().min(1)).describe("A localized name using the legacy underscore-separated language/region key convention (for example 'en_US', 'fr_CA', or 'zh_CN') and a name value. Bare language codes such as 'en' are also accepted for backwards compatibility. These keys are not AdCP locale-tag values: a bridge to /schemas/core/locale-tag.json replaces '_' with '-', applies the AdCP canonical wire profile, and validates the result rather than passing the key through unchanged."))]).describe("High-level voice descriptor, either a legacy plain string or localized values.").optional(), "attributes": import_zod.z.union([import_zod.z.array(import_zod.z.string()), import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.array(import_zod.z.string())).describe("One locale mapped to a complete ordered string list. The list is selected as a unit so readers never assemble mixed-language output from independently localized elements."))]).describe("Personality traits that characterize the brand voice. Localized lists are selected as a whole.").optional(), "dos": import_zod.z.union([import_zod.z.array(import_zod.z.string()), import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.array(import_zod.z.string())).describe("One locale mapped to a complete ordered string list. The list is selected as a unit so readers never assemble mixed-language output from independently localized elements."))]).describe("Guidance for copy generation - what TO do. Localized lists are selected as a whole.").optional(), "donts": import_zod.z.union([import_zod.z.array(import_zod.z.string()), import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.array(import_zod.z.string())).describe("One locale mapped to a complete ordered string list. The list is selected as a unit so readers never assemble mixed-language output from independently localized elements."))]).describe("Guardrails to avoid brand violations - what NOT to do. Localized lists are selected as a whole.").optional() }).describe("Structured brand voice guidelines")]).describe("Brand voice and messaging tone guidelines").optional(), "tagline": import_zod.z.union([import_zod.z.string().describe("Plain tagline string for backwards compatibility"), import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.string().min(1)).describe("A localized name using the legacy underscore-separated language/region key convention (for example 'en_US', 'fr_CA', or 'zh_CN') and a name value. Bare language codes such as 'en' are also accepted for backwards compatibility. These keys are not AdCP locale-tag values: a bridge to /schemas/core/locale-tag.json replaces '_' with '-', applies the AdCP canonical wire profile, and validates the result rather than passing the key through unchanged.")).describe("Localized taglines with BCP 47 locale codes")]).describe("Brand tagline or slogan. Accepts a plain string or a localized array matching the names pattern.").optional(), "assets": import_zod.z.array(import_zod.z.object({ "asset_id": import_zod.z.string().describe("Unique identifier"), "asset_type": import_zod.z.enum(["image", "video", "audio", "text", "markdown", "html", "css", "javascript", "zip", "vast", "daast", "url", "webhook", "brief", "catalog", "published_post"]).describe("Type of asset content"), "url": import_zod.z.string().url().describe("URL to CDN-hosted asset file"), "tags": import_zod.z.array(import_zod.z.string()).describe("Tags for discovery (e.g., 'hero', 'lifestyle', 'product', 'holiday')").optional(), "name": import_zod.z.union([import_zod.z.string(), import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.string().min(1)).describe("A localized name using the legacy underscore-separated language/region key convention (for example 'en_US', 'fr_CA', or 'zh_CN') and a name value. Bare language codes such as 'en' are also accepted for backwards compatibility. These keys are not AdCP locale-tag values: a bridge to /schemas/core/locale-tag.json replaces '_' with '-', applies the AdCP canonical wire profile, and validates the result rather than passing the key through unchanged."))]).describe("Human-readable name, either a legacy plain string or localized values.").optional(), "description": import_zod.z.union([import_zod.z.string(), import_zod.z.array(import_zod.z.record(import_zod.z.string(), import_zod.z.string().min(1)).describe("A localized name using the legacy underscore-separated language/region key convention (for example 'en_US', 'fr_CA', or 'zh_CN') and a name value. Bare language codes such as 'en' are also accepted for backwards compatibility. These keys are not AdCP locale-tag values: a bridge to /schemas/core/locale-tag.json replaces '_' with '-', applies the AdCP canonical wire profile, and validates the result rather than passing the key through unchanged."))]).describe("Asset description or usage notes, either a legacy plain string or localized values.").optional(), "width": import_zod.z.number().int().describe("Image/video width in pixels").optional(), "height": import_zod.z.number().int().describe("Image/video height in pixels").optional(), "duration_seconds": import_zod.z.number().describe("Video/audio duration in seconds").optional(), "file_size_bytes": import_zod.z.number().int().describe("File size in bytes").optional(), "format": import_zod.z.string().describe("File format (e.g., 'jpg', 'mp4', 'mp3')").optional(), "metadata": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).describe("Additional asset-specific metadata").optional() }).catchall(import_zod.z.any()).describe("Brand asset (image, video, audio, text)")).describe("Brand asset library").optional(), "properties": import_zod.z.array(import_zod.z.object({ "type": import_zod.z.enum(["website", "mobile_app", "ctv_app", "desktop_app", "dooh", "podcast", "radio", "linear_tv", "streaming_audio", "ai_assistant"]).describe("Property type"), "identifier": import_zod.z.string().min(1).describe("Property identifier - domain for websites, bundle ID for apps"), "store": import_zod.z.enum(["apple", "google", "amazon", "roku", "samsung", "lg", "other"]).describe("App store for mobile/CTV apps").optional(), "region": import_zod.z.string().regex(new RegExp("^([A-Z]{2}|global)$")).describe("ISO 3166-1 alpha-2 country code or 'global'").optional(), "primary": import_zod.z.boolean().describe("Whether this is the primary property for the brand").default(false), "relationship": import_zod.z.enum(["owned", "direct", "delegated", "ad_network"]).describe("How this brand relates to the property. 'owned': the brand owns and operates this property (default) and has no adagents.json delegation_type counterpart. 'direct': the brand is the direct sales path for this property, even if a third party operates the software (e.g., a publisher's in-house ad team using a vendor's tech). 'delegated': the brand manages monetization for this property \u2014 they are in charge of ad sales (e.g., Mediavine managing a food blog). 'ad_network': the brand sells this property's inventory as part of a network or exchange \u2014 they are a path to the inventory, not the path (e.g., PubMatic as an SSP). For non-owned properties, the publisher confirms the relationship by setting the matching delegation_type on the agent's authorization in their adagents.json.").default("owned") }).catchall(import_zod.z.any()).describe("A digital property associated with a brand. Defaults to owned; use 'relationship' to declare direct, delegated, or ad_network properties. For direct, delegated, and network paths, these values match the delegation_type field in adagents.json, creating a bilateral verification chain: the operator declares the relationship here, the publisher confirms by setting the same delegation_type on the agent's authorization in their adagents.json. 'owned' is an inline ownership declaration with no adagents.json counterpart.")).describe("Digital properties associated with this brand \u2014 owned, managed, or represented").optional(), "product_catalog": import_zod.z.object({ "feed_url": import_zod.z.string().url().describe("URL to product catalog feed"), "feed_format": import_zod.z.enum(["google_merchant_center", "facebook_catalog", "shopify", "linkedin_jobs", "tiktok_shop", "pinterest_catalog", "openai_product_feed", "custom"]).describe("Format of the product feed").optional(), "categories": import_zod.z.array(import_zod.z.string()).describe("Product categories available in the catalog").optional(), "last_updated": import_zod.z.string().datetime().describe("When the product catalog was last updated").optional(), "update_frequency": import_zod.z.enum(["realtime", "hourly", "daily", "weekly"]).describe("How frequently the product catalog is updated").optional(), "agentic_checkout": import_zod.z.object({ "endpoint": import_zod.z.string().url().describe("Base URL for checkout session API"), "spec": import_zod.z.string().describe("Checkout API specification identifier. Use a namespaced string to identify the checkout protocol (e.g., vendor-prefixed or custom). Vendor-specific values belong under ext.{vendor}."), "supported_payment_providers": import_zod.z.array(import_zod.z.string()).describe("Payment providers supported by this checkout endpoint").optional() }).describe("Agentic checkout endpoint configuration").optional() }).catchall(import_zod.z.any()).describe("Product catalog for e-commerce brands").optional(), "privacy_policy_url": import_zod.z.string().url().describe("URL to the brand's privacy policy").optional(), "data_subject_contestation": import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL to a human-accessible contestation form or information page.").optional(), "email": import_zod.z.string().email().describe("Email address for contestation requests. Deployer MUST monitor and respond within the timelines set by applicable law (e.g., 1 month under GDPR Art. 12(3)).").optional(), "languages": import_zod.z.array(import_zod.z.string()).describe("BCP 47 language tags the contestation channel supports (e.g., ['en', 'de', 'fr']). At minimum SHOULD include a language spoken in every jurisdiction where the brand runs regulated-vertical campaigns.").optional() }).strict().and(import_zod.z.union([import_zod.z.any(), import_zod.z.any()])).describe("Contact point where a data subject can request human intervention, express their view, or contest an automated decision \u2014 satisfying GDPR Article 22(3) and EU AI Act Article 26(11) transparency obligations. This is a contact reference (URL, email, or both), not a machine-callable API. AdCP surfaces the pointer; the deployer runs the contestation workflow.").optional(), "disclaimers": import_zod.z.array(import_zod.z.object({ "text": import_zod.z.string(), "context": import_zod.z.string().optional(), "required": import_zod.z.boolean().default(true) })).describe("Legal disclaimers for creatives").optional(), "trademarks": import_zod.z.array(import_zod.z.object({ "registry": import_zod.z.string().describe("Trademark registry (e.g., 'USPTO', 'EUIPO', 'JPO', 'CNIPA')"), "number": import_zod.z.string().describe("Registration number as issued by the registry"), "mark": import_zod.z.string().describe("The registered mark as published"), "status": import_zod.z.enum(["active", "pending", "abandoned", "cancelled", "expired"]).describe("Registration status. Omit for active marks if status tracking is not maintained.").optional(), "license_type": import_zod.z.enum(["owned", "licensed_in", "licensed_out"]).describe("Whether the publisher owns the mark, licenses it from another entity, or licenses it to others. 'owned' is the default if omitted.").optional(), "licensor_domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain of the entity that licenses this mark to the publisher. Meaningful when license_type=licensed_in; omit otherwise.").optional(), "countries": import_zod.z.array(import_zod.z.string().min(2).max(2)).describe("ISO 3166-1 alpha-2 country codes where this registration applies. Omit for global or where the registry's jurisdiction is implicit.").optional(), "nice_classes": import_zod.z.array(import_zod.z.number().int().gte(1).lte(45)).describe("Nice Classification class numbers (1-45) covered by this registration. Disambiguates marks across industries (e.g., Delta-airline vs Delta-faucet). Omit if scope is implicit from registry.").optional() }).catchall(import_zod.z.any()).describe("A registered trademark. May appear at house level (corporate marks, e.g., 'NIKE' owned by Nike, Inc.) or at brand level (brand-specific marks, e.g., 'CONVERSE' owned by Converse). Resolution between house- and brand-level trademarks is union \u2014 both lists are valid claims about marks the publisher controls.")).describe("Brand-level registered trademarks. Use for marks the brand owns or controls (e.g., a sub-brand's own marks distinct from the corporate parent). House-level trademarks live on the house object; resolution between the two is union \u2014 both lists are valid claims.").optional(), "voice_synthesis": import_zod.z.object({ "provider": import_zod.z.string().optional(), "voice_id": import_zod.z.string().optional(), "settings": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).optional() }).catchall(import_zod.z.any()).describe("TTS voice synthesis configuration for AI-generated audio").optional(), "avatar": import_zod.z.object({ "provider": import_zod.z.string().optional(), "avatar_id": import_zod.z.string().optional(), "settings": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).optional() }).catchall(import_zod.z.any()).describe("Visual avatar configuration").optional(), "visual_guidelines": import_zod.z.object({ "photography": import_zod.z.object({ "realism": import_zod.z.enum(["natural", "stylized", "hyperreal", "abstract"]).describe("Level of photographic realism").optional(), "lighting": import_zod.z.string().describe("Lighting style (e.g., 'soft daylight', 'studio', 'golden hour', 'high-key', 'low-key')").optional(), "color_temperature": import_zod.z.enum(["warm", "neutral", "cool"]).describe("Overall color temperature of photography").optional(), "contrast": import_zod.z.enum(["low", "medium", "high"]).describe("Contrast level in photography").optional(), "depth_of_field": import_zod.z.enum(["shallow", "medium", "deep"]).describe("Depth of field preference. shallow: blurred background with subject isolation, deep: everything in focus").optional(), "subject": import_zod.z.object({ "people": import_zod.z.object({ "age_range": import_zod.z.string().describe("Target age range (e.g., '20-35')").optional(), "diversity": import_zod.z.string().describe("Diversity representation (e.g., 'mixed', 'varied')").optional(), "mood": import_zod.z.array(import_zod.z.string()).describe("Mood descriptors (e.g., ['confident', 'relaxed'])").optional() }).catchall(import_zod.z.any()).describe("People photography guidelines").optional(), "product_focus": import_zod.z.enum(["in-use", "isolated", "lifestyle", "detail"]).describe("How products are shown").optional(), "setting": import_zod.z.string().describe("Environmental context for photography (e.g., 'indoor', 'outdoor', 'studio', 'urban', 'nature', 'workplace')").optional() }).catchall(import_zod.z.any()).describe("Subject matter guidelines").optional(), "framing": import_zod.z.object({ "subject_position": import_zod.z.string().describe("Where the subject sits in frame (e.g., 'center', 'center-left', 'rule-of-thirds')").optional(), "crop_style": import_zod.z.string().describe("Cropping convention (e.g., 'waist-up', 'full-body', 'close-up', 'wide')").optional(), "perspective": import_zod.z.string().describe("Camera perspective (e.g., 'eye-level', 'overhead', 'low-angle')").optional() }).catchall(import_zod.z.any()).describe("Camera framing rules").optional(), "preferred_aspect_ratios": import_zod.z.array(import_zod.z.string().regex(new RegExp("^\\d+:\\d+$"))).describe("Preferred aspect ratios for brand photography (e.g., '16:9', '4:5', '1:1')").optional(), "tags": import_zod.z.array(import_zod.z.string()).describe("Additional style descriptors").optional() }).catchall(import_zod.z.any()).describe("Photography style rules for generative creative systems. Defines how brand photography should look when selected or generated.").optional(), "graphic_style": import_zod.z.object({ "style_type": import_zod.z.enum(["flat_illustration", "geometric", "gradient_mesh", "editorial_collage", "hand_drawn", "minimal_line_art", "3d_render", "isometric", "photographic_composite"]).describe("Primary graphic style").optional(), "stroke_style": import_zod.z.enum(["rounded", "square", "mixed", "none"]).describe("Stroke end/join style").optional(), "stroke_weight": import_zod.z.string().describe("Stroke weight (e.g., '2px', 'thin', 'bold')").optional(), "corner_radius": import_zod.z.string().describe("Default corner radius for graphic and illustration elements (e.g., '12px', '8px', 'sharp'). For UI component radii (buttons, cards, inputs), see visual_guidelines.border_radius.").optional(), "tags": import_zod.z.array(import_zod.z.string()).describe("Additional style descriptors").optional() }).catchall(import_zod.z.any()).describe("Visual language for brand graphics and illustrations").optional(), "shapes": import_zod.z.object({ "primary_shape": import_zod.z.string().describe("Primary brand shape (e.g., 'rounded_rectangle', 'circle', 'hexagon')").optional(), "secondary_shapes": import_zod.z.array(import_zod.z.string()).describe("Secondary shapes in the brand vocabulary").optional(), "usage": import_zod.z.object({ "max_per_layout": import_zod.z.number().int().describe("Maximum distinct shapes per layout").optional(), "overlap_allowed": import_zod.z.boolean().describe("Whether shapes may overlap").optional() }).catchall(import_zod.z.any()).describe("Shape usage rules").optional() }).catchall(import_zod.z.any()).describe("Distinctive shapes used as part of brand visual identity").optional(), "iconography": import_zod.z.object({ "style": import_zod.z.enum(["outline", "filled", "duotone", "flat", "glyph", "hand_drawn"]).describe("Icon rendering style").optional(), "stroke_weight": import_zod.z.string().describe("Icon stroke weight (e.g., '2px', '1.5px')").optional(), "corner_style": import_zod.z.enum(["rounded", "square", "mixed"]).describe("Corner style for icon paths").optional(), "usage": import_zod.z.object({ "max_per_frame": import_zod.z.number().int().describe("Maximum icons per creative frame").optional(), "size_ratio": import_zod.z.string().describe("Icon-to-layout size ratio (e.g., '1:8')").optional() }).catchall(import_zod.z.any()).describe("Icon usage rules").optional() }).catchall(import_zod.z.any()).describe("Icon style system and usage rules").optional(), "composition": import_zod.z.object({ "overlays": import_zod.z.object({ "gradient_style": import_zod.z.enum(["linear", "radial", "conic", "none"]).describe("Gradient type for overlays").optional(), "gradient_direction": import_zod.z.string().describe("Gradient direction (e.g., '45deg', 'to-bottom-right')").optional(), "opacity": import_zod.z.string().describe("Overlay opacity (e.g., '70%')").optional() }).catchall(import_zod.z.any()).describe("Graphic overlay rules").optional(), "texture": import_zod.z.object({ "style": import_zod.z.enum(["none", "subtle_grain", "noise", "paper", "fabric", "concrete"]).describe("Texture style applied to creative assets").optional(), "intensity": import_zod.z.enum(["low", "medium", "high"]).describe("Texture intensity").optional() }).catchall(import_zod.z.any()).describe("Texture treatment rules").optional(), "backgrounds": import_zod.z.object({ "types_allowed": import_zod.z.array(import_zod.z.enum(["solid_color", "gradient", "blurred_photo", "image", "video", "pattern", "transparent"])).describe("Permitted background types").optional() }).catchall(import_zod.z.any()).describe("Background treatment rules").optional() }).catchall(import_zod.z.any()).describe("Layout composition rules including overlays, textures, and backgrounds").optional(), "border_radius": import_zod.z.object({ "none": import_zod.z.string().describe("Explicitly sharp corners (e.g., '0')").optional(), "default": import_zod.z.string().describe("Default border radius for UI components (e.g., '8px', '12px', '0'). For graphic/illustration elements, see graphic_style.corner_radius.").optional(), "small": import_zod.z.string().describe("Small border radius for compact elements (e.g., '4px')").optional(), "large": import_zod.z.string().describe("Large border radius for cards and containers (e.g., '16px', '24px')").optional(), "pill": import_zod.z.string().describe("Fully rounded / pill shape (e.g., '999px')").optional() }).catchall(import_zod.z.string()).describe("Named border radius presets for UI components and layout elements. One of the most visible brand differentiators \u2014 Airbnb uses generous 20px, Stripe uses precise 4\u20138px, Spotify uses pill/999px.").optional(), "elevation": import_zod.z.object({ "none": import_zod.z.string().describe("No shadow (e.g., 'none')").optional(), "subtle": import_zod.z.string().describe("Subtle shadow for slight lift (e.g., '0 1px 2px rgba(0,0,0,0.05)')").optional(), "card": import_zod.z.string().describe("Card-level shadow (e.g., '0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.1)')").optional(), "modal": import_zod.z.string().describe("Modal/overlay shadow (e.g., '0 20px 25px -5px rgba(0,0,0,0.1), 0 8px 10px -6px rgba(0,0,0,0.1)')").optional() }).catchall(import_zod.z.string()).describe("Named shadow/elevation levels. Brands use elevation as identity \u2014 from Stripe's blue-tinted multi-layer shadows to Apple's single diffuse shadow. Values are CSS box-shadow syntax.").optional(), "spacing": import_zod.z.object({ "unit": import_zod.z.string().describe("Base grid unit this scale was designed from (e.g., '8px', '4px'). Informational \u2014 agents should use the named scale values, not compute from this.").optional(), "scale": import_zod.z.object({ "xs": import_zod.z.string().describe("Extra small spacing (e.g., '4px')").optional(), "sm": import_zod.z.string().describe("Small spacing (e.g., '8px')").optional(), "md": import_zod.z.string().describe("Medium spacing (e.g., '16px')").optional(), "lg": import_zod.z.string().describe("Large spacing (e.g., '24px')").optional(), "xl": import_zod.z.string().describe("Extra large spacing (e.g., '32px')").optional(), "2xl": import_zod.z.string().describe("Section-level spacing (e.g., '48px', '64px')").optional() }).catchall(import_zod.z.string()).describe("Named spacing scale built from the base unit").optional() }).strict().describe("Spacing system for consistent layout rhythm. Most design systems use an 8px base grid.").optional(), "graphic_elements": import_zod.z.array(import_zod.z.object({ "name": import_zod.z.string().describe("Element name (e.g., 'Paper Tear', 'Brand Watermark', 'Section Divider')"), "type": import_zod.z.enum(["border", "divider", "frame", "watermark", "pattern", "texture_overlay", "decorative"]).describe("Element type").optional(), "description": import_zod.z.string().describe("How the element is used in layouts").optional(), "orientation": import_zod.z.enum(["horizontal", "vertical", "any"]).describe("Preferred orientation when used in layouts").optional(), "colors": import_zod.z.array(import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("A single hex color value")).describe("Colors this element may appear in").optional(), "max_per_layout": import_zod.z.number().int().describe("Maximum instances per layout").optional() }).catchall(import_zod.z.any()).describe("A reusable decorative or structural visual element that is part of the brand identity (e.g., torn paper edges, watermarks, dividers, background patterns)")).describe("Reusable decorative elements that are part of the brand visual identity (e.g., torn paper edges, watermarks, dividers)").optional(), "motion": import_zod.z.object({ "transition_style": import_zod.z.enum(["cut", "dissolve", "slide", "wipe", "zoom", "fade"]).describe("Primary transition style between scenes").optional(), "animation_speed": import_zod.z.enum(["slow", "moderate", "fast"]).describe("Overall animation pacing").optional(), "easing": import_zod.z.string().describe("Default easing function (e.g., 'ease-in-out', 'spring', 'linear')").optional(), "text_entrance": import_zod.z.enum(["fade", "typewriter", "slide_up", "slide_left", "scale", "none"]).describe("How text enters the frame").optional(), "pacing": import_zod.z.enum(["lingering", "moderate", "fast_cuts"]).describe("Overall editing rhythm").optional(), "kinetic_typography": import_zod.z.boolean().describe("Whether animated/kinetic typography is allowed").optional(), "tags": import_zod.z.array(import_zod.z.string()).describe("Additional motion style descriptors").optional() }).catchall(import_zod.z.any()).describe("Motion and animation rules for video, animated display, and interactive formats").optional(), "logo_placement": import_zod.z.object({ "preferred_position": import_zod.z.enum(["top-left", "top-center", "top-right", "bottom-left", "bottom-center", "bottom-right", "center"]).describe("Preferred logo position in layouts").optional(), "min_clear_space": import_zod.z.string().describe("Minimum clear space around the logo, expressed as a multiple of logo height (e.g., '0.5x', '1x') or fixed value (e.g., '16px')").optional(), "min_height": import_zod.z.string().describe("Minimum logo height to maintain legibility (e.g., '40px', '24px')").optional(), "background_contrast": import_zod.z.enum(["light_only", "dark_only", "any"]).describe("Permitted background contrast behind logo").optional() }).catchall(import_zod.z.any()).describe("Logo placement and clear space rules for automated creative production").optional(), "colorways": import_zod.z.array(import_zod.z.object({ "name": import_zod.z.string().describe("Colorway name (e.g., 'primary', 'inverted', 'subtle')"), "foreground": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("A single hex color value"), "background": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("A single hex color value"), "accent": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("A single hex color value").optional(), "border": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("A single hex color value").optional(), "cta_foreground": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("CTA text/icon color, if different from foreground").optional(), "cta_background": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("CTA button/container color, if different from accent").optional(), "channels": import_zod.z.array(import_zod.z.string()).describe("Channels or contexts where this colorway applies (e.g., 'online', 'print', 'pos', 'social', 'outdoor'). Omit for universal colorways.").optional() }).catchall(import_zod.z.any()).describe("A named color pairing that defines how colors work together. Colorways ensure foreground/background combinations are always on-brand and accessible.")).describe("Named color pairings for consistent foreground/background combinations").optional(), "color_constraints": import_zod.z.array(import_zod.z.object({ "color": import_zod.z.object({ "kind": import_zod.z.enum(["name", "value", "surface"]).describe("Discriminator for the color reference variant.").optional(), "name": import_zod.z.string().describe("Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}.").optional(), "value": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("Literal hex color when no palette key exists.").optional(), "surface": import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]).describe("Usage surface rather than a specific color value.").optional() }).strict().and(import_zod.z.union([import_zod.z.object({ "kind": import_zod.z.literal("name") }), import_zod.z.object({ "kind": import_zod.z.literal("value") }), import_zod.z.object({ "kind": import_zod.z.literal("surface") })])).describe("Color role or value this constraint governs."), "applies_to": import_zod.z.array(import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"])).describe("Surfaces where this color may be used.").optional(), "allowed_on": import_zod.z.array(import_zod.z.object({ "kind": import_zod.z.enum(["name", "value", "surface"]).describe("Discriminator for the color reference variant.").optional(), "name": import_zod.z.string().describe("Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}.").optional(), "value": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("Literal hex color when no palette key exists.").optional(), "surface": import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]).describe("Usage surface rather than a specific color value.").optional() }).strict().and(import_zod.z.union([import_zod.z.object({ "kind": import_zod.z.literal("name") }), import_zod.z.object({ "kind": import_zod.z.literal("value") }), import_zod.z.object({ "kind": import_zod.z.literal("surface") })])).describe("Reference to a brand color or usage surface for machine-readable guideline constraints. Use kind=name for palette lookup keys in colors, kind=value for a literal hex color, and kind=surface for layout surfaces such as background or text.")).describe("Backgrounds, surfaces, or color roles where this color is allowed.").optional(), "forbidden_on": import_zod.z.array(import_zod.z.object({ "kind": import_zod.z.enum(["name", "value", "surface"]).describe("Discriminator for the color reference variant.").optional(), "name": import_zod.z.string().describe("Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}.").optional(), "value": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("Literal hex color when no palette key exists.").optional(), "surface": import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]).describe("Usage surface rather than a specific color value.").optional() }).strict().and(import_zod.z.union([import_zod.z.object({ "kind": import_zod.z.literal("name") }), import_zod.z.object({ "kind": import_zod.z.literal("value") }), import_zod.z.object({ "kind": import_zod.z.literal("surface") })])).describe("Reference to a brand color or usage surface for machine-readable guideline constraints. Use kind=name for palette lookup keys in colors, kind=value for a literal hex color, and kind=surface for layout surfaces such as background or text.")).describe("Backgrounds, surfaces, or color roles where this color is forbidden.").optional(), "never_pair_with": import_zod.z.array(import_zod.z.object({ "kind": import_zod.z.enum(["name", "value", "surface"]).describe("Discriminator for the color reference variant.").optional(), "name": import_zod.z.string().describe("Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}.").optional(), "value": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("Literal hex color when no palette key exists.").optional(), "surface": import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]).describe("Usage surface rather than a specific color value.").optional() }).strict().and(import_zod.z.union([import_zod.z.object({ "kind": import_zod.z.literal("name") }), import_zod.z.object({ "kind": import_zod.z.literal("value") }), import_zod.z.object({ "kind": import_zod.z.literal("surface") })])).describe("Reference to a brand color or usage surface for machine-readable guideline constraints. Use kind=name for palette lookup keys in colors, kind=value for a literal hex color, and kind=surface for layout surfaces such as background or text.")).describe("Color roles or values that must not be paired with this color.").optional(), "contexts": import_zod.z.array(import_zod.z.string()).describe("Channels or creative contexts where this constraint applies, such as digital, print, social, or ctv_end_card.").optional(), "severity": import_zod.z.enum(["must", "should"]).describe("Strength of a machine-readable brand guideline constraint.").optional(), "description": import_zod.z.string().describe("Human-readable rationale or source-language summary for the rule.").optional() }).catchall(import_zod.z.any()).describe("Machine-readable rule constraining how a brand color may be used or paired. Use for accent-only colors, forbidden foreground/background combinations, and palette pairs that should never appear together.")).describe("Machine-readable constraints for color usage and pairings, such as accent-only rules or forbidden foreground/background combinations.").optional(), "logo_usage_rules": import_zod.z.array(import_zod.z.object({ "logo_url": import_zod.z.string().url().describe("Specific logo asset URL this rule applies to. Omit when the rule applies by variant or tags.").optional(), "logo_id": import_zod.z.string().regex(new RegExp("^[a-z0-9][a-z0-9_-]*$")).describe("Stable `logos[].id` this rule applies to. Prefer this over logo_url when the rule targets a specific logo entry.").optional(), "logo_variant": import_zod.z.enum(["primary", "secondary", "icon", "wordmark", "full-lockup"]).describe("Logo variant this rule applies to.").optional(), "logo_tags": import_zod.z.array(import_zod.z.string()).describe("Logo tags this rule applies to.").optional(), "contexts": import_zod.z.array(import_zod.z.string()).describe("Creative contexts where this rule applies.").optional(), "slots": import_zod.z.array(import_zod.z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical renderer slots where this rule applies. Use this for deterministic logo-card, profile-mark, end-card, and lockup selection.").optional(), "minimum_size": import_zod.z.object({ "width": import_zod.z.string().describe("Minimum width, such as 48px or 12mm.").optional(), "height": import_zod.z.string().describe("Minimum height, such as 18px or 6mm.").optional() }).strict().describe("Minimum rendered size needed for legibility.").optional(), "clear_space": import_zod.z.string().describe("Minimum clear space around the logo, expressed in brand terms or units.").optional(), "allowed_backgrounds": import_zod.z.array(import_zod.z.object({ "kind": import_zod.z.enum(["name", "value", "surface"]).describe("Discriminator for the color reference variant.").optional(), "name": import_zod.z.string().describe("Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}.").optional(), "value": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("Literal hex color when no palette key exists.").optional(), "surface": import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]).describe("Usage surface rather than a specific color value.").optional() }).strict().and(import_zod.z.union([import_zod.z.object({ "kind": import_zod.z.literal("name") }), import_zod.z.object({ "kind": import_zod.z.literal("value") }), import_zod.z.object({ "kind": import_zod.z.literal("surface") })])).describe("Reference to a brand color or usage surface for machine-readable guideline constraints. Use kind=name for palette lookup keys in colors, kind=value for a literal hex color, and kind=surface for layout surfaces such as background or text.")).describe("Background color roles, values, or surfaces where this logo may be placed.").optional(), "forbidden_backgrounds": import_zod.z.array(import_zod.z.object({ "kind": import_zod.z.enum(["name", "value", "surface"]).describe("Discriminator for the color reference variant.").optional(), "name": import_zod.z.string().describe("Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}.").optional(), "value": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("Literal hex color when no palette key exists.").optional(), "surface": import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]).describe("Usage surface rather than a specific color value.").optional() }).strict().and(import_zod.z.union([import_zod.z.object({ "kind": import_zod.z.literal("name") }), import_zod.z.object({ "kind": import_zod.z.literal("value") }), import_zod.z.object({ "kind": import_zod.z.literal("surface") })])).describe("Reference to a brand color or usage surface for machine-readable guideline constraints. Use kind=name for palette lookup keys in colors, kind=value for a literal hex color, and kind=surface for layout surfaces such as background or text.")).describe("Background color roles, values, or surfaces where this logo must not be placed.").optional(), "forbidden_contexts": import_zod.z.array(import_zod.z.string()).describe("Contexts where this logo must not be used, such as photography_without_knockout.").optional(), "severity": import_zod.z.enum(["must", "should"]).describe("Strength of a machine-readable brand guideline constraint.").optional(), "description": import_zod.z.string().describe("Human-readable rationale or source-language summary for the rule.").optional() }).catchall(import_zod.z.any()).and(import_zod.z.union([import_zod.z.any(), import_zod.z.any(), import_zod.z.any(), import_zod.z.any(), import_zod.z.any()])).describe("Machine-readable logo selection and placement rule. Complements logos[].usage by making enforceable minimum size, clear-space, background, and context constraints queryable.")).describe("Machine-readable logo selection and placement constraints for minimum size, clear space, backgrounds, and contexts.").optional(), "mark_lockups": import_zod.z.array(import_zod.z.object({ "lockup_type": import_zod.z.enum(["co_brand", "secondary_mark", "partner", "sponsor", "program", "talent", "custom"]).describe("Type of mark relationship governed by this lockup rule."), "ordering": import_zod.z.enum(["brand_first", "partner_first", "equal", "contextual"]).describe("Required visual ordering of the brand mark relative to partner or secondary marks.").optional(), "contexts": import_zod.z.array(import_zod.z.string()).describe("Creative contexts where this lockup rule applies.").optional(), "brand_logo_id": import_zod.z.string().regex(new RegExp("^[a-z0-9][a-z0-9_-]*$")).describe("Stable `logos[].id` for the brand logo this lockup rule is anchored on.").optional(), "secondary_logo_ids": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9][a-z0-9_-]*$")).describe("Stable identifier for a logo entry within this brand.json document. Use lowercase words separated by underscores or hyphens; do not key integrations on mutable asset URLs.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable `logos[].id` values for secondary, program, sponsor, or partner marks governed by this lockup rule when those marks are represented in this brand.json.").optional(), "separator": import_zod.z.object({ "type": import_zod.z.enum(["none", "keyline", "space", "divider"]).describe("Separator style."), "color": import_zod.z.object({ "kind": import_zod.z.enum(["name", "value", "surface"]).describe("Discriminator for the color reference variant.").optional(), "name": import_zod.z.string().describe("Key from the colors object, such as market_yellow, river_green, or any custom palette key. Unambiguous lookup into colors{}.").optional(), "value": import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("Literal hex color when no palette key exists.").optional(), "surface": import_zod.z.enum(["background", "foreground", "text", "logo_background", "cta", "accent", "border", "icon", "graphic_element"]).describe("Usage surface rather than a specific color value.").optional() }).strict().and(import_zod.z.union([import_zod.z.object({ "kind": import_zod.z.literal("name") }), import_zod.z.object({ "kind": import_zod.z.literal("value") }), import_zod.z.object({ "kind": import_zod.z.literal("surface") })])).describe("Reference to a brand color or usage surface for machine-readable guideline constraints. Use kind=name for palette lookup keys in colors, kind=value for a literal hex color, and kind=surface for layout surfaces such as background or text.").optional(), "width": import_zod.z.string().describe("Separator width, such as 1px.").optional() }).catchall(import_zod.z.any()).describe("Separator between marks, when required.").optional(), "min_gap": import_zod.z.string().describe("Minimum gap between marks, expressed in brand terms or units.").optional(), "brand_min_optical_weight_ratio": import_zod.z.number().gt(0).describe("Minimum optical weight of the brand mark relative to partner marks. 1 means at least equal.").optional(), "partner_max_optical_weight_ratio": import_zod.z.number().gt(0).describe("Maximum optical weight of partner marks relative to the brand mark. 1 means no larger than the brand mark. Enforcement is at layout time, not parse time \u2014 this value signals to renderers and creative agents how much space to provision for each mark.").optional(), "severity": import_zod.z.enum(["must", "should"]).describe("Strength of a machine-readable brand guideline constraint.").optional(), "description": import_zod.z.string().describe("Human-readable rationale or source-language summary for the lockup rule.").optional() }).catchall(import_zod.z.any()).describe("Machine-readable layout constraints for co-brand, partner, sponsor, program, or secondary-mark lockups.")).describe("Machine-readable co-brand, partner, sponsor, program, or secondary-mark lockup rules.").optional(), "type_scale": import_zod.z.object({ "base_width": import_zod.z.string().describe("Reference canvas width these sizes were designed for (e.g., '1080px'). Generative systems should scale proportionally for other canvas sizes.").optional(), "heading": import_zod.z.object({ "font": import_zod.z.string().describe("Font reference. Use a key from the fonts object (e.g., 'primary', 'secondary') to reference a defined font role, or a literal CSS font-family string as a fallback.").optional(), "size": import_zod.z.string().describe("Font size (e.g., '48px', '2rem')").optional(), "weight": import_zod.z.string().describe("Font weight (e.g., '700', 'bold')").optional(), "line_height": import_zod.z.string().describe("Line height (e.g., '1.2', '56px')").optional(), "letter_spacing": import_zod.z.string().describe("Letter spacing (e.g., '-0.02em', '0.5px')").optional(), "text_transform": import_zod.z.enum(["none", "uppercase", "lowercase", "capitalize"]).describe("Text transformation").optional() }).catchall(import_zod.z.any()).describe("A single entry in the type scale").optional(), "subheading": import_zod.z.object({ "font": import_zod.z.string().describe("Font reference. Use a key from the fonts object (e.g., 'primary', 'secondary') to reference a defined font role, or a literal CSS font-family string as a fallback.").optional(), "size": import_zod.z.string().describe("Font size (e.g., '48px', '2rem')").optional(), "weight": import_zod.z.string().describe("Font weight (e.g., '700', 'bold')").optional(), "line_height": import_zod.z.string().describe("Line height (e.g., '1.2', '56px')").optional(), "letter_spacing": import_zod.z.string().describe("Letter spacing (e.g., '-0.02em', '0.5px')").optional(), "text_transform": import_zod.z.enum(["none", "uppercase", "lowercase", "capitalize"]).describe("Text transformation").optional() }).catchall(import_zod.z.any()).describe("A single entry in the type scale").optional(), "body": import_zod.z.object({ "font": import_zod.z.string().describe("Font reference. Use a key from the fonts object (e.g., 'primary', 'secondary') to reference a defined font role, or a literal CSS font-family string as a fallback.").optional(), "size": import_zod.z.string().describe("Font size (e.g., '48px', '2rem')").optional(), "weight": import_zod.z.string().describe("Font weight (e.g., '700', 'bold')").optional(), "line_height": import_zod.z.string().describe("Line height (e.g., '1.2', '56px')").optional(), "letter_spacing": import_zod.z.string().describe("Letter spacing (e.g., '-0.02em', '0.5px')").optional(), "text_transform": import_zod.z.enum(["none", "uppercase", "lowercase", "capitalize"]).describe("Text transformation").optional() }).catchall(import_zod.z.any()).describe("A single entry in the type scale").optional(), "caption": import_zod.z.object({ "font": import_zod.z.string().describe("Font reference. Use a key from the fonts object (e.g., 'primary', 'secondary') to reference a defined font role, or a literal CSS font-family string as a fallback.").optional(), "size": import_zod.z.string().describe("Font size (e.g., '48px', '2rem')").optional(), "weight": import_zod.z.string().describe("Font weight (e.g., '700', 'bold')").optional(), "line_height": import_zod.z.string().describe("Line height (e.g., '1.2', '56px')").optional(), "letter_spacing": import_zod.z.string().describe("Letter spacing (e.g., '-0.02em', '0.5px')").optional(), "text_transform": import_zod.z.enum(["none", "uppercase", "lowercase", "capitalize"]).describe("Text transformation").optional() }).catchall(import_zod.z.any()).describe("A single entry in the type scale").optional(), "cta": import_zod.z.object({ "font": import_zod.z.string().describe("Font reference. Use a key from the fonts object (e.g., 'primary', 'secondary') to reference a defined font role, or a literal CSS font-family string as a fallback.").optional(), "size": import_zod.z.string().describe("Font size (e.g., '48px', '2rem')").optional(), "weight": import_zod.z.string().describe("Font weight (e.g., '700', 'bold')").optional(), "line_height": import_zod.z.string().describe("Line height (e.g., '1.2', '56px')").optional(), "letter_spacing": import_zod.z.string().describe("Letter spacing (e.g., '-0.02em', '0.5px')").optional(), "text_transform": import_zod.z.enum(["none", "uppercase", "lowercase", "capitalize"]).describe("Text transformation").optional() }).catchall(import_zod.z.any()).describe("A single entry in the type scale").optional() }).catchall(import_zod.z.object({ "font": import_zod.z.string().describe("Font reference. Use a key from the fonts object (e.g., 'primary', 'secondary') to reference a defined font role, or a literal CSS font-family string as a fallback.").optional(), "size": import_zod.z.string().describe("Font size (e.g., '48px', '2rem')").optional(), "weight": import_zod.z.string().describe("Font weight (e.g., '700', 'bold')").optional(), "line_height": import_zod.z.string().describe("Line height (e.g., '1.2', '56px')").optional(), "letter_spacing": import_zod.z.string().describe("Letter spacing (e.g., '-0.02em', '0.5px')").optional(), "text_transform": import_zod.z.enum(["none", "uppercase", "lowercase", "capitalize"]).describe("Text transformation").optional() }).catchall(import_zod.z.any()).describe("A single entry in the type scale")).describe("Typography scale defining sizes and weights for different text roles. When sizes are in px, use base_width to indicate the reference canvas.").optional(), "asset_libraries": import_zod.z.array(import_zod.z.object({ "name": import_zod.z.string().describe("Display name of the asset library"), "type": import_zod.z.enum(["icon_set", "illustration_system", "image_library", "video_library", "template_library"]).describe("Type of asset library").optional(), "url": import_zod.z.string().url().describe("URL to the asset library (for human access)"), "description": import_zod.z.string().describe("Description of the library contents and usage").optional(), "color_guide": import_zod.z.object({ "roles": import_zod.z.array(import_zod.z.string()).describe("Named color roles used in the library (e.g., base, shadow_1, highlight_1, stroke)").optional(), "palettes": import_zod.z.array(import_zod.z.object({ "name": import_zod.z.string().describe("Palette name"), "colors": import_zod.z.record(import_zod.z.string(), import_zod.z.string().regex(new RegExp("^#[0-9A-Fa-f]{6}$")).describe("A single hex color value")).describe("Map of role names to hex color values") }).catchall(import_zod.z.any())).describe("Named color palettes mapping roles to specific colors").optional() }).catchall(import_zod.z.any()).describe("Color guide for the asset library defining roles and palettes").optional() }).catchall(import_zod.z.any()).describe("A managed asset library (icon set, illustration system, image collection). The URL is for human access; agent-facing DAM integration is under investigation.")).describe("References to managed asset libraries (icon sets, illustration systems, image collections). URLs are intended for human access; agent-facing DAM integration is under investigation.").optional(), "restrictions": import_zod.z.array(import_zod.z.string()).describe("Visual prohibitions and guardrails (e.g., 'Never use black backgrounds', 'Do not crop the logo', 'No stock photography of people on phones')").optional() }).catchall(import_zod.z.any()).describe("Structured visual rules for generative creative systems").optional(), "agents": import_zod.z.array(import_zod.z.object({ "type": import_zod.z.enum(["brand", "rights", "measurement", "governance", "creative", "sales", "buying", "signals"]).describe("Functional role of this agent"), "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("Agent endpoint URL (MCP or A2A). Callers comparing a brand's declared agent URL against another value (e.g., resolving 'is this the agent that signed this artifact?' or matching against a discovery cache) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. After the publication chain and an authorized request-signing key verify, this exact entry's canonical URL is the stable Agent identity input for principal mapping; the domain, JWKS URI, kid, and key material are credential or trust facts beneath it, not the Agent identity. See docs/reference/url-canonicalization."), "id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).max(100).describe("Agent identifier (useful for logging, multi-tenant platforms)"), "description": import_zod.z.string().max(500).describe("Human-readable description of this agent's capabilities or scope").optional(), "jwks_uri": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL of the agent's JWKS (RFC 7517) containing public keys used to verify artifacts this agent signs or requests it sends. Verified artifacts include signed governance_context tokens (for governance agents) and RFC 9421 HTTP Signatures on outgoing requests (for any agent). When absent, verifiers MUST default to /.well-known/jwks.json on the origin of `url`. Keys are identified by `kid` in the JWS header or RFC 9421 `keyid` parameter; JWKS MAY contain multiple keys to support rotation and per-purpose separation via `key_ops` and `use`.").optional(), "available_uses": import_zod.z.array(import_zod.z.enum(["likeness", "voice", "name", "endorsement", "motion_capture", "signature", "catchphrase", "sync", "background_music", "editorial", "commercial", "ai_generated_image"]).describe("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.")).describe("For rights agents: rights uses available for licensing").optional(), "right_types": import_zod.z.array(import_zod.z.enum(["talent", "character", "brand_ip", "music", "stock_media"]).describe("Categories of intellectual property rights that can be licensed through the brand protocol.")).describe("For rights agents: types of rights available").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).describe("ISO 3166-1 alpha-2 country codes where this agent operates. Omit for global scope.").optional() }).catchall(import_zod.z.any()).describe("An agent declared by a brand or house. Each entry identifies one agent endpoint and its functional role in the advertising ecosystem.")).describe("Agents authorized to act on behalf of this brand. Consumers resolving an agent by URL use the matching brand-level entry; do not infer a type-wide override of unrelated house-level entries when multiple same-type entries exist.").optional(), "brand_agent": import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("Brand agent MCP endpoint URL. Callers comparing this URL against another value (e.g., resolving 'is this the brand's declared agent?' against a discovery cache) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. See docs/reference/url-canonicalization."), "id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Agent identifier (useful for logging, multi-tenant DAMs)") }).catchall(import_zod.z.any()).describe("Deprecated: use agents array with type 'brand' instead. Brand agent that provides dynamic brand data via MCP.").optional(), "rights_agent": import_zod.z.object({ "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("Rights agent MCP endpoint URL. Callers comparing this URL against another value (e.g., matching against a brand's declared rights endpoint) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. See docs/reference/url-canonicalization."), "id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Agent identifier"), "available_uses": import_zod.z.array(import_zod.z.enum(["likeness", "voice", "name", "endorsement", "motion_capture", "signature", "catchphrase", "sync", "background_music", "editorial", "commercial", "ai_generated_image"]).describe("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.")).describe("Rights uses available for licensing through this agent"), "right_types": import_zod.z.array(import_zod.z.enum(["talent", "character", "brand_ip", "music", "stock_media"]).describe("Categories of intellectual property rights that can be licensed through the brand protocol.")).describe("Types of rights available").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).describe("Countries where rights are available (ISO 3166-1 alpha-2)").optional() }).catchall(import_zod.z.any()).describe("Deprecated: use agents array with type 'rights' instead. Rights licensing agent for this brand.").optional(), "contact": import_zod.z.object({ "email": import_zod.z.string().email().describe("Contact email").optional(), "phone": import_zod.z.string().describe("Contact phone number").optional() }).describe("Brand-level contact information").optional(), "collections": import_zod.z.array(import_zod.z.object({ "collection_id": import_zod.z.string().describe("Collection identifier as used in the seller's get_products responses").optional(), "name": import_zod.z.string().describe("Human-readable collection name"), "role": import_zod.z.enum(["host", "guest", "creator", "cast", "narrator", "producer", "correspondent", "commentator", "analyst"]).describe("This person's role on the collection").optional(), "seller_agent_url": import_zod.z.string().url().describe("URL of the sales agent that sells inventory for this collection. Buyer agents can query this agent for collection products.").optional() }).catchall(import_zod.z.any())).describe("Collections this person or brand is associated with. Enables bidirectional linking: a collection's talent references brand.json via brand_url, and brand.json links back to collections.").optional() }).catchall(import_zod.z.any()).describe("A brand within a house portfolio. Combines identity (who) with creative assets (how to represent). Referenced as domain + brand_id."))).describe("Self-published brand document where the brand owns its own identity attributes. Optionally declares its house via house_domain; for trust, the named house's brand_refs[] must reciprocate (mutual assertion). Standalone brands (no parent house) omit house_domain. Hosted at the brand's own /.well-known/brand.json (or via authoritative_location indirection). See docs/brand-protocol/brand-json.mdx")]).describe("Brand identity and discovery file. Hosted at /.well-known/brand.json on house domains. Contains the full brand portfolio with identity, creative assets, and digital properties. Brands are identified by house + brand_id (like properties are identified by publisher + property_id). Supports variants: house portfolio (full brand data), brand agent (agent provides brand info via MCP), house redirect (pointer to house domain), or authoritative location redirect.");
27
27
  const AdagentsJsonSchema = import_zod.z.union([import_zod.z.object({ "$schema": import_zod.z.string().describe("JSON Schema identifier for this adagents.json file").optional(), "authoritative_location": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL of the authoritative adagents.json file. When present, this file is a reference and the authoritative location contains the actual agent authorization data. Because one deploy can change authorization across every publisher in the network, validators MUST cap response size, refuse redirects on the fetch, enforce short timeouts, and serve the previously cached file on transient 5xx. Two-tier size cap: pointer files served at `/.well-known/adagents.json` use the general 5 MB SSRF cap; dereferenced authoritative files (this URL's response, after the indirection) use a recommended 20 MB cap because the origin has explicitly opted in to fanning out across a publisher network. See docs/governance/property/managed-networks#security-considerations."), "last_updated": import_zod.z.string().datetime().describe("ISO 8601 timestamp indicating when this reference was last updated").optional() }).catchall(import_zod.z.any()).describe("URL reference variant - points to the authoritative location of the adagents.json file"), import_zod.z.object({ "$schema": import_zod.z.string().describe("JSON Schema identifier for this adagents.json file").optional(), "contact": import_zod.z.object({ "name": import_zod.z.string().min(1).max(255).describe("Name of the entity managing this file (e.g., 'Meta Advertising Operations', 'Clear Channel Digital')"), "email": import_zod.z.string().email().min(1).max(255).describe("Contact email for questions or issues with this authorization file").optional(), "domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Primary domain of the entity managing this file").optional(), "seller_id": import_zod.z.string().min(1).max(255).describe("Seller ID from IAB Tech Lab sellers.json (if applicable)").optional(), "tag_id": import_zod.z.string().min(1).max(100).describe("TAG Certified Against Fraud ID for verification (if applicable)").optional(), "privacy_policy_url": import_zod.z.string().url().describe("URL to the entity's privacy policy. Used for consumer consent flows when interacting with this sales agent.").optional() }).catchall(import_zod.z.any()).describe("Contact information for the entity managing this adagents.json file (may be publisher or third-party operator)").optional(), "catalog_etag": import_zod.z.string().min(1).max(255).describe("Opaque publisher-controlled cache validator for the public catalog portions of this file (`properties[]`, `collections[]`, `placements[]`, `formats[]`, `signals[]`, and tag metadata). Publishers SHOULD change this value whenever any catalog entry or catalog-scoped authorization changes, even when the hosting URL and HTTP validators stay the same. Buyer SDKs SHOULD cache resolved catalog lookups by URL plus `catalog_etag` (falling back to HTTP ETag/Last-Modified, then bounded TTL when absent) and re-resolve placement, format, collection, property, and signal references when it changes. This value is not a cryptographic digest; it is a compact version token such as a deployment hash, revision ID, or ISO timestamp.").optional(), "catalog_role": import_zod.z.literal("community_format_registry").describe("Marks a catalog payload intended for the fixed AgenticAdvertising.org community-format registry. This self-description is not provenance: consumers accept reference_renderer only when the document was obtained from the configured, reviewed community-registry origin.").optional(), "properties": import_zod.z.array(import_zod.z.object({ "property_id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Unique identifier for this property (optional). Enables referencing properties by ID instead of repeating full objects.").optional(), "property_type": import_zod.z.enum(["website", "mobile_app", "ctv_app", "desktop_app", "dooh", "podcast", "radio", "linear_tv", "streaming_audio", "ai_assistant"]).describe("Type of advertising property"), "name": import_zod.z.string().describe("Human-readable property name"), "identifiers": import_zod.z.array(import_zod.z.object({ "type": import_zod.z.enum(["domain", "subdomain", "network_id", "ios_bundle", "android_package", "apple_app_store_id", "google_play_id", "roku_store_id", "fire_tv_asin", "samsung_app_id", "apple_tv_bundle", "bundle_id", "venue_id", "screen_id", "openooh_venue_type", "rss_url", "apple_podcast_id", "spotify_collection_id", "podcast_guid", "station_id", "facility_id"]).describe("Type of identifier for this property"), "value": import_zod.z.string().describe("The identifier value. For domain type: 'example.com' matches base domain plus www and m subdomains; 'edition.example.com' matches that specific subdomain; '*.example.com' matches ALL subdomains but NOT base domain") }).catchall(import_zod.z.any())).describe("Array of identifiers for this property"), "tags": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Tag for categorizing publisher properties. Must be lowercase alphanumeric with underscores only.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Tags for categorization and grouping (e.g., network membership, content categories)").optional(), "supported_channels": import_zod.z.array(import_zod.z.enum(["display", "olv", "social", "search", "ctv", "linear_tv", "radio", "streaming_audio", "podcast", "dooh", "ooh", "print", "cinema", "email", "gaming", "retail_media", "influencer", "affiliate", "product_placement", "sponsored_intelligence"]).describe("Standardized advertising media channels describing how buyers allocate budget. Channels are planning abstractions, not technical substrates. See the Media Channel Taxonomy specification for detailed definitions.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Advertising channels this property supports (e.g., ['display', 'olv', 'social']). Publishers declare which channels their inventory aligns with. Properties may support multiple channels. See the Media Channel Taxonomy for definitions.").optional(), "publisher_domain": import_zod.z.string().describe("Domain where adagents.json should be checked for authorization validation. Optional in adagents.json (file location implies domain).").optional() }).catchall(import_zod.z.any()).describe("An advertising property that can be validated via adagents.json")).describe("Array of all properties covered by this adagents.json file. Defines the canonical property list that authorized agents reference.").optional(), "revoked_publisher_domains": import_zod.z.array(import_zod.z.object({ "publisher_domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Publisher domain being revoked. Matches against the same canonicalized form used in `publisher_properties[].publisher_domain`."), "revoked_at": import_zod.z.string().datetime().describe("ISO 8601 timestamp when this publisher was revoked. Validators MAY use this to order revocations against their own cached state."), "reason": import_zod.z.enum(["relationship_ended", "compliance_violation", "publisher_request", "other"]).describe("Reason for revocation. **Operator-internal self-classification for review routing \u2014 not a public accusation.** `relationship_ended` is the routine commercial case. `compliance_violation` SHOULD be used only when the network has itself determined the publisher is out of policy; for un-adjudicated third-party allegations (regulator inquiries, advertiser complaints, ongoing investigations), use `other` to avoid making a discoverable adverse statement. `publisher_request` is for publisher-initiated exits. Compare to sellers.json, which deliberately carries no reason field for the same exposure concern.").optional() }).catchall(import_zod.z.any())).describe("Publisher domains explicitly removed from this managed network. Validators MUST treat any publisher domain listed here as no-longer-authorized, taking precedence over any appearance of the same domain in `authorized_agents[].publisher_properties[].publisher_domain` / `.publisher_domains[]`, in `authorized_agents[].properties[].publisher_domain` (`inline_properties` authorization type), or in top-level `properties[].publisher_domain`. Lets a network propagate per-publisher revocations on the next refresh instead of waiting for the file-level 7-day cache cap. Validators MUST hold previously-observed publisher revocations, keyed by authority and publisher_domain, for 7 days from the validator's first observation; changing revoked_at MUST NOT reset that first observation, even if the entry vanishes from a subsequent fetch \u2014 this closes the rollback gap where an attacker re-serves a stale file with the revocation removed. Networks SHOULD retain entries for at least 7 days after `revoked_at` so validators that didn't observe the original entry still pick it up on refresh.").optional(), "collections": import_zod.z.array(import_zod.z.object({ "publisher_domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Publisher namespace that owns this collection. Required for supply-path verification when the declaration is read from a cross-origin authoritative document; it must match the publisher whose origin delegated retrieval. A pointer alone cannot claim another publisher's collection. May be omitted for a publisher-origin document, where that origin supplies the namespace.").optional(), "collection_id": import_zod.z.string().describe("Publisher-assigned identifier for this collection. Declared in the publisher's adagents.json collections array. Products reference collections via collection selectors with publisher_domain and collection_ids. Use distribution identifiers for cross-seller matching across publishers."), "name": import_zod.z.string().describe("Human-readable collection name"), "kind": import_zod.z.enum(["series", "publication", "event_series", "rotation", "channel"]).describe("What kind of content program this is. Helps agents interpret installments correctly. A channel collection represents the persistent programmed stream; its installments, when present, are scheduled airings or programming blocks. Defaults to 'series' when absent.").optional(), "description": import_zod.z.string().describe("What the collection is about").optional(), "genre": import_zod.z.array(import_zod.z.string()).describe("Genre tags. When genre_taxonomy is present, values are taxonomy IDs (e.g., IAB Content Taxonomy 3.0 codes). Otherwise free-form.").optional(), "genre_taxonomy": import_zod.z.string().describe("Taxonomy system for genre values (e.g., 'iab_content_3.0'). When present, genre values should be valid taxonomy IDs. Recommended for machine-readable brand safety evaluation.").optional(), "language": import_zod.z.string().describe("Primary language (BCP 47 tag, e.g., 'en', 'es-MX')").optional(), "content_rating": import_zod.z.object({ "system": import_zod.z.enum(["tv_parental", "mpaa", "podcast", "esrb", "bbfc", "fsk", "acb", "chvrs", "csa", "pegi", "custom"]).describe("Rating system used"), "rating": import_zod.z.string().describe("Rating value within the system (e.g., 'TV-PG', 'R', 'explicit')") }).catchall(import_zod.z.any()).describe("Baseline content rating for the collection. Individual installments may override this.").optional(), "cadence": import_zod.z.enum(["daily", "weekly", "monthly", "seasonal", "event", "irregular"]).describe("How frequently the collection releases new installments").optional(), "season": import_zod.z.string().describe("Current or most recent season identifier (e.g., '3', '2026', 'spring_2026'). A lightweight label \u2014 not a full season object.").optional(), "status": import_zod.z.enum(["active", "hiatus", "ended", "upcoming"]).describe("Lifecycle status of the collection").optional(), "production_quality": import_zod.z.enum(["professional", "prosumer", "ugc"]).describe("Production quality tier. Seller-declared. Maps to OpenRTB content.prodq (professional=1, prosumer=2, ugc=3).").optional(), "talent": import_zod.z.array(import_zod.z.object({ "role": import_zod.z.enum(["host", "guest", "creator", "cast", "narrator", "producer", "correspondent", "commentator", "analyst"]).describe("Role of this person on the collection or installment"), "name": import_zod.z.string().describe("Person's name as credited on the collection"), "brand_url": import_zod.z.string().url().describe("URL to this person's brand.json entry. Enables buyer agents to evaluate the talent's brand identity and associations.").optional() }).catchall(import_zod.z.any()).describe("A person associated with a collection or installment, with an optional link to their brand.json identity")).describe("Hosts, recurring cast, creators associated with the collection. Each talent entry may include a brand_url linking to their brand.json identity.").optional(), "special": import_zod.z.object({ "name": import_zod.z.string().describe("Name of the event (e.g., 'Olympics 2028', 'Super Bowl LXI')"), "category": import_zod.z.enum(["awards", "championship", "concert", "conference", "election", "festival", "gala", "holiday", "premiere", "product_launch", "reunion", "tribute"]).describe("Category of the event").optional(), "starts": import_zod.z.string().datetime().describe("When the event starts (ISO 8601)").optional(), "ends": import_zod.z.string().datetime().describe("When the event ends (ISO 8601). Omit for single-day events.").optional() }).catchall(import_zod.z.any()).describe("When present, this collection is a special \u2014 content anchored to a real-world event or occasion. Individual installments may override with their own event context.").optional(), "limited_series": import_zod.z.object({ "total_installments": import_zod.z.number().int().gte(1).describe("Planned number of installments in the series"), "starts": import_zod.z.string().datetime().describe("When the series begins (ISO 8601)").optional(), "ends": import_zod.z.string().datetime().describe("When the series ends (ISO 8601)").optional() }).catchall(import_zod.z.any()).describe("When present, this collection is a limited series \u2014 a bounded run with a defined arc, installment count, and end date.").optional(), "distribution": import_zod.z.array(import_zod.z.object({ "publisher_domain": import_zod.z.string().describe("Domain of the publisher platform where the collection is distributed (e.g., 'youtube.com', 'spotify.com'). Property IDs and publisher-scoped identifiers in this object resolve in this publisher's namespace."), "property_ids": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Identifier for a publisher property. Must be lowercase alphanumeric with underscores only.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Publisher-scoped property IDs from publisher_domain's adagents.json that carry this collection. For owner-sold channel inventory, these identify the host apps without requiring the host to publish channel-owner placement definitions.").optional(), "identifiers": import_zod.z.array(import_zod.z.object({ "type": import_zod.z.enum(["apple_podcast_id", "spotify_collection_id", "rss_url", "podcast_guid", "amazon_music_id", "iheart_id", "podcast_index_id", "youtube_channel_id", "youtube_channel_handle", "youtube_channel_url", "youtube_playlist_id", "amazon_title_id", "platform_channel_id", "roku_channel_id", "pluto_channel_id", "tubi_id", "peacock_id", "tiktok_id", "twitch_channel", "imdb_id", "gracenote_id", "eidr_id", "domain", "substack_id"]).describe("Type of distribution identifier"), "value": import_zod.z.string().describe("The identifier value") }).strict()).describe("Identifiers for the collection on this publisher, including publisher-scoped channel/EPG identifiers and platform-independent metadata identifiers").optional() }).catchall(import_zod.z.any()).and(import_zod.z.union([import_zod.z.any(), import_zod.z.any()])).describe("A collection's presence on a specific publisher platform. For a channel collection, this is a carriage assertion: property_ids identify the host surfaces carrying the channel, while identifiers identify the channel in the host's catalog or an independent metadata system. This publisher-authored assertion supports discovery and cross-seller matching but does not authorize a sale; authorization remains rooted in the host publisher's collection-scoped authorized_agents entry.")).describe("Where this collection is distributed. Each entry maps the collection to a publisher platform using host property IDs, identifiers, or both. For channel collections this is the carriage map. It is a publisher assertion for discovery, not sales authorization; buyers validate owner-sold carriage against the host publisher's collection-scoped authorized_agents declaration. Collections SHOULD include at least one platform-independent identifier (imdb_id, gracenote_id, eidr_id) when available.").optional(), "deadline_policy": import_zod.z.object({ "booking_lead_days": import_zod.z.number().int().gte(0).describe("Days before scheduled_at by which the placement must be booked").optional(), "cancellation_lead_days": import_zod.z.number().int().gte(0).describe("Days before scheduled_at by which cancellation is penalty-free").optional(), "material_stages": import_zod.z.array(import_zod.z.object({ "stage": import_zod.z.string().describe("Stage identifier. Standard values: 'draft' (needs seller processing), 'final' (production-ready)."), "lead_days": import_zod.z.number().int().gte(0).describe("Days before scheduled_at this stage is due"), "label": import_zod.z.string().describe("What the seller needs at this stage").optional() }).catchall(import_zod.z.any())).describe("Default material submission stages. Items MUST be in chronological order (earliest due first). Agents compute due_at as: installment.scheduled_at minus lead_days.").optional(), "business_days_only": import_zod.z.boolean().describe("When true, lead_days counts business days (Mon-Fri) rather than calendar days. Defaults to false.").default(false) }).catchall(import_zod.z.any()).describe("Default deadline rules for installments of this collection. Agents compute absolute deadlines from each installment's scheduled_at and these lead times. Installments with explicit deadlines override this policy. Only meaningful when installments carry scheduled_at; a continuously programmed channel collection without enumerated installments has no deadlines to derive.").optional(), "related_collections": import_zod.z.array(import_zod.z.object({ "collection_id": import_zod.z.string().describe("The related collection's collection_id within this seller's response"), "relationship": import_zod.z.enum(["spinoff", "companion", "sequel", "prequel", "crossover"]).describe("How the collections are related") }).strict()).describe("Relationships to other collections (spin-offs, companion collections, etc.). Each entry references another collection by collection_id within the same publisher's adagents.json.").optional(), "ext": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).describe("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.").optional() }).catchall(import_zod.z.any()).describe("A recurring inventory container \u2014 a named program, publication, event series, rotation, or programmed channel that produces bookable installments on a defined cadence. The kind field indicates how to interpret this collection: 'series' for TV/podcast programs, 'publication' for print/newsletter titles, 'event_series' for live events, 'rotation' for DOOH scheduling, and 'channel' for continuously programmed audio or video streams regardless of carriage or monetization model. Declared in the publisher's adagents.json and referenced by products via collection selectors.")).describe("Collections produced or distributed by this publisher. Declares the content programs whose inventory is sold through authorized agents. Products in get_products responses reference these collections by collection_id.").optional(), "placements": import_zod.z.array(import_zod.z.object({ "placement_id": import_zod.z.string().describe("Stable placement identifier unique within this adagents.json file."), "name": import_zod.z.string().describe("Human-readable placement name (e.g., 'Homepage Banner', 'Pre-roll', 'Sponsored Listing Slot 1')."), "description": import_zod.z.string().describe("Description of where and how this placement appears.").optional(), "tags": import_zod.z.array(import_zod.z.string()).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Tags for grouping and querying placements across properties and products (e.g., 'homepage', 'native', 'premium', 'pre_roll').").optional(), "property_ids": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Identifier for a publisher property. Must be lowercase alphanumeric with underscores only.")).describe("Property IDs in this adagents.json where this placement can appear.").optional(), "property_tags": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Tag for categorizing publisher properties. Must be lowercase alphanumeric with underscores only.")).describe("Property tags in this adagents.json where this placement can appear. Useful for network-wide positions such as 'pre_roll' or 'homepage_native_feed'.").optional(), "collection_ids": import_zod.z.array(import_zod.z.string()).describe("Optional collection IDs in this adagents.json where this placement is valid. Use to narrow a placement to specific content programs carried on the selected properties.").optional(), "channels": import_zod.z.array(import_zod.z.enum(["display", "olv", "social", "search", "ctv", "linear_tv", "radio", "streaming_audio", "podcast", "dooh", "ooh", "print", "cinema", "email", "gaming", "retail_media", "influencer", "affiliate", "product_placement", "sponsored_intelligence"]).describe("Standardized advertising media channels describing how buyers allocate budget. Channels are planning abstractions, not technical substrates. See the Media Channel Taxonomy specification for detailed definitions.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Advertising channels where this placement can run. Products that reference the placement may narrow this set but should not broaden it.").optional(), "presentation_ref": import_zod.z.object({ "uri": import_zod.z.string().url().regex(new RegExp("^https://")).describe("Publisher-controlled HTTPS URL for the presentation metadata. Consumers MUST apply the same SSRF, redirect, response-size, timeout, and DNS-rebinding protections used for format_schema fetches."), "digest": import_zod.z.string().regex(new RegExp("^sha256:[a-f0-9]{64}$")).describe("SHA-256 content digest. Consumers cache by uri@digest and MUST fail closed on a digest mismatch."), "media_type": import_zod.z.literal("application/vnd.adcp.placement-presentation+json").describe("Media type of the referenced declarative presentation document."), "schema_version": import_zod.z.literal("1.0").describe("Version of /schemas/core/placement-presentation.json used to validate and compose the referenced document.") }).strict().describe("Optional publisher-specific declarative frame for representing this placement's real chrome offline. It composes around the selected creative rendering unless the publisher-delegated preview_provider route explicitly covers placement presentation. It MUST NOT be promoted to or copied onto a shared format entry.").optional(), "preview_provider": import_zod.z.object({ "agent_url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL of the delegated creative-agent endpoint. Buyers call get_adcp_capabilities and preview_creative on this endpoint. They MUST allow only public IPs, pin DNS resolution through connection, refuse redirects, cap time and response size, and attach provider credentials only after exact normalized-origin binding."), "authority": import_zod.z.literal("publisher_designated").describe("Explicitly states that authority comes from the publisher-hosted placement declaration. The provider's rendering_origin metadata is informational and remains non-authoritative elsewhere."), "routes": import_zod.z.array(import_zod.z.object({ "format_option_id": import_zod.z.string().min(1).describe("Format option in this adagents.json placement for which the delegation applies. It MUST resolve through the same-file top-level formats[] catalog or an inline placement format declaration."), "capability_id": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Agent-local preview capability advertised by the delegated provider. The provider's canonical format declaration MUST satisfy the resolved placement format option."), "covers_placement_presentation": import_zod.z.boolean().describe("True only when the publisher delegates both creative rendering and the complete placement-specific frame to this route. When false or omitted, consumers compose any presentation_ref around the provider's creative render.").default(false) }).strict()) }).strict().describe("Optional publisher delegation to a callable AdCP preview provider for specific format options on this placement. This publisher-origin route is the only mechanism that grants preview authority inside the placement's scope; an agent's own rendering_origin description does not.").optional(), "format_options": import_zod.z.array(import_zod.z.union([import_zod.z.object({ "format_option_id": import_zod.z.string().describe("Matches a `format_option_id` in the file's top-level `formats[]`."), "locale_policy": import_zod.z.object({ "accepted_language_ranges": import_zod.z.array(import_zod.z.string().regex(new RegExp("^(?:[a-z]{2,8}(?:-[A-Z][a-z]{3})?(?:-(?:[A-Z]{2}|[0-9]{3}))?(?:-(?:[a-z0-9]{5,8}|[0-9][a-z0-9]{3}))*(?:-[0-9a-wy-z](?:-[a-z0-9]{2,8})+)*(?:-x(?:-[a-z0-9]{1,8})+)?|x(?:-[a-z0-9]{1,8})+)$")).min(2).max(63).describe("A well-formed BCP 47 language tag used by AdCP only as language identity. Script and region may refine that identity; other valid BCP 47 subtags remain part of tag matching but do not make this a general locale-settings object. It does not determine currency, time zone, number/date formatting, market, or legal jurisdiction. The AdCP canonical wire profile requires lower-case language and variants, title-case script, and upper-case region (for example `en-US`, `zh-Hant-TW`, or `x-private`). RFC 5646 comparisons are case-insensitive and its case regularization is optional; AdCP intentionally requires this stricter single wire spelling and receivers MUST reject differently cased tags rather than silently normalizing them. The schema pattern enforces the AdCP casing profile and extension structure for commonly used tags; conforming receivers additionally validate the complete RFC 5646 grammar and registry rules. Every new AdCP field carrying BCP 47 language identity or a concrete language range MUST reference this schema instead of declaring independent string constraints.")).max(50).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Concrete canonical BCP 47 language ranges accepted by this format option. RFC 4647 Basic Filtering is directional: seller range fr accepts variant fr-CA, but seller range fr-CA does not accept variant fr or fr-FR. Use zxx explicitly for language-neutral creative; und means unknown and is not a wildcard.") }).catchall(import_zod.z.any()).describe("Optional placement-local locale policy. When the resolved top-level format declares a policy, every placement range must be contained by one of its ranges; otherwise this introduces a narrowing of the unconstrained format. The resolved effective route remains canonical-only.").optional() }).catchall(import_zod.z.any()).describe("Reference an entry in the file's top-level `formats[]` by `format_option_id`. Resolved at validation time. additionalProperties: true so placement-local fields (display_name, etc.) carry through without forcing a full inline declaration."), import_zod.z.object({ "format_option_id": import_zod.z.string().describe("Stable identifier for this declaration within its namespace. REQUIRED when a product contains multiple declarations with the same format_kind and SHOULD be set on every entry. Publisher-backed options pair it with publisher_domain; product-local options omit publisher_domain. When a single declaration has a unique format_kind and no ID, buyers author canonically with format_kind plus params; they MUST NOT fall back to deprecated format_ids merely because this optional ID is absent. Examples: 'display_image_300x250', 'responsive_search', 'daily_pulse_homepage_image'.").optional(), "publisher_domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Namespace for `format_option_id` when this declaration references or narrows a publisher-declared format option from that publisher's adagents.json top-level `formats[]`. Product-local options omit this field and are selected by `format_option_id` within the target product.").optional(), "tracker_execution_contract": import_zod.z.object({ "complete": import_zod.z.boolean().describe("Whether honored is the complete set. complete:true with an empty honored array explicitly supports no buyer-supplied trackers."), "honored": import_zod.z.array(import_zod.z.union([import_zod.z.object({ "selector_id": import_zod.z.string().min(1).describe("Stable identifier unique within the materialized execution contract."), "asset_type": import_zod.z.literal("pixel_tracker"), "event": import_zod.z.enum(["impression", "viewable_mrc_50", "viewable_mrc_100", "viewable_video_50", "audible_video_complete", "click", "custom"]).describe("Closed AdCP event vocabulary for renderer-fired pixel trackers. Impression and viewability values through `viewable_video_50` map to IAB OpenRTB Native event tracker types 1-4. `audible_video_complete` is an AdCP-defined first-class event, not an assigned IAB Native event type; Native reserves 500+ for exchange-specific use. `click` represents Native click trackers and `custom` is the explicit adopter-defined extension point."), "method": import_zod.z.literal("img").describe("AdCP 3.2 execution contracts cover image-pixel initiation only; JavaScript response evaluation is outside this contract version."), "custom_event_name": import_zod.z.string().min(1).describe("Required only when event is custom.").optional(), "execution_actor": import_zod.z.enum(["seller", "request_executor"]).describe("Actor responsible for initiating a buyer-supplied tracker under a seller-authored execution contract. This v1 vocabulary is intentionally narrower than the macro resolver actor vocabulary."), "firing_paths": import_zod.z.array(import_zod.z.enum(["client", "server"]).describe("Environment in which the responsible actor initiates a tracker. A selector may permit both values, but exactly one path is used for each logical event occurrence.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Complete set of permitted initiation environments. Exactly one path is selected for each logical event occurrence.") }).strict().and(import_zod.z.union([import_zod.z.any(), import_zod.z.any().refine((value) => !import_zod.z.any().safeParse(value).success, "Invalid input: Should NOT be valid against schema")]).superRefine((value, ctx) => {
28
28
  const result = import_zod.z.any().safeParse(value).success ? import_zod.z.any().safeParse(value) : import_zod.z.any().refine((value2) => !import_zod.z.any().safeParse(value2).success, "Invalid input: Should NOT be valid against schema").safeParse(value);
29
29
  if (!result.success) {
@@ -164,7 +164,7 @@ const AdagentsJsonSchema = import_zod.z.union([import_zod.z.object({ "$schema":
164
164
  if (!result.success) {
165
165
  result.error.issues.forEach((error) => ctx.addIssue(error));
166
166
  }
167
- }))), import_zod.z.intersection(import_zod.z.any().refine((value) => !import_zod.z.intersection(import_zod.z.any(), import_zod.z.any()).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), import_zod.z.intersection(import_zod.z.any().refine((value) => !import_zod.z.any().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), import_zod.z.any())))).describe("Inline format declaration on a product. The `format_kind` discriminator names which canonical format the product narrows; `params` carries only the canonical creative-shape parameters (slots, dimensions, durations, codecs, character limits, platform_extensions, etc.). Processing metadata such as `macro_resolution_capabilities` belongs at this declaration's top level rather than inside `params`. Optional `format_option_id` (stable identifier for routing when a product's `format_options` contains multiple declarations sharing the same `format_kind`), optional `publisher_domain` (namespace for the format option when it comes from a publisher adagents.json catalog), `display_name` (seller-controlled human-readable label for dashboard and catalog UIs), and `applies_to_channels` (subset of the product's declared channels this declaration applies to \u2014 lets a multi-channel product carry distinct format_options per channel). Discriminated-union shape generates clean tagged unions in TypeScript and Pydantic codegen. Replaces v1's named-format pattern (where products referenced a separately-defined format file via compound `format_id`). Canonical product-bound declarations are the AdCP 3.2 authoring path; v1 named formats remain only as deprecated 3.x compatibility projections.\n\n**Closed-set semantics (normative).** `format_options[]` is the closed set of accepted formats for this product. Sellers MUST reject `create_media_buy` requests targeting any `format_kind` (or format option reference) not present in this list \u2014 typically with `UNSUPPORTED_FEATURE` or a seller-specific code; the rejection is structural, not negotiable. `seller_preference` modulates *within* the accepted set (a soft ranking hint between equally-acceptable options), it is NOT an enforcement axis. A product wanting to say 'this format is the only one that works' lists exactly that one entry in `format_options[]`; everything else falls outside the set and is rejected by the closed-set rule.\n\n**Format matching vs satisfaction (normative).** Legacy named formats MUST be normalized to canonical declarations before comparison; do not exact-match raw `(agent_url, id)` pairs once a `format_id` has been projected through `canonical`, `v1_format_ref`, or the canonical mapping registry. Equivalence matching can treat a legacy fixed-size display ID and `format_kind: \"image\"` with matching `width`/`height` as the same underlying shape. Product satisfaction is stricter and directional: when this declaration specifies fixed constraints such as `width`, `height`, `duration_ms_exact`, or `duration_ms_range`, a buyer request or creative manifest MUST declare and satisfy those constraints. A broad request with no dimensions or duration does not satisfy a fixed-size or fixed-duration product; a broad product MAY accept a more specific creative unless another product constraint excludes it. Duration precedence is `duration_ms_exact` > `duration_ms_range`. Range constraints use containment: a range-based request satisfies this declaration only when every value it permits falls within this declaration's accepted range; overlap alone is insufficient. An exact value satisfies a range when the exact value falls inside the accepted interval. For hosted audio/video, a null range endpoint is unbounded: [null, 60000] means up to 60s, and [15000, null] means at least 15s; [null, null] is invalid because at least one endpoint must be bounded.\n\n**Custom format_kind** (`format_kind: \"custom\"`): for adopter-defined shapes that don't fit the 15 canonicals (branded content, cross-screen sponsorship, sponsorship lockup, newsletter sponsorship, AR lens, playable, live event sponsorship). When `format_kind` is `custom`, the declaration MUST carry `format_shape` (recognized global pattern from the [format-shape vocabulary registry](/schemas/core/format-shape-vocabulary.json)) AND `format_schema` (URI+digest reference to a fetchable schema describing the actual `params` and `slots`). Buyer agents fetch the schema, validate manifests structurally, and reason about manifests without per-seller integration code. See [adcp#3666](https://github.com/adcontextprotocol/adcp/issues/3666) for the canonical promotion queue."), import_zod.z.object({ "applies_to_property_ids": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Identifier for a publisher property. Must be lowercase alphanumeric with underscores only.")).describe('Optional property IDs from this file\'s `properties[]` that this format declaration applies to. When omitted, the declaration applies to all properties in the file. Mutually compatible with `applies_to_property_tags` (union is the effective scope). Example: Meta declares Reels with `applies_to_property_ids: ["instagram", "facebook"]` because WhatsApp doesn\'t carry Reels inventory.').optional(), "applies_to_property_tags": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Tag for categorizing publisher properties. Must be lowercase alphanumeric with underscores only.")).describe('Optional property tags from this file\'s `tags` map that this format declaration applies to. When omitted, the declaration applies to all properties in the file. Useful for network-wide formats (e.g., a managed network declaring `applies_to_property_tags: ["premium_video"]`). Compatible with `applies_to_property_ids` \u2014 a property is in scope if it matches either ID list or tag list.').optional(), "reference_renderer": import_zod.z.object({ "runtime": import_zod.z.literal("browser-esm").describe("Execution contract for the referenced package. browser-esm means a browser-safe ECMAScript module that accepts canonical manifest data and returns an inert presentation without Node.js APIs, ambient credentials, delivery tracking, or undeclared network access. Non-JavaScript clients use a hosted preview_creative provider or display the manifest."), "package": import_zod.z.string().regex(new RegExp("^(?:@[a-z0-9][a-z0-9._~-]*/)?[a-z0-9][a-z0-9._~-]*$")).describe("npm package name, scoped or unscoped. The package is resolved from the npm registry; the AdCP registry does not proxy its executable contents."), "version": import_zod.z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$")).describe("Exact semantic version. Ranges and tags such as latest are forbidden so the registry entry is reproducible. Package semantic versioning identifies the pinned distribution artifact; it is independent of any one format revision because one package may expose renderers for multiple formats."), "export": import_zod.z.string().min(1).describe("Named package export that implements the renderer contract for this enclosing format entry. Compatibility is bound at the export-to-entry edge, not to matching version labels: registry review and contract fixtures verify that the export implements the entry's input contract. When that input contract changes, the registry MUST rerun those fixtures and MAY retain the existing export and package pin when they still pass. One package version MAY expose different named exports for different formats or input contracts."), "format_revision": import_zod.z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)$")).describe("Deprecated compatibility annotation retained for previously published registry entries. Renderer package versions and community format revisions have independent lifecycles, so consumers MUST NOT require this value to equal the enclosing entry's format_revision or use matching values as evidence of compatibility. Registry review and contract fixtures bind the named export to the enclosing format's input contract. New entries SHOULD omit this field.").optional(), "integrity": import_zod.z.string().regex(new RegExp("^(?:sha256-[A-Za-z0-9+/]{43}=|sha384-[A-Za-z0-9+/]{64}|sha512-[A-Za-z0-9+/]{86}==)$")).describe("Subresource Integrity value for the exact npm package tarball. Consumers MUST compare this value before loading code, require the provenance subject digest to match the same tarball, and fail closed on mismatch."), "provenance": import_zod.z.object({ "source_repository": import_zod.z.string().url().regex(new RegExp("^https://github\\.com/")).describe("Allowlisted source repository that the npm provenance attestation MUST identify."), "workflow_path": import_zod.z.string().regex(new RegExp("^\\.github/workflows/[A-Za-z0-9._/-]+\\.ya?ml$")).describe("Repository-relative GitHub Actions workflow path that npm provenance buildDefinition.externalParameters.workflow.path MUST identify.") }).strict() }).strict().describe("Optional only for an AgenticAdvertising.org community-registry format entry fetched from the configured registry origin. Points to a pinned browser-ESM OSS renderer package export that provides a non-authoritative reference presentation. Registry review and contract fixtures bind the named export to the enclosing format's input contract (its canonical format kind, manifest shape, constraints, and declared macros); renderer package versions and format revisions have independent lifecycles. Display metadata and property scope do not affect that compatibility binding. Non-JavaScript clients use hosted preview_creative or display the manifest. Publisher-origin catalogs and seller product declarations do not use this field: publishers describe placement-specific chrome with placements[].presentation_ref and grant route-specific preview authority with placements[].preview_provider.").optional(), "format_revision": import_zod.z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)$")).describe("Registry-managed revision of this community format entry's input contract. Required when reference_renderer is present, but independent of any reference-renderer package version or legacy reference_renderer.format_revision annotation. A contract update may retain an existing renderer pin when that export still passes the updated declaration's contract fixtures.").optional() }).and(import_zod.z.any()))).describe("Publisher-authoritative format catalog. Declares the 3.1+ canonical format-option shapes the publisher supports across its properties \u2014 the single place a publisher (or its community-registry stand-in) asserts \"these are the formats my inventory accepts.\" Products selling this publisher's inventory SHOULD reference these declarations by `format_option_id` on the placement or via inline `format_options` whose `format_option_id` matches an entry here, eliminating the N-copies-of-Meta-Reels-on-N-products drift surface.\n\nEach item is a `ProductFormatDeclaration` (same 3.1+ canonical format-option shape used on Products) plus optional `applies_to_property_ids` / `applies_to_property_tags` for property scoping within the file. A `formats[]` entry without scope applies to all properties in the file; with scope, only to the named subset (e.g., Reels applies to Instagram + Facebook but not WhatsApp).\n\n**Community registry pattern (normative for unadopted platforms).** When a platform hasn't adopted AdCP (Meta, TikTok, Snap, Pinterest, etc.), AAO publishes a community-maintained adagents.json at `https://creative.adcontextprotocol.org/translated/<platform>/adagents.json` carrying that platform's `formats[]`. Buyer SDKs fetch the platform's own `<domain>/.well-known/adagents.json` first; on 404 or absence-of-formats[], they fall back to the AAO mirror. When the platform adopts AdCP and publishes their own adagents.json with `formats[]`, the platform-hosted file takes precedence and the mirror entry becomes redundant (AAO maintainers deprecate it).\n\nThe `v1_format_ref.agent_url` on each declaration SHOULD match the agent_url of the file's hosting location \u2014 platform-hosted formats point at the platform's agent, community-mirror formats point at `https://creative.adcontextprotocol.org/translated/<platform>`. This keeps the legacy named-format namespace converged regardless of which side hosts the catalog. See `docs/creative/canonical-formats.mdx` Meta Reels worked example.").optional(), "superseded_by": import_zod.z.string().url().regex(new RegExp("^https://")).describe("Optional pointer indicating this adagents.json file has been superseded by another adagents.json at a different URL. Used by the AAO community-mirror lifecycle: when a platform (e.g., Meta) adopts AdCP and publishes its own adagents.json at `<platform-domain>/.well-known/adagents.json`, the AAO mirror file at `creative.adcontextprotocol.org/translated/<platform>/adagents.json` sets `superseded_by` to the platform-hosted URL. Buyer SDKs encountering a file with `superseded_by` SHOULD short-circuit and re-fetch from the named URL rather than serving stale content from the mirror. The mirror SHOULD continue serving with `superseded_by` set for \u22651 minor release after platform adoption so buyer caches keyed on the mirror URL get an explicit migration signal rather than a silent break.").optional(), "tags": import_zod.z.record(import_zod.z.string(), import_zod.z.object({ "name": import_zod.z.string().describe("Human-readable name for this tag"), "description": import_zod.z.string().describe("Description of what this tag represents") }).catchall(import_zod.z.any())).describe("Metadata for each tag referenced by properties. Provides human-readable context for property tag values.").optional(), "placement_tags": import_zod.z.record(import_zod.z.string(), import_zod.z.object({ "name": import_zod.z.string().describe("Human-readable name for this placement tag"), "description": import_zod.z.string().describe("Description of what this placement tag represents") }).catchall(import_zod.z.any())).describe("Metadata for each tag referenced by placements. Provides human-readable context for publisher-defined placement tag values used in grouping and authorization.").optional(), "authorized_agents": import_zod.z.array(import_zod.z.union([import_zod.z.object({ "authorization_type": import_zod.z.literal("property_ids").describe("Discriminator indicating authorization by specific property IDs"), "property_ids": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Identifier for a publisher property. Must be lowercase alphanumeric with underscores only.")).describe("Property IDs this agent is authorized for. Resolved against the top-level properties array in this file"), "collections": import_zod.z.array(import_zod.z.object({ "publisher_domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring these collections is hosted (e.g., 'mrbeast.com'). The collections array in that file contains the authoritative collection definitions."), "collection_ids": import_zod.z.array(import_zod.z.string()).describe("Collection IDs from the adagents.json collections array. Each ID must match a collection_id declared in that file. Omit to reference all collections declared in that file.").optional() }).catchall(import_zod.z.any()).describe("References collections declared in an adagents.json. Buyers resolve full collection objects by fetching the adagents.json at the given domain and matching collection_ids against its collections array. When collection_ids is omitted, the selector references every collection declared in that adagents.json \u2014 the bulk-grant form for authorization scoping (e.g., a host authorizing a channel owner's sales agent for all of the owner's collections without tracking owner-assigned IDs).")).describe("Optional collection constraints. When present, authorization only applies to inventory associated with these collections. A selector without collection_ids grants for all collections declared in that selector's publisher_domain adagents.json (the bulk-grant form for owner-sold carriage).").optional(), "placement_ids": import_zod.z.array(import_zod.z.string()).describe("Optional placement constraints. When present, authorization only applies to these placement IDs from the top-level placements array in this file.").optional(), "placement_tags": import_zod.z.array(import_zod.z.string()).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Optional placement tag constraints. When present, authorization only applies to placements whose tags include any of these publisher-defined values.").optional(), "delegation_type": import_zod.z.enum(["direct", "delegated", "ad_network"]).describe("Commercial relationship for this inventory path. 'direct' means the publisher treats this as a direct way to buy from them, even if a third party operates the software. 'delegated' means the agent is authorized to sell on the publisher's behalf. 'ad_network' means the inventory is sold as part of a network/package context rather than as the publisher's direct endpoint.").optional(), "exclusive": import_zod.z.boolean().describe("Whether this agent is the publisher's sole authorized path for the scoped inventory slice. When false or absent, other authorized agents may also sell the same inventory.").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Optional ISO 3166-1 alpha-2 country codes limiting where this authorization applies. Omit for worldwide authorization.").optional(), "effective_from": import_zod.z.string().datetime().describe("Optional start time for this authorization window.").optional(), "effective_until": import_zod.z.string().datetime().describe("Optional end time for this authorization window.").optional() }).catchall(import_zod.z.any()).and(import_zod.z.object({ "url": import_zod.z.string().url().describe("The authorized agent's API endpoint URL. Callers comparing this URL against a registry (sales-agent list, signal-provider registry, TMP provider lookup, etc.) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality \u2014 two URLs that differ only in case, default port, or percent-encoding of unreserved characters are the same agent. See docs/reference/url-canonicalization."), "authorized_for": import_zod.z.string().min(1).max(500).describe("Human-readable description of what this agent is authorized to do \u2014 what it sells (for sales/property agents) or what data it provides (for signal agents). The variant the entry uses (`property_ids`, `signal_tags`, etc.) tells consumers which inflection applies; this field carries the operator-supplied label."), "signing_keys": import_zod.z.array(import_zod.z.object({ "kid": import_zod.z.string().describe("Key identifier for selecting the correct signing key."), "kty": import_zod.z.string().describe("JWK key type, such as 'OKP', 'EC', or 'RSA'."), "alg": import_zod.z.string().describe("Expected signing algorithm for this key, such as 'EdDSA' or 'RS256'.").optional(), "use": import_zod.z.string().describe("Optional JWK use value. Typically 'sig' for signing keys.").optional(), "crv": import_zod.z.string().describe("Curve name for OKP or EC keys, such as 'Ed25519' or 'P-256'.").optional(), "x": import_zod.z.string().describe("Base64url-encoded public key x coordinate or public key value for OKP keys.").optional(), "y": import_zod.z.string().describe("Base64url-encoded public key y coordinate for EC keys.").optional(), "n": import_zod.z.string().describe("Base64url-encoded RSA modulus.").optional(), "e": import_zod.z.string().describe("Base64url-encoded RSA public exponent.").optional(), "revoked_at": import_zod.z.string().datetime().describe("Optional revocation timestamp. When present, verifiers MUST reject any signature produced with this key whose signing epoch (or equivalent time reference) is at or after this timestamp. The key may continue to appear in the trust anchor during a grace period so caches that have not yet refreshed still find the key and can evaluate the revocation marker. Keys past their revocation can be removed once the cache TTL (recommended: 5 minutes) has elapsed across all verifiers.").optional() }).catchall(import_zod.z.any()).describe("Publisher-attested public key material for an authorized agent. Buyers use these keys to verify signed agent responses against the trust anchor published in adagents.json rather than trusting key discovery from the agent domain alone.")).describe("Optional publisher-attested public signing keys for this agent. Use these as the trust anchor for verifying signed agent responses instead of relying on key discovery from the agent domain alone.").optional(), "encryption_keys": import_zod.z.array(import_zod.z.object({ "kid": import_zod.z.string().max(8).describe("Key identifier. Opaque \u2014 MUST NOT encode geographic or deployment information."), "kty": import_zod.z.literal("OKP").describe("JWK key type. Must be OKP for X25519."), "crv": import_zod.z.literal("X25519").describe("Curve name. Must be X25519 for TMPX encryption."), "use": import_zod.z.literal("enc").describe("JWK use value. Must be enc for encryption keys."), "x": import_zod.z.string().describe("Base64url-encoded X25519 public key (32 bytes).") }).strict().describe("X25519 public key for HPKE encryption. Used for TMPX exposure token encryption with HPKE mode_base.")).describe("X25519 public keys for TMPX exposure token encryption. Each key identifies a cluster master that can decrypt TMPX tokens. Used with HPKE mode_base \u2014 read replicas encrypt with this public key, only the master can decrypt.").optional(), "last_updated": import_zod.z.string().datetime().describe("Optional ISO 8601 timestamp indicating when this `authorized_agents[]` entry last changed. Independent of the file-level `last_updated`. Lets validators perform a partial walk by skipping entries whose `last_updated` is older than their indexed value. Advisory \u2014 consumers MAY ignore and re-index the full file.").optional() }).describe("Fields shared by every variant of `authorized_agents[*]` in adagents.json, regardless of authorization_type. Variants `allOf` this base and add their discriminator-specific fields. Centralized to prevent drift across all authorization-type variants.")), import_zod.z.object({ "authorization_type": import_zod.z.literal("property_tags").describe("Discriminator indicating authorization by property tags"), "property_tags": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Tag for categorizing publisher properties. Must be lowercase alphanumeric with underscores only.")).describe("Tags identifying which properties this agent is authorized for. Resolved against the top-level properties array in this file using tag matching"), "collections": import_zod.z.array(import_zod.z.object({ "publisher_domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring these collections is hosted (e.g., 'mrbeast.com'). The collections array in that file contains the authoritative collection definitions."), "collection_ids": import_zod.z.array(import_zod.z.string()).describe("Collection IDs from the adagents.json collections array. Each ID must match a collection_id declared in that file. Omit to reference all collections declared in that file.").optional() }).catchall(import_zod.z.any()).describe("References collections declared in an adagents.json. Buyers resolve full collection objects by fetching the adagents.json at the given domain and matching collection_ids against its collections array. When collection_ids is omitted, the selector references every collection declared in that adagents.json \u2014 the bulk-grant form for authorization scoping (e.g., a host authorizing a channel owner's sales agent for all of the owner's collections without tracking owner-assigned IDs).")).describe("Optional collection constraints. When present, authorization only applies to inventory associated with these collections. A selector without collection_ids grants for all collections declared in that selector's publisher_domain adagents.json (the bulk-grant form for owner-sold carriage).").optional(), "placement_ids": import_zod.z.array(import_zod.z.string()).describe("Optional placement constraints. When present, authorization only applies to these placement IDs from the top-level placements array in this file.").optional(), "placement_tags": import_zod.z.array(import_zod.z.string()).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Optional placement tag constraints. When present, authorization only applies to placements whose tags include any of these publisher-defined values.").optional(), "delegation_type": import_zod.z.enum(["direct", "delegated", "ad_network"]).describe("Commercial relationship for this inventory path. 'direct' means the publisher treats this as a direct way to buy from them, even if a third party operates the software. 'delegated' means the agent is authorized to sell on the publisher's behalf. 'ad_network' means the inventory is sold as part of a network/package context rather than as the publisher's direct endpoint.").optional(), "exclusive": import_zod.z.boolean().describe("Whether this agent is the publisher's sole authorized path for the scoped inventory slice. When false or absent, other authorized agents may also sell the same inventory.").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Optional ISO 3166-1 alpha-2 country codes limiting where this authorization applies. Omit for worldwide authorization.").optional(), "effective_from": import_zod.z.string().datetime().describe("Optional start time for this authorization window.").optional(), "effective_until": import_zod.z.string().datetime().describe("Optional end time for this authorization window.").optional() }).catchall(import_zod.z.any()).and(import_zod.z.object({ "url": import_zod.z.string().url().describe("The authorized agent's API endpoint URL. Callers comparing this URL against a registry (sales-agent list, signal-provider registry, TMP provider lookup, etc.) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality \u2014 two URLs that differ only in case, default port, or percent-encoding of unreserved characters are the same agent. See docs/reference/url-canonicalization."), "authorized_for": import_zod.z.string().min(1).max(500).describe("Human-readable description of what this agent is authorized to do \u2014 what it sells (for sales/property agents) or what data it provides (for signal agents). The variant the entry uses (`property_ids`, `signal_tags`, etc.) tells consumers which inflection applies; this field carries the operator-supplied label."), "signing_keys": import_zod.z.array(import_zod.z.object({ "kid": import_zod.z.string().describe("Key identifier for selecting the correct signing key."), "kty": import_zod.z.string().describe("JWK key type, such as 'OKP', 'EC', or 'RSA'."), "alg": import_zod.z.string().describe("Expected signing algorithm for this key, such as 'EdDSA' or 'RS256'.").optional(), "use": import_zod.z.string().describe("Optional JWK use value. Typically 'sig' for signing keys.").optional(), "crv": import_zod.z.string().describe("Curve name for OKP or EC keys, such as 'Ed25519' or 'P-256'.").optional(), "x": import_zod.z.string().describe("Base64url-encoded public key x coordinate or public key value for OKP keys.").optional(), "y": import_zod.z.string().describe("Base64url-encoded public key y coordinate for EC keys.").optional(), "n": import_zod.z.string().describe("Base64url-encoded RSA modulus.").optional(), "e": import_zod.z.string().describe("Base64url-encoded RSA public exponent.").optional(), "revoked_at": import_zod.z.string().datetime().describe("Optional revocation timestamp. When present, verifiers MUST reject any signature produced with this key whose signing epoch (or equivalent time reference) is at or after this timestamp. The key may continue to appear in the trust anchor during a grace period so caches that have not yet refreshed still find the key and can evaluate the revocation marker. Keys past their revocation can be removed once the cache TTL (recommended: 5 minutes) has elapsed across all verifiers.").optional() }).catchall(import_zod.z.any()).describe("Publisher-attested public key material for an authorized agent. Buyers use these keys to verify signed agent responses against the trust anchor published in adagents.json rather than trusting key discovery from the agent domain alone.")).describe("Optional publisher-attested public signing keys for this agent. Use these as the trust anchor for verifying signed agent responses instead of relying on key discovery from the agent domain alone.").optional(), "encryption_keys": import_zod.z.array(import_zod.z.object({ "kid": import_zod.z.string().max(8).describe("Key identifier. Opaque \u2014 MUST NOT encode geographic or deployment information."), "kty": import_zod.z.literal("OKP").describe("JWK key type. Must be OKP for X25519."), "crv": import_zod.z.literal("X25519").describe("Curve name. Must be X25519 for TMPX encryption."), "use": import_zod.z.literal("enc").describe("JWK use value. Must be enc for encryption keys."), "x": import_zod.z.string().describe("Base64url-encoded X25519 public key (32 bytes).") }).strict().describe("X25519 public key for HPKE encryption. Used for TMPX exposure token encryption with HPKE mode_base.")).describe("X25519 public keys for TMPX exposure token encryption. Each key identifies a cluster master that can decrypt TMPX tokens. Used with HPKE mode_base \u2014 read replicas encrypt with this public key, only the master can decrypt.").optional(), "last_updated": import_zod.z.string().datetime().describe("Optional ISO 8601 timestamp indicating when this `authorized_agents[]` entry last changed. Independent of the file-level `last_updated`. Lets validators perform a partial walk by skipping entries whose `last_updated` is older than their indexed value. Advisory \u2014 consumers MAY ignore and re-index the full file.").optional() }).describe("Fields shared by every variant of `authorized_agents[*]` in adagents.json, regardless of authorization_type. Variants `allOf` this base and add their discriminator-specific fields. Centralized to prevent drift across all authorization-type variants.")), import_zod.z.object({ "authorization_type": import_zod.z.literal("inline_properties").describe("Discriminator indicating authorization by inline property definitions. Companion field is `properties` (not `inline_properties`) \u2014 the only authorization_type whose companion field name does not mirror the discriminator value."), "properties": import_zod.z.array(import_zod.z.object({ "property_id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Unique identifier for this property (optional). Enables referencing properties by ID instead of repeating full objects.").optional(), "property_type": import_zod.z.enum(["website", "mobile_app", "ctv_app", "desktop_app", "dooh", "podcast", "radio", "linear_tv", "streaming_audio", "ai_assistant"]).describe("Type of advertising property"), "name": import_zod.z.string().describe("Human-readable property name"), "identifiers": import_zod.z.array(import_zod.z.object({ "type": import_zod.z.enum(["domain", "subdomain", "network_id", "ios_bundle", "android_package", "apple_app_store_id", "google_play_id", "roku_store_id", "fire_tv_asin", "samsung_app_id", "apple_tv_bundle", "bundle_id", "venue_id", "screen_id", "openooh_venue_type", "rss_url", "apple_podcast_id", "spotify_collection_id", "podcast_guid", "station_id", "facility_id"]).describe("Type of identifier for this property"), "value": import_zod.z.string().describe("The identifier value. For domain type: 'example.com' matches base domain plus www and m subdomains; 'edition.example.com' matches that specific subdomain; '*.example.com' matches ALL subdomains but NOT base domain") }).catchall(import_zod.z.any())).describe("Array of identifiers for this property"), "tags": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Tag for categorizing publisher properties. Must be lowercase alphanumeric with underscores only.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Tags for categorization and grouping (e.g., network membership, content categories)").optional(), "supported_channels": import_zod.z.array(import_zod.z.enum(["display", "olv", "social", "search", "ctv", "linear_tv", "radio", "streaming_audio", "podcast", "dooh", "ooh", "print", "cinema", "email", "gaming", "retail_media", "influencer", "affiliate", "product_placement", "sponsored_intelligence"]).describe("Standardized advertising media channels describing how buyers allocate budget. Channels are planning abstractions, not technical substrates. See the Media Channel Taxonomy specification for detailed definitions.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Advertising channels this property supports (e.g., ['display', 'olv', 'social']). Publishers declare which channels their inventory aligns with. Properties may support multiple channels. See the Media Channel Taxonomy for definitions.").optional(), "publisher_domain": import_zod.z.string().describe("Domain where adagents.json should be checked for authorization validation. Optional in adagents.json (file location implies domain).").optional() }).catchall(import_zod.z.any()).describe("An advertising property that can be validated via adagents.json")).describe('Specific properties this agent is authorized for, defined inline on the agent entry (alternative to property_ids/property_tags). Note: this is the companion field for `authorization_type: "inline_properties"` \u2014 the field is named `properties`, not `inline_properties`.'), "collections": import_zod.z.array(import_zod.z.object({ "publisher_domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring these collections is hosted (e.g., 'mrbeast.com'). The collections array in that file contains the authoritative collection definitions."), "collection_ids": import_zod.z.array(import_zod.z.string()).describe("Collection IDs from the adagents.json collections array. Each ID must match a collection_id declared in that file. Omit to reference all collections declared in that file.").optional() }).catchall(import_zod.z.any()).describe("References collections declared in an adagents.json. Buyers resolve full collection objects by fetching the adagents.json at the given domain and matching collection_ids against its collections array. When collection_ids is omitted, the selector references every collection declared in that adagents.json \u2014 the bulk-grant form for authorization scoping (e.g., a host authorizing a channel owner's sales agent for all of the owner's collections without tracking owner-assigned IDs).")).describe("Optional collection constraints. When present, authorization only applies to inventory associated with these collections. A selector without collection_ids grants for all collections declared in that selector's publisher_domain adagents.json (the bulk-grant form for owner-sold carriage).").optional(), "placement_ids": import_zod.z.array(import_zod.z.string()).describe("Optional placement constraints. When present, authorization only applies to these placement IDs from the top-level placements array in this file.").optional(), "placement_tags": import_zod.z.array(import_zod.z.string()).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Optional placement tag constraints. When present, authorization only applies to placements whose tags include any of these publisher-defined values.").optional(), "delegation_type": import_zod.z.enum(["direct", "delegated", "ad_network"]).describe("Commercial relationship for this inventory path. 'direct' means the publisher treats this as a direct way to buy from them, even if a third party operates the software. 'delegated' means the agent is authorized to sell on the publisher's behalf. 'ad_network' means the inventory is sold as part of a network/package context rather than as the publisher's direct endpoint.").optional(), "exclusive": import_zod.z.boolean().describe("Whether this agent is the publisher's sole authorized path for the scoped inventory slice. When false or absent, other authorized agents may also sell the same inventory.").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Optional ISO 3166-1 alpha-2 country codes limiting where this authorization applies. Omit for worldwide authorization.").optional(), "effective_from": import_zod.z.string().datetime().describe("Optional start time for this authorization window.").optional(), "effective_until": import_zod.z.string().datetime().describe("Optional end time for this authorization window.").optional() }).catchall(import_zod.z.any()).and(import_zod.z.object({ "url": import_zod.z.string().url().describe("The authorized agent's API endpoint URL. Callers comparing this URL against a registry (sales-agent list, signal-provider registry, TMP provider lookup, etc.) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality \u2014 two URLs that differ only in case, default port, or percent-encoding of unreserved characters are the same agent. See docs/reference/url-canonicalization."), "authorized_for": import_zod.z.string().min(1).max(500).describe("Human-readable description of what this agent is authorized to do \u2014 what it sells (for sales/property agents) or what data it provides (for signal agents). The variant the entry uses (`property_ids`, `signal_tags`, etc.) tells consumers which inflection applies; this field carries the operator-supplied label."), "signing_keys": import_zod.z.array(import_zod.z.object({ "kid": import_zod.z.string().describe("Key identifier for selecting the correct signing key."), "kty": import_zod.z.string().describe("JWK key type, such as 'OKP', 'EC', or 'RSA'."), "alg": import_zod.z.string().describe("Expected signing algorithm for this key, such as 'EdDSA' or 'RS256'.").optional(), "use": import_zod.z.string().describe("Optional JWK use value. Typically 'sig' for signing keys.").optional(), "crv": import_zod.z.string().describe("Curve name for OKP or EC keys, such as 'Ed25519' or 'P-256'.").optional(), "x": import_zod.z.string().describe("Base64url-encoded public key x coordinate or public key value for OKP keys.").optional(), "y": import_zod.z.string().describe("Base64url-encoded public key y coordinate for EC keys.").optional(), "n": import_zod.z.string().describe("Base64url-encoded RSA modulus.").optional(), "e": import_zod.z.string().describe("Base64url-encoded RSA public exponent.").optional(), "revoked_at": import_zod.z.string().datetime().describe("Optional revocation timestamp. When present, verifiers MUST reject any signature produced with this key whose signing epoch (or equivalent time reference) is at or after this timestamp. The key may continue to appear in the trust anchor during a grace period so caches that have not yet refreshed still find the key and can evaluate the revocation marker. Keys past their revocation can be removed once the cache TTL (recommended: 5 minutes) has elapsed across all verifiers.").optional() }).catchall(import_zod.z.any()).describe("Publisher-attested public key material for an authorized agent. Buyers use these keys to verify signed agent responses against the trust anchor published in adagents.json rather than trusting key discovery from the agent domain alone.")).describe("Optional publisher-attested public signing keys for this agent. Use these as the trust anchor for verifying signed agent responses instead of relying on key discovery from the agent domain alone.").optional(), "encryption_keys": import_zod.z.array(import_zod.z.object({ "kid": import_zod.z.string().max(8).describe("Key identifier. Opaque \u2014 MUST NOT encode geographic or deployment information."), "kty": import_zod.z.literal("OKP").describe("JWK key type. Must be OKP for X25519."), "crv": import_zod.z.literal("X25519").describe("Curve name. Must be X25519 for TMPX encryption."), "use": import_zod.z.literal("enc").describe("JWK use value. Must be enc for encryption keys."), "x": import_zod.z.string().describe("Base64url-encoded X25519 public key (32 bytes).") }).strict().describe("X25519 public key for HPKE encryption. Used for TMPX exposure token encryption with HPKE mode_base.")).describe("X25519 public keys for TMPX exposure token encryption. Each key identifies a cluster master that can decrypt TMPX tokens. Used with HPKE mode_base \u2014 read replicas encrypt with this public key, only the master can decrypt.").optional(), "last_updated": import_zod.z.string().datetime().describe("Optional ISO 8601 timestamp indicating when this `authorized_agents[]` entry last changed. Independent of the file-level `last_updated`. Lets validators perform a partial walk by skipping entries whose `last_updated` is older than their indexed value. Advisory \u2014 consumers MAY ignore and re-index the full file.").optional() }).describe("Fields shared by every variant of `authorized_agents[*]` in adagents.json, regardless of authorization_type. Variants `allOf` this base and add their discriminator-specific fields. Centralized to prevent drift across all authorization-type variants.")), import_zod.z.object({ "authorization_type": import_zod.z.literal("publisher_properties").describe("Discriminator indicating authorization for properties from other publisher domains"), "publisher_properties": import_zod.z.array(import_zod.z.union([import_zod.z.object({ "publisher_domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where publisher's adagents.json is hosted (e.g., 'cnn.com'). XOR with `publisher_domains` \u2014 exactly one MUST be present on each `publisher_properties[]` entry; both-present and neither-present both fail validation.").optional(), "publisher_domains": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$"))).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Compact form for fanning the same selector across many publishers (e.g., a managed network listing every publisher it represents). Each entry is the domain where that publisher's adagents.json is hosted. Each listed domain MUST be canonicalized to lowercase (the `pattern` already rejects uppercase). Mutually exclusive with `publisher_domain`. Each listed domain counts as explicitly scoped for the `managerdomain` fallback safety rule.").optional(), "selection_type": import_zod.z.literal("all").describe("Discriminator indicating all properties from each addressed publisher are included") }).catchall(import_zod.z.any()).and(import_zod.z.intersection(import_zod.z.any().refine((value) => !import_zod.z.any().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), import_zod.z.union([import_zod.z.any(), import_zod.z.any()]))).describe("Select all properties from one publisher domain, or from each publisher domain when `publisher_domains` is used. Consumers MAY satisfy the selector from the parent file's top-level `properties[]` when those properties carry a `publisher_domain` matching one of the listed domains (see Resolution paths in the spec)."), import_zod.z.object({ "publisher_domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where publisher's adagents.json is hosted (e.g., 'cnn.com')."), "selection_type": import_zod.z.literal("by_id").describe("Discriminator indicating selection by specific property IDs"), "property_ids": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Identifier for a publisher property. Must be lowercase alphanumeric with underscores only.")).describe("Specific property IDs from the publisher's adagents.json") }).catchall(import_zod.z.any()).describe("Select specific properties by ID. Single-publisher only \u2014 property IDs are publisher-scoped, so the compact `publisher_domains[]` form is intentionally NOT available for this selector. Use multiple `publisher_properties[]` entries (one per publisher) when each publisher's ID set differs."), import_zod.z.object({ "publisher_domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where publisher's adagents.json is hosted (e.g., 'cnn.com'). XOR with `publisher_domains` \u2014 exactly one MUST be present on each `publisher_properties[]` entry; both-present and neither-present both fail validation.").optional(), "publisher_domains": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$"))).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Compact form for fanning the same tag predicate across many publishers (canonical managed-network shape). Each entry is the domain where that publisher's adagents.json is hosted. Each listed domain MUST be canonicalized to lowercase (the `pattern` already rejects uppercase). Mutually exclusive with `publisher_domain`. Each listed domain counts as explicitly scoped for the `managerdomain` fallback safety rule.").optional(), "selection_type": import_zod.z.literal("by_tag").describe("Discriminator indicating selection by property tags"), "property_tags": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Tag for categorizing publisher properties. Must be lowercase alphanumeric with underscores only.")).describe("Property tags resolved against each addressed publisher's adagents.json, OR against the parent file's top-level `properties[]` when those properties carry a `publisher_domain` matching the selector. Selector covers all properties carrying any of these tags.") }).catchall(import_zod.z.any()).and(import_zod.z.intersection(import_zod.z.any().refine((value) => !import_zod.z.any().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), import_zod.z.union([import_zod.z.any(), import_zod.z.any()]))).describe("Select properties by tag membership. With `publisher_domains`, the same `property_tags` predicate is resolved against each listed publisher's adagents.json \u2014 the common managed-network case where every represented site tags inventory with a shared label. Consumers MAY also satisfy the predicate from the parent file's top-level `properties[]` when those properties carry a `publisher_domain` matching one of the selector's `publisher_domains[]` (see Resolution paths in the spec).")]).describe("Selects properties from a publisher's adagents.json. Used for both product definitions and agent authorization. Supports three selection patterns: all properties, specific IDs, or by tags. Each selector targets one publisher via `publisher_domain` (string) or a fan-out across many publishers that share the same selector via `publisher_domains` (array). Exactly one of `publisher_domain` or `publisher_domains` MUST be present. When `publisher_domains` is used, the selector is logically equivalent to repeating the same entry once per listed domain.")).describe("Properties from other publisher domains this agent is authorized for. Each entry specifies a publisher domain and which of their properties this agent can sell"), "collections": import_zod.z.array(import_zod.z.object({ "publisher_domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring these collections is hosted (e.g., 'mrbeast.com'). The collections array in that file contains the authoritative collection definitions."), "collection_ids": import_zod.z.array(import_zod.z.string()).describe("Collection IDs from the adagents.json collections array. Each ID must match a collection_id declared in that file. Omit to reference all collections declared in that file.").optional() }).catchall(import_zod.z.any()).describe("References collections declared in an adagents.json. Buyers resolve full collection objects by fetching the adagents.json at the given domain and matching collection_ids against its collections array. When collection_ids is omitted, the selector references every collection declared in that adagents.json \u2014 the bulk-grant form for authorization scoping (e.g., a host authorizing a channel owner's sales agent for all of the owner's collections without tracking owner-assigned IDs).")).describe("Optional collection constraints. When present, authorization only applies to inventory associated with these collections. A selector without collection_ids grants for all collections declared in that selector's publisher_domain adagents.json (the bulk-grant form for owner-sold carriage).").optional(), "placement_ids": import_zod.z.array(import_zod.z.string()).describe("Optional placement constraints. When present, authorization only applies to these placement IDs from the top-level placements array in this file.").optional(), "placement_tags": import_zod.z.array(import_zod.z.string()).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Optional placement tag constraints. When present, authorization only applies to placements whose tags include any of these publisher-defined values.").optional(), "delegation_type": import_zod.z.enum(["direct", "delegated", "ad_network"]).describe("Commercial relationship for this inventory path. 'direct' means the publisher treats this as a direct way to buy from them, even if a third party operates the software. 'delegated' means the agent is authorized to sell on the publisher's behalf. 'ad_network' means the inventory is sold as part of a network/package context rather than as the publisher's direct endpoint.").optional(), "exclusive": import_zod.z.boolean().describe("Whether this agent is the publisher's sole authorized path for the scoped inventory slice. When false or absent, other authorized agents may also sell the same inventory.").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Optional ISO 3166-1 alpha-2 country codes limiting where this authorization applies. Omit for worldwide authorization.").optional(), "effective_from": import_zod.z.string().datetime().describe("Optional start time for this authorization window.").optional(), "effective_until": import_zod.z.string().datetime().describe("Optional end time for this authorization window.").optional() }).catchall(import_zod.z.any()).and(import_zod.z.object({ "url": import_zod.z.string().url().describe("The authorized agent's API endpoint URL. Callers comparing this URL against a registry (sales-agent list, signal-provider registry, TMP provider lookup, etc.) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality \u2014 two URLs that differ only in case, default port, or percent-encoding of unreserved characters are the same agent. See docs/reference/url-canonicalization."), "authorized_for": import_zod.z.string().min(1).max(500).describe("Human-readable description of what this agent is authorized to do \u2014 what it sells (for sales/property agents) or what data it provides (for signal agents). The variant the entry uses (`property_ids`, `signal_tags`, etc.) tells consumers which inflection applies; this field carries the operator-supplied label."), "signing_keys": import_zod.z.array(import_zod.z.object({ "kid": import_zod.z.string().describe("Key identifier for selecting the correct signing key."), "kty": import_zod.z.string().describe("JWK key type, such as 'OKP', 'EC', or 'RSA'."), "alg": import_zod.z.string().describe("Expected signing algorithm for this key, such as 'EdDSA' or 'RS256'.").optional(), "use": import_zod.z.string().describe("Optional JWK use value. Typically 'sig' for signing keys.").optional(), "crv": import_zod.z.string().describe("Curve name for OKP or EC keys, such as 'Ed25519' or 'P-256'.").optional(), "x": import_zod.z.string().describe("Base64url-encoded public key x coordinate or public key value for OKP keys.").optional(), "y": import_zod.z.string().describe("Base64url-encoded public key y coordinate for EC keys.").optional(), "n": import_zod.z.string().describe("Base64url-encoded RSA modulus.").optional(), "e": import_zod.z.string().describe("Base64url-encoded RSA public exponent.").optional(), "revoked_at": import_zod.z.string().datetime().describe("Optional revocation timestamp. When present, verifiers MUST reject any signature produced with this key whose signing epoch (or equivalent time reference) is at or after this timestamp. The key may continue to appear in the trust anchor during a grace period so caches that have not yet refreshed still find the key and can evaluate the revocation marker. Keys past their revocation can be removed once the cache TTL (recommended: 5 minutes) has elapsed across all verifiers.").optional() }).catchall(import_zod.z.any()).describe("Publisher-attested public key material for an authorized agent. Buyers use these keys to verify signed agent responses against the trust anchor published in adagents.json rather than trusting key discovery from the agent domain alone.")).describe("Optional publisher-attested public signing keys for this agent. Use these as the trust anchor for verifying signed agent responses instead of relying on key discovery from the agent domain alone.").optional(), "encryption_keys": import_zod.z.array(import_zod.z.object({ "kid": import_zod.z.string().max(8).describe("Key identifier. Opaque \u2014 MUST NOT encode geographic or deployment information."), "kty": import_zod.z.literal("OKP").describe("JWK key type. Must be OKP for X25519."), "crv": import_zod.z.literal("X25519").describe("Curve name. Must be X25519 for TMPX encryption."), "use": import_zod.z.literal("enc").describe("JWK use value. Must be enc for encryption keys."), "x": import_zod.z.string().describe("Base64url-encoded X25519 public key (32 bytes).") }).strict().describe("X25519 public key for HPKE encryption. Used for TMPX exposure token encryption with HPKE mode_base.")).describe("X25519 public keys for TMPX exposure token encryption. Each key identifies a cluster master that can decrypt TMPX tokens. Used with HPKE mode_base \u2014 read replicas encrypt with this public key, only the master can decrypt.").optional(), "last_updated": import_zod.z.string().datetime().describe("Optional ISO 8601 timestamp indicating when this `authorized_agents[]` entry last changed. Independent of the file-level `last_updated`. Lets validators perform a partial walk by skipping entries whose `last_updated` is older than their indexed value. Advisory \u2014 consumers MAY ignore and re-index the full file.").optional() }).describe("Fields shared by every variant of `authorized_agents[*]` in adagents.json, regardless of authorization_type. Variants `allOf` this base and add their discriminator-specific fields. Centralized to prevent drift across all authorization-type variants.")), import_zod.z.object({ "authorization_type": import_zod.z.literal("signal_ids").describe("Discriminator indicating authorization by specific signal IDs"), "signal_ids": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$"))).describe("Signal IDs this agent is authorized to resell. Resolved against the top-level signals array in this file") }).catchall(import_zod.z.any()).and(import_zod.z.object({ "url": import_zod.z.string().url().describe("The authorized agent's API endpoint URL. Callers comparing this URL against a registry (sales-agent list, signal-provider registry, TMP provider lookup, etc.) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality \u2014 two URLs that differ only in case, default port, or percent-encoding of unreserved characters are the same agent. See docs/reference/url-canonicalization."), "authorized_for": import_zod.z.string().min(1).max(500).describe("Human-readable description of what this agent is authorized to do \u2014 what it sells (for sales/property agents) or what data it provides (for signal agents). The variant the entry uses (`property_ids`, `signal_tags`, etc.) tells consumers which inflection applies; this field carries the operator-supplied label."), "signing_keys": import_zod.z.array(import_zod.z.object({ "kid": import_zod.z.string().describe("Key identifier for selecting the correct signing key."), "kty": import_zod.z.string().describe("JWK key type, such as 'OKP', 'EC', or 'RSA'."), "alg": import_zod.z.string().describe("Expected signing algorithm for this key, such as 'EdDSA' or 'RS256'.").optional(), "use": import_zod.z.string().describe("Optional JWK use value. Typically 'sig' for signing keys.").optional(), "crv": import_zod.z.string().describe("Curve name for OKP or EC keys, such as 'Ed25519' or 'P-256'.").optional(), "x": import_zod.z.string().describe("Base64url-encoded public key x coordinate or public key value for OKP keys.").optional(), "y": import_zod.z.string().describe("Base64url-encoded public key y coordinate for EC keys.").optional(), "n": import_zod.z.string().describe("Base64url-encoded RSA modulus.").optional(), "e": import_zod.z.string().describe("Base64url-encoded RSA public exponent.").optional(), "revoked_at": import_zod.z.string().datetime().describe("Optional revocation timestamp. When present, verifiers MUST reject any signature produced with this key whose signing epoch (or equivalent time reference) is at or after this timestamp. The key may continue to appear in the trust anchor during a grace period so caches that have not yet refreshed still find the key and can evaluate the revocation marker. Keys past their revocation can be removed once the cache TTL (recommended: 5 minutes) has elapsed across all verifiers.").optional() }).catchall(import_zod.z.any()).describe("Publisher-attested public key material for an authorized agent. Buyers use these keys to verify signed agent responses against the trust anchor published in adagents.json rather than trusting key discovery from the agent domain alone.")).describe("Optional publisher-attested public signing keys for this agent. Use these as the trust anchor for verifying signed agent responses instead of relying on key discovery from the agent domain alone.").optional(), "encryption_keys": import_zod.z.array(import_zod.z.object({ "kid": import_zod.z.string().max(8).describe("Key identifier. Opaque \u2014 MUST NOT encode geographic or deployment information."), "kty": import_zod.z.literal("OKP").describe("JWK key type. Must be OKP for X25519."), "crv": import_zod.z.literal("X25519").describe("Curve name. Must be X25519 for TMPX encryption."), "use": import_zod.z.literal("enc").describe("JWK use value. Must be enc for encryption keys."), "x": import_zod.z.string().describe("Base64url-encoded X25519 public key (32 bytes).") }).strict().describe("X25519 public key for HPKE encryption. Used for TMPX exposure token encryption with HPKE mode_base.")).describe("X25519 public keys for TMPX exposure token encryption. Each key identifies a cluster master that can decrypt TMPX tokens. Used with HPKE mode_base \u2014 read replicas encrypt with this public key, only the master can decrypt.").optional(), "last_updated": import_zod.z.string().datetime().describe("Optional ISO 8601 timestamp indicating when this `authorized_agents[]` entry last changed. Independent of the file-level `last_updated`. Lets validators perform a partial walk by skipping entries whose `last_updated` is older than their indexed value. Advisory \u2014 consumers MAY ignore and re-index the full file.").optional() }).describe("Fields shared by every variant of `authorized_agents[*]` in adagents.json, regardless of authorization_type. Variants `allOf` this base and add their discriminator-specific fields. Centralized to prevent drift across all authorization-type variants.")).describe("Authorization for signals by specific signal IDs"), import_zod.z.object({ "authorization_type": import_zod.z.literal("signal_tags").describe("Discriminator indicating authorization by signal tags"), "signal_tags": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9_-]+$"))).describe("Signal tags this agent is authorized for. Agent can resell all signals with these tags") }).catchall(import_zod.z.any()).and(import_zod.z.object({ "url": import_zod.z.string().url().describe("The authorized agent's API endpoint URL. Callers comparing this URL against a registry (sales-agent list, signal-provider registry, TMP provider lookup, etc.) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality \u2014 two URLs that differ only in case, default port, or percent-encoding of unreserved characters are the same agent. See docs/reference/url-canonicalization."), "authorized_for": import_zod.z.string().min(1).max(500).describe("Human-readable description of what this agent is authorized to do \u2014 what it sells (for sales/property agents) or what data it provides (for signal agents). The variant the entry uses (`property_ids`, `signal_tags`, etc.) tells consumers which inflection applies; this field carries the operator-supplied label."), "signing_keys": import_zod.z.array(import_zod.z.object({ "kid": import_zod.z.string().describe("Key identifier for selecting the correct signing key."), "kty": import_zod.z.string().describe("JWK key type, such as 'OKP', 'EC', or 'RSA'."), "alg": import_zod.z.string().describe("Expected signing algorithm for this key, such as 'EdDSA' or 'RS256'.").optional(), "use": import_zod.z.string().describe("Optional JWK use value. Typically 'sig' for signing keys.").optional(), "crv": import_zod.z.string().describe("Curve name for OKP or EC keys, such as 'Ed25519' or 'P-256'.").optional(), "x": import_zod.z.string().describe("Base64url-encoded public key x coordinate or public key value for OKP keys.").optional(), "y": import_zod.z.string().describe("Base64url-encoded public key y coordinate for EC keys.").optional(), "n": import_zod.z.string().describe("Base64url-encoded RSA modulus.").optional(), "e": import_zod.z.string().describe("Base64url-encoded RSA public exponent.").optional(), "revoked_at": import_zod.z.string().datetime().describe("Optional revocation timestamp. When present, verifiers MUST reject any signature produced with this key whose signing epoch (or equivalent time reference) is at or after this timestamp. The key may continue to appear in the trust anchor during a grace period so caches that have not yet refreshed still find the key and can evaluate the revocation marker. Keys past their revocation can be removed once the cache TTL (recommended: 5 minutes) has elapsed across all verifiers.").optional() }).catchall(import_zod.z.any()).describe("Publisher-attested public key material for an authorized agent. Buyers use these keys to verify signed agent responses against the trust anchor published in adagents.json rather than trusting key discovery from the agent domain alone.")).describe("Optional publisher-attested public signing keys for this agent. Use these as the trust anchor for verifying signed agent responses instead of relying on key discovery from the agent domain alone.").optional(), "encryption_keys": import_zod.z.array(import_zod.z.object({ "kid": import_zod.z.string().max(8).describe("Key identifier. Opaque \u2014 MUST NOT encode geographic or deployment information."), "kty": import_zod.z.literal("OKP").describe("JWK key type. Must be OKP for X25519."), "crv": import_zod.z.literal("X25519").describe("Curve name. Must be X25519 for TMPX encryption."), "use": import_zod.z.literal("enc").describe("JWK use value. Must be enc for encryption keys."), "x": import_zod.z.string().describe("Base64url-encoded X25519 public key (32 bytes).") }).strict().describe("X25519 public key for HPKE encryption. Used for TMPX exposure token encryption with HPKE mode_base.")).describe("X25519 public keys for TMPX exposure token encryption. Each key identifies a cluster master that can decrypt TMPX tokens. Used with HPKE mode_base \u2014 read replicas encrypt with this public key, only the master can decrypt.").optional(), "last_updated": import_zod.z.string().datetime().describe("Optional ISO 8601 timestamp indicating when this `authorized_agents[]` entry last changed. Independent of the file-level `last_updated`. Lets validators perform a partial walk by skipping entries whose `last_updated` is older than their indexed value. Advisory \u2014 consumers MAY ignore and re-index the full file.").optional() }).describe("Fields shared by every variant of `authorized_agents[*]` in adagents.json, regardless of authorization_type. Variants `allOf` this base and add their discriminator-specific fields. Centralized to prevent drift across all authorization-type variants.")).describe("Authorization for signals by tag membership")])).describe("Array of sales agents authorized to make inventory from this file available to buyers. Authorization can be scoped to specific properties, collections, countries, and time windows, with optional delegation metadata indicating whether the path is direct, delegated, or network-mediated. MAY be empty (`[]`) for a catalog-only community mirror \u2014 a file that publishes `formats`/`properties`/`placements` (with `catalog_etag`) for a platform that has not adopted AdCP, where there is no sales agent to authorize (see `catalog_etag`, `formats`, `superseded_by`). An empty array asserts *no sales authorization*: validators MUST NOT read it as deny-all, authorize-all, or a revocation, MUST NOT treat its presence as an error, and MUST still consume the catalog arrays."), "last_updated": import_zod.z.string().datetime().describe("ISO 8601 timestamp indicating when this file was last updated").optional(), "property_features": import_zod.z.array(import_zod.z.object({ "url": import_zod.z.string().url().describe("The agent's API endpoint URL. Callers comparing this URL against a feature-provider registry MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. See docs/reference/url-canonicalization."), "name": import_zod.z.string().describe("Human-readable name of the vendor/agent (e.g., 'Scope3', 'TAG', 'OneTrust')"), "features": import_zod.z.array(import_zod.z.string()).describe("Feature IDs this agent provides (e.g., 'carbon_score', 'tag_certified_against_fraud'). Use get_adcp_capabilities on the agent for full definitions."), "publisher_id": import_zod.z.string().describe("Optional publisher identifier at this agent (for lookup)").optional() }).catchall(import_zod.z.any())).describe("[AdCP 3.0] Optional list of agents that provide property feature data (certifications, scores, compliance status). Used for discovery - actual data is accessed through property list filters.").optional(), "signals": import_zod.z.array(import_zod.z.object({ "id": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the publishing domain's adagents.json signals[]"), "name": import_zod.z.string().min(1).max(255).describe("Human-readable signal name"), "description": import_zod.z.string().max(2e3).describe("Detailed description of what this signal represents and how it's derived").optional(), "value_type": import_zod.z.enum(["binary", "categorical", "numeric"]).describe("The data type of this signal's values"), "tags": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9_-]+$"))).describe("Tags for grouping and filtering this domain's published signal definitions").optional(), "allowed_values": import_zod.z.array(import_zod.z.string()).describe("For categorical signals, the valid values users can be assigned").optional(), "restricted_attributes": import_zod.z.array(import_zod.z.enum(["racial_ethnic_origin", "political_opinions", "religious_beliefs", "trade_union_membership", "health_data", "sex_life_sexual_orientation", "genetic_data", "biometric_data", "age", "familial_status"]).describe("Personal data categories that may be restricted from use in audience targeting. Combines GDPR Article 9 special categories with US civil-rights protected classes (FHA familial_status, ADEA age). Used in two places: (1) on campaign plans via restricted_attributes to declare which categories are prohibited, and (2) on signal-definition.json via restricted_attributes to declare which categories a signal touches. Governance agents match plan restrictions against signal declarations for structural validation.")).describe("Restricted attribute categories this signal touches. Data providers SHOULD declare these so governance agents can structurally match signals against a plan's restricted_attributes without relying on semantic inference from the signal name or description.").optional(), "demographic_predicate": import_zod.z.object({ "age": import_zod.z.object({ "min": import_zod.z.number().int().gte(0).lte(150).describe("Inclusive minimum age in completed years. Omit for an open lower bound.").optional(), "max": import_zod.z.number().int().gte(0).lte(150).describe("Inclusive maximum age in completed years. Omit for an open upper bound.").optional(), "include_unknown": import_zod.z.boolean().describe("Whether delivery to people whose age is unavailable is part of this predicate. This field has no default and MUST be supplied.") }).catchall(import_zod.z.any()).and(import_zod.z.union([import_zod.z.any(), import_zod.z.any()])).describe("A canonical audience-age predicate in completed integer years. min and max are inclusive; omitting one bound means no restriction in that direction. At least one bound is required. include_unknown is always explicit because people whose age is unavailable are not members of any numeric interval. Implementations MUST reject min greater than max; JSON Schema draft-07 cannot compare sibling numeric values.") }).catchall(import_zod.z.any()).describe("Authoritative machine-readable demographic meaning for this signal. Signal names and taxonomy labels alone never establish exact demographic equivalence. Signals carrying this field MUST also declare restricted_attributes including age.").optional(), "policy_categories": import_zod.z.array(import_zod.z.string()).describe("Policy categories this signal is sensitive for (e.g., a children's interest signal declares ['children_directed']). Governance agents match these against a plan's policy_categories to flag sensitive data usage.").optional(), "range": import_zod.z.object({ "min": import_zod.z.number().describe("Minimum value"), "max": import_zod.z.number().describe("Maximum value"), "unit": import_zod.z.string().describe("Unit of measurement (e.g., 'score', 'dollars', 'years')").optional() }).strict().describe("For numeric signals, the valid value range").optional(), "taxonomy": import_zod.z.object({ "ref": import_zod.z.string().url().describe("URI identifying the taxonomy or taxonomy documentation."), "version": import_zod.z.string().describe("Version identifier for the taxonomy when the taxonomy has versioned definitions.").optional(), "segtax": import_zod.z.number().int().gte(1).describe("OpenRTB segtax code when the taxonomy maps to an OpenRTB segment taxonomy.").optional(), "etag": import_zod.z.string().describe("Optional validator for custom taxonomy definitions so consumers can detect drift between signal publication and taxonomy resolution.").optional(), "values": import_zod.z.array(import_zod.z.object({ "id": import_zod.z.string().min(1).describe("Taxonomy node identifier."), "path": import_zod.z.string().describe("Optional human-readable or taxonomy-native path for display and review.").optional(), "modifiers": import_zod.z.array(import_zod.z.string()).describe("Optional taxonomy-specific modifiers that qualify the node.").optional() }).strict()).describe("Taxonomy node values that describe this signal. These are meaning/discovery metadata for the signal definition, not the values a buyer submits in package targeting expressions."), "value_mappings": import_zod.z.array(import_zod.z.object({ "value": import_zod.z.string().describe("Categorical value from allowed_values[]."), "taxonomy_value_id": import_zod.z.string().describe("Taxonomy node identifier corresponding to this categorical value."), "path": import_zod.z.string().describe("Optional human-readable or taxonomy-native path for display and review.").optional(), "modifiers": import_zod.z.array(import_zod.z.string()).describe("Optional taxonomy-specific modifiers that qualify the mapped value.").optional() }).strict()).describe("For categorical signals, maps package-targeting allowed_values[] strings to stable taxonomy node identifiers. The allowed_values[] strings remain the wire values buyers submit; this mapping explains how those strings resolve into the published taxonomy. Each value_mappings[].value SHOULD match one of the signal's allowed_values[] entries; JSON Schema draft-07 cannot enforce this cross-array constraint.").optional(), "parent_match_behavior": import_zod.z.enum(["exact_only", "descendants_supported", "unknown"]).describe("Whether this signal definition supports treating a parent taxonomy node as matching descendant nodes for discovery/filtering or seller-side expansion. 'exact_only' means only explicitly listed node ids match. 'descendants_supported' means the seller can expand known, version-pinned parent nodes to descendants internally, typically by ORing the children in its execution system. 'unknown' means the provider has not declared parent-node behavior. This field is metadata about discovery/translation behavior, not a package targeting operator.").optional() }).strict().describe("Optional taxonomy metadata describing what this signal means in an external audience, content, retail-media, or provider-owned taxonomy. Taxonomy metadata does not create a new value_type and does not change package targeting grammar: buyers still target the named signal according to value_type. When a taxonomy value is a parent node, parent/descendant expansion is seller behavior and must be declared through parent_match_behavior rather than assumed.").optional(), "segmentation_criteria": import_zod.z.string().max(500).describe("Rules governing inclusion of identifiers in the segment. Aligns with IAB Data Transparency Standard audience criteria disclosure.").optional(), "criteria_url": import_zod.z.string().url().describe("Optional URL to a longer-form methodology or criteria document. This is a disclosure pointer; buyers should not branch programmatically on the linked content.").optional(), "data_sources": import_zod.z.array(import_zod.z.enum(["app_behavior", "app_usage", "web_usage", "geo_location", "email", "tv_ott_or_stb_device", "panel", "online_ecommerce", "credit_data", "loyalty_card", "transaction", "online_survey", "offline_survey", "public_record_census", "public_record_voter_file", "public_record_other", "offline_transaction"])).describe("Origin categories of the raw data used to compile the signal, aligned with IAB Data Transparency Standard source disclosure. Use 'panel' for respondent-panel or JIC-style audience sources. Offline and public-record sources require onboarder disclosure. Co-viewing projection and reconciliation of seller claims against a JIC or measurement vendor belong in measurement reporting/vendor metrics rather than package signal targeting.").optional(), "methodology": import_zod.z.enum(["observed", "declared", "derived", "inferred", "modeled"]).describe("How the signal's audience membership or attribute was determined. 'modeled' requires the modeling block.").optional(), "audience_expansion": import_zod.z.boolean().describe("Whether look-alike or similar-audience expansion was used to include additional identifiers. When true, modeling is required.").optional(), "device_expansion": import_zod.z.boolean().describe("Whether the signal was expanded deterministically across devices of the same user, household, or business. Probabilistic cross-device expansion is modeling and should use methodology 'modeled' or the modeling block.").optional(), "refresh_cadence": import_zod.z.enum(["intra_day", "daily", "weekly", "monthly", "bi_monthly", "quarterly", "bi_annually", "annually"]).describe("Cadence at which the signal definition's underlying segment membership is refreshed.").optional(), "lookback_window": import_zod.z.enum(["intra_day", "daily", "weekly", "monthly", "bi_monthly", "quarterly", "bi_annually", "annually"]).describe("Time window in which a qualifying event can occur for inclusion.").optional(), "onboarder": import_zod.z.object({ "match_keys": import_zod.z.array(import_zod.z.enum(["name", "address", "email", "postal", "lat_long", "mobile_id", "cookie_id", "ip", "customer_id", "phone"])), "pre_onboarding_audience_expansion": import_zod.z.boolean().optional(), "pre_onboarding_device_expansion": import_zod.z.boolean().optional(), "pre_onboarding_precision_level": import_zod.z.enum(["individual", "household", "business", "geography"]).optional() }).strict().describe("Onboarder disclosure. Required when data_sources includes an offline_* or public_record_* source.").optional(), "subject_type": import_zod.z.enum(["individual", "household", "business", "contextual", "none"]).describe("What kind of subject this signal characterizes.").optional(), "resolution_method": import_zod.z.enum(["deterministic_id", "probabilistic_device", "browser", "geographic", "content_signal", "mixed"]).describe("How the subject is resolved at decision time.").optional(), "id_types": import_zod.z.array(import_zod.z.enum(["cookie", "mobile_id", "platform_id", "user_enabled_id"])).describe("Identifier currencies analyzed to determine audience membership or attributes.").optional(), "audience_scope": import_zod.z.enum(["single_domain", "cross_domain_owned", "cross_domain_unowned", "offline"]).describe("Context within which the audience attribute was determined. 'single_domain' requires originating_domain.").optional(), "originating_domain": import_zod.z.string().describe("Domain of the digital property where the audience originates. Required when audience_scope is 'single_domain'.").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).describe("ISO 3166-1 alpha-2 country codes where the signal is applicable. Sellers must not expose a signal for media buys in countries outside this list. Federating agents that surface a peer's signal MUST treat the peer-published list as an upper bound, re-check it against the buyer's intended deployment countries, and may apply only narrower local policy.").optional(), "consent_basis": import_zod.z.array(import_zod.z.enum(["consent", "legitimate_interest", "contract", "legal_obligation"]).describe("Common GDPR lawful bases relevant to advertising. Covers the Article 6(1) bases used in programmatic advertising contexts.")).describe("Declared GDPR Article 6 lawful basis or consent basis under which this signal's data is processed. For non-GDPR regimes, use countries, policy_categories, and disclosure fields to describe jurisdiction-specific obligations unless a future enum value applies.").optional(), "art9_basis": import_zod.z.enum(["explicit_consent", "manifestly_made_public", "substantial_public_interest", "vital_interests"]).describe("GDPR Article 9 basis when restricted_attributes is non-empty and the signal is used in jurisdictions where Article 9 applies. Required by policy for applicable use cases rather than universally required at schema level because sensitivity and lawful basis are jurisdiction-relative.").optional(), "modeling": import_zod.z.object({ "method": import_zod.z.enum(["lookalike", "supervised", "embedding", "rules"]), "seed_source": import_zod.z.object({ "type": import_zod.z.enum(["first_party_crm", "panel", "declared_survey", "transactional", "behavioral"]), "provider_signed": import_zod.z.boolean().describe("Whether the seed source carries a signed attestation under one of the provider's published signing keys. This is a forward-looking claim until the consumer can resolve and verify the provider's applicable signing keys through the AdCP signing profile; consumers MUST NOT treat this boolean alone as cryptographic proof.") }).strict(), "training_data_jurisdictions": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).describe("ISO 3166-1 alpha-2 country codes where the model's training data was collected."), "ai_act_risk_class": import_zod.z.enum(["minimal", "limited", "high_risk"]).describe("EU AI Act risk classification self-declared by the provider. Prohibited-risk modeled signals must not be published as AdCP signal definitions."), "disclosure": import_zod.z.object({ "required": import_zod.z.boolean().describe("The provider's claim that a modeling or AI-use disclosure is required for this signal in at least one applicable jurisdiction. This is a declared compliance signal, not a protocol-level legal determination."), "jurisdictions": import_zod.z.array(import_zod.z.object({ "country": import_zod.z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "region": import_zod.z.string().describe("Provider-defined sub-national region code or name when the obligation is regional. No global canonical format is implied.").optional(), "regulation": import_zod.z.string().describe("Provider-supplied regulation identifier for the disclosure obligation."), "disclosure_text": import_zod.z.string().describe("Human-readable disclosure text or summary the provider expects buyers or reviewers to see.").optional(), "disclosure_url": import_zod.z.string().url().describe("Optional URL to the provider's canonical disclosure or methodology page for this jurisdiction.").optional(), "audience": import_zod.z.enum(["buyer", "data_subject", "regulator", "public"]).describe("Primary audience for this disclosure entry.").optional() }).strict()).describe("Jurisdictions where a modeling or AI-use disclosure applies.").optional(), "notes": import_zod.z.string().max(2e3).describe("Optional provider notes on how the disclosure should be interpreted. Informational only; buyers should not branch programmatically on this text.").optional() }).strict().and(import_zod.z.any()).describe("Signal/modeling-specific disclosure requirements and jurisdictional notes. This is not creative provenance render guidance.").optional() }).strict().describe("Modeling disclosure for modeled data signals. Required when methodology is 'modeled' or audience_expansion is true. This describes data modeling and intentionally does not reuse creative provenance, which is content/render oriented.").optional(), "data_subject_rights": import_zod.z.object({ "upstream_source_domain": import_zod.z.string().max(253).describe("Domain of the upstream data source whose rights process these channels reach, when different from the publishing domain.").optional(), "channels": import_zod.z.array(import_zod.z.object({ "rights": import_zod.z.array(import_zod.z.enum(["access", "rectification", "erasure", "portability", "objection"])).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Rights supported by this channel."), "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL for submitting the rights request.").optional(), "email": import_zod.z.string().email().describe("Email address for submitting the rights request.").optional(), "languages": import_zod.z.array(import_zod.z.string()).describe("BCP 47 language tags supported by this channel.").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).describe("ISO 3166-1 alpha-2 countries this channel serves, when the provider routes rights by country.").optional() }).strict().and(import_zod.z.union([import_zod.z.any(), import_zod.z.any()]))).describe("Rights request channels and the rights each channel supports. At least one declared channel MUST support one or more of access, erasure, or objection; schema validators enforce this with draft-07 contains, and consumers whose SDK drops contains need an equivalent runtime check."), "response_sla_days": import_zod.z.number().int().gte(1).lte(90).describe("Maximum response time in days for rights requests handled through the declared rights channels. For provider-published signals, providers SHOULD avoid duplicating this field across every signal unless the value varies by signal or upstream source; consumers MAY also consult the provider's public privacy policy or registry disclosures when present.").optional(), "ccpa_opt_out_url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("US-specific 'Do Not Sell or Share' opt-out URL where required.").optional() }).strict().describe("Per-signal data-subject-rights routing. Inline on the signal because upstream source, rights routing, and response commitments can differ by segment or may be unavailable from a public provider document for custom/private signals. This is a contact/routing reference, not a machine-callable AdCP API.").optional(), "last_updated": import_zod.z.string().datetime().describe("When this definition record was last updated. This indicates freshness of the definition record, not an attestation that the underlying data or model was refreshed at that time.").optional(), "dts_compliant_version": import_zod.z.string().describe("IAB Data Transparency Standard version this signal definition self-attests as satisfying, when applicable.").optional() }).catchall(import_zod.z.any()).and(import_zod.z.intersection(import_zod.z.intersection(import_zod.z.any(), import_zod.z.intersection(import_zod.z.any(), import_zod.z.any())), import_zod.z.intersection(import_zod.z.any(), import_zod.z.intersection(import_zod.z.any(), import_zod.z.any())))).describe("Definition of a signal in published adagents.json signals[]. The publishing domain supplies the namespace, so this definition carries a local id rather than a signal_ref. Media-buy products reference this definition with signal_ref scope 'data_provider', data_provider_domain set to the publishing domain, and signal_id set to this id. Some constraints use JSON Schema draft-07 conditional keywords such as if/then and contains; SDK generators that drop those keywords need equivalent runtime guards.")).describe("Signal definitions published by this domain. Each entry defines a signal id within this file's publishing-domain namespace; entries do not include signal_ref objects. Signals Protocol discovery and media-buy product targeting reference these through signal_ref scope 'data_provider', with data_provider_domain set to this file's publishing domain and signal_id set to signals[].id.").optional(), "signal_tags": import_zod.z.record(import_zod.z.string(), import_zod.z.object({ "name": import_zod.z.string().describe("Human-readable name for this tag"), "description": import_zod.z.string().describe("Description of what this tag represents") }).catchall(import_zod.z.any())).describe("Metadata for each tag referenced by signals. Provides human-readable context for signal tag values.").optional() }).catchall(import_zod.z.any()).and(import_zod.z.intersection(import_zod.z.union([import_zod.z.any(), import_zod.z.any(), import_zod.z.any(), import_zod.z.any(), import_zod.z.any(), import_zod.z.any()]), import_zod.z.any())).describe("Inline structure variant - contains full agent authorization data")]).describe("Declaration of authorized agents for advertising inventory and data signals. Hosted at /.well-known/adagents.json on publisher domains (for properties) or data provider domains (for signals). Can either contain the full structure inline or reference an authoritative URL.");
167
+ }))), import_zod.z.intersection(import_zod.z.any().refine((value) => !import_zod.z.intersection(import_zod.z.any(), import_zod.z.any()).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), import_zod.z.intersection(import_zod.z.any().refine((value) => !import_zod.z.any().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), import_zod.z.any())))).describe("Inline format declaration on a product. The `format_kind` discriminator names which canonical format the product narrows; `params` carries only the canonical creative-shape parameters (slots, dimensions, durations, codecs, character limits, platform_extensions, etc.). Processing metadata such as `macro_resolution_capabilities` belongs at this declaration's top level rather than inside `params`. Optional `format_option_id` (stable identifier for routing when a product's `format_options` contains multiple declarations sharing the same `format_kind`), optional `publisher_domain` (namespace for the format option when it comes from a publisher adagents.json catalog), `display_name` (seller-controlled human-readable label for dashboard and catalog UIs), and `applies_to_channels` (subset of the product's declared channels this declaration applies to \u2014 lets a multi-channel product carry distinct format_options per channel). Discriminated-union shape generates clean tagged unions in TypeScript and Pydantic codegen. Replaces v1's named-format pattern (where products referenced a separately-defined format file via compound `format_id`). Canonical product-bound declarations are the AdCP 3.2 authoring path; v1 named formats remain only as deprecated 3.x compatibility projections.\n\n**Closed-set semantics (normative).** `format_options[]` is the closed set of accepted formats for this product. Sellers MUST reject `create_media_buy` requests targeting any `format_kind` (or format option reference) not present in this list \u2014 typically with `UNSUPPORTED_FEATURE` or a seller-specific code; the rejection is structural, not negotiable. `seller_preference` modulates *within* the accepted set (a soft ranking hint between equally-acceptable options), it is NOT an enforcement axis. A product wanting to say 'this format is the only one that works' lists exactly that one entry in `format_options[]`; everything else falls outside the set and is rejected by the closed-set rule.\n\n**Format matching vs satisfaction (normative).** Legacy named formats MUST be normalized to canonical declarations before comparison; do not exact-match raw `(agent_url, id)` pairs once a `format_id` has been projected through `canonical`, `v1_format_ref`, or the canonical mapping registry. Equivalence matching can treat a legacy fixed-size display ID and `format_kind: \"image\"` with matching `width`/`height` as the same underlying shape. Product satisfaction is stricter and directional: when this declaration specifies fixed constraints such as `width`, `height`, `duration_ms_exact`, or `duration_ms_range`, a buyer request or creative manifest MUST declare and satisfy those constraints. A broad request with no dimensions or duration does not satisfy a fixed-size or fixed-duration product; a broad product MAY accept a more specific creative unless another product constraint excludes it. Duration precedence is `duration_ms_exact` > `duration_ms_range`. Range constraints use containment: a range-based request satisfies this declaration only when every value it permits falls within this declaration's accepted range; overlap alone is insufficient. An exact value satisfies a range when the exact value falls inside the accepted interval. For hosted audio/video, a null range endpoint is unbounded: [null, 60000] means up to 60s, and [15000, null] means at least 15s; [null, null] is invalid because at least one endpoint must be bounded.\n\n**Custom format_kind** (`format_kind: \"custom\"`): for adopter-defined shapes that don't fit the 15 canonicals (branded content, cross-screen sponsorship, sponsorship lockup, newsletter sponsorship, AR lens, playable, live event sponsorship). When `format_kind` is `custom`, the declaration MUST carry `format_shape` (recognized global pattern from the [format-shape vocabulary registry](/schemas/core/format-shape-vocabulary.json)) AND `format_schema` (URI+digest reference to a fetchable schema describing the actual `params` and `slots`). Buyer agents fetch the schema, validate manifests structurally, and reason about manifests without per-seller integration code. See [adcp#3666](https://github.com/adcontextprotocol/adcp/issues/3666) for the canonical promotion queue."), import_zod.z.object({ "applies_to_property_ids": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Identifier for a publisher property. Must be lowercase alphanumeric with underscores only.")).describe('Optional property IDs from this file\'s `properties[]` that this format declaration applies to. When omitted, the declaration applies to all properties in the file. Mutually compatible with `applies_to_property_tags` (union is the effective scope). Example: Meta declares Reels with `applies_to_property_ids: ["instagram", "facebook"]` because WhatsApp doesn\'t carry Reels inventory.').optional(), "applies_to_property_tags": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Tag for categorizing publisher properties. Must be lowercase alphanumeric with underscores only.")).describe('Optional property tags from this file\'s `tags` map that this format declaration applies to. When omitted, the declaration applies to all properties in the file. Useful for network-wide formats (e.g., a managed network declaring `applies_to_property_tags: ["premium_video"]`). Compatible with `applies_to_property_ids` \u2014 a property is in scope if it matches either ID list or tag list.').optional(), "reference_renderer": import_zod.z.object({ "runtime": import_zod.z.literal("browser-esm").describe("Execution contract for the referenced package. browser-esm means a browser-safe ECMAScript module that accepts canonical manifest data and returns an inert presentation without Node.js APIs, ambient credentials, delivery tracking, or undeclared network access. Non-JavaScript clients use a hosted preview_creative provider or display the manifest."), "package": import_zod.z.string().regex(new RegExp("^(?:@[a-z0-9][a-z0-9._~-]*/)?[a-z0-9][a-z0-9._~-]*$")).describe("npm package name, scoped or unscoped. The package is resolved from the npm registry; the AdCP registry does not proxy its executable contents."), "version": import_zod.z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$")).describe("Exact semantic version. Ranges and tags such as latest are forbidden so the registry entry is reproducible. Package semantic versioning identifies the pinned distribution artifact; it is independent of any one format revision because one package may expose renderers for multiple formats."), "export": import_zod.z.string().min(1).describe("Named package export that implements the renderer contract for this enclosing format entry. Compatibility is bound at the export-to-entry edge, not to matching version labels: registry review and contract fixtures verify that the export implements the entry's input contract. When that input contract changes, the registry MUST rerun those fixtures and MAY retain the existing export and package pin when they still pass. One package version MAY expose different named exports for different formats or input contracts."), "format_revision": import_zod.z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)$")).describe("Deprecated compatibility annotation retained for previously published registry entries. Renderer package versions and community format revisions have independent lifecycles, so consumers MUST NOT require this value to equal the enclosing entry's format_revision or use matching values as evidence of compatibility. Registry review and contract fixtures bind the named export to the enclosing format's input contract. New entries SHOULD omit this field.").optional(), "integrity": import_zod.z.string().regex(new RegExp("^(?:sha256-[A-Za-z0-9+/]{43}=|sha384-[A-Za-z0-9+/]{64}|sha512-[A-Za-z0-9+/]{86}==)$")).describe("Subresource Integrity value for the exact npm package tarball. Consumers MUST compare this value before loading code, require the provenance subject digest to match the same tarball, and fail closed on mismatch."), "provenance": import_zod.z.object({ "source_repository": import_zod.z.string().url().regex(new RegExp("^https://github\\.com/")).describe("Allowlisted source repository that the npm provenance attestation MUST identify."), "workflow_path": import_zod.z.string().regex(new RegExp("^\\.github/workflows/[A-Za-z0-9._/-]+\\.ya?ml$")).describe("Repository-relative GitHub Actions workflow path that npm provenance buildDefinition.externalParameters.workflow.path MUST identify.") }).strict() }).strict().describe("Optional only for an AgenticAdvertising.org community-registry format entry fetched from the configured registry origin. Points to a pinned browser-ESM OSS renderer package export that provides a non-authoritative reference presentation. Registry review and contract fixtures bind the named export to the enclosing format's input contract (its canonical format kind, manifest shape, constraints, and declared macros); renderer package versions and format revisions have independent lifecycles. Display metadata and property scope do not affect that compatibility binding. Non-JavaScript clients use hosted preview_creative or display the manifest. Publisher-origin catalogs and seller product declarations do not use this field: publishers describe placement-specific chrome with placements[].presentation_ref and grant route-specific preview authority with placements[].preview_provider.").optional(), "format_revision": import_zod.z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)$")).describe("Registry-managed revision of this community format entry's input contract. Required when reference_renderer is present, but independent of any reference-renderer package version or legacy reference_renderer.format_revision annotation. A contract update may retain an existing renderer pin when that export still passes the updated declaration's contract fixtures.").optional() }).and(import_zod.z.any()))).describe("Publisher-authoritative format catalog. Declares the 3.1+ canonical format-option shapes the publisher supports across its properties \u2014 the single place a publisher (or its community-registry stand-in) asserts \"these are the formats my inventory accepts.\" Products selling this publisher's inventory SHOULD reference these declarations by `format_option_id` on the placement or via inline `format_options` whose `format_option_id` matches an entry here, eliminating the N-copies-of-Meta-Reels-on-N-products drift surface.\n\nEach item is a `ProductFormatDeclaration` (same 3.1+ canonical format-option shape used on Products) plus optional `applies_to_property_ids` / `applies_to_property_tags` for property scoping within the file. A `formats[]` entry without scope applies to all properties in the file; with scope, only to the named subset (e.g., Reels applies to Instagram + Facebook but not WhatsApp).\n\n**Community registry pattern (normative for unadopted platforms).** When a platform hasn't adopted AdCP (Meta, TikTok, Snap, Pinterest, etc.), AAO publishes a community-maintained adagents.json at `https://creative.adcontextprotocol.org/translated/<platform>/adagents.json` carrying that platform's `formats[]`. Buyer SDKs fetch the platform's own `<domain>/.well-known/adagents.json` first; on 404 or absence-of-formats[], they fall back to the AAO mirror. When the platform adopts AdCP and publishes their own adagents.json with `formats[]`, the platform-hosted file takes precedence and the mirror entry becomes redundant (AAO maintainers deprecate it).\n\nThe `v1_format_ref.agent_url` on each declaration SHOULD match the agent_url of the file's hosting location \u2014 platform-hosted formats point at the platform's agent, community-mirror formats point at `https://creative.adcontextprotocol.org/translated/<platform>`. This keeps the legacy named-format namespace converged regardless of which side hosts the catalog. See `docs/creative/canonical-formats.mdx` Meta Reels worked example.").optional(), "superseded_by": import_zod.z.string().url().regex(new RegExp("^https://")).describe("Optional pointer indicating this adagents.json file has been superseded by another adagents.json at a different URL. Used by the AAO community-mirror lifecycle: when a platform (e.g., Meta) adopts AdCP and publishes its own adagents.json at `<platform-domain>/.well-known/adagents.json`, the AAO mirror file at `creative.adcontextprotocol.org/translated/<platform>/adagents.json` sets `superseded_by` to the platform-hosted URL. Buyer SDKs encountering a file with `superseded_by` SHOULD short-circuit and re-fetch from the named URL rather than serving stale content from the mirror. The mirror SHOULD continue serving with `superseded_by` set for \u22651 minor release after platform adoption so buyer caches keyed on the mirror URL get an explicit migration signal rather than a silent break.").optional(), "tags": import_zod.z.record(import_zod.z.string(), import_zod.z.object({ "name": import_zod.z.string().describe("Human-readable name for this tag"), "description": import_zod.z.string().describe("Description of what this tag represents") }).catchall(import_zod.z.any())).describe("Metadata for each tag referenced by properties. Provides human-readable context for property tag values.").optional(), "placement_tags": import_zod.z.record(import_zod.z.string(), import_zod.z.object({ "name": import_zod.z.string().describe("Human-readable name for this placement tag"), "description": import_zod.z.string().describe("Description of what this placement tag represents") }).catchall(import_zod.z.any())).describe("Metadata for each tag referenced by placements. Provides human-readable context for publisher-defined placement tag values used in grouping and authorization.").optional(), "authorized_agents": import_zod.z.array(import_zod.z.union([import_zod.z.object({ "authorization_type": import_zod.z.literal("property_ids").describe("Discriminator indicating authorization by specific property IDs"), "property_ids": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Identifier for a publisher property. Must be lowercase alphanumeric with underscores only.")).describe("Property IDs this agent is authorized for. Resolved against the top-level properties array in this file"), "collections": import_zod.z.array(import_zod.z.object({ "publisher_domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring these collections is hosted (e.g., 'mrbeast.com'). The collections array in that file contains the authoritative collection definitions."), "collection_ids": import_zod.z.array(import_zod.z.string()).describe("Collection IDs from the adagents.json collections array. Each ID must match a collection_id declared in that file. Omit to reference all collections declared in that file.").optional() }).catchall(import_zod.z.any()).describe("References collections declared in an adagents.json. Buyers resolve full collection objects by fetching the adagents.json at the given domain and matching collection_ids against its collections array. When collection_ids is omitted, the selector references every collection declared in that adagents.json \u2014 the bulk-grant form for authorization scoping (e.g., a host authorizing a channel owner's sales agent for all of the owner's collections without tracking owner-assigned IDs).")).describe("Optional collection constraints. When present, authorization only applies to inventory associated with these collections. A selector without collection_ids grants for all collections declared in that selector's publisher_domain adagents.json (the bulk-grant form for owner-sold carriage).").optional(), "placement_ids": import_zod.z.array(import_zod.z.string()).describe("Optional placement constraints. When present, authorization only applies to these placement IDs from the top-level placements array in this file.").optional(), "placement_tags": import_zod.z.array(import_zod.z.string()).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Optional placement tag constraints. When present, authorization only applies to placements whose tags include any of these publisher-defined values.").optional(), "delegation_type": import_zod.z.enum(["direct", "delegated", "ad_network"]).describe("Commercial relationship for this inventory path. 'direct' means the publisher treats this as a direct way to buy from them, even if a third party operates the software. 'delegated' means the agent is authorized to sell on the publisher's behalf. 'ad_network' means the inventory is sold as part of a network/package context rather than as the publisher's direct endpoint.").optional(), "exclusive": import_zod.z.boolean().describe("Whether this agent is the publisher's sole authorized path for the scoped inventory slice. When false or absent, other authorized agents may also sell the same inventory.").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Optional ISO 3166-1 alpha-2 country codes limiting where this authorization applies. Omit for worldwide authorization.").optional(), "effective_from": import_zod.z.string().datetime().describe("Optional start time for this authorization window.").optional(), "effective_until": import_zod.z.string().datetime().describe("Optional end time for this authorization window.").optional() }).catchall(import_zod.z.any()).and(import_zod.z.object({ "url": import_zod.z.string().url().describe("The authorized agent's protocol endpoint URL: the exact agent URL buyers are given and send AdCP requests to, including the path (e.g., `https://agent.example.com/mcp`). A bare origin matches only an agent served at the root. An agent reachable at more than one agent URL (for example, separate MCP and A2A endpoints) needs one entry per URL. Callers comparing this URL against a registry (sales-agent list, signal-provider registry, TMP provider lookup, etc.) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality \u2014 two URLs that differ only in case, default port, or percent-encoding of unreserved characters are the same agent. See docs/reference/url-canonicalization."), "authorized_for": import_zod.z.string().min(1).max(500).describe("Human-readable description of what this agent is authorized to do \u2014 what it sells (for sales/property agents) or what data it provides (for signal agents). The variant the entry uses (`property_ids`, `signal_tags`, etc.) tells consumers which inflection applies; this field carries the operator-supplied label."), "signing_keys": import_zod.z.array(import_zod.z.object({ "kid": import_zod.z.string().describe("Key identifier for selecting the correct signing key."), "kty": import_zod.z.string().describe("JWK key type, such as 'OKP', 'EC', or 'RSA'."), "alg": import_zod.z.string().describe("Expected signing algorithm for this key, such as 'EdDSA' or 'RS256'.").optional(), "use": import_zod.z.string().describe("Optional JWK use value. Typically 'sig' for signing keys.").optional(), "crv": import_zod.z.string().describe("Curve name for OKP or EC keys, such as 'Ed25519' or 'P-256'.").optional(), "x": import_zod.z.string().describe("Base64url-encoded public key x coordinate or public key value for OKP keys.").optional(), "y": import_zod.z.string().describe("Base64url-encoded public key y coordinate for EC keys.").optional(), "n": import_zod.z.string().describe("Base64url-encoded RSA modulus.").optional(), "e": import_zod.z.string().describe("Base64url-encoded RSA public exponent.").optional(), "revoked_at": import_zod.z.string().datetime().describe("Optional revocation timestamp. When present, verifiers MUST reject any signature produced with this key whose signing epoch (or equivalent time reference) is at or after this timestamp. The key may continue to appear in the trust anchor during a grace period so caches that have not yet refreshed still find the key and can evaluate the revocation marker. Keys past their revocation can be removed once the cache TTL (recommended: 5 minutes) has elapsed across all verifiers.").optional() }).catchall(import_zod.z.any()).describe("Publisher-attested public key material for an authorized agent. Buyers use these keys to verify signed agent responses against the trust anchor published in adagents.json rather than trusting key discovery from the agent domain alone.")).describe("Optional publisher-attested public signing keys for this agent. Use these as the trust anchor for verifying signed agent responses instead of relying on key discovery from the agent domain alone.").optional(), "encryption_keys": import_zod.z.array(import_zod.z.object({ "kid": import_zod.z.string().max(8).describe("Key identifier. Opaque \u2014 MUST NOT encode geographic or deployment information."), "kty": import_zod.z.literal("OKP").describe("JWK key type. Must be OKP for X25519."), "crv": import_zod.z.literal("X25519").describe("Curve name. Must be X25519 for TMPX encryption."), "use": import_zod.z.literal("enc").describe("JWK use value. Must be enc for encryption keys."), "x": import_zod.z.string().describe("Base64url-encoded X25519 public key (32 bytes).") }).strict().describe("X25519 public key for HPKE encryption. Used for TMPX exposure token encryption with HPKE mode_base.")).describe("X25519 public keys for TMPX exposure token encryption. Each key identifies a cluster master that can decrypt TMPX tokens. Used with HPKE mode_base \u2014 read replicas encrypt with this public key, only the master can decrypt.").optional(), "last_updated": import_zod.z.string().datetime().describe("Optional ISO 8601 timestamp indicating when this `authorized_agents[]` entry last changed. Independent of the file-level `last_updated`. Lets validators perform a partial walk by skipping entries whose `last_updated` is older than their indexed value. Advisory \u2014 consumers MAY ignore and re-index the full file.").optional() }).describe("Fields shared by every variant of `authorized_agents[*]` in adagents.json, regardless of authorization_type. Variants `allOf` this base and add their discriminator-specific fields. Centralized to prevent drift across all authorization-type variants.")), import_zod.z.object({ "authorization_type": import_zod.z.literal("property_tags").describe("Discriminator indicating authorization by property tags"), "property_tags": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Tag for categorizing publisher properties. Must be lowercase alphanumeric with underscores only.")).describe("Tags identifying which properties this agent is authorized for. Resolved against the top-level properties array in this file using tag matching"), "collections": import_zod.z.array(import_zod.z.object({ "publisher_domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring these collections is hosted (e.g., 'mrbeast.com'). The collections array in that file contains the authoritative collection definitions."), "collection_ids": import_zod.z.array(import_zod.z.string()).describe("Collection IDs from the adagents.json collections array. Each ID must match a collection_id declared in that file. Omit to reference all collections declared in that file.").optional() }).catchall(import_zod.z.any()).describe("References collections declared in an adagents.json. Buyers resolve full collection objects by fetching the adagents.json at the given domain and matching collection_ids against its collections array. When collection_ids is omitted, the selector references every collection declared in that adagents.json \u2014 the bulk-grant form for authorization scoping (e.g., a host authorizing a channel owner's sales agent for all of the owner's collections without tracking owner-assigned IDs).")).describe("Optional collection constraints. When present, authorization only applies to inventory associated with these collections. A selector without collection_ids grants for all collections declared in that selector's publisher_domain adagents.json (the bulk-grant form for owner-sold carriage).").optional(), "placement_ids": import_zod.z.array(import_zod.z.string()).describe("Optional placement constraints. When present, authorization only applies to these placement IDs from the top-level placements array in this file.").optional(), "placement_tags": import_zod.z.array(import_zod.z.string()).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Optional placement tag constraints. When present, authorization only applies to placements whose tags include any of these publisher-defined values.").optional(), "delegation_type": import_zod.z.enum(["direct", "delegated", "ad_network"]).describe("Commercial relationship for this inventory path. 'direct' means the publisher treats this as a direct way to buy from them, even if a third party operates the software. 'delegated' means the agent is authorized to sell on the publisher's behalf. 'ad_network' means the inventory is sold as part of a network/package context rather than as the publisher's direct endpoint.").optional(), "exclusive": import_zod.z.boolean().describe("Whether this agent is the publisher's sole authorized path for the scoped inventory slice. When false or absent, other authorized agents may also sell the same inventory.").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Optional ISO 3166-1 alpha-2 country codes limiting where this authorization applies. Omit for worldwide authorization.").optional(), "effective_from": import_zod.z.string().datetime().describe("Optional start time for this authorization window.").optional(), "effective_until": import_zod.z.string().datetime().describe("Optional end time for this authorization window.").optional() }).catchall(import_zod.z.any()).and(import_zod.z.object({ "url": import_zod.z.string().url().describe("The authorized agent's protocol endpoint URL: the exact agent URL buyers are given and send AdCP requests to, including the path (e.g., `https://agent.example.com/mcp`). A bare origin matches only an agent served at the root. An agent reachable at more than one agent URL (for example, separate MCP and A2A endpoints) needs one entry per URL. Callers comparing this URL against a registry (sales-agent list, signal-provider registry, TMP provider lookup, etc.) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality \u2014 two URLs that differ only in case, default port, or percent-encoding of unreserved characters are the same agent. See docs/reference/url-canonicalization."), "authorized_for": import_zod.z.string().min(1).max(500).describe("Human-readable description of what this agent is authorized to do \u2014 what it sells (for sales/property agents) or what data it provides (for signal agents). The variant the entry uses (`property_ids`, `signal_tags`, etc.) tells consumers which inflection applies; this field carries the operator-supplied label."), "signing_keys": import_zod.z.array(import_zod.z.object({ "kid": import_zod.z.string().describe("Key identifier for selecting the correct signing key."), "kty": import_zod.z.string().describe("JWK key type, such as 'OKP', 'EC', or 'RSA'."), "alg": import_zod.z.string().describe("Expected signing algorithm for this key, such as 'EdDSA' or 'RS256'.").optional(), "use": import_zod.z.string().describe("Optional JWK use value. Typically 'sig' for signing keys.").optional(), "crv": import_zod.z.string().describe("Curve name for OKP or EC keys, such as 'Ed25519' or 'P-256'.").optional(), "x": import_zod.z.string().describe("Base64url-encoded public key x coordinate or public key value for OKP keys.").optional(), "y": import_zod.z.string().describe("Base64url-encoded public key y coordinate for EC keys.").optional(), "n": import_zod.z.string().describe("Base64url-encoded RSA modulus.").optional(), "e": import_zod.z.string().describe("Base64url-encoded RSA public exponent.").optional(), "revoked_at": import_zod.z.string().datetime().describe("Optional revocation timestamp. When present, verifiers MUST reject any signature produced with this key whose signing epoch (or equivalent time reference) is at or after this timestamp. The key may continue to appear in the trust anchor during a grace period so caches that have not yet refreshed still find the key and can evaluate the revocation marker. Keys past their revocation can be removed once the cache TTL (recommended: 5 minutes) has elapsed across all verifiers.").optional() }).catchall(import_zod.z.any()).describe("Publisher-attested public key material for an authorized agent. Buyers use these keys to verify signed agent responses against the trust anchor published in adagents.json rather than trusting key discovery from the agent domain alone.")).describe("Optional publisher-attested public signing keys for this agent. Use these as the trust anchor for verifying signed agent responses instead of relying on key discovery from the agent domain alone.").optional(), "encryption_keys": import_zod.z.array(import_zod.z.object({ "kid": import_zod.z.string().max(8).describe("Key identifier. Opaque \u2014 MUST NOT encode geographic or deployment information."), "kty": import_zod.z.literal("OKP").describe("JWK key type. Must be OKP for X25519."), "crv": import_zod.z.literal("X25519").describe("Curve name. Must be X25519 for TMPX encryption."), "use": import_zod.z.literal("enc").describe("JWK use value. Must be enc for encryption keys."), "x": import_zod.z.string().describe("Base64url-encoded X25519 public key (32 bytes).") }).strict().describe("X25519 public key for HPKE encryption. Used for TMPX exposure token encryption with HPKE mode_base.")).describe("X25519 public keys for TMPX exposure token encryption. Each key identifies a cluster master that can decrypt TMPX tokens. Used with HPKE mode_base \u2014 read replicas encrypt with this public key, only the master can decrypt.").optional(), "last_updated": import_zod.z.string().datetime().describe("Optional ISO 8601 timestamp indicating when this `authorized_agents[]` entry last changed. Independent of the file-level `last_updated`. Lets validators perform a partial walk by skipping entries whose `last_updated` is older than their indexed value. Advisory \u2014 consumers MAY ignore and re-index the full file.").optional() }).describe("Fields shared by every variant of `authorized_agents[*]` in adagents.json, regardless of authorization_type. Variants `allOf` this base and add their discriminator-specific fields. Centralized to prevent drift across all authorization-type variants.")), import_zod.z.object({ "authorization_type": import_zod.z.literal("inline_properties").describe("Discriminator indicating authorization by inline property definitions. Companion field is `properties` (not `inline_properties`) \u2014 the only authorization_type whose companion field name does not mirror the discriminator value."), "properties": import_zod.z.array(import_zod.z.object({ "property_id": import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Unique identifier for this property (optional). Enables referencing properties by ID instead of repeating full objects.").optional(), "property_type": import_zod.z.enum(["website", "mobile_app", "ctv_app", "desktop_app", "dooh", "podcast", "radio", "linear_tv", "streaming_audio", "ai_assistant"]).describe("Type of advertising property"), "name": import_zod.z.string().describe("Human-readable property name"), "identifiers": import_zod.z.array(import_zod.z.object({ "type": import_zod.z.enum(["domain", "subdomain", "network_id", "ios_bundle", "android_package", "apple_app_store_id", "google_play_id", "roku_store_id", "fire_tv_asin", "samsung_app_id", "apple_tv_bundle", "bundle_id", "venue_id", "screen_id", "openooh_venue_type", "rss_url", "apple_podcast_id", "spotify_collection_id", "podcast_guid", "station_id", "facility_id"]).describe("Type of identifier for this property"), "value": import_zod.z.string().describe("The identifier value. For domain type: 'example.com' matches base domain plus www and m subdomains; 'edition.example.com' matches that specific subdomain; '*.example.com' matches ALL subdomains but NOT base domain") }).catchall(import_zod.z.any())).describe("Array of identifiers for this property"), "tags": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Tag for categorizing publisher properties. Must be lowercase alphanumeric with underscores only.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Tags for categorization and grouping (e.g., network membership, content categories)").optional(), "supported_channels": import_zod.z.array(import_zod.z.enum(["display", "olv", "social", "search", "ctv", "linear_tv", "radio", "streaming_audio", "podcast", "dooh", "ooh", "print", "cinema", "email", "gaming", "retail_media", "influencer", "affiliate", "product_placement", "sponsored_intelligence"]).describe("Standardized advertising media channels describing how buyers allocate budget. Channels are planning abstractions, not technical substrates. See the Media Channel Taxonomy specification for detailed definitions.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Advertising channels this property supports (e.g., ['display', 'olv', 'social']). Publishers declare which channels their inventory aligns with. Properties may support multiple channels. See the Media Channel Taxonomy for definitions.").optional(), "publisher_domain": import_zod.z.string().describe("Domain where adagents.json should be checked for authorization validation. Optional in adagents.json (file location implies domain).").optional() }).catchall(import_zod.z.any()).describe("An advertising property that can be validated via adagents.json")).describe('Specific properties this agent is authorized for, defined inline on the agent entry (alternative to property_ids/property_tags). Note: this is the companion field for `authorization_type: "inline_properties"` \u2014 the field is named `properties`, not `inline_properties`.'), "collections": import_zod.z.array(import_zod.z.object({ "publisher_domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring these collections is hosted (e.g., 'mrbeast.com'). The collections array in that file contains the authoritative collection definitions."), "collection_ids": import_zod.z.array(import_zod.z.string()).describe("Collection IDs from the adagents.json collections array. Each ID must match a collection_id declared in that file. Omit to reference all collections declared in that file.").optional() }).catchall(import_zod.z.any()).describe("References collections declared in an adagents.json. Buyers resolve full collection objects by fetching the adagents.json at the given domain and matching collection_ids against its collections array. When collection_ids is omitted, the selector references every collection declared in that adagents.json \u2014 the bulk-grant form for authorization scoping (e.g., a host authorizing a channel owner's sales agent for all of the owner's collections without tracking owner-assigned IDs).")).describe("Optional collection constraints. When present, authorization only applies to inventory associated with these collections. A selector without collection_ids grants for all collections declared in that selector's publisher_domain adagents.json (the bulk-grant form for owner-sold carriage).").optional(), "placement_ids": import_zod.z.array(import_zod.z.string()).describe("Optional placement constraints. When present, authorization only applies to these placement IDs from the top-level placements array in this file.").optional(), "placement_tags": import_zod.z.array(import_zod.z.string()).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Optional placement tag constraints. When present, authorization only applies to placements whose tags include any of these publisher-defined values.").optional(), "delegation_type": import_zod.z.enum(["direct", "delegated", "ad_network"]).describe("Commercial relationship for this inventory path. 'direct' means the publisher treats this as a direct way to buy from them, even if a third party operates the software. 'delegated' means the agent is authorized to sell on the publisher's behalf. 'ad_network' means the inventory is sold as part of a network/package context rather than as the publisher's direct endpoint.").optional(), "exclusive": import_zod.z.boolean().describe("Whether this agent is the publisher's sole authorized path for the scoped inventory slice. When false or absent, other authorized agents may also sell the same inventory.").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Optional ISO 3166-1 alpha-2 country codes limiting where this authorization applies. Omit for worldwide authorization.").optional(), "effective_from": import_zod.z.string().datetime().describe("Optional start time for this authorization window.").optional(), "effective_until": import_zod.z.string().datetime().describe("Optional end time for this authorization window.").optional() }).catchall(import_zod.z.any()).and(import_zod.z.object({ "url": import_zod.z.string().url().describe("The authorized agent's protocol endpoint URL: the exact agent URL buyers are given and send AdCP requests to, including the path (e.g., `https://agent.example.com/mcp`). A bare origin matches only an agent served at the root. An agent reachable at more than one agent URL (for example, separate MCP and A2A endpoints) needs one entry per URL. Callers comparing this URL against a registry (sales-agent list, signal-provider registry, TMP provider lookup, etc.) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality \u2014 two URLs that differ only in case, default port, or percent-encoding of unreserved characters are the same agent. See docs/reference/url-canonicalization."), "authorized_for": import_zod.z.string().min(1).max(500).describe("Human-readable description of what this agent is authorized to do \u2014 what it sells (for sales/property agents) or what data it provides (for signal agents). The variant the entry uses (`property_ids`, `signal_tags`, etc.) tells consumers which inflection applies; this field carries the operator-supplied label."), "signing_keys": import_zod.z.array(import_zod.z.object({ "kid": import_zod.z.string().describe("Key identifier for selecting the correct signing key."), "kty": import_zod.z.string().describe("JWK key type, such as 'OKP', 'EC', or 'RSA'."), "alg": import_zod.z.string().describe("Expected signing algorithm for this key, such as 'EdDSA' or 'RS256'.").optional(), "use": import_zod.z.string().describe("Optional JWK use value. Typically 'sig' for signing keys.").optional(), "crv": import_zod.z.string().describe("Curve name for OKP or EC keys, such as 'Ed25519' or 'P-256'.").optional(), "x": import_zod.z.string().describe("Base64url-encoded public key x coordinate or public key value for OKP keys.").optional(), "y": import_zod.z.string().describe("Base64url-encoded public key y coordinate for EC keys.").optional(), "n": import_zod.z.string().describe("Base64url-encoded RSA modulus.").optional(), "e": import_zod.z.string().describe("Base64url-encoded RSA public exponent.").optional(), "revoked_at": import_zod.z.string().datetime().describe("Optional revocation timestamp. When present, verifiers MUST reject any signature produced with this key whose signing epoch (or equivalent time reference) is at or after this timestamp. The key may continue to appear in the trust anchor during a grace period so caches that have not yet refreshed still find the key and can evaluate the revocation marker. Keys past their revocation can be removed once the cache TTL (recommended: 5 minutes) has elapsed across all verifiers.").optional() }).catchall(import_zod.z.any()).describe("Publisher-attested public key material for an authorized agent. Buyers use these keys to verify signed agent responses against the trust anchor published in adagents.json rather than trusting key discovery from the agent domain alone.")).describe("Optional publisher-attested public signing keys for this agent. Use these as the trust anchor for verifying signed agent responses instead of relying on key discovery from the agent domain alone.").optional(), "encryption_keys": import_zod.z.array(import_zod.z.object({ "kid": import_zod.z.string().max(8).describe("Key identifier. Opaque \u2014 MUST NOT encode geographic or deployment information."), "kty": import_zod.z.literal("OKP").describe("JWK key type. Must be OKP for X25519."), "crv": import_zod.z.literal("X25519").describe("Curve name. Must be X25519 for TMPX encryption."), "use": import_zod.z.literal("enc").describe("JWK use value. Must be enc for encryption keys."), "x": import_zod.z.string().describe("Base64url-encoded X25519 public key (32 bytes).") }).strict().describe("X25519 public key for HPKE encryption. Used for TMPX exposure token encryption with HPKE mode_base.")).describe("X25519 public keys for TMPX exposure token encryption. Each key identifies a cluster master that can decrypt TMPX tokens. Used with HPKE mode_base \u2014 read replicas encrypt with this public key, only the master can decrypt.").optional(), "last_updated": import_zod.z.string().datetime().describe("Optional ISO 8601 timestamp indicating when this `authorized_agents[]` entry last changed. Independent of the file-level `last_updated`. Lets validators perform a partial walk by skipping entries whose `last_updated` is older than their indexed value. Advisory \u2014 consumers MAY ignore and re-index the full file.").optional() }).describe("Fields shared by every variant of `authorized_agents[*]` in adagents.json, regardless of authorization_type. Variants `allOf` this base and add their discriminator-specific fields. Centralized to prevent drift across all authorization-type variants.")), import_zod.z.object({ "authorization_type": import_zod.z.literal("publisher_properties").describe("Discriminator indicating authorization for properties from other publisher domains"), "publisher_properties": import_zod.z.array(import_zod.z.union([import_zod.z.object({ "publisher_domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where publisher's adagents.json is hosted (e.g., 'cnn.com'). XOR with `publisher_domains` \u2014 exactly one MUST be present on each `publisher_properties[]` entry; both-present and neither-present both fail validation.").optional(), "publisher_domains": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$"))).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Compact form for fanning the same selector across many publishers (e.g., a managed network listing every publisher it represents). Each entry is the domain where that publisher's adagents.json is hosted. Each listed domain MUST be canonicalized to lowercase (the `pattern` already rejects uppercase). Mutually exclusive with `publisher_domain`. Each listed domain counts as explicitly scoped for the `managerdomain` fallback safety rule.").optional(), "selection_type": import_zod.z.literal("all").describe("Discriminator indicating all properties from each addressed publisher are included") }).catchall(import_zod.z.any()).and(import_zod.z.intersection(import_zod.z.any().refine((value) => !import_zod.z.any().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), import_zod.z.union([import_zod.z.any(), import_zod.z.any()]))).describe("Select all properties from one publisher domain, or from each publisher domain when `publisher_domains` is used. Consumers MAY satisfy the selector from the parent file's top-level `properties[]` when those properties carry a `publisher_domain` matching one of the listed domains (see Resolution paths in the spec)."), import_zod.z.object({ "publisher_domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where publisher's adagents.json is hosted (e.g., 'cnn.com')."), "selection_type": import_zod.z.literal("by_id").describe("Discriminator indicating selection by specific property IDs"), "property_ids": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Identifier for a publisher property. Must be lowercase alphanumeric with underscores only.")).describe("Specific property IDs from the publisher's adagents.json") }).catchall(import_zod.z.any()).describe("Select specific properties by ID. Single-publisher only \u2014 property IDs are publisher-scoped, so the compact `publisher_domains[]` form is intentionally NOT available for this selector. Use multiple `publisher_properties[]` entries (one per publisher) when each publisher's ID set differs."), import_zod.z.object({ "publisher_domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where publisher's adagents.json is hosted (e.g., 'cnn.com'). XOR with `publisher_domains` \u2014 exactly one MUST be present on each `publisher_properties[]` entry; both-present and neither-present both fail validation.").optional(), "publisher_domains": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$"))).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Compact form for fanning the same tag predicate across many publishers (canonical managed-network shape). Each entry is the domain where that publisher's adagents.json is hosted. Each listed domain MUST be canonicalized to lowercase (the `pattern` already rejects uppercase). Mutually exclusive with `publisher_domain`. Each listed domain counts as explicitly scoped for the `managerdomain` fallback safety rule.").optional(), "selection_type": import_zod.z.literal("by_tag").describe("Discriminator indicating selection by property tags"), "property_tags": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Tag for categorizing publisher properties. Must be lowercase alphanumeric with underscores only.")).describe("Property tags resolved against each addressed publisher's adagents.json, OR against the parent file's top-level `properties[]` when those properties carry a `publisher_domain` matching the selector. Selector covers all properties carrying any of these tags.") }).catchall(import_zod.z.any()).and(import_zod.z.intersection(import_zod.z.any().refine((value) => !import_zod.z.any().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), import_zod.z.union([import_zod.z.any(), import_zod.z.any()]))).describe("Select properties by tag membership. With `publisher_domains`, the same `property_tags` predicate is resolved against each listed publisher's adagents.json \u2014 the common managed-network case where every represented site tags inventory with a shared label. Consumers MAY also satisfy the predicate from the parent file's top-level `properties[]` when those properties carry a `publisher_domain` matching one of the selector's `publisher_domains[]` (see Resolution paths in the spec).")]).describe("Selects properties from a publisher's adagents.json. Used for both product definitions and agent authorization. Supports three selection patterns: all properties, specific IDs, or by tags. Each selector targets one publisher via `publisher_domain` (string) or a fan-out across many publishers that share the same selector via `publisher_domains` (array). Exactly one of `publisher_domain` or `publisher_domains` MUST be present. When `publisher_domains` is used, the selector is logically equivalent to repeating the same entry once per listed domain.")).describe("Properties from other publisher domains this agent is authorized for. Each entry specifies a publisher domain and which of their properties this agent can sell"), "collections": import_zod.z.array(import_zod.z.object({ "publisher_domain": import_zod.z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring these collections is hosted (e.g., 'mrbeast.com'). The collections array in that file contains the authoritative collection definitions."), "collection_ids": import_zod.z.array(import_zod.z.string()).describe("Collection IDs from the adagents.json collections array. Each ID must match a collection_id declared in that file. Omit to reference all collections declared in that file.").optional() }).catchall(import_zod.z.any()).describe("References collections declared in an adagents.json. Buyers resolve full collection objects by fetching the adagents.json at the given domain and matching collection_ids against its collections array. When collection_ids is omitted, the selector references every collection declared in that adagents.json \u2014 the bulk-grant form for authorization scoping (e.g., a host authorizing a channel owner's sales agent for all of the owner's collections without tracking owner-assigned IDs).")).describe("Optional collection constraints. When present, authorization only applies to inventory associated with these collections. A selector without collection_ids grants for all collections declared in that selector's publisher_domain adagents.json (the bulk-grant form for owner-sold carriage).").optional(), "placement_ids": import_zod.z.array(import_zod.z.string()).describe("Optional placement constraints. When present, authorization only applies to these placement IDs from the top-level placements array in this file.").optional(), "placement_tags": import_zod.z.array(import_zod.z.string()).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Optional placement tag constraints. When present, authorization only applies to placements whose tags include any of these publisher-defined values.").optional(), "delegation_type": import_zod.z.enum(["direct", "delegated", "ad_network"]).describe("Commercial relationship for this inventory path. 'direct' means the publisher treats this as a direct way to buy from them, even if a third party operates the software. 'delegated' means the agent is authorized to sell on the publisher's behalf. 'ad_network' means the inventory is sold as part of a network/package context rather than as the publisher's direct endpoint.").optional(), "exclusive": import_zod.z.boolean().describe("Whether this agent is the publisher's sole authorized path for the scoped inventory slice. When false or absent, other authorized agents may also sell the same inventory.").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Optional ISO 3166-1 alpha-2 country codes limiting where this authorization applies. Omit for worldwide authorization.").optional(), "effective_from": import_zod.z.string().datetime().describe("Optional start time for this authorization window.").optional(), "effective_until": import_zod.z.string().datetime().describe("Optional end time for this authorization window.").optional() }).catchall(import_zod.z.any()).and(import_zod.z.object({ "url": import_zod.z.string().url().describe("The authorized agent's protocol endpoint URL: the exact agent URL buyers are given and send AdCP requests to, including the path (e.g., `https://agent.example.com/mcp`). A bare origin matches only an agent served at the root. An agent reachable at more than one agent URL (for example, separate MCP and A2A endpoints) needs one entry per URL. Callers comparing this URL against a registry (sales-agent list, signal-provider registry, TMP provider lookup, etc.) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality \u2014 two URLs that differ only in case, default port, or percent-encoding of unreserved characters are the same agent. See docs/reference/url-canonicalization."), "authorized_for": import_zod.z.string().min(1).max(500).describe("Human-readable description of what this agent is authorized to do \u2014 what it sells (for sales/property agents) or what data it provides (for signal agents). The variant the entry uses (`property_ids`, `signal_tags`, etc.) tells consumers which inflection applies; this field carries the operator-supplied label."), "signing_keys": import_zod.z.array(import_zod.z.object({ "kid": import_zod.z.string().describe("Key identifier for selecting the correct signing key."), "kty": import_zod.z.string().describe("JWK key type, such as 'OKP', 'EC', or 'RSA'."), "alg": import_zod.z.string().describe("Expected signing algorithm for this key, such as 'EdDSA' or 'RS256'.").optional(), "use": import_zod.z.string().describe("Optional JWK use value. Typically 'sig' for signing keys.").optional(), "crv": import_zod.z.string().describe("Curve name for OKP or EC keys, such as 'Ed25519' or 'P-256'.").optional(), "x": import_zod.z.string().describe("Base64url-encoded public key x coordinate or public key value for OKP keys.").optional(), "y": import_zod.z.string().describe("Base64url-encoded public key y coordinate for EC keys.").optional(), "n": import_zod.z.string().describe("Base64url-encoded RSA modulus.").optional(), "e": import_zod.z.string().describe("Base64url-encoded RSA public exponent.").optional(), "revoked_at": import_zod.z.string().datetime().describe("Optional revocation timestamp. When present, verifiers MUST reject any signature produced with this key whose signing epoch (or equivalent time reference) is at or after this timestamp. The key may continue to appear in the trust anchor during a grace period so caches that have not yet refreshed still find the key and can evaluate the revocation marker. Keys past their revocation can be removed once the cache TTL (recommended: 5 minutes) has elapsed across all verifiers.").optional() }).catchall(import_zod.z.any()).describe("Publisher-attested public key material for an authorized agent. Buyers use these keys to verify signed agent responses against the trust anchor published in adagents.json rather than trusting key discovery from the agent domain alone.")).describe("Optional publisher-attested public signing keys for this agent. Use these as the trust anchor for verifying signed agent responses instead of relying on key discovery from the agent domain alone.").optional(), "encryption_keys": import_zod.z.array(import_zod.z.object({ "kid": import_zod.z.string().max(8).describe("Key identifier. Opaque \u2014 MUST NOT encode geographic or deployment information."), "kty": import_zod.z.literal("OKP").describe("JWK key type. Must be OKP for X25519."), "crv": import_zod.z.literal("X25519").describe("Curve name. Must be X25519 for TMPX encryption."), "use": import_zod.z.literal("enc").describe("JWK use value. Must be enc for encryption keys."), "x": import_zod.z.string().describe("Base64url-encoded X25519 public key (32 bytes).") }).strict().describe("X25519 public key for HPKE encryption. Used for TMPX exposure token encryption with HPKE mode_base.")).describe("X25519 public keys for TMPX exposure token encryption. Each key identifies a cluster master that can decrypt TMPX tokens. Used with HPKE mode_base \u2014 read replicas encrypt with this public key, only the master can decrypt.").optional(), "last_updated": import_zod.z.string().datetime().describe("Optional ISO 8601 timestamp indicating when this `authorized_agents[]` entry last changed. Independent of the file-level `last_updated`. Lets validators perform a partial walk by skipping entries whose `last_updated` is older than their indexed value. Advisory \u2014 consumers MAY ignore and re-index the full file.").optional() }).describe("Fields shared by every variant of `authorized_agents[*]` in adagents.json, regardless of authorization_type. Variants `allOf` this base and add their discriminator-specific fields. Centralized to prevent drift across all authorization-type variants.")), import_zod.z.object({ "authorization_type": import_zod.z.literal("signal_ids").describe("Discriminator indicating authorization by specific signal IDs"), "signal_ids": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$"))).describe("Signal IDs this agent is authorized to resell. Resolved against the top-level signals array in this file") }).catchall(import_zod.z.any()).and(import_zod.z.object({ "url": import_zod.z.string().url().describe("The authorized agent's protocol endpoint URL: the exact agent URL buyers are given and send AdCP requests to, including the path (e.g., `https://agent.example.com/mcp`). A bare origin matches only an agent served at the root. An agent reachable at more than one agent URL (for example, separate MCP and A2A endpoints) needs one entry per URL. Callers comparing this URL against a registry (sales-agent list, signal-provider registry, TMP provider lookup, etc.) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality \u2014 two URLs that differ only in case, default port, or percent-encoding of unreserved characters are the same agent. See docs/reference/url-canonicalization."), "authorized_for": import_zod.z.string().min(1).max(500).describe("Human-readable description of what this agent is authorized to do \u2014 what it sells (for sales/property agents) or what data it provides (for signal agents). The variant the entry uses (`property_ids`, `signal_tags`, etc.) tells consumers which inflection applies; this field carries the operator-supplied label."), "signing_keys": import_zod.z.array(import_zod.z.object({ "kid": import_zod.z.string().describe("Key identifier for selecting the correct signing key."), "kty": import_zod.z.string().describe("JWK key type, such as 'OKP', 'EC', or 'RSA'."), "alg": import_zod.z.string().describe("Expected signing algorithm for this key, such as 'EdDSA' or 'RS256'.").optional(), "use": import_zod.z.string().describe("Optional JWK use value. Typically 'sig' for signing keys.").optional(), "crv": import_zod.z.string().describe("Curve name for OKP or EC keys, such as 'Ed25519' or 'P-256'.").optional(), "x": import_zod.z.string().describe("Base64url-encoded public key x coordinate or public key value for OKP keys.").optional(), "y": import_zod.z.string().describe("Base64url-encoded public key y coordinate for EC keys.").optional(), "n": import_zod.z.string().describe("Base64url-encoded RSA modulus.").optional(), "e": import_zod.z.string().describe("Base64url-encoded RSA public exponent.").optional(), "revoked_at": import_zod.z.string().datetime().describe("Optional revocation timestamp. When present, verifiers MUST reject any signature produced with this key whose signing epoch (or equivalent time reference) is at or after this timestamp. The key may continue to appear in the trust anchor during a grace period so caches that have not yet refreshed still find the key and can evaluate the revocation marker. Keys past their revocation can be removed once the cache TTL (recommended: 5 minutes) has elapsed across all verifiers.").optional() }).catchall(import_zod.z.any()).describe("Publisher-attested public key material for an authorized agent. Buyers use these keys to verify signed agent responses against the trust anchor published in adagents.json rather than trusting key discovery from the agent domain alone.")).describe("Optional publisher-attested public signing keys for this agent. Use these as the trust anchor for verifying signed agent responses instead of relying on key discovery from the agent domain alone.").optional(), "encryption_keys": import_zod.z.array(import_zod.z.object({ "kid": import_zod.z.string().max(8).describe("Key identifier. Opaque \u2014 MUST NOT encode geographic or deployment information."), "kty": import_zod.z.literal("OKP").describe("JWK key type. Must be OKP for X25519."), "crv": import_zod.z.literal("X25519").describe("Curve name. Must be X25519 for TMPX encryption."), "use": import_zod.z.literal("enc").describe("JWK use value. Must be enc for encryption keys."), "x": import_zod.z.string().describe("Base64url-encoded X25519 public key (32 bytes).") }).strict().describe("X25519 public key for HPKE encryption. Used for TMPX exposure token encryption with HPKE mode_base.")).describe("X25519 public keys for TMPX exposure token encryption. Each key identifies a cluster master that can decrypt TMPX tokens. Used with HPKE mode_base \u2014 read replicas encrypt with this public key, only the master can decrypt.").optional(), "last_updated": import_zod.z.string().datetime().describe("Optional ISO 8601 timestamp indicating when this `authorized_agents[]` entry last changed. Independent of the file-level `last_updated`. Lets validators perform a partial walk by skipping entries whose `last_updated` is older than their indexed value. Advisory \u2014 consumers MAY ignore and re-index the full file.").optional() }).describe("Fields shared by every variant of `authorized_agents[*]` in adagents.json, regardless of authorization_type. Variants `allOf` this base and add their discriminator-specific fields. Centralized to prevent drift across all authorization-type variants.")).describe("Authorization for signals by specific signal IDs"), import_zod.z.object({ "authorization_type": import_zod.z.literal("signal_tags").describe("Discriminator indicating authorization by signal tags"), "signal_tags": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9_-]+$"))).describe("Signal tags this agent is authorized for. Agent can resell all signals with these tags") }).catchall(import_zod.z.any()).and(import_zod.z.object({ "url": import_zod.z.string().url().describe("The authorized agent's protocol endpoint URL: the exact agent URL buyers are given and send AdCP requests to, including the path (e.g., `https://agent.example.com/mcp`). A bare origin matches only an agent served at the root. An agent reachable at more than one agent URL (for example, separate MCP and A2A endpoints) needs one entry per URL. Callers comparing this URL against a registry (sales-agent list, signal-provider registry, TMP provider lookup, etc.) MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality \u2014 two URLs that differ only in case, default port, or percent-encoding of unreserved characters are the same agent. See docs/reference/url-canonicalization."), "authorized_for": import_zod.z.string().min(1).max(500).describe("Human-readable description of what this agent is authorized to do \u2014 what it sells (for sales/property agents) or what data it provides (for signal agents). The variant the entry uses (`property_ids`, `signal_tags`, etc.) tells consumers which inflection applies; this field carries the operator-supplied label."), "signing_keys": import_zod.z.array(import_zod.z.object({ "kid": import_zod.z.string().describe("Key identifier for selecting the correct signing key."), "kty": import_zod.z.string().describe("JWK key type, such as 'OKP', 'EC', or 'RSA'."), "alg": import_zod.z.string().describe("Expected signing algorithm for this key, such as 'EdDSA' or 'RS256'.").optional(), "use": import_zod.z.string().describe("Optional JWK use value. Typically 'sig' for signing keys.").optional(), "crv": import_zod.z.string().describe("Curve name for OKP or EC keys, such as 'Ed25519' or 'P-256'.").optional(), "x": import_zod.z.string().describe("Base64url-encoded public key x coordinate or public key value for OKP keys.").optional(), "y": import_zod.z.string().describe("Base64url-encoded public key y coordinate for EC keys.").optional(), "n": import_zod.z.string().describe("Base64url-encoded RSA modulus.").optional(), "e": import_zod.z.string().describe("Base64url-encoded RSA public exponent.").optional(), "revoked_at": import_zod.z.string().datetime().describe("Optional revocation timestamp. When present, verifiers MUST reject any signature produced with this key whose signing epoch (or equivalent time reference) is at or after this timestamp. The key may continue to appear in the trust anchor during a grace period so caches that have not yet refreshed still find the key and can evaluate the revocation marker. Keys past their revocation can be removed once the cache TTL (recommended: 5 minutes) has elapsed across all verifiers.").optional() }).catchall(import_zod.z.any()).describe("Publisher-attested public key material for an authorized agent. Buyers use these keys to verify signed agent responses against the trust anchor published in adagents.json rather than trusting key discovery from the agent domain alone.")).describe("Optional publisher-attested public signing keys for this agent. Use these as the trust anchor for verifying signed agent responses instead of relying on key discovery from the agent domain alone.").optional(), "encryption_keys": import_zod.z.array(import_zod.z.object({ "kid": import_zod.z.string().max(8).describe("Key identifier. Opaque \u2014 MUST NOT encode geographic or deployment information."), "kty": import_zod.z.literal("OKP").describe("JWK key type. Must be OKP for X25519."), "crv": import_zod.z.literal("X25519").describe("Curve name. Must be X25519 for TMPX encryption."), "use": import_zod.z.literal("enc").describe("JWK use value. Must be enc for encryption keys."), "x": import_zod.z.string().describe("Base64url-encoded X25519 public key (32 bytes).") }).strict().describe("X25519 public key for HPKE encryption. Used for TMPX exposure token encryption with HPKE mode_base.")).describe("X25519 public keys for TMPX exposure token encryption. Each key identifies a cluster master that can decrypt TMPX tokens. Used with HPKE mode_base \u2014 read replicas encrypt with this public key, only the master can decrypt.").optional(), "last_updated": import_zod.z.string().datetime().describe("Optional ISO 8601 timestamp indicating when this `authorized_agents[]` entry last changed. Independent of the file-level `last_updated`. Lets validators perform a partial walk by skipping entries whose `last_updated` is older than their indexed value. Advisory \u2014 consumers MAY ignore and re-index the full file.").optional() }).describe("Fields shared by every variant of `authorized_agents[*]` in adagents.json, regardless of authorization_type. Variants `allOf` this base and add their discriminator-specific fields. Centralized to prevent drift across all authorization-type variants.")).describe("Authorization for signals by tag membership")])).describe("Array of sales agents authorized to make inventory from this file available to buyers. Authorization can be scoped to specific properties, collections, countries, and time windows, with optional delegation metadata indicating whether the path is direct, delegated, or network-mediated. MAY be empty (`[]`) for a catalog-only community mirror \u2014 a file that publishes `formats`/`properties`/`placements` (with `catalog_etag`) for a platform that has not adopted AdCP, where there is no sales agent to authorize (see `catalog_etag`, `formats`, `superseded_by`). An empty array asserts *no sales authorization*: validators MUST NOT read it as deny-all, authorize-all, or a revocation, MUST NOT treat its presence as an error, and MUST still consume the catalog arrays."), "last_updated": import_zod.z.string().datetime().describe("ISO 8601 timestamp indicating when this file was last updated").optional(), "property_features": import_zod.z.array(import_zod.z.object({ "url": import_zod.z.string().url().describe("The agent's API endpoint URL. Callers comparing this URL against a feature-provider registry MUST canonicalize both sides per the AdCP URL canonicalization rules, not byte-equality. See docs/reference/url-canonicalization."), "name": import_zod.z.string().describe("Human-readable name of the vendor/agent (e.g., 'Scope3', 'TAG', 'OneTrust')"), "features": import_zod.z.array(import_zod.z.string()).describe("Feature IDs this agent provides (e.g., 'carbon_score', 'tag_certified_against_fraud'). Use get_adcp_capabilities on the agent for full definitions."), "publisher_id": import_zod.z.string().describe("Optional publisher identifier at this agent (for lookup)").optional() }).catchall(import_zod.z.any())).describe("[AdCP 3.0] Optional list of agents that provide property feature data (certifications, scores, compliance status). Used for discovery - actual data is accessed through property list filters.").optional(), "signals": import_zod.z.array(import_zod.z.object({ "id": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the publishing domain's adagents.json signals[]"), "name": import_zod.z.string().min(1).max(255).describe("Human-readable signal name"), "description": import_zod.z.string().max(2e3).describe("Detailed description of what this signal represents and how it's derived").optional(), "value_type": import_zod.z.enum(["binary", "categorical", "numeric"]).describe("The data type of this signal's values"), "tags": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[a-z0-9_-]+$"))).describe("Tags for grouping and filtering this domain's published signal definitions").optional(), "allowed_values": import_zod.z.array(import_zod.z.string()).describe("For categorical signals, the valid values users can be assigned").optional(), "restricted_attributes": import_zod.z.array(import_zod.z.enum(["racial_ethnic_origin", "political_opinions", "religious_beliefs", "trade_union_membership", "health_data", "sex_life_sexual_orientation", "genetic_data", "biometric_data", "age", "familial_status"]).describe("Personal data categories that may be restricted from use in audience targeting. Combines GDPR Article 9 special categories with US civil-rights protected classes (FHA familial_status, ADEA age). Used in two places: (1) on campaign plans via restricted_attributes to declare which categories are prohibited, and (2) on signal-definition.json via restricted_attributes to declare which categories a signal touches. Governance agents match plan restrictions against signal declarations for structural validation.")).describe("Restricted attribute categories this signal touches. Data providers SHOULD declare these so governance agents can structurally match signals against a plan's restricted_attributes without relying on semantic inference from the signal name or description.").optional(), "demographic_predicate": import_zod.z.object({ "age": import_zod.z.object({ "min": import_zod.z.number().int().gte(0).lte(150).describe("Inclusive minimum age in completed years. Omit for an open lower bound.").optional(), "max": import_zod.z.number().int().gte(0).lte(150).describe("Inclusive maximum age in completed years. Omit for an open upper bound.").optional(), "include_unknown": import_zod.z.boolean().describe("Whether delivery to people whose age is unavailable is part of this predicate. This field has no default and MUST be supplied.") }).catchall(import_zod.z.any()).and(import_zod.z.union([import_zod.z.any(), import_zod.z.any()])).describe("A canonical audience-age predicate in completed integer years. min and max are inclusive; omitting one bound means no restriction in that direction. At least one bound is required. include_unknown is always explicit because people whose age is unavailable are not members of any numeric interval. Implementations MUST reject min greater than max; JSON Schema draft-07 cannot compare sibling numeric values.") }).catchall(import_zod.z.any()).describe("Authoritative machine-readable demographic meaning for this signal. Signal names and taxonomy labels alone never establish exact demographic equivalence. Signals carrying this field MUST also declare restricted_attributes including age.").optional(), "policy_categories": import_zod.z.array(import_zod.z.string()).describe("Policy categories this signal is sensitive for (e.g., a children's interest signal declares ['children_directed']). Governance agents match these against a plan's policy_categories to flag sensitive data usage.").optional(), "range": import_zod.z.object({ "min": import_zod.z.number().describe("Minimum value"), "max": import_zod.z.number().describe("Maximum value"), "unit": import_zod.z.string().describe("Unit of measurement (e.g., 'score', 'dollars', 'years')").optional() }).strict().describe("For numeric signals, the valid value range").optional(), "taxonomy": import_zod.z.object({ "ref": import_zod.z.string().url().describe("URI identifying the taxonomy or taxonomy documentation."), "version": import_zod.z.string().describe("Version identifier for the taxonomy when the taxonomy has versioned definitions.").optional(), "segtax": import_zod.z.number().int().gte(1).describe("OpenRTB segtax code when the taxonomy maps to an OpenRTB segment taxonomy.").optional(), "etag": import_zod.z.string().describe("Optional validator for custom taxonomy definitions so consumers can detect drift between signal publication and taxonomy resolution.").optional(), "values": import_zod.z.array(import_zod.z.object({ "id": import_zod.z.string().min(1).describe("Taxonomy node identifier."), "path": import_zod.z.string().describe("Optional human-readable or taxonomy-native path for display and review.").optional(), "modifiers": import_zod.z.array(import_zod.z.string()).describe("Optional taxonomy-specific modifiers that qualify the node.").optional() }).strict()).describe("Taxonomy node values that describe this signal. These are meaning/discovery metadata for the signal definition, not the values a buyer submits in package targeting expressions."), "value_mappings": import_zod.z.array(import_zod.z.object({ "value": import_zod.z.string().describe("Categorical value from allowed_values[]."), "taxonomy_value_id": import_zod.z.string().describe("Taxonomy node identifier corresponding to this categorical value."), "path": import_zod.z.string().describe("Optional human-readable or taxonomy-native path for display and review.").optional(), "modifiers": import_zod.z.array(import_zod.z.string()).describe("Optional taxonomy-specific modifiers that qualify the mapped value.").optional() }).strict()).describe("For categorical signals, maps package-targeting allowed_values[] strings to stable taxonomy node identifiers. The allowed_values[] strings remain the wire values buyers submit; this mapping explains how those strings resolve into the published taxonomy. Each value_mappings[].value SHOULD match one of the signal's allowed_values[] entries; JSON Schema draft-07 cannot enforce this cross-array constraint.").optional(), "parent_match_behavior": import_zod.z.enum(["exact_only", "descendants_supported", "unknown"]).describe("Whether this signal definition supports treating a parent taxonomy node as matching descendant nodes for discovery/filtering or seller-side expansion. 'exact_only' means only explicitly listed node ids match. 'descendants_supported' means the seller can expand known, version-pinned parent nodes to descendants internally, typically by ORing the children in its execution system. 'unknown' means the provider has not declared parent-node behavior. This field is metadata about discovery/translation behavior, not a package targeting operator.").optional() }).strict().describe("Optional taxonomy metadata describing what this signal means in an external audience, content, retail-media, or provider-owned taxonomy. Taxonomy metadata does not create a new value_type and does not change package targeting grammar: buyers still target the named signal according to value_type. When a taxonomy value is a parent node, parent/descendant expansion is seller behavior and must be declared through parent_match_behavior rather than assumed.").optional(), "segmentation_criteria": import_zod.z.string().max(500).describe("Rules governing inclusion of identifiers in the segment. Aligns with IAB Data Transparency Standard audience criteria disclosure.").optional(), "criteria_url": import_zod.z.string().url().describe("Optional URL to a longer-form methodology or criteria document. This is a disclosure pointer; buyers should not branch programmatically on the linked content.").optional(), "data_sources": import_zod.z.array(import_zod.z.enum(["app_behavior", "app_usage", "web_usage", "geo_location", "email", "tv_ott_or_stb_device", "panel", "online_ecommerce", "credit_data", "loyalty_card", "transaction", "online_survey", "offline_survey", "public_record_census", "public_record_voter_file", "public_record_other", "offline_transaction"])).describe("Origin categories of the raw data used to compile the signal, aligned with IAB Data Transparency Standard source disclosure. Use 'panel' for respondent-panel or JIC-style audience sources. Offline and public-record sources require onboarder disclosure. Co-viewing projection and reconciliation of seller claims against a JIC or measurement vendor belong in measurement reporting/vendor metrics rather than package signal targeting.").optional(), "methodology": import_zod.z.enum(["observed", "declared", "derived", "inferred", "modeled"]).describe("How the signal's audience membership or attribute was determined. 'modeled' requires the modeling block.").optional(), "audience_expansion": import_zod.z.boolean().describe("Whether look-alike or similar-audience expansion was used to include additional identifiers. When true, modeling is required.").optional(), "device_expansion": import_zod.z.boolean().describe("Whether the signal was expanded deterministically across devices of the same user, household, or business. Probabilistic cross-device expansion is modeling and should use methodology 'modeled' or the modeling block.").optional(), "refresh_cadence": import_zod.z.enum(["intra_day", "daily", "weekly", "monthly", "bi_monthly", "quarterly", "bi_annually", "annually"]).describe("Cadence at which the signal definition's underlying segment membership is refreshed.").optional(), "lookback_window": import_zod.z.enum(["intra_day", "daily", "weekly", "monthly", "bi_monthly", "quarterly", "bi_annually", "annually"]).describe("Time window in which a qualifying event can occur for inclusion.").optional(), "onboarder": import_zod.z.object({ "match_keys": import_zod.z.array(import_zod.z.enum(["name", "address", "email", "postal", "lat_long", "mobile_id", "cookie_id", "ip", "customer_id", "phone"])), "pre_onboarding_audience_expansion": import_zod.z.boolean().optional(), "pre_onboarding_device_expansion": import_zod.z.boolean().optional(), "pre_onboarding_precision_level": import_zod.z.enum(["individual", "household", "business", "geography"]).optional() }).strict().describe("Onboarder disclosure. Required when data_sources includes an offline_* or public_record_* source.").optional(), "subject_type": import_zod.z.enum(["individual", "household", "business", "contextual", "none"]).describe("What kind of subject this signal characterizes.").optional(), "resolution_method": import_zod.z.enum(["deterministic_id", "probabilistic_device", "browser", "geographic", "content_signal", "mixed"]).describe("How the subject is resolved at decision time.").optional(), "id_types": import_zod.z.array(import_zod.z.enum(["cookie", "mobile_id", "platform_id", "user_enabled_id"])).describe("Identifier currencies analyzed to determine audience membership or attributes.").optional(), "audience_scope": import_zod.z.enum(["single_domain", "cross_domain_owned", "cross_domain_unowned", "offline"]).describe("Context within which the audience attribute was determined. 'single_domain' requires originating_domain.").optional(), "originating_domain": import_zod.z.string().describe("Domain of the digital property where the audience originates. Required when audience_scope is 'single_domain'.").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).describe("ISO 3166-1 alpha-2 country codes where the signal is applicable. Sellers must not expose a signal for media buys in countries outside this list. Federating agents that surface a peer's signal MUST treat the peer-published list as an upper bound, re-check it against the buyer's intended deployment countries, and may apply only narrower local policy.").optional(), "consent_basis": import_zod.z.array(import_zod.z.enum(["consent", "legitimate_interest", "contract", "legal_obligation"]).describe("Common GDPR lawful bases relevant to advertising. Covers the Article 6(1) bases used in programmatic advertising contexts.")).describe("Declared GDPR Article 6 lawful basis or consent basis under which this signal's data is processed. For non-GDPR regimes, use countries, policy_categories, and disclosure fields to describe jurisdiction-specific obligations unless a future enum value applies.").optional(), "art9_basis": import_zod.z.enum(["explicit_consent", "manifestly_made_public", "substantial_public_interest", "vital_interests"]).describe("GDPR Article 9 basis when restricted_attributes is non-empty and the signal is used in jurisdictions where Article 9 applies. Required by policy for applicable use cases rather than universally required at schema level because sensitivity and lawful basis are jurisdiction-relative.").optional(), "modeling": import_zod.z.object({ "method": import_zod.z.enum(["lookalike", "supervised", "embedding", "rules"]), "seed_source": import_zod.z.object({ "type": import_zod.z.enum(["first_party_crm", "panel", "declared_survey", "transactional", "behavioral"]), "provider_signed": import_zod.z.boolean().describe("Whether the seed source carries a signed attestation under one of the provider's published signing keys. This is a forward-looking claim until the consumer can resolve and verify the provider's applicable signing keys through the AdCP signing profile; consumers MUST NOT treat this boolean alone as cryptographic proof.") }).strict(), "training_data_jurisdictions": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).describe("ISO 3166-1 alpha-2 country codes where the model's training data was collected."), "ai_act_risk_class": import_zod.z.enum(["minimal", "limited", "high_risk"]).describe("EU AI Act risk classification self-declared by the provider. Prohibited-risk modeled signals must not be published as AdCP signal definitions."), "disclosure": import_zod.z.object({ "required": import_zod.z.boolean().describe("The provider's claim that a modeling or AI-use disclosure is required for this signal in at least one applicable jurisdiction. This is a declared compliance signal, not a protocol-level legal determination."), "jurisdictions": import_zod.z.array(import_zod.z.object({ "country": import_zod.z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "region": import_zod.z.string().describe("Provider-defined sub-national region code or name when the obligation is regional. No global canonical format is implied.").optional(), "regulation": import_zod.z.string().describe("Provider-supplied regulation identifier for the disclosure obligation."), "disclosure_text": import_zod.z.string().describe("Human-readable disclosure text or summary the provider expects buyers or reviewers to see.").optional(), "disclosure_url": import_zod.z.string().url().describe("Optional URL to the provider's canonical disclosure or methodology page for this jurisdiction.").optional(), "audience": import_zod.z.enum(["buyer", "data_subject", "regulator", "public"]).describe("Primary audience for this disclosure entry.").optional() }).strict()).describe("Jurisdictions where a modeling or AI-use disclosure applies.").optional(), "notes": import_zod.z.string().max(2e3).describe("Optional provider notes on how the disclosure should be interpreted. Informational only; buyers should not branch programmatically on this text.").optional() }).strict().and(import_zod.z.any()).describe("Signal/modeling-specific disclosure requirements and jurisdictional notes. This is not creative provenance render guidance.").optional() }).strict().describe("Modeling disclosure for modeled data signals. Required when methodology is 'modeled' or audience_expansion is true. This describes data modeling and intentionally does not reuse creative provenance, which is content/render oriented.").optional(), "data_subject_rights": import_zod.z.object({ "upstream_source_domain": import_zod.z.string().max(253).describe("Domain of the upstream data source whose rights process these channels reach, when different from the publishing domain.").optional(), "channels": import_zod.z.array(import_zod.z.object({ "rights": import_zod.z.array(import_zod.z.enum(["access", "rectification", "erasure", "portability", "objection"])).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Rights supported by this channel."), "url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("HTTPS URL for submitting the rights request.").optional(), "email": import_zod.z.string().email().describe("Email address for submitting the rights request.").optional(), "languages": import_zod.z.array(import_zod.z.string()).describe("BCP 47 language tags supported by this channel.").optional(), "countries": import_zod.z.array(import_zod.z.string().regex(new RegExp("^[A-Z]{2}$"))).describe("ISO 3166-1 alpha-2 countries this channel serves, when the provider routes rights by country.").optional() }).strict().and(import_zod.z.union([import_zod.z.any(), import_zod.z.any()]))).describe("Rights request channels and the rights each channel supports. At least one declared channel MUST support one or more of access, erasure, or objection; schema validators enforce this with draft-07 contains, and consumers whose SDK drops contains need an equivalent runtime check."), "response_sla_days": import_zod.z.number().int().gte(1).lte(90).describe("Maximum response time in days for rights requests handled through the declared rights channels. For provider-published signals, providers SHOULD avoid duplicating this field across every signal unless the value varies by signal or upstream source; consumers MAY also consult the provider's public privacy policy or registry disclosures when present.").optional(), "ccpa_opt_out_url": import_zod.z.string().url().regex(new RegExp("^https://")).describe("US-specific 'Do Not Sell or Share' opt-out URL where required.").optional() }).strict().describe("Per-signal data-subject-rights routing. Inline on the signal because upstream source, rights routing, and response commitments can differ by segment or may be unavailable from a public provider document for custom/private signals. This is a contact/routing reference, not a machine-callable AdCP API.").optional(), "last_updated": import_zod.z.string().datetime().describe("When this definition record was last updated. This indicates freshness of the definition record, not an attestation that the underlying data or model was refreshed at that time.").optional(), "dts_compliant_version": import_zod.z.string().describe("IAB Data Transparency Standard version this signal definition self-attests as satisfying, when applicable.").optional() }).catchall(import_zod.z.any()).and(import_zod.z.intersection(import_zod.z.intersection(import_zod.z.any(), import_zod.z.intersection(import_zod.z.any(), import_zod.z.any())), import_zod.z.intersection(import_zod.z.any(), import_zod.z.intersection(import_zod.z.any(), import_zod.z.any())))).describe("Definition of a signal in published adagents.json signals[]. The publishing domain supplies the namespace, so this definition carries a local id rather than a signal_ref. Media-buy products reference this definition with signal_ref scope 'data_provider', data_provider_domain set to the publishing domain, and signal_id set to this id. Some constraints use JSON Schema draft-07 conditional keywords such as if/then and contains; SDK generators that drop those keywords need equivalent runtime guards.")).describe("Signal definitions published by this domain. Each entry defines a signal id within this file's publishing-domain namespace; entries do not include signal_ref objects. Signals Protocol discovery and media-buy product targeting reference these through signal_ref scope 'data_provider', with data_provider_domain set to this file's publishing domain and signal_id set to signals[].id.").optional(), "signal_tags": import_zod.z.record(import_zod.z.string(), import_zod.z.object({ "name": import_zod.z.string().describe("Human-readable name for this tag"), "description": import_zod.z.string().describe("Description of what this tag represents") }).catchall(import_zod.z.any())).describe("Metadata for each tag referenced by signals. Provides human-readable context for signal tag values.").optional() }).catchall(import_zod.z.any()).and(import_zod.z.intersection(import_zod.z.union([import_zod.z.any(), import_zod.z.any(), import_zod.z.any(), import_zod.z.any(), import_zod.z.any(), import_zod.z.any()]), import_zod.z.any())).describe("Inline structure variant - contains full agent authorization data")]).describe("Declaration of authorized agents for advertising inventory and data signals. Hosted at /.well-known/adagents.json on publisher domains (for properties) or data provider domains (for signals). Can either contain the full structure inline or reference an authoritative URL.");
168
168
  // Annotate the CommonJS export names for ESM import in node:
169
169
  0 && (module.exports = {
170
170
  AdagentsJsonSchema,