@adcp/sdk 6.9.0 → 6.11.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.
- package/bin/adcp.js +285 -5
- package/compliance/cache/3.0.6.previous/domains/brand/index.yaml +163 -0
- package/compliance/cache/3.0.6.previous/domains/creative/index.yaml +412 -0
- package/compliance/cache/3.0.6.previous/domains/governance/index.yaml +683 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/creative-reception.yaml +247 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/index.yaml +769 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/create_media_buy_async.yaml +232 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +414 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/delivery_reporting.yaml +205 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_approved.yaml +211 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_conditions.yaml +196 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_denied.yaml +192 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_denied_recovery.yaml +244 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/invalid_transitions.yaml +284 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/inventory_list_no_match.yaml +143 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/inventory_list_targeting.yaml +271 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/measurement_terms_rejected.yaml +195 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/pending_creatives_to_start.yaml +250 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/proposal_finalize.yaml +243 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.0.6.previous/domains/signals/index.yaml +266 -0
- package/compliance/cache/3.0.6.previous/domains/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.0.6.previous/index.json +324 -0
- package/compliance/cache/3.0.6.previous/protocols/brand/index.yaml +163 -0
- package/compliance/cache/3.0.6.previous/protocols/creative/index.yaml +412 -0
- package/compliance/cache/3.0.6.previous/protocols/governance/index.yaml +683 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/creative-reception.yaml +247 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/index.yaml +769 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/create_media_buy_async.yaml +232 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +414 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/delivery_reporting.yaml +205 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_approved.yaml +211 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_conditions.yaml +196 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_denied.yaml +192 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_denied_recovery.yaml +244 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/invalid_transitions.yaml +284 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/inventory_list_no_match.yaml +143 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/inventory_list_targeting.yaml +271 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +195 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +250 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/proposal_finalize.yaml +243 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.0.6.previous/protocols/signals/index.yaml +266 -0
- package/compliance/cache/3.0.6.previous/protocols/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.0.6.previous/specialisms/audience-sync/index.yaml +280 -0
- package/compliance/cache/3.0.6.previous/specialisms/brand-rights/index.yaml +350 -0
- package/compliance/cache/3.0.6.previous/specialisms/brand-rights/scenarios/governance_denied.yaml +204 -0
- package/compliance/cache/3.0.6.previous/specialisms/collection-lists/index.yaml +359 -0
- package/compliance/cache/3.0.6.previous/specialisms/content-standards/index.yaml +572 -0
- package/compliance/cache/3.0.6.previous/specialisms/creative-ad-server/index.yaml +383 -0
- package/compliance/cache/3.0.6.previous/specialisms/creative-generative/generative-seller.yaml +758 -0
- package/compliance/cache/3.0.6.previous/specialisms/creative-generative/index.yaml +746 -0
- package/compliance/cache/3.0.6.previous/specialisms/creative-template/index.yaml +413 -0
- package/compliance/cache/3.0.6.previous/specialisms/governance-aware-seller/index.yaml +136 -0
- package/compliance/cache/3.0.6.previous/specialisms/governance-delivery-monitor/index.yaml +441 -0
- package/compliance/cache/3.0.6.previous/specialisms/governance-spend-authority/denied.yaml +221 -0
- package/compliance/cache/3.0.6.previous/specialisms/governance-spend-authority/index.yaml +330 -0
- package/compliance/cache/3.0.6.previous/specialisms/property-lists/index.yaml +482 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-broadcast-tv/index.yaml +689 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-catalog-driven/index.yaml +779 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-guaranteed/index.yaml +504 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-non-guaranteed/index.yaml +428 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-proposal-mode/index.yaml +520 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-social/index.yaml +584 -0
- package/compliance/cache/3.0.6.previous/specialisms/signal-marketplace/index.yaml +415 -0
- package/compliance/cache/3.0.6.previous/specialisms/signal-marketplace/scenarios/governance_denied.yaml +207 -0
- package/compliance/cache/3.0.6.previous/specialisms/signal-owned/index.yaml +316 -0
- package/compliance/cache/3.0.6.previous/test-kits/acme-outdoor.yaml +210 -0
- package/compliance/cache/3.0.6.previous/test-kits/bistro-oranje.yaml +126 -0
- package/compliance/cache/3.0.6.previous/test-kits/nova-motors.yaml +262 -0
- package/compliance/cache/3.0.6.previous/test-kits/osei-natural.yaml +126 -0
- package/compliance/cache/3.0.6.previous/test-kits/signed-requests-runner.yaml +155 -0
- package/compliance/cache/3.0.6.previous/test-kits/substitution-observer-runner.yaml +690 -0
- package/compliance/cache/3.0.6.previous/test-kits/summit-foods.yaml +125 -0
- package/compliance/cache/3.0.6.previous/test-kits/webhook-receiver-runner.yaml +265 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/001-minimal-plan.json +43 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/002-full-plan.json +217 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/README.md +219 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/canonicalization.json +241 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/keys.json +60 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/001-basic-post.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/003-es256-post.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/README.md +211 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/keys.json +61 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
- package/compliance/cache/3.0.6.previous/universal/capability-discovery.yaml +125 -0
- package/compliance/cache/3.0.6.previous/universal/collection-lists-pagination-integrity.yaml +306 -0
- package/compliance/cache/3.0.6.previous/universal/content-standards-pagination-integrity.yaml +326 -0
- package/compliance/cache/3.0.6.previous/universal/deterministic-testing.yaml +1343 -0
- package/compliance/cache/3.0.6.previous/universal/error-compliance.yaml +474 -0
- package/compliance/cache/3.0.6.previous/universal/fictional-entities.yaml +307 -0
- package/compliance/cache/3.0.6.previous/universal/get-media-buys-pagination-integrity.yaml +160 -0
- package/compliance/cache/3.0.6.previous/universal/get-signals-pagination-integrity.yaml +211 -0
- package/compliance/cache/3.0.6.previous/universal/idempotency.yaml +593 -0
- package/compliance/cache/3.0.6.previous/universal/pagination-integrity-creative-formats.yaml +258 -0
- package/compliance/cache/3.0.6.previous/universal/pagination-integrity-list-accounts.yaml +262 -0
- package/compliance/cache/3.0.6.previous/universal/pagination-integrity.yaml +263 -0
- package/compliance/cache/3.0.6.previous/universal/property-lists-pagination-integrity.yaml +307 -0
- package/compliance/cache/3.0.6.previous/universal/runner-output-contract.yaml +358 -0
- package/compliance/cache/3.0.6.previous/universal/schema-validation.yaml +526 -0
- package/compliance/cache/3.0.6.previous/universal/security.yaml +431 -0
- package/compliance/cache/3.0.6.previous/universal/signed-requests.yaml +205 -0
- package/compliance/cache/3.0.6.previous/universal/storyboard-schema.yaml +1176 -0
- package/compliance/cache/3.0.6.previous/universal/v3-envelope-integrity.yaml +106 -0
- package/compliance/cache/3.0.6.previous/universal/webhook-emission.yaml +337 -0
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/server/create-adcp-server.d.ts +33 -0
- package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
- package/dist/lib/server/create-adcp-server.js +127 -1
- package/dist/lib/server/create-adcp-server.js.map +1 -1
- package/dist/lib/server/credential-policy.d.ts +221 -0
- package/dist/lib/server/credential-policy.d.ts.map +1 -0
- package/dist/lib/server/credential-policy.js +260 -0
- package/dist/lib/server/credential-policy.js.map +1 -0
- package/dist/lib/server/decisioning/async-outcome.d.ts +17 -0
- package/dist/lib/server/decisioning/async-outcome.d.ts.map +1 -1
- package/dist/lib/server/decisioning/async-outcome.js +23 -18
- package/dist/lib/server/decisioning/async-outcome.js.map +1 -1
- package/dist/lib/server/decisioning/context.d.ts +8 -2
- package/dist/lib/server/decisioning/context.d.ts.map +1 -1
- package/dist/lib/server/decisioning/index.d.ts +1 -0
- package/dist/lib/server/decisioning/index.d.ts.map +1 -1
- package/dist/lib/server/decisioning/index.js.map +1 -1
- package/dist/lib/server/decisioning/runtime/from-platform.js +6 -4
- package/dist/lib/server/decisioning/runtime/from-platform.js.map +1 -1
- package/dist/lib/server/decisioning/runtime/postgres-task-registry.d.ts.map +1 -1
- package/dist/lib/server/decisioning/runtime/postgres-task-registry.js +5 -2
- package/dist/lib/server/decisioning/runtime/postgres-task-registry.js.map +1 -1
- package/dist/lib/server/decisioning/runtime/task-registry.d.ts +5 -0
- package/dist/lib/server/decisioning/runtime/task-registry.d.ts.map +1 -1
- package/dist/lib/server/decisioning/runtime/task-registry.js +4 -1
- package/dist/lib/server/decisioning/runtime/task-registry.js.map +1 -1
- package/dist/lib/server/decisioning/runtime/to-context.d.ts.map +1 -1
- package/dist/lib/server/decisioning/runtime/to-context.js +10 -2
- package/dist/lib/server/decisioning/runtime/to-context.js.map +1 -1
- package/dist/lib/server/dynamic-registry.d.ts +219 -0
- package/dist/lib/server/dynamic-registry.d.ts.map +1 -0
- package/dist/lib/server/dynamic-registry.js +245 -0
- package/dist/lib/server/dynamic-registry.js.map +1 -0
- package/dist/lib/server/index.d.ts +8 -0
- package/dist/lib/server/index.d.ts.map +1 -1
- package/dist/lib/server/index.js +15 -4
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/server/operational-platform.d.ts +239 -0
- package/dist/lib/server/operational-platform.d.ts.map +1 -0
- package/dist/lib/server/operational-platform.js +94 -0
- package/dist/lib/server/operational-platform.js.map +1 -0
- package/dist/lib/server/test-controller.d.ts +2 -0
- package/dist/lib/server/test-controller.d.ts.map +1 -1
- package/dist/lib/server/test-controller.js +6 -11
- package/dist/lib/server/test-controller.js.map +1 -1
- package/dist/lib/server/wire-safe.d.ts +211 -0
- package/dist/lib/server/wire-safe.d.ts.map +1 -0
- package/dist/lib/server/wire-safe.js +231 -0
- package/dist/lib/server/wire-safe.js.map +1 -0
- package/dist/lib/server/wire-spec-fields.generated.d.ts +168 -0
- package/dist/lib/server/wire-spec-fields.generated.d.ts.map +1 -0
- package/dist/lib/server/wire-spec-fields.generated.js +172 -0
- package/dist/lib/server/wire-spec-fields.generated.js.map +1 -0
- package/dist/lib/testing/compliance/index.d.ts +2 -0
- package/dist/lib/testing/compliance/index.d.ts.map +1 -1
- package/dist/lib/testing/compliance/index.js +6 -1
- package/dist/lib/testing/compliance/index.js.map +1 -1
- package/dist/lib/testing/compliance/summary.d.ts +77 -0
- package/dist/lib/testing/compliance/summary.d.ts.map +1 -0
- package/dist/lib/testing/compliance/summary.js +176 -0
- package/dist/lib/testing/compliance/summary.js.map +1 -0
- package/dist/lib/testing/comply-controller.d.ts +2 -0
- package/dist/lib/testing/comply-controller.d.ts.map +1 -1
- package/dist/lib/testing/comply-controller.js.map +1 -1
- package/dist/lib/testing/storyboard/compliance.d.ts +26 -0
- package/dist/lib/testing/storyboard/compliance.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/compliance.js +51 -0
- package/dist/lib/testing/storyboard/compliance.js.map +1 -1
- package/dist/lib/testing/storyboard/index.d.ts +2 -2
- package/dist/lib/testing/storyboard/index.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/index.js +4 -2
- package/dist/lib/testing/storyboard/index.js.map +1 -1
- package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/runner.js +58 -5
- package/dist/lib/testing/storyboard/runner.js.map +1 -1
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.d.ts.map +1 -1
- package/dist/lib/version.js +3 -3
- package/dist/lib/version.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,769 @@
|
|
|
1
|
+
id: media_buy_seller
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Media buy seller agent"
|
|
4
|
+
category: media_buy_seller
|
|
5
|
+
summary: "Seller agent that receives briefs, returns products, accepts media buys, and reports delivery."
|
|
6
|
+
track: media_buy
|
|
7
|
+
required_tools:
|
|
8
|
+
- get_products
|
|
9
|
+
- create_media_buy
|
|
10
|
+
requires_scenarios:
|
|
11
|
+
- media_buy_seller/refine_products
|
|
12
|
+
- media_buy_seller/delivery_reporting
|
|
13
|
+
- media_buy_seller/measurement_terms_rejected
|
|
14
|
+
- media_buy_seller/pending_creatives_to_start
|
|
15
|
+
- media_buy_seller/inventory_list_targeting
|
|
16
|
+
- media_buy_seller/inventory_list_no_match
|
|
17
|
+
- media_buy_seller/invalid_transitions
|
|
18
|
+
- media_buy_seller/creative_fate_after_cancellation
|
|
19
|
+
- media_buy_seller/create_media_buy_async
|
|
20
|
+
|
|
21
|
+
narrative: |
|
|
22
|
+
You run a sell-side platform — a publisher, SSP, retail media network, or any system that
|
|
23
|
+
sells advertising inventory. A buyer agent connects to discover your products, create
|
|
24
|
+
media buys, sync creatives, and monitor delivery. Your agent handles the full lifecycle
|
|
25
|
+
from brief to reporting.
|
|
26
|
+
|
|
27
|
+
This storyboard walks through the core media buy flow: account setup, product discovery,
|
|
28
|
+
buy creation, creative sync, and delivery monitoring.
|
|
29
|
+
|
|
30
|
+
Governance integration, product refinement, and proposal finalization are tested by
|
|
31
|
+
required scenarios that run alongside this storyboard. See requires_scenarios for the
|
|
32
|
+
full set of seller behaviors validated.
|
|
33
|
+
|
|
34
|
+
agent:
|
|
35
|
+
interaction_model: media_buy_seller
|
|
36
|
+
capabilities:
|
|
37
|
+
- sells_media
|
|
38
|
+
- accepts_briefs
|
|
39
|
+
- supports_guaranteed
|
|
40
|
+
- supports_non_guaranteed
|
|
41
|
+
examples:
|
|
42
|
+
- "Yahoo"
|
|
43
|
+
- "Retail media networks"
|
|
44
|
+
- "Publisher platforms"
|
|
45
|
+
- "SSPs"
|
|
46
|
+
|
|
47
|
+
caller:
|
|
48
|
+
role: buyer_agent
|
|
49
|
+
example: "Scope3 (DSP)"
|
|
50
|
+
|
|
51
|
+
prerequisites:
|
|
52
|
+
description: |
|
|
53
|
+
The caller needs a brand identity and operator credentials for account setup.
|
|
54
|
+
The test kit provides a sample brand (Acme Outdoor) with campaign parameters
|
|
55
|
+
suitable for testing the full media buy flow.
|
|
56
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
57
|
+
controller_seeding: true
|
|
58
|
+
|
|
59
|
+
fixtures:
|
|
60
|
+
products:
|
|
61
|
+
- product_id: "sports_preroll_q2"
|
|
62
|
+
delivery_type: "guaranteed"
|
|
63
|
+
channels: ["video"]
|
|
64
|
+
format_ids:
|
|
65
|
+
- id: "video_30s"
|
|
66
|
+
- product_id: "lifestyle_display_q2"
|
|
67
|
+
delivery_type: "guaranteed"
|
|
68
|
+
channels: ["display"]
|
|
69
|
+
format_ids:
|
|
70
|
+
- id: "display_300x250"
|
|
71
|
+
pricing_options:
|
|
72
|
+
- product_id: "sports_preroll_q2"
|
|
73
|
+
pricing_option_id: "cpm_guaranteed"
|
|
74
|
+
pricing_model: "cpm"
|
|
75
|
+
currency: "USD"
|
|
76
|
+
fixed_price: 22.0
|
|
77
|
+
- product_id: "lifestyle_display_q2"
|
|
78
|
+
pricing_option_id: "cpm_standard"
|
|
79
|
+
pricing_model: "cpm"
|
|
80
|
+
currency: "USD"
|
|
81
|
+
fixed_price: 8.0
|
|
82
|
+
|
|
83
|
+
phases:
|
|
84
|
+
- id: capability_discovery
|
|
85
|
+
title: "Capability discovery"
|
|
86
|
+
narrative: |
|
|
87
|
+
The buyer calls get_adcp_capabilities to confirm the agent supports media buying before sending briefs or creating buys.
|
|
88
|
+
|
|
89
|
+
steps:
|
|
90
|
+
- id: get_capabilities
|
|
91
|
+
title: "Check agent capabilities"
|
|
92
|
+
narrative: |
|
|
93
|
+
Verify that the agent declares the expected protocol support before
|
|
94
|
+
proceeding with domain-specific operations.
|
|
95
|
+
task: get_adcp_capabilities
|
|
96
|
+
schema_ref: "protocol/get-adcp-capabilities-request.json"
|
|
97
|
+
response_schema_ref: "protocol/get-adcp-capabilities-response.json"
|
|
98
|
+
doc_ref: "/protocol/get_adcp_capabilities"
|
|
99
|
+
comply_scenario: capability_discovery
|
|
100
|
+
stateful: false
|
|
101
|
+
expected: |
|
|
102
|
+
Return capabilities declaring media_buy in supported_protocols, confirming the agent sells media.
|
|
103
|
+
sample_request:
|
|
104
|
+
context:
|
|
105
|
+
correlation_id: "media_buy_seller--get_capabilities"
|
|
106
|
+
validations:
|
|
107
|
+
- check: response_schema
|
|
108
|
+
description: "Response matches get-adcp-capabilities-response.json schema"
|
|
109
|
+
- check: field_present
|
|
110
|
+
path: "supported_protocols"
|
|
111
|
+
description: "Agent declares supported protocols"
|
|
112
|
+
- check: field_present
|
|
113
|
+
path: "context"
|
|
114
|
+
description: "Response echoes back the context object"
|
|
115
|
+
- check: field_value
|
|
116
|
+
path: "context.correlation_id"
|
|
117
|
+
value: "media_buy_seller--get_capabilities"
|
|
118
|
+
description: "Context correlation_id returned unchanged"
|
|
119
|
+
|
|
120
|
+
- id: account_setup
|
|
121
|
+
title: "Account setup"
|
|
122
|
+
narrative: |
|
|
123
|
+
Before buying anything, the buyer establishes an account relationship with
|
|
124
|
+
your platform. This is the handshake: the buyer tells you which brand and
|
|
125
|
+
agency (operator) they represent, and you return an account ID, status, and
|
|
126
|
+
any setup requirements.
|
|
127
|
+
|
|
128
|
+
Some platforms approve accounts instantly. Others require human review — the
|
|
129
|
+
buyer gets back a pending_approval status and a URL to complete setup. The
|
|
130
|
+
buyer polls or waits for a webhook until the account is active.
|
|
131
|
+
|
|
132
|
+
steps:
|
|
133
|
+
- id: sync_accounts
|
|
134
|
+
title: "Establish account relationship"
|
|
135
|
+
narrative: |
|
|
136
|
+
The buyer registers their brand and operator with your platform. This is
|
|
137
|
+
the first call in any new relationship. Your platform validates the request,
|
|
138
|
+
provisions the account, and returns its status.
|
|
139
|
+
|
|
140
|
+
If your platform requires manual approval (credit checks, sales team review),
|
|
141
|
+
return the account with status pending_approval and account.setup.url populated.
|
|
142
|
+
The buyer directs the human to that URL to complete setup, then polls list_accounts
|
|
143
|
+
until the account status changes to active.
|
|
144
|
+
task: sync_accounts
|
|
145
|
+
schema_ref: "account/sync-accounts-request.json"
|
|
146
|
+
response_schema_ref: "account/sync-accounts-response.json"
|
|
147
|
+
doc_ref: "/accounts/tasks/sync_accounts"
|
|
148
|
+
# No TestScenario exists for account setup
|
|
149
|
+
stateful: true
|
|
150
|
+
expected: |
|
|
151
|
+
Return the account with:
|
|
152
|
+
- account_id: your platform's identifier for this relationship
|
|
153
|
+
- action: created or updated
|
|
154
|
+
- status: active (instant approval) or pending_approval (requires human review)
|
|
155
|
+
- account_scope: operator, brand, operator_brand, or agent
|
|
156
|
+
- setup.url and setup.message: populated on the account when status is pending_approval (where the human completes onboarding)
|
|
157
|
+
- rate_card: pricing tiers if applicable
|
|
158
|
+
- payment_terms: net_30, prepay, etc.
|
|
159
|
+
|
|
160
|
+
sample_request:
|
|
161
|
+
accounts:
|
|
162
|
+
- brand:
|
|
163
|
+
domain: "acmeoutdoor.example"
|
|
164
|
+
operator: "pinnacle-agency.example"
|
|
165
|
+
billing: "operator"
|
|
166
|
+
payment_terms: "net_30"
|
|
167
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_account_setup_sync_accounts"
|
|
168
|
+
context:
|
|
169
|
+
correlation_id: "media_buy_seller--sync_accounts"
|
|
170
|
+
|
|
171
|
+
validations:
|
|
172
|
+
- check: response_schema
|
|
173
|
+
description: "Response matches sync-accounts-response.json schema"
|
|
174
|
+
- check: field_present
|
|
175
|
+
path: "accounts[0].account_id"
|
|
176
|
+
description: "Account has a platform-assigned ID"
|
|
177
|
+
- check: field_present
|
|
178
|
+
path: "accounts[0].status"
|
|
179
|
+
description: "Account has a status (active or pending_approval)"
|
|
180
|
+
- check: field_present
|
|
181
|
+
path: "context"
|
|
182
|
+
description: "Response echoes back the context object"
|
|
183
|
+
- check: field_value
|
|
184
|
+
path: "context.correlation_id"
|
|
185
|
+
value: "media_buy_seller--sync_accounts"
|
|
186
|
+
description: "Context correlation_id returned unchanged"
|
|
187
|
+
|
|
188
|
+
- id: governance_setup
|
|
189
|
+
title: "Governance agent registration"
|
|
190
|
+
narrative: |
|
|
191
|
+
The buyer registers their governance agent with your platform. This tells your
|
|
192
|
+
platform where to call check_governance before confirming media buys.
|
|
193
|
+
|
|
194
|
+
steps:
|
|
195
|
+
- id: sync_governance
|
|
196
|
+
title: "Register governance agents"
|
|
197
|
+
narrative: |
|
|
198
|
+
The buyer tells your platform: "Before you confirm any media buy for this
|
|
199
|
+
account, call this governance agent to validate it."
|
|
200
|
+
task: sync_governance
|
|
201
|
+
schema_ref: "account/sync-governance-request.json"
|
|
202
|
+
response_schema_ref: "account/sync-governance-response.json"
|
|
203
|
+
doc_ref: "/accounts/tasks/sync_governance"
|
|
204
|
+
requires_tool: sync_governance
|
|
205
|
+
stateful: true
|
|
206
|
+
expected: |
|
|
207
|
+
Acknowledge the governance agents. Your platform should:
|
|
208
|
+
- Store the governance agent URLs for the specified accounts
|
|
209
|
+
- Return confirmation that agents were registered
|
|
210
|
+
|
|
211
|
+
sample_request:
|
|
212
|
+
accounts:
|
|
213
|
+
- account:
|
|
214
|
+
brand:
|
|
215
|
+
domain: "acmeoutdoor.example"
|
|
216
|
+
operator: "pinnacle-agency.example"
|
|
217
|
+
governance_agents:
|
|
218
|
+
- url: "https://governance.pinnacle-agency.example"
|
|
219
|
+
authentication:
|
|
220
|
+
schemes: ["Bearer"]
|
|
221
|
+
credentials: "gov-token-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
|
|
222
|
+
categories: ["budget_authority", "brand_policy"]
|
|
223
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_governance_setup_sync_governance"
|
|
224
|
+
context:
|
|
225
|
+
correlation_id: "media_buy_seller--sync_governance"
|
|
226
|
+
ext:
|
|
227
|
+
test_platform:
|
|
228
|
+
governance_tier: "standard"
|
|
229
|
+
|
|
230
|
+
validations:
|
|
231
|
+
- check: response_schema
|
|
232
|
+
description: "Response matches sync-governance-response.json schema"
|
|
233
|
+
- check: field_present
|
|
234
|
+
path: "context"
|
|
235
|
+
description: "Response echoes back the context object"
|
|
236
|
+
- check: field_value
|
|
237
|
+
path: "context.correlation_id"
|
|
238
|
+
value: "media_buy_seller--sync_governance"
|
|
239
|
+
description: "Context correlation_id returned unchanged"
|
|
240
|
+
|
|
241
|
+
- id: product_discovery
|
|
242
|
+
title: "Product discovery"
|
|
243
|
+
narrative: |
|
|
244
|
+
The buyer sends a natural-language brief describing what they want to buy.
|
|
245
|
+
Your platform interprets the brief against your inventory and returns products —
|
|
246
|
+
structured representations of what you can sell, with pricing, delivery forecasts,
|
|
247
|
+
targeting options, and creative requirements.
|
|
248
|
+
|
|
249
|
+
This is where seller differentiation happens. The same brief sent to three sellers
|
|
250
|
+
produces three different product sets. Your AI interprets "premium video on sports
|
|
251
|
+
and outdoor lifestyle" against your specific inventory, audiences, and pricing.
|
|
252
|
+
|
|
253
|
+
steps:
|
|
254
|
+
- id: get_products_brief
|
|
255
|
+
title: "Send a brief"
|
|
256
|
+
narrative: |
|
|
257
|
+
The buyer describes what they want in natural language. Your platform returns
|
|
258
|
+
products that match the brief, including pricing options, delivery forecasts,
|
|
259
|
+
and creative format requirements.
|
|
260
|
+
|
|
261
|
+
This call may take up to 60 seconds — your platform is running AI inference
|
|
262
|
+
against your inventory catalog. If the brief is ambiguous, you can return
|
|
263
|
+
input-required to ask clarifying questions before producing results.
|
|
264
|
+
task: get_products
|
|
265
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
266
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
267
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
268
|
+
comply_scenario: full_sales_flow
|
|
269
|
+
stateful: false
|
|
270
|
+
expected: |
|
|
271
|
+
Return products matching the brief. Each product should include:
|
|
272
|
+
- product_id: unique identifier
|
|
273
|
+
- name and description
|
|
274
|
+
- delivery_type: guaranteed or non_guaranteed
|
|
275
|
+
- pricing_models: available pricing options (CPM, CPC, etc.)
|
|
276
|
+
- forecast: estimated impressions, reach
|
|
277
|
+
- creative_format_ids: what creative formats this product requires
|
|
278
|
+
- targeting: what audiences or contexts this product reaches
|
|
279
|
+
|
|
280
|
+
Optionally return proposals — curated media plans that bundle products
|
|
281
|
+
with budget allocations the buyer can accept or refine.
|
|
282
|
+
|
|
283
|
+
If the brief is unclear, return input-required with clarifying questions.
|
|
284
|
+
|
|
285
|
+
sample_request:
|
|
286
|
+
buying_mode: "brief"
|
|
287
|
+
brief: "Premium video inventory on sports and outdoor lifestyle publishers. Q2 flight, $50K budget. Adults 25-54, US and Canada."
|
|
288
|
+
account:
|
|
289
|
+
brand:
|
|
290
|
+
domain: "acmeoutdoor.example"
|
|
291
|
+
operator: "pinnacle-agency.example"
|
|
292
|
+
context:
|
|
293
|
+
correlation_id: "media_buy_seller--get_products_brief"
|
|
294
|
+
|
|
295
|
+
context_outputs:
|
|
296
|
+
- name: product_format_id
|
|
297
|
+
path: 'products[0].format_ids[0]'
|
|
298
|
+
- name: product_id
|
|
299
|
+
path: 'products[0].product_id'
|
|
300
|
+
- name: pricing_option_id
|
|
301
|
+
path: 'products[0].pricing_options[0].pricing_option_id'
|
|
302
|
+
validations:
|
|
303
|
+
- check: response_schema
|
|
304
|
+
description: "Response matches get-products-response.json schema"
|
|
305
|
+
- check: field_present
|
|
306
|
+
path: "products"
|
|
307
|
+
description: "Response contains a products array"
|
|
308
|
+
- check: field_present
|
|
309
|
+
path: "products[0].product_id"
|
|
310
|
+
description: "Each product has a product_id"
|
|
311
|
+
- check: field_present
|
|
312
|
+
path: "products[0].delivery_type"
|
|
313
|
+
description: "Each product declares guaranteed or non_guaranteed delivery"
|
|
314
|
+
- check: field_present
|
|
315
|
+
path: "products[0].format_ids"
|
|
316
|
+
description: "Products include format_ids for creative requirements"
|
|
317
|
+
- check: field_present
|
|
318
|
+
path: "products[0].format_ids[0].agent_url"
|
|
319
|
+
description: "Format IDs include agent_url — must match this agent's URL"
|
|
320
|
+
- check: field_present
|
|
321
|
+
path: "products[0].format_ids[0].id"
|
|
322
|
+
description: "Format IDs include id — must be accepted back in sync_creatives"
|
|
323
|
+
- check: field_present
|
|
324
|
+
path: "context"
|
|
325
|
+
description: "Response echoes back the context object"
|
|
326
|
+
- check: field_value
|
|
327
|
+
path: "context.correlation_id"
|
|
328
|
+
value: "media_buy_seller--get_products_brief"
|
|
329
|
+
description: "Context correlation_id returned unchanged"
|
|
330
|
+
|
|
331
|
+
- check: field_present
|
|
332
|
+
path: "products[0].publisher_properties"
|
|
333
|
+
description: "Products include publisher_properties"
|
|
334
|
+
- id: list_formats_integrity
|
|
335
|
+
title: "Verify format_ids on products resolve to real formats"
|
|
336
|
+
narrative: |
|
|
337
|
+
The buyer asks the sales agent to filter `list_creative_formats` by
|
|
338
|
+
`products[0].format_ids[0]`. The sales agent MUST return the format
|
|
339
|
+
it advertised on its own product — whether it hosts that format
|
|
340
|
+
directly or proxies to the creative agent named in
|
|
341
|
+
`format_ids[0].agent_url`. An empty `formats[]` means the sales
|
|
342
|
+
agent's product catalog references a format that does not resolve —
|
|
343
|
+
a stale or typo'd entry that would have failed silently at
|
|
344
|
+
`sync_creatives` after the media buy was already committed.
|
|
345
|
+
task: list_creative_formats
|
|
346
|
+
schema_ref: "creative/list-creative-formats-request.json"
|
|
347
|
+
response_schema_ref: "creative/list-creative-formats-response.json"
|
|
348
|
+
doc_ref: "/creative/task-reference/list_creative_formats"
|
|
349
|
+
comply_scenario: creative_lifecycle
|
|
350
|
+
stateful: false
|
|
351
|
+
expected: |
|
|
352
|
+
The sales agent resolves `products[0].format_ids[0]` and returns
|
|
353
|
+
the matching format entry:
|
|
354
|
+
- formats[] contains at least one entry
|
|
355
|
+
- formats[0].format_id matches the id captured from get_products
|
|
356
|
+
|
|
357
|
+
An empty formats[] means the sales agent's product catalog references
|
|
358
|
+
a format that does not resolve — a common production failure mode
|
|
359
|
+
when creative agents deprecate formats without sellers updating
|
|
360
|
+
their product catalog.
|
|
361
|
+
sample_request:
|
|
362
|
+
format_ids:
|
|
363
|
+
- "$context.product_format_id"
|
|
364
|
+
context:
|
|
365
|
+
correlation_id: "media_buy_seller--list_formats_integrity"
|
|
366
|
+
# The @adcp/client `list_creative_formats` request builder up
|
|
367
|
+
# through 5.10.0 (the currently-published release) returns `{}`,
|
|
368
|
+
# and the runner's post-builder merge only forwards envelope
|
|
369
|
+
# fields (context / ext / idempotency_key /
|
|
370
|
+
# push_notification_config) from sample_request — so `format_ids`
|
|
371
|
+
# above never reaches the wire and the seller answers with its
|
|
372
|
+
# full format catalog. `context_inputs` is applied after the
|
|
373
|
+
# builder runs, so this injects the captured `product_format_id`
|
|
374
|
+
# (the `{agent_url, id}` object from `products[0].format_ids[0]`)
|
|
375
|
+
# at `format_ids[0]` and lets the round-trip invariant actually
|
|
376
|
+
# grade. Drop once we bump past the @adcp/client release that
|
|
377
|
+
# ships adcontextprotocol/adcp-client#789.
|
|
378
|
+
context_inputs:
|
|
379
|
+
- key: product_format_id
|
|
380
|
+
inject_at: "format_ids[0]"
|
|
381
|
+
validations:
|
|
382
|
+
- check: response_schema
|
|
383
|
+
description: "Response matches list-creative-formats-response.json schema"
|
|
384
|
+
- check: field_present
|
|
385
|
+
path: "formats[0]"
|
|
386
|
+
description: "Sales agent resolves the format_id — products[0].format_ids[0] exists in the catalog"
|
|
387
|
+
- check: field_value
|
|
388
|
+
path: "formats[0].format_id"
|
|
389
|
+
value: "$context.product_format_id"
|
|
390
|
+
description: "Returned format_id round-trips verbatim — the agent cannot substitute a different format in response to the filter"
|
|
391
|
+
- check: field_present
|
|
392
|
+
path: "context"
|
|
393
|
+
description: "Response echoes back the context object"
|
|
394
|
+
- check: field_value
|
|
395
|
+
path: "context.correlation_id"
|
|
396
|
+
value: "media_buy_seller--list_formats_integrity"
|
|
397
|
+
description: "Context correlation_id returned unchanged"
|
|
398
|
+
- id: create_buy
|
|
399
|
+
title: "Create the media buy"
|
|
400
|
+
narrative: |
|
|
401
|
+
The buyer is satisfied with the products and creates a media buy. This is the
|
|
402
|
+
equivalent of signing an IO — the buyer commits to specific products, budgets,
|
|
403
|
+
and flight dates.
|
|
404
|
+
|
|
405
|
+
This operation may be synchronous (completed immediately), short-async (working
|
|
406
|
+
while your platform processes), or long-async (task stays submitted while a human
|
|
407
|
+
signs the IO internally; task completion delivers the final media_buy_id). There
|
|
408
|
+
is no "pending_approval" media buy status — IO review is modelled at the task
|
|
409
|
+
layer, not as a MediaBuy.status value.
|
|
410
|
+
|
|
411
|
+
If the buyer registered governance agents in Phase 2, your platform calls
|
|
412
|
+
check_governance before confirming the buy. The governance agent validates budget
|
|
413
|
+
authority, brand safety, and compliance. If governance denies the buy, return the
|
|
414
|
+
denial — don't override it.
|
|
415
|
+
|
|
416
|
+
steps:
|
|
417
|
+
- id: create_media_buy
|
|
418
|
+
title: "Create a media buy"
|
|
419
|
+
narrative: |
|
|
420
|
+
The buyer commits to specific products with budgets and flight dates. Your
|
|
421
|
+
platform validates the request, optionally calls governance, and either confirms
|
|
422
|
+
the buy or sends it through an approval workflow.
|
|
423
|
+
|
|
424
|
+
Two creation modes:
|
|
425
|
+
- Manual: buyer specifies packages array with explicit product selections
|
|
426
|
+
- Proposal: buyer passes a proposal_id from get_products to execute a proposal
|
|
427
|
+
|
|
428
|
+
The response status tells the buyer what happens next:
|
|
429
|
+
- completed: buy is active and live
|
|
430
|
+
- working: your platform is processing (poll or wait for webhook)
|
|
431
|
+
- submitted: long-running async — approval workflow, IO signing, etc.
|
|
432
|
+
- input-required: need more information (budget clarification, approval)
|
|
433
|
+
task: create_media_buy
|
|
434
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
435
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
436
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
437
|
+
comply_scenario: create_media_buy
|
|
438
|
+
stateful: true
|
|
439
|
+
expected: |
|
|
440
|
+
Process the media buy request and return one of:
|
|
441
|
+
|
|
442
|
+
Synchronous (completed):
|
|
443
|
+
- media_buy_id: your platform's identifier
|
|
444
|
+
- status: active or pending_creatives
|
|
445
|
+
- packages: line items with pricing
|
|
446
|
+
- confirmed_at: timestamp
|
|
447
|
+
- valid_actions: what the buyer can do next
|
|
448
|
+
|
|
449
|
+
Asynchronous (working):
|
|
450
|
+
- percentage: 0-100 completion
|
|
451
|
+
- current_step: what's happening ("Validating inventory", "Checking governance")
|
|
452
|
+
|
|
453
|
+
Async with human approval (submitted):
|
|
454
|
+
- task_id / taskId: handle the buyer polls or receives webhooks on
|
|
455
|
+
- message (optional): explanation of what the seller is waiting on (e.g., "Awaiting IO signature from sales team; typical turnaround 2–4 hours")
|
|
456
|
+
- No media_buy_id yet — it is issued on task completion
|
|
457
|
+
- Seller-side IO signing is modelled here (task stays submitted until signed). Do not emit a "pending_approval" media buy status — that value is not in MediaBuy.status
|
|
458
|
+
|
|
459
|
+
Needs input (input-required):
|
|
460
|
+
- reason: APPROVAL_REQUIRED, BUDGET_EXCEEDS_LIMIT, CLARIFICATION_NEEDED
|
|
461
|
+
- errors: what needs to be resolved
|
|
462
|
+
- Used only when the seller needs the buyer to respond (e.g., confirm a budget). If the blocker is account-level (credit application, funding), the resolution path is list_accounts / sync_accounts, where account.setup.url surfaces on the pending_approval account
|
|
463
|
+
|
|
464
|
+
sample_request:
|
|
465
|
+
brand:
|
|
466
|
+
domain: "acmeoutdoor.example"
|
|
467
|
+
account:
|
|
468
|
+
brand:
|
|
469
|
+
domain: "acmeoutdoor.example"
|
|
470
|
+
operator: "pinnacle-agency.example"
|
|
471
|
+
sandbox: true
|
|
472
|
+
start_time: "2026-04-01T00:00:00Z"
|
|
473
|
+
end_time: "2026-06-30T23:59:59Z"
|
|
474
|
+
packages:
|
|
475
|
+
- product_id: "sports_preroll_q2"
|
|
476
|
+
budget: 25000
|
|
477
|
+
pricing_option_id: "cpm_guaranteed"
|
|
478
|
+
creative_assignments:
|
|
479
|
+
- creative_id: "video_30s_trail_pro"
|
|
480
|
+
- product_id: "lifestyle_display_q2"
|
|
481
|
+
budget: 15000
|
|
482
|
+
pricing_option_id: "cpm_standard"
|
|
483
|
+
push_notification_config:
|
|
484
|
+
url: "https://buyer.example/webhooks/adcp"
|
|
485
|
+
authentication:
|
|
486
|
+
schemes:
|
|
487
|
+
- "HMAC-SHA256"
|
|
488
|
+
credentials: "media-buy-seller-webhook-secret-token"
|
|
489
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_create_buy_create_media_buy"
|
|
490
|
+
context:
|
|
491
|
+
correlation_id: "media_buy_seller--create_media_buy"
|
|
492
|
+
|
|
493
|
+
context_outputs:
|
|
494
|
+
- name: media_buy_id
|
|
495
|
+
path: 'media_buy_id'
|
|
496
|
+
validations:
|
|
497
|
+
- check: response_schema
|
|
498
|
+
description: "Response matches create-media-buy-response.json schema"
|
|
499
|
+
- check: field_present
|
|
500
|
+
path: "context"
|
|
501
|
+
description: "Response echoes back the context object"
|
|
502
|
+
- check: field_value
|
|
503
|
+
path: "context.correlation_id"
|
|
504
|
+
value: "media_buy_seller--create_media_buy"
|
|
505
|
+
description: "Context correlation_id returned unchanged"
|
|
506
|
+
|
|
507
|
+
- id: check_buy_status
|
|
508
|
+
title: "Check media buy status"
|
|
509
|
+
narrative: |
|
|
510
|
+
Once create_media_buy has completed and a media_buy_id is issued, the buyer
|
|
511
|
+
calls get_media_buys to read current state — pending_creatives, pending_start,
|
|
512
|
+
active, paused, completed, rejected, or canceled.
|
|
513
|
+
|
|
514
|
+
While the create_media_buy task is still submitted (e.g., waiting on internal
|
|
515
|
+
IO signing), the media buy does not exist as a queryable MediaBuy yet. IO
|
|
516
|
+
review is tracked at the task layer, not as a MediaBuy.status value. The buyer
|
|
517
|
+
polls tasks/get or waits on the webhook until the task completes and a
|
|
518
|
+
media_buy_id is delivered.
|
|
519
|
+
task: get_media_buys
|
|
520
|
+
schema_ref: "media-buy/get-media-buys-request.json"
|
|
521
|
+
response_schema_ref: "media-buy/get-media-buys-response.json"
|
|
522
|
+
doc_ref: "/media-buy/task-reference/get_media_buys"
|
|
523
|
+
comply_scenario: media_buy_lifecycle
|
|
524
|
+
stateful: true
|
|
525
|
+
expected: |
|
|
526
|
+
Return the current state of the media buy:
|
|
527
|
+
- media_buy_id: matches what was returned from create_media_buy
|
|
528
|
+
- status: pending_creatives, pending_start, active, paused, completed, rejected, canceled
|
|
529
|
+
- packages: line items with current delivery status
|
|
530
|
+
- valid_actions: what operations are available in this state
|
|
531
|
+
|
|
532
|
+
If pending_creatives:
|
|
533
|
+
- Include message explaining what creatives are needed
|
|
534
|
+
- valid_actions should include sync_creatives
|
|
535
|
+
|
|
536
|
+
sample_request:
|
|
537
|
+
account:
|
|
538
|
+
brand:
|
|
539
|
+
domain: "acmeoutdoor.example"
|
|
540
|
+
operator: "pinnacle-agency.example"
|
|
541
|
+
media_buy_ids:
|
|
542
|
+
- "$context.media_buy_id"
|
|
543
|
+
context:
|
|
544
|
+
correlation_id: "media_buy_seller--check_buy_status"
|
|
545
|
+
|
|
546
|
+
validations:
|
|
547
|
+
- check: response_schema
|
|
548
|
+
description: "Response matches get-media-buys-response.json schema"
|
|
549
|
+
- check: field_present
|
|
550
|
+
path: "media_buys[0].status"
|
|
551
|
+
description: "Each media buy has a status"
|
|
552
|
+
- check: field_present
|
|
553
|
+
path: "context"
|
|
554
|
+
description: "Response echoes back the context object"
|
|
555
|
+
- check: field_value
|
|
556
|
+
path: "context.correlation_id"
|
|
557
|
+
value: "media_buy_seller--check_buy_status"
|
|
558
|
+
description: "Context correlation_id returned unchanged"
|
|
559
|
+
|
|
560
|
+
- id: creative_sync
|
|
561
|
+
title: "Creative sync"
|
|
562
|
+
narrative: |
|
|
563
|
+
With the media buy confirmed, the buyer syncs creative assets to your platform.
|
|
564
|
+
Each package in the buy has creative format requirements — the buyer discovered
|
|
565
|
+
these during product discovery and now pushes matching assets.
|
|
566
|
+
|
|
567
|
+
The format_ids used in sync_creatives must match those returned by your platform
|
|
568
|
+
in get_products and list_creative_formats. If your platform returns a format_id
|
|
569
|
+
in a product but rejects it when the buyer echoes it back in sync_creatives, the
|
|
570
|
+
buyer cannot fulfill the creative requirements. This is a common compliance failure.
|
|
571
|
+
|
|
572
|
+
Your platform validates each creative against the format specs and returns
|
|
573
|
+
per-creative status. If assets need review or transcoding, the operation may
|
|
574
|
+
go async.
|
|
575
|
+
|
|
576
|
+
steps:
|
|
577
|
+
- id: list_formats
|
|
578
|
+
title: "Check creative format requirements"
|
|
579
|
+
narrative: |
|
|
580
|
+
The buyer confirms what creative formats the confirmed packages require.
|
|
581
|
+
Your platform returns format specs with asset requirements, dimensions,
|
|
582
|
+
and constraints.
|
|
583
|
+
task: list_creative_formats
|
|
584
|
+
schema_ref: "creative/list-creative-formats-request.json"
|
|
585
|
+
response_schema_ref: "creative/list-creative-formats-response.json"
|
|
586
|
+
doc_ref: "/creative/task-reference/list_creative_formats"
|
|
587
|
+
comply_scenario: creative_lifecycle
|
|
588
|
+
stateful: false
|
|
589
|
+
expected: |
|
|
590
|
+
Return creative formats your platform accepts. Each format should define:
|
|
591
|
+
- format_id with your agent_url and unique id
|
|
592
|
+
- Asset requirements (dimensions, file sizes, mime types)
|
|
593
|
+
- Render dimensions
|
|
594
|
+
|
|
595
|
+
sample_request:
|
|
596
|
+
context:
|
|
597
|
+
correlation_id: "media_buy_seller--list_formats"
|
|
598
|
+
|
|
599
|
+
validations:
|
|
600
|
+
- check: response_schema
|
|
601
|
+
description: "Response matches list-creative-formats-response.json schema"
|
|
602
|
+
- check: field_present
|
|
603
|
+
path: "formats"
|
|
604
|
+
description: "Response contains formats array"
|
|
605
|
+
- check: field_present
|
|
606
|
+
path: "formats[0].format_id.agent_url"
|
|
607
|
+
description: "Format IDs include agent_url"
|
|
608
|
+
- check: field_present
|
|
609
|
+
path: "formats[0].format_id.id"
|
|
610
|
+
description: "Format IDs include id — must match those in get_products"
|
|
611
|
+
- check: field_present
|
|
612
|
+
path: "context"
|
|
613
|
+
description: "Response echoes back the context object"
|
|
614
|
+
- check: field_value
|
|
615
|
+
path: "context.correlation_id"
|
|
616
|
+
value: "media_buy_seller--list_formats"
|
|
617
|
+
description: "Context correlation_id returned unchanged"
|
|
618
|
+
- check: refs_resolve
|
|
619
|
+
description: |
|
|
620
|
+
Every format_id returned on products resolves to a format in this
|
|
621
|
+
agent's list_creative_formats. Broken references here surface as a
|
|
622
|
+
grading failure instead of a silent mismatch that only breaks at
|
|
623
|
+
sync_creatives time, after the buy is committed. Third-party
|
|
624
|
+
format_ids (agent_url pointing at a different creative agent)
|
|
625
|
+
can't be verified without calling that agent and are reported as
|
|
626
|
+
observations rather than failures.
|
|
627
|
+
source:
|
|
628
|
+
from: context
|
|
629
|
+
path: "products[*].format_ids[*]"
|
|
630
|
+
target:
|
|
631
|
+
from: current_step
|
|
632
|
+
path: "formats[*].format_id"
|
|
633
|
+
match_keys: [agent_url, id]
|
|
634
|
+
scope:
|
|
635
|
+
key: agent_url
|
|
636
|
+
equals: $agent_url
|
|
637
|
+
on_out_of_scope: warn
|
|
638
|
+
|
|
639
|
+
- id: sync_creatives
|
|
640
|
+
title: "Push creative assets (format_id roundtrip)"
|
|
641
|
+
narrative: |
|
|
642
|
+
The buyer uploads creative assets for the confirmed packages. The first
|
|
643
|
+
creative uses $context.product_format_id — the exact format_id object
|
|
644
|
+
returned by get_products. This is the roundtrip test: the seller must
|
|
645
|
+
accept its own format_ids without modification. If the seller's validation
|
|
646
|
+
rejects a format_id that it returned in products, this step fails.
|
|
647
|
+
|
|
648
|
+
Your platform validates each creative against the format specs, transcodes
|
|
649
|
+
if necessary, and returns per-creative status.
|
|
650
|
+
task: sync_creatives
|
|
651
|
+
schema_ref: "creative/sync-creatives-request.json"
|
|
652
|
+
response_schema_ref: "creative/sync-creatives-response.json"
|
|
653
|
+
doc_ref: "/creative/task-reference/sync_creatives"
|
|
654
|
+
comply_scenario: creative_sync
|
|
655
|
+
stateful: true
|
|
656
|
+
expected: |
|
|
657
|
+
Accept and validate creatives:
|
|
658
|
+
- Per-creative action: created or updated
|
|
659
|
+
- Per-creative status: accepted, pending_review, or rejected
|
|
660
|
+
- Validation errors for rejected creatives
|
|
661
|
+
- Platform-assigned IDs if applicable
|
|
662
|
+
|
|
663
|
+
The first creative uses a format_id extracted from get_products.
|
|
664
|
+
If this is rejected, your format_ids do not roundtrip correctly.
|
|
665
|
+
|
|
666
|
+
sample_request:
|
|
667
|
+
account:
|
|
668
|
+
brand:
|
|
669
|
+
domain: "acmeoutdoor.example"
|
|
670
|
+
operator: "pinnacle-agency.example"
|
|
671
|
+
creatives:
|
|
672
|
+
- creative_id: "video_30s_trail_pro"
|
|
673
|
+
name: "Trail Pro 3000 - 30s CTV Spot"
|
|
674
|
+
format_id: "$context.product_format_id"
|
|
675
|
+
assets:
|
|
676
|
+
video:
|
|
677
|
+
asset_type: "video"
|
|
678
|
+
url: "https://cdn.pinnacle-agency.example/trail-pro-30s.mp4"
|
|
679
|
+
width: 1920
|
|
680
|
+
height: 1080
|
|
681
|
+
duration_ms: 30000
|
|
682
|
+
mime_type: "video/mp4"
|
|
683
|
+
- creative_id: "display_trail_pro_300x250"
|
|
684
|
+
name: "Trail Pro 3000 - Display 300x250"
|
|
685
|
+
format_id:
|
|
686
|
+
agent_url: "https://your-platform.example.com"
|
|
687
|
+
id: "display_300x250"
|
|
688
|
+
assets:
|
|
689
|
+
image:
|
|
690
|
+
asset_type: "image"
|
|
691
|
+
url: "https://cdn.pinnacle-agency.example/trail-pro-300x250.png"
|
|
692
|
+
width: 300
|
|
693
|
+
height: 250
|
|
694
|
+
mime_type: "image/png"
|
|
695
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_creative_sync_sync_creatives"
|
|
696
|
+
context:
|
|
697
|
+
correlation_id: "media_buy_seller--sync_creatives"
|
|
698
|
+
|
|
699
|
+
validations:
|
|
700
|
+
- check: response_schema
|
|
701
|
+
description: "Response matches sync-creatives-response.json schema"
|
|
702
|
+
- check: field_present
|
|
703
|
+
path: "creatives[0].action"
|
|
704
|
+
description: "Each creative has an action (created/updated)"
|
|
705
|
+
- check: field_present
|
|
706
|
+
path: "context"
|
|
707
|
+
description: "Response echoes back the context object"
|
|
708
|
+
- check: field_value
|
|
709
|
+
path: "context.correlation_id"
|
|
710
|
+
value: "media_buy_seller--sync_creatives"
|
|
711
|
+
description: "Context correlation_id returned unchanged"
|
|
712
|
+
|
|
713
|
+
- id: delivery_monitoring
|
|
714
|
+
title: "Delivery and reporting"
|
|
715
|
+
narrative: |
|
|
716
|
+
The campaign is live. The buyer monitors delivery through two tasks:
|
|
717
|
+
get_media_buys for status and get_media_buy_delivery for performance metrics.
|
|
718
|
+
|
|
719
|
+
Your platform reports in a standard format — impressions, clicks, spend,
|
|
720
|
+
completion rates — so the buyer can compare delivery across multiple sellers
|
|
721
|
+
in a single view.
|
|
722
|
+
|
|
723
|
+
steps:
|
|
724
|
+
- id: get_delivery
|
|
725
|
+
title: "Check delivery metrics"
|
|
726
|
+
narrative: |
|
|
727
|
+
The buyer requests delivery data for the active media buy. Your platform
|
|
728
|
+
returns performance metrics — impressions, clicks, spend, completion rates —
|
|
729
|
+
broken down by package and optionally by day.
|
|
730
|
+
|
|
731
|
+
This call may take up to 60 seconds as your platform aggregates reporting
|
|
732
|
+
data across delivery systems.
|
|
733
|
+
task: get_media_buy_delivery
|
|
734
|
+
schema_ref: "media-buy/get-media-buy-delivery-request.json"
|
|
735
|
+
response_schema_ref: "media-buy/get-media-buy-delivery-response.json"
|
|
736
|
+
doc_ref: "/media-buy/task-reference/get_media_buy_delivery"
|
|
737
|
+
comply_scenario: reporting_flow
|
|
738
|
+
stateful: true
|
|
739
|
+
expected: |
|
|
740
|
+
Return delivery metrics for the media buy:
|
|
741
|
+
- Per-package delivery: impressions, clicks, spend, completion rates
|
|
742
|
+
- Daily breakdown if requested (include_package_daily_breakdown)
|
|
743
|
+
- Pacing information: on track, ahead, behind
|
|
744
|
+
- Budget utilization: spent vs. committed
|
|
745
|
+
|
|
746
|
+
sample_request:
|
|
747
|
+
account:
|
|
748
|
+
brand:
|
|
749
|
+
domain: "acmeoutdoor.example"
|
|
750
|
+
operator: "pinnacle-agency.example"
|
|
751
|
+
media_buy_ids:
|
|
752
|
+
- "$context.media_buy_id"
|
|
753
|
+
include_package_daily_breakdown: true
|
|
754
|
+
context:
|
|
755
|
+
correlation_id: "media_buy_seller--get_delivery"
|
|
756
|
+
|
|
757
|
+
validations:
|
|
758
|
+
- check: response_schema
|
|
759
|
+
description: "Response matches get-media-buy-delivery-response.json schema"
|
|
760
|
+
- check: field_present
|
|
761
|
+
path: "media_buy_deliveries"
|
|
762
|
+
description: "Response contains media buy delivery data"
|
|
763
|
+
- check: field_present
|
|
764
|
+
path: "context"
|
|
765
|
+
description: "Response echoes back the context object"
|
|
766
|
+
- check: field_value
|
|
767
|
+
path: "context.correlation_id"
|
|
768
|
+
value: "media_buy_seller--get_delivery"
|
|
769
|
+
description: "Context correlation_id returned unchanged"
|