@adcp/sdk 16.3.0 → 16.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ADCP_VERSION +1 -1
- package/README.md +6 -2
- package/compliance/cache/{3.2.5 → 3.2.7}/domains/creative/scenarios/billing_out_of_band.yaml +1 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/domains/creative/scenarios/canonical_supported_formats.yaml +2 -0
- package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/creative/scenarios/evaluator_auth.yaml +138 -55
- package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/creative/scenarios/native_in_feed.yaml +6 -0
- package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/governance/scenarios/property_list_change_webhook_signing.yaml +2 -0
- package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/media-buy/index.yaml +22 -0
- package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/media-buy/scenarios/availability_windows.yaml +15 -1
- package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/media-buy/scenarios/available_actions.yaml +9 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/change_rights_state_projection.yaml +4 -0
- package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/media-buy/scenarios/creative_fate_after_cancellation.yaml +8 -0
- package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/media-buy/scenarios/creative_reception.yaml +2 -0
- package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/media-buy/scenarios/dependency_impairment.yaml +10 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +15 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/frequency_cap_capability_updates.yaml +14 -3
- package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/geo_place_targeting.yaml +39 -3
- package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/get_products_rejected.yaml +0 -2
- package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/media-buy/scenarios/inline_creatives_without_sync.yaml +14 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/invalid_transitions.yaml +6 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/inventory_list_no_match.yaml +2 -0
- package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/media-buy/scenarios/measurement_terms_accepted.yaml +2 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/measurement_terms_rejected.yaml +2 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/media_buy_frequency_cap_updates.yaml +12 -2
- package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/media-buy/scenarios/pending_creatives_to_start.yaml +5 -0
- package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/media-buy/scenarios/product_coverage_filters.yaml +1 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/product_filter_behavior.yaml +18 -6
- package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/provenance_audit_observation.yaml +12 -5
- package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/media-buy/scenarios/provenance_enforcement.yaml +6 -0
- package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/media-buy/scenarios/provenance_truth_of_claim.yaml +16 -14
- package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/refine_frequency_cap_negotiation.yaml +3 -0
- package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/media-buy/scenarios/revenue_share_pricing.yaml +5 -0
- package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/media-buy/scenarios/total_budget_redistribution.yaml +51 -7
- package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/typed_proposal_negotiation.yaml +5 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/vendor_metric_accountability.yaml +68 -5
- package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/state-machine.yaml +8 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/domains/signals/index.yaml +1 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/index.json +5 -3
- package/compliance/cache/{3.2.5 → 3.2.7}/protocols/creative/scenarios/billing_out_of_band.yaml +1 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/protocols/creative/scenarios/canonical_supported_formats.yaml +2 -0
- package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/creative/scenarios/evaluator_auth.yaml +138 -55
- package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/creative/scenarios/native_in_feed.yaml +6 -0
- package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/governance/scenarios/property_list_change_webhook_signing.yaml +2 -0
- package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/media-buy/index.yaml +22 -0
- package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/media-buy/scenarios/availability_windows.yaml +15 -1
- package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/media-buy/scenarios/available_actions.yaml +9 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/change_rights_state_projection.yaml +4 -0
- package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/media-buy/scenarios/creative_fate_after_cancellation.yaml +8 -0
- package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/media-buy/scenarios/creative_reception.yaml +2 -0
- package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/media-buy/scenarios/dependency_impairment.yaml +10 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +15 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/frequency_cap_capability_updates.yaml +14 -3
- package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/geo_place_targeting.yaml +39 -3
- package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/get_products_rejected.yaml +0 -2
- package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/media-buy/scenarios/inline_creatives_without_sync.yaml +14 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/invalid_transitions.yaml +6 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/inventory_list_no_match.yaml +2 -0
- package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/media-buy/scenarios/measurement_terms_accepted.yaml +2 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +2 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/media_buy_frequency_cap_updates.yaml +12 -2
- package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/media-buy/scenarios/pending_creatives_to_start.yaml +5 -0
- package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/media-buy/scenarios/product_coverage_filters.yaml +1 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/product_filter_behavior.yaml +18 -6
- package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/provenance_audit_observation.yaml +12 -5
- package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/media-buy/scenarios/provenance_enforcement.yaml +6 -0
- package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/media-buy/scenarios/provenance_truth_of_claim.yaml +16 -14
- package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/refine_frequency_cap_negotiation.yaml +3 -0
- package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/media-buy/scenarios/revenue_share_pricing.yaml +5 -0
- package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/media-buy/scenarios/total_budget_redistribution.yaml +51 -7
- package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/typed_proposal_negotiation.yaml +5 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +68 -5
- package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/state-machine.yaml +8 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/protocols/signals/index.yaml +1 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/audience-sync/index.yaml +3 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/brand-rights/index.yaml +3 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/buyer-monitoring/index.yaml +8 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/collection-lists/index.yaml +5 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/content-standards/index.yaml +9 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/creative-generative/index.yaml +8 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/creative-template/index.yaml +4 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/creative-transformers/index.yaml +6 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/governance-delivery-monitor/index.yaml +3 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/governance-spend-authority/index.yaml +3 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/property-lists/index.yaml +8 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sales-dooh/index.yaml +71 -17
- package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sales-non-guaranteed/index.yaml +5 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/signal-marketplace/index.yaml +5 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/signal-owned/index.yaml +2 -0
- package/compliance/cache/3.2.7/test-kits/creative-build-probe-runner.yaml +127 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/universal/canonical-format-validate-input.yaml +0 -16
- package/compliance/cache/{3.2.5 → 3.2.7}/universal/capability-discovery.yaml +8 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/universal/collection-lists-pagination-integrity.yaml +5 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/universal/content-standards-pagination-integrity.yaml +5 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/universal/ctv-experience-validate-input.yaml +0 -14
- package/compliance/cache/{3.2.5 → 3.2.7}/universal/error-compliance-signals.yaml +6 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/universal/error-compliance.yaml +9 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/universal/get-media-buys-pagination-integrity.yaml +1 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/universal/get-signals-pagination-integrity.yaml +2 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/universal/premium-display-canonical-validation.yaml +0 -21
- package/compliance/cache/{3.2.5 → 3.2.7}/universal/property-lists-pagination-integrity.yaml +5 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/universal/read-tool-idempotency.yaml +2 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/universal/runner-output-contract.yaml +24 -1
- package/compliance/cache/{3.2.5 → 3.2.7}/universal/schema-validation-signals.yaml +2 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/universal/schema-validation.yaml +5 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/universal/stale-response-advisory.yaml +1 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/universal/storyboard-schema.yaml +79 -0
- package/compliance/cache/3.2.7/universal/v4-compatibility.yaml +331 -0
- package/compliance/cache/{3.2.5 → 3.2.7}/universal/version-negotiation.yaml +9 -2
- package/compliance/cache/{3.2.5 → 3.2.7}/universal/webhook-emission.yaml +7 -0
- package/dist/lib/adapters/version/3.1/assignments.d.mts +12 -0
- package/dist/lib/adapters/version/3.1/assignments.d.ts +12 -0
- package/dist/lib/adapters/version/3.1/assignments.js +67 -0
- package/dist/lib/adapters/version/3.1/assignments.mjs +43 -0
- package/dist/lib/adapters/version/3.1/bidding.d.mts +3 -0
- package/dist/lib/adapters/version/3.1/bidding.d.ts +3 -0
- package/dist/lib/adapters/version/3.1/bidding.js +115 -0
- package/dist/lib/adapters/version/3.1/bidding.mjs +90 -0
- package/dist/lib/adapters/version/3.1/delivery.d.mts +7 -0
- package/dist/lib/adapters/version/3.1/delivery.d.ts +7 -0
- package/dist/lib/adapters/version/3.1/delivery.js +78 -0
- package/dist/lib/adapters/version/3.1/delivery.mjs +54 -0
- package/dist/lib/adapters/version/3.1/index.d.mts +3 -0
- package/dist/lib/adapters/version/3.1/index.d.ts +3 -0
- package/dist/lib/adapters/version/3.1/index.js +36 -0
- package/dist/lib/adapters/version/3.1/index.mjs +12 -0
- package/dist/lib/adapters/version/index.d.mts +59 -7
- package/dist/lib/adapters/version/index.d.ts +59 -7
- package/dist/lib/adapters/version/index.js +51 -2
- package/dist/lib/adapters/version/index.mjs +49 -1
- package/dist/lib/adapters/version/negotiate.d.mts +71 -0
- package/dist/lib/adapters/version/negotiate.d.ts +71 -0
- package/dist/lib/adapters/version/negotiate.js +101 -0
- package/dist/lib/adapters/version/negotiate.mjs +73 -0
- package/dist/lib/adapters/version/schema-projection.d.mts +33 -0
- package/dist/lib/adapters/version/schema-projection.d.ts +33 -0
- package/dist/lib/adapters/version/schema-projection.js +294 -0
- package/dist/lib/adapters/version/schema-projection.mjs +269 -0
- package/dist/lib/adapters/version/translate.d.mts +122 -0
- package/dist/lib/adapters/version/translate.d.ts +122 -0
- package/dist/lib/adapters/version/translate.js +169 -0
- package/dist/lib/adapters/version/translate.mjs +141 -0
- package/dist/lib/adapters/version/types.d.mts +51 -10
- package/dist/lib/adapters/version/types.d.ts +51 -10
- package/dist/lib/compliance-fixtures/canonical-storyboards-provenance.json +4 -4
- package/dist/lib/compliance-fixtures/canonical-storyboards.d.mts +2 -2
- package/dist/lib/compliance-fixtures/canonical-storyboards.d.ts +2 -2
- package/dist/lib/conformance/oracle.js +4 -7
- package/dist/lib/conformance/oracle.mjs +4 -7
- package/dist/lib/conformance/schemaLoader.js +35 -1
- package/dist/lib/conformance/schemaLoader.mjs +35 -1
- package/dist/lib/core/AgentClient.d.mts +1 -1
- package/dist/lib/core/AgentClient.d.ts +1 -1
- package/dist/lib/core/ConversationTypes.d.mts +9 -1
- package/dist/lib/core/ConversationTypes.d.ts +9 -1
- package/dist/lib/core/SingleAgentClient.d.mts +86 -0
- package/dist/lib/core/SingleAgentClient.d.ts +86 -0
- package/dist/lib/core/SingleAgentClient.js +357 -18
- package/dist/lib/core/SingleAgentClient.mjs +371 -20
- package/dist/lib/core/TaskExecutor.d.mts +1 -1
- package/dist/lib/core/TaskExecutor.d.ts +1 -1
- package/dist/lib/core/TaskExecutor.js +183 -39
- package/dist/lib/core/TaskExecutor.mjs +191 -39
- package/dist/lib/core/account-reduction.d.mts +36 -0
- package/dist/lib/core/account-reduction.d.ts +36 -0
- package/dist/lib/core/account-reduction.js +127 -0
- package/dist/lib/core/account-reduction.mjs +98 -0
- package/dist/lib/core/agent-discovery-cache.d.mts +2 -0
- package/dist/lib/core/agent-discovery-cache.d.ts +2 -0
- package/dist/lib/core/agent-discovery-cache.js +1 -0
- package/dist/lib/core/agent-discovery-cache.mjs +1 -0
- package/dist/lib/core/buyer-account-registry.d.mts +52 -0
- package/dist/lib/core/buyer-account-registry.d.ts +52 -0
- package/dist/lib/core/buyer-account-registry.js +142 -6
- package/dist/lib/core/buyer-account-registry.mjs +142 -6
- package/dist/lib/errors/index.js +1 -1
- package/dist/lib/errors/index.mjs +1 -1
- package/dist/lib/identity-3.3/trust.d.mts +20 -3
- package/dist/lib/identity-3.3/trust.d.ts +20 -3
- package/dist/lib/identity-3.3/trust.js +11 -2
- package/dist/lib/identity-3.3/trust.mjs +11 -2
- package/dist/lib/identity-3.3/types.d.mts +1 -1
- package/dist/lib/identity-3.3/types.d.ts +1 -1
- package/dist/lib/media-buy/action-contracts.js +4 -4
- package/dist/lib/media-buy/action-contracts.mjs +4 -4
- package/dist/lib/media-buy/action-types.d.mts +3 -2
- package/dist/lib/media-buy/action-types.d.ts +3 -2
- package/dist/lib/media-buy/update-fields.generated.d.mts +3 -2
- package/dist/lib/media-buy/update-fields.generated.d.ts +3 -2
- package/dist/lib/negotiation/commercial-terms-semantics.d.mts +1 -1
- package/dist/lib/negotiation/commercial-terms-semantics.d.ts +1 -1
- package/dist/lib/negotiation/commercial-terms-semantics.js +22 -0
- package/dist/lib/negotiation/commercial-terms-semantics.mjs +22 -0
- package/dist/lib/protocols/a2a.d.mts +3 -3
- package/dist/lib/protocols/a2a.d.ts +3 -3
- package/dist/lib/protocols/a2a.js +14 -8
- package/dist/lib/protocols/a2a.mjs +19 -9
- package/dist/lib/protocols/index.d.mts +12 -0
- package/dist/lib/protocols/index.d.ts +12 -0
- package/dist/lib/protocols/index.js +51 -35
- package/dist/lib/protocols/index.mjs +50 -34
- package/dist/lib/protocols/mcp-connection-policy.d.mts +12 -0
- package/dist/lib/protocols/mcp-connection-policy.d.ts +12 -0
- package/dist/lib/protocols/mcp-connection-policy.js +67 -0
- package/dist/lib/protocols/mcp-connection-policy.mjs +45 -0
- package/dist/lib/protocols/mcp-modern.js +9 -6
- package/dist/lib/protocols/mcp-modern.mjs +9 -6
- package/dist/lib/protocols/mcp-tasks.d.mts +17 -8
- package/dist/lib/protocols/mcp-tasks.d.ts +17 -8
- package/dist/lib/protocols/mcp-tasks.js +89 -40
- package/dist/lib/protocols/mcp-tasks.mjs +85 -40
- package/dist/lib/protocols/mcp.d.mts +3 -2
- package/dist/lib/protocols/mcp.d.ts +3 -2
- package/dist/lib/protocols/mcp.js +58 -14
- package/dist/lib/protocols/mcp.mjs +60 -14
- package/dist/lib/protocols/rawResponseCapture.js +20 -5
- package/dist/lib/protocols/rawResponseCapture.mjs +20 -5
- package/dist/lib/registry/types.generated.d.mts +9 -3
- package/dist/lib/registry/types.generated.d.ts +9 -3
- package/dist/lib/reporting/ledger/producer.js +4 -2
- package/dist/lib/reporting/ledger/producer.mjs +4 -2
- package/dist/lib/reporting/service/index.js +13 -1
- package/dist/lib/reporting/service/index.mjs +13 -1
- package/dist/lib/reporting/source/applicability.d.mts +23 -0
- package/dist/lib/reporting/source/applicability.d.ts +23 -0
- package/dist/lib/reporting/source/applicability.js +46 -0
- package/dist/lib/reporting/source/applicability.mjs +21 -0
- package/dist/lib/reporting/source/conformance.d.mts +1 -1
- package/dist/lib/reporting/source/conformance.d.ts +1 -1
- package/dist/lib/reporting/source/conformance.js +4 -1
- package/dist/lib/reporting/source/conformance.mjs +4 -1
- package/dist/lib/reporting/source/fixtures.d.mts +14 -0
- package/dist/lib/reporting/source/fixtures.d.ts +14 -0
- package/dist/lib/reporting/source/index.d.mts +1 -0
- package/dist/lib/reporting/source/index.d.ts +1 -0
- package/dist/lib/reporting/source/index.js +2 -0
- package/dist/lib/reporting/source/index.mjs +1 -0
- package/dist/lib/reporting/source/schemas/reporting-source-capabilities-v1.json +167 -59
- package/dist/lib/reporting/source/schemas/reporting-source-error-v1.json +1 -1
- package/dist/lib/reporting/source/schemas/reporting-source-offering-v1.json +167 -59
- package/dist/lib/reporting/source/schemas/reporting-source-slice-request-v1.json +4 -4
- package/dist/lib/reporting/source/schemas/source-batch-manifest-basic-v1.json +20 -20
- package/dist/lib/reporting/source/schemas/source-batch-manifest-v1.json +27 -27
- package/dist/lib/reporting/source/source.d.mts +106 -18
- package/dist/lib/reporting/source/source.d.ts +106 -18
- package/dist/lib/reporting/source/source.js +4 -5
- package/dist/lib/reporting/source/source.mjs +4 -5
- package/dist/lib/schemas-data/3.2/a2ui/bound-value.json +1 -1
- package/dist/lib/schemas-data/3.2/a2ui/component.json +1 -1
- package/dist/lib/schemas-data/3.2/a2ui/si-catalog.json +25 -25
- package/dist/lib/schemas-data/3.2/a2ui/surface.json +2 -2
- package/dist/lib/schemas-data/3.2/a2ui/user-action.json +1 -1
- package/dist/lib/schemas-data/3.2/aao/agent-publishers.json +1 -1
- package/dist/lib/schemas-data/3.2/account/get-account-financials-request.json +6 -6
- package/dist/lib/schemas-data/3.2/account/get-account-financials-response.json +12 -12
- package/dist/lib/schemas-data/3.2/account/list-account-changes-request.json +7 -7
- package/dist/lib/schemas-data/3.2/account/list-account-changes-response.json +7 -7
- package/dist/lib/schemas-data/3.2/account/list-accounts-request.json +6 -6
- package/dist/lib/schemas-data/3.2/account/list-accounts-response.json +8 -8
- package/dist/lib/schemas-data/3.2/account/report-usage-request.json +6 -6
- package/dist/lib/schemas-data/3.2/account/report-usage-response.json +6 -6
- package/dist/lib/schemas-data/3.2/account/sync-accounts-request.json +16 -16
- package/dist/lib/schemas-data/3.2/account/sync-accounts-response.json +21 -21
- package/dist/lib/schemas-data/3.2/account/sync-governance-request.json +5 -5
- package/dist/lib/schemas-data/3.2/account/sync-governance-response.json +10 -10
- package/dist/lib/schemas-data/3.2/adagents.json +30 -30
- package/dist/lib/schemas-data/3.2/brand/acquire-rights-request.json +13 -12
- package/dist/lib/schemas-data/3.2/brand/acquire-rights-response.json +16 -16
- package/dist/lib/schemas-data/3.2/brand/creative-approval-request.json +5 -5
- package/dist/lib/schemas-data/3.2/brand/creative-approval-response.json +12 -12
- package/dist/lib/schemas-data/3.2/brand/get-brand-identity-request.json +4 -4
- package/dist/lib/schemas-data/3.2/brand/get-brand-identity-response.json +10 -10
- package/dist/lib/schemas-data/3.2/brand/get-rights-request.json +8 -8
- package/dist/lib/schemas-data/3.2/brand/get-rights-response.json +11 -11
- package/dist/lib/schemas-data/3.2/brand/revocation-notification.json +4 -4
- package/dist/lib/schemas-data/3.2/brand/rights-pricing-option.json +5 -5
- package/dist/lib/schemas-data/3.2/brand/rights-terms.json +3 -3
- package/dist/lib/schemas-data/3.2/brand/search-brands-request.json +6 -6
- package/dist/lib/schemas-data/3.2/brand/search-brands-response.json +11 -11
- package/dist/lib/schemas-data/3.2/brand/update-rights-request.json +6 -6
- package/dist/lib/schemas-data/3.2/brand/update-rights-response.json +11 -11
- package/dist/lib/schemas-data/3.2/brand/verification-status.json +1 -1
- package/dist/lib/schemas-data/3.2/brand/verify-brand-claim-request.json +3 -3
- package/dist/lib/schemas-data/3.2/brand/verify-brand-claim-response.json +13 -13
- package/dist/lib/schemas-data/3.2/brand/verify-brand-claims-request.json +3 -3
- package/dist/lib/schemas-data/3.2/brand/verify-brand-claims-response.json +13 -13
- package/dist/lib/schemas-data/3.2/brand.json +23 -23
- package/dist/lib/schemas-data/3.2/bundled.schemas.br +0 -0
- package/dist/lib/schemas-data/3.2/collection/base-collection-source.json +3 -3
- package/dist/lib/schemas-data/3.2/collection/collection-list-changed-webhook.json +2 -2
- package/dist/lib/schemas-data/3.2/collection/collection-list-filters.json +7 -7
- package/dist/lib/schemas-data/3.2/collection/collection-list.json +5 -5
- package/dist/lib/schemas-data/3.2/collection/create-collection-list-request.json +8 -8
- package/dist/lib/schemas-data/3.2/collection/create-collection-list-response.json +6 -6
- package/dist/lib/schemas-data/3.2/collection/delete-collection-list-request.json +5 -5
- package/dist/lib/schemas-data/3.2/collection/delete-collection-list-response.json +5 -5
- package/dist/lib/schemas-data/3.2/collection/get-collection-list-request.json +5 -5
- package/dist/lib/schemas-data/3.2/collection/get-collection-list-response.json +12 -12
- package/dist/lib/schemas-data/3.2/collection/list-collection-lists-request.json +6 -6
- package/dist/lib/schemas-data/3.2/collection/list-collection-lists-response.json +7 -7
- package/dist/lib/schemas-data/3.2/collection/update-collection-list-request.json +8 -8
- package/dist/lib/schemas-data/3.2/collection/update-collection-list-response.json +6 -6
- package/dist/lib/schemas-data/3.2/content-standards/artifact-webhook-payload.json +3 -3
- package/dist/lib/schemas-data/3.2/content-standards/artifact.json +8 -8
- package/dist/lib/schemas-data/3.2/content-standards/calibrate-content-request.json +5 -5
- package/dist/lib/schemas-data/3.2/content-standards/calibrate-content-response.json +10 -10
- package/dist/lib/schemas-data/3.2/content-standards/content-standards.json +7 -7
- package/dist/lib/schemas-data/3.2/content-standards/create-content-standards-request.json +8 -8
- package/dist/lib/schemas-data/3.2/content-standards/create-content-standards-response.json +8 -8
- package/dist/lib/schemas-data/3.2/content-standards/get-content-standards-request.json +4 -4
- package/dist/lib/schemas-data/3.2/content-standards/get-content-standards-response.json +9 -9
- package/dist/lib/schemas-data/3.2/content-standards/get-media-buy-artifacts-request.json +5 -5
- package/dist/lib/schemas-data/3.2/content-standards/get-media-buy-artifacts-response.json +10 -10
- package/dist/lib/schemas-data/3.2/content-standards/list-content-standards-request.json +6 -6
- package/dist/lib/schemas-data/3.2/content-standards/list-content-standards-response.json +10 -10
- package/dist/lib/schemas-data/3.2/content-standards/update-content-standards-request.json +8 -8
- package/dist/lib/schemas-data/3.2/content-standards/update-content-standards-response.json +8 -8
- package/dist/lib/schemas-data/3.2/content-standards/validate-content-delivery-request.json +5 -5
- package/dist/lib/schemas-data/3.2/content-standards/validate-content-delivery-response.json +10 -10
- package/dist/lib/schemas-data/3.2/core/acceptance-policy-profile-ids.json +1 -1
- package/dist/lib/schemas-data/3.2/core/account-authorization.json +1 -1
- package/dist/lib/schemas-data/3.2/core/account-change-recorded-webhook.json +2 -2
- package/dist/lib/schemas-data/3.2/core/account-change.json +2 -2
- package/dist/lib/schemas-data/3.2/core/account-identity-change-preview.json +4 -4
- package/dist/lib/schemas-data/3.2/core/account-identity-change.json +3 -3
- package/dist/lib/schemas-data/3.2/core/account-ref.json +3 -3
- package/dist/lib/schemas-data/3.2/core/account-status-changed-webhook.json +4 -4
- package/dist/lib/schemas-data/3.2/core/account-timezone-capability.json +1 -1
- package/dist/lib/schemas-data/3.2/core/account-with-authorization.json +3 -3
- package/dist/lib/schemas-data/3.2/core/account.json +14 -14
- package/dist/lib/schemas-data/3.2/core/activation-key.json +1 -1
- package/dist/lib/schemas-data/3.2/core/ad-inventory-config.json +1 -1
- package/dist/lib/schemas-data/3.2/core/agent-encryption-key.json +1 -1
- package/dist/lib/schemas-data/3.2/core/agent-notification-config-state.json +4 -4
- package/dist/lib/schemas-data/3.2/core/agent-notification-config.json +5 -4
- package/dist/lib/schemas-data/3.2/core/agent-reporting-destination-state.json +4 -4
- package/dist/lib/schemas-data/3.2/core/agent-reporting-destination.json +8 -8
- package/dist/lib/schemas-data/3.2/core/agent-signing-key.json +1 -1
- package/dist/lib/schemas-data/3.2/core/agent-webhook-challenge.json +1 -1
- package/dist/lib/schemas-data/3.2/core/app-item.json +4 -4
- package/dist/lib/schemas-data/3.2/core/applicable-package-id.json +1 -1
- package/dist/lib/schemas-data/3.2/core/asset-group-vocabulary.json +1 -1
- package/dist/lib/schemas-data/3.2/core/assets/asset-union.json +22 -22
- package/dist/lib/schemas-data/3.2/core/assets/audio-asset.json +3 -3
- package/dist/lib/schemas-data/3.2/core/assets/brief-asset.json +2 -2
- package/dist/lib/schemas-data/3.2/core/assets/card-asset.json +6 -6
- package/dist/lib/schemas-data/3.2/core/assets/catalog-asset.json +2 -2
- package/dist/lib/schemas-data/3.2/core/assets/css-asset.json +2 -2
- package/dist/lib/schemas-data/3.2/core/assets/daast-asset.json +6 -6
- package/dist/lib/schemas-data/3.2/core/assets/daast-tracker-asset.json +5 -5
- package/dist/lib/schemas-data/3.2/core/assets/display-tag-asset.json +12 -12
- package/dist/lib/schemas-data/3.2/core/assets/html-asset.json +2 -2
- package/dist/lib/schemas-data/3.2/core/assets/image-asset.json +2 -2
- package/dist/lib/schemas-data/3.2/core/assets/javascript-asset.json +3 -3
- package/dist/lib/schemas-data/3.2/core/assets/markdown-asset.json +2 -2
- package/dist/lib/schemas-data/3.2/core/assets/pixel-tracker-asset.json +5 -5
- package/dist/lib/schemas-data/3.2/core/assets/published-post-asset.json +2 -2
- package/dist/lib/schemas-data/3.2/core/assets/text-asset.json +2 -2
- package/dist/lib/schemas-data/3.2/core/assets/url-asset.json +5 -5
- package/dist/lib/schemas-data/3.2/core/assets/vast-asset.json +6 -6
- package/dist/lib/schemas-data/3.2/core/assets/vast-tracker-asset.json +5 -5
- package/dist/lib/schemas-data/3.2/core/assets/video-asset.json +7 -7
- package/dist/lib/schemas-data/3.2/core/assets/webhook-asset.json +7 -7
- package/dist/lib/schemas-data/3.2/core/assets/zip-asset.json +2 -2
- package/dist/lib/schemas-data/3.2/core/async-response-data.json +43 -43
- package/dist/lib/schemas-data/3.2/core/async-response-refs/creative/get-creative-features-async-response-submitted.json +3 -3
- package/dist/lib/schemas-data/3.2/core/async-response-refs/creative/sync-creatives-async-response-input-required.json +3 -3
- package/dist/lib/schemas-data/3.2/core/async-response-refs/creative/sync-creatives-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.2/core/async-response-refs/creative/sync-creatives-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/accept-proposal-async-response-input-required.json +2 -2
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/accept-proposal-async-response-submitted.json +2 -2
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/accept-proposal-async-response-working.json +2 -2
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/build-creative-async-response-input-required.json +4 -4
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/build-creative-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/build-creative-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/buy-products-async-response-input-required.json +2 -2
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/buy-products-async-response-submitted.json +2 -2
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/buy-products-async-response-working.json +2 -2
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/control-media-buy-async-response-input-required.json +2 -2
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/control-media-buy-async-response-submitted.json +2 -2
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/control-media-buy-async-response-working.json +2 -2
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/create-media-buy-async-response-input-required.json +4 -4
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/create-media-buy-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/create-media-buy-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/decline-proposals-async-response-input-required.json +2 -2
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/decline-proposals-async-response-submitted.json +2 -2
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/decline-proposals-async-response-working.json +2 -2
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/get-products-async-response-input-required.json +4 -4
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/get-products-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/get-products-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/refine-proposals-async-response-input-required.json +2 -2
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/refine-proposals-async-response-submitted.json +2 -2
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/refine-proposals-async-response-working.json +2 -2
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/request-proposals-async-response-input-required.json +2 -2
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/request-proposals-async-response-submitted.json +2 -2
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/request-proposals-async-response-working.json +2 -2
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/sync-catalogs-async-response-input-required.json +3 -3
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/sync-catalogs-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/sync-catalogs-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/update-media-buy-async-response-input-required.json +3 -3
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/update-media-buy-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/update-media-buy-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.2/core/async-response-refs/signals/get-signals-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.2/core/async-response-refs/signals/get-signals-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.2/core/attestation-capabilities.json +5 -5
- package/dist/lib/schemas-data/3.2/core/attestation-evaluation.json +2 -2
- package/dist/lib/schemas-data/3.2/core/attestation-issuer.json +5 -5
- package/dist/lib/schemas-data/3.2/core/attestation-reference.json +7 -7
- package/dist/lib/schemas-data/3.2/core/attestation-subject.json +5 -5
- package/dist/lib/schemas-data/3.2/core/attribution-window.json +4 -4
- package/dist/lib/schemas-data/3.2/core/audience-activation-method.json +6 -6
- package/dist/lib/schemas-data/3.2/core/audience-characteristic.json +1 -1
- package/dist/lib/schemas-data/3.2/core/audience-evidence-pin.json +2 -2
- package/dist/lib/schemas-data/3.2/core/audience-evidence-requirements.json +10 -10
- package/dist/lib/schemas-data/3.2/core/audience-evidence-selection.json +5 -5
- package/dist/lib/schemas-data/3.2/core/audience-evidence.json +10 -10
- package/dist/lib/schemas-data/3.2/core/audience-member.json +3 -3
- package/dist/lib/schemas-data/3.2/core/audience-selector.json +7 -7
- package/dist/lib/schemas-data/3.2/core/audience-source.json +3 -3
- package/dist/lib/schemas-data/3.2/core/authorized-agent-base.json +3 -3
- package/dist/lib/schemas-data/3.2/core/bidding-policy-capability.json +1 -1
- package/dist/lib/schemas-data/3.2/core/bidding-policy.json +1 -1
- package/dist/lib/schemas-data/3.2/core/brand-id.json +1 -1
- package/dist/lib/schemas-data/3.2/core/brand-key.json +2 -2
- package/dist/lib/schemas-data/3.2/core/brand-ref.json +3 -3
- package/dist/lib/schemas-data/3.2/core/brand-response-authorization-result.json +1 -1
- package/dist/lib/schemas-data/3.2/core/budget-allocation.json +2 -2
- package/dist/lib/schemas-data/3.2/core/budget-range.json +1 -1
- package/dist/lib/schemas-data/3.2/core/business-entity.json +2 -2
- package/dist/lib/schemas-data/3.2/core/cancellation-policy.json +2 -2
- package/dist/lib/schemas-data/3.2/core/canonical-account-ref.json +3 -3
- package/dist/lib/schemas-data/3.2/core/canonical-audience-evidence-selection.json +3 -3
- package/dist/lib/schemas-data/3.2/core/canonical-audience-evidence.json +8 -8
- package/dist/lib/schemas-data/3.2/core/canonical-budget-allocation.json +2 -2
- package/dist/lib/schemas-data/3.2/core/canonical-delivery-forecast.json +7 -7
- package/dist/lib/schemas-data/3.2/core/canonical-forecast-point.json +12 -12
- package/dist/lib/schemas-data/3.2/core/canonical-forecast-vendor-metric-value.json +5 -5
- package/dist/lib/schemas-data/3.2/core/canonical-format-kind.json +1 -1
- package/dist/lib/schemas-data/3.2/core/canonical-format-option.json +6 -6
- package/dist/lib/schemas-data/3.2/core/canonical-measurement-terms.json +3 -3
- package/dist/lib/schemas-data/3.2/core/canonical-media-buy-action-fields.json +6 -6
- package/dist/lib/schemas-data/3.2/core/canonical-media-buy-action.json +4 -4
- package/dist/lib/schemas-data/3.2/core/canonical-media-buy-features.json +2 -2
- package/dist/lib/schemas-data/3.2/core/canonical-metric-qualifier.json +6 -6
- package/dist/lib/schemas-data/3.2/core/canonical-optimization-goal.json +9 -9
- package/dist/lib/schemas-data/3.2/core/canonical-performance-standard.json +4 -4
- package/dist/lib/schemas-data/3.2/core/canonical-placement.json +9 -9
- package/dist/lib/schemas-data/3.2/core/canonical-pricing-option.json +5 -5
- package/dist/lib/schemas-data/3.2/core/canonical-product-action.json +6 -6
- package/dist/lib/schemas-data/3.2/core/canonical-product.json +31 -31
- package/dist/lib/schemas-data/3.2/core/canonical-projection-ref.json +3 -3
- package/dist/lib/schemas-data/3.2/core/canonical-projection-slot-override.json +1 -1
- package/dist/lib/schemas-data/3.2/core/canonical-proposal.json +5 -5
- package/dist/lib/schemas-data/3.2/core/canonical-reporting-capabilities.json +11 -11
- package/dist/lib/schemas-data/3.2/core/canonical-reporting-commitment.json +6 -6
- package/dist/lib/schemas-data/3.2/core/canvas-constraint.json +1 -1
- package/dist/lib/schemas-data/3.2/core/capabilities-changed-webhook.json +2 -2
- package/dist/lib/schemas-data/3.2/core/catalog-field-mapping.json +2 -2
- package/dist/lib/schemas-data/3.2/core/catalog-item-availability-error.json +3 -3
- package/dist/lib/schemas-data/3.2/core/catalog-item-availability-ref.json +1 -1
- package/dist/lib/schemas-data/3.2/core/catalog-item-availability-state.json +4 -4
- package/dist/lib/schemas-data/3.2/core/catalog-item-availability-update-result.json +4 -4
- package/dist/lib/schemas-data/3.2/core/catalog-item-availability-update.json +2 -2
- package/dist/lib/schemas-data/3.2/core/catalog-item-delivery-metrics.json +3 -3
- package/dist/lib/schemas-data/3.2/core/catalog-item-reference-not-found-error.json +1 -1
- package/dist/lib/schemas-data/3.2/core/catalog-selection.json +7 -7
- package/dist/lib/schemas-data/3.2/core/catalog.json +7 -7
- package/dist/lib/schemas-data/3.2/core/catchment.json +5 -5
- package/dist/lib/schemas-data/3.2/core/collection-delivery-metrics.json +3 -3
- package/dist/lib/schemas-data/3.2/core/collection-distribution.json +3 -3
- package/dist/lib/schemas-data/3.2/core/collection-list-ref.json +1 -1
- package/dist/lib/schemas-data/3.2/core/collection-property-delivery-metrics.json +5 -5
- package/dist/lib/schemas-data/3.2/core/collection-ref.json +1 -1
- package/dist/lib/schemas-data/3.2/core/collection-selection.json +4 -4
- package/dist/lib/schemas-data/3.2/core/collection-selector.json +1 -1
- package/dist/lib/schemas-data/3.2/core/collection.json +13 -13
- package/dist/lib/schemas-data/3.2/core/committed-metric.json +14 -14
- package/dist/lib/schemas-data/3.2/core/compact-task-input-required.json +4 -4
- package/dist/lib/schemas-data/3.2/core/compact-task-submitted.json +6 -6
- package/dist/lib/schemas-data/3.2/core/compact-task-working.json +3 -3
- package/dist/lib/schemas-data/3.2/core/content-rating.json +2 -2
- package/dist/lib/schemas-data/3.2/core/context.json +1 -1
- package/dist/lib/schemas-data/3.2/core/creative-approval-scope.json +3 -3
- package/dist/lib/schemas-data/3.2/core/creative-asset.json +13 -13
- package/dist/lib/schemas-data/3.2/core/creative-assets.json +3 -3
- package/dist/lib/schemas-data/3.2/core/creative-assignment.json +2 -2
- package/dist/lib/schemas-data/3.2/core/creative-brief.json +4 -4
- package/dist/lib/schemas-data/3.2/core/creative-consumption.json +1 -1
- package/dist/lib/schemas-data/3.2/core/creative-delivery-metrics.json +2 -2
- package/dist/lib/schemas-data/3.2/core/creative-filters.json +9 -8
- package/dist/lib/schemas-data/3.2/core/creative-item.json +1 -1
- package/dist/lib/schemas-data/3.2/core/creative-locale-policy.json +2 -2
- package/dist/lib/schemas-data/3.2/core/creative-localization-readback.json +6 -6
- package/dist/lib/schemas-data/3.2/core/creative-localization.json +6 -6
- package/dist/lib/schemas-data/3.2/core/creative-manifest.json +13 -13
- package/dist/lib/schemas-data/3.2/core/creative-operation-format-declaration.json +7 -7
- package/dist/lib/schemas-data/3.2/core/creative-policy.json +3 -3
- package/dist/lib/schemas-data/3.2/core/creative-representation-set.json +4 -4
- package/dist/lib/schemas-data/3.2/core/creative-representation.json +2 -2
- package/dist/lib/schemas-data/3.2/core/creative-revision-id.json +1 -1
- package/dist/lib/schemas-data/3.2/core/creative-variable.json +1 -1
- package/dist/lib/schemas-data/3.2/core/creative-variant.json +6 -6
- package/dist/lib/schemas-data/3.2/core/daast-tracker-constraints.json +2 -2
- package/dist/lib/schemas-data/3.2/core/data-provider-signal-selector.json +1 -1
- package/dist/lib/schemas-data/3.2/core/date-range.json +1 -1
- package/dist/lib/schemas-data/3.2/core/datetime-range.json +1 -1
- package/dist/lib/schemas-data/3.2/core/daypart-target.json +3 -3
- package/dist/lib/schemas-data/3.2/core/deadline-policy.json +1 -1
- package/dist/lib/schemas-data/3.2/core/delivery-breakdown-controls.json +3 -3
- package/dist/lib/schemas-data/3.2/core/delivery-forecast.json +7 -7
- package/dist/lib/schemas-data/3.2/core/delivery-metric-aggregate.json +14 -14
- package/dist/lib/schemas-data/3.2/core/delivery-metrics.json +11 -11
- package/dist/lib/schemas-data/3.2/core/delivery-provider.json +1 -1
- package/dist/lib/schemas-data/3.2/core/delivery-recipient.json +2 -2
- package/dist/lib/schemas-data/3.2/core/demographic-age-range.json +1 -1
- package/dist/lib/schemas-data/3.2/core/demographic-predicate.json +2 -2
- package/dist/lib/schemas-data/3.2/core/demographic-reporting-capability.json +4 -4
- package/dist/lib/schemas-data/3.2/core/demographic-targeting-capability.json +4 -4
- package/dist/lib/schemas-data/3.2/core/demographic-targeting-intent.json +4 -4
- package/dist/lib/schemas-data/3.2/core/demographic-targeting-resolution.json +10 -10
- package/dist/lib/schemas-data/3.2/core/deployment.json +3 -3
- package/dist/lib/schemas-data/3.2/core/destination-item.json +4 -4
- package/dist/lib/schemas-data/3.2/core/destination.json +1 -1
- package/dist/lib/schemas-data/3.2/core/diagnostic-issue.json +1 -1
- package/dist/lib/schemas-data/3.2/core/downstream-connection-requirement.json +1 -1
- package/dist/lib/schemas-data/3.2/core/duration.json +1 -1
- package/dist/lib/schemas-data/3.2/core/education-item.json +4 -4
- package/dist/lib/schemas-data/3.2/core/error.json +1 -1
- package/dist/lib/schemas-data/3.2/core/evaluator-spec.json +5 -5
- package/dist/lib/schemas-data/3.2/core/event-custom-data.json +2 -2
- package/dist/lib/schemas-data/3.2/core/event-source-health.json +3 -3
- package/dist/lib/schemas-data/3.2/core/event-surface.json +2 -2
- package/dist/lib/schemas-data/3.2/core/event.json +8 -8
- package/dist/lib/schemas-data/3.2/core/experimental-feature-id.json +1 -1
- package/dist/lib/schemas-data/3.2/core/ext.json +1 -1
- package/dist/lib/schemas-data/3.2/core/feature-requirement.json +1 -1
- package/dist/lib/schemas-data/3.2/core/flight-item.json +4 -4
- package/dist/lib/schemas-data/3.2/core/forecast-dimension-audience.json +2 -2
- package/dist/lib/schemas-data/3.2/core/forecast-dimension-device-platform.json +2 -2
- package/dist/lib/schemas-data/3.2/core/forecast-dimension-device-type.json +2 -2
- package/dist/lib/schemas-data/3.2/core/forecast-dimension-geo.json +5 -5
- package/dist/lib/schemas-data/3.2/core/forecast-dimension-placement.json +2 -2
- package/dist/lib/schemas-data/3.2/core/forecast-dimension-signal.json +2 -2
- package/dist/lib/schemas-data/3.2/core/forecast-dimension-time.json +1 -1
- package/dist/lib/schemas-data/3.2/core/forecast-point-dimensions.json +8 -8
- package/dist/lib/schemas-data/3.2/core/forecast-point.json +28 -28
- package/dist/lib/schemas-data/3.2/core/forecast-range.json +1 -1
- package/dist/lib/schemas-data/3.2/core/forecast-rate-range.json +2 -2
- package/dist/lib/schemas-data/3.2/core/forecast-vendor-metric-value.json +7 -7
- package/dist/lib/schemas-data/3.2/core/format-id.json +1 -1
- package/dist/lib/schemas-data/3.2/core/format-option-ref.json +1 -1
- package/dist/lib/schemas-data/3.2/core/format-shape-vocabulary.json +1 -1
- package/dist/lib/schemas-data/3.2/core/format.json +49 -45
- package/dist/lib/schemas-data/3.2/core/frequency-cap-constraints.json +8 -8
- package/dist/lib/schemas-data/3.2/core/frequency-cap-duration-unit.json +1 -1
- package/dist/lib/schemas-data/3.2/core/frequency-cap-impression-constraints.json +2 -2
- package/dist/lib/schemas-data/3.2/core/frequency-cap-interval-constraints.json +3 -3
- package/dist/lib/schemas-data/3.2/core/frequency-cap-requirements.json +6 -6
- package/dist/lib/schemas-data/3.2/core/frequency-cap.json +4 -4
- package/dist/lib/schemas-data/3.2/core/generation-credential.json +3 -3
- package/dist/lib/schemas-data/3.2/core/geo-breakdown-support.json +3 -3
- package/dist/lib/schemas-data/3.2/core/geo-delivery-metrics.json +6 -6
- package/dist/lib/schemas-data/3.2/core/geo-metro.json +2 -2
- package/dist/lib/schemas-data/3.2/core/geo-place-area.json +4 -4
- package/dist/lib/schemas-data/3.2/core/geo-place-catalog-capability.json +2 -2
- package/dist/lib/schemas-data/3.2/core/geo-place-catalog-entry.json +3 -3
- package/dist/lib/schemas-data/3.2/core/geo-place-requirement.json +3 -3
- package/dist/lib/schemas-data/3.2/core/geo-place-resolver.json +1 -1
- package/dist/lib/schemas-data/3.2/core/geo-place-support.json +3 -3
- package/dist/lib/schemas-data/3.2/core/geo-place-system.json +1 -1
- package/dist/lib/schemas-data/3.2/core/geo-place-type.json +1 -1
- package/dist/lib/schemas-data/3.2/core/geo-region-requirement.json +1 -1
- package/dist/lib/schemas-data/3.2/core/geo-region-support.json +2 -2
- package/dist/lib/schemas-data/3.2/core/get-geo-place-resolution-request.json +3 -3
- package/dist/lib/schemas-data/3.2/core/get-geo-place-resolution-response.json +4 -4
- package/dist/lib/schemas-data/3.2/core/hotel-item.json +4 -4
- package/dist/lib/schemas-data/3.2/core/iana-timezone.json +1 -1
- package/dist/lib/schemas-data/3.2/core/identifier.json +2 -2
- package/dist/lib/schemas-data/3.2/core/impairment.json +3 -3
- package/dist/lib/schemas-data/3.2/core/indicator-bearing.json +4 -4
- package/dist/lib/schemas-data/3.2/core/indicator-scope.json +1 -1
- package/dist/lib/schemas-data/3.2/core/indicator.json +4 -4
- package/dist/lib/schemas-data/3.2/core/indicators-changed-webhook.json +3 -3
- package/dist/lib/schemas-data/3.2/core/industry-identifier.json +2 -2
- package/dist/lib/schemas-data/3.2/core/insertion-order.json +1 -1
- package/dist/lib/schemas-data/3.2/core/installment-deadlines.json +2 -2
- package/dist/lib/schemas-data/3.2/core/installment-delivery-metrics.json +3 -3
- package/dist/lib/schemas-data/3.2/core/installment-property-delivery-metrics.json +5 -5
- package/dist/lib/schemas-data/3.2/core/installment-ref.json +2 -2
- package/dist/lib/schemas-data/3.2/core/installment.json +10 -10
- package/dist/lib/schemas-data/3.2/core/inventory-list-application.json +1 -1
- package/dist/lib/schemas-data/3.2/core/job-item.json +3 -3
- package/dist/lib/schemas-data/3.2/core/keyword-delivery-metrics.json +3 -3
- package/dist/lib/schemas-data/3.2/core/keyword-target.json +2 -2
- package/dist/lib/schemas-data/3.2/core/limited-series.json +1 -1
- package/dist/lib/schemas-data/3.2/core/locale-tag.json +1 -1
- package/dist/lib/schemas-data/3.2/core/localized-creative-asset.json +3 -3
- package/dist/lib/schemas-data/3.2/core/macro-bearing-url.json +1 -1
- package/dist/lib/schemas-data/3.2/core/macro-declaration.json +10 -10
- package/dist/lib/schemas-data/3.2/core/macro-encoding.json +1 -1
- package/dist/lib/schemas-data/3.2/core/macro-resolution-capability.json +8 -8
- package/dist/lib/schemas-data/3.2/core/macro-resolution-result.json +10 -10
- package/dist/lib/schemas-data/3.2/core/macro-translation-target.json +7 -7
- package/dist/lib/schemas-data/3.2/core/material-deadline.json +1 -1
- package/dist/lib/schemas-data/3.2/core/mcp-webhook-payload.json +6 -6
- package/dist/lib/schemas-data/3.2/core/measurement-readiness.json +5 -5
- package/dist/lib/schemas-data/3.2/core/measurement-terms.json +3 -3
- package/dist/lib/schemas-data/3.2/core/measurement-window.json +1 -1
- package/dist/lib/schemas-data/3.2/core/media-buy-available-action-id.json +2 -2
- package/dist/lib/schemas-data/3.2/core/media-buy-available-action.json +7 -7
- package/dist/lib/schemas-data/3.2/core/media-buy-change-term-id.json +1 -1
- package/dist/lib/schemas-data/3.2/core/media-buy-features.json +3 -2
- package/dist/lib/schemas-data/3.2/core/media-buy-frequency-cap-capability.json +3 -3
- package/dist/lib/schemas-data/3.2/core/media-buy-frequency-cap-requirement.json +3 -3
- package/dist/lib/schemas-data/3.2/core/media-buy-frequency-cap-support.json +3 -3
- package/dist/lib/schemas-data/3.2/core/media-buy-frequency-cap.json +2 -2
- package/dist/lib/schemas-data/3.2/core/media-buy-legacy-terms-ref.json +1 -1
- package/dist/lib/schemas-data/3.2/core/media-buy-support-requirements.json +2 -2
- package/dist/lib/schemas-data/3.2/core/media-buy-support.json +3 -3
- package/dist/lib/schemas-data/3.2/core/media-buy.json +14 -14
- package/dist/lib/schemas-data/3.2/core/missing-metric.json +14 -14
- package/dist/lib/schemas-data/3.2/core/negative-keyword.json +2 -2
- package/dist/lib/schemas-data/3.2/core/notification-config.json +4 -3
- package/dist/lib/schemas-data/3.2/core/offering-asset-group.json +16 -16
- package/dist/lib/schemas-data/3.2/core/offering.json +5 -5
- package/dist/lib/schemas-data/3.2/core/operator-identity.json +2 -2
- package/dist/lib/schemas-data/3.2/core/operator-unit.json +1 -1
- package/dist/lib/schemas-data/3.2/core/opportunity-context.json +2 -2
- package/dist/lib/schemas-data/3.2/core/optimization-goal.json +9 -9
- package/dist/lib/schemas-data/3.2/core/outcome-measurement.json +2 -2
- package/dist/lib/schemas-data/3.2/core/outcome-target-cost-per.json +2 -2
- package/dist/lib/schemas-data/3.2/core/overlay.json +1 -1
- package/dist/lib/schemas-data/3.2/core/package-delivery-metric-value.json +2 -2
- package/dist/lib/schemas-data/3.2/core/package-format-snapshot.json +5 -5
- package/dist/lib/schemas-data/3.2/core/package-signal-targeting-group.json +2 -2
- package/dist/lib/schemas-data/3.2/core/package-signal-targeting-groups.json +2 -2
- package/dist/lib/schemas-data/3.2/core/package-signal-targeting.json +3 -3
- package/dist/lib/schemas-data/3.2/core/package-targeting-resolution.json +3 -3
- package/dist/lib/schemas-data/3.2/core/package.json +24 -23
- package/dist/lib/schemas-data/3.2/core/pagination-request.json +1 -1
- package/dist/lib/schemas-data/3.2/core/pagination-response.json +1 -1
- package/dist/lib/schemas-data/3.2/core/performance-feedback-assertion.json +8 -8
- package/dist/lib/schemas-data/3.2/core/performance-feedback-metric.json +14 -14
- package/dist/lib/schemas-data/3.2/core/performance-feedback.json +17 -17
- package/dist/lib/schemas-data/3.2/core/performance-standard.json +4 -4
- package/dist/lib/schemas-data/3.2/core/placement-definition.json +15 -15
- package/dist/lib/schemas-data/3.2/core/placement-delivery-metrics.json +3 -3
- package/dist/lib/schemas-data/3.2/core/placement-evidence.json +1 -1
- package/dist/lib/schemas-data/3.2/core/placement-identity.json +2 -2
- package/dist/lib/schemas-data/3.2/core/placement-presentation.json +1 -1
- package/dist/lib/schemas-data/3.2/core/placement-property-delivery-metrics.json +5 -5
- package/dist/lib/schemas-data/3.2/core/placement-ref.json +1 -1
- package/dist/lib/schemas-data/3.2/core/placement-selection.json +5 -5
- package/dist/lib/schemas-data/3.2/core/placement.json +11 -10
- package/dist/lib/schemas-data/3.2/core/planned-delivery.json +8 -8
- package/dist/lib/schemas-data/3.2/core/platform-extension-ref.json +1 -1
- package/dist/lib/schemas-data/3.2/core/positive-postal-area-support.json +2 -2
- package/dist/lib/schemas-data/3.2/core/postal-area-support.json +2 -2
- package/dist/lib/schemas-data/3.2/core/postal-area.json +4 -4
- package/dist/lib/schemas-data/3.2/core/postal-country-system.json +2 -2
- package/dist/lib/schemas-data/3.2/core/presentation-ref.json +1 -1
- package/dist/lib/schemas-data/3.2/core/preview-provider.json +1 -1
- package/dist/lib/schemas-data/3.2/core/preview-renderer-metadata.json +1 -1
- package/dist/lib/schemas-data/3.2/core/price.json +1 -1
- package/dist/lib/schemas-data/3.2/core/pricing-option.json +11 -11
- package/dist/lib/schemas-data/3.2/core/principal-changed-webhook.json +2 -2
- package/dist/lib/schemas-data/3.2/core/principal-declarations-state.json +3 -3
- package/dist/lib/schemas-data/3.2/core/principal-declarations.json +2 -2
- package/dist/lib/schemas-data/3.2/core/principal-state.json +4 -4
- package/dist/lib/schemas-data/3.2/core/product-allocation.json +5 -5
- package/dist/lib/schemas-data/3.2/core/product-allowed-action.json +6 -6
- package/dist/lib/schemas-data/3.2/core/product-audience-evidence-requirements.json +13 -13
- package/dist/lib/schemas-data/3.2/core/product-card-reference-asset.json +5 -5
- package/dist/lib/schemas-data/3.2/core/product-change-map.json +1 -1
- package/dist/lib/schemas-data/3.2/core/product-execution-requirement.json +7 -7
- package/dist/lib/schemas-data/3.2/core/product-filters.json +37 -36
- package/dist/lib/schemas-data/3.2/core/product-format-declaration.json +22 -22
- package/dist/lib/schemas-data/3.2/core/product-identity.json +1 -1
- package/dist/lib/schemas-data/3.2/core/product-offer-filters.json +26 -26
- package/dist/lib/schemas-data/3.2/core/product-signal-targeting-option.json +3 -3
- package/dist/lib/schemas-data/3.2/core/product-targeting-resolution.json +3 -3
- package/dist/lib/schemas-data/3.2/core/product.json +55 -54
- package/dist/lib/schemas-data/3.2/core/property-delivery-metrics.json +4 -4
- package/dist/lib/schemas-data/3.2/core/property-id.json +1 -1
- package/dist/lib/schemas-data/3.2/core/property-list-ref.json +1 -1
- package/dist/lib/schemas-data/3.2/core/property-ref.json +2 -2
- package/dist/lib/schemas-data/3.2/core/property-tag.json +1 -1
- package/dist/lib/schemas-data/3.2/core/property.json +6 -6
- package/dist/lib/schemas-data/3.2/core/proposal.json +9 -9
- package/dist/lib/schemas-data/3.2/core/protocol-envelope.json +5 -5
- package/dist/lib/schemas-data/3.2/core/provenance.json +9 -9
- package/dist/lib/schemas-data/3.2/core/publisher-property-selector.json +3 -3
- package/dist/lib/schemas-data/3.2/core/push-notification-config.json +3 -2
- package/dist/lib/schemas-data/3.2/core/real-estate-item.json +4 -4
- package/dist/lib/schemas-data/3.2/core/reference-asset.json +1 -1
- package/dist/lib/schemas-data/3.2/core/reference-renderer.json +1 -1
- package/dist/lib/schemas-data/3.2/core/registry-event.json +16 -15
- package/dist/lib/schemas-data/3.2/core/registry-feed-response.json +2 -2
- package/dist/lib/schemas-data/3.2/core/reporting-adjustment-receipt.json +1 -1
- package/dist/lib/schemas-data/3.2/core/reporting-adjustment.json +2 -2
- package/dist/lib/schemas-data/3.2/core/reporting-canonical-content-digest.json +1 -1
- package/dist/lib/schemas-data/3.2/core/reporting-canonicalization-contract.json +1 -1
- package/dist/lib/schemas-data/3.2/core/reporting-capabilities.json +12 -12
- package/dist/lib/schemas-data/3.2/core/reporting-consumer-status.json +1 -1
- package/dist/lib/schemas-data/3.2/core/reporting-control-total.json +1 -1
- package/dist/lib/schemas-data/3.2/core/reporting-coverage.json +1 -1
- package/dist/lib/schemas-data/3.2/core/reporting-dataset-share-destination.json +1 -1
- package/dist/lib/schemas-data/3.2/core/reporting-delivery-capabilities.json +3 -3
- package/dist/lib/schemas-data/3.2/core/reporting-delivery-config-state.json +4 -4
- package/dist/lib/schemas-data/3.2/core/reporting-delivery-config.json +7 -7
- package/dist/lib/schemas-data/3.2/core/reporting-delivery-method.json +4 -4
- package/dist/lib/schemas-data/3.2/core/reporting-delivery-offering-id.json +1 -1
- package/dist/lib/schemas-data/3.2/core/reporting-delivery-offering.json +8 -8
- package/dist/lib/schemas-data/3.2/core/reporting-delivery-ready-webhook.json +3 -3
- package/dist/lib/schemas-data/3.2/core/reporting-file-compression.json +1 -1
- package/dist/lib/schemas-data/3.2/core/reporting-file-entry.json +3 -3
- package/dist/lib/schemas-data/3.2/core/reporting-file-manifest.json +4 -4
- package/dist/lib/schemas-data/3.2/core/reporting-file-object-ref.json +1 -1
- package/dist/lib/schemas-data/3.2/core/reporting-ledger-changed-webhook.json +3 -3
- package/dist/lib/schemas-data/3.2/core/reporting-materialization.json +4 -4
- package/dist/lib/schemas-data/3.2/core/reporting-native-version-ref.json +1 -1
- package/dist/lib/schemas-data/3.2/core/reporting-obligation.json +9 -9
- package/dist/lib/schemas-data/3.2/core/reporting-receipt.json +5 -5
- package/dist/lib/schemas-data/3.2/core/reporting-reconciliation-mode.json +1 -1
- package/dist/lib/schemas-data/3.2/core/reporting-reliability-statistics.json +1 -1
- package/dist/lib/schemas-data/3.2/core/reporting-report-definition.json +1 -1
- package/dist/lib/schemas-data/3.2/core/reporting-resource.json +2 -2
- package/dist/lib/schemas-data/3.2/core/reporting-revision.json +6 -6
- package/dist/lib/schemas-data/3.2/core/reporting-schedule-offering.json +2 -2
- package/dist/lib/schemas-data/3.2/core/reporting-schedule.json +1 -1
- package/dist/lib/schemas-data/3.2/core/reporting-status-changed-webhook.json +5 -5
- package/dist/lib/schemas-data/3.2/core/reporting-status-issue.json +4 -4
- package/dist/lib/schemas-data/3.2/core/reporting-verification-profile-set.json +1 -1
- package/dist/lib/schemas-data/3.2/core/reporting-verification-profile.json +1 -1
- package/dist/lib/schemas-data/3.2/core/reporting-verification.json +7 -7
- package/dist/lib/schemas-data/3.2/core/reporting-webhook.json +4 -3
- package/dist/lib/schemas-data/3.2/core/reporting-write-destination.json +1 -1
- package/dist/lib/schemas-data/3.2/core/representation-destination.json +5 -5
- package/dist/lib/schemas-data/3.2/core/representation-rejection.json +1 -1
- package/dist/lib/schemas-data/3.2/core/representation-selection.json +5 -5
- package/dist/lib/schemas-data/3.2/core/requirements/asset-requirements.json +13 -13
- package/dist/lib/schemas-data/3.2/core/requirements/audio-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.2/core/requirements/catalog-field-binding.json +4 -4
- package/dist/lib/schemas-data/3.2/core/requirements/catalog-requirements.json +5 -5
- package/dist/lib/schemas-data/3.2/core/requirements/css-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.2/core/requirements/daast-asset-requirements.json +3 -3
- package/dist/lib/schemas-data/3.2/core/requirements/html-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.2/core/requirements/image-asset-requirements.json +2 -2
- package/dist/lib/schemas-data/3.2/core/requirements/javascript-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.2/core/requirements/markdown-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.2/core/requirements/offering-asset-constraint.json +4 -4
- package/dist/lib/schemas-data/3.2/core/requirements/text-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.2/core/requirements/url-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.2/core/requirements/vast-asset-requirements.json +4 -4
- package/dist/lib/schemas-data/3.2/core/requirements/video-asset-requirements.json +6 -6
- package/dist/lib/schemas-data/3.2/core/requirements/webhook-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.2/core/response-payload-jws-envelope.json +1 -1
- package/dist/lib/schemas-data/3.2/core/response.json +1 -1
- package/dist/lib/schemas-data/3.2/core/rights-attestation-evaluation.json +5 -5
- package/dist/lib/schemas-data/3.2/core/rights-constraint.json +7 -7
- package/dist/lib/schemas-data/3.2/core/seller-agent-ref.json +1 -1
- package/dist/lib/schemas-data/3.2/core/signal-coverage-forecast.json +5 -5
- package/dist/lib/schemas-data/3.2/core/signal-definition-enrichment.json +5 -5
- package/dist/lib/schemas-data/3.2/core/signal-definition.json +8 -8
- package/dist/lib/schemas-data/3.2/core/signal-filters.json +3 -3
- package/dist/lib/schemas-data/3.2/core/signal-id.json +1 -1
- package/dist/lib/schemas-data/3.2/core/signal-listing.json +6 -6
- package/dist/lib/schemas-data/3.2/core/signal-modeling-disclosure.json +1 -1
- package/dist/lib/schemas-data/3.2/core/signal-pricing-option.json +2 -2
- package/dist/lib/schemas-data/3.2/core/signal-pricing.json +6 -6
- package/dist/lib/schemas-data/3.2/core/signal-ref.json +1 -1
- package/dist/lib/schemas-data/3.2/core/signal-selection-group-rule.json +1 -1
- package/dist/lib/schemas-data/3.2/core/signal-targeting-expression.json +4 -4
- package/dist/lib/schemas-data/3.2/core/signal-targeting-rules.json +2 -2
- package/dist/lib/schemas-data/3.2/core/signal-targeting.json +7 -7
- package/dist/lib/schemas-data/3.2/core/sla-window.json +1 -1
- package/dist/lib/schemas-data/3.2/core/special.json +2 -2
- package/dist/lib/schemas-data/3.2/core/spot-reporting-capability.json +2 -2
- package/dist/lib/schemas-data/3.2/core/start-timing.json +1 -1
- package/dist/lib/schemas-data/3.2/core/store-item.json +3 -3
- package/dist/lib/schemas-data/3.2/core/talent.json +2 -2
- package/dist/lib/schemas-data/3.2/core/targeting-input.json +40 -40
- package/dist/lib/schemas-data/3.2/core/targeting-modification.json +3 -3
- package/dist/lib/schemas-data/3.2/core/targeting-overlay-requirements.json +15 -15
- package/dist/lib/schemas-data/3.2/core/targeting-overlay-support.json +25 -25
- package/dist/lib/schemas-data/3.2/core/targeting-unknown-age-eligibility-constraint.json +1 -1
- package/dist/lib/schemas-data/3.2/core/targeting-verified-age-basis-constraint.json +1 -1
- package/dist/lib/schemas-data/3.2/core/targeting.json +34 -34
- package/dist/lib/schemas-data/3.2/core/tasks-get-request.json +5 -5
- package/dist/lib/schemas-data/3.2/core/tasks-get-response.json +10 -10
- package/dist/lib/schemas-data/3.2/core/tasks-list-request.json +13 -13
- package/dist/lib/schemas-data/3.2/core/tasks-list-response.json +8 -8
- package/dist/lib/schemas-data/3.2/core/tracker-execution-contract.json +2 -2
- package/dist/lib/schemas-data/3.2/core/tracker-execution-selector.json +18 -18
- package/dist/lib/schemas-data/3.2/core/transformer-param.json +1 -1
- package/dist/lib/schemas-data/3.2/core/transformer.json +6 -6
- package/dist/lib/schemas-data/3.2/core/truncation-sentinel.json +1 -1
- package/dist/lib/schemas-data/3.2/core/user-match.json +3 -3
- package/dist/lib/schemas-data/3.2/core/vast-media-file-requirements.json +2 -2
- package/dist/lib/schemas-data/3.2/core/vast-tracker-constraints.json +2 -2
- package/dist/lib/schemas-data/3.2/core/vehicle-item.json +4 -4
- package/dist/lib/schemas-data/3.2/core/vendor-metric-id.json +1 -1
- package/dist/lib/schemas-data/3.2/core/vendor-metric-optimization-supported-metric.json +3 -3
- package/dist/lib/schemas-data/3.2/core/vendor-metric-optimization.json +2 -2
- package/dist/lib/schemas-data/3.2/core/vendor-metric-value.json +9 -9
- package/dist/lib/schemas-data/3.2/core/vendor-pricing-option.json +3 -3
- package/dist/lib/schemas-data/3.2/core/verification-token-claims.json +1 -1
- package/dist/lib/schemas-data/3.2/core/version-envelope.json +2 -1
- package/dist/lib/schemas-data/3.2/core/warning-resource.json +1 -1
- package/dist/lib/schemas-data/3.2/core/warning.json +4 -4
- package/dist/lib/schemas-data/3.2/core/webhook-activity-record.json +3 -3
- package/dist/lib/schemas-data/3.2/core/webhook-challenge-response.json +1 -1
- package/dist/lib/schemas-data/3.2/core/webhook-challenge.json +2 -2
- package/dist/lib/schemas-data/3.2/core/wholesale-feed-event.json +20 -20
- package/dist/lib/schemas-data/3.2/core/wholesale-feed-webhook.json +3 -3
- package/dist/lib/schemas-data/3.2/core/x-entity-types.json +1 -1
- package/dist/lib/schemas-data/3.2/creative/asset-types/index.json +6 -6
- package/dist/lib/schemas-data/3.2/creative/audit-observation.json +2 -2
- package/dist/lib/schemas-data/3.2/creative/creative-assignment-changed-webhook.json +2 -2
- package/dist/lib/schemas-data/3.2/creative/creative-feature-result.json +2 -2
- package/dist/lib/schemas-data/3.2/creative/creative-purged-webhook.json +3 -3
- package/dist/lib/schemas-data/3.2/creative/creative-status-changed-webhook.json +5 -5
- package/dist/lib/schemas-data/3.2/creative/get-creative-delivery-request.json +6 -6
- package/dist/lib/schemas-data/3.2/creative/get-creative-delivery-response.json +13 -12
- package/dist/lib/schemas-data/3.2/creative/get-creative-features-async-response-submitted.json +3 -3
- package/dist/lib/schemas-data/3.2/creative/get-creative-features-request.json +7 -7
- package/dist/lib/schemas-data/3.2/creative/get-creative-features-response.json +9 -9
- package/dist/lib/schemas-data/3.2/creative/get-creative-features-terminal-success.json +6 -6
- package/dist/lib/schemas-data/3.2/creative/list-creative-formats-request.json +16 -13
- package/dist/lib/schemas-data/3.2/creative/list-creative-formats-response.json +9 -9
- package/dist/lib/schemas-data/3.2/creative/list-creatives-request.json +9 -9
- package/dist/lib/schemas-data/3.2/creative/list-creatives-response.json +34 -34
- package/dist/lib/schemas-data/3.2/creative/list-transformers-request.json +9 -9
- package/dist/lib/schemas-data/3.2/creative/list-transformers-response.json +8 -8
- package/dist/lib/schemas-data/3.2/creative/preview-creative-request.json +13 -13
- package/dist/lib/schemas-data/3.2/creative/preview-creative-response.json +18 -18
- package/dist/lib/schemas-data/3.2/creative/preview-render.json +4 -4
- package/dist/lib/schemas-data/3.2/creative/sync-creatives-async-response-input-required.json +3 -3
- package/dist/lib/schemas-data/3.2/creative/sync-creatives-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.2/creative/sync-creatives-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.2/creative/sync-creatives-request.json +10 -10
- package/dist/lib/schemas-data/3.2/creative/sync-creatives-response.json +18 -18
- package/dist/lib/schemas-data/3.2/creative/validate-input-request.json +4 -4
- package/dist/lib/schemas-data/3.2/creative/validate-input-response.json +4 -4
- package/dist/lib/schemas-data/3.2/creative/validate-input-result.json +2 -2
- package/dist/lib/schemas-data/3.2/creative/video-brief.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/account-currency-mode.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/account-scope.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/account-status.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/action-not-allowed-reason.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/action-source.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/activation-method.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/adcp-protocol.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/adjustment-kind.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/advertiser-industry.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/age-determination-basis.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/age-verification-method.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/assessment-status.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/asset-content-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/attestation-claim.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/attribution-methodology.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/attribution-model.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/audience-evidence-methodology.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/audience-resolution-method.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/audience-source.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/audience-status.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/audience-subject-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/audio-channel-layout.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/audio-distribution-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/auth-scheme.json +2 -1
- package/dist/lib/schemas-data/3.2/enums/availability-status.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/available-metric.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/billing-party.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/binary-verdict.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/brand-agent-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/browser-family.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/c2pa-watermark-action.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/canceled-by.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/canonical-media-buy-action-mode.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/canonical-media-buy-action.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/catalog-action.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/catalog-item-status.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/catalog-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/channels.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/cloud-storage-protocol.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/co-branding-requirement.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/collection-cadence.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/collection-kind.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/collection-relationship.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/collection-status.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/completion-source.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/consent-basis.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/content-id-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/content-rating-system.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/creative-action.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/creative-agent-capability.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/creative-approval-status.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/creative-event-reason-code.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/creative-identifier-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/creative-quality.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/creative-selection-strategy.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/creative-sort-field.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/creative-status.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/ctv-ad-experience.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/daast-tracking-event.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/daast-version.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/day-of-week.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/daypart-timezone-mode.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/delegation-authority.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/delivery-recipient-cloud.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/delivery-status.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/delivery-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/demographic-system.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/derivative-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/device-platform.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/device-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/digital-source-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/dimension-unit.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/disclosure-persistence.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/disclosure-position.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/distance-unit.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/distribution-identifier-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/dooh-motion-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/embedded-provenance-method.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/error-code.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/error-scope.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/escalation-severity.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/event-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/exclusivity.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/feature-check-status.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/feed-format.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/feedback-source.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/forecast-method.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/forecast-range-unit.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/forecastable-metric.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/format-id-parameter.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/frame-rate-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/frequency-cap-control-mode.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/frequency-cap-mutable-field.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/frequency-cap-scope.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/genre-taxonomy.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/geo-level.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/gop-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/governance-decision.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/governance-domain.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/governance-mode.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/governance-phase.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/history-entry-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/http-method.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/identifier-types.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/impairment-offline-state.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/impairment-reason-code.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/indicator-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/installment-status.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/javascript-module-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/landing-page-requirement.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/legacy-postal-system.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/lift-dimension.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/logo-slot.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/macro-dialect.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/macro-mapping-status.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/macro-processing-operation.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/macro-resolution-reason.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/macro-resolver.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/macro-value-context.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/makegood-remedy.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/markdown-flavor.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/match-id-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/match-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/media-buy-action-mode.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/media-buy-frequency-cap-control-mode.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/media-buy-health.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/media-buy-status.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/media-buy-valid-action.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/metric-scope.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/metric-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/metro-system.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/moov-atom-position.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/motion-level.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/notification-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/offering-availability-status.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/outcome-target-cost-strength.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/outcome-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/pacing.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/payment-terms.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/performance-baseline.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/performance-standard-metric.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/pixel-tracking-event.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/policy-category.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/policy-enforcement.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/postal-system.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/preview-output-format.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/pricing-model.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/pricing-structure.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/principal-kind.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/production-quality.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/property-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/proposal-decline-reason.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/proposal-refinement-reason.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/proposal-status.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/publisher-identifier-types.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/purchase-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/reach-aggregation.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/reach-unit.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/reporting-destination-setup-state.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/reporting-finality.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/reporting-frequency.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/reporting-health.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/representation-selection-strategy.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/request-signing-error-code.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/response-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/restricted-attribute.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/right-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/right-use.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/rights-billing-period.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/scan-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/seller-policy-decline-reason.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/si-session-status.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/signal-catalog-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/signal-source.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/signal-value-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/snapshot-unavailable-reason.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/social-placement-surface.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/sort-direction.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/sort-metric.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/special-category.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/specialism.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/sponsored-placement-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/talent-role.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/task-status.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/task-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/tracker-execution-actor.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/tracker-firing-path.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/transport-mode.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/travel-time-unit.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/uid-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/universal-macro.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/update-frequency.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/url-asset-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/validation-mode.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/vast-media-delivery-method.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/vast-tracking-event.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/vast-version.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/vendor-relationship.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/video-placement-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/view-threshold-basis.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/viewability-standard.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/warning-code.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/watermark-media-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/wcag-level.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/webhook-response-type.json +1 -1
- package/dist/lib/schemas-data/3.2/enums/webhook-security-method.json +1 -1
- package/dist/lib/schemas-data/3.2/error-details/accessibility-violation.json +1 -1
- package/dist/lib/schemas-data/3.2/error-details/account-moved.json +2 -2
- package/dist/lib/schemas-data/3.2/error-details/account-setup-required.json +1 -1
- package/dist/lib/schemas-data/3.2/error-details/action-not-allowed.json +5 -5
- package/dist/lib/schemas-data/3.2/error-details/agent-permission-denied.json +1 -1
- package/dist/lib/schemas-data/3.2/error-details/audience-too-small.json +1 -1
- package/dist/lib/schemas-data/3.2/error-details/authorization-required.json +3 -3
- package/dist/lib/schemas-data/3.2/error-details/billing-not-permitted-for-agent.json +3 -3
- package/dist/lib/schemas-data/3.2/error-details/billing-not-supported.json +2 -2
- package/dist/lib/schemas-data/3.2/error-details/budget-too-low.json +1 -1
- package/dist/lib/schemas-data/3.2/error-details/conflict.json +1 -1
- package/dist/lib/schemas-data/3.2/error-details/creative-rejected.json +1 -1
- package/dist/lib/schemas-data/3.2/error-details/creative-representation-unresolved.json +2 -2
- package/dist/lib/schemas-data/3.2/error-details/creative-revision-content-mismatch.json +2 -2
- package/dist/lib/schemas-data/3.2/error-details/execution-requirement-unmet.json +2 -2
- package/dist/lib/schemas-data/3.2/error-details/governance-agent-not-accepted.json +2 -2
- package/dist/lib/schemas-data/3.2/error-details/macro-resolution-failed.json +2 -2
- package/dist/lib/schemas-data/3.2/error-details/policy-violation.json +1 -1
- package/dist/lib/schemas-data/3.2/error-details/rate-limited.json +1 -1
- package/dist/lib/schemas-data/3.2/error-details/requote-required.json +3 -3
- package/dist/lib/schemas-data/3.2/error-details/stale-response.json +1 -1
- package/dist/lib/schemas-data/3.2/error-details/unsupported-refinement-dimension.json +1 -1
- package/dist/lib/schemas-data/3.2/error-details/vast-version-mismatch.json +6 -6
- package/dist/lib/schemas-data/3.2/error-details/vendor-error-codes.json +1 -1
- package/dist/lib/schemas-data/3.2/error-details/version-unsupported.json +3 -2
- package/dist/lib/schemas-data/3.2/extensions/extension-meta.json +1 -1
- package/dist/lib/schemas-data/3.2/extensions/index.json +2 -2
- package/dist/lib/schemas-data/3.2/formats/canonical/_base.json +5 -5
- package/dist/lib/schemas-data/3.2/formats/canonical/agent_placement.json +2 -2
- package/dist/lib/schemas-data/3.2/formats/canonical/audio_daast.json +4 -4
- package/dist/lib/schemas-data/3.2/formats/canonical/audio_hosted.json +2 -2
- package/dist/lib/schemas-data/3.2/formats/canonical/audio_vast.json +5 -5
- package/dist/lib/schemas-data/3.2/formats/canonical/coordinated_placements.json +18 -18
- package/dist/lib/schemas-data/3.2/formats/canonical/display_tag.json +2 -2
- package/dist/lib/schemas-data/3.2/formats/canonical/html5.json +2 -2
- package/dist/lib/schemas-data/3.2/formats/canonical/image.json +5 -5
- package/dist/lib/schemas-data/3.2/formats/canonical/image_carousel.json +2 -2
- package/dist/lib/schemas-data/3.2/formats/canonical/native_in_feed.json +5 -5
- package/dist/lib/schemas-data/3.2/formats/canonical/responsive_creative.json +2 -2
- package/dist/lib/schemas-data/3.2/formats/canonical/seller_rendered_stateful_display.json +3 -3
- package/dist/lib/schemas-data/3.2/formats/canonical/sponsored_placement.json +4 -4
- package/dist/lib/schemas-data/3.2/formats/canonical/video_hosted.json +3 -3
- package/dist/lib/schemas-data/3.2/formats/canonical/video_vast.json +8 -8
- package/dist/lib/schemas-data/3.2/governance/accepted-governance-agents.json +1 -1
- package/dist/lib/schemas-data/3.2/governance/attribute-definition.json +1 -1
- package/dist/lib/schemas-data/3.2/governance/audience-constraints.json +3 -3
- package/dist/lib/schemas-data/3.2/governance/check-governance-request.json +10 -10
- package/dist/lib/schemas-data/3.2/governance/check-governance-response.json +8 -8
- package/dist/lib/schemas-data/3.2/governance/get-plan-audit-logs-request.json +5 -5
- package/dist/lib/schemas-data/3.2/governance/get-plan-audit-logs-response.json +14 -14
- package/dist/lib/schemas-data/3.2/governance/policy-category-definition.json +2 -2
- package/dist/lib/schemas-data/3.2/governance/policy-entry.json +7 -7
- package/dist/lib/schemas-data/3.2/governance/policy-ref.json +1 -1
- package/dist/lib/schemas-data/3.2/governance/report-plan-adjustment-request.json +4 -4
- package/dist/lib/schemas-data/3.2/governance/report-plan-adjustment-response.json +4 -4
- package/dist/lib/schemas-data/3.2/governance/report-plan-outcome-request.json +8 -8
- package/dist/lib/schemas-data/3.2/governance/report-plan-outcome-response.json +5 -5
- package/dist/lib/schemas-data/3.2/governance/reported-outcome-error.json +1 -1
- package/dist/lib/schemas-data/3.2/governance/sync-plans-request.json +14 -14
- package/dist/lib/schemas-data/3.2/governance/sync-plans-response.json +6 -6
- package/dist/lib/schemas-data/3.2/index.json +639 -639
- package/dist/lib/schemas-data/3.2/manifest.json +5 -3
- package/dist/lib/schemas-data/3.2/manifest.schema.json +1 -1
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/account/get-account-financials-request.json +32 -30
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/account/list-account-changes-request.json +30 -29
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/account/list-accounts-request.json +32 -30
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/account/report-usage-request.json +32 -30
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/account/sync-accounts-request.json +98 -93
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/account/sync-governance-request.json +31 -29
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/brand/acquire-rights-request.json +41 -36
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/brand/get-brand-identity-request.json +6 -4
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/brand/get-rights-request.json +30 -28
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/brand/search-brands-request.json +26 -26
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/brand/update-rights-request.json +36 -32
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/brand/verify-brand-claim-request.json +5 -3
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/brand/verify-brand-claims-request.json +5 -3
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/collection/create-collection-list-request.json +48 -46
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/collection/delete-collection-list-request.json +31 -29
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/collection/get-collection-list-request.json +31 -29
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/collection/list-collection-lists-request.json +32 -30
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/collection/update-collection-list-request.json +48 -46
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/compliance/comply-test-controller-request.json +1218 -1209
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/content-standards/calibrate-content-request.json +34 -32
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/content-standards/create-content-standards-request.json +57 -55
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/content-standards/get-content-standards-request.json +6 -4
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/content-standards/get-media-buy-artifacts-request.json +31 -29
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/content-standards/list-content-standards-request.json +8 -6
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/content-standards/update-content-standards-request.json +57 -55
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/content-standards/validate-content-delivery-request.json +34 -32
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/creative/get-creative-delivery-request.json +32 -30
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/creative/get-creative-features-request.json +260 -256
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/creative/list-creatives-request.json +48 -45
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/creative/list-transformers-request.json +34 -32
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/creative/preview-creative-request.json +258 -254
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/creative/sync-creatives-request.json +273 -269
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/creative/validate-input-request.json +251 -251
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/governance/check-governance-request.json +378 -376
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/governance/get-plan-audit-logs-request.json +7 -5
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/governance/report-plan-adjustment-request.json +6 -4
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/governance/report-plan-outcome-request.json +88 -86
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/governance/sync-plans-request.json +64 -62
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/accept-proposal-request.json +25 -21
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/build-creative-request.json +450 -446
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/buy-products-request.json +282 -278
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/control-media-buy-request.json +214 -210
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/create-media-buy-request.json +516 -508
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/decline-proposals-request.json +15 -12
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/get-media-buy-delivery-request.json +49 -47
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/get-media-buys-request.json +34 -32
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/get-products-request.json +342 -336
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/get-reporting-status-request.json +59 -57
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/list-creative-formats-request.json +38 -34
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/list-products-request.json +326 -323
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/log-event-request.json +24 -22
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/provide-performance-feedback-request.json +67 -65
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/refine-proposals-request.json +327 -324
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/request-proposals-request.json +328 -325
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/sync-audiences-request.json +39 -37
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/sync-catalogs-request.json +54 -50
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/sync-event-sources-request.json +35 -33
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/sync-reporting-receipts-request.json +23 -22
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/sync-reporting-status-request.json +13 -12
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/update-media-buy-request.json +524 -518
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/account/get-account-financials-request.json +32 -30
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/account/list-accounts-request.json +32 -30
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/account/report-usage-request.json +32 -30
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/account/sync-accounts-request.json +98 -93
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/account/sync-governance-request.json +31 -29
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/creative/list-creatives-request.json +48 -45
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/creative/sync-creatives-request.json +273 -269
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/manifest.json +1 -1
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/accept-proposal-request.json +25 -21
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/buy-products-request.json +282 -278
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/control-media-buy-request.json +214 -210
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/decline-proposals-request.json +15 -12
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/get-media-buy-delivery-request.json +49 -47
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/get-media-buys-request.json +34 -32
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/get-reporting-status-request.json +59 -57
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/list-products-request.json +326 -323
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/log-event-request.json +24 -22
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/provide-performance-feedback-request.json +67 -65
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/refine-proposals-request.json +327 -324
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/request-proposals-request.json +328 -325
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/sync-audiences-request.json +39 -37
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/sync-catalogs-request.json +54 -50
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/sync-event-sources-request.json +35 -33
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/sync-reporting-receipts-request.json +23 -22
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/sync-reporting-status-request.json +13 -12
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/protocol/get-adcp-capabilities-request.json +6 -4
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/protocol/get-principal-request.json +6 -4
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/protocol/get-task-status-request.json +31 -29
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/protocol/list-tasks-request.json +36 -34
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/protocol/sync-principal-request.json +31 -27
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/property/create-property-list-request.json +48 -46
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/property/delete-property-list-request.json +31 -29
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/property/get-property-list-request.json +31 -29
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/property/list-property-lists-request.json +32 -30
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/property/update-property-list-request.json +48 -46
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/property/validate-property-delivery-request.json +37 -35
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/protocol/get-adcp-capabilities-request.json +6 -4
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/protocol/get-principal-request.json +6 -4
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/protocol/get-task-status-request.json +31 -29
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/protocol/list-tasks-request.json +36 -34
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/protocol/sync-agent-notification-configs-request.json +14 -10
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/protocol/sync-principal-request.json +31 -27
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/signals/activate-signal-request.json +32 -30
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/signals/get-signals-request.json +45 -40
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/sponsored-intelligence/si-get-offering-request.json +6 -4
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/sponsored-intelligence/si-initiate-session-request.json +38 -36
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/sponsored-intelligence/si-send-message-request.json +36 -34
- package/dist/lib/schemas-data/3.2/mcp/2026-07-28/sponsored-intelligence/si-terminate-session-request.json +6 -4
- package/dist/lib/schemas-data/3.2/media-buy/accept-proposal-async-response-input-required.json +2 -2
- package/dist/lib/schemas-data/3.2/media-buy/accept-proposal-async-response-submitted.json +2 -2
- package/dist/lib/schemas-data/3.2/media-buy/accept-proposal-async-response-working.json +2 -2
- package/dist/lib/schemas-data/3.2/media-buy/accept-proposal-request.json +10 -10
- package/dist/lib/schemas-data/3.2/media-buy/accept-proposal-response.json +2 -2
- package/dist/lib/schemas-data/3.2/media-buy/acceptance-context.json +3 -3
- package/dist/lib/schemas-data/3.2/media-buy/acceptance-policy-catalog.json +4 -4
- package/dist/lib/schemas-data/3.2/media-buy/acceptance-policy-profile-ref.json +1 -1
- package/dist/lib/schemas-data/3.2/media-buy/acceptance-policy-profile.json +3 -3
- package/dist/lib/schemas-data/3.2/media-buy/acceptance-policy-requirement.json +3 -3
- package/dist/lib/schemas-data/3.2/media-buy/acceptance-policy-rule.json +3 -3
- package/dist/lib/schemas-data/3.2/media-buy/build-creative-async-response-input-required.json +4 -4
- package/dist/lib/schemas-data/3.2/media-buy/build-creative-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.2/media-buy/build-creative-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.2/media-buy/build-creative-request.json +19 -19
- package/dist/lib/schemas-data/3.2/media-buy/build-creative-response.json +35 -35
- package/dist/lib/schemas-data/3.2/media-buy/buy-products-async-response-input-required.json +2 -2
- package/dist/lib/schemas-data/3.2/media-buy/buy-products-async-response-submitted.json +2 -2
- package/dist/lib/schemas-data/3.2/media-buy/buy-products-async-response-working.json +2 -2
- package/dist/lib/schemas-data/3.2/media-buy/buy-products-request.json +19 -19
- package/dist/lib/schemas-data/3.2/media-buy/buy-products-response.json +2 -2
- package/dist/lib/schemas-data/3.2/media-buy/change-term-constraints.json +4 -4
- package/dist/lib/schemas-data/3.2/media-buy/change-term.json +6 -6
- package/dist/lib/schemas-data/3.2/media-buy/commercial-terms.json +12 -12
- package/dist/lib/schemas-data/3.2/media-buy/control-media-buy-async-response-input-required.json +2 -2
- package/dist/lib/schemas-data/3.2/media-buy/control-media-buy-async-response-submitted.json +2 -2
- package/dist/lib/schemas-data/3.2/media-buy/control-media-buy-async-response-working.json +2 -2
- package/dist/lib/schemas-data/3.2/media-buy/control-media-buy-request.json +14 -14
- package/dist/lib/schemas-data/3.2/media-buy/control-media-buy-response.json +12 -12
- package/dist/lib/schemas-data/3.2/media-buy/create-media-buy-async-response-input-required.json +4 -4
- package/dist/lib/schemas-data/3.2/media-buy/create-media-buy-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.2/media-buy/create-media-buy-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.2/media-buy/create-media-buy-request.json +21 -19
- package/dist/lib/schemas-data/3.2/media-buy/create-media-buy-response.json +24 -23
- package/dist/lib/schemas-data/3.2/media-buy/decline-proposals-async-response-input-required.json +2 -2
- package/dist/lib/schemas-data/3.2/media-buy/decline-proposals-async-response-submitted.json +2 -2
- package/dist/lib/schemas-data/3.2/media-buy/decline-proposals-async-response-working.json +2 -2
- package/dist/lib/schemas-data/3.2/media-buy/decline-proposals-request.json +8 -8
- package/dist/lib/schemas-data/3.2/media-buy/decline-proposals-response.json +5 -5
- package/dist/lib/schemas-data/3.2/media-buy/get-media-buy-delivery-request.json +47 -47
- package/dist/lib/schemas-data/3.2/media-buy/get-media-buy-delivery-response.json +83 -81
- package/dist/lib/schemas-data/3.2/media-buy/get-media-buys-request.json +9 -9
- package/dist/lib/schemas-data/3.2/media-buy/get-media-buys-response.json +54 -52
- package/dist/lib/schemas-data/3.2/media-buy/get-products-async-response-input-required.json +4 -4
- package/dist/lib/schemas-data/3.2/media-buy/get-products-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.2/media-buy/get-products-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.2/media-buy/get-products-rejected.json +5 -5
- package/dist/lib/schemas-data/3.2/media-buy/get-products-request.json +19 -19
- package/dist/lib/schemas-data/3.2/media-buy/get-products-response.json +13 -13
- package/dist/lib/schemas-data/3.2/media-buy/get-products-targeting-resolution.json +3 -3
- package/dist/lib/schemas-data/3.2/media-buy/get-reporting-status-request.json +10 -10
- package/dist/lib/schemas-data/3.2/media-buy/get-reporting-status-response.json +27 -27
- package/dist/lib/schemas-data/3.2/media-buy/legacy-purchase-continuation-input.json +2 -2
- package/dist/lib/schemas-data/3.2/media-buy/list-creative-formats-request.json +16 -14
- package/dist/lib/schemas-data/3.2/media-buy/list-creative-formats-response.json +9 -9
- package/dist/lib/schemas-data/3.2/media-buy/list-products-request.json +10 -10
- package/dist/lib/schemas-data/3.2/media-buy/list-products-response.json +5 -5
- package/dist/lib/schemas-data/3.2/media-buy/log-event-request.json +5 -5
- package/dist/lib/schemas-data/3.2/media-buy/log-event-response.json +8 -8
- package/dist/lib/schemas-data/3.2/media-buy/media-buy-commitment-response.json +13 -13
- package/dist/lib/schemas-data/3.2/media-buy/media-buy-delivery-webhook-result.json +12 -11
- package/dist/lib/schemas-data/3.2/media-buy/outcome-target.json +4 -4
- package/dist/lib/schemas-data/3.2/media-buy/package-control.json +9 -9
- package/dist/lib/schemas-data/3.2/media-buy/package-request.json +32 -31
- package/dist/lib/schemas-data/3.2/media-buy/package-update.json +14 -14
- package/dist/lib/schemas-data/3.2/media-buy/product-discovery-criteria.json +9 -9
- package/dist/lib/schemas-data/3.2/media-buy/product-fields.json +1 -1
- package/dist/lib/schemas-data/3.2/media-buy/product-purchase-input.json +22 -22
- package/dist/lib/schemas-data/3.2/media-buy/product-purchase.json +13 -13
- package/dist/lib/schemas-data/3.2/media-buy/product-refinement.json +1 -1
- package/dist/lib/schemas-data/3.2/media-buy/proposal-budget-constraint.json +1 -1
- package/dist/lib/schemas-data/3.2/media-buy/proposal-decline.json +2 -2
- package/dist/lib/schemas-data/3.2/media-buy/proposal-refinement.json +4 -4
- package/dist/lib/schemas-data/3.2/media-buy/provide-performance-feedback-request.json +5 -5
- package/dist/lib/schemas-data/3.2/media-buy/provide-performance-feedback-response.json +8 -8
- package/dist/lib/schemas-data/3.2/media-buy/refine-proposals-async-response-input-required.json +2 -2
- package/dist/lib/schemas-data/3.2/media-buy/refine-proposals-async-response-submitted.json +2 -2
- package/dist/lib/schemas-data/3.2/media-buy/refine-proposals-async-response-working.json +2 -2
- package/dist/lib/schemas-data/3.2/media-buy/refine-proposals-request.json +7 -7
- package/dist/lib/schemas-data/3.2/media-buy/refine-proposals-response.json +12 -12
- package/dist/lib/schemas-data/3.2/media-buy/request-proposals-async-response-input-required.json +2 -2
- package/dist/lib/schemas-data/3.2/media-buy/request-proposals-async-response-submitted.json +2 -2
- package/dist/lib/schemas-data/3.2/media-buy/request-proposals-async-response-working.json +2 -2
- package/dist/lib/schemas-data/3.2/media-buy/request-proposals-request.json +10 -10
- package/dist/lib/schemas-data/3.2/media-buy/request-proposals-response.json +10 -10
- package/dist/lib/schemas-data/3.2/media-buy/sync-audiences-request.json +9 -9
- package/dist/lib/schemas-data/3.2/media-buy/sync-audiences-response.json +15 -15
- package/dist/lib/schemas-data/3.2/media-buy/sync-catalogs-async-response-input-required.json +3 -3
- package/dist/lib/schemas-data/3.2/media-buy/sync-catalogs-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.2/media-buy/sync-catalogs-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.2/media-buy/sync-catalogs-request.json +10 -10
- package/dist/lib/schemas-data/3.2/media-buy/sync-catalogs-response.json +20 -20
- package/dist/lib/schemas-data/3.2/media-buy/sync-event-sources-request.json +8 -8
- package/dist/lib/schemas-data/3.2/media-buy/sync-event-sources-response.json +14 -14
- package/dist/lib/schemas-data/3.2/media-buy/sync-reporting-receipts-request.json +9 -9
- package/dist/lib/schemas-data/3.2/media-buy/sync-reporting-receipts-response.json +10 -10
- package/dist/lib/schemas-data/3.2/media-buy/sync-reporting-status-request.json +8 -8
- package/dist/lib/schemas-data/3.2/media-buy/sync-reporting-status-response.json +8 -8
- package/dist/lib/schemas-data/3.2/media-buy/update-media-buy-async-response-input-required.json +3 -3
- package/dist/lib/schemas-data/3.2/media-buy/update-media-buy-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.2/media-buy/update-media-buy-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.2/media-buy/update-media-buy-request.json +15 -15
- package/dist/lib/schemas-data/3.2/media-buy/update-media-buy-response.json +22 -21
- package/dist/lib/schemas-data/3.2/pricing-options/cpa-option.json +4 -4
- package/dist/lib/schemas-data/3.2/pricing-options/cpc-option.json +4 -4
- package/dist/lib/schemas-data/3.2/pricing-options/cpcv-option.json +4 -4
- package/dist/lib/schemas-data/3.2/pricing-options/cpm-option.json +4 -4
- package/dist/lib/schemas-data/3.2/pricing-options/cpp-option.json +5 -5
- package/dist/lib/schemas-data/3.2/pricing-options/cpv-option.json +4 -4
- package/dist/lib/schemas-data/3.2/pricing-options/flat-rate-option.json +4 -4
- package/dist/lib/schemas-data/3.2/pricing-options/price-breakdown.json +2 -2
- package/dist/lib/schemas-data/3.2/pricing-options/price-guidance.json +1 -1
- package/dist/lib/schemas-data/3.2/pricing-options/revenue-share-option.json +2 -2
- package/dist/lib/schemas-data/3.2/pricing-options/time-option.json +4 -4
- package/dist/lib/schemas-data/3.2/pricing-options/vcpm-option.json +4 -4
- package/dist/lib/schemas-data/3.2/property/authorization-result.json +1 -1
- package/dist/lib/schemas-data/3.2/property/base-property-source.json +4 -4
- package/dist/lib/schemas-data/3.2/property/create-property-list-request.json +8 -8
- package/dist/lib/schemas-data/3.2/property/create-property-list-response.json +6 -6
- package/dist/lib/schemas-data/3.2/property/delete-property-list-request.json +5 -5
- package/dist/lib/schemas-data/3.2/property/delete-property-list-response.json +5 -5
- package/dist/lib/schemas-data/3.2/property/delivery-record.json +3 -3
- package/dist/lib/schemas-data/3.2/property/get-property-list-request.json +5 -5
- package/dist/lib/schemas-data/3.2/property/get-property-list-response.json +9 -9
- package/dist/lib/schemas-data/3.2/property/list-property-lists-request.json +6 -6
- package/dist/lib/schemas-data/3.2/property/list-property-lists-response.json +7 -7
- package/dist/lib/schemas-data/3.2/property/property-error.json +2 -2
- package/dist/lib/schemas-data/3.2/property/property-feature-definition.json +2 -2
- package/dist/lib/schemas-data/3.2/property/property-feature-result.json +4 -4
- package/dist/lib/schemas-data/3.2/property/property-feature-value.json +2 -2
- package/dist/lib/schemas-data/3.2/property/property-feature.json +1 -1
- package/dist/lib/schemas-data/3.2/property/property-list-changed-webhook.json +3 -2
- package/dist/lib/schemas-data/3.2/property/property-list-filters.json +5 -5
- package/dist/lib/schemas-data/3.2/property/property-list.json +6 -6
- package/dist/lib/schemas-data/3.2/property/update-property-list-request.json +8 -8
- package/dist/lib/schemas-data/3.2/property/update-property-list-response.json +6 -6
- package/dist/lib/schemas-data/3.2/property/validate-property-delivery-request.json +6 -6
- package/dist/lib/schemas-data/3.2/property/validate-property-delivery-response.json +6 -6
- package/dist/lib/schemas-data/3.2/property/validation-result.json +5 -5
- package/dist/lib/schemas-data/3.2/protocol/get-adcp-capabilities-request.json +4 -4
- package/dist/lib/schemas-data/3.2/protocol/get-adcp-capabilities-response.json +55 -53
- package/dist/lib/schemas-data/3.2/protocol/get-principal-request.json +4 -4
- package/dist/lib/schemas-data/3.2/protocol/get-principal-response.json +9 -9
- package/dist/lib/schemas-data/3.2/protocol/get-task-status-request.json +5 -5
- package/dist/lib/schemas-data/3.2/protocol/get-task-status-response.json +10 -10
- package/dist/lib/schemas-data/3.2/protocol/list-tasks-request.json +13 -13
- package/dist/lib/schemas-data/3.2/protocol/list-tasks-response.json +8 -8
- package/dist/lib/schemas-data/3.2/protocol/sync-agent-notification-configs-request.json +5 -5
- package/dist/lib/schemas-data/3.2/protocol/sync-agent-notification-configs-response.json +7 -7
- package/dist/lib/schemas-data/3.2/protocol/sync-principal-request.json +8 -8
- package/dist/lib/schemas-data/3.2/protocol/sync-principal-response.json +10 -10
- package/dist/lib/schemas-data/3.2/registries/v1-canonical-mapping.json +2 -2
- package/dist/lib/schemas-data/3.2/signals/activate-signal-request.json +6 -6
- package/dist/lib/schemas-data/3.2/signals/activate-signal-response.json +9 -9
- package/dist/lib/schemas-data/3.2/signals/get-signals-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.2/signals/get-signals-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.2/signals/get-signals-request.json +12 -11
- package/dist/lib/schemas-data/3.2/signals/get-signals-response.json +17 -17
- package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-capabilities.json +1 -1
- package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-context-use.json +1 -1
- package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-get-offering-request.json +4 -4
- package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-get-offering-response.json +9 -9
- package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-identity.json +1 -1
- package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-initiate-session-request.json +7 -7
- package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-initiate-session-response.json +10 -10
- package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-send-message-request.json +5 -5
- package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-send-message-response.json +10 -10
- package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-sponsored-context-receipt.json +4 -4
- package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-sponsored-context.json +4 -4
- package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-terminate-session-request.json +4 -4
- package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-terminate-session-response.json +7 -7
- package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-ui-element.json +1 -1
- package/dist/lib/schemas-data/3.2/trusted-match/available-package.json +6 -5
- package/dist/lib/schemas-data/3.2/trusted-match/context-match-request.json +6 -5
- package/dist/lib/schemas-data/3.2/trusted-match/context-match-response.json +4 -4
- package/dist/lib/schemas-data/3.2/trusted-match/error.json +1 -1
- package/dist/lib/schemas-data/3.2/trusted-match/identity-match-request.json +5 -4
- package/dist/lib/schemas-data/3.2/trusted-match/identity-match-response.json +5 -4
- package/dist/lib/schemas-data/3.2/trusted-match/offer-price.json +1 -1
- package/dist/lib/schemas-data/3.2/trusted-match/offer.json +5 -5
- package/dist/lib/schemas-data/3.2/trusted-match/provider-context-match-response.json +4 -4
- package/dist/lib/schemas-data/3.2/trusted-match/provider-identity-match-response.json +4 -4
- package/dist/lib/schemas-data/3.2/trusted-match/provider-registration.json +2 -2
- package/dist/lib/schemas-data/3.2/trusted-match/publisher-targeting-kv-config.json +1 -1
- package/dist/lib/schemas-data/3.2/trusted-match/publisher-tmpx-config.json +1 -1
- package/dist/lib/schemas-data/3.2/trusted-match/tmpx-chunk.json +1 -1
- package/dist/lib/server/create-adcp-server.d.mts +21 -0
- package/dist/lib/server/create-adcp-server.d.ts +21 -0
- package/dist/lib/server/create-adcp-server.js +97 -15
- package/dist/lib/server/create-adcp-server.mjs +83 -1
- package/dist/lib/server/index.d.mts +1 -1
- package/dist/lib/server/index.d.ts +1 -1
- package/dist/lib/server/targeting-helpers.d.mts +1 -1
- package/dist/lib/server/targeting-helpers.d.ts +1 -1
- package/dist/lib/server/targeting-helpers.js +43 -3
- package/dist/lib/server/targeting-helpers.mjs +43 -3
- package/dist/lib/server/wire-spec-fields.generated.d.mts +32 -32
- package/dist/lib/server/wire-spec-fields.generated.d.ts +32 -32
- package/dist/lib/server/wire-spec-fields.generated.js +32 -32
- package/dist/lib/server/wire-spec-fields.generated.mjs +32 -32
- package/dist/lib/signing/agent-context.d.mts +2 -1
- package/dist/lib/signing/agent-context.d.ts +2 -1
- package/dist/lib/signing/agent-context.js +34 -5
- package/dist/lib/signing/agent-context.mjs +34 -5
- package/dist/lib/signing/agent-fetch.d.mts +4 -5
- package/dist/lib/signing/agent-fetch.d.ts +4 -5
- package/dist/lib/signing/agent-fetch.js +55 -24
- package/dist/lib/signing/agent-fetch.mjs +60 -24
- package/dist/lib/signing/body-validation.d.mts +2 -0
- package/dist/lib/signing/body-validation.d.ts +2 -0
- package/dist/lib/signing/body-validation.js +39 -0
- package/dist/lib/signing/body-validation.mjs +15 -0
- package/dist/lib/signing/errors.d.mts +1 -1
- package/dist/lib/signing/errors.d.ts +1 -1
- package/dist/lib/signing/nonce.d.mts +7 -0
- package/dist/lib/signing/nonce.d.ts +7 -0
- package/dist/lib/signing/nonce.js +30 -0
- package/dist/lib/signing/nonce.mjs +6 -0
- package/dist/lib/signing/protocol-methods.d.mts +12 -0
- package/dist/lib/signing/protocol-methods.d.ts +12 -0
- package/dist/lib/signing/protocol-methods.js +66 -0
- package/dist/lib/signing/protocol-methods.mjs +37 -0
- package/dist/lib/signing/provider.d.mts +2 -0
- package/dist/lib/signing/provider.d.ts +2 -0
- package/dist/lib/signing/provider.js +19 -0
- package/dist/lib/signing/provider.mjs +11 -0
- package/dist/lib/signing/types.d.mts +4 -0
- package/dist/lib/signing/types.d.ts +4 -0
- package/dist/lib/signing/verifier.js +21 -14
- package/dist/lib/signing/verifier.mjs +22 -15
- package/dist/lib/signing/webhook-verifier.d.mts +1 -1
- package/dist/lib/signing/webhook-verifier.d.ts +1 -1
- package/dist/lib/signing/webhook-verifier.js +20 -0
- package/dist/lib/signing/webhook-verifier.mjs +20 -0
- package/dist/lib/storage/interfaces.d.mts +2 -0
- package/dist/lib/storage/interfaces.d.ts +2 -0
- package/dist/lib/testing/client.d.mts +0 -3
- package/dist/lib/testing/client.d.ts +0 -3
- package/dist/lib/testing/client.js +116 -23
- package/dist/lib/testing/client.mjs +118 -24
- package/dist/lib/testing/compliance/comply.js +16 -8
- package/dist/lib/testing/compliance/comply.mjs +19 -8
- package/dist/lib/testing/compliance/index.d.mts +1 -1
- package/dist/lib/testing/compliance/index.d.ts +1 -1
- package/dist/lib/testing/compliance/storyboard-tracks.js +1 -1
- package/dist/lib/testing/compliance/storyboard-tracks.mjs +1 -1
- package/dist/lib/testing/compliance/summary.d.mts +7 -0
- package/dist/lib/testing/compliance/summary.d.ts +7 -0
- package/dist/lib/testing/compliance/summary.js +37 -0
- package/dist/lib/testing/compliance/summary.mjs +37 -0
- package/dist/lib/testing/discovery-evidence.d.mts +2 -0
- package/dist/lib/testing/discovery-evidence.d.ts +2 -0
- package/dist/lib/testing/discovery-evidence.js +48 -0
- package/dist/lib/testing/discovery-evidence.mjs +24 -0
- package/dist/lib/testing/index.d.mts +2 -2
- package/dist/lib/testing/index.d.ts +2 -2
- package/dist/lib/testing/storyboard/agent-routing.js +1 -1
- package/dist/lib/testing/storyboard/agent-routing.mjs +2 -2
- package/dist/lib/testing/storyboard/canonical-format-satisfaction.js +8 -0
- package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs +8 -0
- package/dist/lib/testing/storyboard/compliance.js +29 -0
- package/dist/lib/testing/storyboard/compliance.mjs +29 -0
- package/dist/lib/testing/storyboard/default-invariants.js +77 -54
- package/dist/lib/testing/storyboard/default-invariants.mjs +77 -54
- package/dist/lib/testing/storyboard/index.d.mts +2 -2
- package/dist/lib/testing/storyboard/index.d.ts +2 -2
- package/dist/lib/testing/storyboard/prepared-fixtures.d.mts +14 -0
- package/dist/lib/testing/storyboard/prepared-fixtures.d.ts +14 -0
- package/dist/lib/testing/storyboard/prepared-fixtures.js +9 -0
- package/dist/lib/testing/storyboard/prepared-fixtures.mjs +8 -0
- package/dist/lib/testing/storyboard/request-builder.js +11 -3
- package/dist/lib/testing/storyboard/request-builder.mjs +11 -3
- package/dist/lib/testing/storyboard/request-signing/functional-dispatch.js +7 -4
- package/dist/lib/testing/storyboard/request-signing/functional-dispatch.mjs +7 -4
- package/dist/lib/testing/storyboard/runner.d.mts +7 -4
- package/dist/lib/testing/storyboard/runner.d.ts +7 -4
- package/dist/lib/testing/storyboard/runner.js +378 -50
- package/dist/lib/testing/storyboard/runner.mjs +381 -52
- package/dist/lib/testing/storyboard/seeding.d.mts +2 -0
- package/dist/lib/testing/storyboard/seeding.d.ts +2 -0
- package/dist/lib/testing/storyboard/seeding.js +282 -57
- package/dist/lib/testing/storyboard/seeding.mjs +282 -57
- package/dist/lib/testing/storyboard/task-map.d.mts +4 -1
- package/dist/lib/testing/storyboard/task-map.d.ts +4 -1
- package/dist/lib/testing/storyboard/types.d.mts +32 -1
- package/dist/lib/testing/storyboard/types.d.ts +32 -1
- package/dist/lib/testing/storyboard/validations.d.mts +1 -1
- package/dist/lib/testing/storyboard/validations.d.ts +1 -1
- package/dist/lib/testing/storyboard/validations.js +7 -1
- package/dist/lib/testing/storyboard/validations.mjs +7 -1
- package/dist/lib/testing/storyboard/webhook-assertions.js +170 -23
- package/dist/lib/testing/storyboard/webhook-assertions.mjs +170 -23
- package/dist/lib/testing/storyboard/webhook-receiver.d.mts +2 -0
- package/dist/lib/testing/storyboard/webhook-receiver.d.ts +2 -0
- package/dist/lib/testing/storyboard/webhook-receiver.js +29 -2
- package/dist/lib/testing/storyboard/webhook-receiver.mjs +27 -1
- package/dist/lib/testing/types.d.mts +11 -0
- package/dist/lib/testing/types.d.ts +11 -0
- package/dist/lib/types/adcp.d.mts +10 -2
- package/dist/lib/types/adcp.d.ts +10 -2
- package/dist/lib/types/manifest.generated.d.mts +3 -3
- package/dist/lib/types/manifest.generated.d.ts +3 -3
- package/dist/lib/types/per-tool-index.json +1 -1
- package/dist/lib/types/schemas.generated.d.ts +346 -346
- package/dist/lib/types/schemas.generated.js +12797 -12787
- package/dist/lib/types/schemas.generated.mjs +360 -360
- package/dist/lib/types/wellknown-schemas.generated.d.mts +2 -2
- package/dist/lib/types/wellknown-schemas.generated.d.ts +2 -2
- package/dist/lib/version.d.mts +7 -7
- package/dist/lib/version.d.ts +7 -7
- package/dist/lib/version.js +8 -6
- package/dist/lib/version.mjs +8 -6
- package/docs/CLI.md +21 -0
- package/docs/TYPE-SUMMARY.md +13 -2
- package/docs/ZOD-SCHEMAS.md +3 -1
- package/docs/guides/COLLECTION-FIXTURE-FOUNDATION.md +123 -2
- package/docs/guides/DISCOVERY-CACHE-AND-SESSION-REUSE.md +33 -3
- package/docs/guides/REPORTING-LEDGER.md +20 -9
- package/docs/guides/REPORTING-SOURCE-EXECUTOR.md +22 -0
- package/docs/guides/SIGNING-GUIDE.md +10 -0
- package/docs/llms.txt +11 -7
- package/docs/migration-14.x-rc-worksheet.md +6 -6
- package/docs/migration-agent-identity-3.3.md +11 -4
- package/docs/migration-reporting-storage-package.md +15 -0
- package/examples/reliable-reporting-buyer/worker.mjs +3 -1
- package/package.json +4 -4
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/brand/index.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/brand/scenarios/distributed_brand_resolution.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/brand/scenarios/signed_response_envelope_vectors.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/brand/scenarios/single_side_trust_extension.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/creative/index.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/creative/scenarios/asset_type_filtering.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/creative/scenarios/creative_features_idempotency.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/creative/scenarios/creative_revision_identity.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/creative/scenarios/list_creatives_filter_behavior.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/creative/scenarios/native_localization.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/creative/scenarios/policy_backed_rejections.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/governance/index.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/governance/scenarios/failed_outcome_audit_persistence.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/acceptance_policy_discovery.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/account_change_feed.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/account_timezone_buyer_selected.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/account_timezone_seller_assigned.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/account_timezone_seller_fixed.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/advanced_delivery_reporting.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/audience_activation_discovery.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/audience_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/bidding_cost_binding.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/bidding_policy_placement.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/budget_cap_timezone_account.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/budget_cap_timezone_fixed.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/budget_cap_timezone_override.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/budget_cap_timezone_override_rejected.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/canonical_formats.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/catalog_item_availability_updates.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/collection_selection.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/compact_direct_buy_lifecycle.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/compact_product_lifecycle.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/create_media_buy_async.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/create_media_buy_async_lifecycle.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/cross_path_targeting_provenance.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/declined_proposal_execution.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/declined_proposal_refinement.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/delivery_reporting.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/demographic_targeting.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/dependency_impairment_audience.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/event_dedup_flow.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/expired_proposal_execution.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/external_audience_source_binding.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/geo_region_all_values_support.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/geo_region_exclusion_support.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/geo_region_targeting.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/get_products_async.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/governance_agent_binding_acceptance.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/governance_approved.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/governance_conditions.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/inventory_list_targeting.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/measurement_accountability.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/media_buy_frequency_cap_readback.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/metric_container_subsumption.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/outcome_target.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/outcome_target_list_products_inert.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/owner_sold_channel_carriage.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/package_automatic_bidding.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/performance_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/portfolio_routing_scope.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/product_signal_targeting.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/proposal_finalize.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/reach_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/read_filter_behavior.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/refine_products.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/seller_optimized_budget.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/seller_optimized_min_spend_target_exceeds_package_cap.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/seller_optimized_proposal_package_pacing.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/targeting_aware_discovery.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/signals/scenarios/get_signals_async.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/sponsored-intelligence/index.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/domains/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/brand/index.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/brand/scenarios/distributed_brand_resolution.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/brand/scenarios/signed_response_envelope_vectors.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/brand/scenarios/single_side_trust_extension.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/creative/index.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/creative/scenarios/asset_type_filtering.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/creative/scenarios/creative_features_idempotency.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/creative/scenarios/creative_revision_identity.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/creative/scenarios/list_creatives_filter_behavior.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/creative/scenarios/native_localization.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/creative/scenarios/policy_backed_rejections.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/governance/index.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/governance/scenarios/failed_outcome_audit_persistence.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/acceptance_policy_discovery.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/account_change_feed.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/account_timezone_buyer_selected.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/account_timezone_seller_assigned.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/account_timezone_seller_fixed.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/advanced_delivery_reporting.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/audience_activation_discovery.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/audience_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/bidding_cost_binding.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/bidding_policy_placement.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/budget_cap_timezone_account.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/budget_cap_timezone_fixed.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/budget_cap_timezone_override.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/budget_cap_timezone_override_rejected.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/canonical_formats.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/catalog_item_availability_updates.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/collection_selection.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/compact_direct_buy_lifecycle.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/compact_product_lifecycle.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/create_media_buy_async.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/create_media_buy_async_lifecycle.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/cross_path_targeting_provenance.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/declined_proposal_execution.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/declined_proposal_refinement.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/delivery_reporting.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/demographic_targeting.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/dependency_impairment_audience.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/event_dedup_flow.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/expired_proposal_execution.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/external_audience_source_binding.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/geo_region_all_values_support.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/geo_region_exclusion_support.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/geo_region_targeting.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/get_products_async.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/governance_agent_binding_acceptance.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/governance_approved.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/governance_conditions.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/inventory_list_targeting.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/measurement_accountability.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/media_buy_frequency_cap_readback.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/metric_container_subsumption.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/outcome_target.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/outcome_target_list_products_inert.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/owner_sold_channel_carriage.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/package_automatic_bidding.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/performance_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/portfolio_routing_scope.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/product_signal_targeting.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/proposal_finalize.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/reach_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/read_filter_behavior.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/refine_products.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/seller_optimized_budget.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/seller_optimized_min_spend_target_exceeds_package_cap.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/seller_optimized_proposal_package_pacing.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/targeting_aware_discovery.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/signals/scenarios/get_signals_async.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/sponsored-intelligence/index.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/brand-rights/scenarios/governance_approved.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/brand-rights/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/brand-rights/scenarios/update_rights_lifecycle.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/buyer-activation/index.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/buyer-discovery/index.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/buyer-negotiation/index.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/buyer-recovery/index.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/creative-ad-server/index.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/creative-generative/generative-seller.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/creative-transformers/scenarios/governance_approved.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/creative-transformers/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/governance-aware-seller/index.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/governance-spend-authority/denied.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/orchestrator-multi-agent/index.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sales-broadcast-tv/index.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sales-catalog-driven/index.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sales-exchange/index.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sales-guaranteed/index.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sales-proposal-mode/index.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sales-retail-media/index.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sales-social/index.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sales-streaming-tv/index.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/signal-marketplace/scenarios/governance_approved.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/signal-marketplace/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sponsored-intelligence/index.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/acme-outdoor-live.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/acme-outdoor.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/billing-gate-runner.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/bistro-oranje.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/distributed-brand-runner.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/hosted-grader.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/nova-motors.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/oauth-setup-runner.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/osei-natural.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/parallel-dispatch-runner.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/rate-limit-trip-runner.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/signed-requests-runner.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/signed-responses-runner.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/single-side-trust-runner.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/substitution-observer-runner.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/summit-foods.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/trusted-match-router-runner.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/webhook-receiver-runner.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/attestations/README.md +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/attestations/vectors.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/audience-evidence/README.md +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/audience-evidence/vectors.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/brand-response-signing/brand-authorization-cross-check.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/catalog-macro-substitution.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/creative-representation-resolution.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/creative-representation-resolution.schema.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/error-recovery/README.md +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/error-recovery/vectors.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/governance-authorization.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/governance-runtime-attestations/README.md +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/governance-runtime-attestations/vectors.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/macro-processing.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/macro-processing.schema.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/oauth-setup/vectors.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/001-minimal-plan.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/002-full-plan.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/003-bookkeeping-stripped.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/004a-human-review-omitted.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/004b-human-review-explicit-null.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/005a-policy-categories-order-1.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/005b-policy-categories-order-2.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/006a-ext-trace-v1.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/006b-ext-trace-v2.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/007-unicode-objectives.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/008-numeric-canonicalization.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/products-only-brief-compatibility/README.md +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/products-only-brief-compatibility/vectors.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/relationship-scoped-indicators.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/README.md +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/adjustment.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/canonicalization.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/coverage-aggregation.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/manifest.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/materialization.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/obligation.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/receipts/accepted-recorded-response.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/receipts/accepted-request.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/receipts/accepted-unchanged-response.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/receipts/adjustment-accepted-recorded-response.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/receipts/adjustment-accepted-request.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/receipts/rejected-recorded-response.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/receipts/rejected-request.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/report-definition.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/revision.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/row-schema.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/rows.jsonl +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/scenario-index.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/scenario-index.schema.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-summary/complete-summary.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/README.md +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/001-unsigned-sendmessage-required.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/002-unsigned-message-send-v0-3-required.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/003-unsigned-sendstreamingmessage-required.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/004-duplicate-invocation-datapart.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/005-signed-duplicate-invocation-datapart.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/006-missing-skill.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/007-protocol-method-required-covers-sendmessage.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/008-no-extension-header.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/009-extra-non-invocation-datapart.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/010-filepart-present.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/011-part-with-text-and-data.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/012-non-object-data.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/013-v0-3-kind-mismatch.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/014-duplicate-skill-key.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/015-non-string-skill.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/016-text-only-message.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/017-unsigned-message-stream-v0-3-required.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/018-unresolvable-with-lone-signature-header.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/019-raw-part-present.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/020-case-variant-member-name.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/021-escaped-duplicate-skill-key.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/022-unsigned-http-json-message-send-required.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/023-batch-body.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/024-duplicate-method-key.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/025-missing-method.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/026-empty-skill.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/positive/001-signed-sendmessage-create-media-buy.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/positive/002-signed-message-send-v0-3-create-media-buy.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/positive/003-unsigned-sendmessage-get-products-not-required.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/positive/004-unsigned-decoy-text-and-metadata.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/positive/005-unsigned-alias-skill-not-in-lists.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/positive/006-unsigned-message-send-v0-3-legacy-parameters.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/positive/007-unsigned-method-case-variant.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/body-integrity-policy.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/canonicalization.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/keys.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/001-no-signature-header.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/002-wrong-tag.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/003-expired-signature.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/004-window-too-long.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/005-alg-not-allowed.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/006-missing-covered-component.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/007-missing-content-digest.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/008-unknown-keyid.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/010-content-digest-mismatch.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/011-malformed-header.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/012-missing-expires-param.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/013-expires-le-created.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/014-missing-nonce-param.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/015-signature-invalid.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/016-replayed-nonce.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/017-key-revoked.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/019-signature-without-signature-input.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/020-rate-abuse.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/022-multi-valued-content-type.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/024-unquoted-string-param.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/026-non-ascii-host.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/029-duplicate-signature-label.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/030-content-digest-key-case.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/031-malformed-host-authority.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/001-basic-post.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/002-post-with-content-digest.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/003-es256-post.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/004-multiple-signature-labels.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/005-default-port-stripped.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/006-dot-segment-path.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/007-query-byte-preserved.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/008-percent-encoded-path.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/011-ipv6-authority.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/013-two-signature-labels-distinct.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/014-content-digest-two-algorithms.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/015-bracketed-ipv6-host-with-port.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/001-base64url-sf-binary.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/001-no-signature-header.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/002-multiple-trailing-dots.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/002-wrong-tag.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/003-expired-signature.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/004-window-too-long.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/005-alg-not-allowed.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/006-missing-covered-component.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/007-missing-content-digest.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/008-unknown-keyid.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/009-key-ops-missing-verify.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/010-content-digest-mismatch.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/011-malformed-header.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/012-missing-expires-param.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/013-expires-le-created.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/014-missing-nonce-param.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/015-signature-invalid.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/016-replayed-nonce.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/017-key-revoked.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/019-signature-without-signature-input.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/020-rate-abuse.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/021-duplicate-signature-input-label.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/022-multi-valued-content-type.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/023-multi-valued-content-digest.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/024-unquoted-string-param.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/025-jwk-alg-crv-mismatch.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/026-non-ascii-host.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/027-webhook-registration-authentication-unsigned.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/028-unsigned-protocol-method-required.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/029-duplicate-signature-label.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/030-content-digest-key-case.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/031-malformed-host-authority.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/001-post-with-content-digest.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/003-es256-post.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/004-multiple-signature-labels.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/005-default-port-stripped.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/006-dot-segment-path.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/007-query-byte-preserved.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/008-percent-encoded-path.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/009-percent-encoded-unreserved-decoded.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/010-percent-encoded-slash-preserved.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/011-ipv6-authority.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/012-ipv6-authority-default-port-stripped.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/013-two-signature-labels-distinct.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/014-content-digest-two-algorithms.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/015-bracketed-ipv6-host-with-port.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/protocol-method-names.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/rights-attestations/README.md +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/rights-attestations/vectors.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/supply-path/README.md +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/supply-path/vectors.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/tracker-execution-contracts.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/tracker-execution-contracts.schema.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/trusted-match-context-merge/README.md +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/trusted-match-context-merge/vectors.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/universal-macro-translation.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/universal-macro-translation.schema.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-receiver-envelope.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/README.md +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/keys.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/001-wrong-tag.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/002-expired-signature.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/003-window-too-long.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/005-missing-authority-component.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/006-missing-content-digest.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/007-unknown-keyid.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/011-signature-without-input.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/012-missing-expires-param.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/013-expires-le-created.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/015-signature-invalid.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/016-replayed-nonce.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/017-key-revoked.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/018-rate-abuse.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/019-revocation-stale.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/positive/001-basic-post.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/positive/002-es256-post.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/positive/004-default-port-stripped.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/positive/008-request-signing-key-reuse.json +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/account-identity-reconciliation.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/agent-notification-configs.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/billing-gate-dispatch.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/buyer-fixture-publisher.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/buyer-orchestrator-track.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/comply-controller-mode-gate.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/deterministic-testing.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/fictional-entities.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/get-products-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/governance.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/idempotency.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/notification-config-event-scope.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/notification-config-lifecycle.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/notification-config-rejections.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/oauth-setup.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/pagination-integrity-creative-formats.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/pagination-integrity-list-accounts.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/principal.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/reliable-reporting-managed-delivery.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/reliable-reporting-reconciled-billing.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/reporting-consumer-status.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/reporting-core-declaration.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/reporting-core.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/security.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/signed-requests.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/trusted-match-publisher-authentication.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/v3-envelope-integrity.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/webhook-receiver-envelope.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/wholesale-feed-bulk-webhooks.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/wholesale-feed-product-webhooks.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/wholesale-feed-products-scope-isolation.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/wholesale-feed-products.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/wholesale-feed-signal-webhooks.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/wholesale-feed-signals-scope-isolation.yaml +0 -0
- /package/compliance/cache/{3.2.5 → 3.2.7}/universal/wholesale-feed-signals.yaml +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as z from "zod";
|
|
2
2
|
import { fullFormats as adcpJsonSchemaFormats } from "ajv-formats/dist/formats.js";
|
|
3
3
|
const adcpDateTimeFormat = /* @__PURE__ */ (() => adcpJsonSchemaFormats["date-time"])();
|
|
4
4
|
const adcpUriFormat = /* @__PURE__ */ (() => adcpJsonSchemaFormats.uri)();
|
|
@@ -447,7 +447,7 @@ const AudienceForecastDimensionSchema = /* @__PURE__ */ (() => z.object({
|
|
|
447
447
|
audience_source: AudienceSourceSchema,
|
|
448
448
|
audience_name: z.string().optional()
|
|
449
449
|
}).passthrough())();
|
|
450
|
-
const SignalForecastDimensionSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
|
|
450
|
+
const SignalForecastDimensionSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
|
|
451
451
|
kind: z.literal("signal"),
|
|
452
452
|
signal_ref: SignalRefSchema.optional(),
|
|
453
453
|
signal_id: z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).optional(),
|
|
@@ -709,8 +709,8 @@ const CancellationPolicySchema = /* @__PURE__ */ (() => z.object({
|
|
|
709
709
|
const FlightChangeConstraintsSchema = /* @__PURE__ */ (() => z.object({
|
|
710
710
|
kind: z.literal("flight"),
|
|
711
711
|
max_change: DurationSchema.optional(),
|
|
712
|
-
earliest_result: z.
|
|
713
|
-
latest_result: z.
|
|
712
|
+
earliest_result: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
713
|
+
latest_result: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
714
714
|
minimum_notice: DurationSchema.optional()
|
|
715
715
|
}).passthrough().and(z.union([z.object({
|
|
716
716
|
max_change: DurationSchema
|
|
@@ -720,7 +720,7 @@ const FlightChangeConstraintsSchema = /* @__PURE__ */ (() => z.object({
|
|
|
720
720
|
latest_result: z.string()
|
|
721
721
|
}).passthrough(), z.object({
|
|
722
722
|
minimum_notice: DurationSchema
|
|
723
|
-
}).passthrough()])))();
|
|
723
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
724
724
|
const PackageCountConstraintsSchema = /* @__PURE__ */ (() => z.object({
|
|
725
725
|
kind: z.literal("package_count"),
|
|
726
726
|
max_additions: z.int().min(0).optional(),
|
|
@@ -732,19 +732,19 @@ const PackageCountConstraintsSchema = /* @__PURE__ */ (() => z.object({
|
|
|
732
732
|
max_removals: z.number()
|
|
733
733
|
}).passthrough(), z.object({
|
|
734
734
|
max_result_count: z.number()
|
|
735
|
-
}).passthrough()])))();
|
|
735
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
736
736
|
const EffectiveTimingConstraintsSchema = /* @__PURE__ */ (() => z.object({
|
|
737
737
|
kind: z.literal("effective_timing"),
|
|
738
738
|
minimum_notice: DurationSchema.optional(),
|
|
739
|
-
earliest_effective_at: z.
|
|
740
|
-
latest_effective_at: z.
|
|
739
|
+
earliest_effective_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
740
|
+
latest_effective_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
741
741
|
}).passthrough().and(z.union([z.object({
|
|
742
742
|
minimum_notice: DurationSchema
|
|
743
743
|
}).passthrough(), z.object({
|
|
744
744
|
earliest_effective_at: z.string()
|
|
745
745
|
}).passthrough(), z.object({
|
|
746
746
|
latest_effective_at: z.string()
|
|
747
|
-
}).passthrough()])))();
|
|
747
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
748
748
|
const MoneySchema = /* @__PURE__ */ (() => z.object({
|
|
749
749
|
amount: z.number().min(0),
|
|
750
750
|
currency: z.string().regex(/^[A-Z]{3}$/)
|
|
@@ -939,7 +939,7 @@ const PostalCountrySystemSchema = /* @__PURE__ */ (() => z.union([z.object({
|
|
|
939
939
|
}).passthrough(), z.object({
|
|
940
940
|
country: z.string().refine((country) => !["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"].includes(country)).optional(),
|
|
941
941
|
system: z.union([z.literal("postal_code"), z.literal("custom")]).optional()
|
|
942
|
-
}).passthrough()]).and(z.object({
|
|
942
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.").and(z.object({
|
|
943
943
|
country: z.string(),
|
|
944
944
|
system: PostalCodeSystemSchema
|
|
945
945
|
}).passthrough()))();
|
|
@@ -2183,7 +2183,7 @@ const CanonicalFormatVASTVideoSchema = /* @__PURE__ */ (() => z.object({
|
|
|
2183
2183
|
max_wrapper_depth: z.int().min(0).optional(),
|
|
2184
2184
|
ssl_required: z.boolean().optional()
|
|
2185
2185
|
}).passthrough())();
|
|
2186
|
-
const CanonicalFormatSellerRenderedStatefulDisplaySchema = /* @__PURE__ */ (() => z.object({ "experimental": z.boolean().describe("Experimental in AdCP 3.2 while the creative working group gathers implementation evidence across premium web and mobile/app sellers.").optional(), "deprecated": z.boolean().describe("When true, this canonical (or a seller's specific narrowing of it) is going away. Existing adopters are supported through the deprecation cycle; new adoption is discouraged. Pair with `migration_target_version` to indicate when the canonical is expected to be removed. Distinct from `experimental`: an experimental canonical may stabilize and stop being experimental; a deprecated canonical is on a sunset path.").optional(), "v1_translatable": z.boolean().describe("No v1 named-format equivalent can express multiple seller-rendered states and their breakpoint bindings.").optional(), "since_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version that introduced this canonical (e.g., '3.1', '3.2'). Lets adopters reason about minimum protocol version requirements when consuming a format declaration. Patch precision is intentionally rejected \u2014 canonicals are introduced at minor-version boundaries.").optional(), "migration_target_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version by which the working group expects this canonical to stabilize, surface a breaking revision, or (when `deprecated: true`) be removed. Patch precision is intentionally rejected \u2014 canonicals shift at minor-version boundaries. Absence signals 'no specific target' (omit the field rather than use a placeholder like 'unknown').").optional(), "composition_model": z.enum(["deterministic", "algorithmic"]).describe("Whether the surface composes deterministically (buyer can predict per-slot rendering \u2014 sponsored_placement, image, video) or algorithmically (surface chooses combinations or phrasing \u2014 responsive_creative, agent_placement).").optional(), "provenance_required": z.boolean().describe("When true, the product rejects unsigned synthesized assets. Builders calling build_creative MUST attach a C2PA-compatible provenance manifest attributing synthesis to the creative agent.").optional(), "platform_extensions": z.array(z.object({ "uri": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("HTTPS URL identifying the extension. `https://` is mandatory \u2014 `http://`, `file://`, `data:`, and other schemes are rejected at the schema layer (defense-in-depth on top of the fetch-contract normative rules). The URI base is the owning agent's URL; the path identifies the extension within that agent. Example: 'https://creative.adcontextprotocol.org/translated/meta/extensions/meta_pixel'. The full fetch contract \u2014 SSRF allowlist, response-size cap, $ref sandbox, schema-compile bounds \u2014 is documented on `product-format-declaration.json#format_schema` and applies to ALL fetches of this reference shape regardless of whether the field is named `format_schema` (load-bearing for validation) or `platform_extensions` (informational); the *transport* rules are identical, only the *consumption* semantics differ."), "digest": z.string().regex(new RegExp("^sha256:[a-f0-9]{64}$")).describe("SHA-256 content digest of the extension definition (sha256:<hex>). Used to detect drift \u2014 if the agent revises the extension, the digest changes and cached definitions become invalid.") }).catchall(z.any()).describe("Reference to a platform extension definition. The agent that owns the URI is authoritative for the extension's schema. Buyers fetch the definition once per content digest and cache it. Platform extensions are typically bundled in `get_products` responses under an `extensions` map keyed by `uri@digest`, eliminating the need for a separate fetch.\n\n**Within a single response**, multiple references to the same `uri` MUST carry the same `digest` \u2014 divergent digests in one response indicate producer-side error (e.g., concurrent extension revision mid-render). Buyers encountering divergent digests for the same URI MUST fail closed: treat all references to that URI as unresolved and surface a validation error rather than picking one branch silently. **Across responses**, digest divergence is normal \u2014 extension authors revise their schemas, the new digest differs, the cache key changes, and the buyer refetches. Cache by `uri@digest`, not by `uri` alone.")).describe('Platform-specific extensions narrowing the canonical (pixel ID shapes, conversion event taxonomies, platform-specific CTAs/destinations). Each extension is a URI+digest reference resolved against the bundled `extensions` map in get_products responses or fetched directly.\n\n**Collision precedence (normative).** When two or more `platform_extensions[]` entries on the same declaration extend the same target (e.g., both extend `tracking`) with overlapping field names, **array order is authoritative \u2014 later entries override earlier ones on a per-field basis** (last-in-array-wins). SDKs MUST surface the overlap via the `errors[]` array on the `get_products` response with a structured code (`FORMAT_DECLARATION_DIVERGENT` is appropriate when the overlap appears across dual-emitted shapes; a producer-self-emitted overlap on a single declaration SHOULD use the same code with `error.details: { collision_kind: "platform_extension_field", target, overlapping_fields, winning_extension_uri }`). Producers SHOULD avoid the collision by emitting one extension per target or by partitioning fields across extensions; the deterministic precedence is for last-resort consistency across SDK implementations, not a sanctioned merging strategy.').optional(), "synthesis_nondeterministic": z.boolean().describe("When true, the format's production pipeline is genuinely nondeterministic \u2014 the platform cannot guarantee that synthesis from a given input set produces in-spec output. Veo / Sora / Runway-class generative video, and other AI-synthesis flows where output dimensions, duration, or quality vary per run. Implies a different validation contract: predictive `validate_input` is impossible; the platform's own post-synthesis QA loop applies; if the QA loop exhausts without producing a valid artifact, `build_creative` returns task_failed with a synthesis_failed reason. Distinct from `composition_model` (which describes how the surface composes per-slot rendering, not whether synthesis is deterministic). When false or absent, the format's production is predictable enough that `validate_input` can predict output properties from input properties.\n\n**Compatibility with `asset_source` / `item_production_model`**: `synthesis_nondeterministic: true` MAY pair with any of `seller_pre_rendered_from_brief`, `seller_human_designed`, or `agent_synthesized` (the QA loop is concept-level, not source-specific \u2014 'seller renders from brief but each retry differs' is just as nondeterministic as Veo). It MUST NOT pair with `buyer_uploaded` (the buyer ships pre-rendered bytes; there's no synthesis step to be nondeterministic about). It MUST NOT pair with `publisher_host_recorded` (the publisher's host produces a deterministic-from-script output even if the human voice varies). When `synthesis_nondeterministic: true` is set with an incompatible source, validators SHOULD reject with a structured error.").optional(), "slots": z.array(z.object({ "asset_group_id": z.string().describe("Canonical asset_group_id from /schemas/core/asset-group-vocabulary.json. Non-canonical IDs are valid but trigger soft warnings."), "asset_type": z.enum(["image", "video", "audio", "text", "markdown", "url", "html", "css", "javascript", "vast", "daast", "display_tag", "webhook", "brief", "catalog", "published_post", "zip", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]).describe("Discriminator selecting the asset schema this slot accepts. SDK codegen uses this to type the slot value. `display_tag` is the atomic third-party display representation (URL, inline markup, or paired redirect). `published_post` is an existing-post reference asset. `pixel_tracker` / `vast_tracker` / `daast_tracker` are renderer-fired tracker primitives. `object` is a last-resort fallback."), "required": z.boolean().describe("Whether this slot is required for a valid manifest.").optional(), "min": z.number().int().gte(0).describe("Minimum count for repeatable / pool slots.").optional(), "max": z.number().int().gte(1).describe("Maximum count for repeatable / pool slots.").optional(), "max_chars": z.number().int().gte(1).describe("Per-slot character limit. Valid only when `asset_type` is `text`, `markdown`, or `brief`. Mutually exclusive with `max_size_kb` (which applies to binary asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "max_size_kb": z.number().int().gte(1).describe("Per-slot file size limit in exact kilobytes, where 1 KB = 1,000 bytes. Valid only when `asset_type` is `image`, `video`, `audio`, or `zip`. Mutually exclusive with `max_chars` (which applies to text asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Accepted intrinsic-pixel densities for this image-bearing slot. Valid when `asset_type` is `image`, and on a `card` slot where it constrains each card's image media (video media is unaffected). This makes density available to every canonical carrying image assets (native, carousel, responsive, companion images, and image itself), not only `format_kind: image`. When the image canonical also declares top-level `params.pixel_ratios`, the effective set is the intersection; an empty intersection is invalid. One matching asset satisfies the slot unless `required_pixel_ratios` requires rendition coverage.").optional(), "required_pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Required density coverage for an image rendition set. Valid only when `asset_type` is `image` and `pixel_ratios` is also declared. Every value MUST appear in the effective accepted set after intersecting any top-level image `params.pixel_ratios`, and the manifest slot value MUST be an array containing exactly one matching image rendition for each required ratio. Other accepted ratios remain optional. For example, `pixel_ratios: [1, 1.5, 2]` with `required_pixel_ratios: [1, 2]` requires the 1x and 2x renditions while making 1.5x optional. SDKs enforce intersection, subset, coverage, and duplicate-ratio rules because JSON Schema draft-07 cannot express them generically.").optional(), "logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("When `asset_group_id` is `logo`, renderer-facing brand.json logo slots acceptable for this format slot. Producers selecting from brand.json SHOULD prefer `logos[]` entries whose `slots[]` intersects this list, then apply `visual_guidelines.logo_usage_rules[]`.").optional(), "required_logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Subset of `logo_slots` for which this format expects explicit logo coverage. A manifest or brand-derived logo pool SHOULD include at least one usable logo for each required slot; if coverage is missing, builders SHOULD surface a validation warning or approval mapping instead of guessing from prose.").optional(), "description": z.string().describe("Human-readable description of what the slot expects from the buyer.").optional(), "consumed_for_production": z.boolean().describe("Dispatch hint for `build_creative` and v1\u2194v2 wire translators: when `true`, the slot's value is consumed as INPUT to a production step (host-read script, brief copy fed to generative synthesis, catalog feed driving per-SKU rendering) and is not rendered verbatim. When `false` (default), the slot's value is rendered verbatim on the placement (image bytes, video file, display tag).\n\nMotivates the v1\u2194v2 dispatch table: pre-v2 buyers shipped production-consumed inputs separately in a `inputs` map on the build_creative request; v2 collapses inputs and rendered assets into a single `assets` map keyed by `asset_group_id`. SDK translators between v1 and v2 use this flag per canonical to know which assets in the v2 manifest map back to v1 `inputs` vs v1 `assets`. Without the per-slot flag the dispatch table lives in adopter code and every SDK gets it slightly different.\n\nProducers SHOULD set this explicitly on slots whose consumption pattern isn't obvious (host-read scripts on `audio_hosted`, briefs on generative `video_hosted`, catalog feeds on `sponsored_placement`). For canonicals where every slot is render-verbatim (`image`, `display_tag`, `video_vast`, `audio_vast`), the default `false` is sufficient and the flag MAY be omitted.").optional() }).catchall(z.any()).and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }), z.any().refine((value) => !z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }), z.any().refine((value) => !z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.union([z.any().refine((value) => !z.any().refine((value2) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema").safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.any().refine((value) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.any().refine((value) => !z.union([z.object({ "logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "required_logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]))), z.intersection(z.any(), z.intersection(z.union([z.any().refine((value) => !z.object({ "required_pixel_ratios": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "required_pixel_ratios": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "asset_type": z.literal("image").optional() }))]), z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }), z.any().refine((value) => !z.union([z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))])))))).describe("Default manifest slots; which are consumed depends on `supply_mode`. `state_canvases` images MUST carry `state_id` and `breakpoint_id`, and `state_click_urls` entries MUST carry `state_id` (semantic validators resolve the bindings). Component images SHOULD carry `focal_point` for deterministic seller cropping. `landing_page_url` is the default destination (see `clickthrough`). `font_files` MUST contain only buyer-licensed fonts; publisher-proprietary fonts never travel in manifests. Only image, video, text, url, zip, and pixel_tracker slot asset types are accepted \u2014 executable types (javascript, html, css, webhook) are rejected even via `slots` overrides.").optional(), "required_connections": z.array(z.object({ "provider": z.string().describe("Stable provider or platform namespace, preferably lowercase. Examples: `social.example`, `shortvideo.example`, or a seller-defined namespace. Omit only when the requirement is provider-agnostic, or when an `authorization_url` fully routes the human to the correct provider-specific connection flow.").optional(), "connection_type": z.enum(["advertiser_account", "publisher_identity", "post_authorization"]).describe("Kind of downstream connection required. `advertiser_account` is the platform account used to buy/manage ads. `publisher_identity` is the creator, page, channel, organization, or profile that owns source posts. `post_authorization` is a post-scoped grant when the platform authorizes individual posts instead of, or in addition to, the owning identity."), "required_for": z.array(z.string().min(1)).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Concrete AdCP protocol operation names that require this downstream connection. Sellers SHOULD include this in product declarations when the requirement is known ahead of time, and in AUTHORIZATION_REQUIRED details when it explains the failed operation. Prefer specific operation names such as `list_creatives`, `sync_creatives`, `create_media_buy`, `get_media_buy_delivery`, or `get_creative_delivery` over broad category labels such as `reporting`.").optional(), "scope": z.enum(["account", "identity", "post", "unknown"]).describe("Granularity of the downstream grant.").optional(), "status": z.enum(["connected", "missing", "pending", "expired", "revoked", "not_required", "unknown"]).describe("Current seller-observed state for this downstream connection when known. Product declarations MAY omit status or use `unknown`; AUTHORIZATION_REQUIRED details SHOULD use `missing`, `expired`, or `revoked` for the connection that blocked the call.").optional(), "connection_id": z.string().describe("Seller-defined identifier for an already-created downstream connection. Omit when no connection exists yet or when exposing it would leak platform/account state.").optional(), "resource_ref": z.object({ "platform_account_id": z.string().describe("Provider-native advertiser or business account id, when safe to disclose.").optional(), "identity_id": z.string().describe("Provider-native creator, page, channel, organization, or profile id, when safe to disclose.").optional(), "handle": z.string().describe("Provider-native public handle for the owning identity, when available.").optional(), "profile_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the owning identity, when available.").optional(), "post_id": z.string().describe("Provider-native post id, when the grant is post-scoped or the failed request referenced a specific post.").optional(), "post_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the referenced post, when available.").optional() }).catchall(z.any()).describe("Optional opaque provider-native resource hint, such as a platform account id, profile URL, handle, channel id, post id, or post URL. This is a hint for routing authorization, not proof that authorization exists.").optional(), "authorization_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Seller-hosted or provider-hosted URL where a human can complete or restore this downstream connection.").optional(), "authorization_instructions": z.string().describe("Human-readable instructions for completing or restoring this downstream connection.").optional(), "expires_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }), z.union([z.object({ "provider": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "authorization_url": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]))])).describe("A seller/platform-side connection or grant required by a product, format, or request. This is not the AdCP caller credential: the AdCP request is still authenticated once, and the seller uses these stored downstream connections to call a platform or service on the buyer's behalf. Use this shape for platforms that require more than one downstream grant, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.")).describe("Downstream platform connections or grants required to use this format declaration. These are in addition to the single AdCP caller credential. Use this when a platform product requires multiple downstream grants, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.").optional(), "reference_mutability": z.enum(["immutable_snapshot", "mutable_requires_reapproval", "mutable_auto_recheck"]).describe("Policy for formats whose `slots` accept a `published_post` reference. `immutable_snapshot`: seller snapshots the referenced post at approval and later source changes do not change the served creative. `mutable_requires_reapproval`: the source post may change and material changes require review before continued serving. `mutable_auto_recheck`: the source post may change and the seller continuously or periodically rechecks authorization/policy without requiring buyer resubmission. Omit when the format has no `published_post` slot.").optional(), "production_window_business_days": z.number().int().gte(0).describe("Typical production turnaround in business days when the format requires seller-side production (e.g., host-recording from a buyer-supplied script). 0 for synchronous (e.g., generative AI); >0 for human-produced (e.g., podcast host-read). Absent when no production is required (buyer uploads complete creative).").optional(), "supply_mode": z.enum(["components", "rendered_canvases", "layered_source"]).describe("Which end of the template contract the buyer feeds. `components`: buyer supplies component slots; seller renders states (no `state_canvases`/`layered_source` assets allowed). `rendered_canvases`: buyer supplies exactly one `state_canvases` image per declared state \xD7 breakpoint pair. `layered_source`: buyer ships design source (+ optional `font_files`); seller production derives states (`production_window_business_days` applies) \u2014 transitional for sellers without executable templates.").optional(), "states": z.array(z.object({ "state_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).describe("Stable identifier used by `state_canvases[].state_id` and `state_click_urls[].state_id`."), "anchoring": z.enum(["inline", "sticky_top", "sticky_bottom", "overlay", "fullscreen_overlay", "underlay"]).describe("`underlay` renders the canvas beneath page content, which scrolls over it (IAB New Ad Portfolio underlay class: skins, reveal units). Transitions into `overlay`/`fullscreen_overlay` states SHOULD be user-initiated; non-user-action entries emit LEAN policy warnings."), "slot_bindings": z.array(z.string().regex(new RegExp("^[a-z0-9_]+$"))).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Asset group IDs rendered in this state (components mode). Makes the template executable: given components and bindings, assembly is deterministic. Every value MUST resolve to a declared slot. Omitted means all supplied component slots may render.").optional(), "motion": z.enum(["static", "animated"]).describe("Whether the seller-rendered layout animates within this state (attract loops, load animations). Intra-state animation is seller-rendered; buyer canvases stay static images.").optional(), "max_animation_s": z.number().gt(0).describe("Upper bound on intra-state animation duration. Required when `motion` is `animated`.").optional(), "breakpoints": z.array(z.object({ "breakpoint_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).describe("Stable identifier used by `state_canvases[].breakpoint_id`."), "width": z.number().int().gte(1).optional(), "width_range": z.array(z.number().int().gte(1)).min(2).max(2).describe("Inclusive [minimum, maximum] accepted canvas width. The first value MUST be no greater than the second; semantic validators enforce ordering.").optional(), "width_mode": z.enum(["full_bleed", "gutter_residual"]).describe("Fluid width classes. `full_bleed`: edge-to-edge viewport width (IAB adhesion, topscroll). `gutter_residual`: the margin remaining beside the page content column (desktop skins). Fluid breakpoints cannot be targeted by `rendered_canvases` supply \u2014 semantic validation rejects that pairing.").optional(), "height": z.number().int().gte(1).optional(), "height_range": z.array(z.number().int().gte(1)).min(2).max(2).describe("Inclusive [minimum, maximum] accepted canvas height. The first value MUST be no greater than the second; semantic validators enforce ordering.").optional(), "viewport_height_percent": z.number().gt(0).lte(100).describe("Height as a percentage of the viewport (topscroll 80%, mobile skin panel 15%). Fluid; cannot be targeted by `rendered_canvases` supply.").optional(), "canvas_aspect_ratio": z.string().regex(new RegExp("^[0-9]+(\\.[0-9]+)?:[0-9]+(\\.[0-9]+)?$")).describe("Aspect ratio the rendered canvas maintains across the size range (IAB flexible units, ratio-bucket responsive). When both fixed `width` and `height` are declared, the ratio MUST be consistent with them.").optional() }).catchall(z.any()).and(z.intersection(z.union([z.object({ "width": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "width_range": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "width_mode": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.object({ "height": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "height_range": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "viewport_height_percent": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).min(1).superRefine((breakpoints, ctx) => {
|
|
2186
|
+
const CanonicalFormatSellerRenderedStatefulDisplaySchema = /* @__PURE__ */ (() => z.object({ "experimental": z.boolean().describe("Experimental in AdCP 3.2 while the creative working group gathers implementation evidence across premium web and mobile/app sellers.").optional(), "deprecated": z.boolean().describe("When true, this canonical (or a seller's specific narrowing of it) is going away. Existing adopters are supported through the deprecation cycle; new adoption is discouraged. Pair with `migration_target_version` to indicate when the canonical is expected to be removed. Distinct from `experimental`: an experimental canonical may stabilize and stop being experimental; a deprecated canonical is on a sunset path.").optional(), "v1_translatable": z.boolean().describe("No v1 named-format equivalent can express multiple seller-rendered states and their breakpoint bindings.").optional(), "since_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version that introduced this canonical (e.g., '3.1', '3.2'). Lets adopters reason about minimum protocol version requirements when consuming a format declaration. Patch precision is intentionally rejected \u2014 canonicals are introduced at minor-version boundaries.").optional(), "migration_target_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version by which the working group expects this canonical to stabilize, surface a breaking revision, or (when `deprecated: true`) be removed. Patch precision is intentionally rejected \u2014 canonicals shift at minor-version boundaries. Absence signals 'no specific target' (omit the field rather than use a placeholder like 'unknown').").optional(), "composition_model": z.enum(["deterministic", "algorithmic"]).describe("Whether the surface composes deterministically (buyer can predict per-slot rendering \u2014 sponsored_placement, image, video) or algorithmically (surface chooses combinations or phrasing \u2014 responsive_creative, agent_placement).").optional(), "provenance_required": z.boolean().describe("When true, the product rejects unsigned synthesized assets. Builders calling build_creative MUST attach a C2PA-compatible provenance manifest attributing synthesis to the creative agent.").optional(), "platform_extensions": z.array(z.object({ "uri": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("HTTPS URL identifying the extension. `https://` is mandatory \u2014 `http://`, `file://`, `data:`, and other schemes are rejected at the schema layer (defense-in-depth on top of the fetch-contract normative rules). The URI base is the owning agent's URL; the path identifies the extension within that agent. Example: 'https://creative.adcontextprotocol.org/translated/meta/extensions/meta_pixel'. The full fetch contract \u2014 SSRF allowlist, response-size cap, $ref sandbox, schema-compile bounds \u2014 is documented on `product-format-declaration.json#format_schema` and applies to ALL fetches of this reference shape regardless of whether the field is named `format_schema` (load-bearing for validation) or `platform_extensions` (informational); the *transport* rules are identical, only the *consumption* semantics differ."), "digest": z.string().regex(new RegExp("^sha256:[a-f0-9]{64}$")).describe("SHA-256 content digest of the extension definition (sha256:<hex>). Used to detect drift \u2014 if the agent revises the extension, the digest changes and cached definitions become invalid.") }).catchall(z.any()).describe("Reference to a platform extension definition. The agent that owns the URI is authoritative for the extension's schema. Buyers fetch the definition once per content digest and cache it. Platform extensions are typically bundled in `get_products` responses under an `extensions` map keyed by `uri@digest`, eliminating the need for a separate fetch.\n\n**Within a single response**, multiple references to the same `uri` MUST carry the same `digest` \u2014 divergent digests in one response indicate producer-side error (e.g., concurrent extension revision mid-render). Buyers encountering divergent digests for the same URI MUST fail closed: treat all references to that URI as unresolved and surface a validation error rather than picking one branch silently. **Across responses**, digest divergence is normal \u2014 extension authors revise their schemas, the new digest differs, the cache key changes, and the buyer refetches. Cache by `uri@digest`, not by `uri` alone.")).describe('Platform-specific extensions narrowing the canonical (pixel ID shapes, conversion event taxonomies, platform-specific CTAs/destinations). Each extension is a URI+digest reference resolved against the bundled `extensions` map in get_products responses or fetched directly.\n\n**Collision precedence (normative).** When two or more `platform_extensions[]` entries on the same declaration extend the same target (e.g., both extend `tracking`) with overlapping field names, **array order is authoritative \u2014 later entries override earlier ones on a per-field basis** (last-in-array-wins). SDKs MUST surface the overlap via the `errors[]` array on the `get_products` response with a structured code (`FORMAT_DECLARATION_DIVERGENT` is appropriate when the overlap appears across dual-emitted shapes; a producer-self-emitted overlap on a single declaration SHOULD use the same code with `error.details: { collision_kind: "platform_extension_field", target, overlapping_fields, winning_extension_uri }`). Producers SHOULD avoid the collision by emitting one extension per target or by partitioning fields across extensions; the deterministic precedence is for last-resort consistency across SDK implementations, not a sanctioned merging strategy.').optional(), "synthesis_nondeterministic": z.boolean().describe("When true, the format's production pipeline is genuinely nondeterministic \u2014 the platform cannot guarantee that synthesis from a given input set produces in-spec output. Veo / Sora / Runway-class generative video, and other AI-synthesis flows where output dimensions, duration, or quality vary per run. Implies a different validation contract: predictive `validate_input` is impossible; the platform's own post-synthesis QA loop applies; if the QA loop exhausts without producing a valid artifact, `build_creative` returns task_failed with a synthesis_failed reason. Distinct from `composition_model` (which describes how the surface composes per-slot rendering, not whether synthesis is deterministic). When false or absent, the format's production is predictable enough that `validate_input` can predict output properties from input properties.\n\n**Compatibility with `asset_source` / `item_production_model`**: `synthesis_nondeterministic: true` MAY pair with any of `seller_pre_rendered_from_brief`, `seller_human_designed`, or `agent_synthesized` (the QA loop is concept-level, not source-specific \u2014 'seller renders from brief but each retry differs' is just as nondeterministic as Veo). It MUST NOT pair with `buyer_uploaded` (the buyer ships pre-rendered bytes; there's no synthesis step to be nondeterministic about). It MUST NOT pair with `publisher_host_recorded` (the publisher's host produces a deterministic-from-script output even if the human voice varies). When `synthesis_nondeterministic: true` is set with an incompatible source, validators SHOULD reject with a structured error.").optional(), "slots": z.array(z.object({ "asset_group_id": z.string().describe("Canonical asset_group_id from /schemas/core/asset-group-vocabulary.json. Non-canonical IDs are valid but trigger soft warnings."), "asset_type": z.enum(["image", "video", "audio", "text", "markdown", "url", "html", "css", "javascript", "vast", "daast", "display_tag", "webhook", "brief", "catalog", "published_post", "zip", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]).describe("Discriminator selecting the asset schema this slot accepts. SDK codegen uses this to type the slot value. `display_tag` is the atomic third-party display representation (URL, inline markup, or paired redirect). `published_post` is an existing-post reference asset. `pixel_tracker` / `vast_tracker` / `daast_tracker` are renderer-fired tracker primitives. `object` is a last-resort fallback."), "required": z.boolean().describe("Whether this slot is required for a valid manifest.").optional(), "min": z.number().int().gte(0).describe("Minimum count for repeatable / pool slots.").optional(), "max": z.number().int().gte(1).describe("Maximum count for repeatable / pool slots.").optional(), "max_chars": z.number().int().gte(1).describe("Per-slot character limit. Valid only when `asset_type` is `text`, `markdown`, or `brief`. Mutually exclusive with `max_size_kb` (which applies to binary asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "max_size_kb": z.number().int().gte(1).describe("Per-slot file size limit in exact kilobytes, where 1 KB = 1,000 bytes. Valid only when `asset_type` is `image`, `video`, `audio`, or `zip`. Mutually exclusive with `max_chars` (which applies to text asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Accepted intrinsic-pixel densities for this image-bearing slot. Valid when `asset_type` is `image`, and on a `card` slot where it constrains each card's image media (video media is unaffected). This makes density available to every canonical carrying image assets (native, carousel, responsive, companion images, and image itself), not only `format_kind: image`. When the image canonical also declares top-level `params.pixel_ratios`, the effective set is the intersection; an empty intersection is invalid. One matching asset satisfies the slot unless `required_pixel_ratios` requires rendition coverage.").optional(), "required_pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Required density coverage for an image rendition set. Valid only when `asset_type` is `image` and `pixel_ratios` is also declared. Every value MUST appear in the effective accepted set after intersecting any top-level image `params.pixel_ratios`, and the manifest slot value MUST be an array containing exactly one matching image rendition for each required ratio. Other accepted ratios remain optional. For example, `pixel_ratios: [1, 1.5, 2]` with `required_pixel_ratios: [1, 2]` requires the 1x and 2x renditions while making 1.5x optional. SDKs enforce intersection, subset, coverage, and duplicate-ratio rules because JSON Schema draft-07 cannot express them generically.").optional(), "logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("When `asset_group_id` is `logo`, renderer-facing brand.json logo slots acceptable for this format slot. Producers selecting from brand.json SHOULD prefer `logos[]` entries whose `slots[]` intersects this list, then apply `visual_guidelines.logo_usage_rules[]`.").optional(), "required_logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Subset of `logo_slots` for which this format expects explicit logo coverage. A manifest or brand-derived logo pool SHOULD include at least one usable logo for each required slot; if coverage is missing, builders SHOULD surface a validation warning or approval mapping instead of guessing from prose.").optional(), "description": z.string().describe("Human-readable description of what the slot expects from the buyer.").optional(), "consumed_for_production": z.boolean().describe("Dispatch hint for `build_creative` and v1\u2194v2 wire translators: when `true`, the slot's value is consumed as INPUT to a production step (host-read script, brief copy fed to generative synthesis, catalog feed driving per-SKU rendering) and is not rendered verbatim. When `false` (default), the slot's value is rendered verbatim on the placement (image bytes, video file, display tag).\n\nMotivates the v1\u2194v2 dispatch table: pre-v2 buyers shipped production-consumed inputs separately in a `inputs` map on the build_creative request; v2 collapses inputs and rendered assets into a single `assets` map keyed by `asset_group_id`. SDK translators between v1 and v2 use this flag per canonical to know which assets in the v2 manifest map back to v1 `inputs` vs v1 `assets`. Without the per-slot flag the dispatch table lives in adopter code and every SDK gets it slightly different.\n\nProducers SHOULD set this explicitly on slots whose consumption pattern isn't obvious (host-read scripts on `audio_hosted`, briefs on generative `video_hosted`, catalog feeds on `sponsored_placement`). For canonicals where every slot is render-verbatim (`image`, `display_tag`, `video_vast`, `audio_vast`), the default `false` is sufficient and the flag MAY be omitted.").optional() }).catchall(z.any()).and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }), z.any().refine((value) => !z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }), z.any().refine((value) => !z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.union([z.any().refine((value) => !z.any().refine((value2) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema").safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.any().refine((value) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.any().refine((value) => !z.union([z.object({ "logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "required_logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]))), z.intersection(z.any(), z.intersection(z.union([z.any().refine((value) => !z.object({ "required_pixel_ratios": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "required_pixel_ratios": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "asset_type": z.literal("image").optional() }))]), z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }), z.any().refine((value) => !z.union([z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))])))))).describe("Default manifest slots; which are consumed depends on `supply_mode`. `state_canvases` images MUST carry `state_id` and `breakpoint_id`, and `state_click_urls` entries MUST carry `state_id` (semantic validators resolve the bindings). Component images SHOULD carry `focal_point` for deterministic seller cropping. `landing_page_url` is the default destination (see `clickthrough`). `font_files` MUST contain only buyer-licensed fonts; publisher-proprietary fonts never travel in manifests. Only image, video, text, url, zip, and pixel_tracker slot asset types are accepted \u2014 executable types (javascript, html, css, webhook) are rejected even via `slots` overrides.").optional(), "required_connections": z.array(z.object({ "provider": z.string().describe("Stable provider or platform namespace, preferably lowercase. Examples: `social.example`, `shortvideo.example`, or a seller-defined namespace. Omit only when the requirement is provider-agnostic, or when an `authorization_url` fully routes the human to the correct provider-specific connection flow.").optional(), "connection_type": z.enum(["advertiser_account", "publisher_identity", "post_authorization"]).describe("Kind of downstream connection required. `advertiser_account` is the platform account used to buy/manage ads. `publisher_identity` is the creator, page, channel, organization, or profile that owns source posts. `post_authorization` is a post-scoped grant when the platform authorizes individual posts instead of, or in addition to, the owning identity."), "required_for": z.array(z.string().min(1)).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Concrete AdCP protocol operation names that require this downstream connection. Sellers SHOULD include this in product declarations when the requirement is known ahead of time, and in AUTHORIZATION_REQUIRED details when it explains the failed operation. Prefer specific operation names such as `list_creatives`, `sync_creatives`, `create_media_buy`, `get_media_buy_delivery`, or `get_creative_delivery` over broad category labels such as `reporting`.").optional(), "scope": z.enum(["account", "identity", "post", "unknown"]).describe("Granularity of the downstream grant.").optional(), "status": z.enum(["connected", "missing", "pending", "expired", "revoked", "not_required", "unknown"]).describe("Current seller-observed state for this downstream connection when known. Product declarations MAY omit status or use `unknown`; AUTHORIZATION_REQUIRED details SHOULD use `missing`, `expired`, or `revoked` for the connection that blocked the call.").optional(), "connection_id": z.string().describe("Seller-defined identifier for an already-created downstream connection. Omit when no connection exists yet or when exposing it would leak platform/account state.").optional(), "resource_ref": z.object({ "platform_account_id": z.string().describe("Provider-native advertiser or business account id, when safe to disclose.").optional(), "identity_id": z.string().describe("Provider-native creator, page, channel, organization, or profile id, when safe to disclose.").optional(), "handle": z.string().describe("Provider-native public handle for the owning identity, when available.").optional(), "profile_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the owning identity, when available.").optional(), "post_id": z.string().describe("Provider-native post id, when the grant is post-scoped or the failed request referenced a specific post.").optional(), "post_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the referenced post, when available.").optional() }).catchall(z.any()).describe("Optional opaque provider-native resource hint, such as a platform account id, profile URL, handle, channel id, post id, or post URL. This is a hint for routing authorization, not proof that authorization exists.").optional(), "authorization_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Seller-hosted or provider-hosted URL where a human can complete or restore this downstream connection.").optional(), "authorization_instructions": z.string().describe("Human-readable instructions for completing or restoring this downstream connection.").optional(), "expires_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }), z.union([z.object({ "provider": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "authorization_url": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]))]).describe("Must also satisfy at least one of these alternatives.")).describe("A seller/platform-side connection or grant required by a product, format, or request. This is not the AdCP caller credential: the AdCP request is still authenticated once, and the seller uses these stored downstream connections to call a platform or service on the buyer's behalf. Use this shape for platforms that require more than one downstream grant, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.")).describe("Downstream platform connections or grants required to use this format declaration. These are in addition to the single AdCP caller credential. Use this when a platform product requires multiple downstream grants, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.").optional(), "reference_mutability": z.enum(["immutable_snapshot", "mutable_requires_reapproval", "mutable_auto_recheck"]).describe("Policy for formats whose `slots` accept a `published_post` reference. `immutable_snapshot`: seller snapshots the referenced post at approval and later source changes do not change the served creative. `mutable_requires_reapproval`: the source post may change and material changes require review before continued serving. `mutable_auto_recheck`: the source post may change and the seller continuously or periodically rechecks authorization/policy without requiring buyer resubmission. Omit when the format has no `published_post` slot.").optional(), "production_window_business_days": z.number().int().gte(0).describe("Typical production turnaround in business days when the format requires seller-side production (e.g., host-recording from a buyer-supplied script). 0 for synchronous (e.g., generative AI); >0 for human-produced (e.g., podcast host-read). Absent when no production is required (buyer uploads complete creative).").optional(), "supply_mode": z.enum(["components", "rendered_canvases", "layered_source"]).describe("Which end of the template contract the buyer feeds. `components`: buyer supplies component slots; seller renders states (no `state_canvases`/`layered_source` assets allowed). `rendered_canvases`: buyer supplies exactly one `state_canvases` image per declared state \xD7 breakpoint pair. `layered_source`: buyer ships design source (+ optional `font_files`); seller production derives states (`production_window_business_days` applies) \u2014 transitional for sellers without executable templates.").optional(), "states": z.array(z.object({ "state_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).describe("Stable identifier used by `state_canvases[].state_id` and `state_click_urls[].state_id`."), "anchoring": z.enum(["inline", "sticky_top", "sticky_bottom", "overlay", "fullscreen_overlay", "underlay"]).describe("`underlay` renders the canvas beneath page content, which scrolls over it (IAB New Ad Portfolio underlay class: skins, reveal units). Transitions into `overlay`/`fullscreen_overlay` states SHOULD be user-initiated; non-user-action entries emit LEAN policy warnings."), "slot_bindings": z.array(z.string().regex(new RegExp("^[a-z0-9_]+$"))).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Asset group IDs rendered in this state (components mode). Makes the template executable: given components and bindings, assembly is deterministic. Every value MUST resolve to a declared slot. Omitted means all supplied component slots may render.").optional(), "motion": z.enum(["static", "animated"]).describe("Whether the seller-rendered layout animates within this state (attract loops, load animations). Intra-state animation is seller-rendered; buyer canvases stay static images.").optional(), "max_animation_s": z.number().gt(0).describe("Upper bound on intra-state animation duration. Required when `motion` is `animated`.").optional(), "breakpoints": z.array(z.object({ "breakpoint_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).describe("Stable identifier used by `state_canvases[].breakpoint_id`."), "width": z.number().int().gte(1).optional(), "width_range": z.array(z.number().int().gte(1)).min(2).max(2).describe("Inclusive [minimum, maximum] accepted canvas width. The first value MUST be no greater than the second; semantic validators enforce ordering.").optional(), "width_mode": z.enum(["full_bleed", "gutter_residual"]).describe("Fluid width classes. `full_bleed`: edge-to-edge viewport width (IAB adhesion, topscroll). `gutter_residual`: the margin remaining beside the page content column (desktop skins). Fluid breakpoints cannot be targeted by `rendered_canvases` supply \u2014 semantic validation rejects that pairing.").optional(), "height": z.number().int().gte(1).optional(), "height_range": z.array(z.number().int().gte(1)).min(2).max(2).describe("Inclusive [minimum, maximum] accepted canvas height. The first value MUST be no greater than the second; semantic validators enforce ordering.").optional(), "viewport_height_percent": z.number().gt(0).lte(100).describe("Height as a percentage of the viewport (topscroll 80%, mobile skin panel 15%). Fluid; cannot be targeted by `rendered_canvases` supply.").optional(), "canvas_aspect_ratio": z.string().regex(new RegExp("^[0-9]+(\\.[0-9]+)?:[0-9]+(\\.[0-9]+)?$")).describe("Aspect ratio the rendered canvas maintains across the size range (IAB flexible units, ratio-bucket responsive). When both fixed `width` and `height` are declared, the ratio MUST be consistent with them.").optional() }).catchall(z.any()).and(z.intersection(z.union([z.object({ "width": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "width_range": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "width_mode": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.object({ "height": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "height_range": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "viewport_height_percent": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).min(1).superRefine((breakpoints, ctx) => {
|
|
2187
2187
|
breakpoints.forEach((breakpoint, index) => {
|
|
2188
2188
|
const widthKeys = ["width", "width_range", "width_mode"].filter((key) => breakpoint[key] !== void 0);
|
|
2189
2189
|
const heightKeys = ["height", "height_range", "viewport_height_percent"].filter((key) => breakpoint[key] !== void 0);
|
|
@@ -2239,7 +2239,7 @@ const CanonicalFormatSellerRenderedStatefulDisplaySchema = /* @__PURE__ */ (() =
|
|
|
2239
2239
|
ctx.addIssue({ code: "custom", path: [index, "input"], message: "scroll transitions require input=scroll" });
|
|
2240
2240
|
}
|
|
2241
2241
|
});
|
|
2242
|
-
}), "clickthrough": z.enum(["required", "optional", "none"]).describe("Destination policy. `required` (default): manifest MUST supply `landing_page_url`. `optional`: click-optional units (in-feed brand units) may omit it. `none`: unit is non-clickable; manifests MUST NOT supply `landing_page_url` or `state_click_urls`. Per-state overrides via `state_click_urls` entries carrying `state_id`; `landing_page_url` is the fallback for unlisted states.").optional(), "user_controls": z.object({ "dismissible": z.boolean(), "user_collapsible": z.boolean() }).catchall(z.any()).describe("When any state anchors as `overlay` or `fullscreen_overlay`, either `dismissible` MUST be true or that state's `close_affordance` MUST be true (dismissibility floor; semantic validators enforce)."), "canvas_constraints": z.array(z.object({ "constraint": z.enum(["safe_area", "reserved_region", "decoration_only_edge", "no_text_or_logos"]), "state_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "breakpoint_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "region": z.object({ "x": z.number().gte(0), "y": z.number().gte(0), "width": z.number().gt(0), "height": z.number().gt(0), "unit": z.enum(["px", "percent"]).optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "unit": z.literal("percent") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "unit": z.literal("percent") }), z.object({ "x": z.any().optional(), "y": z.any().optional(), "width": z.any().optional(), "height": z.any().optional() }))])) }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "breakpoint_id": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "breakpoint_id": z.any().refine((value) => value !== void 0, "Required"), "state_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Rectangular rule applied to buyer artwork. State and breakpoint selectors are optional so the same shape can constrain a coordinated-placement component or a specific stateful-display canvas.")).describe("Rectangular areas constraining buyer artwork. Omitted state/breakpoint selectors apply the constraint to every canvas. For fluid or range-sized breakpoints, use percent-unit regions.").optional(), "duration_ms_range": z.array(z.union([z.number().int().gte(0), z.null()])).min(2).max(2).describe("Accepted embedded-video duration [min, max]. `duration_ms_exact` takes precedence when both are present.").optional().superRefine((range, ctx) => {
|
|
2242
|
+
}), "clickthrough": z.enum(["required", "optional", "none"]).describe("Destination policy. `required` (default): manifest MUST supply `landing_page_url`. `optional`: click-optional units (in-feed brand units) may omit it. `none`: unit is non-clickable; manifests MUST NOT supply `landing_page_url` or `state_click_urls`. Per-state overrides via `state_click_urls` entries carrying `state_id`; `landing_page_url` is the fallback for unlisted states.").optional(), "user_controls": z.object({ "dismissible": z.boolean(), "user_collapsible": z.boolean() }).catchall(z.any()).describe("When any state anchors as `overlay` or `fullscreen_overlay`, either `dismissible` MUST be true or that state's `close_affordance` MUST be true (dismissibility floor; semantic validators enforce)."), "canvas_constraints": z.array(z.object({ "constraint": z.enum(["safe_area", "reserved_region", "decoration_only_edge", "no_text_or_logos"]), "state_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "breakpoint_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "region": z.object({ "x": z.number().gte(0), "y": z.number().gte(0), "width": z.number().gt(0), "height": z.number().gt(0), "unit": z.enum(["px", "percent"]).optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "unit": z.literal("percent") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "unit": z.literal("percent") }), z.object({ "x": z.any().optional(), "y": z.any().optional(), "width": z.any().optional(), "height": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")) }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "breakpoint_id": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "breakpoint_id": z.any().refine((value) => value !== void 0, "Required"), "state_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Rectangular rule applied to buyer artwork. State and breakpoint selectors are optional so the same shape can constrain a coordinated-placement component or a specific stateful-display canvas.")).describe("Rectangular areas constraining buyer artwork. Omitted state/breakpoint selectors apply the constraint to every canvas. For fluid or range-sized breakpoints, use percent-unit regions.").optional(), "duration_ms_range": z.array(z.union([z.number().int().gte(0), z.null()])).min(2).max(2).describe("Accepted embedded-video duration [min, max]. `duration_ms_exact` takes precedence when both are present.").optional().superRefine((range, ctx) => {
|
|
2243
2243
|
if (range !== void 0 && !range.some((value) => value !== null)) {
|
|
2244
2244
|
ctx.addIssue({ code: "custom", path: [], message: "duration_ms_range requires at least one finite bound" });
|
|
2245
2245
|
}
|
|
@@ -2643,7 +2643,7 @@ const CommittedMetricSchema = /* @__PURE__ */ (() => z.union([z.object({
|
|
|
2643
2643
|
committed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
2644
2644
|
}).passthrough()]))();
|
|
2645
2645
|
const AudienceCharacteristicSchema = /* @__PURE__ */ (() => z.object({
|
|
2646
|
-
dimension: z.union([z.literal("age"), z.object({}).passthrough()]).and(z.string()),
|
|
2646
|
+
dimension: z.union([z.literal("age"), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.").and(z.string()),
|
|
2647
2647
|
value: z.union([z.string(), z.number(), z.boolean(), z.array(z.union([z.string(), z.number(), z.boolean()]))]).optional(),
|
|
2648
2648
|
range: z.object({
|
|
2649
2649
|
min: z.number().optional(),
|
|
@@ -2655,8 +2655,8 @@ const AudienceCharacteristicSchema = /* @__PURE__ */ (() => z.object({
|
|
|
2655
2655
|
value_id: z.string().min(1).optional()
|
|
2656
2656
|
}).passthrough().optional(),
|
|
2657
2657
|
label: z.string().optional()
|
|
2658
|
-
}).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
|
|
2659
|
-
dimension: z.union([z.literal("age"), z.object({}).passthrough()]).and(z.string()),
|
|
2658
|
+
}).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
|
|
2659
|
+
dimension: z.union([z.literal("age"), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.").and(z.string()),
|
|
2660
2660
|
value: z.union([z.string(), z.number(), z.boolean(), z.array(z.union([z.string(), z.number(), z.boolean()]))]).optional(),
|
|
2661
2661
|
range: z.object({
|
|
2662
2662
|
min: z.number().optional(),
|
|
@@ -2873,7 +2873,7 @@ const CoordinatedPlacementInlineParamsRuntimeSchemas = /* @__PURE__ */ (() => ({
|
|
|
2873
2873
|
agent_placement: CanonicalFormatAgentPlacementAISurfaceSponsoredPlacementSchema,
|
|
2874
2874
|
seller_rendered_stateful_display: CanonicalFormatSellerRenderedStatefulDisplaySchema
|
|
2875
2875
|
}))();
|
|
2876
|
-
const CanonicalFormatCoordinatedPlacementsSchema = /* @__PURE__ */ (() => z.object({ "experimental": z.boolean().describe("Experimental in AdCP 3.2 while the creative working group gathers implementation evidence for atomic cross-placement composition.").optional(), "deprecated": z.boolean().describe("When true, this canonical (or a seller's specific narrowing of it) is going away. Existing adopters are supported through the deprecation cycle; new adoption is discouraged. Pair with `migration_target_version` to indicate when the canonical is expected to be removed. Distinct from `experimental`: an experimental canonical may stabilize and stop being experimental; a deprecated canonical is on a sunset path.").optional(), "v1_translatable": z.boolean().describe("No v1 named-format equivalent can express a coordinated multi-placement buy.").optional(), "since_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version that introduced this canonical (e.g., '3.1', '3.2'). Lets adopters reason about minimum protocol version requirements when consuming a format declaration. Patch precision is intentionally rejected \u2014 canonicals are introduced at minor-version boundaries.").optional(), "migration_target_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version by which the working group expects this canonical to stabilize, surface a breaking revision, or (when `deprecated: true`) be removed. Patch precision is intentionally rejected \u2014 canonicals shift at minor-version boundaries. Absence signals 'no specific target' (omit the field rather than use a placeholder like 'unknown').").optional(), "composition_model": z.enum(["deterministic", "algorithmic"]).describe("Whether the surface composes deterministically (buyer can predict per-slot rendering \u2014 sponsored_placement, image, video) or algorithmically (surface chooses combinations or phrasing \u2014 responsive_creative, agent_placement).").optional(), "provenance_required": z.boolean().describe("When true, the product rejects unsigned synthesized assets. Builders calling build_creative MUST attach a C2PA-compatible provenance manifest attributing synthesis to the creative agent.").optional(), "platform_extensions": z.array(z.object({ "uri": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("HTTPS URL identifying the extension. `https://` is mandatory \u2014 `http://`, `file://`, `data:`, and other schemes are rejected at the schema layer (defense-in-depth on top of the fetch-contract normative rules). The URI base is the owning agent's URL; the path identifies the extension within that agent. Example: 'https://creative.adcontextprotocol.org/translated/meta/extensions/meta_pixel'. The full fetch contract \u2014 SSRF allowlist, response-size cap, $ref sandbox, schema-compile bounds \u2014 is documented on `product-format-declaration.json#format_schema` and applies to ALL fetches of this reference shape regardless of whether the field is named `format_schema` (load-bearing for validation) or `platform_extensions` (informational); the *transport* rules are identical, only the *consumption* semantics differ."), "digest": z.string().regex(new RegExp("^sha256:[a-f0-9]{64}$")).describe("SHA-256 content digest of the extension definition (sha256:<hex>). Used to detect drift \u2014 if the agent revises the extension, the digest changes and cached definitions become invalid.") }).catchall(z.any()).describe("Reference to a platform extension definition. The agent that owns the URI is authoritative for the extension's schema. Buyers fetch the definition once per content digest and cache it. Platform extensions are typically bundled in `get_products` responses under an `extensions` map keyed by `uri@digest`, eliminating the need for a separate fetch.\n\n**Within a single response**, multiple references to the same `uri` MUST carry the same `digest` \u2014 divergent digests in one response indicate producer-side error (e.g., concurrent extension revision mid-render). Buyers encountering divergent digests for the same URI MUST fail closed: treat all references to that URI as unresolved and surface a validation error rather than picking one branch silently. **Across responses**, digest divergence is normal \u2014 extension authors revise their schemas, the new digest differs, the cache key changes, and the buyer refetches. Cache by `uri@digest`, not by `uri` alone.")).describe('Platform-specific extensions narrowing the canonical (pixel ID shapes, conversion event taxonomies, platform-specific CTAs/destinations). Each extension is a URI+digest reference resolved against the bundled `extensions` map in get_products responses or fetched directly.\n\n**Collision precedence (normative).** When two or more `platform_extensions[]` entries on the same declaration extend the same target (e.g., both extend `tracking`) with overlapping field names, **array order is authoritative \u2014 later entries override earlier ones on a per-field basis** (last-in-array-wins). SDKs MUST surface the overlap via the `errors[]` array on the `get_products` response with a structured code (`FORMAT_DECLARATION_DIVERGENT` is appropriate when the overlap appears across dual-emitted shapes; a producer-self-emitted overlap on a single declaration SHOULD use the same code with `error.details: { collision_kind: "platform_extension_field", target, overlapping_fields, winning_extension_uri }`). Producers SHOULD avoid the collision by emitting one extension per target or by partitioning fields across extensions; the deterministic precedence is for last-resort consistency across SDK implementations, not a sanctioned merging strategy.').optional(), "synthesis_nondeterministic": z.boolean().describe("When true, the format's production pipeline is genuinely nondeterministic \u2014 the platform cannot guarantee that synthesis from a given input set produces in-spec output. Veo / Sora / Runway-class generative video, and other AI-synthesis flows where output dimensions, duration, or quality vary per run. Implies a different validation contract: predictive `validate_input` is impossible; the platform's own post-synthesis QA loop applies; if the QA loop exhausts without producing a valid artifact, `build_creative` returns task_failed with a synthesis_failed reason. Distinct from `composition_model` (which describes how the surface composes per-slot rendering, not whether synthesis is deterministic). When false or absent, the format's production is predictable enough that `validate_input` can predict output properties from input properties.\n\n**Compatibility with `asset_source` / `item_production_model`**: `synthesis_nondeterministic: true` MAY pair with any of `seller_pre_rendered_from_brief`, `seller_human_designed`, or `agent_synthesized` (the QA loop is concept-level, not source-specific \u2014 'seller renders from brief but each retry differs' is just as nondeterministic as Veo). It MUST NOT pair with `buyer_uploaded` (the buyer ships pre-rendered bytes; there's no synthesis step to be nondeterministic about). It MUST NOT pair with `publisher_host_recorded` (the publisher's host produces a deterministic-from-script output even if the human voice varies). When `synthesis_nondeterministic: true` is set with an incompatible source, validators SHOULD reject with a structured error.").optional(), "slots": z.array(z.object({ "asset_group_id": z.string().describe("Canonical asset_group_id from /schemas/core/asset-group-vocabulary.json. Non-canonical IDs are valid but trigger soft warnings."), "asset_type": z.enum(["image", "video", "audio", "text", "markdown", "url", "html", "css", "javascript", "vast", "daast", "display_tag", "webhook", "brief", "catalog", "published_post", "zip", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]).describe("Discriminator selecting the asset schema this slot accepts. SDK codegen uses this to type the slot value. `display_tag` is the atomic third-party display representation (URL, inline markup, or paired redirect). `published_post` is an existing-post reference asset. `pixel_tracker` / `vast_tracker` / `daast_tracker` are renderer-fired tracker primitives. `object` is a last-resort fallback."), "required": z.boolean().describe("Whether this slot is required for a valid manifest.").optional(), "min": z.number().int().gte(0).describe("Minimum count for repeatable / pool slots.").optional(), "max": z.number().int().gte(1).describe("Maximum count for repeatable / pool slots.").optional(), "max_chars": z.number().int().gte(1).describe("Per-slot character limit. Valid only when `asset_type` is `text`, `markdown`, or `brief`. Mutually exclusive with `max_size_kb` (which applies to binary asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "max_size_kb": z.number().int().gte(1).describe("Per-slot file size limit in exact kilobytes, where 1 KB = 1,000 bytes. Valid only when `asset_type` is `image`, `video`, `audio`, or `zip`. Mutually exclusive with `max_chars` (which applies to text asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Accepted intrinsic-pixel densities for this image-bearing slot. Valid when `asset_type` is `image`, and on a `card` slot where it constrains each card's image media (video media is unaffected). This makes density available to every canonical carrying image assets (native, carousel, responsive, companion images, and image itself), not only `format_kind: image`. When the image canonical also declares top-level `params.pixel_ratios`, the effective set is the intersection; an empty intersection is invalid. One matching asset satisfies the slot unless `required_pixel_ratios` requires rendition coverage.").optional(), "required_pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Required density coverage for an image rendition set. Valid only when `asset_type` is `image` and `pixel_ratios` is also declared. Every value MUST appear in the effective accepted set after intersecting any top-level image `params.pixel_ratios`, and the manifest slot value MUST be an array containing exactly one matching image rendition for each required ratio. Other accepted ratios remain optional. For example, `pixel_ratios: [1, 1.5, 2]` with `required_pixel_ratios: [1, 2]` requires the 1x and 2x renditions while making 1.5x optional. SDKs enforce intersection, subset, coverage, and duplicate-ratio rules because JSON Schema draft-07 cannot express them generically.").optional(), "logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("When `asset_group_id` is `logo`, renderer-facing brand.json logo slots acceptable for this format slot. Producers selecting from brand.json SHOULD prefer `logos[]` entries whose `slots[]` intersects this list, then apply `visual_guidelines.logo_usage_rules[]`.").optional(), "required_logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Subset of `logo_slots` for which this format expects explicit logo coverage. A manifest or brand-derived logo pool SHOULD include at least one usable logo for each required slot; if coverage is missing, builders SHOULD surface a validation warning or approval mapping instead of guessing from prose.").optional(), "description": z.string().describe("Human-readable description of what the slot expects from the buyer.").optional(), "consumed_for_production": z.boolean().describe("Dispatch hint for `build_creative` and v1\u2194v2 wire translators: when `true`, the slot's value is consumed as INPUT to a production step (host-read script, brief copy fed to generative synthesis, catalog feed driving per-SKU rendering) and is not rendered verbatim. When `false` (default), the slot's value is rendered verbatim on the placement (image bytes, video file, display tag).\n\nMotivates the v1\u2194v2 dispatch table: pre-v2 buyers shipped production-consumed inputs separately in a `inputs` map on the build_creative request; v2 collapses inputs and rendered assets into a single `assets` map keyed by `asset_group_id`. SDK translators between v1 and v2 use this flag per canonical to know which assets in the v2 manifest map back to v1 `inputs` vs v1 `assets`. Without the per-slot flag the dispatch table lives in adopter code and every SDK gets it slightly different.\n\nProducers SHOULD set this explicitly on slots whose consumption pattern isn't obvious (host-read scripts on `audio_hosted`, briefs on generative `video_hosted`, catalog feeds on `sponsored_placement`). For canonicals where every slot is render-verbatim (`image`, `display_tag`, `video_vast`, `audio_vast`), the default `false` is sufficient and the flag MAY be omitted.").optional() }).catchall(z.any()).and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }), z.any().refine((value) => !z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }), z.any().refine((value) => !z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.union([z.any().refine((value) => !z.any().refine((value2) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema").safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.any().refine((value) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.any().refine((value) => !z.union([z.object({ "logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "required_logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]))), z.intersection(z.any(), z.intersection(z.union([z.any().refine((value) => !z.object({ "required_pixel_ratios": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "required_pixel_ratios": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "asset_type": z.literal("image").optional() }))]), z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }), z.any().refine((value) => !z.union([z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))])))))).describe("Programmatic declaration of which canonical asset_group_id slots a manifest targeting this format must (or may) populate. Lets SDK codegen and validators enumerate expected slots without parsing the format's prose description. Each entry references an asset_group_id from the canonical vocabulary registry, paired with an `asset_type` so the validator knows which asset schema to apply. Format-level narrowing parameters that apply across all slots (e.g., flat `headline_max_chars` on responsive_creative) may also live on the format declaration; per-slot constraints (a specific slot's `max_chars` or `max_size_kb`) live on the slot entry.").optional(), "required_connections": z.array(z.object({ "provider": z.string().describe("Stable provider or platform namespace, preferably lowercase. Examples: `social.example`, `shortvideo.example`, or a seller-defined namespace. Omit only when the requirement is provider-agnostic, or when an `authorization_url` fully routes the human to the correct provider-specific connection flow.").optional(), "connection_type": z.enum(["advertiser_account", "publisher_identity", "post_authorization"]).describe("Kind of downstream connection required. `advertiser_account` is the platform account used to buy/manage ads. `publisher_identity` is the creator, page, channel, organization, or profile that owns source posts. `post_authorization` is a post-scoped grant when the platform authorizes individual posts instead of, or in addition to, the owning identity."), "required_for": z.array(z.string().min(1)).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Concrete AdCP protocol operation names that require this downstream connection. Sellers SHOULD include this in product declarations when the requirement is known ahead of time, and in AUTHORIZATION_REQUIRED details when it explains the failed operation. Prefer specific operation names such as `list_creatives`, `sync_creatives`, `create_media_buy`, `get_media_buy_delivery`, or `get_creative_delivery` over broad category labels such as `reporting`.").optional(), "scope": z.enum(["account", "identity", "post", "unknown"]).describe("Granularity of the downstream grant.").optional(), "status": z.enum(["connected", "missing", "pending", "expired", "revoked", "not_required", "unknown"]).describe("Current seller-observed state for this downstream connection when known. Product declarations MAY omit status or use `unknown`; AUTHORIZATION_REQUIRED details SHOULD use `missing`, `expired`, or `revoked` for the connection that blocked the call.").optional(), "connection_id": z.string().describe("Seller-defined identifier for an already-created downstream connection. Omit when no connection exists yet or when exposing it would leak platform/account state.").optional(), "resource_ref": z.object({ "platform_account_id": z.string().describe("Provider-native advertiser or business account id, when safe to disclose.").optional(), "identity_id": z.string().describe("Provider-native creator, page, channel, organization, or profile id, when safe to disclose.").optional(), "handle": z.string().describe("Provider-native public handle for the owning identity, when available.").optional(), "profile_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the owning identity, when available.").optional(), "post_id": z.string().describe("Provider-native post id, when the grant is post-scoped or the failed request referenced a specific post.").optional(), "post_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the referenced post, when available.").optional() }).catchall(z.any()).describe("Optional opaque provider-native resource hint, such as a platform account id, profile URL, handle, channel id, post id, or post URL. This is a hint for routing authorization, not proof that authorization exists.").optional(), "authorization_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Seller-hosted or provider-hosted URL where a human can complete or restore this downstream connection.").optional(), "authorization_instructions": z.string().describe("Human-readable instructions for completing or restoring this downstream connection.").optional(), "expires_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }), z.union([z.object({ "provider": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "authorization_url": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]))])).describe("A seller/platform-side connection or grant required by a product, format, or request. This is not the AdCP caller credential: the AdCP request is still authenticated once, and the seller uses these stored downstream connections to call a platform or service on the buyer's behalf. Use this shape for platforms that require more than one downstream grant, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.")).describe("Downstream platform connections or grants required to use this format declaration. These are in addition to the single AdCP caller credential. Use this when a platform product requires multiple downstream grants, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.").optional(), "reference_mutability": z.enum(["immutable_snapshot", "mutable_requires_reapproval", "mutable_auto_recheck"]).describe("Policy for formats whose `slots` accept a `published_post` reference. `immutable_snapshot`: seller snapshots the referenced post at approval and later source changes do not change the served creative. `mutable_requires_reapproval`: the source post may change and material changes require review before continued serving. `mutable_auto_recheck`: the source post may change and the seller continuously or periodically rechecks authorization/policy without requiring buyer resubmission. Omit when the format has no `published_post` slot.").optional(), "production_window_business_days": z.number().int().gte(0).describe("Typical production turnaround in business days when the format requires seller-side production (e.g., host-recording from a buyer-supplied script). 0 for synchronous (e.g., generative AI); >0 for human-produced (e.g., podcast host-read). Absent when no production is required (buyer uploads complete creative).").optional(), "components": z.array(z.object({ "component_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).describe("Stable coordination-local component identifier. Values MUST be unique within `components[]`."), "placement_ref": z.object({ "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring a publisher-catalog placement is hosted, or the inventory publisher associated with an inline placement. Omitted only for legacy single-publisher product-context references.").optional(), "placement_id": z.string().describe("Placement ID from the publisher's adagents.json placement catalog, or an inline seller-defined placement ID interpreted within the enclosing seller and product context.") }).catchall(z.any()).describe("Public product placement this component supplies. MUST resolve against the containing product's `placements[]`."), "required": z.boolean(), "sequence": z.number().int().gte(1).describe("Declared presentation order for sequential-messaging coordinated buys. Components sharing a sequence value present simultaneously; absent means unordered/simultaneous (default). Sequence declares seller-rendered ordering, not buyer-controlled timing.").optional(), "serving_policy": z.enum(["seller_served_only", "third_party_allowed"]).describe("Per-component serving/tracking policy. Some sellers restrict specific components (e.g., page skins) to first-party serving while allowing third-party tags on sibling components. Defaults to the product-level policy when absent.").optional(), "canvas_constraints": z.array(z.object({ "constraint": z.enum(["safe_area", "reserved_region", "decoration_only_edge", "no_text_or_logos"]), "state_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "breakpoint_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "region": z.object({ "x": z.number().gte(0), "y": z.number().gte(0), "width": z.number().gt(0), "height": z.number().gt(0), "unit": z.enum(["px", "percent"]).optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "unit": z.literal("percent") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "unit": z.literal("percent") }), z.object({ "x": z.any().optional(), "y": z.any().optional(), "width": z.any().optional(), "height": z.any().optional() }))])) }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "breakpoint_id": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "breakpoint_id": z.any().refine((value) => value !== void 0, "Required"), "state_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Rectangular rule applied to buyer artwork. State and breakpoint selectors are optional so the same shape can constrain a coordinated-placement component or a specific stateful-display canvas.")).describe("Artwork constraints applied to this component, including safe areas and seller-reserved regions.").optional(), "format_option_ref": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
|
|
2876
|
+
const CanonicalFormatCoordinatedPlacementsSchema = /* @__PURE__ */ (() => z.object({ "experimental": z.boolean().describe("Experimental in AdCP 3.2 while the creative working group gathers implementation evidence for atomic cross-placement composition.").optional(), "deprecated": z.boolean().describe("When true, this canonical (or a seller's specific narrowing of it) is going away. Existing adopters are supported through the deprecation cycle; new adoption is discouraged. Pair with `migration_target_version` to indicate when the canonical is expected to be removed. Distinct from `experimental`: an experimental canonical may stabilize and stop being experimental; a deprecated canonical is on a sunset path.").optional(), "v1_translatable": z.boolean().describe("No v1 named-format equivalent can express a coordinated multi-placement buy.").optional(), "since_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version that introduced this canonical (e.g., '3.1', '3.2'). Lets adopters reason about minimum protocol version requirements when consuming a format declaration. Patch precision is intentionally rejected \u2014 canonicals are introduced at minor-version boundaries.").optional(), "migration_target_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version by which the working group expects this canonical to stabilize, surface a breaking revision, or (when `deprecated: true`) be removed. Patch precision is intentionally rejected \u2014 canonicals shift at minor-version boundaries. Absence signals 'no specific target' (omit the field rather than use a placeholder like 'unknown').").optional(), "composition_model": z.enum(["deterministic", "algorithmic"]).describe("Whether the surface composes deterministically (buyer can predict per-slot rendering \u2014 sponsored_placement, image, video) or algorithmically (surface chooses combinations or phrasing \u2014 responsive_creative, agent_placement).").optional(), "provenance_required": z.boolean().describe("When true, the product rejects unsigned synthesized assets. Builders calling build_creative MUST attach a C2PA-compatible provenance manifest attributing synthesis to the creative agent.").optional(), "platform_extensions": z.array(z.object({ "uri": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("HTTPS URL identifying the extension. `https://` is mandatory \u2014 `http://`, `file://`, `data:`, and other schemes are rejected at the schema layer (defense-in-depth on top of the fetch-contract normative rules). The URI base is the owning agent's URL; the path identifies the extension within that agent. Example: 'https://creative.adcontextprotocol.org/translated/meta/extensions/meta_pixel'. The full fetch contract \u2014 SSRF allowlist, response-size cap, $ref sandbox, schema-compile bounds \u2014 is documented on `product-format-declaration.json#format_schema` and applies to ALL fetches of this reference shape regardless of whether the field is named `format_schema` (load-bearing for validation) or `platform_extensions` (informational); the *transport* rules are identical, only the *consumption* semantics differ."), "digest": z.string().regex(new RegExp("^sha256:[a-f0-9]{64}$")).describe("SHA-256 content digest of the extension definition (sha256:<hex>). Used to detect drift \u2014 if the agent revises the extension, the digest changes and cached definitions become invalid.") }).catchall(z.any()).describe("Reference to a platform extension definition. The agent that owns the URI is authoritative for the extension's schema. Buyers fetch the definition once per content digest and cache it. Platform extensions are typically bundled in `get_products` responses under an `extensions` map keyed by `uri@digest`, eliminating the need for a separate fetch.\n\n**Within a single response**, multiple references to the same `uri` MUST carry the same `digest` \u2014 divergent digests in one response indicate producer-side error (e.g., concurrent extension revision mid-render). Buyers encountering divergent digests for the same URI MUST fail closed: treat all references to that URI as unresolved and surface a validation error rather than picking one branch silently. **Across responses**, digest divergence is normal \u2014 extension authors revise their schemas, the new digest differs, the cache key changes, and the buyer refetches. Cache by `uri@digest`, not by `uri` alone.")).describe('Platform-specific extensions narrowing the canonical (pixel ID shapes, conversion event taxonomies, platform-specific CTAs/destinations). Each extension is a URI+digest reference resolved against the bundled `extensions` map in get_products responses or fetched directly.\n\n**Collision precedence (normative).** When two or more `platform_extensions[]` entries on the same declaration extend the same target (e.g., both extend `tracking`) with overlapping field names, **array order is authoritative \u2014 later entries override earlier ones on a per-field basis** (last-in-array-wins). SDKs MUST surface the overlap via the `errors[]` array on the `get_products` response with a structured code (`FORMAT_DECLARATION_DIVERGENT` is appropriate when the overlap appears across dual-emitted shapes; a producer-self-emitted overlap on a single declaration SHOULD use the same code with `error.details: { collision_kind: "platform_extension_field", target, overlapping_fields, winning_extension_uri }`). Producers SHOULD avoid the collision by emitting one extension per target or by partitioning fields across extensions; the deterministic precedence is for last-resort consistency across SDK implementations, not a sanctioned merging strategy.').optional(), "synthesis_nondeterministic": z.boolean().describe("When true, the format's production pipeline is genuinely nondeterministic \u2014 the platform cannot guarantee that synthesis from a given input set produces in-spec output. Veo / Sora / Runway-class generative video, and other AI-synthesis flows where output dimensions, duration, or quality vary per run. Implies a different validation contract: predictive `validate_input` is impossible; the platform's own post-synthesis QA loop applies; if the QA loop exhausts without producing a valid artifact, `build_creative` returns task_failed with a synthesis_failed reason. Distinct from `composition_model` (which describes how the surface composes per-slot rendering, not whether synthesis is deterministic). When false or absent, the format's production is predictable enough that `validate_input` can predict output properties from input properties.\n\n**Compatibility with `asset_source` / `item_production_model`**: `synthesis_nondeterministic: true` MAY pair with any of `seller_pre_rendered_from_brief`, `seller_human_designed`, or `agent_synthesized` (the QA loop is concept-level, not source-specific \u2014 'seller renders from brief but each retry differs' is just as nondeterministic as Veo). It MUST NOT pair with `buyer_uploaded` (the buyer ships pre-rendered bytes; there's no synthesis step to be nondeterministic about). It MUST NOT pair with `publisher_host_recorded` (the publisher's host produces a deterministic-from-script output even if the human voice varies). When `synthesis_nondeterministic: true` is set with an incompatible source, validators SHOULD reject with a structured error.").optional(), "slots": z.array(z.object({ "asset_group_id": z.string().describe("Canonical asset_group_id from /schemas/core/asset-group-vocabulary.json. Non-canonical IDs are valid but trigger soft warnings."), "asset_type": z.enum(["image", "video", "audio", "text", "markdown", "url", "html", "css", "javascript", "vast", "daast", "display_tag", "webhook", "brief", "catalog", "published_post", "zip", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]).describe("Discriminator selecting the asset schema this slot accepts. SDK codegen uses this to type the slot value. `display_tag` is the atomic third-party display representation (URL, inline markup, or paired redirect). `published_post` is an existing-post reference asset. `pixel_tracker` / `vast_tracker` / `daast_tracker` are renderer-fired tracker primitives. `object` is a last-resort fallback."), "required": z.boolean().describe("Whether this slot is required for a valid manifest.").optional(), "min": z.number().int().gte(0).describe("Minimum count for repeatable / pool slots.").optional(), "max": z.number().int().gte(1).describe("Maximum count for repeatable / pool slots.").optional(), "max_chars": z.number().int().gte(1).describe("Per-slot character limit. Valid only when `asset_type` is `text`, `markdown`, or `brief`. Mutually exclusive with `max_size_kb` (which applies to binary asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "max_size_kb": z.number().int().gte(1).describe("Per-slot file size limit in exact kilobytes, where 1 KB = 1,000 bytes. Valid only when `asset_type` is `image`, `video`, `audio`, or `zip`. Mutually exclusive with `max_chars` (which applies to text asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Accepted intrinsic-pixel densities for this image-bearing slot. Valid when `asset_type` is `image`, and on a `card` slot where it constrains each card's image media (video media is unaffected). This makes density available to every canonical carrying image assets (native, carousel, responsive, companion images, and image itself), not only `format_kind: image`. When the image canonical also declares top-level `params.pixel_ratios`, the effective set is the intersection; an empty intersection is invalid. One matching asset satisfies the slot unless `required_pixel_ratios` requires rendition coverage.").optional(), "required_pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Required density coverage for an image rendition set. Valid only when `asset_type` is `image` and `pixel_ratios` is also declared. Every value MUST appear in the effective accepted set after intersecting any top-level image `params.pixel_ratios`, and the manifest slot value MUST be an array containing exactly one matching image rendition for each required ratio. Other accepted ratios remain optional. For example, `pixel_ratios: [1, 1.5, 2]` with `required_pixel_ratios: [1, 2]` requires the 1x and 2x renditions while making 1.5x optional. SDKs enforce intersection, subset, coverage, and duplicate-ratio rules because JSON Schema draft-07 cannot express them generically.").optional(), "logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("When `asset_group_id` is `logo`, renderer-facing brand.json logo slots acceptable for this format slot. Producers selecting from brand.json SHOULD prefer `logos[]` entries whose `slots[]` intersects this list, then apply `visual_guidelines.logo_usage_rules[]`.").optional(), "required_logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Subset of `logo_slots` for which this format expects explicit logo coverage. A manifest or brand-derived logo pool SHOULD include at least one usable logo for each required slot; if coverage is missing, builders SHOULD surface a validation warning or approval mapping instead of guessing from prose.").optional(), "description": z.string().describe("Human-readable description of what the slot expects from the buyer.").optional(), "consumed_for_production": z.boolean().describe("Dispatch hint for `build_creative` and v1\u2194v2 wire translators: when `true`, the slot's value is consumed as INPUT to a production step (host-read script, brief copy fed to generative synthesis, catalog feed driving per-SKU rendering) and is not rendered verbatim. When `false` (default), the slot's value is rendered verbatim on the placement (image bytes, video file, display tag).\n\nMotivates the v1\u2194v2 dispatch table: pre-v2 buyers shipped production-consumed inputs separately in a `inputs` map on the build_creative request; v2 collapses inputs and rendered assets into a single `assets` map keyed by `asset_group_id`. SDK translators between v1 and v2 use this flag per canonical to know which assets in the v2 manifest map back to v1 `inputs` vs v1 `assets`. Without the per-slot flag the dispatch table lives in adopter code and every SDK gets it slightly different.\n\nProducers SHOULD set this explicitly on slots whose consumption pattern isn't obvious (host-read scripts on `audio_hosted`, briefs on generative `video_hosted`, catalog feeds on `sponsored_placement`). For canonicals where every slot is render-verbatim (`image`, `display_tag`, `video_vast`, `audio_vast`), the default `false` is sufficient and the flag MAY be omitted.").optional() }).catchall(z.any()).and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }), z.any().refine((value) => !z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }), z.any().refine((value) => !z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.union([z.any().refine((value) => !z.any().refine((value2) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema").safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.any().refine((value) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.any().refine((value) => !z.union([z.object({ "logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "required_logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]))), z.intersection(z.any(), z.intersection(z.union([z.any().refine((value) => !z.object({ "required_pixel_ratios": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "required_pixel_ratios": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "asset_type": z.literal("image").optional() }))]), z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }), z.any().refine((value) => !z.union([z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))])))))).describe("Programmatic declaration of which canonical asset_group_id slots a manifest targeting this format must (or may) populate. Lets SDK codegen and validators enumerate expected slots without parsing the format's prose description. Each entry references an asset_group_id from the canonical vocabulary registry, paired with an `asset_type` so the validator knows which asset schema to apply. Format-level narrowing parameters that apply across all slots (e.g., flat `headline_max_chars` on responsive_creative) may also live on the format declaration; per-slot constraints (a specific slot's `max_chars` or `max_size_kb`) live on the slot entry.").optional(), "required_connections": z.array(z.object({ "provider": z.string().describe("Stable provider or platform namespace, preferably lowercase. Examples: `social.example`, `shortvideo.example`, or a seller-defined namespace. Omit only when the requirement is provider-agnostic, or when an `authorization_url` fully routes the human to the correct provider-specific connection flow.").optional(), "connection_type": z.enum(["advertiser_account", "publisher_identity", "post_authorization"]).describe("Kind of downstream connection required. `advertiser_account` is the platform account used to buy/manage ads. `publisher_identity` is the creator, page, channel, organization, or profile that owns source posts. `post_authorization` is a post-scoped grant when the platform authorizes individual posts instead of, or in addition to, the owning identity."), "required_for": z.array(z.string().min(1)).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Concrete AdCP protocol operation names that require this downstream connection. Sellers SHOULD include this in product declarations when the requirement is known ahead of time, and in AUTHORIZATION_REQUIRED details when it explains the failed operation. Prefer specific operation names such as `list_creatives`, `sync_creatives`, `create_media_buy`, `get_media_buy_delivery`, or `get_creative_delivery` over broad category labels such as `reporting`.").optional(), "scope": z.enum(["account", "identity", "post", "unknown"]).describe("Granularity of the downstream grant.").optional(), "status": z.enum(["connected", "missing", "pending", "expired", "revoked", "not_required", "unknown"]).describe("Current seller-observed state for this downstream connection when known. Product declarations MAY omit status or use `unknown`; AUTHORIZATION_REQUIRED details SHOULD use `missing`, `expired`, or `revoked` for the connection that blocked the call.").optional(), "connection_id": z.string().describe("Seller-defined identifier for an already-created downstream connection. Omit when no connection exists yet or when exposing it would leak platform/account state.").optional(), "resource_ref": z.object({ "platform_account_id": z.string().describe("Provider-native advertiser or business account id, when safe to disclose.").optional(), "identity_id": z.string().describe("Provider-native creator, page, channel, organization, or profile id, when safe to disclose.").optional(), "handle": z.string().describe("Provider-native public handle for the owning identity, when available.").optional(), "profile_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the owning identity, when available.").optional(), "post_id": z.string().describe("Provider-native post id, when the grant is post-scoped or the failed request referenced a specific post.").optional(), "post_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the referenced post, when available.").optional() }).catchall(z.any()).describe("Optional opaque provider-native resource hint, such as a platform account id, profile URL, handle, channel id, post id, or post URL. This is a hint for routing authorization, not proof that authorization exists.").optional(), "authorization_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Seller-hosted or provider-hosted URL where a human can complete or restore this downstream connection.").optional(), "authorization_instructions": z.string().describe("Human-readable instructions for completing or restoring this downstream connection.").optional(), "expires_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }), z.union([z.object({ "provider": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "authorization_url": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]))]).describe("Must also satisfy at least one of these alternatives.")).describe("A seller/platform-side connection or grant required by a product, format, or request. This is not the AdCP caller credential: the AdCP request is still authenticated once, and the seller uses these stored downstream connections to call a platform or service on the buyer's behalf. Use this shape for platforms that require more than one downstream grant, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.")).describe("Downstream platform connections or grants required to use this format declaration. These are in addition to the single AdCP caller credential. Use this when a platform product requires multiple downstream grants, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.").optional(), "reference_mutability": z.enum(["immutable_snapshot", "mutable_requires_reapproval", "mutable_auto_recheck"]).describe("Policy for formats whose `slots` accept a `published_post` reference. `immutable_snapshot`: seller snapshots the referenced post at approval and later source changes do not change the served creative. `mutable_requires_reapproval`: the source post may change and material changes require review before continued serving. `mutable_auto_recheck`: the source post may change and the seller continuously or periodically rechecks authorization/policy without requiring buyer resubmission. Omit when the format has no `published_post` slot.").optional(), "production_window_business_days": z.number().int().gte(0).describe("Typical production turnaround in business days when the format requires seller-side production (e.g., host-recording from a buyer-supplied script). 0 for synchronous (e.g., generative AI); >0 for human-produced (e.g., podcast host-read). Absent when no production is required (buyer uploads complete creative).").optional(), "components": z.array(z.object({ "component_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).describe("Stable coordination-local component identifier. Values MUST be unique within `components[]`."), "placement_ref": z.object({ "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring a publisher-catalog placement is hosted, or the inventory publisher associated with an inline placement. Omitted only for legacy single-publisher product-context references.").optional(), "placement_id": z.string().describe("Placement ID from the publisher's adagents.json placement catalog, or an inline seller-defined placement ID interpreted within the enclosing seller and product context.") }).catchall(z.any()).describe("Public product placement this component supplies. MUST resolve against the containing product's `placements[]`."), "required": z.boolean(), "sequence": z.number().int().gte(1).describe("Declared presentation order for sequential-messaging coordinated buys. Components sharing a sequence value present simultaneously; absent means unordered/simultaneous (default). Sequence declares seller-rendered ordering, not buyer-controlled timing.").optional(), "serving_policy": z.enum(["seller_served_only", "third_party_allowed"]).describe("Per-component serving/tracking policy. Some sellers restrict specific components (e.g., page skins) to first-party serving while allowing third-party tags on sibling components. Defaults to the product-level policy when absent.").optional(), "canvas_constraints": z.array(z.object({ "constraint": z.enum(["safe_area", "reserved_region", "decoration_only_edge", "no_text_or_logos"]), "state_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "breakpoint_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "region": z.object({ "x": z.number().gte(0), "y": z.number().gte(0), "width": z.number().gt(0), "height": z.number().gt(0), "unit": z.enum(["px", "percent"]).optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "unit": z.literal("percent") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "unit": z.literal("percent") }), z.object({ "x": z.any().optional(), "y": z.any().optional(), "width": z.any().optional(), "height": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")) }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "breakpoint_id": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "breakpoint_id": z.any().refine((value) => value !== void 0, "Required"), "state_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Rectangular rule applied to buyer artwork. State and breakpoint selectors are optional so the same shape can constrain a coordinated-placement component or a specific stateful-display canvas.")).describe("Artwork constraints applied to this component, including safe areas and seller-reserved regions.").optional(), "format_option_ref": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
|
|
2877
2877
|
const schemas = [z.object({ "scope": z.literal("publisher").describe("Reference resolves against the named publisher's adagents.json top-level `formats[]` catalog."), "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Publisher domain where the adagents.json declaring this format option is hosted."), "format_option_id": z.string().describe("Stable format option ID from the publisher's adagents.json top-level `formats[]`, matching a publisher-catalog-backed entry in the target product's `format_options[]`.") }).catchall(z.any()).describe("Selects a publisher-catalog-backed product format option by publisher domain and format option ID."), z.object({ "scope": z.literal("product").describe("Reference resolves only against the target product's inline `format_options[]`."), "format_option_id": z.string().describe("Stable format option ID from the target product's inline `format_options[]`."), "publisher_domain": z.never().optional() }).catchall(z.any()).describe('Selects a product-local format option by ID within the enclosing package/product context. This branch deliberately forbids `publisher_domain` (`publisher_domain: false` in the schema) because product-local references are namespaced by the enclosing product only; include `scope: "publisher"` when the selector must cross into a publisher catalog.')];
|
|
2878
2878
|
const { errors, failed } = schemas.reduce(
|
|
2879
2879
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
@@ -2898,7 +2898,7 @@ const CanonicalFormatCoordinatedPlacementsSchema = /* @__PURE__ */ (() => z.obje
|
|
|
2898
2898
|
message: "Invalid input: Should pass single schema. Passed " + passed
|
|
2899
2899
|
});
|
|
2900
2900
|
}
|
|
2901
|
-
})).describe("Reference to a sibling `format_options[]` entry on the same product. It MUST NOT resolve to `custom` or `coordinated_placements`.").optional(), "format_kind": z.string().optional(), "params": z.record(z.string(), z.any()).optional() }).catchall(z.any()).and(z.union([z.object({ "format_option_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "format_kind": z.any().refine((value) => value !== void 0, "Required"), "params": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]))).min(2).superRefine((components, ctx) => {
|
|
2901
|
+
})).describe("Reference to a sibling `format_options[]` entry on the same product. It MUST NOT resolve to `custom` or `coordinated_placements`.").optional(), "format_kind": z.string().optional(), "params": z.record(z.string(), z.any()).optional() }).catchall(z.any()).and(z.union([z.object({ "format_option_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "format_kind": z.any().refine((value) => value !== void 0, "Required"), "params": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives."))).min(2).superRefine((components, ctx) => {
|
|
2902
2902
|
if (!components.some((component) => component.required === true)) {
|
|
2903
2903
|
ctx.addIssue({ code: "custom", path: [], message: "At least one component must be required" });
|
|
2904
2904
|
}
|
|
@@ -3025,7 +3025,7 @@ const SignalIDSchema = /* @__PURE__ */ (() => z.union([z.object({
|
|
|
3025
3025
|
agent_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"),
|
|
3026
3026
|
id: z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$"))
|
|
3027
3027
|
}).passthrough()]))();
|
|
3028
|
-
const SignalListingSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
|
|
3028
|
+
const SignalListingSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
|
|
3029
3029
|
signal_ref: SignalRefSchema.optional(),
|
|
3030
3030
|
signal_id: SignalIDSchema.optional(),
|
|
3031
3031
|
name: z.string().optional(),
|
|
@@ -3040,7 +3040,7 @@ const SignalListingSchema = /* @__PURE__ */ (() => z.object({}).passthrough().me
|
|
|
3040
3040
|
}).passthrough().optional(),
|
|
3041
3041
|
restricted_attributes: z.array(RestrictedAttributeSchema).optional(),
|
|
3042
3042
|
demographic_predicate: DemographicPredicateSchema.optional()
|
|
3043
|
-
}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
|
|
3043
|
+
}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
|
|
3044
3044
|
signal_ref: SignalRefSchema.optional(),
|
|
3045
3045
|
signal_id: SignalIDSchema.optional(),
|
|
3046
3046
|
name: z.string().optional(),
|
|
@@ -3055,7 +3055,7 @@ const SignalListingSchema = /* @__PURE__ */ (() => z.object({}).passthrough().me
|
|
|
3055
3055
|
}).passthrough().optional(),
|
|
3056
3056
|
restricted_attributes: z.array(RestrictedAttributeSchema).optional(),
|
|
3057
3057
|
demographic_predicate: DemographicPredicateSchema.optional()
|
|
3058
|
-
}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
|
|
3058
|
+
}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
|
|
3059
3059
|
signal_ref: SignalRefSchema.optional(),
|
|
3060
3060
|
signal_id: SignalIDSchema.optional(),
|
|
3061
3061
|
name: z.string().optional(),
|
|
@@ -4070,7 +4070,7 @@ const BuildCreativeEstimateSchema = /* @__PURE__ */ (() => z.object({
|
|
|
4070
4070
|
consumption_estimate: CreativeConsumptionSchema.optional()
|
|
4071
4071
|
}).passthrough()).optional()
|
|
4072
4072
|
}).passthrough(),
|
|
4073
|
-
expires_at: z.
|
|
4073
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
4074
4074
|
context: ContextObjectSchema.optional(),
|
|
4075
4075
|
ext: ExtensionObjectSchema.optional()
|
|
4076
4076
|
}).passthrough())();
|
|
@@ -4087,7 +4087,7 @@ const PreviewCreativeSingleResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
4087
4087
|
}).passthrough()),
|
|
4088
4088
|
quality_used: CreativeQualitySchema.optional(),
|
|
4089
4089
|
interactive_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
4090
|
-
expires_at: z.
|
|
4090
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
4091
4091
|
context: ContextObjectSchema.optional(),
|
|
4092
4092
|
ext: ExtensionObjectSchema.optional()
|
|
4093
4093
|
}).passthrough())();
|
|
@@ -4180,7 +4180,7 @@ const A2UIUserActionSchema = /* @__PURE__ */ (() => z.object({
|
|
|
4180
4180
|
name: z.string(),
|
|
4181
4181
|
context: z.object({}).passthrough().optional()
|
|
4182
4182
|
}).passthrough(),
|
|
4183
|
-
timestamp: z.
|
|
4183
|
+
timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
4184
4184
|
}).passthrough())();
|
|
4185
4185
|
const PublisherEntrySchema = /* @__PURE__ */ (() => z.object({
|
|
4186
4186
|
publisher_domain: z.string().regex(/^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/),
|
|
@@ -4191,7 +4191,7 @@ const PublisherEntrySchema = /* @__PURE__ */ (() => z.object({
|
|
|
4191
4191
|
property_ids: z.array(z.string()).optional(),
|
|
4192
4192
|
signing_keys_pinned: z.boolean().optional(),
|
|
4193
4193
|
status: z.union([z.literal("authorized"), z.literal("revoked")]),
|
|
4194
|
-
last_verified_at: z.
|
|
4194
|
+
last_verified_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
4195
4195
|
}).passthrough())();
|
|
4196
4196
|
const AcquireRightsRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
4197
4197
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
@@ -4282,7 +4282,7 @@ const CreativeApprovedSchema = /* @__PURE__ */ (() => z.object({
|
|
|
4282
4282
|
rights_id: z.string(),
|
|
4283
4283
|
creative_id: z.string().optional(),
|
|
4284
4284
|
creative_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
4285
|
-
approved_at: z.
|
|
4285
|
+
approved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
4286
4286
|
conditions: z.array(z.string()).optional(),
|
|
4287
4287
|
context: ContextObjectSchema.optional(),
|
|
4288
4288
|
ext: ExtensionObjectSchema.optional()
|
|
@@ -4461,7 +4461,7 @@ const RevocationNotificationSchema = /* @__PURE__ */ (() => z.object({
|
|
|
4461
4461
|
rights_id: z.string(),
|
|
4462
4462
|
brand_id: z.string(),
|
|
4463
4463
|
reason: z.string(),
|
|
4464
|
-
effective_at: z.
|
|
4464
|
+
effective_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
4465
4465
|
revoked_uses: z.array(RightUseSchema).optional(),
|
|
4466
4466
|
context: ContextObjectSchema.optional(),
|
|
4467
4467
|
ext: ExtensionObjectSchema.optional()
|
|
@@ -4488,7 +4488,7 @@ const SearchBrandResultSchema = /* @__PURE__ */ (() => z.object({
|
|
|
4488
4488
|
name: z.string()
|
|
4489
4489
|
}).passthrough().optional(),
|
|
4490
4490
|
relationship_trust: z.union([z.literal("inline"), z.literal("mutual"), z.literal("leaf_only"), z.literal("house_only"), z.literal("standalone"), z.literal("unverifiable")]).optional(),
|
|
4491
|
-
relationship_verified_at: z.
|
|
4491
|
+
relationship_verified_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
4492
4492
|
claimed_house_domain: z.string().optional(),
|
|
4493
4493
|
names: z.array(z.record(z.string(), z.string())),
|
|
4494
4494
|
description: z.string().optional(),
|
|
@@ -4532,7 +4532,7 @@ const VerifySubsidiaryClaimSchema = /* @__PURE__ */ (() => z.object({
|
|
|
4532
4532
|
claim: z.object({
|
|
4533
4533
|
subsidiary_domain: z.string(),
|
|
4534
4534
|
subsidiary_brand_id: z.string().regex(/^[a-z0-9_]+$/).optional(),
|
|
4535
|
-
observed_at: z.
|
|
4535
|
+
observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
4536
4536
|
}).passthrough()
|
|
4537
4537
|
}).passthrough())();
|
|
4538
4538
|
const VerifyParentClaimSchema = /* @__PURE__ */ (() => z.object({
|
|
@@ -4540,7 +4540,7 @@ const VerifyParentClaimSchema = /* @__PURE__ */ (() => z.object({
|
|
|
4540
4540
|
claim: z.object({
|
|
4541
4541
|
parent_domain: z.string(),
|
|
4542
4542
|
claimant_says: z.string().optional(),
|
|
4543
|
-
observed_at: z.
|
|
4543
|
+
observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
4544
4544
|
}).passthrough()
|
|
4545
4545
|
}).passthrough())();
|
|
4546
4546
|
const VerifyPropertyClaimSchema = /* @__PURE__ */ (() => z.object({
|
|
@@ -4642,8 +4642,8 @@ const CollectionListChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
|
4642
4642
|
collections_removed: z.int().optional(),
|
|
4643
4643
|
total_collections: z.int().optional()
|
|
4644
4644
|
}).passthrough().optional(),
|
|
4645
|
-
resolved_at: z.
|
|
4646
|
-
cache_valid_until: z.
|
|
4645
|
+
resolved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
4646
|
+
cache_valid_until: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
4647
4647
|
signature: z.string(),
|
|
4648
4648
|
ext: ExtensionObjectSchema.optional()
|
|
4649
4649
|
}).passthrough())();
|
|
@@ -4893,11 +4893,11 @@ const AccountChangeRecordedWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
|
4893
4893
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
4894
4894
|
notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
4895
4895
|
notification_type: z.literal("account.change_recorded"),
|
|
4896
|
-
fired_at: z.
|
|
4896
|
+
fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
4897
4897
|
subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
4898
4898
|
account_id: z.string().min(1).max(255),
|
|
4899
4899
|
change_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
4900
|
-
recorded_at: z.
|
|
4900
|
+
recorded_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
4901
4901
|
resource: z.object({
|
|
4902
4902
|
type: z.string().min(1).max(100).regex(/^[a-z][a-z0-9_.-]{0,99}$/),
|
|
4903
4903
|
resource_id: z.string().min(1).max(255),
|
|
@@ -4962,17 +4962,17 @@ const AccountStatusChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
|
4962
4962
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
4963
4963
|
notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
4964
4964
|
notification_type: z.literal("account.status_changed"),
|
|
4965
|
-
fired_at: z.
|
|
4965
|
+
fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
4966
4966
|
subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
4967
4967
|
account_id: z.string(),
|
|
4968
4968
|
previous_status: AccountStatusSchema,
|
|
4969
4969
|
status: AccountStatusSchema,
|
|
4970
|
-
observed_at: z.
|
|
4970
|
+
observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
4971
4971
|
reason_code: z.union([z.literal("seller_approved"), z.literal("seller_rejected"), z.literal("payment_required"), z.literal("credit_limit_reached"), z.literal("funds_depleted"), z.literal("setup_required"), z.literal("policy_review"), z.literal("policy_violation"), z.literal("compliance_hold"), z.literal("buyer_requested"), z.literal("seller_closed"), z.literal("manual_update"), z.literal("other")]),
|
|
4972
4972
|
reason_detail: z.string().max(500).optional(),
|
|
4973
4973
|
setup: z.object({
|
|
4974
4974
|
message: z.string(),
|
|
4975
|
-
expires_at: z.
|
|
4975
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
4976
4976
|
}).passthrough().optional(),
|
|
4977
4977
|
ext: ExtensionObjectSchema.optional()
|
|
4978
4978
|
}).passthrough())();
|
|
@@ -5043,7 +5043,7 @@ const AgentSigningKeySchema = /* @__PURE__ */ (() => z.object({
|
|
|
5043
5043
|
y: z.string().optional(),
|
|
5044
5044
|
n: z.string().optional(),
|
|
5045
5045
|
e: z.string().optional(),
|
|
5046
|
-
revoked_at: z.
|
|
5046
|
+
revoked_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
5047
5047
|
}).passthrough())();
|
|
5048
5048
|
const AgentWebhookChallengeSchema = /* @__PURE__ */ (() => z.object({
|
|
5049
5049
|
type: z.literal("webhook.challenge"),
|
|
@@ -5088,7 +5088,7 @@ const VASTAssetSchema = /* @__PURE__ */ (() => z.object({
|
|
|
5088
5088
|
field: z.literal("content").optional()
|
|
5089
5089
|
}).passthrough().optional()
|
|
5090
5090
|
}).passthrough()).optional()
|
|
5091
|
-
}).passthrough()])))();
|
|
5091
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
5092
5092
|
const AdCPAssetGroupVocabularyRegistrySchema = /* @__PURE__ */ (() => z.object({}).passthrough())();
|
|
5093
5093
|
const AttestationIssuerSchema = /* @__PURE__ */ (() => z.union([AttestationBrandIssuerSchema, AttestationAgentIssuerSchema, AttestationOriginIssuerSchema]))();
|
|
5094
5094
|
const AudienceEvidenceRequirementsSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({
|
|
@@ -5131,7 +5131,7 @@ const AuthorizedAgentBaseFieldsSchema = /* @__PURE__ */ (() => z.object({
|
|
|
5131
5131
|
authorized_for: z.string().min(1).max(500),
|
|
5132
5132
|
signing_keys: z.array(AgentSigningKeySchema).optional(),
|
|
5133
5133
|
encryption_keys: z.array(AgentEncryptionKeySchema).optional(),
|
|
5134
|
-
last_updated: z.
|
|
5134
|
+
last_updated: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
5135
5135
|
}).passthrough())();
|
|
5136
5136
|
const MaxBidWithCostPerSchema = /* @__PURE__ */ (() => z.object({
|
|
5137
5137
|
kind: z.literal("max_bid_with_cost_per"),
|
|
@@ -5155,7 +5155,7 @@ const BrandResponseAuthorizationResultSchema = /* @__PURE__ */ (() => z.object({
|
|
|
5155
5155
|
reason: z.union([z.literal("brand_json_unavailable"), z.literal("agent_not_authorized"), z.literal("agent_authorization_ambiguous"), z.literal("jwks_unavailable"), z.literal("kid_not_authorized"), z.literal("kid_authorization_ambiguous"), z.literal("key_material_mismatch"), z.literal("key_purpose_invalid")]),
|
|
5156
5156
|
kid: z.string().min(1).optional(),
|
|
5157
5157
|
jwks_uri: z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(/^https:\/\//).optional()
|
|
5158
|
-
}).passthrough()])))();
|
|
5158
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
5159
5159
|
const BudgetRangeSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({
|
|
5160
5160
|
min: z.number().gte(0).optional(),
|
|
5161
5161
|
max: z.number().gte(0).optional(),
|
|
@@ -5182,10 +5182,10 @@ const CapabilitiesChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
|
5182
5182
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
5183
5183
|
notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
5184
5184
|
notification_type: z.literal("capabilities.changed"),
|
|
5185
|
-
fired_at: z.
|
|
5185
|
+
fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
5186
5186
|
subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
5187
5187
|
agent_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"),
|
|
5188
|
-
changed_at: z.
|
|
5188
|
+
changed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
5189
5189
|
reason: z.union([z.literal("configuration_changed"), z.literal("deployment_changed"), z.literal("capability_enabled"), z.literal("capability_disabled"), z.literal("protocol_versions_changed"), z.literal("manual_refresh"), z.literal("other")]),
|
|
5190
5190
|
capabilities_version: z.string().min(1).max(255),
|
|
5191
5191
|
changed_paths: z.array(z.string()).optional(),
|
|
@@ -5268,7 +5268,7 @@ const CatchmentSchema = /* @__PURE__ */ (() => z.object({
|
|
|
5268
5268
|
coordinates: z.array(z.unknown())
|
|
5269
5269
|
}).passthrough(),
|
|
5270
5270
|
ext: ExtensionObjectSchema.optional()
|
|
5271
|
-
}).passthrough()])))();
|
|
5271
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
5272
5272
|
const CollectionDistributionSchema = /* @__PURE__ */ (() => z.object({
|
|
5273
5273
|
publisher_domain: z.string(),
|
|
5274
5274
|
property_ids: z.array(PropertyIDSchema).optional(),
|
|
@@ -5627,7 +5627,7 @@ const GeographicPlaceCatalogEntrySchema = /* @__PURE__ */ (() => z.object({
|
|
|
5627
5627
|
parent_labels: z.array(z.string()),
|
|
5628
5628
|
status: z.union([z.literal("active"), z.literal("removal_planned"), z.literal("deprecated")]),
|
|
5629
5629
|
replaced_by_values: z.array(z.string()).optional(),
|
|
5630
|
-
valid_until: z.
|
|
5630
|
+
valid_until: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
5631
5631
|
ext: ExtensionObjectSchema.optional()
|
|
5632
5632
|
}).passthrough())();
|
|
5633
5633
|
const GeographicPlaceCatalogCapabilitySchema = /* @__PURE__ */ (() => z.object({
|
|
@@ -5664,7 +5664,7 @@ const IndicatorsChangedWebhookSchema = /* @__PURE__ */ (() => z.union([z.object(
|
|
|
5664
5664
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
5665
5665
|
notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
5666
5666
|
notification_type: z.literal("indicators.changed"),
|
|
5667
|
-
fired_at: z.
|
|
5667
|
+
fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
5668
5668
|
subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
5669
5669
|
account_id: z.string(),
|
|
5670
5670
|
relationship_kind: z.literal("media_buy"),
|
|
@@ -5673,13 +5673,13 @@ const IndicatorsChangedWebhookSchema = /* @__PURE__ */ (() => z.union([z.object(
|
|
|
5673
5673
|
creative_id: z.string().optional(),
|
|
5674
5674
|
change_kind: z.union([z.literal("asserted"), z.literal("cleared"), z.literal("updated"), z.literal("invalidated"), z.literal("coverage_changed"), z.literal("assignment_removed")]),
|
|
5675
5675
|
changed_indicator_types: z.array(IndicatorTypeSchema),
|
|
5676
|
-
observed_at: z.
|
|
5676
|
+
observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
5677
5677
|
ext: ExtensionObjectSchema.optional()
|
|
5678
5678
|
}).passthrough(), z.object({
|
|
5679
5679
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
5680
5680
|
notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
5681
5681
|
notification_type: z.literal("indicators.changed"),
|
|
5682
|
-
fired_at: z.
|
|
5682
|
+
fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
5683
5683
|
subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
5684
5684
|
account_id: z.string(),
|
|
5685
5685
|
relationship_kind: z.literal("package"),
|
|
@@ -5688,13 +5688,13 @@ const IndicatorsChangedWebhookSchema = /* @__PURE__ */ (() => z.union([z.object(
|
|
|
5688
5688
|
creative_id: z.string().optional(),
|
|
5689
5689
|
change_kind: z.union([z.literal("asserted"), z.literal("cleared"), z.literal("updated"), z.literal("invalidated"), z.literal("coverage_changed"), z.literal("assignment_removed")]),
|
|
5690
5690
|
changed_indicator_types: z.array(IndicatorTypeSchema),
|
|
5691
|
-
observed_at: z.
|
|
5691
|
+
observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
5692
5692
|
ext: ExtensionObjectSchema.optional()
|
|
5693
5693
|
}).passthrough(), z.object({
|
|
5694
5694
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
5695
5695
|
notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
5696
5696
|
notification_type: z.literal("indicators.changed"),
|
|
5697
|
-
fired_at: z.
|
|
5697
|
+
fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
5698
5698
|
subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
5699
5699
|
account_id: z.string(),
|
|
5700
5700
|
relationship_kind: z.literal("creative_assignment"),
|
|
@@ -5703,7 +5703,7 @@ const IndicatorsChangedWebhookSchema = /* @__PURE__ */ (() => z.union([z.object(
|
|
|
5703
5703
|
creative_id: z.string(),
|
|
5704
5704
|
change_kind: z.union([z.literal("asserted"), z.literal("cleared"), z.literal("updated"), z.literal("invalidated"), z.literal("coverage_changed"), z.literal("assignment_removed")]),
|
|
5705
5705
|
changed_indicator_types: z.array(IndicatorTypeSchema),
|
|
5706
|
-
observed_at: z.
|
|
5706
|
+
observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
5707
5707
|
ext: ExtensionObjectSchema.optional()
|
|
5708
5708
|
}).passthrough()]))();
|
|
5709
5709
|
const InstallmentReferenceSchema = /* @__PURE__ */ (() => z.object({
|
|
@@ -5825,7 +5825,7 @@ const PerformanceFeedbackAssertionSchema = /* @__PURE__ */ (() => z.object({
|
|
|
5825
5825
|
}).passthrough().optional()
|
|
5826
5826
|
}).passthrough().optional(),
|
|
5827
5827
|
evidence_ref: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
5828
|
-
as_of: z.
|
|
5828
|
+
as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
5829
5829
|
final: z.boolean().optional(),
|
|
5830
5830
|
supersedes_feedback_id: z.string().min(1).optional()
|
|
5831
5831
|
}).passthrough())();
|
|
@@ -5835,8 +5835,8 @@ const PerformanceFeedbackSchema = /* @__PURE__ */ (() => z.object({
|
|
|
5835
5835
|
package_id: z.string().optional(),
|
|
5836
5836
|
creative_id: z.string().optional(),
|
|
5837
5837
|
measurement_period: z.object({
|
|
5838
|
-
start: z.
|
|
5839
|
-
end: z.
|
|
5838
|
+
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
5839
|
+
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
5840
5840
|
}).passthrough(),
|
|
5841
5841
|
performance_index: z.number().min(0),
|
|
5842
5842
|
metric_type: MetricTypeSchema.optional(),
|
|
@@ -5865,8 +5865,8 @@ const PerformanceFeedbackSchema = /* @__PURE__ */ (() => z.object({
|
|
|
5865
5865
|
feedback_source: FeedbackSourceSchema,
|
|
5866
5866
|
vendor: BrandReferenceSchema.optional(),
|
|
5867
5867
|
status: z.union([z.literal("accepted"), z.literal("queued"), z.literal("applied"), z.literal("rejected")]),
|
|
5868
|
-
submitted_at: z.
|
|
5869
|
-
applied_at: z.
|
|
5868
|
+
submitted_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
5869
|
+
applied_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
5870
5870
|
}).passthrough())();
|
|
5871
5871
|
const PlacementPresentationReferenceSchema = /* @__PURE__ */ (() => z.object({
|
|
5872
5872
|
uri: z.string().regex(new RegExp("^https://")).refine(adcpJsonSchemaUri, "Invalid URI"),
|
|
@@ -5945,10 +5945,10 @@ const PrincipalChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
|
5945
5945
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
5946
5946
|
notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
5947
5947
|
notification_type: z.literal("principal.changed"),
|
|
5948
|
-
fired_at: z.
|
|
5948
|
+
fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
5949
5949
|
subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
5950
5950
|
agent_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"),
|
|
5951
|
-
changed_at: z.
|
|
5951
|
+
changed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
5952
5952
|
reason: z.union([z.literal("destination_state_changed"), z.literal("setup_expiring"), z.literal("setup_expired"), z.literal("proof_invalidated"), z.literal("declarations_intersection_changed"), z.literal("other")]),
|
|
5953
5953
|
destination_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/).optional(),
|
|
5954
5954
|
ext: ExtensionObjectSchema.optional()
|
|
@@ -6093,7 +6093,7 @@ const AgentProfilePayloadSchema = /* @__PURE__ */ (() => z.object({
|
|
|
6093
6093
|
property_count: z.int().min(0).optional(),
|
|
6094
6094
|
publisher_count: z.int().min(0).optional(),
|
|
6095
6095
|
has_tmp: z.boolean().optional(),
|
|
6096
|
-
updated_at: z.
|
|
6096
|
+
updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
6097
6097
|
}).passthrough())();
|
|
6098
6098
|
const CompliancePayloadSchema = /* @__PURE__ */ (() => z.object({
|
|
6099
6099
|
agent_url: z.string(),
|
|
@@ -6324,7 +6324,7 @@ const ReportingDeliveryReadyWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
|
6324
6324
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
6325
6325
|
notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
6326
6326
|
notification_type: z.literal("reporting.delivery_ready"),
|
|
6327
|
-
fired_at: z.
|
|
6327
|
+
fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
6328
6328
|
subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
6329
6329
|
account_id: z.string().min(1),
|
|
6330
6330
|
delivery_config_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
@@ -6333,7 +6333,7 @@ const ReportingDeliveryReadyWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
|
6333
6333
|
reporting_materialization_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
6334
6334
|
readiness: z.union([z.literal("available"), z.literal("delivered")]),
|
|
6335
6335
|
finality: ReportingFinalitySchema,
|
|
6336
|
-
data_through: z.
|
|
6336
|
+
data_through: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").nullable(),
|
|
6337
6337
|
feed_purpose: ReportingFeedPurposeSchema
|
|
6338
6338
|
}).passthrough())();
|
|
6339
6339
|
const ReportingFileCompressionSchema = /* @__PURE__ */ (() => z.union([z.literal("none"), z.literal("gzip"), z.literal("zstd"), z.literal("snappy")]))();
|
|
@@ -6354,8 +6354,8 @@ const ReportingFileManifestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
6354
6354
|
reporting_obligation_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
6355
6355
|
reporting_materialization_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
6356
6356
|
period: z.object({
|
|
6357
|
-
start: z.
|
|
6358
|
-
end: z.
|
|
6357
|
+
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
6358
|
+
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
6359
6359
|
source_timezone: z.string().min(1)
|
|
6360
6360
|
}).strict(),
|
|
6361
6361
|
format: z.union([z.literal("jsonl"), z.literal("csv"), z.literal("parquet"), z.literal("avro"), z.literal("orc")]),
|
|
@@ -6364,13 +6364,13 @@ const ReportingFileManifestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
6364
6364
|
total_size_bytes: z.int().min(0),
|
|
6365
6365
|
row_count: z.int().min(0),
|
|
6366
6366
|
control_totals: z.array(ReportingControlTotalSchema),
|
|
6367
|
-
created_at: z.
|
|
6367
|
+
created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
6368
6368
|
}).strict())();
|
|
6369
6369
|
const ReportingLedgerChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
6370
6370
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
6371
6371
|
notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
6372
6372
|
notification_type: z.literal("reporting.ledger_changed"),
|
|
6373
|
-
fired_at: z.
|
|
6373
|
+
fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
6374
6374
|
subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
6375
6375
|
account_id: z.string().min(1),
|
|
6376
6376
|
change_kind: z.union([z.literal("revision_published"), z.literal("adjustment_published")]),
|
|
@@ -6588,7 +6588,7 @@ const ReportingStatusChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
|
6588
6588
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
6589
6589
|
notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
6590
6590
|
notification_type: z.literal("reporting.status_changed"),
|
|
6591
|
-
fired_at: z.
|
|
6591
|
+
fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
6592
6592
|
subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
6593
6593
|
account_id: z.string().min(1),
|
|
6594
6594
|
delivery_config_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
@@ -6670,7 +6670,7 @@ const AttestationReferenceSchema = /* @__PURE__ */ (() => z.object({
|
|
|
6670
6670
|
agent_url: z.string().regex(new RegExp("^https://[^/?#@]+(?:/[^?#]*)?(?:\\?[^#]*)?$")).refine(adcpJsonSchemaUri, "Invalid URI")
|
|
6671
6671
|
}).passthrough().optional(),
|
|
6672
6672
|
ext: ExtensionObjectSchema.optional()
|
|
6673
|
-
}).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
|
|
6673
|
+
}).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
|
|
6674
6674
|
issuer: AttestationIssuerSchema,
|
|
6675
6675
|
claim_type: z.string().refine(adcpJsonSchemaUri, "Invalid URI"),
|
|
6676
6676
|
subject: AttestationSubjectSchema,
|
|
@@ -6768,7 +6768,7 @@ const SignalDefinitionSchema = /* @__PURE__ */ (() => z.object({
|
|
|
6768
6768
|
response_sla_days: z.int().min(1).max(90).optional(),
|
|
6769
6769
|
ccpa_opt_out_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(/^https:\/\//).optional()
|
|
6770
6770
|
}).passthrough().optional(),
|
|
6771
|
-
last_updated: z.
|
|
6771
|
+
last_updated: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
6772
6772
|
dts_compliant_version: z.string().optional()
|
|
6773
6773
|
}).passthrough())();
|
|
6774
6774
|
const SignalFiltersSchema = /* @__PURE__ */ (() => z.object({
|
|
@@ -6827,9 +6827,9 @@ const TasksGetResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
6827
6827
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
6828
6828
|
task_type: TaskTypeSchema,
|
|
6829
6829
|
protocol: AdCPProtocolSchema,
|
|
6830
|
-
created_at: z.
|
|
6831
|
-
updated_at: z.
|
|
6832
|
-
completed_at: z.
|
|
6830
|
+
created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
6831
|
+
updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
6832
|
+
completed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
6833
6833
|
has_webhook: z.boolean().optional(),
|
|
6834
6834
|
progress: z.object({
|
|
6835
6835
|
percentage: z.number().min(0).max(100).optional(),
|
|
@@ -6847,7 +6847,7 @@ const TasksGetResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
6847
6847
|
}).passthrough().optional()
|
|
6848
6848
|
}).passthrough().optional(),
|
|
6849
6849
|
history: z.array(z.object({
|
|
6850
|
-
timestamp: z.
|
|
6850
|
+
timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
6851
6851
|
type: z.union([z.literal("request"), z.literal("response")]),
|
|
6852
6852
|
data: z.object({}).passthrough()
|
|
6853
6853
|
}).passthrough()).optional(),
|
|
@@ -6865,10 +6865,10 @@ const TasksListRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
6865
6865
|
statuses: z.array(TaskStatusSchema).optional(),
|
|
6866
6866
|
task_type: TaskTypeSchema.optional(),
|
|
6867
6867
|
task_types: z.array(TaskTypeSchema).optional(),
|
|
6868
|
-
created_after: z.
|
|
6869
|
-
created_before: z.
|
|
6870
|
-
updated_after: z.
|
|
6871
|
-
updated_before: z.
|
|
6868
|
+
created_after: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
6869
|
+
created_before: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
6870
|
+
updated_after: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
6871
|
+
updated_before: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
6872
6872
|
task_ids: z.array(z.string()).max(100).optional(),
|
|
6873
6873
|
context_contains: z.string().optional(),
|
|
6874
6874
|
has_webhook: z.boolean().optional()
|
|
@@ -6916,9 +6916,9 @@ const TasksListResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
6916
6916
|
task_type: TaskTypeSchema,
|
|
6917
6917
|
domain: z.union([z.literal("media-buy"), z.literal("signals"), z.literal("creative")]),
|
|
6918
6918
|
status: TaskStatusSchema,
|
|
6919
|
-
created_at: z.
|
|
6920
|
-
updated_at: z.
|
|
6921
|
-
completed_at: z.
|
|
6919
|
+
created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
6920
|
+
updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
6921
|
+
completed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
6922
6922
|
has_webhook: z.boolean().optional()
|
|
6923
6923
|
}).passthrough()),
|
|
6924
6924
|
pagination: PaginationResponseSchema,
|
|
@@ -6970,7 +6970,7 @@ const AgenticAdvertisingOrgVerificationTokenClaimsSchema = /* @__PURE__ */ (() =
|
|
|
6970
6970
|
verified_specialisms: z.array(z.string()),
|
|
6971
6971
|
verification_modes: z.array(VerificationTokenModeSchema),
|
|
6972
6972
|
grading_profile: z.union([z.literal("legacy"), z.literal("spec")]).optional(),
|
|
6973
|
-
first_failing_spec_at: z.
|
|
6973
|
+
first_failing_spec_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
6974
6974
|
adcp_version: z.string().regex(/^[1-9][0-9]*\.[0-9]+$/).optional(),
|
|
6975
6975
|
protocol_version: z.string().optional()
|
|
6976
6976
|
}).passthrough())();
|
|
@@ -7002,26 +7002,26 @@ const CreativeAssignmentChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
|
7002
7002
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
7003
7003
|
notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
7004
7004
|
notification_type: z.literal("creative.assignment_changed"),
|
|
7005
|
-
fired_at: z.
|
|
7005
|
+
fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
7006
7006
|
subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
7007
7007
|
account_id: z.string(),
|
|
7008
7008
|
media_buy_id: z.string(),
|
|
7009
7009
|
package_id: z.string(),
|
|
7010
7010
|
creative_id: z.string(),
|
|
7011
7011
|
change_kind: z.union([z.literal("assigned"), z.literal("unassigned"), z.literal("approval_changed")]),
|
|
7012
|
-
observed_at: z.
|
|
7012
|
+
observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
7013
7013
|
ext: ExtensionObjectSchema.optional()
|
|
7014
7014
|
}).passthrough())();
|
|
7015
7015
|
const CreativePurgedWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
7016
7016
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
7017
7017
|
notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
7018
7018
|
notification_type: z.literal("creative.purged"),
|
|
7019
|
-
fired_at: z.
|
|
7019
|
+
fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
7020
7020
|
subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
7021
7021
|
account_id: z.string(),
|
|
7022
7022
|
creative_id: z.string(),
|
|
7023
7023
|
purge_kind: z.union([z.literal("soft"), z.literal("hard")]),
|
|
7024
|
-
purged_at: z.
|
|
7024
|
+
purged_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
7025
7025
|
reason_code: CreativeEventReasonCodeSchema,
|
|
7026
7026
|
reason_detail: z.string().max(500).optional(),
|
|
7027
7027
|
initiator: z.union([z.literal("seller"), z.literal("system")]),
|
|
@@ -7031,7 +7031,7 @@ const CreativeStatusChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
|
7031
7031
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
7032
7032
|
notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
7033
7033
|
notification_type: z.literal("creative.status_changed"),
|
|
7034
|
-
fired_at: z.
|
|
7034
|
+
fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
7035
7035
|
subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
7036
7036
|
account_id: z.string(),
|
|
7037
7037
|
creative_id: z.string(),
|
|
@@ -7039,7 +7039,7 @@ const CreativeStatusChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
|
7039
7039
|
transition: z.object({
|
|
7040
7040
|
from: z.union([z.literal("processing"), z.literal("pending_review"), z.literal("approved"), z.literal("suspended")]),
|
|
7041
7041
|
to: CreativeStatusSchema,
|
|
7042
|
-
observed_at: z.
|
|
7042
|
+
observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
7043
7043
|
}).passthrough(),
|
|
7044
7044
|
reason_code: CreativeEventReasonCodeSchema,
|
|
7045
7045
|
reason_detail: z.string().max(500).optional(),
|
|
@@ -7291,7 +7291,7 @@ const ToolNameSchema = /* @__PURE__ */ (() => z.string().regex(/^[a-z][a-z0-9_]*
|
|
|
7291
7291
|
const AdCPManifestSchema = /* @__PURE__ */ (() => z.object({
|
|
7292
7292
|
$schema: z.string().optional(),
|
|
7293
7293
|
adcp_version: z.string().regex(/^\d+\.\d+\.\d+(-[A-Za-z0-9.-]+)?$/),
|
|
7294
|
-
generated_at: z.
|
|
7294
|
+
generated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
7295
7295
|
tools: z.record(z.string(), z.object({
|
|
7296
7296
|
protocol: z.union([z.literal("media-buy"), z.literal("signals"), z.literal("governance"), z.literal("account"), z.literal("creative"), z.literal("brand"), z.literal("content-standards"), z.literal("property"), z.literal("collection"), z.literal("sponsored-intelligence"), z.literal("protocol"), z.literal("compliance"), z.literal("trusted-match"), z.literal("a2ui")]),
|
|
7297
7297
|
mutating: z.boolean(),
|
|
@@ -7479,8 +7479,8 @@ const PropertyListChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
|
7479
7479
|
properties_removed: z.int().optional(),
|
|
7480
7480
|
total_properties: z.int().optional()
|
|
7481
7481
|
}).passthrough().optional(),
|
|
7482
|
-
resolved_at: z.
|
|
7483
|
-
cache_valid_until: z.
|
|
7482
|
+
resolved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
7483
|
+
cache_valid_until: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
7484
7484
|
signature: z.string(),
|
|
7485
7485
|
ext: ExtensionObjectSchema.optional()
|
|
7486
7486
|
}).passthrough())();
|
|
@@ -7682,7 +7682,7 @@ const IdentityMatchRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
7682
7682
|
verification_level: z.union([z.literal("orb"), z.literal("device"), z.literal("document")]).optional(),
|
|
7683
7683
|
signal_binding: z.string().optional(),
|
|
7684
7684
|
proof: z.object({}).passthrough(),
|
|
7685
|
-
expires_at: z.
|
|
7685
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
7686
7686
|
}).strict().optional()
|
|
7687
7687
|
}).strict()).max(3),
|
|
7688
7688
|
consent: z.object({
|
|
@@ -8091,25 +8091,25 @@ const FrequencyCapIntervalConstraintsSchema = /* @__PURE__ */ (() => z.object({
|
|
|
8091
8091
|
maximum_interval: z.number().optional(),
|
|
8092
8092
|
allowed_intervals: z.array(z.number()).optional(),
|
|
8093
8093
|
ext: ExtensionObjectSchema.optional()
|
|
8094
|
-
}).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
|
|
8094
|
+
}).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
|
|
8095
8095
|
unit: FrequencyCapDurationUnitSchema,
|
|
8096
8096
|
minimum_interval: z.number().optional(),
|
|
8097
8097
|
maximum_interval: z.number().optional(),
|
|
8098
8098
|
allowed_intervals: z.array(z.number()).optional(),
|
|
8099
8099
|
ext: ExtensionObjectSchema.optional()
|
|
8100
|
-
}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
|
|
8100
|
+
}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
|
|
8101
8101
|
unit: FrequencyCapDurationUnitSchema,
|
|
8102
8102
|
minimum_interval: z.number().optional(),
|
|
8103
8103
|
maximum_interval: z.number().optional(),
|
|
8104
8104
|
allowed_intervals: z.array(z.number()).optional(),
|
|
8105
8105
|
ext: ExtensionObjectSchema.optional()
|
|
8106
|
-
}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
|
|
8106
|
+
}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
|
|
8107
8107
|
unit: FrequencyCapDurationUnitSchema,
|
|
8108
8108
|
minimum_interval: z.number().optional(),
|
|
8109
8109
|
maximum_interval: z.number().optional(),
|
|
8110
8110
|
allowed_intervals: z.array(z.number()).optional(),
|
|
8111
8111
|
ext: ExtensionObjectSchema.optional()
|
|
8112
|
-
}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])))();
|
|
8112
|
+
}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
8113
8113
|
const FrequencyCapConstraintsSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({
|
|
8114
8114
|
mutable_fields: z.array(FrequencyCapMutableFieldSchema).optional(),
|
|
8115
8115
|
supported_control_modes: z.array(FrequencyCapControlModeSchema).optional(),
|
|
@@ -8314,7 +8314,7 @@ const AcceptProposalRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
8314
8314
|
budget_cap_timezone: z.string().min(1).optional(),
|
|
8315
8315
|
io_acceptance: z.object({
|
|
8316
8316
|
io_id: z.string().min(1),
|
|
8317
|
-
accepted_at: z.
|
|
8317
|
+
accepted_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
8318
8318
|
signatory: z.string().min(1).max(250),
|
|
8319
8319
|
signature_id: z.string().min(1).optional()
|
|
8320
8320
|
}).passthrough().optional(),
|
|
@@ -8333,7 +8333,7 @@ const ControlAppliedSchema = /* @__PURE__ */ (() => z.object({
|
|
|
8333
8333
|
media_buy_id: z.string().min(1),
|
|
8334
8334
|
revision: z.int().min(1),
|
|
8335
8335
|
media_buy_status: MediaBuyStatusSchema.optional(),
|
|
8336
|
-
implementation_date: z.
|
|
8336
|
+
implementation_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
|
|
8337
8337
|
affected_package_ids: z.array(z.string()).optional(),
|
|
8338
8338
|
available_actions: z.array(CanonicalMediaBuyActionSchema).optional(),
|
|
8339
8339
|
warnings: z.array(WarningSchema.and(z.object({
|
|
@@ -8531,7 +8531,7 @@ const GetMediaBuysRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
8531
8531
|
}).passthrough())();
|
|
8532
8532
|
const ScopedCreativeApprovalSchema = /* @__PURE__ */ (() => z.object({
|
|
8533
8533
|
scope: IndicatorScopeSchema,
|
|
8534
|
-
approval_status: CreativeApprovalStatusSchema.and(z.union([z.literal("pending_review"), z.literal("approved"), z.literal("rejected")])),
|
|
8534
|
+
approval_status: CreativeApprovalStatusSchema.and(z.union([z.literal("pending_review"), z.literal("approved"), z.literal("rejected")]).describe("Must also satisfy at least one of these alternatives.")),
|
|
8535
8535
|
rejection_reason: z.string().optional()
|
|
8536
8536
|
}).passthrough())();
|
|
8537
8537
|
const GetMediaBuyDeliveryRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
@@ -8684,8 +8684,8 @@ const GetReportingStatusRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
8684
8684
|
delivery_config_ids: z.array(z.string()).max(16).optional(),
|
|
8685
8685
|
feed_purposes: z.array(ReportingFeedPurposeSchema).optional(),
|
|
8686
8686
|
period: z.object({
|
|
8687
|
-
start: z.
|
|
8688
|
-
end: z.
|
|
8687
|
+
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
8688
|
+
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
8689
8689
|
}).passthrough().optional(),
|
|
8690
8690
|
health: z.array(ReportingHealthSchema).optional(),
|
|
8691
8691
|
finality: z.array(ReportingFinalitySchema).optional(),
|
|
@@ -8804,7 +8804,7 @@ const UnavailableLookupSchema = /* @__PURE__ */ (() => z.object({
|
|
|
8804
8804
|
context_id: z.string().optional(),
|
|
8805
8805
|
context: ContextObjectSchema.optional(),
|
|
8806
8806
|
message: z.literal("Reporting status resource is unavailable.").optional(),
|
|
8807
|
-
timestamp: z.
|
|
8807
|
+
timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
8808
8808
|
replayed: z.boolean().optional(),
|
|
8809
8809
|
adcp_error: z.object({
|
|
8810
8810
|
code: z.literal("NOT_FOUND"),
|
|
@@ -8824,7 +8824,7 @@ const OperationalFailureSchema = /* @__PURE__ */ (() => z.object({
|
|
|
8824
8824
|
context_id: z.string().optional(),
|
|
8825
8825
|
context: ContextObjectSchema.optional(),
|
|
8826
8826
|
message: z.string().optional(),
|
|
8827
|
-
timestamp: z.
|
|
8827
|
+
timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
8828
8828
|
replayed: z.boolean().optional(),
|
|
8829
8829
|
adcp_error: ErrorSchema.optional(),
|
|
8830
8830
|
errors: z.array(ErrorSchema)
|
|
@@ -8943,8 +8943,8 @@ const ProvidePerformanceFeedbackSuccessSchema = /* @__PURE__ */ (() => z.object(
|
|
|
8943
8943
|
feedback_id: z.string().min(1).optional(),
|
|
8944
8944
|
application_status: z.union([z.literal("accepted"), z.literal("applied"), z.literal("not_applied")]).optional(),
|
|
8945
8945
|
status_reason: z.string().max(500).optional(),
|
|
8946
|
-
received_at: z.
|
|
8947
|
-
applied_at: z.
|
|
8946
|
+
received_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
8947
|
+
applied_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
8948
8948
|
sandbox: z.boolean().optional(),
|
|
8949
8949
|
context: ContextObjectSchema.optional(),
|
|
8950
8950
|
ext: ExtensionObjectSchema.optional()
|
|
@@ -9079,7 +9079,7 @@ const SyncAudiencesSuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
|
9079
9079
|
matched: z.int().min(0),
|
|
9080
9080
|
match_rate: z.number().min(0).max(1)
|
|
9081
9081
|
}).passthrough()).optional(),
|
|
9082
|
-
last_synced_at: z.
|
|
9082
|
+
last_synced_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
9083
9083
|
source: z.object({
|
|
9084
9084
|
kind: z.union([z.literal("dataset"), z.literal("platform_segment")]),
|
|
9085
9085
|
vendor: BrandReferenceSchema,
|
|
@@ -9141,8 +9141,8 @@ const SyncCatalogsSuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
|
9141
9141
|
status: CatalogItemStatusSchema,
|
|
9142
9142
|
reasons: z.array(z.string()).optional()
|
|
9143
9143
|
}).passthrough()).optional(),
|
|
9144
|
-
last_synced_at: z.
|
|
9145
|
-
next_fetch_at: z.
|
|
9144
|
+
last_synced_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
9145
|
+
next_fetch_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
9146
9146
|
changes: z.array(z.string()).optional(),
|
|
9147
9147
|
errors: z.array(ErrorSchema).optional(),
|
|
9148
9148
|
warnings: z.array(z.string()).optional()
|
|
@@ -9182,7 +9182,7 @@ const EvaluatorSpecSchema = /* @__PURE__ */ (() => z.object({
|
|
|
9182
9182
|
evaluator_id: z.string()
|
|
9183
9183
|
}).passthrough(), z.object({
|
|
9184
9184
|
agent_url: z.string().regex(new RegExp("^https://")).refine(adcpJsonSchemaUri, "Invalid URI")
|
|
9185
|
-
}).passthrough()])))();
|
|
9185
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
9186
9186
|
const RightsConstraintSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({
|
|
9187
9187
|
rights_id: z.string(),
|
|
9188
9188
|
rights_agent: z.object({
|
|
@@ -9712,8 +9712,8 @@ const GetPropertyListResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
9712
9712
|
list: PropertyListSchema,
|
|
9713
9713
|
identifiers: z.array(IdentifierSchema).optional(),
|
|
9714
9714
|
pagination: PaginationResponseSchema.optional(),
|
|
9715
|
-
resolved_at: z.
|
|
9716
|
-
cache_valid_until: z.
|
|
9715
|
+
resolved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
9716
|
+
cache_valid_until: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
9717
9717
|
coverage_gaps: z.record(z.string(), z.array(IdentifierSchema)).optional(),
|
|
9718
9718
|
ext: ExtensionObjectSchema.optional()
|
|
9719
9719
|
}).passthrough())();
|
|
@@ -9873,8 +9873,8 @@ const GetCollectionListResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
9873
9873
|
kind: CollectionKindSchema.optional()
|
|
9874
9874
|
}).passthrough()).optional(),
|
|
9875
9875
|
pagination: PaginationResponseSchema.optional(),
|
|
9876
|
-
resolved_at: z.
|
|
9877
|
-
cache_valid_until: z.
|
|
9876
|
+
resolved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
9877
|
+
cache_valid_until: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
9878
9878
|
coverage_gaps: z.record(z.string(), z.array(z.object({
|
|
9879
9879
|
type: DistributionIdentifierTypeSchema,
|
|
9880
9880
|
value: z.string()
|
|
@@ -10116,7 +10116,7 @@ const CreateContentStandardsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10116
10116
|
conflicting_standards_id: z.string().optional(),
|
|
10117
10117
|
context: ContextObjectSchema.optional(),
|
|
10118
10118
|
ext: ExtensionObjectSchema.optional()
|
|
10119
|
-
}).passthrough()])))();
|
|
10119
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
10120
10120
|
const UpdateContentStandardsRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
10121
10121
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
10122
10122
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
@@ -10198,7 +10198,7 @@ const CalibrateContentResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10198
10198
|
errors: z.array(ErrorSchema),
|
|
10199
10199
|
context: ContextObjectSchema.optional(),
|
|
10200
10200
|
ext: ExtensionObjectSchema.optional()
|
|
10201
|
-
}).passthrough()])))();
|
|
10201
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
10202
10202
|
const ValidateContentDeliveryRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
10203
10203
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
10204
10204
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
@@ -10206,7 +10206,7 @@ const ValidateContentDeliveryRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10206
10206
|
records: z.array(z.object({
|
|
10207
10207
|
record_id: z.string(),
|
|
10208
10208
|
media_buy_id: z.string().optional(),
|
|
10209
|
-
timestamp: z.
|
|
10209
|
+
timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
10210
10210
|
artifact: ArtifactSchema,
|
|
10211
10211
|
country: z.string().optional(),
|
|
10212
10212
|
channel: z.string().optional(),
|
|
@@ -10257,7 +10257,7 @@ const ValidateContentDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10257
10257
|
errors: z.array(ErrorSchema),
|
|
10258
10258
|
context: ContextObjectSchema.optional(),
|
|
10259
10259
|
ext: ExtensionObjectSchema.optional()
|
|
10260
|
-
}).passthrough()])))();
|
|
10260
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
10261
10261
|
const GetMediaBuyArtifactsRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
10262
10262
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
10263
10263
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
@@ -10266,8 +10266,8 @@ const GetMediaBuyArtifactsRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10266
10266
|
package_ids: z.array(z.string()).optional(),
|
|
10267
10267
|
failures_only: z.boolean().optional(),
|
|
10268
10268
|
time_range: z.object({
|
|
10269
|
-
start: z.
|
|
10270
|
-
end: z.
|
|
10269
|
+
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
10270
|
+
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
10271
10271
|
}).passthrough().optional(),
|
|
10272
10272
|
pagination: z.object({
|
|
10273
10273
|
max_results: z.int().min(1).max(1e4).optional(),
|
|
@@ -10294,7 +10294,7 @@ const GetMediaBuyArtifactsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10294
10294
|
media_buy_id: z.string(),
|
|
10295
10295
|
artifacts: z.array(z.object({
|
|
10296
10296
|
record_id: z.string(),
|
|
10297
|
-
timestamp: z.
|
|
10297
|
+
timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
10298
10298
|
package_id: z.string().optional(),
|
|
10299
10299
|
artifact: ArtifactSchema,
|
|
10300
10300
|
country: z.string().optional(),
|
|
@@ -10318,7 +10318,7 @@ const GetMediaBuyArtifactsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10318
10318
|
errors: z.array(ErrorSchema),
|
|
10319
10319
|
context: ContextObjectSchema.optional(),
|
|
10320
10320
|
ext: ExtensionObjectSchema.optional()
|
|
10321
|
-
}).passthrough()])))();
|
|
10321
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
10322
10322
|
const GetCreativeFeaturesSuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
10323
10323
|
evaluation_id: z.string().min(1).optional(),
|
|
10324
10324
|
results: z.array(CreativeFeatureResultSchema),
|
|
@@ -10369,8 +10369,8 @@ const SyncPlansRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10369
10369
|
}).passthrough()).optional()
|
|
10370
10370
|
}).passthrough().optional(),
|
|
10371
10371
|
flight: z.object({
|
|
10372
|
-
start: z.
|
|
10373
|
-
end: z.
|
|
10372
|
+
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
10373
|
+
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
10374
10374
|
}).passthrough(),
|
|
10375
10375
|
countries: z.array(z.string()).optional(),
|
|
10376
10376
|
regions: z.array(z.string()).optional(),
|
|
@@ -10391,7 +10391,7 @@ const SyncPlansRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10391
10391
|
currency: z.string()
|
|
10392
10392
|
}).passthrough().optional(),
|
|
10393
10393
|
markets: z.array(z.string()).optional(),
|
|
10394
|
-
expires_at: z.
|
|
10394
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
10395
10395
|
}).passthrough()).optional(),
|
|
10396
10396
|
portfolio: z.object({
|
|
10397
10397
|
member_plan_ids: z.array(z.string()),
|
|
@@ -10486,12 +10486,12 @@ const ReportPlanAdjustmentRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10486
10486
|
currency: z.string().regex(/^[A-Z]{3}$/)
|
|
10487
10487
|
}).passthrough().optional(),
|
|
10488
10488
|
reason: z.string().min(1).max(1e3).optional(),
|
|
10489
|
-
effective_at: z.
|
|
10489
|
+
effective_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
10490
10490
|
evidence: z.object({
|
|
10491
10491
|
evidence_id: z.string().min(1).max(255),
|
|
10492
10492
|
evidence_type: z.union([z.literal("decommitment_agreement"), z.literal("refund_settlement"), z.literal("credit_note"), z.literal("makegood_agreement")]),
|
|
10493
10493
|
digest: z.string().regex(/^sha256:[a-f0-9]{64}$/),
|
|
10494
|
-
issued_at: z.
|
|
10494
|
+
issued_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
10495
10495
|
}).passthrough().optional(),
|
|
10496
10496
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
10497
10497
|
context: ContextObjectSchema.optional(),
|
|
@@ -10586,7 +10586,7 @@ const GetPlanAuditLogsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10586
10586
|
check_id: z.string(),
|
|
10587
10587
|
reason: z.string(),
|
|
10588
10588
|
resolution: z.string().optional(),
|
|
10589
|
-
resolved_at: z.
|
|
10589
|
+
resolved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
10590
10590
|
}).passthrough()).optional(),
|
|
10591
10591
|
drift_metrics: z.object({
|
|
10592
10592
|
escalation_rate: z.number().min(0).max(1).optional(),
|
|
@@ -10605,7 +10605,7 @@ const GetPlanAuditLogsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10605
10605
|
entries: z.array(z.object({
|
|
10606
10606
|
id: z.string(),
|
|
10607
10607
|
type: z.union([z.literal("check"), z.literal("outcome"), z.literal("adjustment")]),
|
|
10608
|
-
timestamp: z.
|
|
10608
|
+
timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
10609
10609
|
plan_id: z.string().optional(),
|
|
10610
10610
|
caller: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
10611
10611
|
tool: z.string().optional(),
|
|
@@ -10630,13 +10630,13 @@ const GetPlanAuditLogsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10630
10630
|
statement_id: z.string(),
|
|
10631
10631
|
statement_digest: z.string().regex(/^sha256:[a-f0-9]{64}$/),
|
|
10632
10632
|
sequence: z.int().min(1),
|
|
10633
|
-
issued_at: z.
|
|
10633
|
+
issued_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
10634
10634
|
seller_reference: z.string(),
|
|
10635
10635
|
cumulative_spend: z.number().min(0),
|
|
10636
10636
|
currency: z.string().regex(/^[A-Z]{3}$/),
|
|
10637
10637
|
reporting_period: z.object({
|
|
10638
|
-
start: z.
|
|
10639
|
-
end: z.
|
|
10638
|
+
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
10639
|
+
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
10640
10640
|
}).passthrough(),
|
|
10641
10641
|
canonical_payload: z.object({
|
|
10642
10642
|
seller_reference: z.string(),
|
|
@@ -10654,19 +10654,19 @@ const GetPlanAuditLogsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10654
10654
|
}).passthrough().optional(),
|
|
10655
10655
|
headroom_restored: z.number().min(0).optional(),
|
|
10656
10656
|
reason: z.string().optional(),
|
|
10657
|
-
effective_at: z.
|
|
10657
|
+
effective_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
10658
10658
|
committed_budget: z.number().optional(),
|
|
10659
10659
|
reported_committed_budget: z.number().min(0).optional(),
|
|
10660
10660
|
seller_reference: z.string().optional(),
|
|
10661
10661
|
delivery: z.object({
|
|
10662
10662
|
observation_id: z.string().min(1).max(255).optional(),
|
|
10663
10663
|
source: z.union([z.literal("seller_statement_copy"), z.literal("buyer_measurement")]).optional(),
|
|
10664
|
-
observed_at: z.
|
|
10664
|
+
observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
10665
10665
|
seller_statement_id: z.string().optional(),
|
|
10666
10666
|
seller_statement_digest: z.string().regex(/^sha256:[a-f0-9]{64}$/).optional(),
|
|
10667
10667
|
reporting_period: z.object({
|
|
10668
|
-
start: z.
|
|
10669
|
-
end: z.
|
|
10668
|
+
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
10669
|
+
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
10670
10670
|
}).passthrough().optional(),
|
|
10671
10671
|
cumulative_spend: z.number().min(0).optional(),
|
|
10672
10672
|
currency: z.string().regex(/^[A-Z]{3}$/).optional(),
|
|
@@ -10690,10 +10690,10 @@ const GetPlanAuditLogsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10690
10690
|
evidence_id: z.string(),
|
|
10691
10691
|
evidence_type: z.union([z.literal("decommitment_agreement"), z.literal("refund_settlement"), z.literal("credit_note"), z.literal("makegood_agreement")]),
|
|
10692
10692
|
digest: z.string().regex(/^sha256:[a-f0-9]{64}$/),
|
|
10693
|
-
issued_at: z.
|
|
10693
|
+
issued_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
10694
10694
|
}).passthrough().optional(),
|
|
10695
10695
|
reviewed_by: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
10696
|
-
reviewed_at: z.
|
|
10696
|
+
reviewed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
10697
10697
|
review_reason: z.string().optional()
|
|
10698
10698
|
}).passthrough()).optional(),
|
|
10699
10699
|
governed_actions: z.array(z.object({
|
|
@@ -10709,8 +10709,8 @@ const GetPlanAuditLogsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10709
10709
|
seller_reported_spend: z.number().min(0).optional(),
|
|
10710
10710
|
buyer_observed_spend: z.number().min(0).optional(),
|
|
10711
10711
|
delivery_reporting_period: z.object({
|
|
10712
|
-
start: z.
|
|
10713
|
-
end: z.
|
|
10712
|
+
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
10713
|
+
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
10714
10714
|
}).passthrough().optional(),
|
|
10715
10715
|
conservative_exposure: z.number().min(0).optional(),
|
|
10716
10716
|
delivery_reconciliation_status: z.union([z.literal("consistent"), z.literal("measurement_variance"), z.literal("disputed"), z.literal("unmatched"), z.literal("closed_unresolved")]).optional(),
|
|
@@ -10746,17 +10746,17 @@ const CheckGovernanceResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10746
10746
|
reason: z.string()
|
|
10747
10747
|
}).passthrough()).optional(),
|
|
10748
10748
|
consultation_context: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]+$/).optional(),
|
|
10749
|
-
expires_at: z.
|
|
10750
|
-
next_check: z.
|
|
10749
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
10750
|
+
next_check: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
10751
10751
|
delivery_statement: z.object({
|
|
10752
10752
|
statement_id: z.string(),
|
|
10753
10753
|
statement_digest: z.string().regex(/^sha256:[a-f0-9]{64}$/),
|
|
10754
10754
|
sequence: z.int().min(1),
|
|
10755
|
-
issued_at: z.
|
|
10755
|
+
issued_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
10756
10756
|
seller_reference: z.string(),
|
|
10757
10757
|
reporting_period: z.object({
|
|
10758
|
-
start: z.
|
|
10759
|
-
end: z.
|
|
10758
|
+
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
10759
|
+
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
10760
10760
|
}).passthrough(),
|
|
10761
10761
|
cumulative_spend: z.number().min(0),
|
|
10762
10762
|
currency: z.string().regex(/^[A-Z]{3}$/),
|
|
@@ -10805,13 +10805,13 @@ const SIGetOfferingResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10805
10805
|
available: z.boolean(),
|
|
10806
10806
|
offering_token: z.string().optional(),
|
|
10807
10807
|
ttl_seconds: z.int().min(0).optional(),
|
|
10808
|
-
checked_at: z.
|
|
10808
|
+
checked_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
10809
10809
|
offering: z.object({
|
|
10810
10810
|
offering_id: z.string().optional(),
|
|
10811
10811
|
title: z.string().optional(),
|
|
10812
10812
|
summary: z.string().optional(),
|
|
10813
10813
|
tagline: z.string().optional(),
|
|
10814
|
-
expires_at: z.
|
|
10814
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
10815
10815
|
availability_status: OfferingAvailabilityStatusSchema.optional(),
|
|
10816
10816
|
price_hint: z.string().optional(),
|
|
10817
10817
|
image_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
@@ -10972,7 +10972,7 @@ const SITerminateSessionResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10972
10972
|
checkout_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
10973
10973
|
checkout_token: z.string().optional(),
|
|
10974
10974
|
payload: z.object({}).passthrough().optional(),
|
|
10975
|
-
expires_at: z.
|
|
10975
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
10976
10976
|
}).passthrough().optional(),
|
|
10977
10977
|
follow_up: z.object({
|
|
10978
10978
|
action: z.union([z.literal("save_for_later"), z.literal("set_reminder"), z.literal("subscribe_updates"), z.literal("none")]).optional(),
|
|
@@ -11133,9 +11133,9 @@ const GetTaskStatusResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11133
11133
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
11134
11134
|
task_type: TaskTypeSchema,
|
|
11135
11135
|
protocol: AdCPProtocolSchema,
|
|
11136
|
-
created_at: z.
|
|
11137
|
-
updated_at: z.
|
|
11138
|
-
completed_at: z.
|
|
11136
|
+
created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
11137
|
+
updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
11138
|
+
completed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11139
11139
|
has_webhook: z.boolean().optional(),
|
|
11140
11140
|
progress: z.object({
|
|
11141
11141
|
percentage: z.number().min(0).max(100).optional(),
|
|
@@ -11153,7 +11153,7 @@ const GetTaskStatusResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11153
11153
|
}).passthrough().optional()
|
|
11154
11154
|
}).passthrough().optional(),
|
|
11155
11155
|
history: z.array(z.object({
|
|
11156
|
-
timestamp: z.
|
|
11156
|
+
timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
11157
11157
|
type: z.union([z.literal("request"), z.literal("response")]),
|
|
11158
11158
|
data: z.object({}).passthrough()
|
|
11159
11159
|
}).passthrough()).optional(),
|
|
@@ -11171,10 +11171,10 @@ const ListTasksRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11171
11171
|
statuses: z.array(TaskStatusSchema).optional(),
|
|
11172
11172
|
task_type: TaskTypeSchema.optional(),
|
|
11173
11173
|
task_types: z.array(TaskTypeSchema).optional(),
|
|
11174
|
-
created_after: z.
|
|
11175
|
-
created_before: z.
|
|
11176
|
-
updated_after: z.
|
|
11177
|
-
updated_before: z.
|
|
11174
|
+
created_after: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11175
|
+
created_before: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11176
|
+
updated_after: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11177
|
+
updated_before: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11178
11178
|
task_ids: z.array(z.string()).max(100).optional(),
|
|
11179
11179
|
context_contains: z.string().optional(),
|
|
11180
11180
|
has_webhook: z.boolean().optional()
|
|
@@ -11222,9 +11222,9 @@ const ListTasksResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11222
11222
|
task_type: TaskTypeSchema,
|
|
11223
11223
|
domain: z.union([z.literal("media-buy"), z.literal("signals"), z.literal("creative")]),
|
|
11224
11224
|
status: TaskStatusSchema,
|
|
11225
|
-
created_at: z.
|
|
11226
|
-
updated_at: z.
|
|
11227
|
-
completed_at: z.
|
|
11225
|
+
created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
11226
|
+
updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
11227
|
+
completed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11228
11228
|
has_webhook: z.boolean().optional()
|
|
11229
11229
|
}).passthrough()),
|
|
11230
11230
|
pagination: PaginationResponseSchema,
|
|
@@ -11368,15 +11368,15 @@ const ListAccountChangesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11368
11368
|
changes: z.array(AccountChangeSchema).max(100).optional(),
|
|
11369
11369
|
cursor: z.string().min(1).max(4096).optional(),
|
|
11370
11370
|
has_more: z.boolean().optional(),
|
|
11371
|
-
available_since: z.
|
|
11372
|
-
generated_at: z.
|
|
11371
|
+
available_since: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11372
|
+
generated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11373
11373
|
source_coverage: z.array(z.object({
|
|
11374
11374
|
source_id: z.string().max(255),
|
|
11375
11375
|
kind: z.union([z.literal("seller"), z.literal("connected_platform")]),
|
|
11376
11376
|
status: z.union([z.literal("current"), z.literal("delayed"), z.literal("unavailable"), z.literal("not_configured")]),
|
|
11377
|
-
coverage_start: z.
|
|
11378
|
-
observed_through: z.
|
|
11379
|
-
last_successful_sync_at: z.
|
|
11377
|
+
coverage_start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11378
|
+
observed_through: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11379
|
+
last_successful_sync_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11380
11380
|
stale_after_seconds: z.int().min(1).max(2592e3).optional(),
|
|
11381
11381
|
resource_types: z.array(z.string()).max(50)
|
|
11382
11382
|
}).passthrough()).max(50).optional(),
|
|
@@ -11386,15 +11386,15 @@ const ListAccountChangesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11386
11386
|
changes: z.array(AccountChangeSchema).max(100),
|
|
11387
11387
|
cursor: z.string().min(1).max(4096),
|
|
11388
11388
|
has_more: z.boolean(),
|
|
11389
|
-
available_since: z.
|
|
11390
|
-
generated_at: z.
|
|
11389
|
+
available_since: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
11390
|
+
generated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
11391
11391
|
source_coverage: z.array(z.object({
|
|
11392
11392
|
source_id: z.string().max(255),
|
|
11393
11393
|
kind: z.union([z.literal("seller"), z.literal("connected_platform")]),
|
|
11394
11394
|
status: z.union([z.literal("current"), z.literal("delayed"), z.literal("unavailable"), z.literal("not_configured")]),
|
|
11395
|
-
coverage_start: z.
|
|
11396
|
-
observed_through: z.
|
|
11397
|
-
last_successful_sync_at: z.
|
|
11395
|
+
coverage_start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11396
|
+
observed_through: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11397
|
+
last_successful_sync_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11398
11398
|
stale_after_seconds: z.int().min(1).max(2592e3).optional(),
|
|
11399
11399
|
resource_types: z.array(z.string()).max(50)
|
|
11400
11400
|
}).passthrough()).max(50).optional(),
|
|
@@ -11406,15 +11406,15 @@ const ListAccountChangesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11406
11406
|
changes: z.array(AccountChangeSchema).max(100).optional(),
|
|
11407
11407
|
cursor: z.string().min(1).max(4096).optional(),
|
|
11408
11408
|
has_more: z.boolean().optional(),
|
|
11409
|
-
available_since: z.
|
|
11410
|
-
generated_at: z.
|
|
11409
|
+
available_since: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11410
|
+
generated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11411
11411
|
source_coverage: z.array(z.object({
|
|
11412
11412
|
source_id: z.string().max(255),
|
|
11413
11413
|
kind: z.union([z.literal("seller"), z.literal("connected_platform")]),
|
|
11414
11414
|
status: z.union([z.literal("current"), z.literal("delayed"), z.literal("unavailable"), z.literal("not_configured")]),
|
|
11415
|
-
coverage_start: z.
|
|
11416
|
-
observed_through: z.
|
|
11417
|
-
last_successful_sync_at: z.
|
|
11415
|
+
coverage_start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11416
|
+
observed_through: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11417
|
+
last_successful_sync_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11418
11418
|
stale_after_seconds: z.int().min(1).max(2592e3).optional(),
|
|
11419
11419
|
resource_types: z.array(z.string()).max(50)
|
|
11420
11420
|
}).passthrough()).max(50).optional(),
|
|
@@ -11422,7 +11422,7 @@ const ListAccountChangesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11422
11422
|
context: ContextObjectSchema.optional(),
|
|
11423
11423
|
ext: ExtensionObjectSchema.optional(),
|
|
11424
11424
|
status: z.literal("failed")
|
|
11425
|
-
}).passthrough()])))();
|
|
11425
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
11426
11426
|
const ListAccountsRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
11427
11427
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
11428
11428
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
@@ -11503,7 +11503,7 @@ const ReportUsageRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11503
11503
|
build_variant_id: z.string().optional(),
|
|
11504
11504
|
property_list_id: z.string().optional(),
|
|
11505
11505
|
final: z.boolean().optional(),
|
|
11506
|
-
finalized_at: z.
|
|
11506
|
+
finalized_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11507
11507
|
measurement_window: z.string().max(50).optional()
|
|
11508
11508
|
}).passthrough()),
|
|
11509
11509
|
context: ContextObjectSchema.optional(),
|
|
@@ -11701,7 +11701,7 @@ const RawAttestationSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11701
11701
|
purpose: z.union([z.literal("platform_primary"), z.literal("measurement"), z.literal("attribution"), z.literal("creative_serving"), z.literal("identity"), z.literal("other")]).optional(),
|
|
11702
11702
|
payload: z.object({}).passthrough(),
|
|
11703
11703
|
payload_length: z.int().min(0),
|
|
11704
|
-
timestamp: z.
|
|
11704
|
+
timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
11705
11705
|
status_code: z.int().min(100).max(599).optional()
|
|
11706
11706
|
}).passthrough())();
|
|
11707
11707
|
const DigestAttestationSchema = /* @__PURE__ */ (() => z.object({
|
|
@@ -11719,7 +11719,7 @@ const DigestAttestationSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11719
11719
|
identifier_value_sha256: z.string().regex(/^[a-f0-9]{64}$/),
|
|
11720
11720
|
found: z.boolean()
|
|
11721
11721
|
}).passthrough()).max(64).optional(),
|
|
11722
|
-
timestamp: z.
|
|
11722
|
+
timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
11723
11723
|
status_code: z.int().min(100).max(599).optional()
|
|
11724
11724
|
}).passthrough())();
|
|
11725
11725
|
const IndividualImageAssetSchema = /* @__PURE__ */ (() => BaseIndividualAssetSchema.merge(z.object({
|
|
@@ -11768,7 +11768,7 @@ const BudgetChangeConstraintsSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11768
11768
|
min_result_amount: MoneySchema
|
|
11769
11769
|
}).passthrough(), z.object({
|
|
11770
11770
|
max_result_amount: MoneySchema
|
|
11771
|
-
}).passthrough()])))();
|
|
11771
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
11772
11772
|
const MediaBuyChangeTermConstraintsSchema = /* @__PURE__ */ (() => z.union([BudgetChangeConstraintsSchema, FlightChangeConstraintsSchema, PackageCountConstraintsSchema, EffectiveTimingConstraintsSchema]))();
|
|
11773
11773
|
const ReportingFileTransferSchema = /* @__PURE__ */ (() => z.object({
|
|
11774
11774
|
pattern: z.literal("file_transfer"),
|
|
@@ -11786,7 +11786,7 @@ const DisplayTagAssetSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11786
11786
|
asset_type: z.literal("display_tag"),
|
|
11787
11787
|
macro_declarations: z.array(MacroDeclarationSchema).optional(),
|
|
11788
11788
|
provenance: ProvenanceSchema.optional()
|
|
11789
|
-
}).passthrough().and(z.union([TagURLSchema, InlineMarkupSchema, PairedRedirectSchema])))();
|
|
11789
|
+
}).passthrough().and(z.union([TagURLSchema, InlineMarkupSchema, PairedRedirectSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
11790
11790
|
const DAASTAssetSchema = /* @__PURE__ */ (() => z.object({
|
|
11791
11791
|
asset_type: z.literal("daast"),
|
|
11792
11792
|
daast_version: DAASTVersionSchema.optional(),
|
|
@@ -11812,7 +11812,7 @@ const DAASTAssetSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11812
11812
|
field: z.literal("content").optional()
|
|
11813
11813
|
}).passthrough().optional()
|
|
11814
11814
|
}).passthrough()).optional()
|
|
11815
|
-
}).passthrough()])))();
|
|
11815
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
11816
11816
|
const CardAssetSchema = /* @__PURE__ */ (() => z.object({
|
|
11817
11817
|
asset_type: z.literal("card"),
|
|
11818
11818
|
media: z.union([ImageAssetSchema, VideoAssetSchema]),
|
|
@@ -11907,8 +11907,8 @@ const ProductFormatDeclarationSchema = /* @__PURE__ */ (() => z.object({}).passt
|
|
|
11907
11907
|
format_shape: z.string().optional(),
|
|
11908
11908
|
v1_format_ref: z.array(FormatReferenceStructuredObjectSchema).optional(),
|
|
11909
11909
|
format_schema: PlatformExtensionReferenceSchema.optional()
|
|
11910
|
-
}).passthrough()).and(z.union([ImageFormatDeclarationSchema, HTML5FormatDeclarationSchema, DisplayTagFormatDeclarationSchema, ImageCarouselFormatDeclarationSchema, HostedVideoFormatDeclarationSchema, VASTVideoFormatDeclarationSchema, HostedAudioFormatDeclarationSchema, VASTAudioFormatDeclarationSchema, DAASTAudioFormatDeclarationSchema, SponsoredPlacementFormatDeclarationSchema, NativeInFeedFormatDeclarationSchema, ResponsiveCreativeFormatDeclarationSchema, AgentPlacementFormatDeclarationSchema, SellerRenderedStatefulDisplayFormatDeclarationSchema, CoordinatedPlacementsFormatDeclarationSchema, CustomFormatDeclarationSchema])))();
|
|
11911
|
-
const PlacementSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({}).passthrough()).merge(z.object({}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
|
|
11910
|
+
}).passthrough()).describe("Common constraints for every product format.").and(z.union([ImageFormatDeclarationSchema, HTML5FormatDeclarationSchema, DisplayTagFormatDeclarationSchema, ImageCarouselFormatDeclarationSchema, HostedVideoFormatDeclarationSchema, VASTVideoFormatDeclarationSchema, HostedAudioFormatDeclarationSchema, VASTAudioFormatDeclarationSchema, DAASTAudioFormatDeclarationSchema, SponsoredPlacementFormatDeclarationSchema, NativeInFeedFormatDeclarationSchema, ResponsiveCreativeFormatDeclarationSchema, AgentPlacementFormatDeclarationSchema, SellerRenderedStatefulDisplayFormatDeclarationSchema, CoordinatedPlacementsFormatDeclarationSchema, CustomFormatDeclarationSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
11911
|
+
const PlacementSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({}).passthrough()).merge(z.object({}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
|
|
11912
11912
|
kind: z.union([z.literal("publisher_ref"), z.literal("seller_inline")]),
|
|
11913
11913
|
placement_id: z.string(),
|
|
11914
11914
|
publisher_domain: z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).optional(),
|
|
@@ -12087,7 +12087,7 @@ const GetCreativeFeaturesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
12087
12087
|
payload: z.object({}).passthrough().optional(),
|
|
12088
12088
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
12089
12089
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
12090
|
-
}).passthrough().and(z.union([GetCreativeFeaturesSuccessSchema, GetCreativeFeaturesErrorSchema, GetCreativeFeaturesSubmittedSchema])))();
|
|
12090
|
+
}).passthrough().and(z.union([GetCreativeFeaturesSuccessSchema, GetCreativeFeaturesErrorSchema, GetCreativeFeaturesSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
12091
12091
|
const SyncCatalogsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
12092
12092
|
context_id: z.string().optional(),
|
|
12093
12093
|
context: ContextObjectSchema.optional(),
|
|
@@ -12102,7 +12102,7 @@ const SyncCatalogsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
12102
12102
|
payload: z.object({}).passthrough().optional(),
|
|
12103
12103
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
12104
12104
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
12105
|
-
}).passthrough().and(z.union([SyncCatalogsSuccessSchema, SyncCatalogsErrorSchema, SyncCatalogsSubmittedSchema])))();
|
|
12105
|
+
}).passthrough().and(z.union([SyncCatalogsSuccessSchema, SyncCatalogsErrorSchema, SyncCatalogsSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
12106
12106
|
const ProductSchema = /* @__PURE__ */ (() => z.object({
|
|
12107
12107
|
product_id: z.string(),
|
|
12108
12108
|
name: z.string(),
|
|
@@ -12281,7 +12281,7 @@ const CanonicalProductPlacementSchema = /* @__PURE__ */ (() => z.object({
|
|
|
12281
12281
|
kind: z.literal("publisher_ref")
|
|
12282
12282
|
}).passthrough(), z.object({
|
|
12283
12283
|
kind: z.literal("seller_inline")
|
|
12284
|
-
}).passthrough()])))();
|
|
12284
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
12285
12285
|
const TargetingOverlaySupport1Schema = /* @__PURE__ */ (() => TargetingOverlaySupportSchema)();
|
|
12286
12286
|
const CanonicalProductActionSchema = /* @__PURE__ */ (() => z.object({
|
|
12287
12287
|
action: CanonicalMediaBuyActionNameSchema,
|
|
@@ -12293,7 +12293,7 @@ const CanonicalProductActionSchema = /* @__PURE__ */ (() => z.object({
|
|
|
12293
12293
|
}).passthrough())();
|
|
12294
12294
|
const AssetVariantSchema = /* @__PURE__ */ (() => z.union([ImageAssetSchema, VideoAssetSchema, AudioAssetSchema, VASTAssetSchema, DisplayTagAssetSchema, TextAssetSchema, URLAssetSchema, HTMLAssetSchema, JavaScriptAssetSchema, ZipAssetSchema, WebhookAssetSchema, CSSAssetSchema, DAASTAssetSchema, MarkdownAssetSchema, BriefAssetSchema, CatalogAssetSchema, PublishedPostAssetSchema, CardAssetSchema, PixelTrackerAssetSchema, VASTTrackerAssetSchema, DAASTTrackerAssetSchema]))();
|
|
12295
12295
|
const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
|
|
12296
|
-
const objectSchema = z.object({ "geo_countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_countries_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Exclude specific countries from delivery. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_regions": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Restrict delivery to exact canonical ISO 3166-2 subdivisions (states, provinces, regions, departments, or other subdivision categories). Unknown identifiers are invalid. At create or update, sellers MUST reject unsupported identifiers and MUST NOT silently widen, drop, or partially apply the list. During get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome. Exact internal translation preserves accepted identifiers in package readback.").optional(), "geo_regions_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Exclude exact canonical ISO 3166-2 subdivisions. Support is independent from geo_regions inclusion support. Unknown identifiers and values also present in geo_regions are invalid. At create or update, sellers MUST reject unsupported identifiers and partial application; during get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome.").optional(), "geo_metros": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict().describe("A targeted metro area.")).min(1).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_metros_exclude": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes to exclude within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict()).min(1).describe("Exclude specific metro areas from delivery. Each entry specifies the classification system and excluded values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })])).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Restrict delivery to specific postal areas. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas_exclude": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })])).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Exclude specific postal areas from delivery. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_places": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))])).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Restrict delivery to catalog-backed named places. Values MUST be stable identifiers in the declared system, not display names. Sellers must declare supported systems, countries, and place types in get_adcp_capabilities and reject unsupported entries rather than silently dropping them.").optional(), "geo_places_exclude": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))])).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Exclude catalog-backed named places. Uses the same identifier-based shape as geo_places. Sellers MUST reject overlap with geo_places for the same country, system, place_type, and value.").optional(), "daypart_targets": z.array(z.object({ "days": z.array(z.enum(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]).describe("Days of the week for daypart targeting")).min(1).describe("Days of week this window applies to. Use multiple days for compact targeting (e.g., monday-friday in one object)."), "start_hour": z.number().int().gte(0).lte(23).describe("Start hour (inclusive), 0-23 in 24-hour format. 0 = midnight, 6 = 6:00am, 18 = 6:00pm."), "end_hour": z.number().int().gte(1).lte(24).describe("End hour (exclusive), 1-24 in 24-hour format. 10 = 10:00am, 24 = midnight. Must be greater than start_hour."), "timezone": z.union([z.literal("inventory_local"), z.any().refine((value) => !z.literal("inventory_local").safeParse(value).success, "Invalid input: Should NOT be valid against schema").describe("Concrete timezone identifier in the implementation's supported IANA Time Zone Database, such as America/New_York, CET, or UTC.")]).describe("Civil-time clock used to evaluate this window. 'inventory_local' evaluates the hours in the seller-assigned local timezone of each inventory unit that can deliver the impression, such as a screen, venue, station, or publisher property; it never means the buyer, account, or server timezone. A concrete IANA timezone identifier (for example, 'America/New_York', 'CET', or 'UTC') evaluates one shared civil-time clock across the targeted inventory. Omission defaults to 'inventory_local'. Buyers that begin with a user or account preference MUST resolve it to a concrete IANA identifier before sending the daypart; 'user_timezone' and 'account_timezone' are not wire values. For each candidate delivery instant, convert the instant into this clock and compare its resulting local day and hour with the half-open window: a skipped DST hour has no matching instants, while both occurrences of a repeated hour match. This delivery clock is independent of reporting_capabilities.timezone.").default("inventory_local"), "label": z.string().describe("Optional human-readable name for this time window (e.g., 'Morning Drive', 'Prime Time')").optional() }).strict().describe("A time window for daypart targeting. Specifies days of week, an hour range, and the civil-time clock used to evaluate it. start_hour is inclusive, end_hour is exclusive (e.g., 6-10 = 6:00am to 10:00am). Follows the Google Ads AdScheduleInfo / DV360 DayPartTargeting pattern.")).min(1).describe("Restrict delivery to specific time windows. Each entry specifies days of week, an hour range, and an optional timezone that defaults to inventory_local. A concrete IANA zone uses one shared civil-time clock, while inventory_local evaluates each inventory unit in its seller-assigned local timezone. Entries are independent and MAY use different clocks.").optional(), "axe_include_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to include for targeting.").optional(), "axe_exclude_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to exclude from targeting.").optional(), "audience_include": z.array(z.string()).min(1).describe("Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities.").optional(), "audience_exclude": z.array(z.string()).min(1).describe("Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities.").optional(), "signal_targeting_groups": z.object({ "operator": z.literal("all").describe("Groups-level operator. Required even though v1 only supports 'all': every child group must be satisfied."), "groups": z.array(z.object({ "operator": z.enum(["any", "none"]).describe("How to evaluate the signals in this group. 'any' is an OR include group. 'none' is an exclusion group equivalent to NOT (A OR B OR C)."), "signals": z.array(z.object({ "pricing_option_id": z.string().describe("Pricing option selected for this signal. Use the pricing_option_id from the product's signal_targeting_options entry when product-scoped pricing is present; otherwise use the seller get_signals pricing only when the product option does not override it. Required when the selected signal has pricing_options; omit only when the signal is bundled into the product price or has no incremental cost.").optional(), "signal_agent_segment_id": z.string().describe("Optional opaque resolved-segment or seller execution handle for this signal. Omit when signal_ref plus the value expression is sufficient for the seller to resolve the signal. Include when the product option exposes a separate runtime or activation handle, and pass it verbatim. Buyers SHOULD prefer an exposed segment handle over reconstructing condition identity from categorical values because the handle can carry provider namespace and methodology distinctions.").optional(), "activation_key": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
|
|
12296
|
+
const objectSchema = z.object({ "geo_countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_countries_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Exclude specific countries from delivery. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_regions": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Restrict delivery to exact canonical ISO 3166-2 subdivisions (states, provinces, regions, departments, or other subdivision categories). Unknown identifiers are invalid. At create or update, sellers MUST reject unsupported identifiers and MUST NOT silently widen, drop, or partially apply the list. During get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome. Exact internal translation preserves accepted identifiers in package readback.").optional(), "geo_regions_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Exclude exact canonical ISO 3166-2 subdivisions. Support is independent from geo_regions inclusion support. Unknown identifiers and values also present in geo_regions are invalid. At create or update, sellers MUST reject unsupported identifiers and partial application; during get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome.").optional(), "geo_metros": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict().describe("A targeted metro area.")).min(1).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_metros_exclude": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes to exclude within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict()).min(1).describe("Exclude specific metro areas from delivery. Each entry specifies the classification system and excluded values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })]).describe("Must also satisfy at least one of these alternatives.")).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Restrict delivery to specific postal areas. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas_exclude": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })]).describe("Must also satisfy at least one of these alternatives.")).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Exclude specific postal areas from delivery. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_places": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Restrict delivery to catalog-backed named places. Values MUST be stable identifiers in the declared system, not display names. Sellers must declare supported systems, countries, and place types in get_adcp_capabilities and reject unsupported entries rather than silently dropping them.").optional(), "geo_places_exclude": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Exclude catalog-backed named places. Uses the same identifier-based shape as geo_places. Sellers MUST reject overlap with geo_places for the same country, system, place_type, and value.").optional(), "daypart_targets": z.array(z.object({ "days": z.array(z.enum(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]).describe("Days of the week for daypart targeting")).min(1).describe("Days of week this window applies to. Use multiple days for compact targeting (e.g., monday-friday in one object)."), "start_hour": z.number().int().gte(0).lte(23).describe("Start hour (inclusive), 0-23 in 24-hour format. 0 = midnight, 6 = 6:00am, 18 = 6:00pm."), "end_hour": z.number().int().gte(1).lte(24).describe("End hour (exclusive), 1-24 in 24-hour format. 10 = 10:00am, 24 = midnight. Must be greater than start_hour."), "timezone": z.union([z.literal("inventory_local"), z.any().refine((value) => !z.literal("inventory_local").safeParse(value).success, "Invalid input: Should NOT be valid against schema").describe("Concrete timezone identifier in the implementation's supported IANA Time Zone Database, such as America/New_York, CET, or UTC.")]).describe("Civil-time clock used to evaluate this window. 'inventory_local' evaluates the hours in the seller-assigned local timezone of each inventory unit that can deliver the impression, such as a screen, venue, station, or publisher property; it never means the buyer, account, or server timezone. A concrete IANA timezone identifier (for example, 'America/New_York', 'CET', or 'UTC') evaluates one shared civil-time clock across the targeted inventory. Omission defaults to 'inventory_local'. Buyers that begin with a user or account preference MUST resolve it to a concrete IANA identifier before sending the daypart; 'user_timezone' and 'account_timezone' are not wire values. For each candidate delivery instant, convert the instant into this clock and compare its resulting local day and hour with the half-open window: a skipped DST hour has no matching instants, while both occurrences of a repeated hour match. This delivery clock is independent of reporting_capabilities.timezone.").default("inventory_local"), "label": z.string().describe("Optional human-readable name for this time window (e.g., 'Morning Drive', 'Prime Time')").optional() }).strict().describe("A time window for daypart targeting. Specifies days of week, an hour range, and the civil-time clock used to evaluate it. start_hour is inclusive, end_hour is exclusive (e.g., 6-10 = 6:00am to 10:00am). Follows the Google Ads AdScheduleInfo / DV360 DayPartTargeting pattern.")).min(1).describe("Restrict delivery to specific time windows. Each entry specifies days of week, an hour range, and an optional timezone that defaults to inventory_local. A concrete IANA zone uses one shared civil-time clock, while inventory_local evaluates each inventory unit in its seller-assigned local timezone. Entries are independent and MAY use different clocks.").optional(), "axe_include_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to include for targeting.").optional(), "axe_exclude_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to exclude from targeting.").optional(), "audience_include": z.array(z.string()).min(1).describe("Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities.").optional(), "audience_exclude": z.array(z.string()).min(1).describe("Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities.").optional(), "signal_targeting_groups": z.object({ "operator": z.literal("all").describe("Groups-level operator. Required even though v1 only supports 'all': every child group must be satisfied."), "groups": z.array(z.object({ "operator": z.enum(["any", "none"]).describe("How to evaluate the signals in this group. 'any' is an OR include group. 'none' is an exclusion group equivalent to NOT (A OR B OR C)."), "signals": z.array(z.object({ "pricing_option_id": z.string().describe("Pricing option selected for this signal. Use the pricing_option_id from the product's signal_targeting_options entry when product-scoped pricing is present; otherwise use the seller get_signals pricing only when the product option does not override it. Required when the selected signal has pricing_options; omit only when the signal is bundled into the product price or has no incremental cost.").optional(), "signal_agent_segment_id": z.string().describe("Optional opaque resolved-segment or seller execution handle for this signal. Omit when signal_ref plus the value expression is sufficient for the seller to resolve the signal. Include when the product option exposes a separate runtime or activation handle, and pass it verbatim. Buyers SHOULD prefer an exposed segment handle over reconstructing condition identity from categorical values because the handle can carry provider namespace and methodology distinctions.").optional(), "activation_key": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
|
|
12297
12297
|
const schemas = [z.object({ "type": z.literal("segment_id").describe("Segment ID based targeting"), "segment_id": z.string().describe("The platform-specific segment identifier to use in campaign targeting") }).catchall(z.any()), z.object({ "type": z.literal("key_value").describe("Key-value pair based targeting"), "key": z.string().describe("The targeting parameter key"), "value": z.string().describe("The targeting parameter value") }).catchall(z.any())];
|
|
12298
12298
|
const { errors, failed } = schemas.reduce(
|
|
12299
12299
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
@@ -12394,7 +12394,7 @@ const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
|
|
|
12394
12394
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
12395
12395
|
});
|
|
12396
12396
|
}
|
|
12397
|
-
}).describe("Named signal being targeted."), "value_type": z.literal("numeric").describe("Discriminator for numeric signals."), "min_value": z.number().describe("Minimum value, inclusive. Omit for no minimum. Should be within the signal definition's range when declared.").optional(), "max_value": z.number().describe("Maximum value, inclusive. Omit for no maximum. Should be within the signal definition's range when declared.").optional() }).catchall(z.any()).and(z.union([z.object({ "min_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Numeric signal expression - target users within a value range. At least one of min_value or max_value is required. If both min_value and max_value are provided, min_value MUST be <= max_value.")];
|
|
12397
|
+
}).describe("Named signal being targeted."), "value_type": z.literal("numeric").describe("Discriminator for numeric signals."), "min_value": z.number().describe("Minimum value, inclusive. Omit for no minimum. Should be within the signal definition's range when declared.").optional(), "max_value": z.number().describe("Maximum value, inclusive. Omit for no maximum. Should be within the signal definition's range when declared.").optional() }).catchall(z.any()).and(z.union([z.object({ "min_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Numeric signal expression - target users within a value range. At least one of min_value or max_value is required. If both min_value and max_value are provided, min_value MUST be <= max_value.")];
|
|
12398
12398
|
const { errors, failed } = schemas.reduce(
|
|
12399
12399
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
12400
12400
|
errors: [...errors2, ...result.error.issues],
|
|
@@ -12469,7 +12469,7 @@ const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
|
|
|
12469
12469
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
12470
12470
|
});
|
|
12471
12471
|
}
|
|
12472
|
-
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("binary").describe("Discriminator for binary signals"), "value": z.boolean().describe("Whether to include (true) or exclude (false) users matching this signal") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Binary signal targeting - user either matches or doesn't"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
|
|
12472
|
+
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("binary").describe("Discriminator for binary signals"), "value": z.boolean().describe("Whether to include (true) or exclude (false) users matching this signal") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Binary signal targeting - user either matches or doesn't"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
|
|
12473
12473
|
const schemas2 = [z.object({ "scope": z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Product-local signal identifier. For local signals exposed on both get_signals and get_products, this MUST match get_signals.signals[].signal_ref.signal_id for the same signal.") }).catchall(z.any()).describe("Product-scoped signal. The signal_id is meaningful only within the selected product/package context and MUST match a Product.included_signals[].signal_ref.signal_id or Product.signal_targeting_options[].signal_ref.signal_id for that product, depending on whether the signal is descriptive or selectable."), z.object({ "scope": z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that publishes the signal definition in its adagents.json signals[]."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(z.any()).describe("Data-provider-scoped signal. The signal_id resolves through the data provider's published adagents.json signals[] and can be authorization-verified there."), z.object({ "scope": z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(z.any()).describe("Signal-source-scoped signal. Use this for source-native signals that are not published in upstream adagents.json signals[]. The buyer trusts the issuing signal source for this identity; use scope 'data_provider' instead when the signal is published in adagents.json signals[], even if the publisher is also the seller or signal source.")];
|
|
12474
12474
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
12475
12475
|
({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
|
|
@@ -12519,7 +12519,7 @@ const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
|
|
|
12519
12519
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
12520
12520
|
});
|
|
12521
12521
|
}
|
|
12522
|
-
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("categorical").describe("Discriminator for categorical signals"), "values": z.array(z.string()).min(1).describe("Values to target. Users with any of these values will be included.") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Categorical signal targeting - target users with specific values"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
|
|
12522
|
+
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("categorical").describe("Discriminator for categorical signals"), "values": z.array(z.string()).min(1).describe("Values to target. Users with any of these values will be included.") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Categorical signal targeting - target users with specific values"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
|
|
12523
12523
|
const schemas2 = [z.object({ "scope": z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Product-local signal identifier. For local signals exposed on both get_signals and get_products, this MUST match get_signals.signals[].signal_ref.signal_id for the same signal.") }).catchall(z.any()).describe("Product-scoped signal. The signal_id is meaningful only within the selected product/package context and MUST match a Product.included_signals[].signal_ref.signal_id or Product.signal_targeting_options[].signal_ref.signal_id for that product, depending on whether the signal is descriptive or selectable."), z.object({ "scope": z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that publishes the signal definition in its adagents.json signals[]."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(z.any()).describe("Data-provider-scoped signal. The signal_id resolves through the data provider's published adagents.json signals[] and can be authorization-verified there."), z.object({ "scope": z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(z.any()).describe("Signal-source-scoped signal. Use this for source-native signals that are not published in upstream adagents.json signals[]. The buyer trusts the issuing signal source for this identity; use scope 'data_provider' instead when the signal is published in adagents.json signals[], even if the publisher is also the seller or signal source.")];
|
|
12524
12524
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
12525
12525
|
({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
|
|
@@ -12569,7 +12569,7 @@ const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
|
|
|
12569
12569
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
12570
12570
|
});
|
|
12571
12571
|
}
|
|
12572
|
-
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("numeric").describe("Discriminator for numeric signals"), "min_value": z.number().describe("Minimum value (inclusive). Omit for no minimum. Must be <= max_value when both are provided. Should be >= signal's range.min if defined.").optional(), "max_value": z.number().describe("Maximum value (inclusive). Omit for no maximum. Must be >= min_value when both are provided. Should be <= signal's range.max if defined.").optional() }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Numeric signal targeting - target users within a value range. If min_value is provided, it must be <= max_value. Values should be within the signal's defined range (see signal definition).")];
|
|
12572
|
+
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("numeric").describe("Discriminator for numeric signals"), "min_value": z.number().describe("Minimum value (inclusive). Omit for no minimum. Must be <= max_value when both are provided. Should be >= signal's range.min if defined.").optional(), "max_value": z.number().describe("Maximum value (inclusive). Omit for no maximum. Must be >= min_value when both are provided. Should be <= signal's range.max if defined.").optional() }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Numeric signal targeting - target users within a value range. If min_value is provided, it must be <= max_value. Values should be within the signal's defined range (see signal definition).")];
|
|
12573
12573
|
const { errors, failed } = schemas.reduce(
|
|
12574
12574
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
12575
12575
|
errors: [...errors2, ...result.error.issues],
|
|
@@ -12593,7 +12593,7 @@ const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
|
|
|
12593
12593
|
message: "Invalid input: Should pass single schema. Passed " + passed
|
|
12594
12594
|
});
|
|
12595
12595
|
}
|
|
12596
|
-
}).describe("Targeting constraint for a specific signal. Uses value_type as discriminator to determine the targeting expression format.")).min(1).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.").optional(), "demographics": z.object({ "age": z.intersection(z.object({ "min": z.number().int().gte(0).lte(150).describe("Inclusive minimum age in completed years. Omit for an open lower bound.").optional(), "max": z.number().int().gte(0).lte(150).describe("Inclusive maximum age in completed years. Omit for an open upper bound.").optional(), "include_unknown": z.boolean().describe("Whether delivery to people whose age is unavailable is part of this predicate. This field has no default and MUST be supplied.") }).catchall(z.any()).and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A canonical audience-age predicate in completed integer years. min and max are inclusive; omitting one bound means no restriction in that direction. At least one bound is required. include_unknown is always explicit because people whose age is unavailable are not members of any numeric interval. Implementations MUST reject min greater than max; JSON Schema draft-07 cannot compare sibling numeric values."), z.object({ "accepted_bases": z.array(z.enum(["verified", "declared", "inferred"]).describe("User-level bases that may resolve age for demographic targeting execution. Population estimates are deliberately absent because aggregate composition cannot establish an individual impression's age.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("User-level age determination bases the buyer permits for this predicate. Sellers MUST use only these bases or reject the request; they MUST NOT silently fall back to another basis. When omitted, the buyer imposes no determination-basis constraint beyond product capability and any age_restriction. population_estimate is structurally unavailable because aggregate evidence cannot identify an eligible user.").optional(), "accepted_verification_methods": z.array(z.enum(["facial_age_estimation", "id_document", "digital_id", "credit_card", "world_id"]).describe("Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Verification methods acceptable when verified is an accepted basis. This field narrows verified demographic execution; age_restriction.accepted_methods independently governs legal eligibility and the two sets are intersected when both are present.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "accepted_verification_methods": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "accepted_verification_methods": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "accepted_bases": z.any().refine((value) => !z.array(z.any().refine((value2) => !z.literal("verified").safeParse(value2).success, "Invalid input: Should NOT be valid against schema")).safeParse(value).success, "Invalid input: Should NOT be valid against schema") }))]))) }).catchall(z.any()).describe("Canonical demographic audience targeting intent with optional constraints on how age may be determined. This is distinct from age_restriction: demographics selects an audience, while age_restriction expresses a legal eligibility or verification floor. Fresh create/update targeting MUST compile exactly or be rejected. During get_products, a seller may offer a different configured predicate only through sparse targeting_resolution modifications on a distinguishable product_id; selecting that product accepts the alternative. Sellers never silently broaden, narrow, default, drop, or substitute the basis.").optional(), "frequency_cap": z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2.").optional(), "property_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list for targeting specific properties within this product. The package runs on the intersection of the product's publisher_properties and this list. Sellers SHOULD return a validation error if the product has property_targeting_allowed: false.").optional(), "property_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list whose properties must not carry the buyer's ads. Matched properties are removed from delivery. Use for brand-safety do-not-run lists (apps, sites). Exclude wins on overlap with property_list, and applies regardless of the product's property_targeting_allowed flag. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for including specific collections (programs, publications, channels) within this product. The package runs on the intersection of matched collections and this list. Use for inclusion-based collection targeting. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for excluding specific collections (programs, publications, channels) from this product. Matched collections must not carry the buyer's ads. Use for brand safety do-not-air lists. Seller must declare support in get_adcp_capabilities.").optional(), "placement_selection": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
|
|
12596
|
+
}).describe("Targeting constraint for a specific signal. Uses value_type as discriminator to determine the targeting expression format.")).min(1).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.").optional(), "demographics": z.object({ "age": z.intersection(z.object({ "min": z.number().int().gte(0).lte(150).describe("Inclusive minimum age in completed years. Omit for an open lower bound.").optional(), "max": z.number().int().gte(0).lte(150).describe("Inclusive maximum age in completed years. Omit for an open upper bound.").optional(), "include_unknown": z.boolean().describe("Whether delivery to people whose age is unavailable is part of this predicate. This field has no default and MUST be supplied.") }).catchall(z.any()).and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A canonical audience-age predicate in completed integer years. min and max are inclusive; omitting one bound means no restriction in that direction. At least one bound is required. include_unknown is always explicit because people whose age is unavailable are not members of any numeric interval. Implementations MUST reject min greater than max; JSON Schema draft-07 cannot compare sibling numeric values."), z.object({ "accepted_bases": z.array(z.enum(["verified", "declared", "inferred"]).describe("User-level bases that may resolve age for demographic targeting execution. Population estimates are deliberately absent because aggregate composition cannot establish an individual impression's age.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("User-level age determination bases the buyer permits for this predicate. Sellers MUST use only these bases or reject the request; they MUST NOT silently fall back to another basis. When omitted, the buyer imposes no determination-basis constraint beyond product capability and any age_restriction. population_estimate is structurally unavailable because aggregate evidence cannot identify an eligible user.").optional(), "accepted_verification_methods": z.array(z.enum(["facial_age_estimation", "id_document", "digital_id", "credit_card", "world_id"]).describe("Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Verification methods acceptable when verified is an accepted basis. This field narrows verified demographic execution; age_restriction.accepted_methods independently governs legal eligibility and the two sets are intersected when both are present.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "accepted_verification_methods": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "accepted_verification_methods": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "accepted_bases": z.any().refine((value) => !z.array(z.any().refine((value2) => !z.literal("verified").safeParse(value2).success, "Invalid input: Should NOT be valid against schema")).safeParse(value).success, "Invalid input: Should NOT be valid against schema") }))]).describe("Must also satisfy at least one of these alternatives."))) }).catchall(z.any()).describe("Canonical demographic audience targeting intent with optional constraints on how age may be determined. This is distinct from age_restriction: demographics selects an audience, while age_restriction expresses a legal eligibility or verification floor. Fresh create/update targeting MUST compile exactly or be rejected. During get_products, a seller may offer a different configured predicate only through sparse targeting_resolution modifications on a distinguishable product_id; selecting that product accepts the alternative. Sellers never silently broaden, narrow, default, drop, or substitute the basis.").optional(), "frequency_cap": z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2.").optional(), "property_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list for targeting specific properties within this product. The package runs on the intersection of the product's publisher_properties and this list. Sellers SHOULD return a validation error if the product has property_targeting_allowed: false.").optional(), "property_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list whose properties must not carry the buyer's ads. Matched properties are removed from delivery. Use for brand-safety do-not-run lists (apps, sites). Exclude wins on overlap with property_list, and applies regardless of the product's property_targeting_allowed flag. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for including specific collections (programs, publications, channels) within this product. The package runs on the intersection of matched collections and this list. Use for inclusion-based collection targeting. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for excluding specific collections (programs, publications, channels) from this product. Matched collections must not carry the buyer's ads. Use for brand safety do-not-air lists. Seller must declare support in get_adcp_capabilities.").optional(), "placement_selection": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
|
|
12597
12597
|
const schemas = [z.object({ "mode": z.literal("selected"), "placement_refs": z.array(z.union([z.intersection(z.object({ "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring a publisher-catalog placement is hosted, or the inventory publisher associated with an inline placement. Omitted only for legacy single-publisher product-context references.").optional(), "placement_id": z.string().describe("Placement ID from the publisher's adagents.json placement catalog, or an inline seller-defined placement ID interpreted within the enclosing seller and product context.") }).catchall(z.any()).describe("Legacy-compatible product-context reference to a placement. For publisher-catalog placements, publisher_domain plus placement_id resolves the declaration in that publisher's adagents.json. For seller-inline placements, the enclosing seller and product supply scope. When publisher_domain is omitted on legacy inputs, receivers MAY interpret the ID relative to the enclosing single-publisher product. Use placement-identity.json when a self-contained cross-document identity is required."), z.object({ "publisher_domain": z.any().refine((value) => value !== void 0, "Required") }).passthrough()), z.any().superRefine((x2, ctx2) => {
|
|
12598
12598
|
const schemas2 = [z.object({ "kind": z.literal("publisher_ref"), "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain whose adagents.json declares placement_id."), "placement_id": z.string().min(1) }).strict(), z.object({ "kind": z.literal("seller_inline"), "seller_agent": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("The seller agent's API endpoint URL as declared in the property publisher's adagents.json `authorized_agents[].url`. MUST use the `https://` scheme. Receivers compare this URL against the `authorized_agents` list using the AdCP URL canonicalization rules \u2014 not byte-equality \u2014 and reject mismatches with `seller_not_authorized`. See docs/reference/url-canonicalization."), "id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).min(1).describe("Reserved for a future registry-assigned stable seller identifier. Not used today \u2014 senders MUST NOT populate this field until a registry is defined. When a future release populates both `agent_url` and `id`, `agent_url` remains authoritative and `id` is advisory.").optional() }).strict().describe("Sales agent that defines and maintains the inline placement namespace."), "placement_id": z.string().min(1).describe("Stable placement ID within the defining sales agent's namespace. The agent MUST NOT reuse it for a different semantic placement.") }).strict()];
|
|
12599
12599
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
@@ -12817,7 +12817,7 @@ const CreativeManifestSchema = /* @__PURE__ */ (() => z.object({}).passthrough()
|
|
|
12817
12817
|
const BuildCreativeMultiSuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
12818
12818
|
creative_manifests: z.array(CreativeManifestSchema),
|
|
12819
12819
|
sandbox: z.boolean().optional(),
|
|
12820
|
-
expires_at: z.
|
|
12820
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
12821
12821
|
preview: z.object({
|
|
12822
12822
|
previews: z.array(z.object({
|
|
12823
12823
|
preview_id: z.string(),
|
|
@@ -12831,7 +12831,7 @@ const BuildCreativeMultiSuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
|
12831
12831
|
}).passthrough()
|
|
12832
12832
|
}).passthrough()),
|
|
12833
12833
|
interactive_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
12834
|
-
expires_at: z.
|
|
12834
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
12835
12835
|
}).passthrough().optional(),
|
|
12836
12836
|
preview_error: ErrorSchema.optional(),
|
|
12837
12837
|
pricing_option_id: z.string().optional(),
|
|
@@ -12882,7 +12882,7 @@ const BuildCreativeVariantSuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
|
12882
12882
|
budget_status: z.union([z.literal("complete"), z.literal("capped")]).optional(),
|
|
12883
12883
|
errors: z.array(ErrorSchema).optional(),
|
|
12884
12884
|
sandbox: z.boolean().optional(),
|
|
12885
|
-
expires_at: z.
|
|
12885
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
12886
12886
|
context: ContextObjectSchema.optional(),
|
|
12887
12887
|
ext: ExtensionObjectSchema.optional()
|
|
12888
12888
|
}).passthrough())();
|
|
@@ -12895,13 +12895,13 @@ const PreviewCreativeVariantResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
12895
12895
|
renders: z.array(PreviewRenderSchema)
|
|
12896
12896
|
}).passthrough()),
|
|
12897
12897
|
manifest: CreativeManifestSchema.optional(),
|
|
12898
|
-
expires_at: z.
|
|
12898
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
12899
12899
|
context: ContextObjectSchema.optional(),
|
|
12900
12900
|
ext: ExtensionObjectSchema.optional()
|
|
12901
12901
|
}).passthrough())();
|
|
12902
12902
|
const AAODirectoryAgentPublishersInverseLookupResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
12903
12903
|
agent_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"),
|
|
12904
|
-
directory_indexed_at: z.
|
|
12904
|
+
directory_indexed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").nullable(),
|
|
12905
12905
|
publishers: z.array(PublisherEntrySchema),
|
|
12906
12906
|
next_cursor: z.string().optional().nullable()
|
|
12907
12907
|
}).passthrough())();
|
|
@@ -12936,7 +12936,7 @@ const CreativeApprovalResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
12936
12936
|
payload: z.object({}).passthrough().optional(),
|
|
12937
12937
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
12938
12938
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
12939
|
-
}).passthrough().and(z.union([CreativeApprovedSchema, CreativeRejectedSchema, CreativePendingReviewSchema, CreativeApprovalErrorSchema])))();
|
|
12939
|
+
}).passthrough().and(z.union([CreativeApprovedSchema, CreativeRejectedSchema, CreativePendingReviewSchema, CreativeApprovalErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
12940
12940
|
const GetBrandIdentityResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
12941
12941
|
context_id: z.string().optional(),
|
|
12942
12942
|
context: ContextObjectSchema.optional(),
|
|
@@ -12951,7 +12951,7 @@ const GetBrandIdentityResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
12951
12951
|
payload: z.object({}).passthrough().optional(),
|
|
12952
12952
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
12953
12953
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
12954
|
-
}).passthrough().and(z.union([GetBrandIdentitySuccessSchema, GetBrandIdentityErrorSchema])))();
|
|
12954
|
+
}).passthrough().and(z.union([GetBrandIdentitySuccessSchema, GetBrandIdentityErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
12955
12955
|
const GetRightsSuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
12956
12956
|
rights: z.array(z.object({
|
|
12957
12957
|
rights_id: z.string(),
|
|
@@ -12996,7 +12996,7 @@ const UpdateRightsSuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
|
12996
12996
|
generation_credentials: z.array(GenerationCredentialSchema),
|
|
12997
12997
|
rights_constraint: RightsConstraintSchema.and(z.object({}).passthrough()),
|
|
12998
12998
|
paused: z.boolean().optional(),
|
|
12999
|
-
implementation_date: z.
|
|
12999
|
+
implementation_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
|
|
13000
13000
|
context: ContextObjectSchema.optional(),
|
|
13001
13001
|
ext: ExtensionObjectSchema.optional()
|
|
13002
13002
|
}).passthrough())();
|
|
@@ -13055,10 +13055,10 @@ const ArtifactWebhookPayloadSchema = /* @__PURE__ */ (() => z.object({
|
|
|
13055
13055
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
13056
13056
|
media_buy_id: z.string(),
|
|
13057
13057
|
batch_id: z.string(),
|
|
13058
|
-
timestamp: z.
|
|
13058
|
+
timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
13059
13059
|
artifacts: z.array(z.object({
|
|
13060
13060
|
artifact: ArtifactSchema,
|
|
13061
|
-
delivered_at: z.
|
|
13061
|
+
delivered_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
13062
13062
|
impression_id: z.string().optional(),
|
|
13063
13063
|
package_id: z.string().optional()
|
|
13064
13064
|
}).passthrough()),
|
|
@@ -13236,8 +13236,8 @@ const FlightItemSchema = /* @__PURE__ */ (() => z.object({
|
|
|
13236
13236
|
airline: z.string().optional(),
|
|
13237
13237
|
price: PriceSchema.optional(),
|
|
13238
13238
|
description: z.string().optional(),
|
|
13239
|
-
departure_time: z.
|
|
13240
|
-
arrival_time: z.
|
|
13239
|
+
departure_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
13240
|
+
arrival_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
13241
13241
|
image_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
13242
13242
|
url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
13243
13243
|
tags: z.array(z.string()).optional(),
|
|
@@ -13336,7 +13336,7 @@ const HotelItemSchema = /* @__PURE__ */ (() => z.object({
|
|
|
13336
13336
|
const IndicatorBearingResourceStateSchema = /* @__PURE__ */ (() => z.object({
|
|
13337
13337
|
indicators: z.array(IndicatorSchema).optional(),
|
|
13338
13338
|
indicator_types_evaluated: z.array(IndicatorTypeSchema).optional(),
|
|
13339
|
-
indicators_as_of: z.
|
|
13339
|
+
indicators_as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
13340
13340
|
indicators_evaluated_scope: z.array(IndicatorScopeSchema).optional()
|
|
13341
13341
|
}).passthrough())();
|
|
13342
13342
|
const InstallmentDeliveryMetricsSchema = /* @__PURE__ */ (() => DeliveryMetricsSchema.merge(z.object({
|
|
@@ -13385,8 +13385,8 @@ const OfferingSchema = /* @__PURE__ */ (() => z.object({
|
|
|
13385
13385
|
name: z.string(),
|
|
13386
13386
|
description: z.string().optional(),
|
|
13387
13387
|
tagline: z.string().optional(),
|
|
13388
|
-
valid_from: z.
|
|
13389
|
-
valid_to: z.
|
|
13388
|
+
valid_from: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
13389
|
+
valid_to: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
13390
13390
|
checkout_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
13391
13391
|
landing_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
13392
13392
|
assets: z.array(OfferingAssetGroupSchema).optional(),
|
|
@@ -13423,7 +13423,7 @@ const InlineDeclarationSchema = /* @__PURE__ */ (() => z.object({}).passthrough(
|
|
|
13423
13423
|
format_shape: z.string().optional(),
|
|
13424
13424
|
v1_format_ref: z.array(FormatReferenceStructuredObjectSchema).optional(),
|
|
13425
13425
|
format_schema: PlatformExtensionReferenceSchema.optional()
|
|
13426
|
-
}).passthrough()).and(z.union([ImageFormatDeclarationSchema, HTML5FormatDeclarationSchema, DisplayTagFormatDeclarationSchema, ImageCarouselFormatDeclarationSchema, HostedVideoFormatDeclarationSchema, VASTVideoFormatDeclarationSchema, HostedAudioFormatDeclarationSchema, VASTAudioFormatDeclarationSchema, DAASTAudioFormatDeclarationSchema, SponsoredPlacementFormatDeclarationSchema, NativeInFeedFormatDeclarationSchema, ResponsiveCreativeFormatDeclarationSchema, AgentPlacementFormatDeclarationSchema, SellerRenderedStatefulDisplayFormatDeclarationSchema, CoordinatedPlacementsFormatDeclarationSchema, CustomFormatDeclarationSchema])))();
|
|
13426
|
+
}).passthrough()).and(z.union([ImageFormatDeclarationSchema, HTML5FormatDeclarationSchema, DisplayTagFormatDeclarationSchema, ImageCarouselFormatDeclarationSchema, HostedVideoFormatDeclarationSchema, VASTVideoFormatDeclarationSchema, HostedAudioFormatDeclarationSchema, VASTAudioFormatDeclarationSchema, DAASTAudioFormatDeclarationSchema, SponsoredPlacementFormatDeclarationSchema, NativeInFeedFormatDeclarationSchema, ResponsiveCreativeFormatDeclarationSchema, AgentPlacementFormatDeclarationSchema, SellerRenderedStatefulDisplayFormatDeclarationSchema, CoordinatedPlacementsFormatDeclarationSchema, CustomFormatDeclarationSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
13427
13427
|
const PublisherDOOHPlacementAttributesSchema = /* @__PURE__ */ (() => z.object({
|
|
13428
13428
|
slot_duration_seconds: z.int().min(1).optional(),
|
|
13429
13429
|
loop_duration_seconds: z.int().min(1).optional(),
|
|
@@ -13647,14 +13647,14 @@ const AuthorizationPayloadSchema = /* @__PURE__ */ (() => z.object({
|
|
|
13647
13647
|
delegation_type: z.union([z.literal("direct"), z.literal("delegated"), z.literal("ad_network")]).optional(),
|
|
13648
13648
|
exclusive: z.boolean().optional(),
|
|
13649
13649
|
signing_keys: z.array(AgentSigningKeySchema).optional(),
|
|
13650
|
-
effective_from: z.
|
|
13651
|
-
effective_until: z.
|
|
13650
|
+
effective_from: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
13651
|
+
effective_until: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
13652
13652
|
evidence: z.union([z.literal("adagents_json"), z.literal("agent_claim"), z.literal("community"), z.literal("override")]).optional(),
|
|
13653
13653
|
disputed: z.boolean().optional(),
|
|
13654
13654
|
created_by: z.string().optional().nullable(),
|
|
13655
|
-
expires_at: z.
|
|
13656
|
-
created_at: z.
|
|
13657
|
-
updated_at: z.
|
|
13655
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
|
|
13656
|
+
created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
|
|
13657
|
+
updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
|
|
13658
13658
|
override_applied: z.boolean().optional(),
|
|
13659
13659
|
override_reason: z.string().optional().nullable()
|
|
13660
13660
|
}).passthrough())();
|
|
@@ -13665,7 +13665,7 @@ const RegistryEventSchema = /* @__PURE__ */ (() => z.object({
|
|
|
13665
13665
|
entity_id: z.string(),
|
|
13666
13666
|
payload: z.object({}).passthrough(),
|
|
13667
13667
|
actor: z.string(),
|
|
13668
|
-
created_at: z.
|
|
13668
|
+
created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
13669
13669
|
}).passthrough().and(z.union([z.object({
|
|
13670
13670
|
event_type: z.literal("property.created"),
|
|
13671
13671
|
entity_type: z.literal("property").optional(),
|
|
@@ -13687,14 +13687,14 @@ const RegistryEventSchema = /* @__PURE__ */ (() => z.object({
|
|
|
13687
13687
|
entity_type: z.literal("property").optional(),
|
|
13688
13688
|
payload: z.object({
|
|
13689
13689
|
property_rid: z.uuid(),
|
|
13690
|
-
last_resolved_at: z.
|
|
13690
|
+
last_resolved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
13691
13691
|
reason: z.string().optional()
|
|
13692
13692
|
}).passthrough().optional()
|
|
13693
13693
|
}).passthrough(), z.object({
|
|
13694
13694
|
event_type: z.literal("property.reactivated"),
|
|
13695
13695
|
entity_type: z.literal("property").optional(),
|
|
13696
13696
|
payload: PropertyPayloadSchema.merge(z.object({
|
|
13697
|
-
reactivated_at: z.
|
|
13697
|
+
reactivated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
13698
13698
|
}).passthrough()).optional()
|
|
13699
13699
|
}).passthrough(), z.object({
|
|
13700
13700
|
event_type: z.literal("collection.created"),
|
|
@@ -13785,7 +13785,7 @@ const RegistryEventSchema = /* @__PURE__ */ (() => z.object({
|
|
|
13785
13785
|
event_type: z.literal("authorization.modified"),
|
|
13786
13786
|
entity_type: z.literal("authorization").optional(),
|
|
13787
13787
|
payload: AuthorizationPayloadSchema.optional()
|
|
13788
|
-
}).passthrough()])))();
|
|
13788
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
13789
13789
|
const ReportingCanonicalizationContractSchema = /* @__PURE__ */ (() => z.object({
|
|
13790
13790
|
contract_version: z.literal("1.0"),
|
|
13791
13791
|
media_type: z.literal("application/vnd.adcp.reporting-canonicalization+json"),
|
|
@@ -13908,7 +13908,7 @@ const GovernanceAgentNotAcceptedDetailsSchema = /* @__PURE__ */ (() => z.union([
|
|
|
13908
13908
|
disclosure: z.literal("opaque"),
|
|
13909
13909
|
rejection_ref: z.string().max(128).regex(/^[A-Za-z0-9_.:-]+$/).optional()
|
|
13910
13910
|
}).passthrough()]))();
|
|
13911
|
-
const VASTVersionMismatchDetailsSchema = /* @__PURE__ */ (() => z.union([AssetOutsideAcceptedVersionIntersectionSchema, InspectedDocumentVersionMismatchSchema, SupportedVersionsCompatibilityDetailsSchema]).and(z.object({
|
|
13911
|
+
const VASTVersionMismatchDetailsSchema = /* @__PURE__ */ (() => z.union([AssetOutsideAcceptedVersionIntersectionSchema, InspectedDocumentVersionMismatchSchema, SupportedVersionsCompatibilityDetailsSchema]).describe("Must also satisfy at least one of these alternatives.").and(z.object({
|
|
13912
13912
|
mismatch_reason: z.union([z.literal("asset_outside_acceptance"), z.literal("document_version_mismatch")]).optional(),
|
|
13913
13913
|
asset_vast_version: VASTVersionSchema.optional(),
|
|
13914
13914
|
observed_document_vast_version: z.string().optional().nullable(),
|
|
@@ -13922,13 +13922,13 @@ const BoundedValueLevel_2Schema = /* @__PURE__ */ (() => z.union([BoundedScalarS
|
|
|
13922
13922
|
const BoundedValueSchema = /* @__PURE__ */ (() => z.union([BoundedScalarSchema, z.array(BoundedValueLevel_2Schema), z.record(z.string(), BoundedValueLevel_2Schema)]))();
|
|
13923
13923
|
const AcceptancePolicyCatalogSchema = /* @__PURE__ */ (() => z.object({
|
|
13924
13924
|
catalog_version: z.string().min(1),
|
|
13925
|
-
generated_at: z.
|
|
13925
|
+
generated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
13926
13926
|
profiles: z.array(AcceptancePolicyProfileSchema).optional(),
|
|
13927
13927
|
registry_profiles: z.array(RegistryAcceptancePolicyProfileReferenceSchema).optional(),
|
|
13928
13928
|
ext: ExtensionObjectSchema.optional()
|
|
13929
13929
|
}).passthrough())();
|
|
13930
13930
|
const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
|
|
13931
|
-
const objectSchema = z.object({ "geo_countries": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE')."), z.null()]).optional(), "geo_countries_exclude": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Exclude specific countries from delivery. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE')."), z.null()]).optional(), "geo_regions": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Restrict delivery to exact canonical ISO 3166-2 subdivisions (states, provinces, regions, departments, or other subdivision categories). Unknown identifiers are invalid. At create or update, sellers MUST reject unsupported identifiers and MUST NOT silently widen, drop, or partially apply the list. During get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome. Exact internal translation preserves accepted identifiers in package readback."), z.null()]).optional(), "geo_regions_exclude": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Exclude exact canonical ISO 3166-2 subdivisions. Support is independent from geo_regions inclusion support. Unknown identifiers and values also present in geo_regions are invalid. At create or update, sellers MUST reject unsupported identifiers and partial application; during get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome."), z.null()]).optional(), "geo_metros": z.union([z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict().describe("A targeted metro area.")).min(1).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities."), z.null().describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.")]).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_metros_exclude": z.union([z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes to exclude within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict()).min(1).describe("Exclude specific metro areas from delivery. Each entry specifies the classification system and excluded values. Seller must declare supported systems in get_adcp_capabilities."), z.null()]).optional(), "geo_postal_areas": z.union([z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })])).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Restrict delivery to specific postal areas. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities."), z.null()]).optional(), "geo_postal_areas_exclude": z.union([z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })])).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Exclude specific postal areas from delivery. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities."), z.null()]).optional(), "geo_places": z.union([z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))])).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Restrict delivery to catalog-backed named places. Values MUST be stable identifiers in the declared system, not display names. Sellers must declare supported systems, countries, and place types in get_adcp_capabilities and reject unsupported entries rather than silently dropping them."), z.null()]).optional(), "geo_places_exclude": z.union([z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))])).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Exclude catalog-backed named places. Uses the same identifier-based shape as geo_places. Sellers MUST reject overlap with geo_places for the same country, system, place_type, and value."), z.null()]).optional(), "daypart_targets": z.union([z.array(z.object({ "days": z.array(z.enum(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]).describe("Days of the week for daypart targeting")).min(1).describe("Days of week this window applies to. Use multiple days for compact targeting (e.g., monday-friday in one object)."), "start_hour": z.number().int().gte(0).lte(23).describe("Start hour (inclusive), 0-23 in 24-hour format. 0 = midnight, 6 = 6:00am, 18 = 6:00pm."), "end_hour": z.number().int().gte(1).lte(24).describe("End hour (exclusive), 1-24 in 24-hour format. 10 = 10:00am, 24 = midnight. Must be greater than start_hour."), "timezone": z.union([z.literal("inventory_local"), z.any().refine((value) => !z.literal("inventory_local").safeParse(value).success, "Invalid input: Should NOT be valid against schema").describe("Concrete timezone identifier in the implementation's supported IANA Time Zone Database, such as America/New_York, CET, or UTC.")]).describe("Civil-time clock used to evaluate this window. 'inventory_local' evaluates the hours in the seller-assigned local timezone of each inventory unit that can deliver the impression, such as a screen, venue, station, or publisher property; it never means the buyer, account, or server timezone. A concrete IANA timezone identifier (for example, 'America/New_York', 'CET', or 'UTC') evaluates one shared civil-time clock across the targeted inventory. Omission defaults to 'inventory_local'. Buyers that begin with a user or account preference MUST resolve it to a concrete IANA identifier before sending the daypart; 'user_timezone' and 'account_timezone' are not wire values. For each candidate delivery instant, convert the instant into this clock and compare its resulting local day and hour with the half-open window: a skipped DST hour has no matching instants, while both occurrences of a repeated hour match. This delivery clock is independent of reporting_capabilities.timezone.").default("inventory_local"), "label": z.string().describe("Optional human-readable name for this time window (e.g., 'Morning Drive', 'Prime Time')").optional() }).strict().describe("A time window for daypart targeting. Specifies days of week, an hour range, and the civil-time clock used to evaluate it. start_hour is inclusive, end_hour is exclusive (e.g., 6-10 = 6:00am to 10:00am). Follows the Google Ads AdScheduleInfo / DV360 DayPartTargeting pattern.")).min(1).describe("Restrict delivery to specific time windows. Each entry specifies days of week, an hour range, and an optional timezone that defaults to inventory_local. A concrete IANA zone uses one shared civil-time clock, while inventory_local evaluates each inventory unit in its seller-assigned local timezone. Entries are independent and MAY use different clocks."), z.null()]).optional(), "axe_include_segment": z.union([z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to include for targeting."), z.null()]).optional(), "axe_exclude_segment": z.union([z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to exclude from targeting."), z.null()]).optional(), "audience_include": z.union([z.array(z.string()).min(1).describe("Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "audience_exclude": z.union([z.array(z.string()).min(1).describe("Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "signal_targeting_groups": z.union([z.object({ "operator": z.literal("all").describe("Groups-level operator. Required even though v1 only supports 'all': every child group must be satisfied."), "groups": z.array(z.object({ "operator": z.enum(["any", "none"]).describe("How to evaluate the signals in this group. 'any' is an OR include group. 'none' is an exclusion group equivalent to NOT (A OR B OR C)."), "signals": z.array(z.object({ "pricing_option_id": z.string().describe("Pricing option selected for this signal. Use the pricing_option_id from the product's signal_targeting_options entry when product-scoped pricing is present; otherwise use the seller get_signals pricing only when the product option does not override it. Required when the selected signal has pricing_options; omit only when the signal is bundled into the product price or has no incremental cost.").optional(), "signal_agent_segment_id": z.string().describe("Optional opaque resolved-segment or seller execution handle for this signal. Omit when signal_ref plus the value expression is sufficient for the seller to resolve the signal. Include when the product option exposes a separate runtime or activation handle, and pass it verbatim. Buyers SHOULD prefer an exposed segment handle over reconstructing condition identity from categorical values because the handle can carry provider namespace and methodology distinctions.").optional(), "activation_key": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
|
|
13931
|
+
const objectSchema = z.object({ "geo_countries": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE')."), z.null()]).optional(), "geo_countries_exclude": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Exclude specific countries from delivery. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE')."), z.null()]).optional(), "geo_regions": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Restrict delivery to exact canonical ISO 3166-2 subdivisions (states, provinces, regions, departments, or other subdivision categories). Unknown identifiers are invalid. At create or update, sellers MUST reject unsupported identifiers and MUST NOT silently widen, drop, or partially apply the list. During get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome. Exact internal translation preserves accepted identifiers in package readback."), z.null()]).optional(), "geo_regions_exclude": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Exclude exact canonical ISO 3166-2 subdivisions. Support is independent from geo_regions inclusion support. Unknown identifiers and values also present in geo_regions are invalid. At create or update, sellers MUST reject unsupported identifiers and partial application; during get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome."), z.null()]).optional(), "geo_metros": z.union([z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict().describe("A targeted metro area.")).min(1).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities."), z.null().describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.")]).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_metros_exclude": z.union([z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes to exclude within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict()).min(1).describe("Exclude specific metro areas from delivery. Each entry specifies the classification system and excluded values. Seller must declare supported systems in get_adcp_capabilities."), z.null()]).optional(), "geo_postal_areas": z.union([z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })]).describe("Must also satisfy at least one of these alternatives.")).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Restrict delivery to specific postal areas. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities."), z.null()]).optional(), "geo_postal_areas_exclude": z.union([z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })]).describe("Must also satisfy at least one of these alternatives.")).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Exclude specific postal areas from delivery. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities."), z.null()]).optional(), "geo_places": z.union([z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Restrict delivery to catalog-backed named places. Values MUST be stable identifiers in the declared system, not display names. Sellers must declare supported systems, countries, and place types in get_adcp_capabilities and reject unsupported entries rather than silently dropping them."), z.null()]).optional(), "geo_places_exclude": z.union([z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Exclude catalog-backed named places. Uses the same identifier-based shape as geo_places. Sellers MUST reject overlap with geo_places for the same country, system, place_type, and value."), z.null()]).optional(), "daypart_targets": z.union([z.array(z.object({ "days": z.array(z.enum(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]).describe("Days of the week for daypart targeting")).min(1).describe("Days of week this window applies to. Use multiple days for compact targeting (e.g., monday-friday in one object)."), "start_hour": z.number().int().gte(0).lte(23).describe("Start hour (inclusive), 0-23 in 24-hour format. 0 = midnight, 6 = 6:00am, 18 = 6:00pm."), "end_hour": z.number().int().gte(1).lte(24).describe("End hour (exclusive), 1-24 in 24-hour format. 10 = 10:00am, 24 = midnight. Must be greater than start_hour."), "timezone": z.union([z.literal("inventory_local"), z.any().refine((value) => !z.literal("inventory_local").safeParse(value).success, "Invalid input: Should NOT be valid against schema").describe("Concrete timezone identifier in the implementation's supported IANA Time Zone Database, such as America/New_York, CET, or UTC.")]).describe("Civil-time clock used to evaluate this window. 'inventory_local' evaluates the hours in the seller-assigned local timezone of each inventory unit that can deliver the impression, such as a screen, venue, station, or publisher property; it never means the buyer, account, or server timezone. A concrete IANA timezone identifier (for example, 'America/New_York', 'CET', or 'UTC') evaluates one shared civil-time clock across the targeted inventory. Omission defaults to 'inventory_local'. Buyers that begin with a user or account preference MUST resolve it to a concrete IANA identifier before sending the daypart; 'user_timezone' and 'account_timezone' are not wire values. For each candidate delivery instant, convert the instant into this clock and compare its resulting local day and hour with the half-open window: a skipped DST hour has no matching instants, while both occurrences of a repeated hour match. This delivery clock is independent of reporting_capabilities.timezone.").default("inventory_local"), "label": z.string().describe("Optional human-readable name for this time window (e.g., 'Morning Drive', 'Prime Time')").optional() }).strict().describe("A time window for daypart targeting. Specifies days of week, an hour range, and the civil-time clock used to evaluate it. start_hour is inclusive, end_hour is exclusive (e.g., 6-10 = 6:00am to 10:00am). Follows the Google Ads AdScheduleInfo / DV360 DayPartTargeting pattern.")).min(1).describe("Restrict delivery to specific time windows. Each entry specifies days of week, an hour range, and an optional timezone that defaults to inventory_local. A concrete IANA zone uses one shared civil-time clock, while inventory_local evaluates each inventory unit in its seller-assigned local timezone. Entries are independent and MAY use different clocks."), z.null()]).optional(), "axe_include_segment": z.union([z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to include for targeting."), z.null()]).optional(), "axe_exclude_segment": z.union([z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to exclude from targeting."), z.null()]).optional(), "audience_include": z.union([z.array(z.string()).min(1).describe("Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "audience_exclude": z.union([z.array(z.string()).min(1).describe("Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "signal_targeting_groups": z.union([z.object({ "operator": z.literal("all").describe("Groups-level operator. Required even though v1 only supports 'all': every child group must be satisfied."), "groups": z.array(z.object({ "operator": z.enum(["any", "none"]).describe("How to evaluate the signals in this group. 'any' is an OR include group. 'none' is an exclusion group equivalent to NOT (A OR B OR C)."), "signals": z.array(z.object({ "pricing_option_id": z.string().describe("Pricing option selected for this signal. Use the pricing_option_id from the product's signal_targeting_options entry when product-scoped pricing is present; otherwise use the seller get_signals pricing only when the product option does not override it. Required when the selected signal has pricing_options; omit only when the signal is bundled into the product price or has no incremental cost.").optional(), "signal_agent_segment_id": z.string().describe("Optional opaque resolved-segment or seller execution handle for this signal. Omit when signal_ref plus the value expression is sufficient for the seller to resolve the signal. Include when the product option exposes a separate runtime or activation handle, and pass it verbatim. Buyers SHOULD prefer an exposed segment handle over reconstructing condition identity from categorical values because the handle can carry provider namespace and methodology distinctions.").optional(), "activation_key": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
|
|
13932
13932
|
const schemas = [z.object({ "type": z.literal("segment_id").describe("Segment ID based targeting"), "segment_id": z.string().describe("The platform-specific segment identifier to use in campaign targeting") }).catchall(z.any()), z.object({ "type": z.literal("key_value").describe("Key-value pair based targeting"), "key": z.string().describe("The targeting parameter key"), "value": z.string().describe("The targeting parameter value") }).catchall(z.any())];
|
|
13933
13933
|
const { errors, failed } = schemas.reduce(
|
|
13934
13934
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
@@ -14029,7 +14029,7 @@ const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
|
|
|
14029
14029
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
14030
14030
|
});
|
|
14031
14031
|
}
|
|
14032
|
-
}).describe("Named signal being targeted."), "value_type": z.literal("numeric").describe("Discriminator for numeric signals."), "min_value": z.number().describe("Minimum value, inclusive. Omit for no minimum. Should be within the signal definition's range when declared.").optional(), "max_value": z.number().describe("Maximum value, inclusive. Omit for no maximum. Should be within the signal definition's range when declared.").optional() }).catchall(z.any()).and(z.union([z.object({ "min_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Numeric signal expression - target users within a value range. At least one of min_value or max_value is required. If both min_value and max_value are provided, min_value MUST be <= max_value.")];
|
|
14032
|
+
}).describe("Named signal being targeted."), "value_type": z.literal("numeric").describe("Discriminator for numeric signals."), "min_value": z.number().describe("Minimum value, inclusive. Omit for no minimum. Should be within the signal definition's range when declared.").optional(), "max_value": z.number().describe("Maximum value, inclusive. Omit for no maximum. Should be within the signal definition's range when declared.").optional() }).catchall(z.any()).and(z.union([z.object({ "min_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Numeric signal expression - target users within a value range. At least one of min_value or max_value is required. If both min_value and max_value are provided, min_value MUST be <= max_value.")];
|
|
14033
14033
|
const { errors, failed } = schemas.reduce(
|
|
14034
14034
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
14035
14035
|
errors: [...errors2, ...result.error.issues],
|
|
@@ -14104,7 +14104,7 @@ const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
|
|
|
14104
14104
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
14105
14105
|
});
|
|
14106
14106
|
}
|
|
14107
|
-
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("binary").describe("Discriminator for binary signals"), "value": z.boolean().describe("Whether to include (true) or exclude (false) users matching this signal") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Binary signal targeting - user either matches or doesn't"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
|
|
14107
|
+
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("binary").describe("Discriminator for binary signals"), "value": z.boolean().describe("Whether to include (true) or exclude (false) users matching this signal") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Binary signal targeting - user either matches or doesn't"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
|
|
14108
14108
|
const schemas2 = [z.object({ "scope": z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Product-local signal identifier. For local signals exposed on both get_signals and get_products, this MUST match get_signals.signals[].signal_ref.signal_id for the same signal.") }).catchall(z.any()).describe("Product-scoped signal. The signal_id is meaningful only within the selected product/package context and MUST match a Product.included_signals[].signal_ref.signal_id or Product.signal_targeting_options[].signal_ref.signal_id for that product, depending on whether the signal is descriptive or selectable."), z.object({ "scope": z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that publishes the signal definition in its adagents.json signals[]."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(z.any()).describe("Data-provider-scoped signal. The signal_id resolves through the data provider's published adagents.json signals[] and can be authorization-verified there."), z.object({ "scope": z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(z.any()).describe("Signal-source-scoped signal. Use this for source-native signals that are not published in upstream adagents.json signals[]. The buyer trusts the issuing signal source for this identity; use scope 'data_provider' instead when the signal is published in adagents.json signals[], even if the publisher is also the seller or signal source.")];
|
|
14109
14109
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
14110
14110
|
({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
|
|
@@ -14154,7 +14154,7 @@ const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
|
|
|
14154
14154
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
14155
14155
|
});
|
|
14156
14156
|
}
|
|
14157
|
-
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("categorical").describe("Discriminator for categorical signals"), "values": z.array(z.string()).min(1).describe("Values to target. Users with any of these values will be included.") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Categorical signal targeting - target users with specific values"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
|
|
14157
|
+
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("categorical").describe("Discriminator for categorical signals"), "values": z.array(z.string()).min(1).describe("Values to target. Users with any of these values will be included.") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Categorical signal targeting - target users with specific values"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
|
|
14158
14158
|
const schemas2 = [z.object({ "scope": z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Product-local signal identifier. For local signals exposed on both get_signals and get_products, this MUST match get_signals.signals[].signal_ref.signal_id for the same signal.") }).catchall(z.any()).describe("Product-scoped signal. The signal_id is meaningful only within the selected product/package context and MUST match a Product.included_signals[].signal_ref.signal_id or Product.signal_targeting_options[].signal_ref.signal_id for that product, depending on whether the signal is descriptive or selectable."), z.object({ "scope": z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that publishes the signal definition in its adagents.json signals[]."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(z.any()).describe("Data-provider-scoped signal. The signal_id resolves through the data provider's published adagents.json signals[] and can be authorization-verified there."), z.object({ "scope": z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(z.any()).describe("Signal-source-scoped signal. Use this for source-native signals that are not published in upstream adagents.json signals[]. The buyer trusts the issuing signal source for this identity; use scope 'data_provider' instead when the signal is published in adagents.json signals[], even if the publisher is also the seller or signal source.")];
|
|
14159
14159
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
14160
14160
|
({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
|
|
@@ -14204,7 +14204,7 @@ const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
|
|
|
14204
14204
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
14205
14205
|
});
|
|
14206
14206
|
}
|
|
14207
|
-
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("numeric").describe("Discriminator for numeric signals"), "min_value": z.number().describe("Minimum value (inclusive). Omit for no minimum. Must be <= max_value when both are provided. Should be >= signal's range.min if defined.").optional(), "max_value": z.number().describe("Maximum value (inclusive). Omit for no maximum. Must be >= min_value when both are provided. Should be <= signal's range.max if defined.").optional() }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Numeric signal targeting - target users within a value range. If min_value is provided, it must be <= max_value. Values should be within the signal's defined range (see signal definition).")];
|
|
14207
|
+
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("numeric").describe("Discriminator for numeric signals"), "min_value": z.number().describe("Minimum value (inclusive). Omit for no minimum. Must be <= max_value when both are provided. Should be >= signal's range.min if defined.").optional(), "max_value": z.number().describe("Maximum value (inclusive). Omit for no maximum. Must be >= min_value when both are provided. Should be <= signal's range.max if defined.").optional() }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Numeric signal targeting - target users within a value range. If min_value is provided, it must be <= max_value. Values should be within the signal's defined range (see signal definition).")];
|
|
14208
14208
|
const { errors, failed } = schemas.reduce(
|
|
14209
14209
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
14210
14210
|
errors: [...errors2, ...result.error.issues],
|
|
@@ -14228,7 +14228,7 @@ const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
|
|
|
14228
14228
|
message: "Invalid input: Should pass single schema. Passed " + passed
|
|
14229
14229
|
});
|
|
14230
14230
|
}
|
|
14231
|
-
}).describe("Targeting constraint for a specific signal. Uses value_type as discriminator to determine the targeting expression format.")).min(1).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing."), z.null().describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.")]).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.").optional(), "demographics": z.union([z.object({ "age": z.intersection(z.object({ "min": z.number().int().gte(0).lte(150).describe("Inclusive minimum age in completed years. Omit for an open lower bound.").optional(), "max": z.number().int().gte(0).lte(150).describe("Inclusive maximum age in completed years. Omit for an open upper bound.").optional(), "include_unknown": z.boolean().describe("Whether delivery to people whose age is unavailable is part of this predicate. This field has no default and MUST be supplied.") }).catchall(z.any()).and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A canonical audience-age predicate in completed integer years. min and max are inclusive; omitting one bound means no restriction in that direction. At least one bound is required. include_unknown is always explicit because people whose age is unavailable are not members of any numeric interval. Implementations MUST reject min greater than max; JSON Schema draft-07 cannot compare sibling numeric values."), z.object({ "accepted_bases": z.array(z.enum(["verified", "declared", "inferred"]).describe("User-level bases that may resolve age for demographic targeting execution. Population estimates are deliberately absent because aggregate composition cannot establish an individual impression's age.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("User-level age determination bases the buyer permits for this predicate. Sellers MUST use only these bases or reject the request; they MUST NOT silently fall back to another basis. When omitted, the buyer imposes no determination-basis constraint beyond product capability and any age_restriction. population_estimate is structurally unavailable because aggregate evidence cannot identify an eligible user.").optional(), "accepted_verification_methods": z.array(z.enum(["facial_age_estimation", "id_document", "digital_id", "credit_card", "world_id"]).describe("Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Verification methods acceptable when verified is an accepted basis. This field narrows verified demographic execution; age_restriction.accepted_methods independently governs legal eligibility and the two sets are intersected when both are present.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "accepted_verification_methods": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "accepted_verification_methods": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "accepted_bases": z.any().refine((value) => !z.array(z.any().refine((value2) => !z.literal("verified").safeParse(value2).success, "Invalid input: Should NOT be valid against schema")).safeParse(value).success, "Invalid input: Should NOT be valid against schema") }))]))) }).catchall(z.any()).describe("Canonical demographic audience targeting intent with optional constraints on how age may be determined. This is distinct from age_restriction: demographics selects an audience, while age_restriction expresses a legal eligibility or verification floor. Fresh create/update targeting MUST compile exactly or be rejected. During get_products, a seller may offer a different configured predicate only through sparse targeting_resolution modifications on a distinguishable product_id; selecting that product accepts the alternative. Sellers never silently broaden, narrow, default, drop, or substitute the basis."), z.null()]).optional(), "frequency_cap": z.union([z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2."), z.null()]).optional(), "property_list": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list for targeting specific properties within this product. The package runs on the intersection of the product's publisher_properties and this list. Sellers SHOULD return a validation error if the product has property_targeting_allowed: false."), z.null()]).optional(), "property_list_exclude": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list whose properties must not carry the buyer's ads. Matched properties are removed from delivery. Use for brand-safety do-not-run lists (apps, sites). Exclude wins on overlap with property_list, and applies regardless of the product's property_targeting_allowed flag. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "collection_list": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for including specific collections (programs, publications, channels) within this product. The package runs on the intersection of matched collections and this list. Use for inclusion-based collection targeting. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "collection_list_exclude": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for excluding specific collections (programs, publications, channels) from this product. Matched collections must not carry the buyer's ads. Use for brand safety do-not-air lists. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "placement_selection": z.union([z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
|
|
14231
|
+
}).describe("Targeting constraint for a specific signal. Uses value_type as discriminator to determine the targeting expression format.")).min(1).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing."), z.null().describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.")]).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.").optional(), "demographics": z.union([z.object({ "age": z.intersection(z.object({ "min": z.number().int().gte(0).lte(150).describe("Inclusive minimum age in completed years. Omit for an open lower bound.").optional(), "max": z.number().int().gte(0).lte(150).describe("Inclusive maximum age in completed years. Omit for an open upper bound.").optional(), "include_unknown": z.boolean().describe("Whether delivery to people whose age is unavailable is part of this predicate. This field has no default and MUST be supplied.") }).catchall(z.any()).and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A canonical audience-age predicate in completed integer years. min and max are inclusive; omitting one bound means no restriction in that direction. At least one bound is required. include_unknown is always explicit because people whose age is unavailable are not members of any numeric interval. Implementations MUST reject min greater than max; JSON Schema draft-07 cannot compare sibling numeric values."), z.object({ "accepted_bases": z.array(z.enum(["verified", "declared", "inferred"]).describe("User-level bases that may resolve age for demographic targeting execution. Population estimates are deliberately absent because aggregate composition cannot establish an individual impression's age.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("User-level age determination bases the buyer permits for this predicate. Sellers MUST use only these bases or reject the request; they MUST NOT silently fall back to another basis. When omitted, the buyer imposes no determination-basis constraint beyond product capability and any age_restriction. population_estimate is structurally unavailable because aggregate evidence cannot identify an eligible user.").optional(), "accepted_verification_methods": z.array(z.enum(["facial_age_estimation", "id_document", "digital_id", "credit_card", "world_id"]).describe("Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Verification methods acceptable when verified is an accepted basis. This field narrows verified demographic execution; age_restriction.accepted_methods independently governs legal eligibility and the two sets are intersected when both are present.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "accepted_verification_methods": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "accepted_verification_methods": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "accepted_bases": z.any().refine((value) => !z.array(z.any().refine((value2) => !z.literal("verified").safeParse(value2).success, "Invalid input: Should NOT be valid against schema")).safeParse(value).success, "Invalid input: Should NOT be valid against schema") }))]).describe("Must also satisfy at least one of these alternatives."))) }).catchall(z.any()).describe("Canonical demographic audience targeting intent with optional constraints on how age may be determined. This is distinct from age_restriction: demographics selects an audience, while age_restriction expresses a legal eligibility or verification floor. Fresh create/update targeting MUST compile exactly or be rejected. During get_products, a seller may offer a different configured predicate only through sparse targeting_resolution modifications on a distinguishable product_id; selecting that product accepts the alternative. Sellers never silently broaden, narrow, default, drop, or substitute the basis."), z.null()]).optional(), "frequency_cap": z.union([z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2."), z.null()]).optional(), "property_list": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list for targeting specific properties within this product. The package runs on the intersection of the product's publisher_properties and this list. Sellers SHOULD return a validation error if the product has property_targeting_allowed: false."), z.null()]).optional(), "property_list_exclude": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list whose properties must not carry the buyer's ads. Matched properties are removed from delivery. Use for brand-safety do-not-run lists (apps, sites). Exclude wins on overlap with property_list, and applies regardless of the product's property_targeting_allowed flag. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "collection_list": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for including specific collections (programs, publications, channels) within this product. The package runs on the intersection of matched collections and this list. Use for inclusion-based collection targeting. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "collection_list_exclude": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for excluding specific collections (programs, publications, channels) from this product. Matched collections must not carry the buyer's ads. Use for brand safety do-not-air lists. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "placement_selection": z.union([z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
|
|
14232
14232
|
const schemas = [z.object({ "mode": z.literal("selected"), "placement_refs": z.array(z.union([z.intersection(z.object({ "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring a publisher-catalog placement is hosted, or the inventory publisher associated with an inline placement. Omitted only for legacy single-publisher product-context references.").optional(), "placement_id": z.string().describe("Placement ID from the publisher's adagents.json placement catalog, or an inline seller-defined placement ID interpreted within the enclosing seller and product context.") }).catchall(z.any()).describe("Legacy-compatible product-context reference to a placement. For publisher-catalog placements, publisher_domain plus placement_id resolves the declaration in that publisher's adagents.json. For seller-inline placements, the enclosing seller and product supply scope. When publisher_domain is omitted on legacy inputs, receivers MAY interpret the ID relative to the enclosing single-publisher product. Use placement-identity.json when a self-contained cross-document identity is required."), z.object({ "publisher_domain": z.any().refine((value) => value !== void 0, "Required") }).passthrough()), z.any().superRefine((x2, ctx2) => {
|
|
14233
14233
|
const schemas2 = [z.object({ "kind": z.literal("publisher_ref"), "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain whose adagents.json declares placement_id."), "placement_id": z.string().min(1) }).strict(), z.object({ "kind": z.literal("seller_inline"), "seller_agent": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("The seller agent's API endpoint URL as declared in the property publisher's adagents.json `authorized_agents[].url`. MUST use the `https://` scheme. Receivers compare this URL against the `authorized_agents` list using the AdCP URL canonicalization rules \u2014 not byte-equality \u2014 and reject mismatches with `seller_not_authorized`. See docs/reference/url-canonicalization."), "id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).min(1).describe("Reserved for a future registry-assigned stable seller identifier. Not used today \u2014 senders MUST NOT populate this field until a registry is defined. When a future release populates both `agent_url` and `id`, `agent_url` remains authoritative and `id` is advisory.").optional() }).strict().describe("Sales agent that defines and maintains the inline placement namespace."), "placement_id": z.string().min(1).describe("Stable placement ID within the defining sales agent's namespace. The agent MUST NOT reuse it for a different semantic placement.") }).strict()];
|
|
14234
14234
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
@@ -14406,12 +14406,12 @@ const ProposalRefinementSchema = /* @__PURE__ */ (() => z.object({
|
|
|
14406
14406
|
action: z.literal("finalize")
|
|
14407
14407
|
}).passthrough(), z.union([z.object({}).passthrough(), z.object({
|
|
14408
14408
|
change_kind: z.literal("cancellation")
|
|
14409
|
-
}).passthrough()])])))();
|
|
14409
|
+
}).passthrough()])]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
14410
14410
|
const PropertyFeatureResultSchema = /* @__PURE__ */ (() => z.object({
|
|
14411
14411
|
property: PropertyIDSchema,
|
|
14412
14412
|
features: z.record(z.string(), PropertyFeatureValueSchema).optional(),
|
|
14413
14413
|
coverage_status: z.union([z.literal("covered"), z.literal("not_covered"), z.literal("pending")]),
|
|
14414
|
-
last_evaluated: z.
|
|
14414
|
+
last_evaluated: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
14415
14415
|
ext: ExtensionObjectSchema.optional()
|
|
14416
14416
|
}).passthrough())();
|
|
14417
14417
|
const PackageFormatSnapshotSchema = /* @__PURE__ */ (() => ProductFormatDeclarationSchema.and(z.object({}).passthrough()).and(z.object({
|
|
@@ -14728,7 +14728,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
14728
14728
|
message: "Invalid input: Should pass single schema. Passed " + passed
|
|
14729
14729
|
});
|
|
14730
14730
|
}
|
|
14731
|
-
})).describe('Discriminated reference to a product format option. The global canonical shape is still named by `format_kind`; this reference selects one concrete product `format_options[]` entry. `scope: "publisher"` identifies a publisher-declared catalog option by `{ publisher_domain, format_option_id }`. `scope: "product"` identifies a product-local option by `format_option_id`; the enclosing package/product context supplies the namespace.')).min(1).describe("Canonical format options selected from the published product offer. Legacy named-format identifiers are not accepted.").optional(), "catalog_ids": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Previously synchronized account catalog IDs promoted by this selection. Callers manage catalog bodies through sync_catalogs rather than inlining them here.").optional(), "budget": z.number().gte(0).describe("Hard spend cap for this selection in the media-buy currency. In seller-optimized allocation it is an optional ceiling, not a reserved allocation, and requires advertised media_buy.features.seller_optimized_package_budgets; otherwise rejected with UNSUPPORTED_FEATURE before any over-subscription validation.").optional(), "daily_budget_cap": z.number().gte(0).describe("Optional hard daily spend ceiling for this purchase. It is subordinate to the media-buy aggregate daily cap and is not a reserved daily allocation. Its day boundary is the media buy's budget_cap_timezone.").optional(), "min_spend_target": z.number().gte(0).describe("Soft lifetime spend target for seller-optimized allocation. Requires advertised media_buy.features.seller_optimized_min_spend_targets; otherwise rejected with UNSUPPORTED_FEATURE before any over-subscription validation.").optional(), "impressions": z.number().gte(0).optional(), "start_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "end_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "pacing": z.enum(["even", "asap", "front_loaded"]).describe("Purchase pacing, subordinate to media-buy pacing. In seller-optimized allocation, pacing that differs from the media-buy pacing requires advertised media_buy.features.seller_optimized_package_pacing; otherwise rejected with UNSUPPORTED_FEATURE.").optional(), "bidding": z.object({ "automatic": z.literal(true).describe("Explicitly use seller/provider automatic bidding at this authored scope. At package scope this is a complete override of a media-buy policy, not inheritance. It MUST be the only field in the block and MUST be preserved on readback.").optional(), "bid_amount": z.number().gt(0).describe("Manual auction bid denominated in the media-buy currency and expressed per the selected pricing option's auction unit. For example, a CPM option interprets the amount per thousand impressions. This is the amount submitted to the auction, not a promise that the clearing price equals it. Requires an auction-priced pricing option whose currency equals the media-buy currency.").optional(), "max_bid": z.number().gt(0).describe("Hard per-auction ceiling denominated in the media-buy currency and expressed per the selected pricing option's auction unit. This is the only canonical hard auction ceiling and MUST NOT be translated into an average outcome-cost control. Requires an auction-priced pricing option whose currency equals the media-buy currency. May stand alone or supplement cost_per/roas only when the relevant scope capability advertises that combination.").optional(), "cost_per": z.object({ "amount": z.number().gt(0).describe("Average cost amount per scope-bound primary-goal result, denominated in the media-buy currency."), "strength": z.enum(["cap", "target"]).describe("`cap` optimizes for an average at or below the amount and accepts underdelivery when necessary; `target` optimizes around the amount while balancing volume and spend. Neither is a per-result or per-auction guarantee.") }).passthrough().describe("Average cost control per result of the scope-bound primary optimization goal. At seller-optimized media-buy scope it binds to budget_allocation.optimization_goals; at package scope it binds to that package's optimization_goals; at fixed media-buy scope it binds independently to each inheriting package and is valid only when their primary-goal result units are compatible. Metric goals are compatible only when metric and every result-defining qualifier match; vendor_metric goals only when vendor and metric_id match; event goals only when the event_type/custom_event_name set and resolved attribution_window match. Primary is the earliest array entry among goals tied for the lowest explicit numeric priority; unprioritized goals follow explicitly prioritized goals; when all priorities are absent, the first entry is primary.").optional(), "roas": z.object({ "value": z.number().gt(0).describe("Return per unit of ad spend; 4 means 4 units of value per 1 unit spent."), "strength": z.enum(["floor", "target"]).describe("`floor` prefers underdelivery to knowingly optimizing below the requested return; `target` optimizes around the requested return. Neither guarantees realized return.") }).passthrough().describe("Dimensionless return-on-ad-spend control bound to the same scope-specific primary goal rules as cost_per. The bound goal must be value-bearing; a fixed media-buy default requires a value-bearing primary goal on every inheriting package. Every referenced value-bearing event source MUST declare value_currencies containing the media-buy currency. The seller validates this at buy creation; each buy consumes only exact-currency records, while other declared currencies remain available to other buys. Sellers MUST NOT perform currency conversion.").optional() }).passthrough().and(z.any().refine((value) => !z.union([z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "max_bid": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "cost_per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "roas": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required"), "max_bid": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required"), "cost_per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required"), "roas": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "cost_per": z.any().refine((value2) => value2 !== void 0, "Required"), "roas": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema")).describe("Buyer-authored execution policy for automatic delivery, auction bidding, average outcome cost, or return on ad spend. The containing object determines authored scope: media-buy `bidding` is a complete inherited default and package `bidding` is a complete package override. Sellers MUST preserve authored scope on readback and MUST NOT copy an inherited media-buy policy into package `bidding`. Every monetary field in this block is denominated in the media-buy currency; the selected pricing option supplies the auction unit, never another denomination. Auction-unit identity is the pricing_model plus every canonical billing-event qualifier after defaults are applied: for example CPV view threshold, CPP demographic system/demographic, CPA event tuple, time time_unit, and flat-rate/DOOH parameters. An extension qualifier participates only when its registered extension specification explicitly defines how it contributes to auction-unit identity. A media-buy bid_amount or max_bid is valid only when every inheriting package resolves the same auction-unit identity. Every affected pricing option MUST use the media-buy currency; split currency-mismatched packages into separate buys. Seller-optimized media-buy cost_per/roas bind to the primary budget_allocation.optimization_goals goal. Package-authored cost_per/roas bind to the package primary optimization goal. The primary goal is the earliest array entry among goals with the lowest explicit numeric priority; unprioritized goals follow explicitly prioritized goals; when all priorities are absent, the first entry is primary. In fixed allocation, an inherited media-buy cost_per is valid only when all inheriting packages have compatible primary-goal result units; inherited roas requires value-bearing primary goals on every inheriting package. Canonical ROAS requires each value-bearing event source to declare the media-buy currency in value_currencies; each buy consumes only exact-currency records and sellers MUST NOT convert them. Absence invokes inheritance or provider automatic delivery; `{automatic:true}` is an explicit authored policy that overrides inheritance. Sellers MUST reject unsupported modes, combinations, units, currency, goal bindings, or native placements before any provider mutation and MUST NOT silently translate semantics.").refine((value) => Object.keys(value).length >= 1, "Object must contain at least 1 property").optional(), "targeting_overlay": z.object({ "geo_countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_countries_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Exclude specific countries from delivery. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_regions": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Restrict delivery to exact canonical ISO 3166-2 subdivisions (states, provinces, regions, departments, or other subdivision categories). Unknown identifiers are invalid. At create or update, sellers MUST reject unsupported identifiers and MUST NOT silently widen, drop, or partially apply the list. During get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome. Exact internal translation preserves accepted identifiers in package readback.").optional(), "geo_regions_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Exclude exact canonical ISO 3166-2 subdivisions. Support is independent from geo_regions inclusion support. Unknown identifiers and values also present in geo_regions are invalid. At create or update, sellers MUST reject unsupported identifiers and partial application; during get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome.").optional(), "geo_metros": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).passthrough().describe("A targeted metro area.")).min(1).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_metros_exclude": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes to exclude within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).passthrough()).min(1).describe("Exclude specific metro areas from delivery. Each entry specifies the classification system and excluded values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).passthrough().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })])).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).passthrough()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Restrict delivery to specific postal areas. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas_exclude": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).passthrough().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })])).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).passthrough()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Exclude specific postal areas from delivery. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_places": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))])).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Restrict delivery to catalog-backed named places. Values MUST be stable identifiers in the declared system, not display names. Sellers must declare supported systems, countries, and place types in get_adcp_capabilities and reject unsupported entries rather than silently dropping them.").optional(), "geo_places_exclude": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))])).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Exclude catalog-backed named places. Uses the same identifier-based shape as geo_places. Sellers MUST reject overlap with geo_places for the same country, system, place_type, and value.").optional(), "daypart_targets": z.array(z.object({ "days": z.array(z.enum(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]).describe("Days of the week for daypart targeting")).min(1).describe("Days of week this window applies to. Use multiple days for compact targeting (e.g., monday-friday in one object)."), "start_hour": z.number().int().gte(0).lte(23).describe("Start hour (inclusive), 0-23 in 24-hour format. 0 = midnight, 6 = 6:00am, 18 = 6:00pm."), "end_hour": z.number().int().gte(1).lte(24).describe("End hour (exclusive), 1-24 in 24-hour format. 10 = 10:00am, 24 = midnight. Must be greater than start_hour."), "timezone": z.union([z.literal("inventory_local"), z.any().refine((value) => !z.literal("inventory_local").safeParse(value).success, "Invalid input: Should NOT be valid against schema").describe("Concrete timezone identifier in the implementation's supported IANA Time Zone Database, such as America/New_York, CET, or UTC.")]).describe("Civil-time clock used to evaluate this window. 'inventory_local' evaluates the hours in the seller-assigned local timezone of each inventory unit that can deliver the impression, such as a screen, venue, station, or publisher property; it never means the buyer, account, or server timezone. A concrete IANA timezone identifier (for example, 'America/New_York', 'CET', or 'UTC') evaluates one shared civil-time clock across the targeted inventory. Omission defaults to 'inventory_local'. Buyers that begin with a user or account preference MUST resolve it to a concrete IANA identifier before sending the daypart; 'user_timezone' and 'account_timezone' are not wire values. For each candidate delivery instant, convert the instant into this clock and compare its resulting local day and hour with the half-open window: a skipped DST hour has no matching instants, while both occurrences of a repeated hour match. This delivery clock is independent of reporting_capabilities.timezone.").default("inventory_local"), "label": z.string().describe("Optional human-readable name for this time window (e.g., 'Morning Drive', 'Prime Time')").optional() }).passthrough().describe("A time window for daypart targeting. Specifies days of week, an hour range, and the civil-time clock used to evaluate it. start_hour is inclusive, end_hour is exclusive (e.g., 6-10 = 6:00am to 10:00am). Follows the Google Ads AdScheduleInfo / DV360 DayPartTargeting pattern.")).min(1).describe("Restrict delivery to specific time windows. Each entry specifies days of week, an hour range, and an optional timezone that defaults to inventory_local. A concrete IANA zone uses one shared civil-time clock, while inventory_local evaluates each inventory unit in its seller-assigned local timezone. Entries are independent and MAY use different clocks.").optional(), "axe_include_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to include for targeting.").optional(), "axe_exclude_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to exclude from targeting.").optional(), "audience_include": z.array(z.string()).min(1).describe("Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities.").optional(), "audience_exclude": z.array(z.string()).min(1).describe("Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities.").optional(), "signal_targeting_groups": z.object({ "operator": z.literal("all").describe("Groups-level operator. Required even though v1 only supports 'all': every child group must be satisfied."), "groups": z.array(z.object({ "operator": z.enum(["any", "none"]).describe("How to evaluate the signals in this group. 'any' is an OR include group. 'none' is an exclusion group equivalent to NOT (A OR B OR C)."), "signals": z.array(z.object({ "pricing_option_id": z.string().describe("Pricing option selected for this signal. Use the pricing_option_id from the product's signal_targeting_options entry when product-scoped pricing is present; otherwise use the seller get_signals pricing only when the product option does not override it. Required when the selected signal has pricing_options; omit only when the signal is bundled into the product price or has no incremental cost.").optional(), "signal_agent_segment_id": z.string().describe("Optional opaque resolved-segment or seller execution handle for this signal. Omit when signal_ref plus the value expression is sufficient for the seller to resolve the signal. Include when the product option exposes a separate runtime or activation handle, and pass it verbatim. Buyers SHOULD prefer an exposed segment handle over reconstructing condition identity from categorical values because the handle can carry provider namespace and methodology distinctions.").optional(), "activation_key": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
|
|
14731
|
+
})).describe('Discriminated reference to a product format option. The global canonical shape is still named by `format_kind`; this reference selects one concrete product `format_options[]` entry. `scope: "publisher"` identifies a publisher-declared catalog option by `{ publisher_domain, format_option_id }`. `scope: "product"` identifies a product-local option by `format_option_id`; the enclosing package/product context supplies the namespace.')).min(1).describe("Canonical format options selected from the published product offer. Legacy named-format identifiers are not accepted.").optional(), "catalog_ids": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Previously synchronized account catalog IDs promoted by this selection. Callers manage catalog bodies through sync_catalogs rather than inlining them here.").optional(), "budget": z.number().gte(0).describe("Hard spend cap for this selection in the media-buy currency. In seller-optimized allocation it is an optional ceiling, not a reserved allocation, and requires advertised media_buy.features.seller_optimized_package_budgets; otherwise rejected with UNSUPPORTED_FEATURE before any over-subscription validation.").optional(), "daily_budget_cap": z.number().gte(0).describe("Optional hard daily spend ceiling for this purchase. It is subordinate to the media-buy aggregate daily cap and is not a reserved daily allocation. Its day boundary is the media buy's budget_cap_timezone.").optional(), "min_spend_target": z.number().gte(0).describe("Soft lifetime spend target for seller-optimized allocation. Requires advertised media_buy.features.seller_optimized_min_spend_targets; otherwise rejected with UNSUPPORTED_FEATURE before any over-subscription validation.").optional(), "impressions": z.number().gte(0).optional(), "start_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "end_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "pacing": z.enum(["even", "asap", "front_loaded"]).describe("Purchase pacing, subordinate to media-buy pacing. In seller-optimized allocation, pacing that differs from the media-buy pacing requires advertised media_buy.features.seller_optimized_package_pacing; otherwise rejected with UNSUPPORTED_FEATURE.").optional(), "bidding": z.object({ "automatic": z.literal(true).describe("Explicitly use seller/provider automatic bidding at this authored scope. At package scope this is a complete override of a media-buy policy, not inheritance. It MUST be the only field in the block and MUST be preserved on readback.").optional(), "bid_amount": z.number().gt(0).describe("Manual auction bid denominated in the media-buy currency and expressed per the selected pricing option's auction unit. For example, a CPM option interprets the amount per thousand impressions. This is the amount submitted to the auction, not a promise that the clearing price equals it. Requires an auction-priced pricing option whose currency equals the media-buy currency.").optional(), "max_bid": z.number().gt(0).describe("Hard per-auction ceiling denominated in the media-buy currency and expressed per the selected pricing option's auction unit. This is the only canonical hard auction ceiling and MUST NOT be translated into an average outcome-cost control. Requires an auction-priced pricing option whose currency equals the media-buy currency. May stand alone or supplement cost_per/roas only when the relevant scope capability advertises that combination.").optional(), "cost_per": z.object({ "amount": z.number().gt(0).describe("Average cost amount per scope-bound primary-goal result, denominated in the media-buy currency."), "strength": z.enum(["cap", "target"]).describe("`cap` optimizes for an average at or below the amount and accepts underdelivery when necessary; `target` optimizes around the amount while balancing volume and spend. Neither is a per-result or per-auction guarantee.") }).passthrough().describe("Average cost control per result of the scope-bound primary optimization goal. At seller-optimized media-buy scope it binds to budget_allocation.optimization_goals; at package scope it binds to that package's optimization_goals; at fixed media-buy scope it binds independently to each inheriting package and is valid only when their primary-goal result units are compatible. Metric goals are compatible only when metric and every result-defining qualifier match; vendor_metric goals only when vendor and metric_id match; event goals only when the event_type/custom_event_name set and resolved attribution_window match. Primary is the earliest array entry among goals tied for the lowest explicit numeric priority; unprioritized goals follow explicitly prioritized goals; when all priorities are absent, the first entry is primary.").optional(), "roas": z.object({ "value": z.number().gt(0).describe("Return per unit of ad spend; 4 means 4 units of value per 1 unit spent."), "strength": z.enum(["floor", "target"]).describe("`floor` prefers underdelivery to knowingly optimizing below the requested return; `target` optimizes around the requested return. Neither guarantees realized return.") }).passthrough().describe("Dimensionless return-on-ad-spend control bound to the same scope-specific primary goal rules as cost_per. The bound goal must be value-bearing; a fixed media-buy default requires a value-bearing primary goal on every inheriting package. Every referenced value-bearing event source MUST declare value_currencies containing the media-buy currency. The seller validates this at buy creation; each buy consumes only exact-currency records, while other declared currencies remain available to other buys. Sellers MUST NOT perform currency conversion.").optional() }).passthrough().and(z.any().refine((value) => !z.union([z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "max_bid": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "cost_per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "roas": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required"), "max_bid": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required"), "cost_per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required"), "roas": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "cost_per": z.any().refine((value2) => value2 !== void 0, "Required"), "roas": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema")).describe("Buyer-authored execution policy for automatic delivery, auction bidding, average outcome cost, or return on ad spend. The containing object determines authored scope: media-buy `bidding` is a complete inherited default and package `bidding` is a complete package override. Sellers MUST preserve authored scope on readback and MUST NOT copy an inherited media-buy policy into package `bidding`. Every monetary field in this block is denominated in the media-buy currency; the selected pricing option supplies the auction unit, never another denomination. Auction-unit identity is the pricing_model plus every canonical billing-event qualifier after defaults are applied: for example CPV view threshold, CPP demographic system/demographic, CPA event tuple, time time_unit, and flat-rate/DOOH parameters. An extension qualifier participates only when its registered extension specification explicitly defines how it contributes to auction-unit identity. A media-buy bid_amount or max_bid is valid only when every inheriting package resolves the same auction-unit identity. Every affected pricing option MUST use the media-buy currency; split currency-mismatched packages into separate buys. Seller-optimized media-buy cost_per/roas bind to the primary budget_allocation.optimization_goals goal. Package-authored cost_per/roas bind to the package primary optimization goal. The primary goal is the earliest array entry among goals with the lowest explicit numeric priority; unprioritized goals follow explicitly prioritized goals; when all priorities are absent, the first entry is primary. In fixed allocation, an inherited media-buy cost_per is valid only when all inheriting packages have compatible primary-goal result units; inherited roas requires value-bearing primary goals on every inheriting package. Canonical ROAS requires each value-bearing event source to declare the media-buy currency in value_currencies; each buy consumes only exact-currency records and sellers MUST NOT convert them. Absence invokes inheritance or provider automatic delivery; `{automatic:true}` is an explicit authored policy that overrides inheritance. Sellers MUST reject unsupported modes, combinations, units, currency, goal bindings, or native placements before any provider mutation and MUST NOT silently translate semantics.").refine((value) => Object.keys(value).length >= 1, "Object must contain at least 1 property").optional(), "targeting_overlay": z.object({ "geo_countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_countries_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Exclude specific countries from delivery. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_regions": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Restrict delivery to exact canonical ISO 3166-2 subdivisions (states, provinces, regions, departments, or other subdivision categories). Unknown identifiers are invalid. At create or update, sellers MUST reject unsupported identifiers and MUST NOT silently widen, drop, or partially apply the list. During get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome. Exact internal translation preserves accepted identifiers in package readback.").optional(), "geo_regions_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Exclude exact canonical ISO 3166-2 subdivisions. Support is independent from geo_regions inclusion support. Unknown identifiers and values also present in geo_regions are invalid. At create or update, sellers MUST reject unsupported identifiers and partial application; during get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome.").optional(), "geo_metros": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).passthrough().describe("A targeted metro area.")).min(1).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_metros_exclude": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes to exclude within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).passthrough()).min(1).describe("Exclude specific metro areas from delivery. Each entry specifies the classification system and excluded values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).passthrough().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })]).describe("Must also satisfy at least one of these alternatives.")).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).passthrough()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Restrict delivery to specific postal areas. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas_exclude": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).passthrough().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })]).describe("Must also satisfy at least one of these alternatives.")).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).passthrough()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Exclude specific postal areas from delivery. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_places": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Restrict delivery to catalog-backed named places. Values MUST be stable identifiers in the declared system, not display names. Sellers must declare supported systems, countries, and place types in get_adcp_capabilities and reject unsupported entries rather than silently dropping them.").optional(), "geo_places_exclude": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Exclude catalog-backed named places. Uses the same identifier-based shape as geo_places. Sellers MUST reject overlap with geo_places for the same country, system, place_type, and value.").optional(), "daypart_targets": z.array(z.object({ "days": z.array(z.enum(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]).describe("Days of the week for daypart targeting")).min(1).describe("Days of week this window applies to. Use multiple days for compact targeting (e.g., monday-friday in one object)."), "start_hour": z.number().int().gte(0).lte(23).describe("Start hour (inclusive), 0-23 in 24-hour format. 0 = midnight, 6 = 6:00am, 18 = 6:00pm."), "end_hour": z.number().int().gte(1).lte(24).describe("End hour (exclusive), 1-24 in 24-hour format. 10 = 10:00am, 24 = midnight. Must be greater than start_hour."), "timezone": z.union([z.literal("inventory_local"), z.any().refine((value) => !z.literal("inventory_local").safeParse(value).success, "Invalid input: Should NOT be valid against schema").describe("Concrete timezone identifier in the implementation's supported IANA Time Zone Database, such as America/New_York, CET, or UTC.")]).describe("Civil-time clock used to evaluate this window. 'inventory_local' evaluates the hours in the seller-assigned local timezone of each inventory unit that can deliver the impression, such as a screen, venue, station, or publisher property; it never means the buyer, account, or server timezone. A concrete IANA timezone identifier (for example, 'America/New_York', 'CET', or 'UTC') evaluates one shared civil-time clock across the targeted inventory. Omission defaults to 'inventory_local'. Buyers that begin with a user or account preference MUST resolve it to a concrete IANA identifier before sending the daypart; 'user_timezone' and 'account_timezone' are not wire values. For each candidate delivery instant, convert the instant into this clock and compare its resulting local day and hour with the half-open window: a skipped DST hour has no matching instants, while both occurrences of a repeated hour match. This delivery clock is independent of reporting_capabilities.timezone.").default("inventory_local"), "label": z.string().describe("Optional human-readable name for this time window (e.g., 'Morning Drive', 'Prime Time')").optional() }).passthrough().describe("A time window for daypart targeting. Specifies days of week, an hour range, and the civil-time clock used to evaluate it. start_hour is inclusive, end_hour is exclusive (e.g., 6-10 = 6:00am to 10:00am). Follows the Google Ads AdScheduleInfo / DV360 DayPartTargeting pattern.")).min(1).describe("Restrict delivery to specific time windows. Each entry specifies days of week, an hour range, and an optional timezone that defaults to inventory_local. A concrete IANA zone uses one shared civil-time clock, while inventory_local evaluates each inventory unit in its seller-assigned local timezone. Entries are independent and MAY use different clocks.").optional(), "axe_include_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to include for targeting.").optional(), "axe_exclude_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to exclude from targeting.").optional(), "audience_include": z.array(z.string()).min(1).describe("Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities.").optional(), "audience_exclude": z.array(z.string()).min(1).describe("Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities.").optional(), "signal_targeting_groups": z.object({ "operator": z.literal("all").describe("Groups-level operator. Required even though v1 only supports 'all': every child group must be satisfied."), "groups": z.array(z.object({ "operator": z.enum(["any", "none"]).describe("How to evaluate the signals in this group. 'any' is an OR include group. 'none' is an exclusion group equivalent to NOT (A OR B OR C)."), "signals": z.array(z.object({ "pricing_option_id": z.string().describe("Pricing option selected for this signal. Use the pricing_option_id from the product's signal_targeting_options entry when product-scoped pricing is present; otherwise use the seller get_signals pricing only when the product option does not override it. Required when the selected signal has pricing_options; omit only when the signal is bundled into the product price or has no incremental cost.").optional(), "signal_agent_segment_id": z.string().describe("Optional opaque resolved-segment or seller execution handle for this signal. Omit when signal_ref plus the value expression is sufficient for the seller to resolve the signal. Include when the product option exposes a separate runtime or activation handle, and pass it verbatim. Buyers SHOULD prefer an exposed segment handle over reconstructing condition identity from categorical values because the handle can carry provider namespace and methodology distinctions.").optional(), "activation_key": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
|
|
14732
14732
|
const schemas = [z.object({ "type": z.literal("segment_id").describe("Segment ID based targeting"), "segment_id": z.string().describe("The platform-specific segment identifier to use in campaign targeting") }).catchall(z.any()), z.object({ "type": z.literal("key_value").describe("Key-value pair based targeting"), "key": z.string().describe("The targeting parameter key"), "value": z.string().describe("The targeting parameter value") }).catchall(z.any())];
|
|
14733
14733
|
const { errors, failed } = schemas.reduce(
|
|
14734
14734
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
@@ -14829,7 +14829,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
14829
14829
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
14830
14830
|
});
|
|
14831
14831
|
}
|
|
14832
|
-
}).describe("Named signal being targeted."), "value_type": z.literal("numeric").describe("Discriminator for numeric signals."), "min_value": z.number().describe("Minimum value, inclusive. Omit for no minimum. Should be within the signal definition's range when declared.").optional(), "max_value": z.number().describe("Maximum value, inclusive. Omit for no maximum. Should be within the signal definition's range when declared.").optional() }).catchall(z.any()).and(z.union([z.object({ "min_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Numeric signal expression - target users within a value range. At least one of min_value or max_value is required. If both min_value and max_value are provided, min_value MUST be <= max_value.")];
|
|
14832
|
+
}).describe("Named signal being targeted."), "value_type": z.literal("numeric").describe("Discriminator for numeric signals."), "min_value": z.number().describe("Minimum value, inclusive. Omit for no minimum. Should be within the signal definition's range when declared.").optional(), "max_value": z.number().describe("Maximum value, inclusive. Omit for no maximum. Should be within the signal definition's range when declared.").optional() }).catchall(z.any()).and(z.union([z.object({ "min_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Numeric signal expression - target users within a value range. At least one of min_value or max_value is required. If both min_value and max_value are provided, min_value MUST be <= max_value.")];
|
|
14833
14833
|
const { errors, failed } = schemas.reduce(
|
|
14834
14834
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
14835
14835
|
errors: [...errors2, ...result.error.issues],
|
|
@@ -14904,7 +14904,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
14904
14904
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
14905
14905
|
});
|
|
14906
14906
|
}
|
|
14907
|
-
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("binary").describe("Discriminator for binary signals"), "value": z.boolean().describe("Whether to include (true) or exclude (false) users matching this signal") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Binary signal targeting - user either matches or doesn't"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
|
|
14907
|
+
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("binary").describe("Discriminator for binary signals"), "value": z.boolean().describe("Whether to include (true) or exclude (false) users matching this signal") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Binary signal targeting - user either matches or doesn't"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
|
|
14908
14908
|
const schemas2 = [z.object({ "scope": z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Product-local signal identifier. For local signals exposed on both get_signals and get_products, this MUST match get_signals.signals[].signal_ref.signal_id for the same signal.") }).catchall(z.any()).describe("Product-scoped signal. The signal_id is meaningful only within the selected product/package context and MUST match a Product.included_signals[].signal_ref.signal_id or Product.signal_targeting_options[].signal_ref.signal_id for that product, depending on whether the signal is descriptive or selectable."), z.object({ "scope": z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that publishes the signal definition in its adagents.json signals[]."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(z.any()).describe("Data-provider-scoped signal. The signal_id resolves through the data provider's published adagents.json signals[] and can be authorization-verified there."), z.object({ "scope": z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(z.any()).describe("Signal-source-scoped signal. Use this for source-native signals that are not published in upstream adagents.json signals[]. The buyer trusts the issuing signal source for this identity; use scope 'data_provider' instead when the signal is published in adagents.json signals[], even if the publisher is also the seller or signal source.")];
|
|
14909
14909
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
14910
14910
|
({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
|
|
@@ -14954,7 +14954,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
14954
14954
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
14955
14955
|
});
|
|
14956
14956
|
}
|
|
14957
|
-
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("categorical").describe("Discriminator for categorical signals"), "values": z.array(z.string()).min(1).describe("Values to target. Users with any of these values will be included.") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Categorical signal targeting - target users with specific values"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
|
|
14957
|
+
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("categorical").describe("Discriminator for categorical signals"), "values": z.array(z.string()).min(1).describe("Values to target. Users with any of these values will be included.") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Categorical signal targeting - target users with specific values"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
|
|
14958
14958
|
const schemas2 = [z.object({ "scope": z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Product-local signal identifier. For local signals exposed on both get_signals and get_products, this MUST match get_signals.signals[].signal_ref.signal_id for the same signal.") }).catchall(z.any()).describe("Product-scoped signal. The signal_id is meaningful only within the selected product/package context and MUST match a Product.included_signals[].signal_ref.signal_id or Product.signal_targeting_options[].signal_ref.signal_id for that product, depending on whether the signal is descriptive or selectable."), z.object({ "scope": z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that publishes the signal definition in its adagents.json signals[]."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(z.any()).describe("Data-provider-scoped signal. The signal_id resolves through the data provider's published adagents.json signals[] and can be authorization-verified there."), z.object({ "scope": z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(z.any()).describe("Signal-source-scoped signal. Use this for source-native signals that are not published in upstream adagents.json signals[]. The buyer trusts the issuing signal source for this identity; use scope 'data_provider' instead when the signal is published in adagents.json signals[], even if the publisher is also the seller or signal source.")];
|
|
14959
14959
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
14960
14960
|
({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
|
|
@@ -15004,7 +15004,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
15004
15004
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
15005
15005
|
});
|
|
15006
15006
|
}
|
|
15007
|
-
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("numeric").describe("Discriminator for numeric signals"), "min_value": z.number().describe("Minimum value (inclusive). Omit for no minimum. Must be <= max_value when both are provided. Should be >= signal's range.min if defined.").optional(), "max_value": z.number().describe("Maximum value (inclusive). Omit for no maximum. Must be >= min_value when both are provided. Should be <= signal's range.max if defined.").optional() }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Numeric signal targeting - target users within a value range. If min_value is provided, it must be <= max_value. Values should be within the signal's defined range (see signal definition).")];
|
|
15007
|
+
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("numeric").describe("Discriminator for numeric signals"), "min_value": z.number().describe("Minimum value (inclusive). Omit for no minimum. Must be <= max_value when both are provided. Should be >= signal's range.min if defined.").optional(), "max_value": z.number().describe("Maximum value (inclusive). Omit for no maximum. Must be >= min_value when both are provided. Should be <= signal's range.max if defined.").optional() }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Numeric signal targeting - target users within a value range. If min_value is provided, it must be <= max_value. Values should be within the signal's defined range (see signal definition).")];
|
|
15008
15008
|
const { errors, failed } = schemas.reduce(
|
|
15009
15009
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
15010
15010
|
errors: [...errors2, ...result.error.issues],
|
|
@@ -15028,7 +15028,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
15028
15028
|
message: "Invalid input: Should pass single schema. Passed " + passed
|
|
15029
15029
|
});
|
|
15030
15030
|
}
|
|
15031
|
-
}).describe("Targeting constraint for a specific signal. Uses value_type as discriminator to determine the targeting expression format.")).min(1).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.").optional(), "demographics": z.object({ "age": z.intersection(z.object({ "min": z.number().int().gte(0).lte(150).describe("Inclusive minimum age in completed years. Omit for an open lower bound.").optional(), "max": z.number().int().gte(0).lte(150).describe("Inclusive maximum age in completed years. Omit for an open upper bound.").optional(), "include_unknown": z.boolean().describe("Whether delivery to people whose age is unavailable is part of this predicate. This field has no default and MUST be supplied.") }).catchall(z.any()).and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A canonical audience-age predicate in completed integer years. min and max are inclusive; omitting one bound means no restriction in that direction. At least one bound is required. include_unknown is always explicit because people whose age is unavailable are not members of any numeric interval. Implementations MUST reject min greater than max; JSON Schema draft-07 cannot compare sibling numeric values."), z.object({ "accepted_bases": z.array(z.enum(["verified", "declared", "inferred"]).describe("User-level bases that may resolve age for demographic targeting execution. Population estimates are deliberately absent because aggregate composition cannot establish an individual impression's age.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("User-level age determination bases the buyer permits for this predicate. Sellers MUST use only these bases or reject the request; they MUST NOT silently fall back to another basis. When omitted, the buyer imposes no determination-basis constraint beyond product capability and any age_restriction. population_estimate is structurally unavailable because aggregate evidence cannot identify an eligible user.").optional(), "accepted_verification_methods": z.array(z.enum(["facial_age_estimation", "id_document", "digital_id", "credit_card", "world_id"]).describe("Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Verification methods acceptable when verified is an accepted basis. This field narrows verified demographic execution; age_restriction.accepted_methods independently governs legal eligibility and the two sets are intersected when both are present.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "accepted_verification_methods": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "accepted_verification_methods": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "accepted_bases": z.any().refine((value) => !z.array(z.any().refine((value2) => !z.literal("verified").safeParse(value2).success, "Invalid input: Should NOT be valid against schema")).safeParse(value).success, "Invalid input: Should NOT be valid against schema") }))]))) }).catchall(z.any()).describe("Canonical demographic audience targeting intent with optional constraints on how age may be determined. This is distinct from age_restriction: demographics selects an audience, while age_restriction expresses a legal eligibility or verification floor. Fresh create/update targeting MUST compile exactly or be rejected. During get_products, a seller may offer a different configured predicate only through sparse targeting_resolution modifications on a distinguishable product_id; selecting that product accepts the alternative. Sellers never silently broaden, narrow, default, drop, or substitute the basis.").optional(), "frequency_cap": z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2.").optional(), "property_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a property list for targeting specific properties within this product. The package runs on the intersection of the product's publisher_properties and this list. Sellers SHOULD return a validation error if the product has property_targeting_allowed: false.").optional(), "property_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a property list whose properties must not carry the buyer's ads. Matched properties are removed from delivery. Use for brand-safety do-not-run lists (apps, sites). Exclude wins on overlap with property_list, and applies regardless of the product's property_targeting_allowed flag. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a collection list for including specific collections (programs, publications, channels) within this product. The package runs on the intersection of matched collections and this list. Use for inclusion-based collection targeting. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a collection list for excluding specific collections (programs, publications, channels) from this product. Matched collections must not carry the buyer's ads. Use for brand safety do-not-air lists. Seller must declare support in get_adcp_capabilities.").optional(), "placement_selection": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
|
|
15031
|
+
}).describe("Targeting constraint for a specific signal. Uses value_type as discriminator to determine the targeting expression format.")).min(1).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.").optional(), "demographics": z.object({ "age": z.intersection(z.object({ "min": z.number().int().gte(0).lte(150).describe("Inclusive minimum age in completed years. Omit for an open lower bound.").optional(), "max": z.number().int().gte(0).lte(150).describe("Inclusive maximum age in completed years. Omit for an open upper bound.").optional(), "include_unknown": z.boolean().describe("Whether delivery to people whose age is unavailable is part of this predicate. This field has no default and MUST be supplied.") }).catchall(z.any()).and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A canonical audience-age predicate in completed integer years. min and max are inclusive; omitting one bound means no restriction in that direction. At least one bound is required. include_unknown is always explicit because people whose age is unavailable are not members of any numeric interval. Implementations MUST reject min greater than max; JSON Schema draft-07 cannot compare sibling numeric values."), z.object({ "accepted_bases": z.array(z.enum(["verified", "declared", "inferred"]).describe("User-level bases that may resolve age for demographic targeting execution. Population estimates are deliberately absent because aggregate composition cannot establish an individual impression's age.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("User-level age determination bases the buyer permits for this predicate. Sellers MUST use only these bases or reject the request; they MUST NOT silently fall back to another basis. When omitted, the buyer imposes no determination-basis constraint beyond product capability and any age_restriction. population_estimate is structurally unavailable because aggregate evidence cannot identify an eligible user.").optional(), "accepted_verification_methods": z.array(z.enum(["facial_age_estimation", "id_document", "digital_id", "credit_card", "world_id"]).describe("Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Verification methods acceptable when verified is an accepted basis. This field narrows verified demographic execution; age_restriction.accepted_methods independently governs legal eligibility and the two sets are intersected when both are present.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "accepted_verification_methods": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "accepted_verification_methods": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "accepted_bases": z.any().refine((value) => !z.array(z.any().refine((value2) => !z.literal("verified").safeParse(value2).success, "Invalid input: Should NOT be valid against schema")).safeParse(value).success, "Invalid input: Should NOT be valid against schema") }))]).describe("Must also satisfy at least one of these alternatives."))) }).catchall(z.any()).describe("Canonical demographic audience targeting intent with optional constraints on how age may be determined. This is distinct from age_restriction: demographics selects an audience, while age_restriction expresses a legal eligibility or verification floor. Fresh create/update targeting MUST compile exactly or be rejected. During get_products, a seller may offer a different configured predicate only through sparse targeting_resolution modifications on a distinguishable product_id; selecting that product accepts the alternative. Sellers never silently broaden, narrow, default, drop, or substitute the basis.").optional(), "frequency_cap": z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2.").optional(), "property_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a property list for targeting specific properties within this product. The package runs on the intersection of the product's publisher_properties and this list. Sellers SHOULD return a validation error if the product has property_targeting_allowed: false.").optional(), "property_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a property list whose properties must not carry the buyer's ads. Matched properties are removed from delivery. Use for brand-safety do-not-run lists (apps, sites). Exclude wins on overlap with property_list, and applies regardless of the product's property_targeting_allowed flag. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a collection list for including specific collections (programs, publications, channels) within this product. The package runs on the intersection of matched collections and this list. Use for inclusion-based collection targeting. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a collection list for excluding specific collections (programs, publications, channels) from this product. Matched collections must not carry the buyer's ads. Use for brand safety do-not-air lists. Seller must declare support in get_adcp_capabilities.").optional(), "placement_selection": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
|
|
15032
15032
|
const schemas = [z.object({ "mode": z.literal("selected"), "placement_refs": z.array(z.union([z.intersection(z.object({ "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring a publisher-catalog placement is hosted, or the inventory publisher associated with an inline placement. Omitted only for legacy single-publisher product-context references.").optional(), "placement_id": z.string().describe("Placement ID from the publisher's adagents.json placement catalog, or an inline seller-defined placement ID interpreted within the enclosing seller and product context.") }).catchall(z.any()).describe("Legacy-compatible product-context reference to a placement. For publisher-catalog placements, publisher_domain plus placement_id resolves the declaration in that publisher's adagents.json. For seller-inline placements, the enclosing seller and product supply scope. When publisher_domain is omitted on legacy inputs, receivers MAY interpret the ID relative to the enclosing single-publisher product. Use placement-identity.json when a self-contained cross-document identity is required."), z.object({ "publisher_domain": z.any().refine((value) => value !== void 0, "Required") }).passthrough()), z.any().superRefine((x2, ctx2) => {
|
|
15033
15033
|
const schemas2 = [z.object({ "kind": z.literal("publisher_ref"), "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain whose adagents.json declares placement_id."), "placement_id": z.string().min(1) }).passthrough(), z.object({ "kind": z.literal("seller_inline"), "seller_agent": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("The seller agent's API endpoint URL as declared in the property publisher's adagents.json `authorized_agents[].url`. MUST use the `https://` scheme. Receivers compare this URL against the `authorized_agents` list using the AdCP URL canonicalization rules \u2014 not byte-equality \u2014 and reject mismatches with `seller_not_authorized`. See docs/reference/url-canonicalization."), "id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).min(1).describe("Reserved for a future registry-assigned stable seller identifier. Not used today \u2014 senders MUST NOT populate this field until a registry is defined. When a future release populates both `agent_url` and `id`, `agent_url` remains authoritative and `id` is advisory.").optional() }).passthrough().describe("Sales agent that defines and maintains the inline placement namespace."), "placement_id": z.string().min(1).describe("Stable placement ID within the defining sales agent's namespace. The agent MUST NOT reuse it for a different semantic placement.") }).passthrough()];
|
|
15034
15034
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
@@ -15129,7 +15129,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
15129
15129
|
});
|
|
15130
15130
|
}
|
|
15131
15131
|
}))).min(1).describe("Target users within travel time, distance, or a custom boundary around arbitrary geographic points. Multiple entries use OR semantics \u2014 a user within range of any listed point is eligible. For campaigns targeting 10+ locations, consider using store_catchments with a location catalog instead. Seller must declare support in get_adcp_capabilities.").optional(), "language": z.array(z.string().regex(new RegExp("^(?:[a-z]{2,8}(?:-[A-Z][a-z]{3})?(?:-(?:[A-Z]{2}|[0-9]{3}))?(?:-(?:[a-z0-9]{5,8}|[0-9][a-z0-9]{3}))*(?:-[0-9a-wy-z](?:-[a-z0-9]{2,8})+)*(?:-x(?:-[a-z0-9]{1,8})+)?|x(?:-[a-z0-9]{1,8})+)$")).min(2).max(63).describe("A well-formed BCP 47 language tag used by AdCP only as language identity. Script and region may refine that identity; other valid BCP 47 subtags remain part of tag matching but do not make this a general locale-settings object. It does not determine currency, time zone, number/date formatting, market, or legal jurisdiction. The AdCP canonical wire profile requires lower-case language and variants, title-case script, and upper-case region (for example `en-US`, `zh-Hant-TW`, or `x-private`). RFC 5646 comparisons are case-insensitive and its case regularization is optional; AdCP intentionally requires this stricter single wire spelling and receivers MUST reject differently cased tags rather than silently normalizing them. The schema pattern enforces the AdCP casing profile and extension structure for commonly used tags; conforming receivers additionally validate the complete RFC 5646 grammar and registry rules. Every new AdCP field carrying BCP 47 language identity or a concrete language range MUST reference this schema instead of declaring independent string constraints.")).min(1).describe("Restrict to users with specific language preferences using canonical BCP 47 language ranges. Each buyer range is evaluated against a user's language-preference tag with RFC 4647 section 3.3.1 Basic Filtering: 'fr' matches 'fr', 'fr-CA', and 'fr-FR', while 'fr-CA' matches 'fr-CA' and more-specific descendants but not 'fr' or 'fr-FR'. Values use OR logic.").optional(), "keyword_targets": z.array(z.object({ "keyword": z.string().min(1).describe("The keyword to target"), "match_type": z.enum(["broad", "phrase", "exact"]).describe("Keyword targeting match type. broad: ads may serve on queries semantically related to the keyword. phrase: ads serve when the query contains the keyword phrase. exact: ads serve only when the query matches the keyword exactly."), "bid_price": z.number().gte(0).describe("Per-keyword bid price, denominated in the same currency as the package's pricing option. Overrides the package-level bid_price for this keyword. Inherits the max_bid interpretation from the pricing option: when max_bid is true, this is the keyword's bid ceiling; when false, this is the exact bid. If omitted, the package bid_price applies.").optional() }).passthrough()).min(1).describe("Keyword targeting for search and retail media platforms. Restricts delivery to queries matching the specified keywords. Each keyword is identified by the tuple (keyword, match_type) \u2014 the same keyword string with different match types are distinct targets. Sellers SHOULD reject duplicate (keyword, match_type) pairs within a single request. Seller must declare support in get_adcp_capabilities.").optional(), "negative_keywords": z.array(z.object({ "keyword": z.string().min(1).describe("The keyword to exclude"), "match_type": z.enum(["broad", "phrase", "exact"]).describe("Keyword targeting match type. broad: ads may serve on queries semantically related to the keyword. phrase: ads serve when the query contains the keyword phrase. exact: ads serve only when the query matches the keyword exactly.") }).passthrough().describe("An excluded keyword.")).min(1).describe("Keywords to exclude from delivery. Queries matching these keywords will not trigger the ad. Each negative keyword is identified by the tuple (keyword, match_type). Seller must declare support in get_adcp_capabilities.").optional() }).catchall(z.any()).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "demographics": z.any().refine((value2) => value2 !== void 0, "Required"), "age_restriction": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "demographics": z.any().refine((value) => value !== void 0, "Required"), "age_restriction": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "demographics": z.object({ "age": z.object({ "include_unknown": z.literal(false).optional() }).optional() }).optional() }))]).describe("Unknown-age delivery cannot satisfy a minimum-age eligibility policy. When demographic audience targeting and age_restriction are both present, include_unknown must be false."), z.union([z.any().refine((value) => !z.object({ "age_restriction": z.object({ "verification_required": z.literal(true) }), "demographics": z.object({ "age": z.object({ "accepted_bases": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough() }) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "age_restriction": z.object({ "verification_required": z.literal(true) }), "demographics": z.object({ "age": z.object({ "accepted_bases": z.any().refine((value) => value !== void 0, "Required") }).passthrough() }) }), z.object({ "demographics": z.object({ "age": z.object({ "accepted_bases": z.any().refine((value) => !z.array(z.any().refine((value2) => !z.literal("verified").safeParse(value2).success, "Invalid input: Should NOT be valid against schema")).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional() }).optional() }).optional() }))]).describe("A legal verification requirement always narrows demographic targeting. When the buyer supplies accepted_bases and age_restriction requires verification, verified must be accepted; otherwise the constraints have an empty intersection and the request is invalid."))).describe("Resolved effective buyer-selected targeting, including compatible wholesale signal selections, applied within the product's published targeting contract. Cleared dimensions are omitted; null is invalid in an accepted snapshot.").optional(), "optimization_goals": z.array(z.any().superRefine((x, ctx) => {
|
|
15132
|
-
const schemas = [z.object({ "kind": z.literal("metric"), "metric": z.enum(["clicks", "views", "completed_views", "viewed_seconds", "viewable_rate", "engagements", "follows", "saves", "profile_visits", "reach"]), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional(), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.").optional(), "reach_unit": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").optional(), "target_frequency": z.object({ "min": z.number().int().gte(1).optional(), "max": z.number().int().gte(1).optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.") }).passthrough().and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).optional(), "view_duration_seconds": z.number().gt(0).optional(), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough().and(z.intersection(z.union([z.any().refine((value) => !z.object({ "metric": z.literal("viewable_rate") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "metric": z.literal("viewable_rate") }), z.object({ "target": z.object({ "value": z.any().optional() }).optional() }))]), z.any())), z.object({ "kind": z.literal("event"), "event_sources": z.array(z.object({ "event_source_id": z.string().min(1), "event_type": z.enum(["page_view", "view_content", "select_content", "select_item", "search", "share", "add_to_cart", "remove_from_cart", "viewed_cart", "add_to_wishlist", "initiate_checkout", "add_payment_info", "purchase", "refund", "lead", "qualify_lead", "close_convert_lead", "disqualify_lead", "complete_registration", "subscribe", "follow", "content_view", "watch_milestone", "start_trial", "app_install", "app_launch", "contact", "schedule", "donate", "submit_application", "custom"]).describe("Standard marketing event types for event logging, aligned with IAB ECAPI"), "custom_event_name": z.string().min(1).optional(), "value_field": z.string().min(1).optional(), "value_factor": z.number().default(1) }).passthrough()).min(1), "target": z.object({ "kind": z.literal("maximize_value") }).passthrough().optional(), "attribution_window": z.object({ "post_click": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-click attribution window. Conversions occurring within this duration after a click are attributed to the ad.").optional(), "post_view": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-view attribution window. Conversions occurring within this duration after an ad impression (without click) are attributed to the ad.").optional(), "model": z.enum(["last_touch", "first_touch", "linear", "time_decay", "data_driven"]).describe("Attribution model used to assign credit when multiple touchpoints exist. SHOULD be populated when committing to a specific model; when absent, the seller's default applies.").optional() }).catchall(z.any()).describe("Describes the attribution methodology and lookback windows used for conversion measurement. Enables cross-platform comparison by making attribution methodology transparent. Used as a `$ref` from `optimization-goal.json` (buyer's optimization-time attribution choice), `get-media-buy-delivery-response.json` (seller-declared attribution methodology in delivery reports), and similar surfaces. All fields are optional individually but at least one of `post_click`, `post_view`, or `model` SHOULD be populated; absence of `model` means the seller's default attribution model applies (typically `last_touch` per industry convention) \u2014 sellers SHOULD populate `model` explicitly when committing to a specific methodology.").optional(), "priority": z.number().int().gte(1).optional() }).passthrough(), z.object({ "kind": z.literal("vendor_metric"), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "metric_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).min(1).max(64).describe("Identifier for a vendor-defined metric within the vendor's vocabulary. Stable lookup key; the vendor publishes the canonical list (with category, methodology, and standard alignment) in `brand.json` `agents[type='measurement']`. Lowercase with underscores so a future enum promotion into `available-metric.json` is a literal string lift. Identifier is namespaced by the vendor \u2014 the same `metric_id` may mean different things in different vendors' vocabularies."), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough()];
|
|
15132
|
+
const schemas = [z.object({ "kind": z.literal("metric"), "metric": z.enum(["clicks", "views", "completed_views", "viewed_seconds", "viewable_rate", "engagements", "follows", "saves", "profile_visits", "reach"]), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional(), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.").optional(), "reach_unit": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").optional(), "target_frequency": z.object({ "min": z.number().int().gte(1).optional(), "max": z.number().int().gte(1).optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.") }).passthrough().and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).optional(), "view_duration_seconds": z.number().gt(0).optional(), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough().and(z.intersection(z.union([z.any().refine((value) => !z.object({ "metric": z.literal("viewable_rate") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "metric": z.literal("viewable_rate") }), z.object({ "target": z.object({ "value": z.any().optional() }).optional() }))]), z.any())), z.object({ "kind": z.literal("event"), "event_sources": z.array(z.object({ "event_source_id": z.string().min(1), "event_type": z.enum(["page_view", "view_content", "select_content", "select_item", "search", "share", "add_to_cart", "remove_from_cart", "viewed_cart", "add_to_wishlist", "initiate_checkout", "add_payment_info", "purchase", "refund", "lead", "qualify_lead", "close_convert_lead", "disqualify_lead", "complete_registration", "subscribe", "follow", "content_view", "watch_milestone", "start_trial", "app_install", "app_launch", "contact", "schedule", "donate", "submit_application", "custom"]).describe("Standard marketing event types for event logging, aligned with IAB ECAPI"), "custom_event_name": z.string().min(1).optional(), "value_field": z.string().min(1).optional(), "value_factor": z.number().default(1) }).passthrough()).min(1), "target": z.object({ "kind": z.literal("maximize_value") }).passthrough().optional(), "attribution_window": z.object({ "post_click": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-click attribution window. Conversions occurring within this duration after a click are attributed to the ad.").optional(), "post_view": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-view attribution window. Conversions occurring within this duration after an ad impression (without click) are attributed to the ad.").optional(), "model": z.enum(["last_touch", "first_touch", "linear", "time_decay", "data_driven"]).describe("Attribution model used to assign credit when multiple touchpoints exist. SHOULD be populated when committing to a specific model; when absent, the seller's default applies.").optional() }).catchall(z.any()).describe("Describes the attribution methodology and lookback windows used for conversion measurement. Enables cross-platform comparison by making attribution methodology transparent. Used as a `$ref` from `optimization-goal.json` (buyer's optimization-time attribution choice), `get-media-buy-delivery-response.json` (seller-declared attribution methodology in delivery reports), and similar surfaces. All fields are optional individually but at least one of `post_click`, `post_view`, or `model` SHOULD be populated; absence of `model` means the seller's default attribution model applies (typically `last_touch` per industry convention) \u2014 sellers SHOULD populate `model` explicitly when committing to a specific methodology.").optional(), "priority": z.number().int().gte(1).optional() }).passthrough(), z.object({ "kind": z.literal("vendor_metric"), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "metric_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).min(1).max(64).describe("Identifier for a vendor-defined metric within the vendor's vocabulary. Stable lookup key; the vendor publishes the canonical list (with category, methodology, and standard alignment) in `brand.json` `agents[type='measurement']`. Lowercase with underscores so a future enum promotion into `available-metric.json` is a literal string lift. Identifier is namespaced by the vendor \u2014 the same `metric_id` may mean different things in different vendors' vocabularies."), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough()];
|
|
15133
15133
|
const { errors, failed } = schemas.reduce(
|
|
15134
15134
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
15135
15135
|
errors: [...errors2, ...result.error.issues],
|
|
@@ -15178,7 +15178,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
15178
15178
|
message: "Invalid input: Should pass single schema. Passed " + passed
|
|
15179
15179
|
});
|
|
15180
15180
|
}
|
|
15181
|
-
})).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").optional(), "accepted_attestation_claim_types": z.array(z.string().refine(adcpJsonSchemaUri, "Invalid URI")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.object({ "independent_attestation_required": z.literal(true) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "independent_attestation_required": z.literal(true) }), z.object({ "accepted_attestation_issuers": z.any().refine((value) => value !== void 0, "Required") }).passthrough())])).describe("Buyer evidence-admissibility policy carried into the accepted purchase snapshot.").optional(), "audience_evidence_pins": z.array(z.object({ "evidence_id": z.string().min(1), "snapshot_id": z.string().min(1), "version": z.string().min(1), "content_digest": z.string().regex(new RegExp("^sha256:[a-f0-9]{64}$")), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().describe("Buyer-authored pin to one exact immutable audience-evidence snapshot selected during discovery. Sellers MUST match all four fields against a single published snapshot; they MUST reject the package rather than substitute a newer version or reuse snapshot_id with changed content. A confirmed package MUST return the same identity in audience_evidence_selections with decision_use package_construction.")).min(1).describe("Exact immutable audience-evidence snapshots selected for package construction.").optional(), "agency_estimate_number": z.string().max(100).describe("Package-level agency estimate or authorization reference.").optional(), "context": z.record(z.string(), z.any()).describe("Opaque buyer package correlation preserved in the accepted snapshot and readback.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional(), "measurement_terms": z.object({ "billing_measurement": z.object({ "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "max_variance_percent": z.number().gte(0).lt(100).optional(), "measurement_window": z.string().min(1).optional(), "finalization_deadline_hours": z.number().int().gte(0).optional() }).passthrough().optional(), "makegood_policy": z.object({ "available_remedies": z.array(z.enum(["additional_delivery", "credit", "invoice_adjustment"]).describe("Remedy types available when a performance standard or billing measurement threshold is breached.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!") }).passthrough().optional() }).passthrough().describe("Published or negotiated billing-measurement and makegood terms for this purchase. Direct buyers may omit this to inherit the product default; accepted proposal snapshots preserve the resolved terms.").optional(), "performance_standards": z.array(z.object({ "metric": z.enum(["viewability", "ivt", "completion_rate", "brand_safety", "attention_score"]).describe("Performance metrics that support rate thresholds on media buys \u2014 the verification subset of the broader metric vocabulary. Each metric specifies whether its threshold is a floor (must exceed) or ceiling (must not exceed). Shared values with `available-metric.json` mirror the delivery vocabulary (`viewability` \u2192 `viewable_rate` family, `completion_rate` \u2192 same name); verification-only values (`ivt`, `brand_safety`, `attention_score`) are typically vendor-attested and do not appear in `available-metric.json` because they're not seller-reportable scalars \u2014 they flow through `vendor_metric_values` or vendor-scope `committed_metrics` entries with the matching `performance_standard.vendor` BrandRef anchoring identity."), "threshold": z.number().gte(0).lte(1), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional(), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.") }).passthrough().describe("Compact committed metric threshold with resolvable vendor identity and no creative or brand-asset graph.")).min(1).describe("Published or negotiated metric thresholds and measurement vendors. Direct buyers may omit this to inherit the product defaults; accepted proposal snapshots preserve every applicable standard.").optional() }).passthrough().describe("One resolved canonical product selection in a compact proposal or accepted commercial snapshot. Request-side buy_products selections use product-purchase-input.json. This strict snapshot shape contains effective non-null targeting and resolved inherited terms. Creative content and creative assignments are intentionally absent."), z.object({ "product_id": z.any().refine((value) => value !== void 0, "Required"), "pricing_option_id": z.any().refine((value) => value !== void 0, "Required"), "pricing": z.any().refine((value) => value !== void 0, "Required"), "start_time": z.any().refine((value) => value !== void 0, "Required"), "end_time": z.any().refine((value) => value !== void 0, "Required") }).passthrough())).min(1).describe("Exact canonical product, pricing, format, catalog, budget, targeting, bidding, optimization, resolved flight, measurement, and performance terms in the commercial envelope."), "start_time": z.any().superRefine((x, ctx) => {
|
|
15181
|
+
})).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").optional(), "accepted_attestation_claim_types": z.array(z.string().refine(adcpJsonSchemaUri, "Invalid URI")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.object({ "independent_attestation_required": z.literal(true) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "independent_attestation_required": z.literal(true) }), z.object({ "accepted_attestation_issuers": z.any().refine((value) => value !== void 0, "Required") }).passthrough())]).describe("Must also satisfy at least one of these alternatives.")).describe("Buyer evidence-admissibility policy carried into the accepted purchase snapshot.").optional(), "audience_evidence_pins": z.array(z.object({ "evidence_id": z.string().min(1), "snapshot_id": z.string().min(1), "version": z.string().min(1), "content_digest": z.string().regex(new RegExp("^sha256:[a-f0-9]{64}$")), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().describe("Buyer-authored pin to one exact immutable audience-evidence snapshot selected during discovery. Sellers MUST match all four fields against a single published snapshot; they MUST reject the package rather than substitute a newer version or reuse snapshot_id with changed content. A confirmed package MUST return the same identity in audience_evidence_selections with decision_use package_construction.")).min(1).describe("Exact immutable audience-evidence snapshots selected for package construction.").optional(), "agency_estimate_number": z.string().max(100).describe("Package-level agency estimate or authorization reference.").optional(), "context": z.record(z.string(), z.any()).describe("Opaque buyer package correlation preserved in the accepted snapshot and readback.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional(), "measurement_terms": z.object({ "billing_measurement": z.object({ "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "max_variance_percent": z.number().gte(0).lt(100).optional(), "measurement_window": z.string().min(1).optional(), "finalization_deadline_hours": z.number().int().gte(0).optional() }).passthrough().optional(), "makegood_policy": z.object({ "available_remedies": z.array(z.enum(["additional_delivery", "credit", "invoice_adjustment"]).describe("Remedy types available when a performance standard or billing measurement threshold is breached.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!") }).passthrough().optional() }).passthrough().describe("Published or negotiated billing-measurement and makegood terms for this purchase. Direct buyers may omit this to inherit the product default; accepted proposal snapshots preserve the resolved terms.").optional(), "performance_standards": z.array(z.object({ "metric": z.enum(["viewability", "ivt", "completion_rate", "brand_safety", "attention_score"]).describe("Performance metrics that support rate thresholds on media buys \u2014 the verification subset of the broader metric vocabulary. Each metric specifies whether its threshold is a floor (must exceed) or ceiling (must not exceed). Shared values with `available-metric.json` mirror the delivery vocabulary (`viewability` \u2192 `viewable_rate` family, `completion_rate` \u2192 same name); verification-only values (`ivt`, `brand_safety`, `attention_score`) are typically vendor-attested and do not appear in `available-metric.json` because they're not seller-reportable scalars \u2014 they flow through `vendor_metric_values` or vendor-scope `committed_metrics` entries with the matching `performance_standard.vendor` BrandRef anchoring identity."), "threshold": z.number().gte(0).lte(1), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional(), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.") }).passthrough().describe("Compact committed metric threshold with resolvable vendor identity and no creative or brand-asset graph.")).min(1).describe("Published or negotiated metric thresholds and measurement vendors. Direct buyers may omit this to inherit the product defaults; accepted proposal snapshots preserve every applicable standard.").optional() }).passthrough().describe("One resolved canonical product selection in a compact proposal or accepted commercial snapshot. Request-side buy_products selections use product-purchase-input.json. This strict snapshot shape contains effective non-null targeting and resolved inherited terms. Creative content and creative assignments are intentionally absent."), z.object({ "product_id": z.any().refine((value) => value !== void 0, "Required"), "pricing_option_id": z.any().refine((value) => value !== void 0, "Required"), "pricing": z.any().refine((value) => value !== void 0, "Required"), "start_time": z.any().refine((value) => value !== void 0, "Required"), "end_time": z.any().refine((value) => value !== void 0, "Required") }).passthrough())).min(1).describe("Exact canonical product, pricing, format, catalog, budget, targeting, bidding, optimization, resolved flight, measurement, and performance terms in the commercial envelope."), "start_time": z.any().superRefine((x, ctx) => {
|
|
15182
15182
|
const schemas = [z.literal("asap").describe("Start campaign as soon as possible"), z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")];
|
|
15183
15183
|
const { errors, failed } = schemas.reduce(
|
|
15184
15184
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
@@ -15203,9 +15203,9 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
15203
15203
|
message: "Invalid input: Should pass single schema. Passed " + passed
|
|
15204
15204
|
});
|
|
15205
15205
|
}
|
|
15206
|
-
}).describe("Campaign start timing: 'asap' or ISO 8601 date-time"), "end_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), "total_budget": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().optional(), "daily_budget_cap": z.number().gte(0).describe("Hard aggregate daily spend ceiling accepted as part of these terms. It bounds total spend without creating purchase allocations.").optional(), "frequency_cap": z.intersection(z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2."), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()).describe("Hard MediaBuy-level cap accepted as part of these terms. One counter aggregates exposures across every purchase; purchase targeting caps remain independently binding.").optional(), "budget_cap_timezone": z.string().min(1).describe("Shared IANA calendar-day boundary for aggregate and purchase daily caps in these terms.").optional(), "budget_allocation": z.any().superRefine((x, ctx) => {
|
|
15206
|
+
}).describe("Campaign start timing: 'asap' or ISO 8601 date-time"), "end_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), "total_budget": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().optional(), "daily_budget_cap": z.number().gte(0).describe("Hard aggregate daily spend ceiling accepted as part of these terms. It bounds total spend without creating purchase allocations.").optional(), "frequency_cap": z.intersection(z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2."), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()).describe("Hard MediaBuy-level cap accepted as part of these terms. One counter aggregates exposures across every purchase; purchase targeting caps remain independently binding.").optional(), "budget_cap_timezone": z.string().min(1).describe("Shared IANA calendar-day boundary for aggregate and purchase daily caps in these terms.").optional(), "budget_allocation": z.any().superRefine((x, ctx) => {
|
|
15207
15207
|
const schemas = [z.object({ "mode": z.literal("fixed") }).passthrough(), z.object({ "mode": z.literal("seller_optimized"), "optimization_goals": z.array(z.any().superRefine((x2, ctx2) => {
|
|
15208
|
-
const schemas2 = [z.object({ "kind": z.literal("metric"), "metric": z.enum(["clicks", "views", "completed_views", "viewed_seconds", "viewable_rate", "engagements", "follows", "saves", "profile_visits", "reach"]), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional(), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.").optional(), "reach_unit": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").optional(), "target_frequency": z.object({ "min": z.number().int().gte(1).optional(), "max": z.number().int().gte(1).optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.") }).passthrough().and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).optional(), "view_duration_seconds": z.number().gt(0).optional(), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough().and(z.intersection(z.union([z.any().refine((value) => !z.object({ "metric": z.literal("viewable_rate") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "metric": z.literal("viewable_rate") }), z.object({ "target": z.object({ "value": z.any().optional() }).optional() }))]), z.any())), z.object({ "kind": z.literal("event"), "event_sources": z.array(z.object({ "event_source_id": z.string().min(1), "event_type": z.enum(["page_view", "view_content", "select_content", "select_item", "search", "share", "add_to_cart", "remove_from_cart", "viewed_cart", "add_to_wishlist", "initiate_checkout", "add_payment_info", "purchase", "refund", "lead", "qualify_lead", "close_convert_lead", "disqualify_lead", "complete_registration", "subscribe", "follow", "content_view", "watch_milestone", "start_trial", "app_install", "app_launch", "contact", "schedule", "donate", "submit_application", "custom"]).describe("Standard marketing event types for event logging, aligned with IAB ECAPI"), "custom_event_name": z.string().min(1).optional(), "value_field": z.string().min(1).optional(), "value_factor": z.number().default(1) }).passthrough()).min(1), "target": z.object({ "kind": z.literal("maximize_value") }).passthrough().optional(), "attribution_window": z.object({ "post_click": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-click attribution window. Conversions occurring within this duration after a click are attributed to the ad.").optional(), "post_view": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-view attribution window. Conversions occurring within this duration after an ad impression (without click) are attributed to the ad.").optional(), "model": z.enum(["last_touch", "first_touch", "linear", "time_decay", "data_driven"]).describe("Attribution model used to assign credit when multiple touchpoints exist. SHOULD be populated when committing to a specific model; when absent, the seller's default applies.").optional() }).catchall(z.any()).describe("Describes the attribution methodology and lookback windows used for conversion measurement. Enables cross-platform comparison by making attribution methodology transparent. Used as a `$ref` from `optimization-goal.json` (buyer's optimization-time attribution choice), `get-media-buy-delivery-response.json` (seller-declared attribution methodology in delivery reports), and similar surfaces. All fields are optional individually but at least one of `post_click`, `post_view`, or `model` SHOULD be populated; absence of `model` means the seller's default attribution model applies (typically `last_touch` per industry convention) \u2014 sellers SHOULD populate `model` explicitly when committing to a specific methodology.").optional(), "priority": z.number().int().gte(1).optional() }).passthrough(), z.object({ "kind": z.literal("vendor_metric"), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "metric_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).min(1).max(64).describe("Identifier for a vendor-defined metric within the vendor's vocabulary. Stable lookup key; the vendor publishes the canonical list (with category, methodology, and standard alignment) in `brand.json` `agents[type='measurement']`. Lowercase with underscores so a future enum promotion into `available-metric.json` is a literal string lift. Identifier is namespaced by the vendor \u2014 the same `metric_id` may mean different things in different vendors' vocabularies."), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough()];
|
|
15208
|
+
const schemas2 = [z.object({ "kind": z.literal("metric"), "metric": z.enum(["clicks", "views", "completed_views", "viewed_seconds", "viewable_rate", "engagements", "follows", "saves", "profile_visits", "reach"]), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional(), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.").optional(), "reach_unit": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").optional(), "target_frequency": z.object({ "min": z.number().int().gte(1).optional(), "max": z.number().int().gte(1).optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.") }).passthrough().and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).optional(), "view_duration_seconds": z.number().gt(0).optional(), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough().and(z.intersection(z.union([z.any().refine((value) => !z.object({ "metric": z.literal("viewable_rate") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "metric": z.literal("viewable_rate") }), z.object({ "target": z.object({ "value": z.any().optional() }).optional() }))]), z.any())), z.object({ "kind": z.literal("event"), "event_sources": z.array(z.object({ "event_source_id": z.string().min(1), "event_type": z.enum(["page_view", "view_content", "select_content", "select_item", "search", "share", "add_to_cart", "remove_from_cart", "viewed_cart", "add_to_wishlist", "initiate_checkout", "add_payment_info", "purchase", "refund", "lead", "qualify_lead", "close_convert_lead", "disqualify_lead", "complete_registration", "subscribe", "follow", "content_view", "watch_milestone", "start_trial", "app_install", "app_launch", "contact", "schedule", "donate", "submit_application", "custom"]).describe("Standard marketing event types for event logging, aligned with IAB ECAPI"), "custom_event_name": z.string().min(1).optional(), "value_field": z.string().min(1).optional(), "value_factor": z.number().default(1) }).passthrough()).min(1), "target": z.object({ "kind": z.literal("maximize_value") }).passthrough().optional(), "attribution_window": z.object({ "post_click": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-click attribution window. Conversions occurring within this duration after a click are attributed to the ad.").optional(), "post_view": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-view attribution window. Conversions occurring within this duration after an ad impression (without click) are attributed to the ad.").optional(), "model": z.enum(["last_touch", "first_touch", "linear", "time_decay", "data_driven"]).describe("Attribution model used to assign credit when multiple touchpoints exist. SHOULD be populated when committing to a specific model; when absent, the seller's default applies.").optional() }).catchall(z.any()).describe("Describes the attribution methodology and lookback windows used for conversion measurement. Enables cross-platform comparison by making attribution methodology transparent. Used as a `$ref` from `optimization-goal.json` (buyer's optimization-time attribution choice), `get-media-buy-delivery-response.json` (seller-declared attribution methodology in delivery reports), and similar surfaces. All fields are optional individually but at least one of `post_click`, `post_view`, or `model` SHOULD be populated; absence of `model` means the seller's default attribution model applies (typically `last_touch` per industry convention) \u2014 sellers SHOULD populate `model` explicitly when committing to a specific methodology.").optional(), "priority": z.number().int().gte(1).optional() }).passthrough(), z.object({ "kind": z.literal("vendor_metric"), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "metric_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).min(1).max(64).describe("Identifier for a vendor-defined metric within the vendor's vocabulary. Stable lookup key; the vendor publishes the canonical list (with category, methodology, and standard alignment) in `brand.json` `agents[type='measurement']`. Lowercase with underscores so a future enum promotion into `available-metric.json` is a literal string lift. Identifier is namespaced by the vendor \u2014 the same `metric_id` may mean different things in different vendors' vocabularies."), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough()];
|
|
15209
15209
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
15210
15210
|
({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
|
|
15211
15211
|
errors: [...errors3, ...result.error.issues],
|
|
@@ -15279,7 +15279,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
15279
15279
|
});
|
|
15280
15280
|
}
|
|
15281
15281
|
})).describe("One metric the seller commits to report for a commercial product term. Vendor identity uses BrandKey so the compact lifecycle does not inline brand or provenance documents.")).min(1) }).passthrough()).min(1).describe("Binding reporting contract keyed by position in purchases. Amendments preserve prior entries and add metrics with effective_at; seller-assigned package IDs live in the execution binding, outside this digest.").optional(), "cancellation_terms": z.object({ "effective_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), "fee": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().optional(), "reason": z.string().min(1).max(500).optional() }).passthrough().optional(), "change_terms": z.array(z.object({ "term_id": z.string().regex(new RegExp("^[A-Za-z0-9_.:-]+$")), "action": z.enum(["pause", "resume", "cancel", "extend_flight", "shorten_flight", "update_flight_dates", "increase_budget", "decrease_budget", "reallocate_budget", "update_budget_allocation", "update_targeting", "update_pacing", "update_bidding", "update_frequency_caps", "update_media_buy_frequency_cap", "update_catalog_assignments", "update_keywords", "update_optimization_goals", "update_impression_goal", "update_spend_target", "update_reporting_webhook", "replace_creative", "update_creative_assignments", "remove_creative", "add_packages", "remove_packages"]).describe("Fine-grained MediaBuy action vocabulary for compact product and lifecycle surfaces. Deprecated coarse 3.x actions are absent."), "service_mode": z.enum(["self_serve", "conditional_self_serve", "seller_managed", "requires_approval"]).describe("How a seller honors a routed compact-lifecycle action."), "allowed_statuses": z.array(z.enum(["pending_creatives", "pending_start", "active", "paused"])).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Non-terminal MediaBuy statuses in which this negotiated right may be exercised. When absent, the right applies in every non-terminal status where the canonical action itself is meaningful. This field describes contractual lifecycle scope; available_actions[] remains authoritative for the current instant.").optional(), "processing_sla": z.object({ "response_max": z.string().regex(new RegExp("^P(?!$)(\\d+Y)?(\\d+M)?(\\d+D)?(T(\\d+H)?(\\d+M)?(\\d+S)?)?$")).describe("Maximum elapsed time from when the buyer issues the action to when the seller acknowledges receipt (mode-appropriate: synchronous response for self_serve, tolerance decision for conditional_self_serve, or queue acknowledgement for seller_managed and legacy requires_approval). Sellers include weekends and non-working periods in the maximum. ISO 8601 duration.").optional(), "completion_max": z.string().regex(new RegExp("^P(?!$)(\\d+Y)?(\\d+M)?(\\d+D)?(T(\\d+H)?(\\d+M)?(\\d+S)?)?$")).describe("Maximum elapsed time from buyer issuing the action to the seller completing it (mutation applied, proposal finalized, or seller-managed decision resolved). Sellers include weekends and non-working periods in the maximum. ISO 8601 duration.").optional() }).passthrough().describe("Binding elapsed-time acknowledgement and completion commitment. Sellers account for weekends and non-working periods when declaring the maximum.").optional(), "conditions": z.array(z.string().regex(new RegExp("^[A-Za-z0-9][A-Za-z0-9_.:-]{0,199}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Opaque stable condition identifiers defined by terms_ref or bilateral commercial documentation. Implementations compare identifiers; they MUST NOT execute or interpret them as instructions.").optional(), "constraints": z.any().superRefine((x, ctx) => {
|
|
15282
|
-
const schemas = [z.object({ "kind": z.literal("budget"), "max_delta_amount": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().describe("Maximum absolute amount by which the affected budget may change in the direction named by the action.").optional(), "max_delta_percent": z.number().gte(0).describe("Maximum percentage change relative to the current committed value. Values above 100 are valid for increases greater than the current value.").optional(), "min_result_amount": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().describe("Minimum resulting committed value after the change.").optional(), "max_result_amount": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().describe("Maximum resulting committed value after the change.").optional() }).passthrough().and(z.union([z.object({ "max_delta_amount": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_delta_percent": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "min_result_amount": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_result_amount": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])), z.object({ "kind": z.literal("flight"), "max_change": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("Maximum extension, shortening, or shift in the direction named by the action.").optional(), "earliest_result": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "latest_result": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "minimum_notice": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("Minimum elapsed notice before the requested flight change may take effect.").optional() }).passthrough().and(z.union([z.object({ "max_change": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "earliest_result": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "latest_result": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "minimum_notice": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])), z.object({ "kind": z.literal("package_count"), "max_additions": z.number().int().gte(0).describe("Maximum packages that may be added by one exercise of the right.").optional(), "max_removals": z.number().int().gte(0).describe("Maximum packages that may be removed by one exercise of the right.").optional(), "max_result_count": z.number().int().gte(0).describe("Maximum active package count after the change.").optional() }).passthrough().and(z.union([z.object({ "max_additions": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_removals": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_result_count": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])), z.object({ "kind": z.literal("effective_timing"), "minimum_notice": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("Minimum elapsed notice before pause, resume, cancellation, or another operational action may take effect.").optional(), "earliest_effective_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "latest_effective_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() }).passthrough().and(z.union([z.object({ "minimum_notice": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "earliest_effective_at": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "latest_effective_at": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]))];
|
|
15282
|
+
const schemas = [z.object({ "kind": z.literal("budget"), "max_delta_amount": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().describe("Maximum absolute amount by which the affected budget may change in the direction named by the action.").optional(), "max_delta_percent": z.number().gte(0).describe("Maximum percentage change relative to the current committed value. Values above 100 are valid for increases greater than the current value.").optional(), "min_result_amount": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().describe("Minimum resulting committed value after the change.").optional(), "max_result_amount": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().describe("Maximum resulting committed value after the change.").optional() }).passthrough().and(z.union([z.object({ "max_delta_amount": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_delta_percent": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "min_result_amount": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_result_amount": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")), z.object({ "kind": z.literal("flight"), "max_change": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("Maximum extension, shortening, or shift in the direction named by the action.").optional(), "earliest_result": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "latest_result": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "minimum_notice": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("Minimum elapsed notice before the requested flight change may take effect.").optional() }).passthrough().and(z.union([z.object({ "max_change": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "earliest_result": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "latest_result": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "minimum_notice": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")), z.object({ "kind": z.literal("package_count"), "max_additions": z.number().int().gte(0).describe("Maximum packages that may be added by one exercise of the right.").optional(), "max_removals": z.number().int().gte(0).describe("Maximum packages that may be removed by one exercise of the right.").optional(), "max_result_count": z.number().int().gte(0).describe("Maximum active package count after the change.").optional() }).passthrough().and(z.union([z.object({ "max_additions": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_removals": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_result_count": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")), z.object({ "kind": z.literal("effective_timing"), "minimum_notice": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("Minimum elapsed notice before pause, resume, cancellation, or another operational action may take effect.").optional(), "earliest_effective_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "latest_effective_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() }).passthrough().and(z.union([z.object({ "minimum_notice": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "earliest_effective_at": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "latest_effective_at": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives."))];
|
|
15283
15283
|
const { errors, failed } = schemas.reduce(
|
|
15284
15284
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
15285
15285
|
errors: [...errors2, ...result.error.issues],
|
|
@@ -15303,8 +15303,8 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
15303
15303
|
message: "Invalid input: Should pass single schema. Passed " + passed
|
|
15304
15304
|
});
|
|
15305
15305
|
}
|
|
15306
|
-
}).describe("Portable bounds that buyer and seller SDKs can preflight. Omission means no machine-readable bound was promised; opaque conditions remain unevaluated.").optional(), "terms_ref": z.string().min(1).max(1e3).describe("Stable contract reference. Resolving it cannot expand the typed right and MUST use the caller's normal authenticated contract-document path, never ambient seller credentials.").optional(), "description": z.string().min(1).max(1e3).describe("Display-only summary; it cannot grant authority, add an action, or override typed fields.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().describe("A proposal-bound buyer change right. It binds to the resulting media buy and account, not personally to the caller, and may be exercised by any caller admitted by both seller account authorization and applicable signed governance delegation.")).min(1).describe("Binding buyer change rights included in the commercial envelope and therefore covered by terms_digest. Entries are uniquely keyed by action. When this field is present, an omitted action is not a negotiated change right. Omission of the entire field means legacy-unspecified rights, not a prohibition.").optional() }).passthrough().describe("Complete typed commercial envelope for a compact-lifecycle proposal. This is the authoritative audit and refinement snapshot; allocations and narrative fields are explanatory views rather than substitutes for these terms."), "terms_digest": z.string().regex(new RegExp("^sha256:[A-Za-z0-9_-]{43}$")).describe("Base64url SHA-256 digest of the RFC 8785 JCS serialization of commercial_terms, prefixed with sha256:."), "insertion_order": z.object({ "io_id": z.string().max(255).describe("Unique identifier for this insertion order. Referenced by io_acceptance on create_media_buy."), "terms": z.object({ "advertiser": z.string().max(500).describe("Advertiser name or identifier").optional(), "publisher": z.string().max(500).describe("Publisher name or identifier").optional(), "total_budget": z.object({ "amount": z.number().gte(0), "currency": z.string().min(3).max(3).describe("ISO 4217 currency code") }).describe("Total committed budget").optional(), "flight_start": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "flight_end": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "payment_terms": z.enum(["net_30", "net_60", "net_90", "prepaid", "due_on_receipt"]).describe("Payment terms").optional() }).catchall(z.any()).describe("Summary fields echoed from the committed proposal for agent verification. Buyer agents use these to confirm the IO matches what was negotiated before a human signs. These are read-only summaries, not negotiation surfaces \u2014 deal terms live on products and packages.").optional(), "terms_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to a human-readable document containing the full insertion order terms").optional(), "signing_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to an electronic signing service (e.g., DocuSign) for human signature workflows. When present, a human must sign before the buyer agent can proceed with create_media_buy.").optional(), "requires_signature": z.boolean().describe("Whether the buyer must accept this IO before creating a media buy. When true, create_media_buy requires an io_acceptance referencing this io_id.") }).catchall(z.any()).describe("A signing wrapper attached to a committed proposal. The IO does not introduce new deal terms \u2014 all negotiated terms (performance standards, measurement terms, cancellation policy, pricing) live on the product and package. The IO exists for human signature workflows and provides summary fields so buyer agents can verify the IO matches the committed proposal before a human signs.").optional(), "total_budget_guidance": z.object({ "min": z.number().gte(0).optional(), "recommended": z.number().gte(0).optional(), "max": z.number().gte(0).optional(), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().and(z.union([z.object({ "recommended": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Optional budget guidance for this proposal \u2014 the planning answer to criteria.outcome_target and to open-budget briefs. commercial_terms.total_budget remains the concrete figure the plan is priced at; this band expresses the seller's recommended range around it. When criteria.outcome_target carries cost_per, the cost answer is commercial_terms.bidding.cost_per and this band's currency equals cost_per.currency.").optional(), "forecast": z.object({ "points": z.array(z.object({ "label": z.string().max(128).optional(), "budget": z.number().gte(0).optional(), "product_id": z.string().optional(), "dimensions": z.array(z.any().superRefine((x, ctx) => {
|
|
15307
|
-
const schemas = [z.object({ "kind": z.literal("geo").describe("Dimension family discriminator."), "geo_level": z.enum(["country", "region", "metro", "postal_area"]).describe("Geographic level for this forecast point."), "system": z.string().describe("Classification system for metro or postal_area levels. Required when geo_level is 'metro' or 'postal_area'. Metro rows use metro-system enum values such as 'nielsen_dma'; native postal rows use country-local postal-system enum values such as 'zip' with country 'US'; deprecated legacy postal rows may use legacy-postal-system enum values such as 'us_zip'. Omit for country and region rows.").optional(), "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code. Required for native postal_area rows and omitted for legacy postal rows, metro rows, country rows, and region rows.").optional(), "geo_code": z.string().describe("Geographic code within the level and system. Country: ISO 3166-1 alpha-2 ('US'). Region: ISO 3166-2 with country prefix ('US-CA'). Metro/postal: system-specific code ('501', '10001')."), "geo_name": z.string().describe("Human-readable geographic name (e.g., 'United States', 'California', 'New York DMA').").optional() }).passthrough().and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("country") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("country") }), z.object({ "geo_code": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code.").optional() }))]), z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("region") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("region") }), z.object({ "geo_code": z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$")).describe("ISO 3166-2 subdivision code.").optional() }))])), z.intersection(z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("metro") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("metro") }), z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')") }))]), z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("postal_area") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("postal_area") }), z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })])).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom."), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system.") })]))])))).describe("A geographic dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("placement").describe("Dimension family discriminator."), "placement_ref": z.object({ "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring a publisher-catalog placement is hosted, or the inventory publisher associated with an inline placement. Omitted only for legacy single-publisher product-context references.").optional(), "placement_id": z.string().describe("Placement ID from the publisher's adagents.json placement catalog, or an inline seller-defined placement ID interpreted within the enclosing seller and product context.") }).catchall(z.any()).describe("Structured placement reference for this forecast row. References an entry from the product's placements array."), "placement_name": z.string().describe("Human-readable placement name, useful when the buyer has not resolved the placement catalog.").optional() }).passthrough().describe("A placement dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("device_type").describe("Dimension family discriminator."), "device_type": z.enum(["desktop", "mobile", "tablet", "ctv", "dooh", "unknown"]).describe("Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) \u2192 mobile, 2 (PC) \u2192 desktop, 4 (Phone) \u2192 mobile, 5 (Tablet) \u2192 tablet, 6 (Connected Device) \u2192 ctv, 7 (Set Top Box) \u2192 ctv. DOOH inventory uses dooh.") }).passthrough().describe("A device form-factor dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("device_platform").describe("Dimension family discriminator."), "device_platform": z.enum(["ios", "android", "windows", "macos", "linux", "chromeos", "tvos", "tizen", "webos", "fire_os", "roku_os", "unknown"]).describe("Operating system platforms for device targeting. Browser values from Sec-CH-UA-Platform standard, extended for CTV.") }).passthrough().describe("An operating-system or platform dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("audience").describe("Dimension family discriminator."), "audience_id": z.string().describe("Audience segment identifier for this forecast row."), "audience_source": z.enum(["synced", "platform", "third_party", "lookalike", "retargeting", "unknown"]).describe("Origin of the audience segment."), "audience_name": z.string().describe("Human-readable audience segment name.").optional() }).passthrough().describe("An audience segment dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("signal").describe("Dimension family discriminator."), "signal_ref": z.any().superRefine((x2, ctx2) => {
|
|
15306
|
+
}).describe("Portable bounds that buyer and seller SDKs can preflight. Omission means no machine-readable bound was promised; opaque conditions remain unevaluated.").optional(), "terms_ref": z.string().min(1).max(1e3).describe("Stable contract reference. Resolving it cannot expand the typed right and MUST use the caller's normal authenticated contract-document path, never ambient seller credentials.").optional(), "description": z.string().min(1).max(1e3).describe("Display-only summary; it cannot grant authority, add an action, or override typed fields.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().describe("A proposal-bound buyer change right. It binds to the resulting media buy and account, not personally to the caller, and may be exercised by any caller admitted by both seller account authorization and applicable signed governance delegation.")).min(1).describe("Binding buyer change rights included in the commercial envelope and therefore covered by terms_digest. Entries are uniquely keyed by action. When this field is present, an omitted action is not a negotiated change right. Omission of the entire field means legacy-unspecified rights, not a prohibition.").optional() }).passthrough().describe("Complete typed commercial envelope for a compact-lifecycle proposal. This is the authoritative audit and refinement snapshot; allocations and narrative fields are explanatory views rather than substitutes for these terms."), "terms_digest": z.string().regex(new RegExp("^sha256:[A-Za-z0-9_-]{43}$")).describe("Base64url SHA-256 digest of the RFC 8785 JCS serialization of commercial_terms, prefixed with sha256:."), "insertion_order": z.object({ "io_id": z.string().max(255).describe("Unique identifier for this insertion order. Referenced by io_acceptance on create_media_buy."), "terms": z.object({ "advertiser": z.string().max(500).describe("Advertiser name or identifier").optional(), "publisher": z.string().max(500).describe("Publisher name or identifier").optional(), "total_budget": z.object({ "amount": z.number().gte(0), "currency": z.string().min(3).max(3).describe("ISO 4217 currency code") }).describe("Total committed budget").optional(), "flight_start": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "flight_end": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "payment_terms": z.enum(["net_30", "net_60", "net_90", "prepaid", "due_on_receipt"]).describe("Payment terms").optional() }).catchall(z.any()).describe("Summary fields echoed from the committed proposal for agent verification. Buyer agents use these to confirm the IO matches what was negotiated before a human signs. These are read-only summaries, not negotiation surfaces \u2014 deal terms live on products and packages.").optional(), "terms_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to a human-readable document containing the full insertion order terms").optional(), "signing_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to an electronic signing service (e.g., DocuSign) for human signature workflows. When present, a human must sign before the buyer agent can proceed with create_media_buy.").optional(), "requires_signature": z.boolean().describe("Whether the buyer must accept this IO before creating a media buy. When true, create_media_buy requires an io_acceptance referencing this io_id.") }).catchall(z.any()).describe("A signing wrapper attached to a committed proposal. The IO does not introduce new deal terms \u2014 all negotiated terms (performance standards, measurement terms, cancellation policy, pricing) live on the product and package. The IO exists for human signature workflows and provides summary fields so buyer agents can verify the IO matches the committed proposal before a human signs.").optional(), "total_budget_guidance": z.object({ "min": z.number().gte(0).optional(), "recommended": z.number().gte(0).optional(), "max": z.number().gte(0).optional(), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().and(z.union([z.object({ "recommended": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Optional budget guidance for this proposal \u2014 the planning answer to criteria.outcome_target and to open-budget briefs. commercial_terms.total_budget remains the concrete figure the plan is priced at; this band expresses the seller's recommended range around it. When criteria.outcome_target carries cost_per, the cost answer is commercial_terms.bidding.cost_per and this band's currency equals cost_per.currency.").optional(), "forecast": z.object({ "points": z.array(z.object({ "label": z.string().max(128).optional(), "budget": z.number().gte(0).optional(), "product_id": z.string().optional(), "dimensions": z.array(z.any().superRefine((x, ctx) => {
|
|
15307
|
+
const schemas = [z.object({ "kind": z.literal("geo").describe("Dimension family discriminator."), "geo_level": z.enum(["country", "region", "metro", "postal_area"]).describe("Geographic level for this forecast point."), "system": z.string().describe("Classification system for metro or postal_area levels. Required when geo_level is 'metro' or 'postal_area'. Metro rows use metro-system enum values such as 'nielsen_dma'; native postal rows use country-local postal-system enum values such as 'zip' with country 'US'; deprecated legacy postal rows may use legacy-postal-system enum values such as 'us_zip'. Omit for country and region rows.").optional(), "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code. Required for native postal_area rows and omitted for legacy postal rows, metro rows, country rows, and region rows.").optional(), "geo_code": z.string().describe("Geographic code within the level and system. Country: ISO 3166-1 alpha-2 ('US'). Region: ISO 3166-2 with country prefix ('US-CA'). Metro/postal: system-specific code ('501', '10001')."), "geo_name": z.string().describe("Human-readable geographic name (e.g., 'United States', 'California', 'New York DMA').").optional() }).passthrough().and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("country") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("country") }), z.object({ "geo_code": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code.").optional() }))]), z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("region") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("region") }), z.object({ "geo_code": z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$")).describe("ISO 3166-2 subdivision code.").optional() }))])), z.intersection(z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("metro") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("metro") }), z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')") }))]), z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("postal_area") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("postal_area") }), z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })]).describe("Must also satisfy at least one of these alternatives.")).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom."), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system.") })]))])))).describe("A geographic dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("placement").describe("Dimension family discriminator."), "placement_ref": z.object({ "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring a publisher-catalog placement is hosted, or the inventory publisher associated with an inline placement. Omitted only for legacy single-publisher product-context references.").optional(), "placement_id": z.string().describe("Placement ID from the publisher's adagents.json placement catalog, or an inline seller-defined placement ID interpreted within the enclosing seller and product context.") }).catchall(z.any()).describe("Structured placement reference for this forecast row. References an entry from the product's placements array."), "placement_name": z.string().describe("Human-readable placement name, useful when the buyer has not resolved the placement catalog.").optional() }).passthrough().describe("A placement dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("device_type").describe("Dimension family discriminator."), "device_type": z.enum(["desktop", "mobile", "tablet", "ctv", "dooh", "unknown"]).describe("Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) \u2192 mobile, 2 (PC) \u2192 desktop, 4 (Phone) \u2192 mobile, 5 (Tablet) \u2192 tablet, 6 (Connected Device) \u2192 ctv, 7 (Set Top Box) \u2192 ctv. DOOH inventory uses dooh.") }).passthrough().describe("A device form-factor dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("device_platform").describe("Dimension family discriminator."), "device_platform": z.enum(["ios", "android", "windows", "macos", "linux", "chromeos", "tvos", "tizen", "webos", "fire_os", "roku_os", "unknown"]).describe("Operating system platforms for device targeting. Browser values from Sec-CH-UA-Platform standard, extended for CTV.") }).passthrough().describe("An operating-system or platform dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("audience").describe("Dimension family discriminator."), "audience_id": z.string().describe("Audience segment identifier for this forecast row."), "audience_source": z.enum(["synced", "platform", "third_party", "lookalike", "retargeting", "unknown"]).describe("Origin of the audience segment."), "audience_name": z.string().describe("Human-readable audience segment name.").optional() }).passthrough().describe("An audience segment dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("signal").describe("Dimension family discriminator."), "signal_ref": z.any().superRefine((x2, ctx2) => {
|
|
15308
15308
|
const schemas2 = [z.object({ "scope": z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Product-local signal identifier. For local signals exposed on both get_signals and get_products, this MUST match get_signals.signals[].signal_ref.signal_id for the same signal.") }).catchall(z.any()).describe("Product-scoped signal. The signal_id is meaningful only within the selected product/package context and MUST match a Product.included_signals[].signal_ref.signal_id or Product.signal_targeting_options[].signal_ref.signal_id for that product, depending on whether the signal is descriptive or selectable."), z.object({ "scope": z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that publishes the signal definition in its adagents.json signals[]."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(z.any()).describe("Data-provider-scoped signal. The signal_id resolves through the data provider's published adagents.json signals[] and can be authorization-verified there."), z.object({ "scope": z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(z.any()).describe("Signal-source-scoped signal. Use this for source-native signals that are not published in upstream adagents.json signals[]. The buyer trusts the issuing signal source for this identity; use scope 'data_provider' instead when the signal is published in adagents.json signals[], even if the publisher is also the seller or signal source.")];
|
|
15309
15309
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
15310
15310
|
({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
|
|
@@ -15329,7 +15329,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
15329
15329
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
15330
15330
|
});
|
|
15331
15331
|
}
|
|
15332
|
-
}).describe("Canonical signal reference for this forecast row. Required when the row needs to disambiguate product-local, data-provider, or signal-source identity. Product-relative forecasts SHOULD use signal_ref.").optional(), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier shorthand for this forecast row. Use only when the enclosing context already identifies the signal unambiguously, such as a coverage_forecast nested directly under one get_signals signal item. Otherwise use signal_ref.").optional(), "signal_value": z.union([z.string().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value."), z.number().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value."), z.boolean().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value."), z.null().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value.")]).describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value.").optional(), "presence": z.enum(["present", "absent"]).describe("Whether the signal is present for this point. Use 'absent' for the explicit not-present bucket."), "signal_name": z.string().describe("Human-readable signal name, useful when the buyer has not resolved the signal definition.").optional(), "signal_value_name": z.string().describe("Human-readable label for the signal value bucket.").optional() }).passthrough().and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "presence": z.literal("absent") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "presence": z.literal("absent") }), z.object({ "signal_value": z.null() }))]), z.union([z.any().refine((value) => !z.object({ "presence": z.literal("present") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "presence": z.literal("present") }), z.object({ "signal_value": z.union([z.string(), z.number(), z.boolean()]).optional() }))]))).describe("A signal value or signal-presence dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("time").describe("Dimension family discriminator."), "start_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), "end_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time") }).passthrough().describe("A calendar-window dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules. Windows are half-open intervals [start_time, end_time): the row covers instants at or after start_time and strictly before end_time, so adjacent windows share a boundary without overlapping. end_time MUST be after start_time; JSON Schema draft-07 cannot compare sibling values, so conformance tooling enforces the ordering. Within one forecast, sellers MUST emit non-overlapping windows and SHOULD coalesce adjacent windows whose availability_status and metrics do not materially differ. When the request scoped the forecast with offer_filters.availability_horizon, a complete forecast partitions the requested horizon; a seller that cannot cover the full horizon signals the gap through the response's incomplete[] mechanism rather than silently omitting windows.")];
|
|
15332
|
+
}).describe("Canonical signal reference for this forecast row. Required when the row needs to disambiguate product-local, data-provider, or signal-source identity. Product-relative forecasts SHOULD use signal_ref.").optional(), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier shorthand for this forecast row. Use only when the enclosing context already identifies the signal unambiguously, such as a coverage_forecast nested directly under one get_signals signal item. Otherwise use signal_ref.").optional(), "signal_value": z.union([z.string().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value."), z.number().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value."), z.boolean().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value."), z.null().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value.")]).describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value.").optional(), "presence": z.enum(["present", "absent"]).describe("Whether the signal is present for this point. Use 'absent' for the explicit not-present bucket."), "signal_name": z.string().describe("Human-readable signal name, useful when the buyer has not resolved the signal definition.").optional(), "signal_value_name": z.string().describe("Human-readable label for the signal value bucket.").optional() }).passthrough().and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "presence": z.literal("absent") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "presence": z.literal("absent") }), z.object({ "signal_value": z.null() }))]), z.union([z.any().refine((value) => !z.object({ "presence": z.literal("present") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "presence": z.literal("present") }), z.object({ "signal_value": z.union([z.string(), z.number(), z.boolean()]).optional() }))]))).describe("A signal value or signal-presence dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("time").describe("Dimension family discriminator."), "start_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), "end_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time") }).passthrough().describe("A calendar-window dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules. Windows are half-open intervals [start_time, end_time): the row covers instants at or after start_time and strictly before end_time, so adjacent windows share a boundary without overlapping. end_time MUST be after start_time; JSON Schema draft-07 cannot compare sibling values, so conformance tooling enforces the ordering. Within one forecast, sellers MUST emit non-overlapping windows and SHOULD coalesce adjacent windows whose availability_status and metrics do not materially differ. When the request scoped the forecast with offer_filters.availability_horizon, a complete forecast partitions the requested horizon; a seller that cannot cover the full horizon signals the gap through the response's incomplete[] mechanism rather than silently omitting windows.")];
|
|
15333
15333
|
const { errors, failed } = schemas.reduce(
|
|
15334
15334
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
15335
15335
|
errors: [...errors2, ...result.error.issues],
|
|
@@ -15353,7 +15353,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
15353
15353
|
message: "Invalid input: Should pass single schema. Passed " + passed
|
|
15354
15354
|
});
|
|
15355
15355
|
}
|
|
15356
|
-
})).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Dimension constraints represented by a ForecastPoint. Use this when one product, proposal, or signal coverage forecast needs to expose availability or forecasted delivery by country, region, placement, device, audience, signal value, time window, or intersections such as placement x country without creating separate products solely for each slice. Each item declares one dimension family via `kind`; when multiple items are present, the point represents their intersection. Sellers MUST NOT emit more than one item for each `kind` in a point. Consumers MUST NOT treat repeated kinds as OR semantics; repeated peer values such as two countries are a seller conformance issue. Dimension values are descriptors of the forecast row and are independent of pricing_options.").optional(), "availability_status": z.enum(["available", "unavailable"]).describe("Bookability of the inventory a forecast row describes, as of the forecast's generated_at. A snapshot, never a hold: valid_until bounds freshness, and proposal finalization or purchase remains the commitment boundary.").optional(), "metrics": z.object({ "coverage_rate": z.intersection(z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together."), z.object({ "low": z.any().optional(), "mid": z.any().optional(), "high": z.any().optional() })).describe("A forecast range whose low, midpoint, and high values are rates in the inclusive interval from 0 to 1.").optional() }).catchall(z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.")), "viewability": z.object({ "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.").optional(), "measurable_impressions": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "viewable_impressions": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "viewable_rate": z.intersection(z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together."), z.object({ "low": z.any().optional(), "mid": z.any().optional(), "high": z.any().optional() })).describe("A forecast range whose low, midpoint, and high values are rates in the inclusive interval from 0 to 1.").optional(), "viewed_seconds": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.union([z.object({ "measurable_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "viewable_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "viewable_rate": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "viewed_seconds": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "standard": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).optional(), "vendor_metric_values": z.array(z.object({ "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "metric_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).min(1).max(64).describe("Identifier for a vendor-defined metric within the vendor's vocabulary. Stable lookup key; the vendor publishes the canonical list (with category, methodology, and standard alignment) in `brand.json` `agents[type='measurement']`. Lowercase with underscores so a future enum promotion into `available-metric.json` is a literal string lift. Identifier is namespaced by the vendor \u2014 the same `metric_id` may mean different things in different vendors' vocabularies."), "value": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together."), "unit": z.string().optional(), "measurable_impressions": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "breakdown": z.record(z.string(), z.any()).optional() }).passthrough().describe("Compact forecasted vendor metric with a BrandKey vendor pointer and no embedded brand assets.")).optional() }).passthrough().describe("Compact forecast row with numeric ranges and identity-only measurement-vendor references.")).min(1), "forecast_range_unit": z.enum(["spend", "availability", "reach_freq", "weekly", "daily", "clicks", "conversions", "package"]).describe("Describes how to interpret the points array in a DeliveryForecast \u2014 what axis the curve represents").optional(), "method": z.enum(["estimate", "modeled", "guaranteed"]).describe("Method used to produce a delivery forecast"), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")), "demographic_system": z.enum(["nielsen", "nielsen_audio", "barb", "agf", "oztam", "mediametrie", "custom"]).describe("Audience measurement systems for demographic notation in GRP forecasts and pricing, across video and audio channels. Specifies how demographics are written, not whose panel produced the numbers \u2014 provider identity is measurement_source.").optional(), "demographic": z.string().optional(), "measurement_source": z.string().regex(new RegExp("^[a-z0-9_]+$")).max(64).optional(), "reach_unit": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").optional(), "generated_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "valid_until": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().describe("Compact product forecast without legacy BrandRef or creative dependencies.").describe("Aggregate forecasted delivery for the proposal. For outcome_target requests, points carry the goal's metric or event key in metrics; with cost_per, that is the goal volume planned under the commercial_terms.bidding policy, and currency equals cost_per.currency.").optional() }).passthrough().describe("Compact immutable proposal for the AdCP 3.2 lifecycle. commercial_terms is the sole authoritative commercial envelope; narrative fields do not duplicate legacy allocation or creative graphs.");
|
|
15356
|
+
})).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Dimension constraints represented by a ForecastPoint. Use this when one product, proposal, or signal coverage forecast needs to expose availability or forecasted delivery by country, region, placement, device, audience, signal value, time window, or intersections such as placement x country without creating separate products solely for each slice. Each item declares one dimension family via `kind`; when multiple items are present, the point represents their intersection. Sellers MUST NOT emit more than one item for each `kind` in a point. Consumers MUST NOT treat repeated kinds as OR semantics; repeated peer values such as two countries are a seller conformance issue. Dimension values are descriptors of the forecast row and are independent of pricing_options.").optional(), "availability_status": z.enum(["available", "unavailable"]).describe("Bookability of the inventory a forecast row describes, as of the forecast's generated_at. A snapshot, never a hold: valid_until bounds freshness, and proposal finalization or purchase remains the commitment boundary.").optional(), "metrics": z.object({ "coverage_rate": z.intersection(z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together."), z.object({ "low": z.any().optional(), "mid": z.any().optional(), "high": z.any().optional() })).describe("A forecast range whose low, midpoint, and high values are rates in the inclusive interval from 0 to 1.").optional() }).catchall(z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.")), "viewability": z.object({ "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.").optional(), "measurable_impressions": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "viewable_impressions": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "viewable_rate": z.intersection(z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together."), z.object({ "low": z.any().optional(), "mid": z.any().optional(), "high": z.any().optional() })).describe("A forecast range whose low, midpoint, and high values are rates in the inclusive interval from 0 to 1.").optional(), "viewed_seconds": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.union([z.object({ "measurable_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "viewable_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "viewable_rate": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "viewed_seconds": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "standard": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).optional(), "vendor_metric_values": z.array(z.object({ "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "metric_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).min(1).max(64).describe("Identifier for a vendor-defined metric within the vendor's vocabulary. Stable lookup key; the vendor publishes the canonical list (with category, methodology, and standard alignment) in `brand.json` `agents[type='measurement']`. Lowercase with underscores so a future enum promotion into `available-metric.json` is a literal string lift. Identifier is namespaced by the vendor \u2014 the same `metric_id` may mean different things in different vendors' vocabularies."), "value": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together."), "unit": z.string().optional(), "measurable_impressions": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "breakdown": z.record(z.string(), z.any()).optional() }).passthrough().describe("Compact forecasted vendor metric with a BrandKey vendor pointer and no embedded brand assets.")).optional() }).passthrough().describe("Compact forecast row with numeric ranges and identity-only measurement-vendor references.")).min(1), "forecast_range_unit": z.enum(["spend", "availability", "reach_freq", "weekly", "daily", "clicks", "conversions", "package"]).describe("Describes how to interpret the points array in a DeliveryForecast \u2014 what axis the curve represents").optional(), "method": z.enum(["estimate", "modeled", "guaranteed"]).describe("Method used to produce a delivery forecast"), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")), "demographic_system": z.enum(["nielsen", "nielsen_audio", "barb", "agf", "oztam", "mediametrie", "custom"]).describe("Audience measurement systems for demographic notation in GRP forecasts and pricing, across video and audio channels. Specifies how demographics are written, not whose panel produced the numbers \u2014 provider identity is measurement_source.").optional(), "demographic": z.string().optional(), "measurement_source": z.string().regex(new RegExp("^[a-z0-9_]+$")).max(64).optional(), "reach_unit": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").optional(), "generated_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "valid_until": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().describe("Compact product forecast without legacy BrandRef or creative dependencies.").describe("Aggregate forecasted delivery for the proposal. For outcome_target requests, points carry the goal's metric or event key in metrics; with cost_per, that is the goal volume planned under the commercial_terms.bidding policy, and currency equals cost_per.currency.").optional() }).passthrough().describe("Compact immutable proposal for the AdCP 3.2 lifecycle. commercial_terms is the sole authoritative commercial envelope; narrative fields do not duplicate legacy allocation or creative graphs.");
|
|
15357
15357
|
const exactSchema = objectSchema.superRefine((value, ctx) => {
|
|
15358
15358
|
const checked = z.intersection(z.intersection(z.union([z.any().refine((value2) => !z.object({ "proposal_kind": z.enum(["media_buy_update", "media_buy_cancellation"]) }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "proposal_kind": z.enum(["media_buy_update", "media_buy_cancellation"]) }), z.object({ "parent_proposal_id": z.any().refine((value2) => value2 !== void 0, "Required"), "media_buy_id": z.any().refine((value2) => value2 !== void 0, "Required"), "base_media_buy_revision": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough())]), z.union([z.any().refine((value2) => !z.object({ "proposal_status": z.literal("accepted") }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "proposal_status": z.literal("accepted") }), z.object({ "media_buy_id": z.any().refine((value2) => value2 !== void 0, "Required"), "accepted_at": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough())])), z.intersection(z.union([z.any().refine((value2) => !z.object({ "proposal_status": z.literal("committed") }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "proposal_status": z.literal("committed") }), z.object({ "expires_at": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough())]), z.union([z.any().refine((value2) => !z.object({ "proposal_kind": z.literal("media_buy_cancellation") }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "proposal_kind": z.literal("media_buy_cancellation") }), z.object({ "commercial_terms": z.object({ "cancellation_terms": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().optional() }))]))).safeParse(value);
|
|
15359
15359
|
if (!checked.success) {
|
|
@@ -15434,7 +15434,7 @@ const BuyProductsRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
15434
15434
|
budget_cap_timezone: z.string().min(1).optional(),
|
|
15435
15435
|
budget_allocation: CanonicalBudgetAllocationSchema.optional(),
|
|
15436
15436
|
start_time: StartTimingSchema,
|
|
15437
|
-
end_time: z.
|
|
15437
|
+
end_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
15438
15438
|
pacing: PacingSchema.optional(),
|
|
15439
15439
|
bidding: BiddingPolicySchema.optional(),
|
|
15440
15440
|
paused: z.boolean().optional(),
|
|
@@ -15456,7 +15456,7 @@ const CommittedMediaBuySchema = /* @__PURE__ */ (() => z.object({
|
|
|
15456
15456
|
name: z.string().min(1).max(255).regex(/\S/).optional(),
|
|
15457
15457
|
revision: z.int().min(1),
|
|
15458
15458
|
media_buy_status: MediaBuyStatusSchema.optional(),
|
|
15459
|
-
confirmed_at: z.
|
|
15459
|
+
confirmed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
|
|
15460
15460
|
accepted_proposal: CanonicalProposalSchema.and(z.object({
|
|
15461
15461
|
proposal_status: z.literal("accepted"),
|
|
15462
15462
|
media_buy_id: z.string().min(1)
|
|
@@ -15987,8 +15987,8 @@ const PackageUpdateSchema = /* @__PURE__ */ (() => z.object({
|
|
|
15987
15987
|
bidding: BiddingPolicySchema.optional().nullable(),
|
|
15988
15988
|
impressions: z.number().min(0).optional(),
|
|
15989
15989
|
daily_budget_cap: z.number().min(0).optional().nullable(),
|
|
15990
|
-
start_time: z.
|
|
15991
|
-
end_time: z.
|
|
15990
|
+
start_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
15991
|
+
end_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
15992
15992
|
paused: z.boolean().optional(),
|
|
15993
15993
|
canceled: z.literal(true).optional(),
|
|
15994
15994
|
cancellation_reason: z.string().max(500).optional(),
|
|
@@ -16030,7 +16030,7 @@ const UpdateMediaBuySuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16030
16030
|
budget_allocation: BudgetAllocationSchema.optional(),
|
|
16031
16031
|
pacing: PacingSchema.optional(),
|
|
16032
16032
|
bidding: BiddingPolicySchema.optional(),
|
|
16033
|
-
implementation_date: z.
|
|
16033
|
+
implementation_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
|
|
16034
16034
|
invoice_recipient: BusinessEntitySchema.optional(),
|
|
16035
16035
|
affected_packages: z.array(PackageSchema).optional(),
|
|
16036
16036
|
valid_actions: z.array(MediaBuyValidActionSchema).optional(),
|
|
@@ -16105,16 +16105,16 @@ const PackageStatusSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16105
16105
|
pacing: PacingSchema.optional(),
|
|
16106
16106
|
targeting_overlay: TargetingOverlaySchema.optional(),
|
|
16107
16107
|
targeting_resolution: PackageTargetingResolutionSchema.optional(),
|
|
16108
|
-
start_time: z.
|
|
16109
|
-
end_time: z.
|
|
16108
|
+
start_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
16109
|
+
end_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
16110
16110
|
paused: z.boolean().optional(),
|
|
16111
16111
|
canceled: z.boolean().optional(),
|
|
16112
16112
|
cancellation: z.object({
|
|
16113
|
-
canceled_at: z.
|
|
16113
|
+
canceled_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
16114
16114
|
canceled_by: CanceledBySchema,
|
|
16115
16115
|
reason: z.string().max(500).optional()
|
|
16116
16116
|
}).passthrough().optional(),
|
|
16117
|
-
creative_deadline: z.
|
|
16117
|
+
creative_deadline: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
16118
16118
|
context: ContextObjectSchema.optional(),
|
|
16119
16119
|
creative_approvals: z.array(z.object({
|
|
16120
16120
|
creative_id: z.string(),
|
|
@@ -16124,8 +16124,8 @@ const PackageStatusSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16124
16124
|
indicators: z.array(IndicatorSchema.and(z.object({
|
|
16125
16125
|
type: z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]).optional()
|
|
16126
16126
|
}).passthrough())).optional(),
|
|
16127
|
-
indicator_types_evaluated: z.array(IndicatorTypeSchema.and(z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]))).optional(),
|
|
16128
|
-
indicators_as_of: z.
|
|
16127
|
+
indicator_types_evaluated: z.array(IndicatorTypeSchema.and(z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]).describe("Must also satisfy at least one of these alternatives."))).optional(),
|
|
16128
|
+
indicators_as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
16129
16129
|
indicators_evaluated_scope: z.array(IndicatorScopeSchema).optional()
|
|
16130
16130
|
}).passthrough()).optional(),
|
|
16131
16131
|
formats_to_provide: z.array(PackageFormatSnapshotSchema).optional(),
|
|
@@ -16134,7 +16134,7 @@ const PackageStatusSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16134
16134
|
format_ids_pending: z.array(FormatReferenceStructuredObjectSchema).optional(),
|
|
16135
16135
|
snapshot_unavailable_reason: SnapshotUnavailableReasonSchema.optional(),
|
|
16136
16136
|
snapshot: z.object({
|
|
16137
|
-
as_of: z.
|
|
16137
|
+
as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
16138
16138
|
staleness_seconds: z.int().min(0),
|
|
16139
16139
|
impressions: z.number().min(0),
|
|
16140
16140
|
spend: z.number().min(0),
|
|
@@ -16200,10 +16200,10 @@ const GetMediaBuyDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16200
16200
|
partial_data: z.boolean().optional(),
|
|
16201
16201
|
unavailable_count: z.int().min(0).optional(),
|
|
16202
16202
|
sequence_number: z.int().min(1).optional(),
|
|
16203
|
-
next_expected_at: z.
|
|
16203
|
+
next_expected_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
16204
16204
|
reporting_period: z.object({
|
|
16205
|
-
start: z.
|
|
16206
|
-
end: z.
|
|
16205
|
+
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
16206
|
+
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
16207
16207
|
timezone: z.string().min(1).optional()
|
|
16208
16208
|
}).passthrough(),
|
|
16209
16209
|
reporting_revision_binding: z.object({
|
|
@@ -16241,10 +16241,10 @@ const GetMediaBuyDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16241
16241
|
media_buy_id: z.string(),
|
|
16242
16242
|
currency: z.string().regex(/^[A-Z]{3}$/).optional(),
|
|
16243
16243
|
status: z.union([z.literal("pending_creatives"), z.literal("pending_start"), z.literal("pending"), z.literal("active"), z.literal("paused"), z.literal("completed"), z.literal("rejected"), z.literal("canceled"), z.literal("failed"), z.literal("reporting_delayed")]),
|
|
16244
|
-
expected_availability: z.
|
|
16244
|
+
expected_availability: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
16245
16245
|
is_adjusted: z.boolean().optional(),
|
|
16246
16246
|
is_final: z.boolean().optional(),
|
|
16247
|
-
finalized_at: z.
|
|
16247
|
+
finalized_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
16248
16248
|
pricing_model: PricingModelSchema.optional(),
|
|
16249
16249
|
pacing_index: z.number().min(0).optional(),
|
|
16250
16250
|
totals: DeliveryMetricsSchema.merge(z.object({
|
|
@@ -16259,7 +16259,7 @@ const GetMediaBuyDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16259
16259
|
delivery_status: DeliveryStatusSchema.optional(),
|
|
16260
16260
|
paused: z.boolean().optional(),
|
|
16261
16261
|
is_final: z.boolean().optional(),
|
|
16262
|
-
finalized_at: z.
|
|
16262
|
+
finalized_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
16263
16263
|
measurement_window: z.string().max(50).optional(),
|
|
16264
16264
|
supersedes_window: z.string().max(50).optional(),
|
|
16265
16265
|
missing_metrics: z.array(MissingMetricSchema).optional(),
|
|
@@ -16346,7 +16346,7 @@ const GetMediaBuyDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16346
16346
|
by_spot: z.array(DeliveryMetricsSchema.merge(z.object({
|
|
16347
16347
|
spot_id: z.string().min(1),
|
|
16348
16348
|
creative_id: z.string().min(1).optional(),
|
|
16349
|
-
aired_at: z.
|
|
16349
|
+
aired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
16350
16350
|
network: z.string().min(1).optional(),
|
|
16351
16351
|
station: z.string().min(1).optional(),
|
|
16352
16352
|
daypart: z.string().min(1).optional()
|
|
@@ -16364,8 +16364,8 @@ const GetMediaBuyDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16364
16364
|
}).passthrough()).optional()
|
|
16365
16365
|
}).passthrough())),
|
|
16366
16366
|
windows: z.array(z.object({
|
|
16367
|
-
window_start: z.
|
|
16368
|
-
window_end: z.
|
|
16367
|
+
window_start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
16368
|
+
window_end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
16369
16369
|
totals: DeliveryMetricsSchema,
|
|
16370
16370
|
by_package: z.array(DeliveryMetricsSchema.merge(z.object({
|
|
16371
16371
|
package_id: z.string(),
|
|
@@ -16454,7 +16454,7 @@ const ProvidePerformanceFeedbackResponseSchema = /* @__PURE__ */ (() => z.object
|
|
|
16454
16454
|
payload: z.object({}).passthrough().optional(),
|
|
16455
16455
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
16456
16456
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
16457
|
-
}).passthrough().and(z.union([ProvidePerformanceFeedbackSuccessSchema, ProvidePerformanceFeedbackErrorSchema])))();
|
|
16457
|
+
}).passthrough().and(z.union([ProvidePerformanceFeedbackSuccessSchema, ProvidePerformanceFeedbackErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
16458
16458
|
const SyncEventSourcesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
16459
16459
|
context_id: z.string().optional(),
|
|
16460
16460
|
context: ContextObjectSchema.optional(),
|
|
@@ -16469,7 +16469,7 @@ const SyncEventSourcesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16469
16469
|
payload: z.object({}).passthrough().optional(),
|
|
16470
16470
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
16471
16471
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
16472
|
-
}).passthrough().and(z.union([SyncEventSourcesSuccessSchema, SyncEventSourcesErrorSchema])))();
|
|
16472
|
+
}).passthrough().and(z.union([SyncEventSourcesSuccessSchema, SyncEventSourcesErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
16473
16473
|
const LogEventResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
16474
16474
|
context_id: z.string().optional(),
|
|
16475
16475
|
context: ContextObjectSchema.optional(),
|
|
@@ -16484,7 +16484,7 @@ const LogEventResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16484
16484
|
payload: z.object({}).passthrough().optional(),
|
|
16485
16485
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
16486
16486
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
16487
|
-
}).passthrough().and(z.union([LogEventSuccessSchema, LogEventErrorSchema])))();
|
|
16487
|
+
}).passthrough().and(z.union([LogEventSuccessSchema, LogEventErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
16488
16488
|
const SyncAudiencesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
16489
16489
|
context_id: z.string().optional(),
|
|
16490
16490
|
context: ContextObjectSchema.optional(),
|
|
@@ -16499,7 +16499,7 @@ const SyncAudiencesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16499
16499
|
payload: z.object({}).passthrough().optional(),
|
|
16500
16500
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
16501
16501
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
16502
|
-
}).passthrough().and(z.union([SyncAudiencesSuccessSchema, SyncAudiencesErrorSchema, SyncAudiencesSubmittedSchema])))();
|
|
16502
|
+
}).passthrough().and(z.union([SyncAudiencesSuccessSchema, SyncAudiencesErrorSchema, SyncAudiencesSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
16503
16503
|
const BuildCreativeRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
16504
16504
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
16505
16505
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
@@ -16562,7 +16562,7 @@ const BuildCreativeSuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16562
16562
|
build_variant_id: z.string().optional(),
|
|
16563
16563
|
recipe_hash: z.string().optional(),
|
|
16564
16564
|
sandbox: z.boolean().optional(),
|
|
16565
|
-
expires_at: z.
|
|
16565
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
16566
16566
|
preview: z.object({
|
|
16567
16567
|
previews: z.array(z.object({
|
|
16568
16568
|
preview_id: z.string(),
|
|
@@ -16574,7 +16574,7 @@ const BuildCreativeSuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16574
16574
|
}).passthrough()
|
|
16575
16575
|
}).passthrough()),
|
|
16576
16576
|
interactive_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
16577
|
-
expires_at: z.
|
|
16577
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
16578
16578
|
}).passthrough().optional(),
|
|
16579
16579
|
preview_error: ErrorSchema.optional(),
|
|
16580
16580
|
pricing_option_id: z.string().optional(),
|
|
@@ -16675,7 +16675,7 @@ const PreviewCreativeResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16675
16675
|
payload: z.object({}).passthrough().optional(),
|
|
16676
16676
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
16677
16677
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
16678
|
-
}).passthrough().and(z.union([PreviewCreativeSingleResponseSchema, PreviewCreativeBatchResponseSchema, PreviewCreativeVariantResponseSchema, PreviewCreativeSubmittedSchema])))();
|
|
16678
|
+
}).passthrough().and(z.union([PreviewCreativeSingleResponseSchema, PreviewCreativeBatchResponseSchema, PreviewCreativeVariantResponseSchema, PreviewCreativeSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
16679
16679
|
const ListTransformersResponseCreativeAgentSchema = /* @__PURE__ */ (() => z.object({
|
|
16680
16680
|
context_id: z.string().optional(),
|
|
16681
16681
|
context: ContextObjectSchema.optional(),
|
|
@@ -16713,8 +16713,8 @@ const GetCreativeDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16713
16713
|
media_buy_id: z.string().optional(),
|
|
16714
16714
|
currency: z.string().regex(/^[A-Z]{3}$/),
|
|
16715
16715
|
reporting_period: z.object({
|
|
16716
|
-
start: z.
|
|
16717
|
-
end: z.
|
|
16716
|
+
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
16717
|
+
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
16718
16718
|
timezone: z.string().optional()
|
|
16719
16719
|
}).passthrough(),
|
|
16720
16720
|
creatives: z.array(z.object({
|
|
@@ -16792,7 +16792,7 @@ const SyncCreativesSuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16792
16792
|
warnings: z.array(z.string()).optional(),
|
|
16793
16793
|
macro_resolution_results: z.array(MacroResolutionResultSchema).optional(),
|
|
16794
16794
|
preview_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
16795
|
-
expires_at: z.
|
|
16795
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
16796
16796
|
assigned_to: z.array(z.string()).optional(),
|
|
16797
16797
|
assignment_errors: z.record(z.string(), z.string()).optional()
|
|
16798
16798
|
}).passthrough()),
|
|
@@ -16820,7 +16820,7 @@ const ActivateSignalResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16820
16820
|
payload: z.object({}).passthrough().optional(),
|
|
16821
16821
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
16822
16822
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
16823
|
-
}).passthrough().and(z.union([ActivateSignalSuccessSchema, ActivateSignalErrorSchema])))();
|
|
16823
|
+
}).passthrough().and(z.union([ActivateSignalSuccessSchema, ActivateSignalErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
16824
16824
|
const CreatePropertyListResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
16825
16825
|
context_id: z.string().optional(),
|
|
16826
16826
|
context: ContextObjectSchema.optional(),
|
|
@@ -16880,7 +16880,7 @@ const ListContentStandardsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16880
16880
|
errors: z.array(ErrorSchema),
|
|
16881
16881
|
context: ContextObjectSchema.optional(),
|
|
16882
16882
|
ext: ExtensionObjectSchema.optional()
|
|
16883
|
-
}).passthrough()])))();
|
|
16883
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
16884
16884
|
const GetContentStandardsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
16885
16885
|
context_id: z.string().optional(),
|
|
16886
16886
|
context: ContextObjectSchema.optional(),
|
|
@@ -16913,7 +16913,7 @@ const GetContentStandardsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16913
16913
|
errors: z.array(ErrorSchema),
|
|
16914
16914
|
context: ContextObjectSchema.optional(),
|
|
16915
16915
|
ext: ExtensionObjectSchema.optional()
|
|
16916
|
-
}).passthrough()])))();
|
|
16916
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
16917
16917
|
const CreateContentStandardsRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
16918
16918
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
16919
16919
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
@@ -16955,7 +16955,7 @@ const UpdateContentStandardsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16955
16955
|
payload: z.object({}).passthrough().optional(),
|
|
16956
16956
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
16957
16957
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
16958
|
-
}).passthrough().and(z.union([UpdateContentStandardsSuccessSchema, UpdateContentStandardsErrorSchema])))();
|
|
16958
|
+
}).passthrough().and(z.union([UpdateContentStandardsSuccessSchema, UpdateContentStandardsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
16959
16959
|
const GetCreativeFeaturesRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
16960
16960
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
16961
16961
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
@@ -16982,17 +16982,17 @@ const ReportPlanOutcomeRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16982
16982
|
budget: z.number().min(0).optional()
|
|
16983
16983
|
}).passthrough()).optional(),
|
|
16984
16984
|
planned_delivery: PlannedDeliverySchema.optional(),
|
|
16985
|
-
creative_deadline: z.
|
|
16985
|
+
creative_deadline: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
16986
16986
|
}).passthrough().optional(),
|
|
16987
16987
|
delivery: z.union([z.object({
|
|
16988
16988
|
observation_id: z.string().min(1).max(255),
|
|
16989
16989
|
source: z.literal("seller_statement_copy"),
|
|
16990
|
-
observed_at: z.
|
|
16990
|
+
observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
16991
16991
|
seller_statement_id: z.string(),
|
|
16992
16992
|
seller_statement_digest: z.string().regex(/^sha256:[a-f0-9]{64}$/),
|
|
16993
16993
|
reporting_period: z.object({
|
|
16994
|
-
start: z.
|
|
16995
|
-
end: z.
|
|
16994
|
+
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
16995
|
+
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
16996
16996
|
}).passthrough(),
|
|
16997
16997
|
cumulative_spend: z.number().min(0),
|
|
16998
16998
|
currency: z.string().regex(/^[A-Z]{3}$/),
|
|
@@ -17001,12 +17001,12 @@ const ReportPlanOutcomeRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
17001
17001
|
}).passthrough(), z.object({
|
|
17002
17002
|
observation_id: z.string().min(1).max(255),
|
|
17003
17003
|
source: z.literal("buyer_measurement"),
|
|
17004
|
-
observed_at: z.
|
|
17004
|
+
observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
17005
17005
|
seller_statement_id: z.string().optional(),
|
|
17006
17006
|
seller_statement_digest: z.string().regex(/^sha256:[a-f0-9]{64}$/).optional(),
|
|
17007
17007
|
reporting_period: z.object({
|
|
17008
|
-
start: z.
|
|
17009
|
-
end: z.
|
|
17008
|
+
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
17009
|
+
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
17010
17010
|
}).passthrough(),
|
|
17011
17011
|
cumulative_spend: z.number().min(0),
|
|
17012
17012
|
currency: z.string().regex(/^[A-Z]{3}$/),
|
|
@@ -17044,10 +17044,10 @@ const CheckGovernanceRequestSchema = /* @__PURE__ */ (() => z.object({}).passthr
|
|
|
17044
17044
|
statement_id: z.string().min(1).max(255).optional(),
|
|
17045
17045
|
statement_digest: z.string().regex(/^sha256:[a-f0-9]{64}$/).optional(),
|
|
17046
17046
|
sequence: z.int().min(1).optional(),
|
|
17047
|
-
issued_at: z.
|
|
17047
|
+
issued_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
17048
17048
|
reporting_period: z.object({
|
|
17049
|
-
start: z.
|
|
17050
|
-
end: z.
|
|
17049
|
+
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
17050
|
+
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
17051
17051
|
}).passthrough(),
|
|
17052
17052
|
spend: z.number().min(0).optional(),
|
|
17053
17053
|
cumulative_spend: z.number().min(0).optional(),
|
|
@@ -17113,7 +17113,7 @@ const GetAdCPCapabilitiesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
17113
17113
|
}).passthrough().optional(),
|
|
17114
17114
|
capability_changes: z.object({
|
|
17115
17115
|
capabilities_version: z.string().min(1).max(255).optional(),
|
|
17116
|
-
last_modified: z.
|
|
17116
|
+
last_modified: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
17117
17117
|
cache_ttl_seconds: z.int().min(60).max(604800).optional(),
|
|
17118
17118
|
notifications: z.union([CapabilityChangeNotificationsSupportedSchema, CapabilityChangeNotificationsUnsupportedSchema]).optional()
|
|
17119
17119
|
}).passthrough().optional(),
|
|
@@ -17485,7 +17485,7 @@ const GetAdCPCapabilitiesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
17485
17485
|
pricing_version_separate: z.boolean().optional(),
|
|
17486
17486
|
cache_scope_account: z.boolean().optional()
|
|
17487
17487
|
}).passthrough().optional(),
|
|
17488
|
-
last_updated: z.
|
|
17488
|
+
last_updated: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
17489
17489
|
errors: z.array(ErrorSchema).optional(),
|
|
17490
17490
|
ext: ExtensionObjectSchema.optional(),
|
|
17491
17491
|
wholesale_feed_webhooks: z.object({
|
|
@@ -17606,7 +17606,7 @@ const SyncAccountsSuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
|
17606
17606
|
setup: z.object({
|
|
17607
17607
|
url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
17608
17608
|
message: z.string(),
|
|
17609
|
-
expires_at: z.
|
|
17609
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
17610
17610
|
}).passthrough().optional(),
|
|
17611
17611
|
rate_card: z.string().optional(),
|
|
17612
17612
|
payment_terms: PaymentTermsSchema.optional(),
|
|
@@ -17638,7 +17638,7 @@ const SyncGovernanceResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
17638
17638
|
payload: z.object({}).passthrough().optional(),
|
|
17639
17639
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
17640
17640
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
17641
|
-
}).passthrough().and(z.union([SyncGovernanceSuccessSchema, SyncGovernanceErrorSchema])))();
|
|
17641
|
+
}).passthrough().and(z.union([SyncGovernanceSuccessSchema, SyncGovernanceErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
17642
17642
|
const GetAccountFinancialsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
17643
17643
|
context_id: z.string().optional(),
|
|
17644
17644
|
context: ContextObjectSchema.optional(),
|
|
@@ -17653,7 +17653,7 @@ const GetAccountFinancialsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
17653
17653
|
payload: z.object({}).passthrough().optional(),
|
|
17654
17654
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
17655
17655
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
17656
|
-
}).passthrough().and(z.union([GetAccountFinancialsSuccessSchema, GetAccountFinancialsErrorSchema])))();
|
|
17656
|
+
}).passthrough().and(z.union([GetAccountFinancialsSuccessSchema, GetAccountFinancialsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
17657
17657
|
const GetProductsCompletionSchema = /* @__PURE__ */ (() => AdCPVersionEnvelopeSchema.merge(ProtocolEnvelopeSchema).merge(z.object({}).passthrough()).merge(z.object({
|
|
17658
17658
|
products: z.array(ProductSchema).optional(),
|
|
17659
17659
|
targeting_resolution: ProductDiscoveryTargetingResolutionSchema.optional(),
|
|
@@ -17708,7 +17708,7 @@ const UpstreamTrafficSuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
|
17708
17708
|
recorded_calls: z.array(z.union([RawAttestationSchema, DigestAttestationSchema])),
|
|
17709
17709
|
total_count: z.int().min(0),
|
|
17710
17710
|
truncated: z.boolean().optional(),
|
|
17711
|
-
since_timestamp: z.
|
|
17711
|
+
since_timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
17712
17712
|
context: ContextObjectSchema.optional(),
|
|
17713
17713
|
ext: ExtensionObjectSchema.optional()
|
|
17714
17714
|
}).passthrough())();
|
|
@@ -17768,8 +17768,8 @@ const ValidatePropertyDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
17768
17768
|
unknown_impressions: z.int()
|
|
17769
17769
|
}).passthrough().optional(),
|
|
17770
17770
|
results: z.array(ValidationResultSchema),
|
|
17771
|
-
validated_at: z.
|
|
17772
|
-
list_resolved_at: z.
|
|
17771
|
+
validated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
17772
|
+
list_resolved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
17773
17773
|
ext: ExtensionObjectSchema.optional()
|
|
17774
17774
|
}).passthrough())();
|
|
17775
17775
|
const RequestProposalsResponseSchema = /* @__PURE__ */ (() => z.union([z.object({
|
|
@@ -17779,7 +17779,7 @@ const RequestProposalsResponseSchema = /* @__PURE__ */ (() => z.union([z.object(
|
|
|
17779
17779
|
suggestions: z.never().optional(),
|
|
17780
17780
|
proposals: z.array(CanonicalProposalSchema.and(z.object({
|
|
17781
17781
|
proposal_status: z.literal("draft"),
|
|
17782
|
-
expires_at: z.
|
|
17782
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
17783
17783
|
}).passthrough())),
|
|
17784
17784
|
products: z.array(CanonicalProductSchema),
|
|
17785
17785
|
incomplete: z.array(z.object({
|
|
@@ -17817,7 +17817,7 @@ const RequestProposalsResponseSchema = /* @__PURE__ */ (() => z.union([z.object(
|
|
|
17817
17817
|
}).passthrough(), z.object({
|
|
17818
17818
|
kind: z.literal("legacy_create"),
|
|
17819
17819
|
continuation_token: z.string().min(16),
|
|
17820
|
-
continuation_expires_at: z.
|
|
17820
|
+
continuation_expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
17821
17821
|
source_adcp_version: z.union([z.literal("2.5"), z.literal("3.0"), z.literal("3.1")]),
|
|
17822
17822
|
product_ids: z.array(z.string()),
|
|
17823
17823
|
losses: z.array(z.union([z.literal("feed_version_not_atomic"), z.literal("pricing_version_not_atomic"), z.literal("mutation_idempotency_not_guaranteed")])),
|
|
@@ -17879,7 +17879,7 @@ const RequestProposalsResponseSchema = /* @__PURE__ */ (() => z.union([z.object(
|
|
|
17879
17879
|
suggestions: z.array(z.string()).optional(),
|
|
17880
17880
|
proposals: z.array(CanonicalProposalSchema.and(z.object({
|
|
17881
17881
|
proposal_status: z.literal("draft"),
|
|
17882
|
-
expires_at: z.
|
|
17882
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
17883
17883
|
}).passthrough())).optional(),
|
|
17884
17884
|
products: z.array(CanonicalProductSchema).optional(),
|
|
17885
17885
|
incomplete: z.array(z.object({
|
|
@@ -17896,7 +17896,7 @@ const RequestProposalsResponseSchema = /* @__PURE__ */ (() => z.union([z.object(
|
|
|
17896
17896
|
}).passthrough(), z.object({
|
|
17897
17897
|
kind: z.literal("legacy_create"),
|
|
17898
17898
|
continuation_token: z.string().min(16),
|
|
17899
|
-
continuation_expires_at: z.
|
|
17899
|
+
continuation_expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
17900
17900
|
source_adcp_version: z.union([z.literal("2.5"), z.literal("3.0"), z.literal("3.1")]),
|
|
17901
17901
|
product_ids: z.array(z.string()),
|
|
17902
17902
|
losses: z.array(z.union([z.literal("feed_version_not_atomic"), z.literal("pricing_version_not_atomic"), z.literal("mutation_idempotency_not_guaranteed")])),
|
|
@@ -18002,9 +18002,9 @@ const MediaBuySchema = /* @__PURE__ */ (() => z.object({
|
|
|
18002
18002
|
health: MediaBuyHealthSchema.and(z.string()).optional(),
|
|
18003
18003
|
impairments: z.array(ImpairmentSchema).optional(),
|
|
18004
18004
|
rejection_reason: z.string().optional(),
|
|
18005
|
-
confirmed_at: z.
|
|
18005
|
+
confirmed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").nullable(),
|
|
18006
18006
|
cancellation: z.object({
|
|
18007
|
-
canceled_at: z.
|
|
18007
|
+
canceled_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18008
18008
|
canceled_by: CanceledBySchema,
|
|
18009
18009
|
reason: z.string().max(500).optional()
|
|
18010
18010
|
}).passthrough().optional(),
|
|
@@ -18019,10 +18019,10 @@ const MediaBuySchema = /* @__PURE__ */ (() => z.object({
|
|
|
18019
18019
|
packages: z.array(PackageSchema),
|
|
18020
18020
|
context: ContextObjectSchema.optional(),
|
|
18021
18021
|
invoice_recipient: BusinessEntity1Schema.optional(),
|
|
18022
|
-
creative_deadline: z.
|
|
18022
|
+
creative_deadline: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18023
18023
|
revision: z.int().min(1),
|
|
18024
|
-
created_at: z.
|
|
18025
|
-
updated_at: z.
|
|
18024
|
+
created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18025
|
+
updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18026
18026
|
ext: ExtensionObjectSchema.optional()
|
|
18027
18027
|
}).passthrough())();
|
|
18028
18028
|
const RefineProposalsResponseSchema = /* @__PURE__ */ (() => z.union([z.object({
|
|
@@ -18228,7 +18228,7 @@ const UpdateMediaBuyResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18228
18228
|
payload: z.object({}).passthrough().optional(),
|
|
18229
18229
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
18230
18230
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
18231
|
-
}).passthrough().and(z.union([UpdateMediaBuySuccessSchema, UpdateMediaBuyErrorSchema, UpdateMediaBuySubmittedSchema])))();
|
|
18231
|
+
}).passthrough().and(z.union([UpdateMediaBuySuccessSchema, UpdateMediaBuyErrorSchema, UpdateMediaBuySubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18232
18232
|
const BuildCreativeResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
18233
18233
|
context_id: z.string().optional(),
|
|
18234
18234
|
context: ContextObjectSchema.optional(),
|
|
@@ -18243,7 +18243,7 @@ const BuildCreativeResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18243
18243
|
payload: z.object({}).passthrough().optional(),
|
|
18244
18244
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
18245
18245
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
18246
|
-
}).passthrough().and(z.union([BuildCreativeSuccessSchema, BuildCreativeMultiSuccessSchema, BuildCreativeVariantSuccessSchema, BuildCreativeEstimateSchema, BuildCreativeErrorSchema, BuildCreativeSubmittedSchema])))();
|
|
18246
|
+
}).passthrough().and(z.union([BuildCreativeSuccessSchema, BuildCreativeMultiSuccessSchema, BuildCreativeVariantSuccessSchema, BuildCreativeEstimateSchema, BuildCreativeErrorSchema, BuildCreativeSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18247
18247
|
const SyncCreativesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
18248
18248
|
context_id: z.string().optional(),
|
|
18249
18249
|
context: ContextObjectSchema.optional(),
|
|
@@ -18258,7 +18258,7 @@ const SyncCreativesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18258
18258
|
payload: z.object({}).passthrough().optional(),
|
|
18259
18259
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
18260
18260
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
18261
|
-
}).passthrough().and(z.union([SyncCreativesSuccessSchema, SyncCreativesErrorSchema, SyncCreativesSubmittedSchema])))();
|
|
18261
|
+
}).passthrough().and(z.union([SyncCreativesSuccessSchema, SyncCreativesErrorSchema, SyncCreativesSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18262
18262
|
const CreateMediaBuySuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
18263
18263
|
proposal_id: z.string().min(1).optional(),
|
|
18264
18264
|
media_buy_id: z.string(),
|
|
@@ -18266,8 +18266,8 @@ const CreateMediaBuySuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18266
18266
|
account: AccountSchema.optional(),
|
|
18267
18267
|
invoice_recipient: BusinessEntitySchema.optional(),
|
|
18268
18268
|
media_buy_status: MediaBuyStatusSchema.optional(),
|
|
18269
|
-
confirmed_at: z.
|
|
18270
|
-
creative_deadline: z.
|
|
18269
|
+
confirmed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
|
|
18270
|
+
creative_deadline: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18271
18271
|
revision: z.int().min(1).optional(),
|
|
18272
18272
|
currency: z.string().regex(/^[A-Z]{3}$/).optional(),
|
|
18273
18273
|
total_budget: z.number().min(0).optional(),
|
|
@@ -18300,7 +18300,7 @@ const AcquireRightsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18300
18300
|
payload: z.object({}).passthrough().optional(),
|
|
18301
18301
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
18302
18302
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
18303
|
-
}).passthrough().and(z.union([AcquireRightsAcquiredSchema, AcquireRightsPendingApprovalSchema, AcquireRightsRejectedSchema, AcquireRightsErrorSchema])))();
|
|
18303
|
+
}).passthrough().and(z.union([AcquireRightsAcquiredSchema, AcquireRightsPendingApprovalSchema, AcquireRightsRejectedSchema, AcquireRightsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18304
18304
|
const GetRightsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
18305
18305
|
context_id: z.string().optional(),
|
|
18306
18306
|
context: ContextObjectSchema.optional(),
|
|
@@ -18315,8 +18315,8 @@ const GetRightsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18315
18315
|
payload: z.object({}).passthrough().optional(),
|
|
18316
18316
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
18317
18317
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
18318
|
-
}).passthrough().and(z.union([GetRightsSuccessSchema, GetRightsErrorSchema])))();
|
|
18319
|
-
const SearchBrandsResponseSchema = /* @__PURE__ */ (() => AdCPVersionEnvelopeSchema.merge(ProtocolEnvelopeSchema).and(z.union([SearchBrandsSuccessSchema, SearchBrandsErrorSchema])))();
|
|
18318
|
+
}).passthrough().and(z.union([GetRightsSuccessSchema, GetRightsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18319
|
+
const SearchBrandsResponseSchema = /* @__PURE__ */ (() => AdCPVersionEnvelopeSchema.merge(ProtocolEnvelopeSchema).and(z.union([SearchBrandsSuccessSchema, SearchBrandsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18320
18320
|
const UpdateRightsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
18321
18321
|
context_id: z.string().optional(),
|
|
18322
18322
|
context: ContextObjectSchema.optional(),
|
|
@@ -18331,7 +18331,7 @@ const UpdateRightsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18331
18331
|
payload: z.object({}).passthrough().optional(),
|
|
18332
18332
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
18333
18333
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
18334
|
-
}).passthrough().and(z.union([UpdateRightsSuccessSchema, UpdateRightsErrorSchema])))();
|
|
18334
|
+
}).passthrough().and(z.union([UpdateRightsSuccessSchema, UpdateRightsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18335
18335
|
const VerifyBrandClaimResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
18336
18336
|
context_id: z.string().optional(),
|
|
18337
18337
|
context: ContextObjectSchema.optional(),
|
|
@@ -18346,7 +18346,7 @@ const VerifyBrandClaimResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18346
18346
|
payload: z.object({}).passthrough().optional(),
|
|
18347
18347
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
18348
18348
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
18349
|
-
}).passthrough().and(z.union([VerifyBrandClaimSuccessSchema, VerifyBrandClaimErrorSchema])))();
|
|
18349
|
+
}).passthrough().and(z.union([VerifyBrandClaimSuccessSchema, VerifyBrandClaimErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18350
18350
|
const VerifyBrandClaimsResponseBulkSchema = /* @__PURE__ */ (() => z.object({
|
|
18351
18351
|
context_id: z.string().optional(),
|
|
18352
18352
|
context: ContextObjectSchema.optional(),
|
|
@@ -18361,7 +18361,7 @@ const VerifyBrandClaimsResponseBulkSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18361
18361
|
payload: z.object({}).passthrough().optional(),
|
|
18362
18362
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
18363
18363
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
18364
|
-
}).passthrough().and(z.union([VerifyBrandClaimsSuccessSchema, VerifyBrandClaimsErrorSchema])))();
|
|
18364
|
+
}).passthrough().and(z.union([VerifyBrandClaimsSuccessSchema, VerifyBrandClaimsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18365
18365
|
const AppItemSchema = /* @__PURE__ */ (() => z.object({
|
|
18366
18366
|
app_id: z.string(),
|
|
18367
18367
|
name: z.string(),
|
|
@@ -18439,8 +18439,8 @@ const RegistryFeedResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18439
18439
|
cursor: z.uuid().nullable(),
|
|
18440
18440
|
has_more: z.boolean(),
|
|
18441
18441
|
freshness: z.object({
|
|
18442
|
-
generated_at: z.
|
|
18443
|
-
latest_event_created_at: z.
|
|
18442
|
+
generated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18443
|
+
latest_event_created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").nullable(),
|
|
18444
18444
|
lag_seconds: z.int().min(0).nullable(),
|
|
18445
18445
|
retention_days: z.int().min(1)
|
|
18446
18446
|
}).passthrough()
|
|
@@ -18450,7 +18450,7 @@ const WholesaleFeedEventSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18450
18450
|
event_type: z.union([z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change")]),
|
|
18451
18451
|
entity_type: z.union([z.literal("product"), z.literal("signal"), z.literal("feed")]),
|
|
18452
18452
|
entity_id: z.string(),
|
|
18453
|
-
created_at: z.
|
|
18453
|
+
created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18454
18454
|
payload: z.object({}).passthrough()
|
|
18455
18455
|
}).passthrough().and(z.union([z.object({
|
|
18456
18456
|
event_type: z.literal("product.created"),
|
|
@@ -18479,7 +18479,7 @@ const WholesaleFeedEventSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18479
18479
|
pricing_options: z.array(PricingOptionSchema).optional(),
|
|
18480
18480
|
canonical_pricing_options: z.array(CanonicalPricingOptionSchema).optional(),
|
|
18481
18481
|
previous_pricing_option_ids: z.array(z.string()).optional(),
|
|
18482
|
-
effective_at: z.
|
|
18482
|
+
effective_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18483
18483
|
retracts_event_id: z.uuid().optional(),
|
|
18484
18484
|
applies_to: CacheLayerScopeSchema
|
|
18485
18485
|
}).passthrough().optional()
|
|
@@ -18518,7 +18518,7 @@ const WholesaleFeedEventSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18518
18518
|
signal_ref: SignalRefSchema.optional(),
|
|
18519
18519
|
pricing_options: z.array(VendorPricingOptionSchema),
|
|
18520
18520
|
previous_pricing_option_ids: z.array(z.string()).optional(),
|
|
18521
|
-
effective_at: z.
|
|
18521
|
+
effective_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18522
18522
|
retracts_event_id: z.uuid().optional(),
|
|
18523
18523
|
applies_to: CacheLayerScopeSchema
|
|
18524
18524
|
}).passthrough().optional()
|
|
@@ -18541,12 +18541,12 @@ const WholesaleFeedEventSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18541
18541
|
applies_to: CacheLayerScopeSchema,
|
|
18542
18542
|
affected_entity_type: z.union([z.literal("product"), z.literal("signal")])
|
|
18543
18543
|
}).passthrough().optional()
|
|
18544
|
-
}).passthrough()])))();
|
|
18544
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18545
18545
|
const WholesaleFeedWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
18546
18546
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
18547
18547
|
notification_id: z.uuid(),
|
|
18548
18548
|
notification_type: z.union([z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change")]),
|
|
18549
|
-
fired_at: z.
|
|
18549
|
+
fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18550
18550
|
subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
18551
18551
|
account_id: z.string(),
|
|
18552
18552
|
wholesale_feed_version: z.string(),
|
|
@@ -18609,7 +18609,7 @@ const ListProductsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18609
18609
|
replayed: z.literal(true).optional(),
|
|
18610
18610
|
context: ContextObjectSchema.optional(),
|
|
18611
18611
|
ext: ExtensionObjectSchema.optional()
|
|
18612
|
-
}).passthrough()])))();
|
|
18612
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18613
18613
|
const BuyProductsResponseSchema = /* @__PURE__ */ (() => MediaBuyCommitmentResponseSchema)();
|
|
18614
18614
|
const AcceptProposalResponseSchema = /* @__PURE__ */ (() => MediaBuyCommitmentResponseSchema)();
|
|
18615
18615
|
const ExplicitPackagesWithFixedAllocationSchema = /* @__PURE__ */ (() => z.object({
|
|
@@ -18632,7 +18632,7 @@ const CreateMediaBuyResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18632
18632
|
payload: z.object({}).passthrough().optional(),
|
|
18633
18633
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
18634
18634
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
18635
|
-
}).passthrough().and(z.union([CreateMediaBuySuccessSchema, CreateMediaBuyErrorSchema, CreateMediaBuySubmittedSchema])))();
|
|
18635
|
+
}).passthrough().and(z.union([CreateMediaBuySuccessSchema, CreateMediaBuyErrorSchema, CreateMediaBuySubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18636
18636
|
const UpdateMediaBuyRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
18637
18637
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
18638
18638
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
@@ -18645,7 +18645,7 @@ const UpdateMediaBuyRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18645
18645
|
canceled: z.literal(true).optional(),
|
|
18646
18646
|
cancellation_reason: z.string().max(500).optional(),
|
|
18647
18647
|
start_time: StartTimingSchema.optional(),
|
|
18648
|
-
end_time: z.
|
|
18648
|
+
end_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18649
18649
|
total_budget: z.object({
|
|
18650
18650
|
amount: z.number().min(0),
|
|
18651
18651
|
currency: z.string().regex(/^[A-Z]{3}$/)
|
|
@@ -18677,7 +18677,7 @@ const GetMediaBuysResponseMediaBuySchema = /* @__PURE__ */ (() => z.object({
|
|
|
18677
18677
|
account: AccountSchema.optional(),
|
|
18678
18678
|
invoice_recipient: BusinessEntitySchema.optional(),
|
|
18679
18679
|
status: MediaBuyStatusSchema,
|
|
18680
|
-
status_as_of: z.
|
|
18680
|
+
status_as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
|
|
18681
18681
|
health: MediaBuyHealthSchema.and(z.string()).optional(),
|
|
18682
18682
|
impairments: z.array(ImpairmentSchema).optional(),
|
|
18683
18683
|
rejection_reason: z.string().optional(),
|
|
@@ -18689,25 +18689,25 @@ const GetMediaBuysResponseMediaBuySchema = /* @__PURE__ */ (() => z.object({
|
|
|
18689
18689
|
budget_allocation: BudgetAllocationSchema.optional(),
|
|
18690
18690
|
pacing: PacingSchema.optional(),
|
|
18691
18691
|
bidding: BiddingPolicySchema.optional(),
|
|
18692
|
-
start_time: z.
|
|
18693
|
-
end_time: z.
|
|
18694
|
-
creative_deadline: z.
|
|
18695
|
-
confirmed_at: z.
|
|
18692
|
+
start_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18693
|
+
end_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18694
|
+
creative_deadline: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18695
|
+
confirmed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
|
|
18696
18696
|
cancellation: z.object({
|
|
18697
|
-
canceled_at: z.
|
|
18697
|
+
canceled_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18698
18698
|
canceled_by: CanceledBySchema,
|
|
18699
18699
|
reason: z.string().max(500).optional()
|
|
18700
18700
|
}).passthrough().optional(),
|
|
18701
18701
|
revision: z.int().min(1).optional(),
|
|
18702
|
-
created_at: z.
|
|
18703
|
-
updated_at: z.
|
|
18702
|
+
created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18703
|
+
updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18704
18704
|
context: ContextObjectSchema.optional(),
|
|
18705
18705
|
valid_actions: z.array(MediaBuyValidActionSchema).optional(),
|
|
18706
18706
|
available_actions: z.array(z.union([CanonicalMediaBuyActionSchema, MediaBuyAvailableActionSchema])).optional(),
|
|
18707
18707
|
webhook_activity: z.array(WebhookActivityRecordSchema).max(200).optional(),
|
|
18708
18708
|
history: z.array(z.object({
|
|
18709
18709
|
revision: z.int().min(1),
|
|
18710
|
-
timestamp: z.
|
|
18710
|
+
timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18711
18711
|
actor: z.string().optional(),
|
|
18712
18712
|
action: z.string(),
|
|
18713
18713
|
summary: z.string().max(500).optional(),
|
|
@@ -18737,12 +18737,12 @@ const GetReportingStatusResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18737
18737
|
adcp_major_version: z.number().gte(1).lte(99).int().optional(),
|
|
18738
18738
|
view: ReportingStatusViewSchema.optional(),
|
|
18739
18739
|
ledger_snapshot_id: z.string().min(1).max(255).optional(),
|
|
18740
|
-
ledger_as_of: z.
|
|
18740
|
+
ledger_as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18741
18741
|
changes_checkpoint: z.string().min(1).max(2048).optional(),
|
|
18742
18742
|
account_id: z.string().min(1).optional(),
|
|
18743
18743
|
scope: z.object({
|
|
18744
|
-
period_start: z.
|
|
18745
|
-
period_end: z.
|
|
18744
|
+
period_start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18745
|
+
period_end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18746
18746
|
scope_closed: z.boolean(),
|
|
18747
18747
|
media_buy_ids: z.array(ReportingMediaBuyIDSchema).optional(),
|
|
18748
18748
|
all_accessible_media_buys: z.boolean(),
|
|
@@ -18753,13 +18753,13 @@ const GetReportingStatusResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18753
18753
|
}).passthrough()),
|
|
18754
18754
|
feed_purposes: z.array(ReportingFeedPurposeSchema),
|
|
18755
18755
|
finality: z.array(ReportingFinalitySchema),
|
|
18756
|
-
ledger_retained_from: z.
|
|
18756
|
+
ledger_retained_from: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18757
18757
|
coverage_complete: z.boolean()
|
|
18758
18758
|
}).passthrough().optional(),
|
|
18759
18759
|
health: ReportingHealthSchema.optional(),
|
|
18760
18760
|
coverage: ReportingCoverageSchema.optional(),
|
|
18761
|
-
data_through: z.
|
|
18762
|
-
next_expected_at: z.
|
|
18761
|
+
data_through: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
|
|
18762
|
+
next_expected_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18763
18763
|
obligation_counts: z.object({
|
|
18764
18764
|
total: z.int().min(0),
|
|
18765
18765
|
waiting: z.int().min(0),
|
|
@@ -18781,7 +18781,7 @@ const GetReportingStatusResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18781
18781
|
receipts: z.array(ReportingReceiptSchema).optional(),
|
|
18782
18782
|
errors: z.array(ErrorSchema).optional(),
|
|
18783
18783
|
ext: ExtensionObjectSchema.optional()
|
|
18784
|
-
}).passthrough().and(z.union([SuccessfulLookupSchema, FailedLookupSchema])).superRefine((value, ctx) => {
|
|
18784
|
+
}).passthrough().and(z.union([SuccessfulLookupSchema, FailedLookupSchema]).describe("Must also satisfy at least one of these alternatives.")).superRefine((value, ctx) => {
|
|
18785
18785
|
const closedStructures = { "scope": { "allowedFields": ["period_start", "period_end", "scope_closed", "media_buy_ids", "all_accessible_media_buys", "delivery_config_generations", "feed_purposes", "finality", "ledger_retained_from", "coverage_complete"], "requiredFields": ["period_start", "period_end", "scope_closed", "all_accessible_media_buys", "delivery_config_generations", "feed_purposes", "finality", "ledger_retained_from", "coverage_complete"] }, "deliveryConfigGeneration": { "allowedFields": ["delivery_config_id", "delivery_config_version", "feed_purpose"], "requiredFields": ["delivery_config_id", "delivery_config_version", "feed_purpose"] }, "obligationCounts": { "allowedFields": ["total", "waiting", "healthy", "delayed", "action_required", "complete", "consumer_status_pending"], "requiredFields": ["total", "waiting", "healthy", "delayed", "action_required", "complete"] }, "pagination": { "allowedFields": ["has_more", "cursor", "total_count"], "requiredFields": ["has_more"] }, "paginationRequiredByView": { "periods": ["has_more", "total_count"], "revision": ["has_more", "total_count"] } };
|
|
18786
18786
|
const addIssues = (schema, candidate, path) => {
|
|
18787
18787
|
const parsed = schema.safeParse(candidate);
|
|
@@ -18870,8 +18870,8 @@ const ListedCreativeNamedFormatReferenceSchema = /* @__PURE__ */ (() => z.object
|
|
|
18870
18870
|
format_id: FormatReferenceStructuredObjectSchema,
|
|
18871
18871
|
format_option_ref: FormatOptionReferenceSchema.optional(),
|
|
18872
18872
|
status: CreativeStatusSchema,
|
|
18873
|
-
created_date: z.
|
|
18874
|
-
updated_date: z.
|
|
18873
|
+
created_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18874
|
+
updated_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18875
18875
|
assets: z.record(z.string(), z.union([AssetVariantSchema, z.array(AssetVariantSchema)])).optional(),
|
|
18876
18876
|
component_assets: z.record(z.string(), CreativeAssetsSchema).optional(),
|
|
18877
18877
|
localization: CreativeLocalizationReadbackSchema.optional(),
|
|
@@ -18893,30 +18893,30 @@ const ListedCreativeNamedFormatReferenceSchema = /* @__PURE__ */ (() => z.object
|
|
|
18893
18893
|
assigned_packages: z.array(z.object({
|
|
18894
18894
|
package_id: z.string(),
|
|
18895
18895
|
media_buy_id: z.string().optional(),
|
|
18896
|
-
assigned_date: z.
|
|
18896
|
+
assigned_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18897
18897
|
approval_status: CreativeApprovalStatusSchema.optional(),
|
|
18898
18898
|
rejection_reason: z.string().optional(),
|
|
18899
18899
|
approval_scopes: z.array(ScopedCreativeApprovalSchema).optional(),
|
|
18900
18900
|
indicators: z.array(IndicatorSchema.and(z.object({
|
|
18901
18901
|
type: z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]).optional()
|
|
18902
18902
|
}).passthrough())).optional(),
|
|
18903
|
-
indicator_types_evaluated: z.array(IndicatorTypeSchema.and(z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]))).optional(),
|
|
18904
|
-
indicators_as_of: z.
|
|
18903
|
+
indicator_types_evaluated: z.array(IndicatorTypeSchema.and(z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]).describe("Must also satisfy at least one of these alternatives."))).optional(),
|
|
18904
|
+
indicators_as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18905
18905
|
indicators_evaluated_scope: z.array(IndicatorScopeSchema).optional()
|
|
18906
18906
|
}).passthrough()).optional()
|
|
18907
18907
|
}).passthrough().optional(),
|
|
18908
18908
|
snapshot: z.object({
|
|
18909
|
-
as_of: z.
|
|
18909
|
+
as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18910
18910
|
staleness_seconds: z.int().min(0),
|
|
18911
18911
|
impressions: z.int().min(0),
|
|
18912
|
-
last_served: z.
|
|
18912
|
+
last_served: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
18913
18913
|
}).passthrough().optional(),
|
|
18914
18914
|
snapshot_unavailable_reason: SnapshotUnavailableReasonSchema.optional(),
|
|
18915
18915
|
items: z.array(CreativeItemSchema).optional(),
|
|
18916
18916
|
pricing_options: z.array(VendorPricingOptionSchema).optional(),
|
|
18917
18917
|
purge: z.object({
|
|
18918
18918
|
kind: z.literal("soft"),
|
|
18919
|
-
at: z.
|
|
18919
|
+
at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18920
18920
|
reason_code: CreativeEventReasonCodeSchema
|
|
18921
18921
|
}).passthrough().optional(),
|
|
18922
18922
|
webhook_activity: z.array(WebhookActivityRecordSchema).max(200).optional()
|
|
@@ -18930,8 +18930,8 @@ const ListedCreativeCanonicalFormatKindSchema = /* @__PURE__ */ (() => z.object(
|
|
|
18930
18930
|
format_kind: CanonicalFormatKindSchema,
|
|
18931
18931
|
format_option_ref: FormatOptionReferenceSchema.optional(),
|
|
18932
18932
|
status: CreativeStatusSchema,
|
|
18933
|
-
created_date: z.
|
|
18934
|
-
updated_date: z.
|
|
18933
|
+
created_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18934
|
+
updated_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18935
18935
|
assets: z.record(z.string(), z.union([AssetVariantSchema, z.array(AssetVariantSchema)])).optional(),
|
|
18936
18936
|
component_assets: z.record(z.string(), CreativeAssetsSchema).optional(),
|
|
18937
18937
|
localization: CreativeLocalizationReadbackSchema.optional(),
|
|
@@ -18953,30 +18953,30 @@ const ListedCreativeCanonicalFormatKindSchema = /* @__PURE__ */ (() => z.object(
|
|
|
18953
18953
|
assigned_packages: z.array(z.object({
|
|
18954
18954
|
package_id: z.string(),
|
|
18955
18955
|
media_buy_id: z.string().optional(),
|
|
18956
|
-
assigned_date: z.
|
|
18956
|
+
assigned_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18957
18957
|
approval_status: CreativeApprovalStatusSchema.optional(),
|
|
18958
18958
|
rejection_reason: z.string().optional(),
|
|
18959
18959
|
approval_scopes: z.array(ScopedCreativeApprovalSchema).optional(),
|
|
18960
18960
|
indicators: z.array(IndicatorSchema.and(z.object({
|
|
18961
18961
|
type: z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]).optional()
|
|
18962
18962
|
}).passthrough())).optional(),
|
|
18963
|
-
indicator_types_evaluated: z.array(IndicatorTypeSchema.and(z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]))).optional(),
|
|
18964
|
-
indicators_as_of: z.
|
|
18963
|
+
indicator_types_evaluated: z.array(IndicatorTypeSchema.and(z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]).describe("Must also satisfy at least one of these alternatives."))).optional(),
|
|
18964
|
+
indicators_as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18965
18965
|
indicators_evaluated_scope: z.array(IndicatorScopeSchema).optional()
|
|
18966
18966
|
}).passthrough()).optional()
|
|
18967
18967
|
}).passthrough().optional(),
|
|
18968
18968
|
snapshot: z.object({
|
|
18969
|
-
as_of: z.
|
|
18969
|
+
as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18970
18970
|
staleness_seconds: z.int().min(0),
|
|
18971
18971
|
impressions: z.int().min(0),
|
|
18972
|
-
last_served: z.
|
|
18972
|
+
last_served: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
18973
18973
|
}).passthrough().optional(),
|
|
18974
18974
|
snapshot_unavailable_reason: SnapshotUnavailableReasonSchema.optional(),
|
|
18975
18975
|
items: z.array(CreativeItemSchema).optional(),
|
|
18976
18976
|
pricing_options: z.array(VendorPricingOptionSchema).optional(),
|
|
18977
18977
|
purge: z.object({
|
|
18978
18978
|
kind: z.literal("soft"),
|
|
18979
|
-
at: z.
|
|
18979
|
+
at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18980
18980
|
reason_code: CreativeEventReasonCodeSchema
|
|
18981
18981
|
}).passthrough().optional(),
|
|
18982
18982
|
webhook_activity: z.array(WebhookActivityRecordSchema).max(200).optional()
|
|
@@ -19023,7 +19023,7 @@ const SyncAccountsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
19023
19023
|
payload: z.object({}).passthrough().optional(),
|
|
19024
19024
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
19025
19025
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
19026
|
-
}).passthrough().and(z.union([SyncAccountsSuccessSchema, SyncAccountsErrorSchema])))();
|
|
19026
|
+
}).passthrough().and(z.union([SyncAccountsSuccessSchema, SyncAccountsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
19027
19027
|
const ComplyTestControllerRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
19028
19028
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
19029
19029
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
@@ -19046,7 +19046,7 @@ const ComplyTestControllerRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
19046
19046
|
catalog_id: z.string().min(1).max(255).optional(),
|
|
19047
19047
|
catalog_generation: z.string().min(1).max(255).optional(),
|
|
19048
19048
|
item_id: z.string().min(1).max(255).optional(),
|
|
19049
|
-
target_time: z.
|
|
19049
|
+
target_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
19050
19050
|
status: z.string().optional(),
|
|
19051
19051
|
rejection_reason: z.string().optional(),
|
|
19052
19052
|
purge_kind: z.union([z.literal("soft"), z.literal("hard")]).optional(),
|
|
@@ -19101,7 +19101,7 @@ const ComplyTestControllerRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
19101
19101
|
upstream_name: z.string().optional(),
|
|
19102
19102
|
cache_age_seconds: z.int().min(0).optional(),
|
|
19103
19103
|
result: ComplianceTaskCompletionDataSchema.optional(),
|
|
19104
|
-
since_timestamp: z.
|
|
19104
|
+
since_timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
19105
19105
|
endpoint_pattern: z.string().optional(),
|
|
19106
19106
|
limit: z.int().min(1).max(1e3).optional(),
|
|
19107
19107
|
attestation_mode: z.union([z.literal("raw"), z.literal("digest")]).optional(),
|
|
@@ -19127,7 +19127,7 @@ const ComplyTestControllerResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
19127
19127
|
payload: z.object({}).passthrough().optional(),
|
|
19128
19128
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
19129
19129
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
19130
|
-
}).passthrough().and(z.union([ListScenariosSuccessSchema, StateTransitionSuccessSchema, SimulationSuccessSchema, ForcedDirectiveSuccessSchema, SeedSuccessSchema, ProvenanceAuditObservationsSuccessSchema, UpstreamTrafficSuccessSchema, ControllerErrorSchema])))();
|
|
19130
|
+
}).passthrough().and(z.union([ListScenariosSuccessSchema, StateTransitionSuccessSchema, SimulationSuccessSchema, ForcedDirectiveSuccessSchema, SeedSuccessSchema, ProvenanceAuditObservationsSuccessSchema, UpstreamTrafficSuccessSchema, ControllerErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
19131
19131
|
const AdCPAsyncResponseDataSchema = /* @__PURE__ */ (() => z.union([GetProductsResponseSchema, GetProductsRejectedSchema, GetProductsAsyncWorkingSchema, GetProductsAsyncInputRequiredSchema, GetProductsAsyncSubmittedSchema, RequestProposalsResponseSchema, RequestProposalsAsyncSubmittedSchema, RefineProposalsResponseSchema, RefineProposalsAsyncSubmittedSchema, DeclineProposalsResponseSchema, MediaBuyCommitmentResponseSchema, ControlMediaBuyResponseSchema, CompactTaskSubmittedSchema, CompactTaskWorkingSchema, CompactTaskInputRequiredSchema, GetSignalsResponseSchema, GetSignalsAsyncWorkingSchema, GetSignalsAsyncSubmittedSchema, CreateMediaBuyResponseSchema, CreateMediaBuyAsyncWorkingSchema, CreateMediaBuyAsyncInputRequiredSchema, CreateMediaBuyAsyncSubmittedSchema, UpdateMediaBuyResponseSchema, UpdateMediaBuyAsyncWorkingSchema, UpdateMediaBuyAsyncInputRequiredSchema, UpdateMediaBuyAsyncSubmittedSchema, MediaBuyDeliveryWebhookResultSchema, BuildCreativeResponseSchema, PreviewCreativeResponseSchema, BuildCreativeAsyncWorkingSchema, BuildCreativeAsyncInputRequiredSchema, BuildCreativeAsyncSubmittedSchema, GetCreativeFeaturesResponseSchema, GetCreativeFeaturesAsyncSubmittedSchema, SyncCreativesResponseSchema, SyncCreativesAsyncWorkingSchema, SyncCreativesAsyncInputRequiredSchema, SyncCreativesAsyncSubmittedSchema, SyncCatalogsResponseSchema, SyncCatalogsAsyncWorkingSchema, SyncCatalogsAsyncInputRequiredSchema, SyncCatalogsAsyncSubmittedSchema]))();
|
|
19132
19132
|
const MCPWebhookPayloadSchema = /* @__PURE__ */ (() => z.object({
|
|
19133
19133
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
@@ -19137,7 +19137,7 @@ const MCPWebhookPayloadSchema = /* @__PURE__ */ (() => z.object({
|
|
|
19137
19137
|
task_type: TaskTypeSchema,
|
|
19138
19138
|
protocol: AdCPProtocolSchema.optional(),
|
|
19139
19139
|
status: TaskStatusSchema,
|
|
19140
|
-
timestamp: z.
|
|
19140
|
+
timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
19141
19141
|
message: z.string().optional(),
|
|
19142
19142
|
context_id: z.string().optional(),
|
|
19143
19143
|
token: z.string().min(16).max(4096).optional(),
|
|
@@ -19168,7 +19168,7 @@ const CreateMediaBuyRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
19168
19168
|
invoice_recipient: BusinessEntitySchema.optional(),
|
|
19169
19169
|
io_acceptance: z.object({
|
|
19170
19170
|
io_id: z.string(),
|
|
19171
|
-
accepted_at: z.
|
|
19171
|
+
accepted_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
19172
19172
|
signatory: z.string().min(1).max(250),
|
|
19173
19173
|
signature_id: z.string().optional()
|
|
19174
19174
|
}).passthrough().optional(),
|
|
@@ -19176,7 +19176,7 @@ const CreateMediaBuyRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
19176
19176
|
name: z.string().min(1).max(255).regex(/\S/).optional(),
|
|
19177
19177
|
agency_estimate_number: z.string().max(100).optional(),
|
|
19178
19178
|
start_time: StartTimingSchema,
|
|
19179
|
-
end_time: z.
|
|
19179
|
+
end_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
19180
19180
|
pacing: PacingSchema.optional(),
|
|
19181
19181
|
bidding: BiddingPolicySchema.optional(),
|
|
19182
19182
|
paused: z.boolean().optional(),
|