@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
package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/product_signal_targeting.yaml
ADDED
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
id: media_buy_seller/product_signal_targeting
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Seller exposes wholesale signal options and honors package-level signal_targeting_groups"
|
|
4
|
+
category: media_buy_seller
|
|
5
|
+
summary: "Verifies that a seller with wholesale products and wholesale get_signals can expose signal targeting eligibility, accept package-level signal_targeting_groups with pricing, reject unknown signals, and echo the applied grouped expression on readback."
|
|
6
|
+
track: media_buy
|
|
7
|
+
|
|
8
|
+
# Gate: this scenario is for sellers that expose the selectable signal menu
|
|
9
|
+
# through the wholesale signals feed. Product-specific inline menus are covered
|
|
10
|
+
# by schema and product-discovery checks; this storyboard exercises the
|
|
11
|
+
# cross-surface wholesale composition path.
|
|
12
|
+
requires_capability:
|
|
13
|
+
path: signals.discovery_modes
|
|
14
|
+
present: true
|
|
15
|
+
|
|
16
|
+
required_tools:
|
|
17
|
+
- get_products
|
|
18
|
+
- get_signals
|
|
19
|
+
- create_media_buy
|
|
20
|
+
- get_media_buys
|
|
21
|
+
- comply_test_controller
|
|
22
|
+
|
|
23
|
+
invariants:
|
|
24
|
+
- status.monotonic
|
|
25
|
+
|
|
26
|
+
narrative: |
|
|
27
|
+
Product-scoped signal targeting connects three surfaces:
|
|
28
|
+
|
|
29
|
+
1. get_products declares whether the selected product has a package-level
|
|
30
|
+
signal targeting surface through signal_targeting_allowed and optional
|
|
31
|
+
signal_targeting_rules.
|
|
32
|
+
2. get_signals returns the selectable wholesale signal feed when the
|
|
33
|
+
wholesale product omits inline signal_targeting_options.
|
|
34
|
+
3. create_media_buy binds the selected signals to the package through
|
|
35
|
+
targeting_overlay.signal_targeting_groups, including the selected
|
|
36
|
+
signal pricing_option_id when the signal has incremental pricing.
|
|
37
|
+
|
|
38
|
+
This scenario verifies the wholesale path: the seller returns a product with
|
|
39
|
+
signal_targeting_allowed: true, returns targetable signals from get_signals,
|
|
40
|
+
accepts a buy with a grouped signal expression, rejects an unknown signal_ref,
|
|
41
|
+
and echoes the applied signal_targeting_groups on get_media_buys so the buyer
|
|
42
|
+
can audit what was actually booked.
|
|
43
|
+
|
|
44
|
+
agent:
|
|
45
|
+
interaction_model: media_buy_seller
|
|
46
|
+
capabilities:
|
|
47
|
+
- sells_media
|
|
48
|
+
- supports_non_guaranteed
|
|
49
|
+
- wholesale_signal_targeting
|
|
50
|
+
examples:
|
|
51
|
+
- "Programmatic sellers exposing audience and key-value targeting as seller-offered signals"
|
|
52
|
+
- "Retail media networks that let buyers apply shopper intent signals to a product"
|
|
53
|
+
- "Audio or video sellers that expose a wholesale signal feed for package composition"
|
|
54
|
+
|
|
55
|
+
caller:
|
|
56
|
+
role: buyer_agent
|
|
57
|
+
example: "Pinnacle Agency (buyer)"
|
|
58
|
+
|
|
59
|
+
prerequisites:
|
|
60
|
+
description: |
|
|
61
|
+
The seller must implement comply_test_controller seeding for products and
|
|
62
|
+
pricing, and must expose a get_signals wholesale feed with at least two
|
|
63
|
+
selectable signals. The seeded product intentionally omits inline
|
|
64
|
+
signal_targeting_options, so the buyer uses get_signals as the selectable
|
|
65
|
+
signal menu.
|
|
66
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
67
|
+
controller_seeding: true
|
|
68
|
+
|
|
69
|
+
fixtures:
|
|
70
|
+
products:
|
|
71
|
+
- product_id: "signal_targeted_display_q2"
|
|
72
|
+
delivery_type: "non_guaranteed"
|
|
73
|
+
channels: ["display"]
|
|
74
|
+
format_ids:
|
|
75
|
+
- id: "display_300x250"
|
|
76
|
+
signal_targeting_allowed: true
|
|
77
|
+
signal_targeting_rules:
|
|
78
|
+
resolution_model: "direct_targeting"
|
|
79
|
+
selection_mode: "optional"
|
|
80
|
+
max_signal_targeting_groups: 2
|
|
81
|
+
max_signals_per_targeting_group: 3
|
|
82
|
+
pricing_options:
|
|
83
|
+
- product_id: "signal_targeted_display_q2"
|
|
84
|
+
pricing_option_id: "auction_cpm"
|
|
85
|
+
pricing_model: "cpm"
|
|
86
|
+
currency: "USD"
|
|
87
|
+
floor_price: 3.00
|
|
88
|
+
|
|
89
|
+
phases:
|
|
90
|
+
- id: discover_wholesale_product
|
|
91
|
+
title: "Discover a wholesale product that allows signal targeting"
|
|
92
|
+
narrative: |
|
|
93
|
+
The buyer starts from wholesale product discovery. The product does not
|
|
94
|
+
need to duplicate the full signal menu inline; signal_targeting_allowed
|
|
95
|
+
tells the buyer that package-level signal_targeting_groups are valid and
|
|
96
|
+
signal_targeting_rules tells the buyer how to compose them.
|
|
97
|
+
steps:
|
|
98
|
+
- id: get_products_wholesale
|
|
99
|
+
title: "Enumerate wholesale products"
|
|
100
|
+
task: get_products
|
|
101
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
102
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
103
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
104
|
+
stateful: true
|
|
105
|
+
expected: |
|
|
106
|
+
Return a product with signal_targeting_allowed: true and product-scoped
|
|
107
|
+
signal_targeting_rules. Inline signal_targeting_options may be omitted
|
|
108
|
+
because this scenario uses get_signals as the selectable signal feed.
|
|
109
|
+
sample_request:
|
|
110
|
+
buying_mode: "wholesale"
|
|
111
|
+
filters:
|
|
112
|
+
channels: ["display"]
|
|
113
|
+
account:
|
|
114
|
+
brand:
|
|
115
|
+
domain: "acmeoutdoor.example"
|
|
116
|
+
operator: "pinnacle-agency.example"
|
|
117
|
+
sandbox: true
|
|
118
|
+
context:
|
|
119
|
+
correlation_id: "product_signal_targeting--get_products_wholesale"
|
|
120
|
+
context_outputs:
|
|
121
|
+
- key: "product_id"
|
|
122
|
+
path: "products[0].product_id"
|
|
123
|
+
- key: "pricing_option_id"
|
|
124
|
+
path: "products[0].pricing_options[0].pricing_option_id"
|
|
125
|
+
validations:
|
|
126
|
+
- check: response_schema
|
|
127
|
+
description: "Response matches get-products-response.json schema"
|
|
128
|
+
- check: field_value
|
|
129
|
+
path: "products[0].signal_targeting_allowed"
|
|
130
|
+
allowed_values: [true]
|
|
131
|
+
description: "Product declares package-level signal targeting"
|
|
132
|
+
- check: field_present
|
|
133
|
+
path: "products[0].signal_targeting_rules"
|
|
134
|
+
description: "Product declares signal targeting composition rules"
|
|
135
|
+
- check: field_present
|
|
136
|
+
path: "context"
|
|
137
|
+
description: "Response echoes back the context object"
|
|
138
|
+
- check: field_value
|
|
139
|
+
path: "context.correlation_id"
|
|
140
|
+
value: "product_signal_targeting--get_products_wholesale"
|
|
141
|
+
description: "Context correlation_id returned unchanged"
|
|
142
|
+
|
|
143
|
+
- id: discover_wholesale_signals
|
|
144
|
+
title: "Read the selectable signal feed"
|
|
145
|
+
narrative: |
|
|
146
|
+
Because the product did not inline a signal menu, the buyer calls
|
|
147
|
+
get_signals in wholesale mode. The returned signal_ref is the buy-time
|
|
148
|
+
identity, and pricing_options supplies the pricing_option_id used in
|
|
149
|
+
package signal targeting groups.
|
|
150
|
+
steps:
|
|
151
|
+
- id: get_signals_wholesale
|
|
152
|
+
title: "Enumerate wholesale signals"
|
|
153
|
+
task: get_signals
|
|
154
|
+
schema_ref: "signals/get-signals-request.json"
|
|
155
|
+
response_schema_ref: "signals/get-signals-response.json"
|
|
156
|
+
doc_ref: "/signals/tasks/get_signals"
|
|
157
|
+
stateful: false
|
|
158
|
+
expected: |
|
|
159
|
+
Return at least two schema-valid signal entries with signal_ref,
|
|
160
|
+
signal_agent_segment_id, value_type, and pricing_options. The buyer
|
|
161
|
+
will include the first signal and exclude the second.
|
|
162
|
+
sample_request:
|
|
163
|
+
discovery_mode: "wholesale"
|
|
164
|
+
account:
|
|
165
|
+
brand:
|
|
166
|
+
domain: "acmeoutdoor.example"
|
|
167
|
+
operator: "pinnacle-agency.example"
|
|
168
|
+
sandbox: true
|
|
169
|
+
destinations:
|
|
170
|
+
- type: "agent"
|
|
171
|
+
agent_url: "https://wonderstruck.salesagents.example"
|
|
172
|
+
countries: ["US"]
|
|
173
|
+
context:
|
|
174
|
+
correlation_id: "product_signal_targeting--get_signals_wholesale"
|
|
175
|
+
context_outputs:
|
|
176
|
+
- key: "include_signal_ref"
|
|
177
|
+
path: "signals[0].signal_ref"
|
|
178
|
+
- key: "include_signal_pricing_option_id"
|
|
179
|
+
path: "signals[0].pricing_options[0].pricing_option_id"
|
|
180
|
+
- key: "include_signal_agent_segment_id"
|
|
181
|
+
path: "signals[0].signal_agent_segment_id"
|
|
182
|
+
- key: "exclude_signal_ref"
|
|
183
|
+
path: "signals[1].signal_ref"
|
|
184
|
+
- key: "exclude_signal_pricing_option_id"
|
|
185
|
+
path: "signals[1].pricing_options[0].pricing_option_id"
|
|
186
|
+
- key: "exclude_signal_agent_segment_id"
|
|
187
|
+
path: "signals[1].signal_agent_segment_id"
|
|
188
|
+
validations:
|
|
189
|
+
- check: response_schema
|
|
190
|
+
description: "Response matches get-signals-response.json schema"
|
|
191
|
+
- check: field_present
|
|
192
|
+
path: "signals[0].signal_ref.scope"
|
|
193
|
+
description: "First signal carries canonical signal_ref identity"
|
|
194
|
+
- check: field_present
|
|
195
|
+
path: "signals[0].pricing_options[0].pricing_option_id"
|
|
196
|
+
description: "First signal carries a selectable pricing option"
|
|
197
|
+
- check: field_present
|
|
198
|
+
path: "signals[1].signal_ref.scope"
|
|
199
|
+
description: "Second signal carries canonical signal_ref identity for exclusion"
|
|
200
|
+
- check: field_present
|
|
201
|
+
path: "context"
|
|
202
|
+
description: "Response echoes back the context object"
|
|
203
|
+
- check: field_value
|
|
204
|
+
path: "context.correlation_id"
|
|
205
|
+
value: "product_signal_targeting--get_signals_wholesale"
|
|
206
|
+
description: "Context correlation_id returned unchanged"
|
|
207
|
+
|
|
208
|
+
- id: create_with_signal_groups
|
|
209
|
+
title: "Create a media buy with include and exclude signal groups"
|
|
210
|
+
narrative: |
|
|
211
|
+
The buyer selects one signal for inclusion and one for exclusion. The
|
|
212
|
+
top-level operator is always all; child any groups include users matching
|
|
213
|
+
at least one signal, and child none groups exclude users matching any
|
|
214
|
+
listed signal. Binary signal entries use value: true in both groups.
|
|
215
|
+
steps:
|
|
216
|
+
- id: create_media_buy_with_signal_groups
|
|
217
|
+
title: "Create media buy with signal_targeting_groups"
|
|
218
|
+
task: create_media_buy
|
|
219
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
220
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
221
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
222
|
+
stateful: true
|
|
223
|
+
expected: |
|
|
224
|
+
Create the buy and persist the grouped signal targeting expression.
|
|
225
|
+
The selected signal pricing_option_id values are available for billing
|
|
226
|
+
verification.
|
|
227
|
+
sample_request:
|
|
228
|
+
brand:
|
|
229
|
+
domain: "acmeoutdoor.example"
|
|
230
|
+
account:
|
|
231
|
+
brand:
|
|
232
|
+
domain: "acmeoutdoor.example"
|
|
233
|
+
operator: "pinnacle-agency.example"
|
|
234
|
+
sandbox: true
|
|
235
|
+
start_time: "2026-07-01T00:00:00Z"
|
|
236
|
+
end_time: "2026-07-31T23:59:59Z"
|
|
237
|
+
packages:
|
|
238
|
+
- product_id: "$context.product_id"
|
|
239
|
+
pricing_option_id: "$context.pricing_option_id"
|
|
240
|
+
budget: 12000
|
|
241
|
+
targeting_overlay:
|
|
242
|
+
signal_targeting_groups:
|
|
243
|
+
operator: "all"
|
|
244
|
+
groups:
|
|
245
|
+
- operator: "any"
|
|
246
|
+
signals:
|
|
247
|
+
- signal_ref: "$context.include_signal_ref"
|
|
248
|
+
signal_agent_segment_id: "$context.include_signal_agent_segment_id"
|
|
249
|
+
pricing_option_id: "$context.include_signal_pricing_option_id"
|
|
250
|
+
value_type: "binary"
|
|
251
|
+
value: true
|
|
252
|
+
- operator: "none"
|
|
253
|
+
signals:
|
|
254
|
+
- signal_ref: "$context.exclude_signal_ref"
|
|
255
|
+
signal_agent_segment_id: "$context.exclude_signal_agent_segment_id"
|
|
256
|
+
pricing_option_id: "$context.exclude_signal_pricing_option_id"
|
|
257
|
+
value_type: "binary"
|
|
258
|
+
value: true
|
|
259
|
+
idempotency_key: "$generate:uuid_v4#product_signal_targeting_create_media_buy"
|
|
260
|
+
context:
|
|
261
|
+
correlation_id: "product_signal_targeting--create_media_buy_with_signal_groups"
|
|
262
|
+
context_outputs:
|
|
263
|
+
- key: "media_buy_id"
|
|
264
|
+
path: "media_buy_id"
|
|
265
|
+
validations:
|
|
266
|
+
- check: response_schema
|
|
267
|
+
description: "Response matches create-media-buy-response.json schema"
|
|
268
|
+
- check: field_present
|
|
269
|
+
path: "media_buy_id"
|
|
270
|
+
description: "Seller assigns a media_buy_id"
|
|
271
|
+
- check: field_present
|
|
272
|
+
path: "context"
|
|
273
|
+
description: "Response echoes back the context object"
|
|
274
|
+
|
|
275
|
+
- id: verify_signal_groups_echo
|
|
276
|
+
title: "Verify the applied grouped signal expression is readable"
|
|
277
|
+
narrative: |
|
|
278
|
+
The seller must echo applied signal_targeting_groups on package state so
|
|
279
|
+
the buyer can audit the booked include/exclude expression and selected
|
|
280
|
+
signal pricing options.
|
|
281
|
+
steps:
|
|
282
|
+
- id: get_after_create
|
|
283
|
+
title: "Read back the buy and confirm signal_targeting_groups"
|
|
284
|
+
task: get_media_buys
|
|
285
|
+
schema_ref: "media-buy/get-media-buys-request.json"
|
|
286
|
+
response_schema_ref: "media-buy/get-media-buys-response.json"
|
|
287
|
+
doc_ref: "/media-buy/task-reference/get_media_buys"
|
|
288
|
+
stateful: true
|
|
289
|
+
expected: |
|
|
290
|
+
Return the media buy with the package targeting_overlay carrying the
|
|
291
|
+
same signal_targeting_groups operator structure sent on create.
|
|
292
|
+
sample_request:
|
|
293
|
+
account:
|
|
294
|
+
brand:
|
|
295
|
+
domain: "acmeoutdoor.example"
|
|
296
|
+
operator: "pinnacle-agency.example"
|
|
297
|
+
sandbox: true
|
|
298
|
+
media_buy_ids:
|
|
299
|
+
- "$context.media_buy_id"
|
|
300
|
+
context:
|
|
301
|
+
correlation_id: "product_signal_targeting--get_after_create"
|
|
302
|
+
validations:
|
|
303
|
+
- check: response_schema
|
|
304
|
+
description: "Response matches get-media-buys-response.json schema"
|
|
305
|
+
- check: field_value
|
|
306
|
+
path: "media_buys[0].packages[0].targeting_overlay.signal_targeting_groups.operator"
|
|
307
|
+
value: "all"
|
|
308
|
+
description: "Top-level signal targeting operator is all"
|
|
309
|
+
- check: field_value
|
|
310
|
+
path: "media_buys[0].packages[0].targeting_overlay.signal_targeting_groups.groups[0].operator"
|
|
311
|
+
value: "any"
|
|
312
|
+
description: "Include group is represented as an any group"
|
|
313
|
+
- check: field_value
|
|
314
|
+
path: "media_buys[0].packages[0].targeting_overlay.signal_targeting_groups.groups[1].operator"
|
|
315
|
+
value: "none"
|
|
316
|
+
description: "Exclude group is represented as a none group"
|
|
317
|
+
- check: field_present
|
|
318
|
+
path: "media_buys[0].packages[0].targeting_overlay.signal_targeting_groups.groups[0].signals[0].pricing_option_id"
|
|
319
|
+
description: "Selected signal pricing_option_id is persisted for billing audit"
|
|
320
|
+
|
|
321
|
+
- id: reject_unknown_signal
|
|
322
|
+
title: "Reject a buy that references an unknown signal"
|
|
323
|
+
narrative: |
|
|
324
|
+
Silent acceptance of a signal the seller did not advertise is a facade:
|
|
325
|
+
the seller cannot prove the package was targeted to the buyer's intended
|
|
326
|
+
signal. The seller must reject unknown or ineligible signal_ref values.
|
|
327
|
+
steps:
|
|
328
|
+
- id: create_media_buy_with_unknown_signal
|
|
329
|
+
title: "Submit a buy with an unadvertised product-local signal"
|
|
330
|
+
task: create_media_buy
|
|
331
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
332
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
333
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
334
|
+
expect_error: true
|
|
335
|
+
negative_path: payload_well_formed
|
|
336
|
+
stateful: false
|
|
337
|
+
expected: |
|
|
338
|
+
Reject with INVALID_REQUEST. error.field points at the offending
|
|
339
|
+
signal_ref path inside signal_targeting_groups.
|
|
340
|
+
sample_request:
|
|
341
|
+
brand:
|
|
342
|
+
domain: "acmeoutdoor.example"
|
|
343
|
+
account:
|
|
344
|
+
brand:
|
|
345
|
+
domain: "acmeoutdoor.example"
|
|
346
|
+
operator: "pinnacle-agency.example"
|
|
347
|
+
sandbox: true
|
|
348
|
+
start_time: "2026-07-01T00:00:00Z"
|
|
349
|
+
end_time: "2026-07-31T23:59:59Z"
|
|
350
|
+
packages:
|
|
351
|
+
- product_id: "$context.product_id"
|
|
352
|
+
pricing_option_id: "$context.pricing_option_id"
|
|
353
|
+
budget: 5000
|
|
354
|
+
targeting_overlay:
|
|
355
|
+
signal_targeting_groups:
|
|
356
|
+
operator: "all"
|
|
357
|
+
groups:
|
|
358
|
+
- operator: "any"
|
|
359
|
+
signals:
|
|
360
|
+
- signal_ref:
|
|
361
|
+
scope: "product"
|
|
362
|
+
signal_id: "phantom_signal_not_advertised"
|
|
363
|
+
value_type: "binary"
|
|
364
|
+
value: true
|
|
365
|
+
idempotency_key: "$generate:uuid_v4#product_signal_targeting_unknown_signal"
|
|
366
|
+
validations:
|
|
367
|
+
- check: error_code
|
|
368
|
+
allowed_values: ["INVALID_REQUEST"]
|
|
369
|
+
description: "Seller rejects the unadvertised signal_ref with INVALID_REQUEST"
|
|
370
|
+
- check: field_value
|
|
371
|
+
path: "errors[0].field"
|
|
372
|
+
value: "packages[0].targeting_overlay.signal_targeting_groups.groups[0].signals[0].signal_ref"
|
|
373
|
+
description: "Error.field points at the offending signal_ref path"
|