@adcp/sdk 7.11.0 → 7.11.1
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/compliance/cache/3.1.0-rc.2/domains/brand/index.yaml +160 -0
- package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/distributed_brand_resolution.yaml +415 -0
- package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/single_side_trust_extension.yaml +454 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/index.yaml +339 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/billing_out_of_band.yaml +153 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/canonical_supported_formats.yaml +212 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/native_in_feed.yaml +543 -0
- package/compliance/cache/3.1.0-rc.2/domains/governance/index.yaml +682 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/index.yaml +789 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/audience_buy_flow.yaml +380 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/available_actions.yaml +565 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/canonical_formats.yaml +861 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/create_media_buy_async.yaml +234 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_reception.yaml +247 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/delivery_reporting.yaml +357 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment.yaml +633 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/event_dedup_flow.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_approved.yaml +214 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_conditions.yaml +199 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied.yaml +204 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/invalid_transitions.yaml +289 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_accountability.yaml +244 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow.yaml +428 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/product_signal_targeting.yaml +373 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_enforcement.yaml +517 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/reach_buy_flow.yaml +823 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.1.0-rc.2/domains/signals/index.yaml +266 -0
- package/compliance/cache/3.1.0-rc.2/domains/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.1.0-rc.2/index.json +356 -0
- package/compliance/cache/3.1.0-rc.2/protocols/brand/index.yaml +160 -0
- package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/distributed_brand_resolution.yaml +415 -0
- package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/single_side_trust_extension.yaml +454 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/index.yaml +339 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/billing_out_of_band.yaml +153 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/canonical_supported_formats.yaml +212 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/native_in_feed.yaml +543 -0
- package/compliance/cache/3.1.0-rc.2/protocols/governance/index.yaml +682 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/index.yaml +789 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/audience_buy_flow.yaml +380 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/available_actions.yaml +565 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/canonical_formats.yaml +861 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/create_media_buy_async.yaml +234 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_reception.yaml +247 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/delivery_reporting.yaml +357 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment.yaml +633 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/event_dedup_flow.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_approved.yaml +214 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_conditions.yaml +199 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied.yaml +204 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/invalid_transitions.yaml +289 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_accountability.yaml +244 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow.yaml +428 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/product_signal_targeting.yaml +373 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_enforcement.yaml +517 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/reach_buy_flow.yaml +823 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.1.0-rc.2/protocols/signals/index.yaml +266 -0
- package/compliance/cache/3.1.0-rc.2/protocols/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/audience-sync/index.yaml +313 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/index.yaml +350 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/scenarios/governance_denied.yaml +226 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/collection-lists/index.yaml +359 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/content-standards/index.yaml +572 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-ad-server/index.yaml +409 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/generative-seller.yaml +807 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/index.yaml +758 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-template/index.yaml +510 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/index.yaml +143 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +117 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-delivery-monitor/index.yaml +441 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/denied.yaml +221 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/index.yaml +330 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/property-lists/index.yaml +482 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-broadcast-tv/index.yaml +738 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-catalog-driven/index.yaml +840 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-guaranteed/index.yaml +601 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-non-guaranteed/index.yaml +546 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-proposal-mode/index.yaml +586 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-social/index.yaml +919 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/index.yaml +424 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/scenarios/governance_denied.yaml +210 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/signal-owned/index.yaml +317 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sponsored-intelligence/index.yaml +59 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor-live.yaml +78 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor.yaml +223 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/billing-gate-runner.yaml +115 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/bistro-oranje.yaml +126 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/distributed-brand-runner.yaml +281 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/nova-motors.yaml +262 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/osei-natural.yaml +126 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/parallel-dispatch-runner.yaml +196 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/rate-limit-trip-runner.yaml +172 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/signed-requests-runner.yaml +155 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/single-side-trust-runner.yaml +294 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/substitution-observer-runner.yaml +688 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/summit-foods.yaml +125 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/webhook-receiver-runner.yaml +265 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/001-minimal-plan.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/002-full-plan.json +217 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/README.md +220 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/canonicalization.json +241 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/keys.json +60 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/001-basic-post.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/003-es256-post.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/README.md +211 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/keys.json +61 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
- package/compliance/cache/3.1.0-rc.2/universal/billing-gate-dispatch.yaml +450 -0
- package/compliance/cache/3.1.0-rc.2/universal/canonical-format-validate-input.yaml +640 -0
- package/compliance/cache/3.1.0-rc.2/universal/capability-discovery.yaml +125 -0
- package/compliance/cache/3.1.0-rc.2/universal/collection-lists-pagination-integrity.yaml +306 -0
- package/compliance/cache/3.1.0-rc.2/universal/comply-controller-mode-gate.yaml +141 -0
- package/compliance/cache/3.1.0-rc.2/universal/content-standards-pagination-integrity.yaml +326 -0
- package/compliance/cache/3.1.0-rc.2/universal/deterministic-testing.yaml +1430 -0
- package/compliance/cache/3.1.0-rc.2/universal/error-compliance-signals.yaml +377 -0
- package/compliance/cache/3.1.0-rc.2/universal/error-compliance.yaml +528 -0
- package/compliance/cache/3.1.0-rc.2/universal/fictional-entities.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/universal/get-media-buys-pagination-integrity.yaml +160 -0
- package/compliance/cache/3.1.0-rc.2/universal/get-signals-pagination-integrity.yaml +210 -0
- package/compliance/cache/3.1.0-rc.2/universal/idempotency.yaml +861 -0
- package/compliance/cache/3.1.0-rc.2/universal/notification-config-event-scope.yaml +119 -0
- package/compliance/cache/3.1.0-rc.2/universal/notification-config-lifecycle.yaml +337 -0
- package/compliance/cache/3.1.0-rc.2/universal/notification-config-rejections.yaml +107 -0
- package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-creative-formats.yaml +265 -0
- package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-list-accounts.yaml +245 -0
- package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity.yaml +263 -0
- package/compliance/cache/3.1.0-rc.2/universal/property-lists-pagination-integrity.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/universal/read-tool-idempotency.yaml +405 -0
- package/compliance/cache/3.1.0-rc.2/universal/runner-output-contract.yaml +1285 -0
- package/compliance/cache/3.1.0-rc.2/universal/schema-validation-signals.yaml +181 -0
- package/compliance/cache/3.1.0-rc.2/universal/schema-validation.yaml +548 -0
- package/compliance/cache/3.1.0-rc.2/universal/security.yaml +539 -0
- package/compliance/cache/3.1.0-rc.2/universal/signed-requests.yaml +217 -0
- package/compliance/cache/3.1.0-rc.2/universal/stale-response-advisory.yaml +295 -0
- package/compliance/cache/3.1.0-rc.2/universal/storyboard-schema.yaml +2194 -0
- package/compliance/cache/3.1.0-rc.2/universal/v3-envelope-integrity.yaml +117 -0
- package/compliance/cache/3.1.0-rc.2/universal/version-negotiation.yaml +130 -0
- package/compliance/cache/3.1.0-rc.2/universal/webhook-emission.yaml +411 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-bulk-webhooks.yaml +82 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-product-webhooks.yaml +83 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-products.yaml +151 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signal-webhooks.yaml +83 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signals.yaml +149 -0
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/testing/storyboard/default-invariants.js +23 -0
- package/dist/lib/testing/storyboard/default-invariants.js.map +1 -1
- package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/runner.js +84 -21
- package/dist/lib/testing/storyboard/runner.js.map +1 -1
- package/dist/lib/testing/storyboard/types.d.ts +21 -0
- package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/types.js.map +1 -1
- package/dist/lib/testing/types.d.ts +9 -0
- package/dist/lib/testing/types.d.ts.map +1 -1
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/package.json +1 -1
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
id: media_buy_seller/creative_reception
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Sales agent with creative capabilities"
|
|
4
|
+
category: media_buy_seller
|
|
5
|
+
summary: "Stateful sales agent that accepts pushed creative assets and renders them in its environment."
|
|
6
|
+
track: creative
|
|
7
|
+
required_tools:
|
|
8
|
+
- sync_creatives
|
|
9
|
+
|
|
10
|
+
narrative: |
|
|
11
|
+
You run a publisher platform, retail media network, or other sell-side system that
|
|
12
|
+
accepts creative assets from buyers. The buyer pushes assets or catalog items to your
|
|
13
|
+
platform, and you render them in your environment.
|
|
14
|
+
|
|
15
|
+
Your agent is stateful: buyers push creatives to you via sync_creatives, and you
|
|
16
|
+
persist them for rendering. This is where catalogs get interesting — the buyer might
|
|
17
|
+
push product feeds (flights, hotels, retail products) that your platform renders as
|
|
18
|
+
native ads.
|
|
19
|
+
|
|
20
|
+
This storyboard walks through the push-and-preview flow from the buyer's perspective.
|
|
21
|
+
|
|
22
|
+
agent:
|
|
23
|
+
interaction_model: stateful_push
|
|
24
|
+
capabilities:
|
|
25
|
+
- has_creative_library
|
|
26
|
+
examples:
|
|
27
|
+
- "Publisher platforms"
|
|
28
|
+
- "Retail media networks"
|
|
29
|
+
- "Native ad platforms"
|
|
30
|
+
|
|
31
|
+
caller:
|
|
32
|
+
role: buyer_agent
|
|
33
|
+
example: "Pinnacle Agency (buyer)"
|
|
34
|
+
|
|
35
|
+
prerequisites:
|
|
36
|
+
description: |
|
|
37
|
+
The buyer has creative assets (images, catalog feeds, or ad tags) ready to push.
|
|
38
|
+
The test kit provides sample assets compatible with common publisher formats.
|
|
39
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
40
|
+
|
|
41
|
+
phases:
|
|
42
|
+
- id: capability_discovery
|
|
43
|
+
title: "Capability discovery"
|
|
44
|
+
narrative: |
|
|
45
|
+
The buyer calls get_adcp_capabilities to confirm the agent supports creative operations before browsing or building creatives.
|
|
46
|
+
|
|
47
|
+
steps:
|
|
48
|
+
- id: get_capabilities
|
|
49
|
+
title: "Check agent capabilities"
|
|
50
|
+
narrative: |
|
|
51
|
+
Verify that the agent declares the expected protocol support before
|
|
52
|
+
proceeding with domain-specific operations.
|
|
53
|
+
task: get_adcp_capabilities
|
|
54
|
+
schema_ref: "protocol/get-adcp-capabilities-request.json"
|
|
55
|
+
response_schema_ref: "protocol/get-adcp-capabilities-response.json"
|
|
56
|
+
doc_ref: "/protocol/get_adcp_capabilities"
|
|
57
|
+
comply_scenario: capability_discovery
|
|
58
|
+
stateful: false
|
|
59
|
+
expected: |
|
|
60
|
+
Return capabilities declaring creative in supported_protocols, confirming the agent handles creative operations.
|
|
61
|
+
sample_request:
|
|
62
|
+
context:
|
|
63
|
+
correlation_id: "media_buy_seller_creative_reception--get_capabilities"
|
|
64
|
+
validations:
|
|
65
|
+
- check: response_schema
|
|
66
|
+
description: "Response matches get-adcp-capabilities-response.json schema"
|
|
67
|
+
- check: field_present
|
|
68
|
+
path: "supported_protocols"
|
|
69
|
+
description: "Agent declares supported protocols"
|
|
70
|
+
|
|
71
|
+
- check: field_present
|
|
72
|
+
path: "context"
|
|
73
|
+
description: "Response echoes back the context object"
|
|
74
|
+
- check: field_value
|
|
75
|
+
path: "context.correlation_id"
|
|
76
|
+
value: "media_buy_seller_creative_reception--get_capabilities"
|
|
77
|
+
description: "Context correlation_id returned unchanged"
|
|
78
|
+
- id: discover_accepted_formats
|
|
79
|
+
title: "Discover accepted formats"
|
|
80
|
+
narrative: |
|
|
81
|
+
The buyer first needs to know what creative formats your platform accepts.
|
|
82
|
+
For a publisher, this includes your native ad formats, display placements,
|
|
83
|
+
and any custom units. For retail media, this might include product listing
|
|
84
|
+
formats or sponsored product cards.
|
|
85
|
+
|
|
86
|
+
steps:
|
|
87
|
+
- id: list_formats
|
|
88
|
+
title: "Discover accepted creative formats"
|
|
89
|
+
narrative: |
|
|
90
|
+
The buyer asks: "What creative formats does your platform accept?" Your
|
|
91
|
+
platform returns the formats you support — native post formats, display
|
|
92
|
+
units, video slots, or product listing formats.
|
|
93
|
+
task: list_creative_formats
|
|
94
|
+
schema_ref: "creative/list-creative-formats-request.json"
|
|
95
|
+
response_schema_ref: "creative/list-creative-formats-response.json"
|
|
96
|
+
doc_ref: "/creative/task-reference/list_creative_formats"
|
|
97
|
+
comply_scenario: creative_sync
|
|
98
|
+
stateful: false
|
|
99
|
+
expected: |
|
|
100
|
+
Return the creative formats your platform accepts. Each format should define:
|
|
101
|
+
- Asset requirements (what the buyer needs to provide)
|
|
102
|
+
- Render dimensions
|
|
103
|
+
- Any catalog requirements (for product-feed formats)
|
|
104
|
+
|
|
105
|
+
- id: push_creatives
|
|
106
|
+
title: "Push creative assets"
|
|
107
|
+
narrative: |
|
|
108
|
+
The buyer pushes their creative assets to your platform. This could be:
|
|
109
|
+
- Standard display assets (images, HTML tags)
|
|
110
|
+
- Catalog items (product feeds, flight listings, hotel inventory)
|
|
111
|
+
- Native ad content (headlines, descriptions, images)
|
|
112
|
+
|
|
113
|
+
Your platform validates the assets against your format specs and stores them.
|
|
114
|
+
|
|
115
|
+
steps:
|
|
116
|
+
- id: sync_creatives
|
|
117
|
+
title: "Push creatives to the platform"
|
|
118
|
+
narrative: |
|
|
119
|
+
The buyer uploads creative assets to your platform. For standard ads, this
|
|
120
|
+
is images and copy. For catalog-driven formats, this is a product feed or
|
|
121
|
+
set of catalog items. Your platform validates each creative against the
|
|
122
|
+
format's asset requirements and returns a per-creative status.
|
|
123
|
+
task: sync_creatives
|
|
124
|
+
schema_ref: "creative/sync-creatives-request.json"
|
|
125
|
+
response_schema_ref: "creative/sync-creatives-response.json"
|
|
126
|
+
doc_ref: "/creative/task-reference/sync_creatives"
|
|
127
|
+
comply_scenario: creative_sync
|
|
128
|
+
stateful: true
|
|
129
|
+
expected: |
|
|
130
|
+
Accept the creatives, validate against format specifications, and return:
|
|
131
|
+
- Per-creative action (created or updated)
|
|
132
|
+
- Per-creative status (accepted, pending_review, rejected)
|
|
133
|
+
- Platform-assigned IDs if applicable
|
|
134
|
+
- Validation errors for rejected creatives
|
|
135
|
+
|
|
136
|
+
sample_request:
|
|
137
|
+
account:
|
|
138
|
+
brand:
|
|
139
|
+
domain: "acmeoutdoor.example"
|
|
140
|
+
operator: "pinnacle-agency.example"
|
|
141
|
+
creatives:
|
|
142
|
+
- creative_id: "acme_summer_native_001"
|
|
143
|
+
name: "Acme Summer Sale — native 2026"
|
|
144
|
+
format_id:
|
|
145
|
+
agent_url: "https://your-platform.example.com"
|
|
146
|
+
id: "native_post"
|
|
147
|
+
assets:
|
|
148
|
+
headline:
|
|
149
|
+
asset_type: "text"
|
|
150
|
+
content: "Summer Sale — 40% Off All Gear"
|
|
151
|
+
image:
|
|
152
|
+
asset_type: "image"
|
|
153
|
+
url: "https://test-assets.adcontextprotocol.org/acme-outdoor/hero-master.jpg"
|
|
154
|
+
width: 1200
|
|
155
|
+
height: 628
|
|
156
|
+
click_url:
|
|
157
|
+
asset_type: "url"
|
|
158
|
+
url: "https://acmeoutdoor.example/summer-sale"
|
|
159
|
+
|
|
160
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_creative_reception_push_creatives_sync_creatives"
|
|
161
|
+
context:
|
|
162
|
+
correlation_id: "media_buy_seller_creative_reception--sync_creatives"
|
|
163
|
+
validations:
|
|
164
|
+
- check: response_schema
|
|
165
|
+
description: "Response matches sync-creatives-response.json schema"
|
|
166
|
+
- check: field_present
|
|
167
|
+
path: "creatives[0].action"
|
|
168
|
+
description: "Each creative has an action (created/updated)"
|
|
169
|
+
|
|
170
|
+
- check: field_present
|
|
171
|
+
path: "context"
|
|
172
|
+
description: "Response echoes back the context object"
|
|
173
|
+
- check: field_value
|
|
174
|
+
path: "context.correlation_id"
|
|
175
|
+
value: "media_buy_seller_creative_reception--sync_creatives"
|
|
176
|
+
description: "Context correlation_id returned unchanged"
|
|
177
|
+
- id: preview
|
|
178
|
+
title: "Preview pushed creatives"
|
|
179
|
+
narrative: |
|
|
180
|
+
After pushing assets, the buyer wants to see how their creatives will render
|
|
181
|
+
in your platform's environment. For a publisher, this shows the ad in the
|
|
182
|
+
publication's native chrome — with engagement buttons, community badges, and
|
|
183
|
+
platform-specific styling that the buyer can't preview elsewhere.
|
|
184
|
+
|
|
185
|
+
steps:
|
|
186
|
+
- id: preview_synced
|
|
187
|
+
title: "Preview a pushed creative"
|
|
188
|
+
narrative: |
|
|
189
|
+
The buyer asks to see how a synced creative will look in your environment.
|
|
190
|
+
Your platform renders the creative with its native chrome — the surrounding
|
|
191
|
+
UI, engagement buttons, and platform-specific styling.
|
|
192
|
+
task: preview_creative
|
|
193
|
+
schema_ref: "creative/preview-creative-request.json"
|
|
194
|
+
response_schema_ref: "creative/preview-creative-response.json"
|
|
195
|
+
doc_ref: "/creative/task-reference/preview_creative"
|
|
196
|
+
comply_scenario: creative_flow
|
|
197
|
+
stateful: true
|
|
198
|
+
expected: |
|
|
199
|
+
Return a preview showing the creative in your platform's environment.
|
|
200
|
+
The preview should include your platform's native chrome — not just the
|
|
201
|
+
raw assets, but how they'll actually appear to users.
|
|
202
|
+
|
|
203
|
+
sample_request:
|
|
204
|
+
account:
|
|
205
|
+
brand:
|
|
206
|
+
domain: "acmeoutdoor.example"
|
|
207
|
+
operator: "pinnacle-agency.example"
|
|
208
|
+
request_type: "single"
|
|
209
|
+
creative_manifest:
|
|
210
|
+
creative_id: "acme_summer_native_001"
|
|
211
|
+
format_id:
|
|
212
|
+
agent_url: "https://your-platform.example.com"
|
|
213
|
+
id: "native_post"
|
|
214
|
+
assets:
|
|
215
|
+
headline:
|
|
216
|
+
asset_type: "text"
|
|
217
|
+
content: "Summer Sale — 40% Off"
|
|
218
|
+
body:
|
|
219
|
+
asset_type: "text"
|
|
220
|
+
content: "Top-rated outdoor gear. This weekend only."
|
|
221
|
+
image:
|
|
222
|
+
asset_type: "image"
|
|
223
|
+
url: "https://test-assets.adcontextprotocol.org/acme-outdoor/hero.jpg"
|
|
224
|
+
width: 1200
|
|
225
|
+
height: 628
|
|
226
|
+
click_url:
|
|
227
|
+
asset_type: "url"
|
|
228
|
+
url: "https://acmeoutdoor.example/summer-sale"
|
|
229
|
+
output_format: "url"
|
|
230
|
+
quality: "draft"
|
|
231
|
+
|
|
232
|
+
context:
|
|
233
|
+
correlation_id: "media_buy_seller_creative_reception--preview_synced"
|
|
234
|
+
validations:
|
|
235
|
+
- check: response_schema
|
|
236
|
+
description: "Response matches preview-creative-response.json schema"
|
|
237
|
+
- check: field_present
|
|
238
|
+
path: "previews[0].renders[0].preview_url"
|
|
239
|
+
description: "Preview includes a renderable URL"
|
|
240
|
+
|
|
241
|
+
- check: field_present
|
|
242
|
+
path: "context"
|
|
243
|
+
description: "Response echoes back the context object"
|
|
244
|
+
- check: field_value
|
|
245
|
+
path: "context.correlation_id"
|
|
246
|
+
value: "media_buy_seller_creative_reception--preview_synced"
|
|
247
|
+
description: "Context correlation_id returned unchanged"
|
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
id: media_buy_seller/delivery_reporting
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Seller returns valid delivery reporting"
|
|
4
|
+
category: media_buy_seller
|
|
5
|
+
summary: "Verifies that get_media_buy_delivery returns schema-compliant delivery data after simulated delivery via the test controller."
|
|
6
|
+
track: reporting
|
|
7
|
+
required_tools:
|
|
8
|
+
- get_products
|
|
9
|
+
- create_media_buy
|
|
10
|
+
- get_media_buy_delivery
|
|
11
|
+
- comply_test_controller
|
|
12
|
+
|
|
13
|
+
narrative: |
|
|
14
|
+
Delivery reporting is how buyers know if their campaign is working. The seller must
|
|
15
|
+
return schema-compliant delivery data from get_media_buy_delivery with per-package
|
|
16
|
+
metrics (impressions, spend, pacing).
|
|
17
|
+
|
|
18
|
+
This scenario creates a media buy, injects delivery data via the test controller's
|
|
19
|
+
simulate_delivery scenario, then calls get_media_buy_delivery and validates the
|
|
20
|
+
response against the schema. Without this test, sellers can return arbitrary formats
|
|
21
|
+
and still pass certification.
|
|
22
|
+
|
|
23
|
+
agent:
|
|
24
|
+
interaction_model: media_buy_seller
|
|
25
|
+
capabilities:
|
|
26
|
+
- sells_media
|
|
27
|
+
examples:
|
|
28
|
+
- "Any media buy seller"
|
|
29
|
+
|
|
30
|
+
caller:
|
|
31
|
+
role: buyer_agent
|
|
32
|
+
example: "Pinnacle Agency (buyer)"
|
|
33
|
+
|
|
34
|
+
prerequisites:
|
|
35
|
+
description: |
|
|
36
|
+
The seller must implement comply_test_controller with the simulate_delivery
|
|
37
|
+
scenario. This allows the test harness to inject delivery metrics into a
|
|
38
|
+
media buy so get_media_buy_delivery has data to return.
|
|
39
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
40
|
+
controller_seeding: true
|
|
41
|
+
|
|
42
|
+
fixtures:
|
|
43
|
+
products:
|
|
44
|
+
- product_id: "outdoor_display_q2"
|
|
45
|
+
delivery_type: "guaranteed"
|
|
46
|
+
channels: ["display"]
|
|
47
|
+
format_ids:
|
|
48
|
+
- id: "display_300x250"
|
|
49
|
+
- product_id: "outdoor_video_q2"
|
|
50
|
+
delivery_type: "guaranteed"
|
|
51
|
+
channels: ["video"]
|
|
52
|
+
format_ids:
|
|
53
|
+
- id: "video_15s"
|
|
54
|
+
- product_id: "video_viewability_q2"
|
|
55
|
+
delivery_type: "guaranteed"
|
|
56
|
+
channels: ["video"]
|
|
57
|
+
format_ids:
|
|
58
|
+
- id: "video_15s"
|
|
59
|
+
metric_optimization:
|
|
60
|
+
supported_metrics: ["viewed_seconds"]
|
|
61
|
+
pricing_options:
|
|
62
|
+
- product_id: "outdoor_display_q2"
|
|
63
|
+
pricing_option_id: "cpm_standard"
|
|
64
|
+
pricing_model: "cpm"
|
|
65
|
+
currency: "USD"
|
|
66
|
+
fixed_price: 8.0
|
|
67
|
+
- product_id: "outdoor_video_q2"
|
|
68
|
+
pricing_option_id: "cpm_standard"
|
|
69
|
+
pricing_model: "cpm"
|
|
70
|
+
currency: "USD"
|
|
71
|
+
fixed_price: 12.0
|
|
72
|
+
- product_id: "video_viewability_q2"
|
|
73
|
+
pricing_option_id: "vcpm_standard"
|
|
74
|
+
pricing_model: "vcpm"
|
|
75
|
+
currency: "USD"
|
|
76
|
+
fixed_price: 14.0
|
|
77
|
+
|
|
78
|
+
phases:
|
|
79
|
+
- id: setup
|
|
80
|
+
title: "Create a media buy for delivery testing"
|
|
81
|
+
steps:
|
|
82
|
+
- id: sync_accounts
|
|
83
|
+
title: "Establish account"
|
|
84
|
+
task: sync_accounts
|
|
85
|
+
schema_ref: "account/sync-accounts-request.json"
|
|
86
|
+
response_schema_ref: "account/sync-accounts-response.json"
|
|
87
|
+
doc_ref: "/accounts/tasks/sync_accounts"
|
|
88
|
+
stateful: true
|
|
89
|
+
expected: |
|
|
90
|
+
Return the account with account_id and status active.
|
|
91
|
+
sample_request:
|
|
92
|
+
accounts:
|
|
93
|
+
- brand:
|
|
94
|
+
domain: "acmeoutdoor.example"
|
|
95
|
+
operator: "pinnacle-agency.example"
|
|
96
|
+
billing: "operator"
|
|
97
|
+
payment_terms: "net_30"
|
|
98
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_delivery_reporting_setup_sync_accounts"
|
|
99
|
+
validations:
|
|
100
|
+
- check: response_schema
|
|
101
|
+
description: "Response matches sync-accounts-response.json schema"
|
|
102
|
+
- check: field_present
|
|
103
|
+
path: "accounts[0].account_id"
|
|
104
|
+
description: "Account has a platform-assigned ID"
|
|
105
|
+
|
|
106
|
+
- id: get_products_brief
|
|
107
|
+
title: "Discover products"
|
|
108
|
+
task: get_products
|
|
109
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
110
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
111
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
112
|
+
comply_scenario: full_sales_flow
|
|
113
|
+
stateful: false
|
|
114
|
+
expected: |
|
|
115
|
+
Return products matching the brief.
|
|
116
|
+
sample_request:
|
|
117
|
+
buying_mode: "brief"
|
|
118
|
+
brief: "Display and video inventory on outdoor lifestyle content. Q2 flight, $25K budget. Adults 25-54, US."
|
|
119
|
+
account:
|
|
120
|
+
brand:
|
|
121
|
+
domain: "acmeoutdoor.example"
|
|
122
|
+
operator: "pinnacle-agency.example"
|
|
123
|
+
validations:
|
|
124
|
+
- check: response_schema
|
|
125
|
+
description: "Response matches get-products-response.json schema"
|
|
126
|
+
- check: field_present
|
|
127
|
+
path: "products"
|
|
128
|
+
description: "Response contains products"
|
|
129
|
+
|
|
130
|
+
- id: create_media_buy
|
|
131
|
+
title: "Create media buy"
|
|
132
|
+
task: create_media_buy
|
|
133
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
134
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
135
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
136
|
+
comply_scenario: create_media_buy
|
|
137
|
+
stateful: true
|
|
138
|
+
expected: |
|
|
139
|
+
Create the media buy. We need a media_buy_id to simulate delivery against.
|
|
140
|
+
sample_request:
|
|
141
|
+
brand:
|
|
142
|
+
domain: "acmeoutdoor.example"
|
|
143
|
+
account:
|
|
144
|
+
brand:
|
|
145
|
+
domain: "acmeoutdoor.example"
|
|
146
|
+
operator: "pinnacle-agency.example"
|
|
147
|
+
start_time: "2026-04-01T00:00:00Z"
|
|
148
|
+
end_time: "2026-06-30T23:59:59Z"
|
|
149
|
+
packages:
|
|
150
|
+
- product_id: "outdoor_display_q2"
|
|
151
|
+
budget: 15000
|
|
152
|
+
pricing_option_id: "cpm_standard"
|
|
153
|
+
- product_id: "outdoor_video_q2"
|
|
154
|
+
budget: 10000
|
|
155
|
+
pricing_option_id: "cpm_standard"
|
|
156
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_delivery_reporting_setup_create_media_buy"
|
|
157
|
+
validations:
|
|
158
|
+
- check: response_schema
|
|
159
|
+
description: "Response matches create-media-buy-response.json schema"
|
|
160
|
+
|
|
161
|
+
- id: simulate_and_verify
|
|
162
|
+
title: "Simulate delivery and validate reporting"
|
|
163
|
+
narrative: |
|
|
164
|
+
Inject delivery metrics via the test controller, then call get_media_buy_delivery
|
|
165
|
+
and validate the response format. This is the core test — does the seller return
|
|
166
|
+
schema-compliant delivery data with per-package metrics?
|
|
167
|
+
|
|
168
|
+
steps:
|
|
169
|
+
- id: simulate_delivery
|
|
170
|
+
title: "Inject simulated delivery metrics"
|
|
171
|
+
task: comply_test_controller
|
|
172
|
+
requires_tool: comply_test_controller
|
|
173
|
+
stateful: true
|
|
174
|
+
expected: |
|
|
175
|
+
The test controller acknowledges the simulated delivery data.
|
|
176
|
+
sample_request:
|
|
177
|
+
account:
|
|
178
|
+
sandbox: true
|
|
179
|
+
scenario: "simulate_delivery"
|
|
180
|
+
params:
|
|
181
|
+
media_buy_id: "$context.media_buy_id"
|
|
182
|
+
impressions: 5000
|
|
183
|
+
clicks: 150
|
|
184
|
+
reported_spend:
|
|
185
|
+
amount: 250.00
|
|
186
|
+
currency: "USD"
|
|
187
|
+
validations:
|
|
188
|
+
- check: field_value
|
|
189
|
+
path: "success"
|
|
190
|
+
allowed_values: [true]
|
|
191
|
+
description: "Delivery simulation succeeds"
|
|
192
|
+
|
|
193
|
+
- id: get_delivery
|
|
194
|
+
title: "Get delivery report and validate schema"
|
|
195
|
+
task: get_media_buy_delivery
|
|
196
|
+
schema_ref: "media-buy/get-media-buy-delivery-request.json"
|
|
197
|
+
response_schema_ref: "media-buy/get-media-buy-delivery-response.json"
|
|
198
|
+
doc_ref: "/media-buy/task-reference/get_media_buy_delivery"
|
|
199
|
+
comply_scenario: reporting_flow
|
|
200
|
+
stateful: true
|
|
201
|
+
expected: |
|
|
202
|
+
Return delivery metrics reflecting the simulated data:
|
|
203
|
+
- media_buy_deliveries array with at least one entry
|
|
204
|
+
- Per-package breakdown with impressions, spend
|
|
205
|
+
- Response matches the get-media-buy-delivery-response.json schema
|
|
206
|
+
sample_request:
|
|
207
|
+
account:
|
|
208
|
+
brand:
|
|
209
|
+
domain: "acmeoutdoor.example"
|
|
210
|
+
operator: "pinnacle-agency.example"
|
|
211
|
+
media_buy_ids:
|
|
212
|
+
- "$context.media_buy_id"
|
|
213
|
+
include_package_daily_breakdown: true
|
|
214
|
+
validations:
|
|
215
|
+
- check: response_schema
|
|
216
|
+
description: "Response matches get-media-buy-delivery-response.json schema"
|
|
217
|
+
- check: field_present
|
|
218
|
+
path: "media_buy_deliveries"
|
|
219
|
+
description: "Response contains delivery data"
|
|
220
|
+
|
|
221
|
+
- id: viewability_delivery
|
|
222
|
+
title: "Delivery reporting surfaces viewability.viewed_seconds for viewability-capable products"
|
|
223
|
+
narrative: |
|
|
224
|
+
3.1 adds `viewability.viewed_seconds` to delivery-metrics — the
|
|
225
|
+
average in-view duration per measurable impression in seconds. It
|
|
226
|
+
shares the same denominator (`measurable_impressions`) as
|
|
227
|
+
`viewable_rate` and is governed by the same measurement `standard`
|
|
228
|
+
(e.g., MRC 50%/1s for display, 50%/2s for video). Sellers reporting
|
|
229
|
+
against a `viewed_seconds` optimization goal MUST populate this field.
|
|
230
|
+
|
|
231
|
+
This phase creates a separate media buy for a viewability-capable
|
|
232
|
+
vCPM video product, injects simulated delivery with a full viewability
|
|
233
|
+
block (measurable_impressions, viewable_impressions, viewable_rate,
|
|
234
|
+
viewed_seconds, standard), and verifies that get_media_buy_delivery
|
|
235
|
+
returns the viewed_seconds field inside the viewability block.
|
|
236
|
+
Response schema validation anchors the viewability block shape and
|
|
237
|
+
scalar bounds; the named fields make the shared denominator explicit
|
|
238
|
+
for buyers and controller implementers.
|
|
239
|
+
|
|
240
|
+
steps:
|
|
241
|
+
- id: create_media_buy_viewability
|
|
242
|
+
title: "Create media buy for viewability-capable video product"
|
|
243
|
+
task: create_media_buy
|
|
244
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
245
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
246
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
247
|
+
stateful: true
|
|
248
|
+
expected: |
|
|
249
|
+
Create the media buy. Returns a media_buy_id used for the
|
|
250
|
+
viewability delivery simulation.
|
|
251
|
+
sample_request:
|
|
252
|
+
brand:
|
|
253
|
+
domain: "acmeoutdoor.example"
|
|
254
|
+
account:
|
|
255
|
+
brand:
|
|
256
|
+
domain: "acmeoutdoor.example"
|
|
257
|
+
operator: "pinnacle-agency.example"
|
|
258
|
+
start_time: "2026-06-01T00:00:00Z"
|
|
259
|
+
end_time: "2026-06-30T23:59:59Z"
|
|
260
|
+
packages:
|
|
261
|
+
- product_id: "video_viewability_q2"
|
|
262
|
+
budget: 20000
|
|
263
|
+
pricing_option_id: "vcpm_standard"
|
|
264
|
+
optimization_goals:
|
|
265
|
+
- kind: "metric"
|
|
266
|
+
metric: "viewed_seconds"
|
|
267
|
+
target:
|
|
268
|
+
kind: "threshold_rate"
|
|
269
|
+
value: 3.0
|
|
270
|
+
priority: 1
|
|
271
|
+
idempotency_key: "$generate:uuid_v4#delivery_reporting_viewability_delivery_create_media_buy"
|
|
272
|
+
context_outputs:
|
|
273
|
+
- name: viewability_media_buy_id
|
|
274
|
+
path: "media_buy_id"
|
|
275
|
+
validations:
|
|
276
|
+
- check: response_schema
|
|
277
|
+
description: "Response matches create-media-buy-response.json schema"
|
|
278
|
+
- check: field_present
|
|
279
|
+
path: "media_buy_id"
|
|
280
|
+
description: "Media buy has a platform-assigned ID"
|
|
281
|
+
|
|
282
|
+
- id: simulate_viewability_delivery
|
|
283
|
+
title: "Inject simulated delivery with full viewability block including viewed_seconds"
|
|
284
|
+
task: comply_test_controller
|
|
285
|
+
requires_tool: comply_test_controller
|
|
286
|
+
stateful: true
|
|
287
|
+
expected: |
|
|
288
|
+
The test controller acknowledges the simulated delivery with a
|
|
289
|
+
full viewability block: measurable_impressions as the shared
|
|
290
|
+
denominator, viewable_impressions, viewable_rate, viewed_seconds,
|
|
291
|
+
and the MRC standard.
|
|
292
|
+
sample_request:
|
|
293
|
+
account:
|
|
294
|
+
sandbox: true
|
|
295
|
+
scenario: "simulate_delivery"
|
|
296
|
+
params:
|
|
297
|
+
media_buy_id: "$context.viewability_media_buy_id"
|
|
298
|
+
impressions: 80000
|
|
299
|
+
viewability:
|
|
300
|
+
measurable_impressions: 74000
|
|
301
|
+
viewable_impressions: 59200
|
|
302
|
+
viewable_rate: 0.80
|
|
303
|
+
viewed_seconds: 4.3
|
|
304
|
+
standard: "mrc"
|
|
305
|
+
reported_spend:
|
|
306
|
+
amount: 1030.00
|
|
307
|
+
currency: "USD"
|
|
308
|
+
validations:
|
|
309
|
+
- check: field_value
|
|
310
|
+
path: "success"
|
|
311
|
+
allowed_values: [true]
|
|
312
|
+
description: "Delivery simulation with viewability block succeeds"
|
|
313
|
+
|
|
314
|
+
- id: get_viewability_delivery
|
|
315
|
+
title: "Verify viewability.viewed_seconds appears in delivery report"
|
|
316
|
+
task: get_media_buy_delivery
|
|
317
|
+
schema_ref: "media-buy/get-media-buy-delivery-request.json"
|
|
318
|
+
response_schema_ref: "media-buy/get-media-buy-delivery-response.json"
|
|
319
|
+
doc_ref: "/media-buy/task-reference/get_media_buy_delivery"
|
|
320
|
+
stateful: true
|
|
321
|
+
expected: |
|
|
322
|
+
Delivery response carries a viewability block with viewed_seconds,
|
|
323
|
+
measurable_impressions (shared denominator), viewable_rate, and
|
|
324
|
+
standard. The viewed_seconds value represents the average in-view
|
|
325
|
+
duration per measurable impression — the reporting counterpart to
|
|
326
|
+
the viewed_seconds optimization metric. The denominator for both
|
|
327
|
+
viewable_rate and viewed_seconds is measurable_impressions (not
|
|
328
|
+
total impressions) since some environments cannot measure viewability.
|
|
329
|
+
sample_request:
|
|
330
|
+
account:
|
|
331
|
+
brand:
|
|
332
|
+
domain: "acmeoutdoor.example"
|
|
333
|
+
operator: "pinnacle-agency.example"
|
|
334
|
+
media_buy_ids:
|
|
335
|
+
- "$context.viewability_media_buy_id"
|
|
336
|
+
include_package_daily_breakdown: true
|
|
337
|
+
validations:
|
|
338
|
+
- check: response_schema
|
|
339
|
+
description: "Response matches get-media-buy-delivery-response.json schema"
|
|
340
|
+
- check: field_present
|
|
341
|
+
path: "media_buy_deliveries[0].totals.viewability"
|
|
342
|
+
description: "Viewability block present on delivery row"
|
|
343
|
+
- check: field_present
|
|
344
|
+
path: "media_buy_deliveries[0].totals.viewability.viewed_seconds"
|
|
345
|
+
description: "viewed_seconds — average in-view duration per measurable impression — present in viewability block"
|
|
346
|
+
- check: field_present
|
|
347
|
+
path: "media_buy_deliveries[0].totals.viewability.measurable_impressions"
|
|
348
|
+
description: "measurable_impressions denominator present (shared basis for viewable_rate and viewed_seconds)"
|
|
349
|
+
- check: field_present
|
|
350
|
+
path: "media_buy_deliveries[0].totals.viewability.viewable_impressions"
|
|
351
|
+
description: "viewable_impressions numerator present for viewable_rate"
|
|
352
|
+
- check: field_present
|
|
353
|
+
path: "media_buy_deliveries[0].totals.viewability.viewable_rate"
|
|
354
|
+
description: "viewable_rate present alongside viewed_seconds in the viewability block"
|
|
355
|
+
- check: field_present
|
|
356
|
+
path: "media_buy_deliveries[0].totals.viewability.standard"
|
|
357
|
+
description: "viewability standard present — governs threshold for both viewable_rate and viewed_seconds"
|