@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,504 @@
|
|
|
1
|
+
id: sales_guaranteed
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Guaranteed media buy with human IO approval"
|
|
4
|
+
protocol: media-buy
|
|
5
|
+
category: sales_guaranteed
|
|
6
|
+
summary: "Seller agent that requires human-in-the-loop IO signing before guaranteed media buys go live."
|
|
7
|
+
track: media_buy
|
|
8
|
+
required_tools:
|
|
9
|
+
- get_products
|
|
10
|
+
- create_media_buy
|
|
11
|
+
requires_scenarios:
|
|
12
|
+
- media_buy_seller/refine_products
|
|
13
|
+
- media_buy_seller/delivery_reporting
|
|
14
|
+
- media_buy_seller/measurement_terms_rejected
|
|
15
|
+
- media_buy_seller/pending_creatives_to_start
|
|
16
|
+
- media_buy_seller/inventory_list_targeting
|
|
17
|
+
- media_buy_seller/inventory_list_no_match
|
|
18
|
+
- media_buy_seller/invalid_transitions
|
|
19
|
+
|
|
20
|
+
# Cross-step assertion (adcp#2664). status.monotonic rejects resource
|
|
21
|
+
# status transitions observed across steps that aren't on the spec
|
|
22
|
+
# lifecycle graph — e.g. active → pending_creatives on a media_buy.
|
|
23
|
+
invariants:
|
|
24
|
+
- status.monotonic
|
|
25
|
+
|
|
26
|
+
narrative: |
|
|
27
|
+
You run a sell-side platform that requires human approval before guaranteed media buys go
|
|
28
|
+
live. When a buyer creates a guaranteed buy, your platform returns an A2A task in the
|
|
29
|
+
submitted state with a task_id — no media_buy_id is issued yet because IO signing may fail.
|
|
30
|
+
A human reviewer on your side reviews the deal terms and signs the IO through your own
|
|
31
|
+
internal workflow.
|
|
32
|
+
|
|
33
|
+
The buyer either polls tasks/get with the task_id or configures a push_notification_config
|
|
34
|
+
webhook to receive a callback when IO signing completes. Only on task completion does your
|
|
35
|
+
platform issue a media_buy_id and the final CreateMediaBuy result; the buyer then calls
|
|
36
|
+
get_media_buys to confirm the buy is active and sync creatives.
|
|
37
|
+
|
|
38
|
+
This storyboard isolates the guaranteed approval path — the async handshake between agent
|
|
39
|
+
automation and human decision-making that makes guaranteed buys work in practice. IO review
|
|
40
|
+
is modelled entirely at the A2A task layer; there is no interim "pending_approval" media buy
|
|
41
|
+
status (that value only exists on Account.status, not MediaBuy.status).
|
|
42
|
+
|
|
43
|
+
agent:
|
|
44
|
+
interaction_model: media_buy_seller
|
|
45
|
+
capabilities:
|
|
46
|
+
- sells_media
|
|
47
|
+
- supports_guaranteed
|
|
48
|
+
- requires_io_approval
|
|
49
|
+
examples:
|
|
50
|
+
- "Premium publisher with IO requirements"
|
|
51
|
+
- "Retail media network with sales approval"
|
|
52
|
+
- "CTV platform with guaranteed deals"
|
|
53
|
+
|
|
54
|
+
caller:
|
|
55
|
+
role: buyer_agent
|
|
56
|
+
example: "Scope3 (DSP)"
|
|
57
|
+
|
|
58
|
+
prerequisites:
|
|
59
|
+
description: |
|
|
60
|
+
The caller needs a brand identity and operator credentials for account setup.
|
|
61
|
+
The test kit provides a sample brand (Acme Outdoor) with campaign parameters
|
|
62
|
+
suitable for testing the guaranteed approval flow.
|
|
63
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
64
|
+
controller_seeding: true
|
|
65
|
+
|
|
66
|
+
fixtures:
|
|
67
|
+
products:
|
|
68
|
+
- product_id: "sports_preroll_q2_guaranteed"
|
|
69
|
+
delivery_type: "guaranteed"
|
|
70
|
+
channels: ["video"]
|
|
71
|
+
format_ids:
|
|
72
|
+
- id: "video_30s"
|
|
73
|
+
- product_id: "outdoor_ctv_q2_guaranteed"
|
|
74
|
+
delivery_type: "guaranteed"
|
|
75
|
+
channels: ["ctv"]
|
|
76
|
+
format_ids:
|
|
77
|
+
- id: "video_30s"
|
|
78
|
+
pricing_options:
|
|
79
|
+
- product_id: "sports_preroll_q2_guaranteed"
|
|
80
|
+
pricing_option_id: "cpm_guaranteed_fixed"
|
|
81
|
+
pricing_model: "cpm"
|
|
82
|
+
currency: "USD"
|
|
83
|
+
fixed_price: 35.0
|
|
84
|
+
- product_id: "outdoor_ctv_q2_guaranteed"
|
|
85
|
+
pricing_option_id: "cpm_guaranteed_fixed"
|
|
86
|
+
pricing_model: "cpm"
|
|
87
|
+
currency: "USD"
|
|
88
|
+
fixed_price: 45.0
|
|
89
|
+
|
|
90
|
+
phases:
|
|
91
|
+
- id: capability_discovery
|
|
92
|
+
title: "Capability discovery"
|
|
93
|
+
narrative: |
|
|
94
|
+
The buyer calls get_adcp_capabilities to confirm the agent supports media buying before sending briefs or creating buys.
|
|
95
|
+
|
|
96
|
+
steps:
|
|
97
|
+
- id: get_capabilities
|
|
98
|
+
title: "Check agent capabilities"
|
|
99
|
+
narrative: |
|
|
100
|
+
Verify that the agent declares the expected protocol support before
|
|
101
|
+
proceeding with domain-specific operations.
|
|
102
|
+
task: get_adcp_capabilities
|
|
103
|
+
schema_ref: "protocol/get-adcp-capabilities-request.json"
|
|
104
|
+
response_schema_ref: "protocol/get-adcp-capabilities-response.json"
|
|
105
|
+
doc_ref: "/protocol/get_adcp_capabilities"
|
|
106
|
+
comply_scenario: capability_discovery
|
|
107
|
+
stateful: false
|
|
108
|
+
expected: |
|
|
109
|
+
Return capabilities declaring media_buy in supported_protocols, confirming the agent sells media.
|
|
110
|
+
sample_request:
|
|
111
|
+
context:
|
|
112
|
+
correlation_id: "sales_guaranteed--get_capabilities"
|
|
113
|
+
validations:
|
|
114
|
+
- check: response_schema
|
|
115
|
+
description: "Response matches get-adcp-capabilities-response.json schema"
|
|
116
|
+
- check: field_present
|
|
117
|
+
path: "supported_protocols"
|
|
118
|
+
description: "Agent declares supported protocols"
|
|
119
|
+
|
|
120
|
+
- check: field_present
|
|
121
|
+
path: "context"
|
|
122
|
+
description: "Response echoes back the context object"
|
|
123
|
+
- check: field_value
|
|
124
|
+
path: "context.correlation_id"
|
|
125
|
+
value: "sales_guaranteed--get_capabilities"
|
|
126
|
+
description: "Context correlation_id returned unchanged"
|
|
127
|
+
- id: account_setup
|
|
128
|
+
title: "Account setup"
|
|
129
|
+
narrative: |
|
|
130
|
+
Before buying anything, the buyer establishes an account relationship with
|
|
131
|
+
your platform. This is the handshake: the buyer tells you which brand and
|
|
132
|
+
agency (operator) they represent, and you return an account ID, status, and
|
|
133
|
+
any setup requirements.
|
|
134
|
+
|
|
135
|
+
steps:
|
|
136
|
+
- id: sync_accounts
|
|
137
|
+
title: "Establish account relationship"
|
|
138
|
+
narrative: |
|
|
139
|
+
The buyer registers their brand and operator with your platform. This is
|
|
140
|
+
the first call in any new relationship. Your platform validates the request,
|
|
141
|
+
provisions the account, and returns its status.
|
|
142
|
+
task: sync_accounts
|
|
143
|
+
schema_ref: "account/sync-accounts-request.json"
|
|
144
|
+
response_schema_ref: "account/sync-accounts-response.json"
|
|
145
|
+
doc_ref: "/accounts/tasks/sync_accounts"
|
|
146
|
+
stateful: true
|
|
147
|
+
expected: |
|
|
148
|
+
Return the account with:
|
|
149
|
+
- account_id: your platform's identifier for this relationship
|
|
150
|
+
- action: created or updated
|
|
151
|
+
- status: active or pending_approval
|
|
152
|
+
- account_scope: operator, brand, operator_brand, or agent
|
|
153
|
+
- setup: URL and message if pending_approval
|
|
154
|
+
- payment_terms: net_30, prepay, etc.
|
|
155
|
+
|
|
156
|
+
sample_request:
|
|
157
|
+
accounts:
|
|
158
|
+
- brand:
|
|
159
|
+
domain: "acmeoutdoor.example"
|
|
160
|
+
operator: "pinnacle-agency.example"
|
|
161
|
+
billing: "operator"
|
|
162
|
+
payment_terms: "net_30"
|
|
163
|
+
|
|
164
|
+
idempotency_key: "$generate:uuid_v4#sales_guaranteed_account_setup_sync_accounts"
|
|
165
|
+
context:
|
|
166
|
+
correlation_id: "sales_guaranteed--sync_accounts"
|
|
167
|
+
validations:
|
|
168
|
+
- check: response_schema
|
|
169
|
+
description: "Response matches sync-accounts-response.json schema"
|
|
170
|
+
- check: field_present
|
|
171
|
+
path: "accounts[0].account_id"
|
|
172
|
+
description: "Account has a platform-assigned ID"
|
|
173
|
+
- check: field_present
|
|
174
|
+
path: "accounts[0].status"
|
|
175
|
+
description: "Account has a status (active or pending_approval)"
|
|
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: "sales_guaranteed--sync_accounts"
|
|
183
|
+
description: "Context correlation_id returned unchanged"
|
|
184
|
+
- id: product_discovery
|
|
185
|
+
title: "Discover guaranteed products"
|
|
186
|
+
narrative: |
|
|
187
|
+
The buyer sends a brief to discover your guaranteed inventory. The emphasis
|
|
188
|
+
here is on products with delivery_type: guaranteed — fixed-price, reserved
|
|
189
|
+
inventory that requires an IO commitment. Your platform returns products with
|
|
190
|
+
pricing, delivery forecasts, and SLA commitments.
|
|
191
|
+
|
|
192
|
+
steps:
|
|
193
|
+
- id: get_products_brief
|
|
194
|
+
title: "Send a brief targeting guaranteed inventory"
|
|
195
|
+
narrative: |
|
|
196
|
+
The buyer describes what they want, emphasizing guaranteed delivery. Your
|
|
197
|
+
platform returns products with delivery_type: guaranteed, including SLA
|
|
198
|
+
commitments, minimum spend requirements, and IO terms.
|
|
199
|
+
task: get_products
|
|
200
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
201
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
202
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
203
|
+
comply_scenario: full_sales_flow
|
|
204
|
+
stateful: false
|
|
205
|
+
expected: |
|
|
206
|
+
Return guaranteed products matching the brief. Each product should include:
|
|
207
|
+
- product_id: unique identifier
|
|
208
|
+
- name and description
|
|
209
|
+
- delivery_type: guaranteed
|
|
210
|
+
- pricing_models: fixed CPM or flat-rate pricing
|
|
211
|
+
- forecast: committed impressions with SLA guarantees
|
|
212
|
+
- creative_format_ids: required creative formats
|
|
213
|
+
- minimum_spend or commitment terms if applicable
|
|
214
|
+
|
|
215
|
+
sample_request:
|
|
216
|
+
buying_mode: "brief"
|
|
217
|
+
brief: "Guaranteed premium video on sports and outdoor lifestyle publishers. Q2 flight, $50K budget. Adults 25-54, US only. Need completion rate SLA."
|
|
218
|
+
account:
|
|
219
|
+
brand:
|
|
220
|
+
domain: "acmeoutdoor.example"
|
|
221
|
+
operator: "pinnacle-agency.example"
|
|
222
|
+
|
|
223
|
+
context:
|
|
224
|
+
correlation_id: "sales_guaranteed--get_products_brief"
|
|
225
|
+
validations:
|
|
226
|
+
- check: response_schema
|
|
227
|
+
description: "Response matches get-products-response.json schema"
|
|
228
|
+
- check: field_present
|
|
229
|
+
path: "products"
|
|
230
|
+
description: "Response contains a products array"
|
|
231
|
+
- check: field_present
|
|
232
|
+
path: "products[0].product_id"
|
|
233
|
+
description: "Each product has a product_id"
|
|
234
|
+
- check: field_present
|
|
235
|
+
path: "products[0].delivery_type"
|
|
236
|
+
description: "Each product declares delivery_type: guaranteed"
|
|
237
|
+
|
|
238
|
+
- check: field_present
|
|
239
|
+
path: "context"
|
|
240
|
+
description: "Response echoes back the context object"
|
|
241
|
+
- check: field_value
|
|
242
|
+
path: "context.correlation_id"
|
|
243
|
+
value: "sales_guaranteed--get_products_brief"
|
|
244
|
+
description: "Context correlation_id returned unchanged"
|
|
245
|
+
- check: field_present
|
|
246
|
+
path: "products[0].format_ids"
|
|
247
|
+
description: "Products include format_ids for creative requirements"
|
|
248
|
+
- check: field_present
|
|
249
|
+
path: "products[0].format_ids[0].agent_url"
|
|
250
|
+
description: "Format IDs include agent_url — must match this agent's URL"
|
|
251
|
+
- check: field_present
|
|
252
|
+
path: "products[0].format_ids[0].id"
|
|
253
|
+
description: "Format IDs include id — must be accepted back in sync_creatives"
|
|
254
|
+
- id: create_buy_submitted
|
|
255
|
+
title: "Create guaranteed buy (task submitted for approval)"
|
|
256
|
+
narrative: |
|
|
257
|
+
The buyer creates a guaranteed media buy. Because your platform requires human
|
|
258
|
+
IO signing, the A2A task transitions to submitted rather than completed. The
|
|
259
|
+
buyer gets back a task_id and configures a webhook (or polls tasks/get) to be
|
|
260
|
+
notified when IO review finishes.
|
|
261
|
+
|
|
262
|
+
steps:
|
|
263
|
+
- id: create_media_buy
|
|
264
|
+
title: "Create a guaranteed media buy"
|
|
265
|
+
narrative: |
|
|
266
|
+
The buyer commits to guaranteed products with budgets and flight dates. Your
|
|
267
|
+
platform accepts the request but does not create the media buy yet. Instead,
|
|
268
|
+
the A2A task enters the submitted state — no media_buy_id is issued because
|
|
269
|
+
IO signing may fail. The buyer receives a task_id to watch.
|
|
270
|
+
|
|
271
|
+
The buyer includes push_notification_config so your platform can call back
|
|
272
|
+
when the IO is signed (completed) or rejected (failed).
|
|
273
|
+
task: create_media_buy
|
|
274
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
275
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
276
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
277
|
+
comply_scenario: create_media_buy
|
|
278
|
+
stateful: true
|
|
279
|
+
expected: |
|
|
280
|
+
Return an A2A task envelope in submitted state:
|
|
281
|
+
- status: submitted (task-level — the CreateMediaBuy success artifact is not yet produced)
|
|
282
|
+
- task_id / taskId: the handle the buyer polls or receives webhooks on
|
|
283
|
+
- message (optional): human-readable explanation (e.g., "Awaiting IO signature from sales team; typical turnaround 2–4 hours")
|
|
284
|
+
|
|
285
|
+
Do NOT return media_buy_id or packages yet — those land on the task's final artifact
|
|
286
|
+
when the task transitions to completed. Do NOT return completed status for guaranteed
|
|
287
|
+
buys that require IO signing. Do NOT use a "pending_approval" media buy status; that
|
|
288
|
+
value is not in MediaBuy.status — IO review is modelled at the task layer only.
|
|
289
|
+
|
|
290
|
+
sample_request:
|
|
291
|
+
brand:
|
|
292
|
+
domain: "acmeoutdoor.example"
|
|
293
|
+
account:
|
|
294
|
+
brand:
|
|
295
|
+
domain: "acmeoutdoor.example"
|
|
296
|
+
operator: "pinnacle-agency.example"
|
|
297
|
+
start_time: "2026-04-01T00:00:00Z"
|
|
298
|
+
end_time: "2026-06-30T23:59:59Z"
|
|
299
|
+
packages:
|
|
300
|
+
- product_id: "sports_preroll_q2_guaranteed"
|
|
301
|
+
budget: 30000
|
|
302
|
+
pricing_option_id: "cpm_guaranteed_fixed"
|
|
303
|
+
creative_assignments:
|
|
304
|
+
- creative_id: "video_30s_trail_pro"
|
|
305
|
+
- product_id: "outdoor_ctv_q2_guaranteed"
|
|
306
|
+
budget: 20000
|
|
307
|
+
pricing_option_id: "cpm_guaranteed_fixed"
|
|
308
|
+
push_notification_config:
|
|
309
|
+
url: "https://buyer.example/webhooks/adcp"
|
|
310
|
+
authentication:
|
|
311
|
+
schemes:
|
|
312
|
+
- "HMAC-SHA256"
|
|
313
|
+
credentials: "sales-guaranteed-webhook-secret-token"
|
|
314
|
+
|
|
315
|
+
idempotency_key: "$generate:uuid_v4#sales_guaranteed_create_buy_submitted_create_media_buy"
|
|
316
|
+
context:
|
|
317
|
+
correlation_id: "sales_guaranteed--create_media_buy"
|
|
318
|
+
context_outputs:
|
|
319
|
+
- name: media_buy_id
|
|
320
|
+
path: "task_completion.media_buy_id"
|
|
321
|
+
validations:
|
|
322
|
+
- check: response_schema
|
|
323
|
+
description: "Response matches create-media-buy-response.json schema"
|
|
324
|
+
|
|
325
|
+
- check: field_present
|
|
326
|
+
path: "context"
|
|
327
|
+
description: "Response echoes back the context object"
|
|
328
|
+
- check: field_value
|
|
329
|
+
path: "context.correlation_id"
|
|
330
|
+
value: "sales_guaranteed--create_media_buy"
|
|
331
|
+
description: "Context correlation_id returned unchanged"
|
|
332
|
+
- id: confirm_active
|
|
333
|
+
title: "Confirm active after IO signing"
|
|
334
|
+
narrative: |
|
|
335
|
+
The human on your side reviews and signs the IO through your internal workflow.
|
|
336
|
+
Your platform then transitions the A2A task to completed and emits the final
|
|
337
|
+
CreateMediaBuy result — including the newly-issued media_buy_id — to the buyer's
|
|
338
|
+
push_notification webhook (or to the next tasks/get poll). The buyer now calls
|
|
339
|
+
get_media_buys with that media_buy_id and sees the buy active. There is no
|
|
340
|
+
intermediate "pending_approval" media buy status in this flow; the buy does not
|
|
341
|
+
exist as a queryable MediaBuy until the task completes.
|
|
342
|
+
|
|
343
|
+
steps:
|
|
344
|
+
- id: get_media_buys_active
|
|
345
|
+
title: "Check media buy status (active)"
|
|
346
|
+
narrative: |
|
|
347
|
+
After the task completes and your platform issues a media_buy_id, the buyer
|
|
348
|
+
calls get_media_buys to confirm the buy is live. Your platform returns active
|
|
349
|
+
(or pending_creatives when creatives are still outstanding), indicating the
|
|
350
|
+
buy is approved and inventory is reserved.
|
|
351
|
+
task: get_media_buys
|
|
352
|
+
schema_ref: "media-buy/get-media-buys-request.json"
|
|
353
|
+
response_schema_ref: "media-buy/get-media-buys-response.json"
|
|
354
|
+
doc_ref: "/media-buy/task-reference/get_media_buys"
|
|
355
|
+
comply_scenario: media_buy_lifecycle
|
|
356
|
+
stateful: true
|
|
357
|
+
expected: |
|
|
358
|
+
Return the media buy in active status:
|
|
359
|
+
- media_buy_id: matches the buy created earlier
|
|
360
|
+
- status: active (IO has been signed)
|
|
361
|
+
- confirmed_at: timestamp when the IO was signed
|
|
362
|
+
- packages: line items with reserved inventory
|
|
363
|
+
- valid_actions: updated for active state (creative sync, pause, etc.)
|
|
364
|
+
|
|
365
|
+
sample_request:
|
|
366
|
+
account:
|
|
367
|
+
brand:
|
|
368
|
+
domain: "acmeoutdoor.example"
|
|
369
|
+
operator: "pinnacle-agency.example"
|
|
370
|
+
media_buy_ids:
|
|
371
|
+
- "$context.media_buy_id"
|
|
372
|
+
|
|
373
|
+
context:
|
|
374
|
+
correlation_id: "sales_guaranteed--get_media_buys_active"
|
|
375
|
+
validations:
|
|
376
|
+
- check: response_schema
|
|
377
|
+
description: "Response matches get-media-buys-response.json schema"
|
|
378
|
+
- check: field_present
|
|
379
|
+
path: "media_buys[0].status"
|
|
380
|
+
description: "Media buy status is active"
|
|
381
|
+
- check: field_present
|
|
382
|
+
path: "media_buys[0].confirmed_at"
|
|
383
|
+
description: "Active buy includes a confirmed_at timestamp"
|
|
384
|
+
|
|
385
|
+
- check: field_present
|
|
386
|
+
path: "context"
|
|
387
|
+
description: "Response echoes back the context object"
|
|
388
|
+
- check: field_value
|
|
389
|
+
path: "context.correlation_id"
|
|
390
|
+
value: "sales_guaranteed--get_media_buys_active"
|
|
391
|
+
description: "Context correlation_id returned unchanged"
|
|
392
|
+
- id: creative_sync
|
|
393
|
+
title: "Creative sync"
|
|
394
|
+
narrative: |
|
|
395
|
+
With the IO signed and the media buy active, the buyer syncs creative assets
|
|
396
|
+
to your platform. Each package has creative format requirements that the buyer
|
|
397
|
+
discovered during product discovery.
|
|
398
|
+
|
|
399
|
+
steps:
|
|
400
|
+
- id: sync_creatives
|
|
401
|
+
title: "Push creative assets"
|
|
402
|
+
narrative: |
|
|
403
|
+
The buyer uploads creative assets for the confirmed packages. Your platform
|
|
404
|
+
validates each creative against the format specs and returns per-creative status.
|
|
405
|
+
task: sync_creatives
|
|
406
|
+
schema_ref: "creative/sync-creatives-request.json"
|
|
407
|
+
response_schema_ref: "creative/sync-creatives-response.json"
|
|
408
|
+
doc_ref: "/creative/task-reference/sync_creatives"
|
|
409
|
+
comply_scenario: creative_sync
|
|
410
|
+
stateful: true
|
|
411
|
+
expected: |
|
|
412
|
+
Accept and validate creatives:
|
|
413
|
+
- Per-creative action: created or updated
|
|
414
|
+
- Per-creative status: accepted, pending_review, or rejected
|
|
415
|
+
- Validation errors for rejected creatives
|
|
416
|
+
|
|
417
|
+
sample_request:
|
|
418
|
+
account:
|
|
419
|
+
brand:
|
|
420
|
+
domain: "acmeoutdoor.example"
|
|
421
|
+
operator: "pinnacle-agency.example"
|
|
422
|
+
creatives:
|
|
423
|
+
- creative_id: "video_30s_trail_pro"
|
|
424
|
+
name: "Trail Pro 3000 - 30s CTV Spot"
|
|
425
|
+
format_id:
|
|
426
|
+
agent_url: "https://your-platform.example.com"
|
|
427
|
+
id: "ssai_30s"
|
|
428
|
+
assets:
|
|
429
|
+
video:
|
|
430
|
+
asset_type: "video"
|
|
431
|
+
url: "https://cdn.pinnacle-agency.example/trail-pro-30s.mp4"
|
|
432
|
+
width: 1920
|
|
433
|
+
height: 1080
|
|
434
|
+
duration_ms: 30000
|
|
435
|
+
mime_type: "video/mp4"
|
|
436
|
+
|
|
437
|
+
idempotency_key: "$generate:uuid_v4#sales_guaranteed_creative_sync_sync_creatives"
|
|
438
|
+
context:
|
|
439
|
+
correlation_id: "sales_guaranteed--sync_creatives"
|
|
440
|
+
validations:
|
|
441
|
+
- check: response_schema
|
|
442
|
+
description: "Response matches sync-creatives-response.json schema"
|
|
443
|
+
- check: field_present
|
|
444
|
+
path: "creatives[0].action"
|
|
445
|
+
description: "Each creative has an action (created/updated)"
|
|
446
|
+
|
|
447
|
+
- check: field_present
|
|
448
|
+
path: "context"
|
|
449
|
+
description: "Response echoes back the context object"
|
|
450
|
+
- check: field_value
|
|
451
|
+
path: "context.correlation_id"
|
|
452
|
+
value: "sales_guaranteed--sync_creatives"
|
|
453
|
+
description: "Context correlation_id returned unchanged"
|
|
454
|
+
- id: delivery_monitoring
|
|
455
|
+
title: "Delivery and reporting"
|
|
456
|
+
narrative: |
|
|
457
|
+
The campaign is live with guaranteed delivery commitments. The buyer monitors
|
|
458
|
+
delivery to ensure the seller is meeting the SLA guarantees from the IO.
|
|
459
|
+
|
|
460
|
+
steps:
|
|
461
|
+
- id: get_delivery
|
|
462
|
+
title: "Check delivery metrics"
|
|
463
|
+
narrative: |
|
|
464
|
+
The buyer requests delivery data for the active guaranteed media buy. Your
|
|
465
|
+
platform returns performance metrics with pacing against the guaranteed
|
|
466
|
+
commitment.
|
|
467
|
+
task: get_media_buy_delivery
|
|
468
|
+
schema_ref: "media-buy/get-media-buy-delivery-request.json"
|
|
469
|
+
response_schema_ref: "media-buy/get-media-buy-delivery-response.json"
|
|
470
|
+
doc_ref: "/media-buy/task-reference/get_media_buy_delivery"
|
|
471
|
+
comply_scenario: reporting_flow
|
|
472
|
+
stateful: true
|
|
473
|
+
expected: |
|
|
474
|
+
Return delivery metrics for the guaranteed media buy:
|
|
475
|
+
- Per-package delivery: impressions, clicks, spend, completion rates
|
|
476
|
+
- Pacing against guaranteed commitment: on track, ahead, behind
|
|
477
|
+
- Budget utilization: spent vs. committed
|
|
478
|
+
- SLA compliance: completion rate vs. guaranteed threshold
|
|
479
|
+
|
|
480
|
+
sample_request:
|
|
481
|
+
account:
|
|
482
|
+
brand:
|
|
483
|
+
domain: "acmeoutdoor.example"
|
|
484
|
+
operator: "pinnacle-agency.example"
|
|
485
|
+
media_buy_ids:
|
|
486
|
+
- "$context.media_buy_id"
|
|
487
|
+
include_package_daily_breakdown: true
|
|
488
|
+
|
|
489
|
+
context:
|
|
490
|
+
correlation_id: "sales_guaranteed--get_delivery"
|
|
491
|
+
validations:
|
|
492
|
+
- check: response_schema
|
|
493
|
+
description: "Response matches get-media-buy-delivery-response.json schema"
|
|
494
|
+
- check: field_present
|
|
495
|
+
path: "media_buy_deliveries"
|
|
496
|
+
description: "Response contains media buy delivery data"
|
|
497
|
+
|
|
498
|
+
- check: field_present
|
|
499
|
+
path: "context"
|
|
500
|
+
description: "Response echoes back the context object"
|
|
501
|
+
- check: field_value
|
|
502
|
+
path: "context.correlation_id"
|
|
503
|
+
value: "sales_guaranteed--get_delivery"
|
|
504
|
+
description: "Context correlation_id returned unchanged"
|