@adcp/sdk 6.9.0 → 6.10.0

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 (233) hide show
  1. package/bin/adcp.js +285 -5
  2. package/compliance/cache/3.0.6.previous/domains/brand/index.yaml +163 -0
  3. package/compliance/cache/3.0.6.previous/domains/creative/index.yaml +412 -0
  4. package/compliance/cache/3.0.6.previous/domains/governance/index.yaml +683 -0
  5. package/compliance/cache/3.0.6.previous/domains/media-buy/creative-reception.yaml +247 -0
  6. package/compliance/cache/3.0.6.previous/domains/media-buy/index.yaml +769 -0
  7. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/create_media_buy_async.yaml +232 -0
  8. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +414 -0
  9. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/delivery_reporting.yaml +205 -0
  10. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_approved.yaml +211 -0
  11. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_conditions.yaml +196 -0
  12. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_denied.yaml +192 -0
  13. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_denied_recovery.yaml +244 -0
  14. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/invalid_transitions.yaml +284 -0
  15. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/inventory_list_no_match.yaml +143 -0
  16. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/inventory_list_targeting.yaml +271 -0
  17. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/measurement_terms_rejected.yaml +195 -0
  18. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/pending_creatives_to_start.yaml +250 -0
  19. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/proposal_finalize.yaml +243 -0
  20. package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/refine_products.yaml +148 -0
  21. package/compliance/cache/3.0.6.previous/domains/media-buy/state-machine.yaml +442 -0
  22. package/compliance/cache/3.0.6.previous/domains/signals/index.yaml +266 -0
  23. package/compliance/cache/3.0.6.previous/domains/sponsored-intelligence/index.yaml +256 -0
  24. package/compliance/cache/3.0.6.previous/index.json +324 -0
  25. package/compliance/cache/3.0.6.previous/protocols/brand/index.yaml +163 -0
  26. package/compliance/cache/3.0.6.previous/protocols/creative/index.yaml +412 -0
  27. package/compliance/cache/3.0.6.previous/protocols/governance/index.yaml +683 -0
  28. package/compliance/cache/3.0.6.previous/protocols/media-buy/creative-reception.yaml +247 -0
  29. package/compliance/cache/3.0.6.previous/protocols/media-buy/index.yaml +769 -0
  30. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/create_media_buy_async.yaml +232 -0
  31. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +414 -0
  32. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/delivery_reporting.yaml +205 -0
  33. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_approved.yaml +211 -0
  34. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_conditions.yaml +196 -0
  35. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_denied.yaml +192 -0
  36. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_denied_recovery.yaml +244 -0
  37. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/invalid_transitions.yaml +284 -0
  38. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/inventory_list_no_match.yaml +143 -0
  39. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/inventory_list_targeting.yaml +271 -0
  40. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +195 -0
  41. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +250 -0
  42. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/proposal_finalize.yaml +243 -0
  43. package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/refine_products.yaml +148 -0
  44. package/compliance/cache/3.0.6.previous/protocols/media-buy/state-machine.yaml +442 -0
  45. package/compliance/cache/3.0.6.previous/protocols/signals/index.yaml +266 -0
  46. package/compliance/cache/3.0.6.previous/protocols/sponsored-intelligence/index.yaml +256 -0
  47. package/compliance/cache/3.0.6.previous/specialisms/audience-sync/index.yaml +280 -0
  48. package/compliance/cache/3.0.6.previous/specialisms/brand-rights/index.yaml +350 -0
  49. package/compliance/cache/3.0.6.previous/specialisms/brand-rights/scenarios/governance_denied.yaml +204 -0
  50. package/compliance/cache/3.0.6.previous/specialisms/collection-lists/index.yaml +359 -0
  51. package/compliance/cache/3.0.6.previous/specialisms/content-standards/index.yaml +572 -0
  52. package/compliance/cache/3.0.6.previous/specialisms/creative-ad-server/index.yaml +383 -0
  53. package/compliance/cache/3.0.6.previous/specialisms/creative-generative/generative-seller.yaml +758 -0
  54. package/compliance/cache/3.0.6.previous/specialisms/creative-generative/index.yaml +746 -0
  55. package/compliance/cache/3.0.6.previous/specialisms/creative-template/index.yaml +413 -0
  56. package/compliance/cache/3.0.6.previous/specialisms/governance-aware-seller/index.yaml +136 -0
  57. package/compliance/cache/3.0.6.previous/specialisms/governance-delivery-monitor/index.yaml +441 -0
  58. package/compliance/cache/3.0.6.previous/specialisms/governance-spend-authority/denied.yaml +221 -0
  59. package/compliance/cache/3.0.6.previous/specialisms/governance-spend-authority/index.yaml +330 -0
  60. package/compliance/cache/3.0.6.previous/specialisms/property-lists/index.yaml +482 -0
  61. package/compliance/cache/3.0.6.previous/specialisms/sales-broadcast-tv/index.yaml +689 -0
  62. package/compliance/cache/3.0.6.previous/specialisms/sales-catalog-driven/index.yaml +779 -0
  63. package/compliance/cache/3.0.6.previous/specialisms/sales-guaranteed/index.yaml +504 -0
  64. package/compliance/cache/3.0.6.previous/specialisms/sales-non-guaranteed/index.yaml +428 -0
  65. package/compliance/cache/3.0.6.previous/specialisms/sales-proposal-mode/index.yaml +520 -0
  66. package/compliance/cache/3.0.6.previous/specialisms/sales-social/index.yaml +584 -0
  67. package/compliance/cache/3.0.6.previous/specialisms/signal-marketplace/index.yaml +415 -0
  68. package/compliance/cache/3.0.6.previous/specialisms/signal-marketplace/scenarios/governance_denied.yaml +207 -0
  69. package/compliance/cache/3.0.6.previous/specialisms/signal-owned/index.yaml +316 -0
  70. package/compliance/cache/3.0.6.previous/test-kits/acme-outdoor.yaml +210 -0
  71. package/compliance/cache/3.0.6.previous/test-kits/bistro-oranje.yaml +126 -0
  72. package/compliance/cache/3.0.6.previous/test-kits/nova-motors.yaml +262 -0
  73. package/compliance/cache/3.0.6.previous/test-kits/osei-natural.yaml +126 -0
  74. package/compliance/cache/3.0.6.previous/test-kits/signed-requests-runner.yaml +155 -0
  75. package/compliance/cache/3.0.6.previous/test-kits/substitution-observer-runner.yaml +690 -0
  76. package/compliance/cache/3.0.6.previous/test-kits/summit-foods.yaml +125 -0
  77. package/compliance/cache/3.0.6.previous/test-kits/webhook-receiver-runner.yaml +265 -0
  78. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/001-minimal-plan.json +43 -0
  79. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/002-full-plan.json +217 -0
  80. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
  81. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
  82. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
  83. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
  84. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
  85. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
  86. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
  87. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
  88. package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
  89. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/README.md +219 -0
  90. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/canonicalization.json +241 -0
  91. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/keys.json +60 -0
  92. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
  93. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
  94. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
  95. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
  96. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
  97. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
  98. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
  99. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
  100. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
  101. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
  102. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
  103. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
  104. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
  105. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
  106. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
  107. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
  108. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
  109. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
  110. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
  111. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
  112. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
  113. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
  114. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
  115. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
  116. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
  117. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
  118. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
  119. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/001-basic-post.json +30 -0
  120. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
  121. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/003-es256-post.json +30 -0
  122. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
  123. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
  124. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
  125. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
  126. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
  127. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
  128. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
  129. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
  130. package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
  131. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/README.md +211 -0
  132. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/keys.json +61 -0
  133. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
  134. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
  135. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
  136. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
  137. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
  138. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
  139. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
  140. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
  141. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
  142. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
  143. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
  144. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
  145. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
  146. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
  147. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
  148. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
  149. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
  150. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
  151. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
  152. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
  153. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
  154. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
  155. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
  156. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
  157. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
  158. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
  159. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
  160. package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
  161. package/compliance/cache/3.0.6.previous/universal/capability-discovery.yaml +125 -0
  162. package/compliance/cache/3.0.6.previous/universal/collection-lists-pagination-integrity.yaml +306 -0
  163. package/compliance/cache/3.0.6.previous/universal/content-standards-pagination-integrity.yaml +326 -0
  164. package/compliance/cache/3.0.6.previous/universal/deterministic-testing.yaml +1343 -0
  165. package/compliance/cache/3.0.6.previous/universal/error-compliance.yaml +474 -0
  166. package/compliance/cache/3.0.6.previous/universal/fictional-entities.yaml +307 -0
  167. package/compliance/cache/3.0.6.previous/universal/get-media-buys-pagination-integrity.yaml +160 -0
  168. package/compliance/cache/3.0.6.previous/universal/get-signals-pagination-integrity.yaml +211 -0
  169. package/compliance/cache/3.0.6.previous/universal/idempotency.yaml +593 -0
  170. package/compliance/cache/3.0.6.previous/universal/pagination-integrity-creative-formats.yaml +258 -0
  171. package/compliance/cache/3.0.6.previous/universal/pagination-integrity-list-accounts.yaml +262 -0
  172. package/compliance/cache/3.0.6.previous/universal/pagination-integrity.yaml +263 -0
  173. package/compliance/cache/3.0.6.previous/universal/property-lists-pagination-integrity.yaml +307 -0
  174. package/compliance/cache/3.0.6.previous/universal/runner-output-contract.yaml +358 -0
  175. package/compliance/cache/3.0.6.previous/universal/schema-validation.yaml +526 -0
  176. package/compliance/cache/3.0.6.previous/universal/security.yaml +431 -0
  177. package/compliance/cache/3.0.6.previous/universal/signed-requests.yaml +205 -0
  178. package/compliance/cache/3.0.6.previous/universal/storyboard-schema.yaml +1176 -0
  179. package/compliance/cache/3.0.6.previous/universal/v3-envelope-integrity.yaml +106 -0
  180. package/compliance/cache/3.0.6.previous/universal/webhook-emission.yaml +337 -0
  181. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  182. package/dist/lib/server/create-adcp-server.d.ts +33 -0
  183. package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
  184. package/dist/lib/server/create-adcp-server.js +127 -1
  185. package/dist/lib/server/create-adcp-server.js.map +1 -1
  186. package/dist/lib/server/credential-policy.d.ts +221 -0
  187. package/dist/lib/server/credential-policy.d.ts.map +1 -0
  188. package/dist/lib/server/credential-policy.js +260 -0
  189. package/dist/lib/server/credential-policy.js.map +1 -0
  190. package/dist/lib/server/dynamic-registry.d.ts +219 -0
  191. package/dist/lib/server/dynamic-registry.d.ts.map +1 -0
  192. package/dist/lib/server/dynamic-registry.js +245 -0
  193. package/dist/lib/server/dynamic-registry.js.map +1 -0
  194. package/dist/lib/server/index.d.ts +8 -0
  195. package/dist/lib/server/index.d.ts.map +1 -1
  196. package/dist/lib/server/index.js +15 -4
  197. package/dist/lib/server/index.js.map +1 -1
  198. package/dist/lib/server/operational-platform.d.ts +239 -0
  199. package/dist/lib/server/operational-platform.d.ts.map +1 -0
  200. package/dist/lib/server/operational-platform.js +94 -0
  201. package/dist/lib/server/operational-platform.js.map +1 -0
  202. package/dist/lib/server/wire-safe.d.ts +211 -0
  203. package/dist/lib/server/wire-safe.d.ts.map +1 -0
  204. package/dist/lib/server/wire-safe.js +231 -0
  205. package/dist/lib/server/wire-safe.js.map +1 -0
  206. package/dist/lib/server/wire-spec-fields.generated.d.ts +168 -0
  207. package/dist/lib/server/wire-spec-fields.generated.d.ts.map +1 -0
  208. package/dist/lib/server/wire-spec-fields.generated.js +172 -0
  209. package/dist/lib/server/wire-spec-fields.generated.js.map +1 -0
  210. package/dist/lib/testing/compliance/index.d.ts +2 -0
  211. package/dist/lib/testing/compliance/index.d.ts.map +1 -1
  212. package/dist/lib/testing/compliance/index.js +6 -1
  213. package/dist/lib/testing/compliance/index.js.map +1 -1
  214. package/dist/lib/testing/compliance/summary.d.ts +77 -0
  215. package/dist/lib/testing/compliance/summary.d.ts.map +1 -0
  216. package/dist/lib/testing/compliance/summary.js +176 -0
  217. package/dist/lib/testing/compliance/summary.js.map +1 -0
  218. package/dist/lib/testing/storyboard/compliance.d.ts +26 -0
  219. package/dist/lib/testing/storyboard/compliance.d.ts.map +1 -1
  220. package/dist/lib/testing/storyboard/compliance.js +51 -0
  221. package/dist/lib/testing/storyboard/compliance.js.map +1 -1
  222. package/dist/lib/testing/storyboard/index.d.ts +2 -2
  223. package/dist/lib/testing/storyboard/index.d.ts.map +1 -1
  224. package/dist/lib/testing/storyboard/index.js +4 -2
  225. package/dist/lib/testing/storyboard/index.js.map +1 -1
  226. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  227. package/dist/lib/testing/storyboard/runner.js +58 -5
  228. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  229. package/dist/lib/version.d.ts +3 -3
  230. package/dist/lib/version.d.ts.map +1 -1
  231. package/dist/lib/version.js +3 -3
  232. package/dist/lib/version.js.map +1 -1
  233. package/package.json +2 -2
@@ -0,0 +1,280 @@
1
+ id: audience_sync
2
+ version: "1.0.0"
3
+ title: "Audience sync"
4
+ protocol: media-buy
5
+ category: audience_sync
6
+ summary: "Full audience lifecycle: account discovery, audience creation with hashed identifiers, and audience deletion."
7
+ track: audiences
8
+ required_tools:
9
+ - list_accounts
10
+ - sync_audiences
11
+
12
+ # Cross-step assertion (adcp#2664, extended in adcp-client#782). status.monotonic
13
+ # rejects audience status transitions observed across steps that aren't on
14
+ # the spec lifecycle graph. Audience lifecycle is fully bidirectional across
15
+ # processing / ready / too_small — the graph allows ready ↔ processing on
16
+ # re-sync, ready ↔ too_small as counts cross minimum_size, and the re-sync
17
+ # path too_small → processing → ready. Off-graph regressions (e.g. a seller
18
+ # silently downgrading from ready to an unknown enum value) fail here rather
19
+ # than slipping past per-step schema checks.
20
+ invariants:
21
+ - status.monotonic
22
+
23
+ platform_types:
24
+ - display_ad_server
25
+ - social_platform
26
+ - retail_media
27
+ - audio_platform
28
+ - dsp
29
+ - pmax_platform
30
+
31
+ narrative: |
32
+ You support audience syncing via the sync_audiences task. Buyers push first-party
33
+ audience segments to your platform using hashed identifiers (emails, phones). Your
34
+ platform matches those identifiers against your user graph and returns match rates.
35
+
36
+ This storyboard verifies the full audience lifecycle: discover an account to sync
37
+ against, create a test audience with hashed identifiers, and clean up by deleting it.
38
+
39
+ agent:
40
+ interaction_model: media_buy_seller
41
+ capabilities:
42
+ - sells_media
43
+ - accepts_audiences
44
+ examples:
45
+ - "Retail media networks"
46
+ - "Social platforms"
47
+ - "DSPs with audience onboarding"
48
+
49
+ caller:
50
+ role: buyer_agent
51
+ example: "Scope3 (DSP)"
52
+
53
+ prerequisites:
54
+ description: |
55
+ The caller needs an active account on the seller platform. The account_setup phase
56
+ discovers or creates the account relationship before syncing audiences.
57
+ test_kit: "test-kits/acme-outdoor.yaml"
58
+
59
+ phases:
60
+ - id: capability_discovery
61
+ title: "Capability discovery"
62
+ narrative: |
63
+ The buyer calls get_adcp_capabilities to confirm the agent supports media buying before syncing audiences.
64
+
65
+ steps:
66
+ - id: get_capabilities
67
+ title: "Check agent capabilities"
68
+ narrative: |
69
+ Verify that the agent declares the expected protocol support before
70
+ proceeding with domain-specific operations.
71
+ task: get_adcp_capabilities
72
+ schema_ref: "protocol/get-adcp-capabilities-request.json"
73
+ response_schema_ref: "protocol/get-adcp-capabilities-response.json"
74
+ doc_ref: "/protocol/get_adcp_capabilities"
75
+ comply_scenario: capability_discovery
76
+ stateful: false
77
+ expected: |
78
+ Return capabilities declaring media_buy in supported_protocols, confirming the agent sells media.
79
+ sample_request:
80
+ context:
81
+ correlation_id: "audience_sync--get_capabilities"
82
+ validations:
83
+ - check: response_schema
84
+ description: "Response matches get-adcp-capabilities-response.json schema"
85
+ - check: field_present
86
+ path: "supported_protocols"
87
+ description: "Agent declares supported protocols"
88
+
89
+ - check: field_present
90
+ path: "context"
91
+ description: "Response echoes back the context object"
92
+ - check: field_value
93
+ path: "context.correlation_id"
94
+ value: "audience_sync--get_capabilities"
95
+ description: "Context correlation_id returned unchanged"
96
+ - id: account_setup
97
+ title: "Account setup"
98
+ narrative: |
99
+ Before syncing audiences, the buyer needs an account on the seller platform.
100
+ This phase discovers an existing account via list_accounts or establishes one
101
+ via sync_accounts.
102
+
103
+ steps:
104
+ - id: discover_account
105
+ title: "Discover or create account"
106
+ narrative: |
107
+ List existing accounts to find one suitable for audience sync. The account
108
+ must already exist and be active. The account_id is captured for use in
109
+ subsequent audience operations.
110
+ task: list_accounts
111
+ schema_ref: "account/list-accounts-request.json"
112
+ response_schema_ref: "account/list-accounts-response.json"
113
+ doc_ref: "/accounts/tasks/list_accounts"
114
+ stateful: true
115
+ expected: |
116
+ Return at least one account with:
117
+ - account_id: platform-assigned identifier
118
+ - status: active (required for audience sync)
119
+
120
+ sample_request:
121
+ context:
122
+ correlation_id: "audience_sync--discover_account"
123
+
124
+ validations:
125
+ - check: response_schema
126
+ description: "Response matches list-accounts-response.json schema"
127
+ - check: field_present
128
+ path: "accounts[0].account_id"
129
+ description: "At least one account exists with an account_id"
130
+
131
+ - check: field_present
132
+ path: "context"
133
+ description: "Response echoes back the context object"
134
+ - check: field_value
135
+ path: "context.correlation_id"
136
+ value: "audience_sync--discover_account"
137
+ description: "Context correlation_id returned unchanged"
138
+ - id: audience_sync
139
+ title: "Audience sync"
140
+ narrative: |
141
+ The buyer syncs a test audience containing hashed email and phone identifiers.
142
+ The seller platform matches those identifiers and returns per-audience results
143
+ including action (created/updated), status, and match rates.
144
+
145
+ After verifying creation, the test audience is deleted to clean up.
146
+
147
+ steps:
148
+ - id: discover_audiences
149
+ title: "Discover existing audiences"
150
+ narrative: |
151
+ Call sync_audiences with no audiences array to discover what audiences
152
+ already exist on the platform for this account. This is a read-only
153
+ discovery call.
154
+ task: sync_audiences
155
+ schema_ref: "media-buy/sync-audiences-request.json"
156
+ response_schema_ref: "media-buy/sync-audiences-response.json"
157
+ doc_ref: "/media-buy/task-reference/sync_audiences"
158
+ comply_scenario: sync_audiences
159
+ stateful: false
160
+ expected: |
161
+ Return existing audiences for the account (may be empty).
162
+ Each audience should have an audience_id and status.
163
+
164
+ sample_request:
165
+ account:
166
+ brand:
167
+ domain: "acmeoutdoor.example"
168
+ operator: "pinnacle-agency.example"
169
+
170
+ idempotency_key: "$generate:uuid_v4#audience_sync_audience_sync_discover_audiences"
171
+ context:
172
+ correlation_id: "audience_sync--discover_audiences"
173
+ validations:
174
+ - check: response_schema
175
+ description: "Response matches sync-audiences-response.json schema"
176
+
177
+ - check: field_present
178
+ path: "context"
179
+ description: "Response echoes back the context object"
180
+ - check: field_value
181
+ path: "context.correlation_id"
182
+ value: "audience_sync--discover_audiences"
183
+ description: "Context correlation_id returned unchanged"
184
+ - id: create_audience
185
+ title: "Create test audience"
186
+ narrative: |
187
+ Push a test audience with hashed email and phone identifiers. The seller
188
+ matches identifiers against their user graph and returns the audience with
189
+ action: created, match counts, and match rate.
190
+ task: sync_audiences
191
+ schema_ref: "media-buy/sync-audiences-request.json"
192
+ response_schema_ref: "media-buy/sync-audiences-response.json"
193
+ doc_ref: "/media-buy/task-reference/sync_audiences"
194
+ comply_scenario: sync_audiences
195
+ stateful: true
196
+ expected: |
197
+ Accept the audience and return:
198
+ - audience_id: matches the submitted ID
199
+ - action: created
200
+ - status: active or processing
201
+ - uploaded_count: number of identifiers received
202
+ - matched_count: number of identifiers matched
203
+ - effective_match_rate: ratio of matched to uploaded
204
+
205
+ sample_request:
206
+ account:
207
+ brand:
208
+ domain: "acmeoutdoor.example"
209
+ operator: "pinnacle-agency.example"
210
+ audiences:
211
+ - audience_id: "adcp-test-audience-001"
212
+ name: "AdCP test audience"
213
+ add:
214
+ - external_id: "adcp-user-0001"
215
+ hashed_email: "a000000000000000000000000000000000000000000000000000000000000000"
216
+ - external_id: "adcp-user-0002"
217
+ hashed_phone: "b000000000000000000000000000000000000000000000000000000000000000"
218
+
219
+ idempotency_key: "$generate:uuid_v4#audience_sync_audience_sync_create_audience"
220
+ context:
221
+ correlation_id: "audience_sync--create_audience"
222
+ validations:
223
+ - check: response_schema
224
+ description: "Response matches sync-audiences-response.json schema"
225
+ - check: field_present
226
+ path: "audiences[0].audience_id"
227
+ description: "Audience has an audience_id"
228
+ - check: field_present
229
+ path: "audiences[0].action"
230
+ description: "Audience has an action (created or updated)"
231
+
232
+ - check: field_present
233
+ path: "context"
234
+ description: "Response echoes back the context object"
235
+ - check: field_value
236
+ path: "context.correlation_id"
237
+ value: "audience_sync--create_audience"
238
+ description: "Context correlation_id returned unchanged"
239
+ - id: delete_audience
240
+ title: "Delete test audience"
241
+ narrative: |
242
+ Clean up by deleting the test audience. The seller should acknowledge the
243
+ deletion with action: deleted.
244
+ task: sync_audiences
245
+ schema_ref: "media-buy/sync-audiences-request.json"
246
+ response_schema_ref: "media-buy/sync-audiences-response.json"
247
+ doc_ref: "/media-buy/task-reference/sync_audiences"
248
+ comply_scenario: sync_audiences
249
+ stateful: true
250
+ expected: |
251
+ Delete the test audience and return:
252
+ - audience_id: matches the test audience
253
+ - action: deleted
254
+
255
+ sample_request:
256
+ account:
257
+ brand:
258
+ domain: "acmeoutdoor.example"
259
+ operator: "pinnacle-agency.example"
260
+ audiences:
261
+ - audience_id: "adcp-test-audience-001"
262
+ delete: true
263
+
264
+ idempotency_key: "$generate:uuid_v4#audience_sync_audience_sync_delete_audience"
265
+ context:
266
+ correlation_id: "audience_sync--delete_audience"
267
+ validations:
268
+ - check: response_schema
269
+ description: "Response matches sync-audiences-response.json schema"
270
+ - check: field_present
271
+ path: "audiences[0].action"
272
+ description: "Audience deletion acknowledged with action field"
273
+
274
+ - check: field_present
275
+ path: "context"
276
+ description: "Response echoes back the context object"
277
+ - check: field_value
278
+ path: "context.correlation_id"
279
+ value: "audience_sync--delete_audience"
280
+ description: "Context correlation_id returned unchanged"
@@ -0,0 +1,350 @@
1
+ id: brand_rights
2
+ version: "1.0.0"
3
+ title: "Brand identity and rights licensing"
4
+ protocol: brand
5
+ category: brand_rights
6
+ summary: "Brand agent that serves identity assets and licenses rights for AI-generated content."
7
+ track: core
8
+ required_tools:
9
+ - get_brand_identity
10
+ requires_scenarios:
11
+ - brand_rights/governance_denied
12
+
13
+ narrative: |
14
+ You run a brand agent — a system that holds brand identity data (logos, colors, fonts,
15
+ tone of voice) and licenses rights for AI-generated content. A buyer agent connects to
16
+ discover your brand identity, browse available rights, acquire licenses, manage them over
17
+ time, and submit generated creatives for brand approval.
18
+
19
+ Brand agents are the bridge between brand owners and generative AI. When a DSP or
20
+ creative platform wants to generate an ad for your brand, they call your brand agent
21
+ to get the identity guidelines, license the right to generate content, and then submit
22
+ the result for approval before it goes live.
23
+
24
+ This storyboard covers the full brand rights lifecycle: discovering the brand, browsing
25
+ rights, acquiring a license, managing it, and approving generated content.
26
+
27
+ agent:
28
+ interaction_model: brand_rights_holder
29
+ capabilities:
30
+ - brand_identity
31
+ - rights_licensing
32
+ examples:
33
+ - "Rights management platforms"
34
+ - "Talent agencies"
35
+ - "Brand licensing services"
36
+ - "Enterprise brand portals"
37
+
38
+ caller:
39
+ role: buyer_agent
40
+ example: "Pinnacle Agency (creative buyer)"
41
+
42
+ prerequisites:
43
+ description: |
44
+ The caller needs brand context for identity discovery and campaign parameters for
45
+ rights acquisition. The test kit provides a sample brand with visual identity assets.
46
+ test_kit: "test-kits/acme-outdoor.yaml"
47
+
48
+ phases:
49
+ - id: capability_discovery
50
+ title: "Capability discovery"
51
+ narrative: |
52
+ The buyer calls get_adcp_capabilities to confirm the agent supports brand identity and rights before requesting brand data.
53
+
54
+ steps:
55
+ - id: get_capabilities
56
+ title: "Check agent capabilities"
57
+ narrative: |
58
+ Verify that the agent declares the expected protocol support before
59
+ proceeding with domain-specific operations.
60
+ task: get_adcp_capabilities
61
+ schema_ref: "protocol/get-adcp-capabilities-request.json"
62
+ response_schema_ref: "protocol/get-adcp-capabilities-response.json"
63
+ doc_ref: "/protocol/get_adcp_capabilities"
64
+ comply_scenario: capability_discovery
65
+ stateful: false
66
+ expected: |
67
+ Return capabilities declaring brand in supported_protocols, confirming the agent serves brand identity and rights.
68
+ sample_request:
69
+ context:
70
+ correlation_id: "brand_rights--get_capabilities"
71
+ validations:
72
+ - check: response_schema
73
+ description: "Response matches get-adcp-capabilities-response.json schema"
74
+ - check: field_present
75
+ path: "supported_protocols"
76
+ description: "Agent declares supported protocols"
77
+
78
+ - check: field_present
79
+ path: "context"
80
+ description: "Response echoes back the context object"
81
+ - check: field_value
82
+ path: "context.correlation_id"
83
+ value: "brand_rights--get_capabilities"
84
+ description: "Context correlation_id returned unchanged"
85
+ - id: identity_discovery
86
+ title: "Brand identity discovery"
87
+ narrative: |
88
+ The buyer retrieves the brand's public identity — logos, colors, fonts, tone of
89
+ voice, and visual guidelines. This is the foundation for any generative content:
90
+ the buyer needs to know what the brand looks like and sounds like before generating
91
+ anything.
92
+
93
+ steps:
94
+ - id: get_brand_identity
95
+ title: "Retrieve brand identity"
96
+ narrative: |
97
+ The buyer calls get_brand_identity to retrieve the brand's visual and verbal
98
+ identity. Public-tier access returns basic assets. Authorized access (after
99
+ account linking) provides high-resolution assets, voice configs, and detailed
100
+ tone guidelines.
101
+ task: get_brand_identity
102
+ schema_ref: "brand/get-brand-identity-request.json"
103
+ response_schema_ref: "brand/get-brand-identity-response.json"
104
+ doc_ref: "/brand-protocol/tasks/get_brand_identity"
105
+ stateful: false
106
+ expected: |
107
+ Return brand identity data:
108
+ - Logos at multiple resolutions
109
+ - Brand colors (primary, secondary, accent)
110
+ - Typography (fonts, weights, sizes)
111
+ - Tone of voice guidelines
112
+ - Visual style guidelines
113
+
114
+ sample_request:
115
+ brand_id: "acme_outdoor"
116
+
117
+ context:
118
+ correlation_id: "brand_rights--get_brand_identity"
119
+
120
+ validations:
121
+ - check: response_schema
122
+ description: "Response matches brand identity schema"
123
+ - check: field_present
124
+ path: "brand_id"
125
+ description: "Response includes brand_id"
126
+ - check: field_value
127
+ path: "brand_id"
128
+ value: "acme_outdoor"
129
+ description: "Returned brand_id matches the requested brand"
130
+ - check: field_present
131
+ path: "names"
132
+ description: "Response includes brand names"
133
+
134
+ - id: get_brand_identity_invalid
135
+ title: "Reject invalid brand ID"
136
+ narrative: |
137
+ The buyer requests identity for a brand that does not exist. The agent must
138
+ return an error rather than generating default identity data — an agent that
139
+ silently returns placeholder identity would pass schema checks but fail this
140
+ behavioral test.
141
+ task: get_brand_identity
142
+ schema_ref: "brand/get-brand-identity-request.json"
143
+ response_schema_ref: "brand/get-brand-identity-response.json"
144
+ doc_ref: "/brand-protocol/tasks/get_brand_identity"
145
+ stateful: false
146
+ expect_error: true
147
+ negative_path: payload_well_formed
148
+ expected: |
149
+ Reject the request with an error:
150
+ - Error indicates the brand was not found
151
+ - No default or placeholder identity data returned
152
+
153
+ sample_request:
154
+ brand_id: "nonexistent_brand_xyz"
155
+
156
+ validations:
157
+ - check: error_code
158
+ description: "Error code present for unknown brand"
159
+
160
+ - id: rights_search
161
+ title: "Browse available rights"
162
+ narrative: |
163
+ The buyer discovers what rights are available for licensing. Rights define what
164
+ generative content can be created — image generation, video synthesis, voice
165
+ cloning, copy writing — and at what terms.
166
+
167
+ steps:
168
+ - id: get_rights
169
+ title: "Discover available rights"
170
+ narrative: |
171
+ The buyer calls get_rights to search across the agent's full rights
172
+ roster (talent, music, stock media, etc.). `buyer_brand` identifies
173
+ the advertiser so the agent can apply compatibility filtering
174
+ (competitor exclusions, dietary conflicts from the buyer's
175
+ brand.json). The optional `brand_id` filter — which scopes results
176
+ to a specific rights-holder brand (e.g., a named athlete) — is
177
+ omitted here so the agent returns its full catalog.
178
+ task: get_rights
179
+ schema_ref: "brand/get-rights-request.json"
180
+ response_schema_ref: "brand/get-rights-response.json"
181
+ doc_ref: "/brand-protocol/tasks/get_rights"
182
+ stateful: false
183
+ expected: |
184
+ Return available rights with pricing:
185
+ - Right types (image_generation, video_synthesis, copy_writing, etc.)
186
+ - Pricing options per right
187
+ - Duration and renewal terms
188
+ - Usage constraints (impression caps, geo restrictions)
189
+
190
+ sample_request:
191
+ query: "image generation rights for advertising"
192
+ uses:
193
+ - "ai_generated_image"
194
+ buyer_brand:
195
+ domain: "acmeoutdoor.example"
196
+
197
+ context:
198
+ correlation_id: "brand_rights--get_rights"
199
+ context_outputs:
200
+ - path: "rights.0.rights_id"
201
+ key: "rights_id"
202
+ - path: "rights.0.pricing_options.0.pricing_option_id"
203
+ key: "pricing_option_id"
204
+
205
+ validations:
206
+ - check: response_schema
207
+ description: "Response matches get_rights schema"
208
+ - check: field_present
209
+ path: "rights"
210
+ description: "Response includes rights array"
211
+
212
+ - check: field_present
213
+ path: "context"
214
+ description: "Response echoes back the context object"
215
+ - check: field_value
216
+ path: "context.correlation_id"
217
+ value: "brand_rights--get_rights"
218
+ description: "Context correlation_id returned unchanged"
219
+ - id: rights_acquisition
220
+ title: "Acquire a rights license"
221
+ narrative: |
222
+ The buyer selects a right and acquires a license. This is the contractual commitment —
223
+ the buyer pays for the right to generate content of a specific type for a defined
224
+ period. The brand agent issues generation credentials.
225
+
226
+ steps:
227
+ - id: acquire_rights
228
+ title: "Purchase a rights license"
229
+ narrative: |
230
+ The buyer acquires a specific right by selecting a pricing option and providing
231
+ campaign context. The brand agent validates the request, processes payment,
232
+ and returns a rights grant with generation credentials.
233
+ task: acquire_rights
234
+ schema_ref: "brand/acquire-rights-request.json"
235
+ response_schema_ref: "brand/acquire-rights-response.json"
236
+ doc_ref: "/brand-protocol/tasks/acquire_rights"
237
+ stateful: true
238
+ expected: |
239
+ Return the acquired rights grant:
240
+ - rights_id: unique identifier
241
+ - status: acquired
242
+ - Generation credentials
243
+ - Expiration date and usage limits
244
+ - Terms and constraints
245
+
246
+ sample_request:
247
+ account:
248
+ brand:
249
+ domain: "acmeoutdoor.example"
250
+ operator: "pinnacle-agency.example"
251
+ rights_id: "$context.rights_id"
252
+ pricing_option_id: "$context.pricing_option_id"
253
+ buyer:
254
+ domain: "pinnacle-agency.example"
255
+ campaign:
256
+ description: "AI-generated display ads for Acme Outdoor summer trail gear campaign"
257
+ uses:
258
+ - "likeness"
259
+ - "commercial"
260
+ start_date: "2026-04-01"
261
+ end_date: "2026-06-30"
262
+ revocation_webhook:
263
+ url: "https://pinnacle-agency.example/webhooks/revocation"
264
+ authentication:
265
+ schemes:
266
+ - "Bearer"
267
+ credentials: "pinnacle-revocation-webhook-secret-token"
268
+
269
+ idempotency_key: "$generate:uuid_v4#brand_rights_rights_acquisition_acquire_rights"
270
+ context:
271
+ correlation_id: "brand_rights--acquire_rights"
272
+ context_outputs:
273
+ - path: "rights_id"
274
+ key: "rights_grant_id"
275
+
276
+ validations:
277
+ - check: response_schema
278
+ description: "Response matches acquire_rights schema"
279
+ - check: field_present
280
+ path: "rights_id"
281
+ description: "Response includes rights_id"
282
+
283
+ - check: field_present
284
+ path: "context"
285
+ description: "Response echoes back the context object"
286
+ - check: field_value
287
+ path: "context.correlation_id"
288
+ value: "brand_rights--acquire_rights"
289
+ description: "Context correlation_id returned unchanged"
290
+ # NOTE: update_rights and creative_approval are intentionally absent.
291
+ # - update_rights has no published JSON request/response schemas yet (spec
292
+ # describes it conceptually in rights-terms.json).
293
+ # - creative_approval is modeled in the spec as a webhook (POST to the
294
+ # approval_webhook returned from acquire_rights), not an AdCP tool. Agents
295
+ # expose it as a regular HTTP endpoint outside the MCP surface.
296
+ # Both will be added back as storyboard phases once upstream schemas land
297
+ # (see https://github.com/adcontextprotocol/adcp for tracking).
298
+
299
+ - id: rights_enforcement
300
+ title: "Rights enforcement"
301
+ narrative: |
302
+ These steps test that the brand agent enforces rights constraints — expired
303
+ licenses, impression cap violations, and geographic restrictions. An agent that
304
+ only implements the happy path would pass the phases above but fail here.
305
+
306
+ steps:
307
+ - id: acquire_expired_rights
308
+ title: "Reject acquisition with expired campaign dates"
309
+ narrative: |
310
+ The buyer attempts to acquire rights for a campaign with dates entirely in
311
+ the past. The brand agent must reject this — a compliant agent does not issue
312
+ licenses for expired campaigns.
313
+ task: acquire_rights
314
+ schema_ref: "brand/acquire-rights-request.json"
315
+ response_schema_ref: "brand/acquire-rights-response.json"
316
+ doc_ref: "/brand-protocol/tasks/acquire_rights"
317
+ stateful: true
318
+ expect_error: true
319
+ negative_path: payload_well_formed
320
+ expected: |
321
+ Reject the request:
322
+ - Campaign dates are in the past
323
+ - Error indicates the rights period is invalid or expired
324
+
325
+ sample_request:
326
+ account:
327
+ brand:
328
+ domain: "acmeoutdoor.example"
329
+ operator: "pinnacle-agency.example"
330
+ rights_id: "$context.rights_id"
331
+ pricing_option_id: "$context.pricing_option_id"
332
+ buyer:
333
+ domain: "pinnacle-agency.example"
334
+ campaign:
335
+ description: "Expired campaign test"
336
+ uses:
337
+ - "commercial"
338
+ start_date: "2024-01-01"
339
+ end_date: "2024-03-31"
340
+ revocation_webhook:
341
+ url: "https://pinnacle-agency.example/webhooks/revocation"
342
+ authentication:
343
+ schemes:
344
+ - "Bearer"
345
+ credentials: "pinnacle-expired-rights-revocation-webhook-token"
346
+ idempotency_key: "$generate:uuid_v4#brand_rights_rights_enforcement_acquire_expired_rights"
347
+
348
+ validations:
349
+ - check: error_code
350
+ description: "Error code present for expired campaign dates"