@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,576 @@
|
|
|
1
|
+
id: media_buy_seller/vendor_metric_optimization_flow
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Vendor-metric optimization-goal: acceptance and rejection"
|
|
4
|
+
category: media_buy_seller
|
|
5
|
+
summary: "Verifies that a seller supporting vendor_metric_optimization accepts a media buy whose optimization_goal has kind 'vendor_metric' when all preconditions are met, and rejects goals that fail either the capability check or the reporting-coherence check."
|
|
6
|
+
track: media_buy
|
|
7
|
+
introduced_in: "3.1"
|
|
8
|
+
|
|
9
|
+
# Gate: scenario runs only when the seller declares vendor-metric
|
|
10
|
+
# optimization support. The product-level vendor_metric_optimization block
|
|
11
|
+
# remains the authoritative per-product capability, including target-kind
|
|
12
|
+
# support on the seeded product.
|
|
13
|
+
requires_capability:
|
|
14
|
+
path: media_buy.vendor_metric_optimization
|
|
15
|
+
present: true
|
|
16
|
+
|
|
17
|
+
required_tools:
|
|
18
|
+
- get_products
|
|
19
|
+
- create_media_buy
|
|
20
|
+
- comply_test_controller
|
|
21
|
+
|
|
22
|
+
narrative: |
|
|
23
|
+
AdCP 3.1 adds optimization_goals[].kind: "vendor_metric" — a goal that steers
|
|
24
|
+
the seller's bidding stack toward a specific vendor's measurement metric (e.g.,
|
|
25
|
+
attention, emissions, brand lift). Three runtime preconditions govern
|
|
26
|
+
acceptance:
|
|
27
|
+
|
|
28
|
+
1. Capability — the (vendor, metric_id) pair MUST appear in the product's
|
|
29
|
+
vendor_metric_optimization.supported_metrics[], and the goal's target.kind
|
|
30
|
+
MUST appear in that entry's supported_targets.
|
|
31
|
+
|
|
32
|
+
2. Reporting coherence — the package's committed_metrics[] MUST include a
|
|
33
|
+
matching { scope: "vendor", vendor, metric_id } entry. Optimization without
|
|
34
|
+
committed reporting is unverifiable and is rejected at the wire level.
|
|
35
|
+
|
|
36
|
+
3. Discovery (SHOULD) — the metric_id SHOULD be discoverable in the vendor's
|
|
37
|
+
published measurement.metrics[] catalog. This check is SHOULD-level in 3.1
|
|
38
|
+
while measurement-vendor adoption of AdCP-conformant capability publication
|
|
39
|
+
catches up; it tightens to MUST at the next minor. Sellers MAY reject with
|
|
40
|
+
TERMS_REJECTED on a catalog miss; sellers that accept do not fail this
|
|
41
|
+
storyboard.
|
|
42
|
+
|
|
43
|
+
This storyboard covers:
|
|
44
|
+
- Positive path: goal accepted when all preconditions are met, including
|
|
45
|
+
the target-less maximize-within-budget form
|
|
46
|
+
- Negative path A: goal rejected when (vendor, metric_id) not in supported_metrics
|
|
47
|
+
- Negative path B: goal rejected when target.kind is not in supported_targets
|
|
48
|
+
- Negative path C: goal rejected when package committed_metrics lacks vendor-scope entry
|
|
49
|
+
- Negative path D: goal rejected when the metric is optimizable but not reportable
|
|
50
|
+
|
|
51
|
+
The existing vendor_metric_accountability storyboard (declaration → filter →
|
|
52
|
+
delivery emission) is unchanged and exercises a separate contract.
|
|
53
|
+
|
|
54
|
+
agent:
|
|
55
|
+
interaction_model: media_buy_seller
|
|
56
|
+
capabilities:
|
|
57
|
+
- sells_media
|
|
58
|
+
examples:
|
|
59
|
+
- "Premium publishers with attention measurement optimization"
|
|
60
|
+
- "Sustainability-focused sellers with emissions-metric steering"
|
|
61
|
+
- "Sellers integrating brand-lift vendors into their bidding stack"
|
|
62
|
+
|
|
63
|
+
caller:
|
|
64
|
+
role: buyer_agent
|
|
65
|
+
example: "Pinnacle Agency (buyer)"
|
|
66
|
+
|
|
67
|
+
prerequisites:
|
|
68
|
+
description: |
|
|
69
|
+
The seller supports comply_test_controller and can seed products with
|
|
70
|
+
vendor_metric_optimization.supported_metrics[]. The seeded product must
|
|
71
|
+
appear in get_products responses. The seller enforces the three preconditions
|
|
72
|
+
for vendor_metric goals at create_media_buy time.
|
|
73
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
74
|
+
controller_seeding: true
|
|
75
|
+
|
|
76
|
+
fixtures:
|
|
77
|
+
products:
|
|
78
|
+
- product_id: "display_vendor_metric_opt"
|
|
79
|
+
delivery_type: "non_guaranteed"
|
|
80
|
+
channels: ["display"]
|
|
81
|
+
format_ids:
|
|
82
|
+
- id: "display_300x250"
|
|
83
|
+
reporting_capabilities:
|
|
84
|
+
available_metrics:
|
|
85
|
+
- impressions
|
|
86
|
+
- clicks
|
|
87
|
+
- spend
|
|
88
|
+
vendor_metrics:
|
|
89
|
+
- vendor:
|
|
90
|
+
domain: "attentionvendor.example"
|
|
91
|
+
metric_id: "attention_score"
|
|
92
|
+
- vendor:
|
|
93
|
+
domain: "attentionvendor.example"
|
|
94
|
+
metric_id: "attention_units"
|
|
95
|
+
vendor_metric_optimization:
|
|
96
|
+
supported_metrics:
|
|
97
|
+
- vendor:
|
|
98
|
+
domain: "attentionvendor.example"
|
|
99
|
+
metric_id: "attention_score"
|
|
100
|
+
supported_targets:
|
|
101
|
+
- threshold_rate
|
|
102
|
+
- product_id: "display_vendor_metric_unreportable"
|
|
103
|
+
delivery_type: "non_guaranteed"
|
|
104
|
+
channels: ["display"]
|
|
105
|
+
format_ids:
|
|
106
|
+
- id: "display_300x250"
|
|
107
|
+
reporting_capabilities:
|
|
108
|
+
available_metrics:
|
|
109
|
+
- impressions
|
|
110
|
+
- clicks
|
|
111
|
+
- spend
|
|
112
|
+
vendor_metric_optimization:
|
|
113
|
+
supported_metrics:
|
|
114
|
+
- vendor:
|
|
115
|
+
domain: "attentionvendor.example"
|
|
116
|
+
metric_id: "attention_score"
|
|
117
|
+
supported_targets:
|
|
118
|
+
- threshold_rate
|
|
119
|
+
pricing_options:
|
|
120
|
+
- product_id: "display_vendor_metric_opt"
|
|
121
|
+
pricing_option_id: "cpm_vendor_opt"
|
|
122
|
+
pricing_model: "cpm"
|
|
123
|
+
currency: "USD"
|
|
124
|
+
fixed_price: 14.0
|
|
125
|
+
- product_id: "display_vendor_metric_unreportable"
|
|
126
|
+
pricing_option_id: "cpm_vendor_opt_unreportable"
|
|
127
|
+
pricing_model: "cpm"
|
|
128
|
+
currency: "USD"
|
|
129
|
+
fixed_price: 14.0
|
|
130
|
+
|
|
131
|
+
phases:
|
|
132
|
+
- id: discover_vendor_metric_optimization
|
|
133
|
+
title: "Discover a product that declares vendor_metric_optimization"
|
|
134
|
+
narrative: |
|
|
135
|
+
The buyer looks for display inventory that can steer delivery toward an
|
|
136
|
+
attention vendor's metric. The product response includes
|
|
137
|
+
vendor_metric_optimization.supported_metrics[] listing the
|
|
138
|
+
attentionvendor.example attention_score with threshold_rate as a supported
|
|
139
|
+
target kind.
|
|
140
|
+
steps:
|
|
141
|
+
- id: sync_accounts
|
|
142
|
+
title: "Establish account"
|
|
143
|
+
task: sync_accounts
|
|
144
|
+
schema_ref: "account/sync-accounts-request.json"
|
|
145
|
+
response_schema_ref: "account/sync-accounts-response.json"
|
|
146
|
+
doc_ref: "/accounts/tasks/sync_accounts"
|
|
147
|
+
stateful: true
|
|
148
|
+
expected: |
|
|
149
|
+
Return the account with account_id and status active.
|
|
150
|
+
sample_request:
|
|
151
|
+
accounts:
|
|
152
|
+
- brand:
|
|
153
|
+
domain: "acmeoutdoor.example"
|
|
154
|
+
operator: "pinnacle-agency.example"
|
|
155
|
+
billing: "operator"
|
|
156
|
+
payment_terms: "net_30"
|
|
157
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_vendor_metric_opt_setup_sync_accounts"
|
|
158
|
+
validations:
|
|
159
|
+
- check: response_schema
|
|
160
|
+
description: "Response matches sync-accounts-response.json schema"
|
|
161
|
+
- check: field_present
|
|
162
|
+
path: "accounts[0].account_id"
|
|
163
|
+
description: "Account has a platform-assigned ID"
|
|
164
|
+
|
|
165
|
+
- id: get_products_vendor_metric_opt
|
|
166
|
+
title: "Discover product with vendor_metric_optimization capability"
|
|
167
|
+
task: get_products
|
|
168
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
169
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
170
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
171
|
+
comply_scenario: full_sales_flow
|
|
172
|
+
stateful: false
|
|
173
|
+
expected: |
|
|
174
|
+
Return at least one product whose vendor_metric_optimization.supported_metrics[]
|
|
175
|
+
includes an entry for attentionvendor.example / attention_score. The
|
|
176
|
+
supported_targets on that entry includes threshold_rate.
|
|
177
|
+
sample_request:
|
|
178
|
+
buying_mode: "brief"
|
|
179
|
+
brief: "Display inventory with attention-score optimization from attentionvendor."
|
|
180
|
+
filters:
|
|
181
|
+
channels: ["display"]
|
|
182
|
+
account:
|
|
183
|
+
brand:
|
|
184
|
+
domain: "acmeoutdoor.example"
|
|
185
|
+
operator: "pinnacle-agency.example"
|
|
186
|
+
context_outputs:
|
|
187
|
+
- path: "products[0].product_id"
|
|
188
|
+
name: "product_id"
|
|
189
|
+
- path: "products[0].pricing_options[0].pricing_option_id"
|
|
190
|
+
name: "pricing_option_id"
|
|
191
|
+
validations:
|
|
192
|
+
- check: response_schema
|
|
193
|
+
description: "Response matches get-products-response.json schema"
|
|
194
|
+
- check: field_present
|
|
195
|
+
path: "products[0].product_id"
|
|
196
|
+
description: "At least one product returned"
|
|
197
|
+
- check: field_present
|
|
198
|
+
path: "products[0].vendor_metric_optimization.supported_metrics"
|
|
199
|
+
description: "Product declares vendor_metric_optimization.supported_metrics[]"
|
|
200
|
+
- check: field_value
|
|
201
|
+
path: "products[0].vendor_metric_optimization.supported_metrics[0].vendor.domain"
|
|
202
|
+
value: "attentionvendor.example"
|
|
203
|
+
description: "Capability binds the optimization metric to the declared vendor"
|
|
204
|
+
- check: field_value
|
|
205
|
+
path: "products[0].vendor_metric_optimization.supported_metrics[0].metric_id"
|
|
206
|
+
value: "attention_score"
|
|
207
|
+
description: "Capability lists the attention_score metric_id"
|
|
208
|
+
- check: field_value
|
|
209
|
+
path: "products[0].vendor_metric_optimization.supported_metrics[0].supported_targets[0]"
|
|
210
|
+
value: "threshold_rate"
|
|
211
|
+
description: "Capability lists threshold_rate as a supported target kind"
|
|
212
|
+
|
|
213
|
+
- id: create_positive_path
|
|
214
|
+
title: "Accept vendor_metric goal when all preconditions are satisfied"
|
|
215
|
+
narrative: |
|
|
216
|
+
The buyer submits a create_media_buy with an optimization_goal of kind
|
|
217
|
+
vendor_metric, targeting attention_score with a threshold_rate of 70. The
|
|
218
|
+
package also includes a vendor-scope committed_metrics[] entry for the same
|
|
219
|
+
(vendor, metric_id) pair — satisfying the reporting-coherence precondition.
|
|
220
|
+
The seller accepts and returns a media_buy_id.
|
|
221
|
+
steps:
|
|
222
|
+
- id: create_media_buy_positive
|
|
223
|
+
title: "Create media buy with valid vendor_metric optimization goal"
|
|
224
|
+
task: create_media_buy
|
|
225
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
226
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
227
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
228
|
+
comply_scenario: create_media_buy
|
|
229
|
+
auth:
|
|
230
|
+
type: api_key
|
|
231
|
+
from_test_kit: true
|
|
232
|
+
stateful: true
|
|
233
|
+
expected: |
|
|
234
|
+
Accept the buy. The optimization goal is valid: attention_score is in
|
|
235
|
+
supported_metrics for attentionvendor.example, threshold_rate is in
|
|
236
|
+
supported_targets, and committed_metrics[] carries the vendor-scope entry.
|
|
237
|
+
Seller returns a media_buy_id.
|
|
238
|
+
sample_request:
|
|
239
|
+
brand:
|
|
240
|
+
domain: "acmeoutdoor.example"
|
|
241
|
+
account:
|
|
242
|
+
brand:
|
|
243
|
+
domain: "acmeoutdoor.example"
|
|
244
|
+
operator: "pinnacle-agency.example"
|
|
245
|
+
start_time: "2026-06-01T00:00:00Z"
|
|
246
|
+
end_time: "2026-06-30T23:59:59Z"
|
|
247
|
+
packages:
|
|
248
|
+
- product_id: "$context.product_id"
|
|
249
|
+
pricing_option_id: "$context.pricing_option_id"
|
|
250
|
+
budget: 5000
|
|
251
|
+
optimization_goals:
|
|
252
|
+
- kind: "vendor_metric"
|
|
253
|
+
vendor:
|
|
254
|
+
domain: "attentionvendor.example"
|
|
255
|
+
metric_id: "attention_score"
|
|
256
|
+
target:
|
|
257
|
+
kind: "threshold_rate"
|
|
258
|
+
value: 70
|
|
259
|
+
priority: 1
|
|
260
|
+
committed_metrics:
|
|
261
|
+
- scope: "vendor"
|
|
262
|
+
vendor:
|
|
263
|
+
domain: "attentionvendor.example"
|
|
264
|
+
metric_id: "attention_score"
|
|
265
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_vendor_metric_opt_positive"
|
|
266
|
+
context_outputs:
|
|
267
|
+
- path: "media_buy_id"
|
|
268
|
+
name: "media_buy_id"
|
|
269
|
+
validations:
|
|
270
|
+
- check: response_schema
|
|
271
|
+
description: "Response matches create-media-buy-response.json schema"
|
|
272
|
+
- check: field_present
|
|
273
|
+
path: "media_buy_id"
|
|
274
|
+
description: "Seller returns a media_buy_id — buy accepted"
|
|
275
|
+
|
|
276
|
+
- id: create_targetless_positive_path
|
|
277
|
+
title: "Accept target-less vendor_metric goal as maximize-within-budget"
|
|
278
|
+
narrative: |
|
|
279
|
+
A buyer may omit target on a vendor_metric optimization goal. In that
|
|
280
|
+
form, the seller maximizes the vendor metric within the package budget.
|
|
281
|
+
The capability precondition still applies to the (vendor, metric_id)
|
|
282
|
+
pair, and reporting coherence still requires a matching vendor-scope
|
|
283
|
+
committed_metrics[] entry.
|
|
284
|
+
steps:
|
|
285
|
+
- id: create_media_buy_targetless_positive
|
|
286
|
+
title: "Create media buy with target-less vendor_metric optimization goal"
|
|
287
|
+
task: create_media_buy
|
|
288
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
289
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
290
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
291
|
+
comply_scenario: create_media_buy
|
|
292
|
+
auth:
|
|
293
|
+
type: api_key
|
|
294
|
+
from_test_kit: true
|
|
295
|
+
stateful: true
|
|
296
|
+
expected: |
|
|
297
|
+
Accept the buy. The optimization goal has no target, so supported_targets
|
|
298
|
+
does not need to be consulted; attention_score is in supported_metrics
|
|
299
|
+
and committed_metrics[] carries the vendor-scope entry.
|
|
300
|
+
sample_request:
|
|
301
|
+
brand:
|
|
302
|
+
domain: "acmeoutdoor.example"
|
|
303
|
+
account:
|
|
304
|
+
brand:
|
|
305
|
+
domain: "acmeoutdoor.example"
|
|
306
|
+
operator: "pinnacle-agency.example"
|
|
307
|
+
start_time: "2026-06-01T00:00:00Z"
|
|
308
|
+
end_time: "2026-06-30T23:59:59Z"
|
|
309
|
+
packages:
|
|
310
|
+
- product_id: "$context.product_id"
|
|
311
|
+
pricing_option_id: "$context.pricing_option_id"
|
|
312
|
+
budget: 5000
|
|
313
|
+
optimization_goals:
|
|
314
|
+
- kind: "vendor_metric"
|
|
315
|
+
vendor:
|
|
316
|
+
domain: "attentionvendor.example"
|
|
317
|
+
metric_id: "attention_score"
|
|
318
|
+
priority: 1
|
|
319
|
+
committed_metrics:
|
|
320
|
+
- scope: "vendor"
|
|
321
|
+
vendor:
|
|
322
|
+
domain: "attentionvendor.example"
|
|
323
|
+
metric_id: "attention_score"
|
|
324
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_vendor_metric_opt_targetless_positive"
|
|
325
|
+
validations:
|
|
326
|
+
- check: response_schema
|
|
327
|
+
description: "Response matches create-media-buy-response.json schema"
|
|
328
|
+
- check: field_present
|
|
329
|
+
path: "media_buy_id"
|
|
330
|
+
description: "Seller returns a media_buy_id — target-less goal accepted"
|
|
331
|
+
|
|
332
|
+
- id: reject_unsupported_capability
|
|
333
|
+
title: "Reject vendor_metric goal when (vendor, metric_id) not in supported_metrics"
|
|
334
|
+
narrative: |
|
|
335
|
+
The buyer sends a goal for attention_units from attentionvendor.example —
|
|
336
|
+
a reportable (vendor, metric_id) pair that does not appear in the product's
|
|
337
|
+
vendor_metric_optimization.supported_metrics[]. Per the spec, the seller
|
|
338
|
+
MUST reject such goals. The correct code is TERMS_REJECTED; error.field
|
|
339
|
+
should point at the offending goal's metric_id path.
|
|
340
|
+
steps:
|
|
341
|
+
- id: create_media_buy_unsupported_metric
|
|
342
|
+
title: "Submit goal with (vendor, metric_id) not in supported_metrics"
|
|
343
|
+
task: create_media_buy
|
|
344
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
345
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
346
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
347
|
+
comply_scenario: create_media_buy
|
|
348
|
+
expect_error: true
|
|
349
|
+
negative_path: payload_well_formed
|
|
350
|
+
auth:
|
|
351
|
+
type: api_key
|
|
352
|
+
from_test_kit: true
|
|
353
|
+
stateful: false
|
|
354
|
+
expected: |
|
|
355
|
+
Reject with TERMS_REJECTED. The goal references attention_units for
|
|
356
|
+
attentionvendor.example, which is reportable but not in
|
|
357
|
+
vendor_metric_optimization.supported_metrics — the optimization
|
|
358
|
+
capability precondition fails. media_buy_id is not allocated.
|
|
359
|
+
sample_request:
|
|
360
|
+
brand:
|
|
361
|
+
domain: "acmeoutdoor.example"
|
|
362
|
+
account:
|
|
363
|
+
brand:
|
|
364
|
+
domain: "acmeoutdoor.example"
|
|
365
|
+
operator: "pinnacle-agency.example"
|
|
366
|
+
start_time: "2026-06-01T00:00:00Z"
|
|
367
|
+
end_time: "2026-06-30T23:59:59Z"
|
|
368
|
+
packages:
|
|
369
|
+
- product_id: "$context.product_id"
|
|
370
|
+
pricing_option_id: "$context.pricing_option_id"
|
|
371
|
+
budget: 5000
|
|
372
|
+
optimization_goals:
|
|
373
|
+
- kind: "vendor_metric"
|
|
374
|
+
vendor:
|
|
375
|
+
domain: "attentionvendor.example"
|
|
376
|
+
metric_id: "attention_units"
|
|
377
|
+
priority: 1
|
|
378
|
+
committed_metrics:
|
|
379
|
+
- scope: "vendor"
|
|
380
|
+
vendor:
|
|
381
|
+
domain: "attentionvendor.example"
|
|
382
|
+
metric_id: "attention_units"
|
|
383
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_vendor_metric_opt_bad_capability"
|
|
384
|
+
validations:
|
|
385
|
+
- check: error_code
|
|
386
|
+
allowed_values: ["TERMS_REJECTED"]
|
|
387
|
+
description: "Seller rejects unsupported (vendor, metric_id) with TERMS_REJECTED"
|
|
388
|
+
- check: field_value
|
|
389
|
+
path: "errors[0].field"
|
|
390
|
+
value: "packages[0].optimization_goals[0].metric_id"
|
|
391
|
+
description: "Error.field points at the offending metric_id path"
|
|
392
|
+
|
|
393
|
+
- id: reject_unsupported_target_kind
|
|
394
|
+
title: "Reject vendor_metric goal when target.kind is not in supported_targets"
|
|
395
|
+
narrative: |
|
|
396
|
+
The buyer sends a goal for attention_score (a supported vendor metric)
|
|
397
|
+
but asks for cost_per when the product only declares threshold_rate in
|
|
398
|
+
vendor_metric_optimization.supported_metrics[].supported_targets. Per the
|
|
399
|
+
spec, the seller MUST reject such goals with TERMS_REJECTED and point at
|
|
400
|
+
the unsupported target kind.
|
|
401
|
+
steps:
|
|
402
|
+
- id: create_media_buy_unsupported_target
|
|
403
|
+
title: "Submit goal with target.kind not in supported_targets"
|
|
404
|
+
task: create_media_buy
|
|
405
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
406
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
407
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
408
|
+
comply_scenario: create_media_buy
|
|
409
|
+
expect_error: true
|
|
410
|
+
negative_path: payload_well_formed
|
|
411
|
+
auth:
|
|
412
|
+
type: api_key
|
|
413
|
+
from_test_kit: true
|
|
414
|
+
stateful: false
|
|
415
|
+
expected: |
|
|
416
|
+
Reject with TERMS_REJECTED. The goal references a supported vendor
|
|
417
|
+
metric, but target.kind cost_per is not declared in supported_targets.
|
|
418
|
+
media_buy_id is not allocated.
|
|
419
|
+
sample_request:
|
|
420
|
+
brand:
|
|
421
|
+
domain: "acmeoutdoor.example"
|
|
422
|
+
account:
|
|
423
|
+
brand:
|
|
424
|
+
domain: "acmeoutdoor.example"
|
|
425
|
+
operator: "pinnacle-agency.example"
|
|
426
|
+
start_time: "2026-06-01T00:00:00Z"
|
|
427
|
+
end_time: "2026-06-30T23:59:59Z"
|
|
428
|
+
packages:
|
|
429
|
+
- product_id: "$context.product_id"
|
|
430
|
+
pricing_option_id: "$context.pricing_option_id"
|
|
431
|
+
budget: 5000
|
|
432
|
+
optimization_goals:
|
|
433
|
+
- kind: "vendor_metric"
|
|
434
|
+
vendor:
|
|
435
|
+
domain: "attentionvendor.example"
|
|
436
|
+
metric_id: "attention_score"
|
|
437
|
+
target:
|
|
438
|
+
kind: "cost_per"
|
|
439
|
+
value: 0.20
|
|
440
|
+
priority: 1
|
|
441
|
+
committed_metrics:
|
|
442
|
+
- scope: "vendor"
|
|
443
|
+
vendor:
|
|
444
|
+
domain: "attentionvendor.example"
|
|
445
|
+
metric_id: "attention_score"
|
|
446
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_vendor_metric_opt_bad_target"
|
|
447
|
+
validations:
|
|
448
|
+
- check: error_code
|
|
449
|
+
allowed_values: ["TERMS_REJECTED"]
|
|
450
|
+
description: "Seller rejects unsupported target.kind with TERMS_REJECTED"
|
|
451
|
+
- check: field_value
|
|
452
|
+
path: "errors[0].field"
|
|
453
|
+
value: "packages[0].optimization_goals[0].target.kind"
|
|
454
|
+
description: "Error.field points at the offending target.kind path"
|
|
455
|
+
|
|
456
|
+
- id: reject_missing_committed_metric
|
|
457
|
+
title: "Reject vendor_metric goal when package lacks vendor-scope committed_metrics entry"
|
|
458
|
+
narrative: |
|
|
459
|
+
The buyer submits a goal for attention_score (a valid capability on the
|
|
460
|
+
product) but omits the vendor-scope committed_metrics[] entry from the
|
|
461
|
+
package. Per the spec, optimization without committed reporting is
|
|
462
|
+
unverifiable and MUST be rejected with TERMS_REJECTED.
|
|
463
|
+
steps:
|
|
464
|
+
- id: create_media_buy_missing_committed
|
|
465
|
+
title: "Submit goal without matching vendor-scope committed_metrics entry"
|
|
466
|
+
task: create_media_buy
|
|
467
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
468
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
469
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
470
|
+
comply_scenario: create_media_buy
|
|
471
|
+
expect_error: true
|
|
472
|
+
negative_path: payload_well_formed
|
|
473
|
+
auth:
|
|
474
|
+
type: api_key
|
|
475
|
+
from_test_kit: true
|
|
476
|
+
stateful: false
|
|
477
|
+
expected: |
|
|
478
|
+
Reject with TERMS_REJECTED. The optimization goal targets attention_score
|
|
479
|
+
but the package's committed_metrics[] has no vendor-scope entry for
|
|
480
|
+
(attentionvendor.example, attention_score). Optimizing for a metric the
|
|
481
|
+
seller will not commit to reporting is disallowed. media_buy_id is not allocated.
|
|
482
|
+
sample_request:
|
|
483
|
+
brand:
|
|
484
|
+
domain: "acmeoutdoor.example"
|
|
485
|
+
account:
|
|
486
|
+
brand:
|
|
487
|
+
domain: "acmeoutdoor.example"
|
|
488
|
+
operator: "pinnacle-agency.example"
|
|
489
|
+
start_time: "2026-06-01T00:00:00Z"
|
|
490
|
+
end_time: "2026-06-30T23:59:59Z"
|
|
491
|
+
packages:
|
|
492
|
+
- product_id: "$context.product_id"
|
|
493
|
+
pricing_option_id: "$context.pricing_option_id"
|
|
494
|
+
budget: 5000
|
|
495
|
+
optimization_goals:
|
|
496
|
+
- kind: "vendor_metric"
|
|
497
|
+
vendor:
|
|
498
|
+
domain: "attentionvendor.example"
|
|
499
|
+
metric_id: "attention_score"
|
|
500
|
+
target:
|
|
501
|
+
kind: "threshold_rate"
|
|
502
|
+
value: 70
|
|
503
|
+
priority: 1
|
|
504
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_vendor_metric_opt_no_committed"
|
|
505
|
+
validations:
|
|
506
|
+
- check: error_code
|
|
507
|
+
allowed_values: ["TERMS_REJECTED"]
|
|
508
|
+
description: "Seller rejects goal missing reporting-coherence with TERMS_REJECTED"
|
|
509
|
+
- check: field_value
|
|
510
|
+
path: "errors[0].field"
|
|
511
|
+
value: "packages[0].committed_metrics"
|
|
512
|
+
description: "Error.field points at the missing committed_metrics pairing"
|
|
513
|
+
|
|
514
|
+
- id: reject_unreportable_vendor_metric
|
|
515
|
+
title: "Reject vendor_metric goal when optimizable metric is not reportable"
|
|
516
|
+
narrative: |
|
|
517
|
+
The buyer submits a goal for attention_score on a product whose bidding
|
|
518
|
+
stack can optimize to that metric but whose reporting_capabilities do not
|
|
519
|
+
declare the same vendor metric. The seller MUST reject because the
|
|
520
|
+
committed_metrics[] entry would over-promise a metric the product does not
|
|
521
|
+
publish as reportable.
|
|
522
|
+
steps:
|
|
523
|
+
- id: create_media_buy_unreportable_metric
|
|
524
|
+
title: "Submit goal whose committed vendor metric is not reportable"
|
|
525
|
+
task: create_media_buy
|
|
526
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
527
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
528
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
529
|
+
comply_scenario: create_media_buy
|
|
530
|
+
expect_error: true
|
|
531
|
+
negative_path: payload_well_formed
|
|
532
|
+
auth:
|
|
533
|
+
type: api_key
|
|
534
|
+
from_test_kit: true
|
|
535
|
+
stateful: false
|
|
536
|
+
expected: |
|
|
537
|
+
Reject with TERMS_REJECTED. The product can optimize toward
|
|
538
|
+
attention_score, but reporting_capabilities.vendor_metrics does not
|
|
539
|
+
include the same (attentionvendor.example, attention_score) pair, so
|
|
540
|
+
the seller cannot honor the requested vendor-scope committed metric.
|
|
541
|
+
sample_request:
|
|
542
|
+
brand:
|
|
543
|
+
domain: "acmeoutdoor.example"
|
|
544
|
+
account:
|
|
545
|
+
brand:
|
|
546
|
+
domain: "acmeoutdoor.example"
|
|
547
|
+
operator: "pinnacle-agency.example"
|
|
548
|
+
start_time: "2026-06-01T00:00:00Z"
|
|
549
|
+
end_time: "2026-06-30T23:59:59Z"
|
|
550
|
+
packages:
|
|
551
|
+
- product_id: "display_vendor_metric_unreportable"
|
|
552
|
+
pricing_option_id: "cpm_vendor_opt_unreportable"
|
|
553
|
+
budget: 5000
|
|
554
|
+
optimization_goals:
|
|
555
|
+
- kind: "vendor_metric"
|
|
556
|
+
vendor:
|
|
557
|
+
domain: "attentionvendor.example"
|
|
558
|
+
metric_id: "attention_score"
|
|
559
|
+
target:
|
|
560
|
+
kind: "threshold_rate"
|
|
561
|
+
value: 70
|
|
562
|
+
priority: 1
|
|
563
|
+
committed_metrics:
|
|
564
|
+
- scope: "vendor"
|
|
565
|
+
vendor:
|
|
566
|
+
domain: "attentionvendor.example"
|
|
567
|
+
metric_id: "attention_score"
|
|
568
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_vendor_metric_opt_unreportable"
|
|
569
|
+
validations:
|
|
570
|
+
- check: error_code
|
|
571
|
+
allowed_values: ["TERMS_REJECTED"]
|
|
572
|
+
description: "Seller rejects unreportable committed vendor metric with TERMS_REJECTED"
|
|
573
|
+
- check: field_value
|
|
574
|
+
path: "errors[0].field"
|
|
575
|
+
value: "packages[0].committed_metrics"
|
|
576
|
+
description: "Error.field points at the unsupported committed metric"
|