@adcp/sdk 16.4.0 → 16.6.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.0/brand-fields.d.mts +7 -1
- package/dist/lib/adapters/version/3.0/brand-fields.d.ts +7 -1
- package/dist/lib/adapters/version/3.0/brand-fields.js +139 -3
- package/dist/lib/adapters/version/3.0/brand-fields.mjs +136 -2
- package/dist/lib/adapters/version/3.0/index.js +6 -0
- package/dist/lib/adapters/version/3.0/index.mjs +7 -1
- package/dist/lib/adapters/version/3.1/bidding.js +1 -1
- package/dist/lib/adapters/version/3.1/bidding.mjs +1 -1
- package/dist/lib/adapters/version/types.d.mts +5 -0
- package/dist/lib/adapters/version/types.d.ts +5 -0
- package/dist/lib/canonical-references/index.js +2 -0
- package/dist/lib/canonical-references/index.mjs +2 -0
- package/dist/lib/client/account-changes.d.mts +3 -1
- package/dist/lib/client/account-changes.d.ts +3 -1
- package/dist/lib/client/account-changes.js +22 -2
- package/dist/lib/client/account-changes.mjs +22 -2
- 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 +7 -9
- package/dist/lib/conformance/oracle.mjs +7 -9
- package/dist/lib/conformance/schemaLoader.js +35 -1
- package/dist/lib/conformance/schemaLoader.mjs +35 -1
- package/dist/lib/core/AgentClient.d.mts +165 -1
- package/dist/lib/core/AgentClient.d.ts +165 -1
- package/dist/lib/core/AgentClient.js +446 -8
- package/dist/lib/core/AgentClient.mjs +446 -8
- package/dist/lib/core/ConversationTypes.d.mts +10 -1
- package/dist/lib/core/ConversationTypes.d.ts +10 -1
- package/dist/lib/core/ProtocolResponseParser.d.mts +1 -1
- package/dist/lib/core/ProtocolResponseParser.d.ts +1 -1
- package/dist/lib/core/ProtocolResponseParser.js +28 -18
- package/dist/lib/core/ProtocolResponseParser.mjs +11 -1
- package/dist/lib/core/ResponseValidator.js +1 -1
- package/dist/lib/core/ResponseValidator.mjs +1 -1
- package/dist/lib/core/SingleAgentClient.d.mts +120 -6
- package/dist/lib/core/SingleAgentClient.d.ts +120 -6
- package/dist/lib/core/SingleAgentClient.js +582 -79
- package/dist/lib/core/SingleAgentClient.mjs +570 -66
- package/dist/lib/core/TaskExecutor.d.mts +7 -0
- package/dist/lib/core/TaskExecutor.d.ts +7 -0
- package/dist/lib/core/TaskExecutor.js +108 -25
- package/dist/lib/core/TaskExecutor.mjs +116 -25
- 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/task-status.d.mts +2 -0
- package/dist/lib/core/task-status.d.ts +2 -0
- package/dist/lib/core/task-status.js +11 -2
- package/dist/lib/core/task-status.mjs +9 -1
- package/dist/lib/errors/index.d.mts +22 -0
- package/dist/lib/errors/index.d.ts +22 -0
- package/dist/lib/errors/index.js +44 -1
- package/dist/lib/errors/index.mjs +43 -1
- package/dist/lib/identity-3.3/trust.d.mts +17 -3
- package/dist/lib/identity-3.3/trust.d.ts +17 -3
- package/dist/lib/identity-3.3/trust.js +42 -20
- package/dist/lib/identity-3.3/trust.mjs +42 -20
- 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/identity-3.3/validation.js +5 -3
- package/dist/lib/identity-3.3/validation.mjs +6 -4
- package/dist/lib/index.d.mts +8 -54
- package/dist/lib/index.d.ts +8 -54
- package/dist/lib/index.js +15 -0
- package/dist/lib/index.mjs +11 -0
- package/dist/lib/media-buy/action-assessment.js +29 -3
- package/dist/lib/media-buy/action-assessment.mjs +32 -4
- package/dist/lib/media-buy/action-contracts.d.mts +3 -0
- package/dist/lib/media-buy/action-contracts.d.ts +3 -0
- package/dist/lib/media-buy/action-contracts.js +24 -1
- package/dist/lib/media-buy/action-contracts.mjs +22 -1
- package/dist/lib/media-buy/compatibility.js +6 -1
- package/dist/lib/media-buy/compatibility.mjs +6 -1
- package/dist/lib/media-buy/preflight.js +1 -1
- package/dist/lib/media-buy/preflight.mjs +3 -2
- package/dist/lib/media-buy/types.d.mts +6 -1
- package/dist/lib/media-buy/types.d.ts +6 -1
- 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.d.mts +2 -0
- package/dist/lib/protocols/mcp-modern.d.ts +2 -0
- package/dist/lib/protocols/mcp-modern.js +40 -11
- package/dist/lib/protocols/mcp-modern.mjs +40 -11
- package/dist/lib/protocols/mcp-scope.d.mts +6 -1
- package/dist/lib/protocols/mcp-scope.d.ts +6 -1
- package/dist/lib/protocols/mcp-scope.js +25 -3
- package/dist/lib/protocols/mcp-scope.mjs +24 -3
- 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 +70 -20
- package/dist/lib/protocols/mcp.mjs +73 -20
- package/dist/lib/protocols/rawResponseCapture.js +20 -5
- package/dist/lib/protocols/rawResponseCapture.mjs +20 -5
- package/dist/lib/registry/types.generated.d.mts +8 -2
- package/dist/lib/registry/types.generated.d.ts +8 -2
- package/dist/lib/reporting/inspection.js +1 -0
- package/dist/lib/reporting/inspection.mjs +1 -0
- 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/browser.d.mts +2 -0
- package/dist/lib/schemas/browser.d.ts +2 -0
- package/dist/lib/schemas/browser.js +3 -0
- package/dist/lib/schemas/browser.mjs +2 -0
- package/dist/lib/schemas/index.d.mts +5 -2
- package/dist/lib/schemas/index.d.ts +5 -2
- package/dist/lib/schemas/index.js +5 -0
- package/dist/lib/schemas/index.mjs +4 -0
- 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/account-response-identity.d.mts +17 -0
- package/dist/lib/server/account-response-identity.d.ts +17 -0
- package/dist/lib/server/account-response-identity.js +52 -0
- package/dist/lib/server/account-response-identity.mjs +28 -0
- package/dist/lib/server/account-sync-contract.js +1 -0
- package/dist/lib/server/account-sync-contract.mjs +1 -0
- package/dist/lib/server/create-adcp-server.js +32 -19
- package/dist/lib/server/create-adcp-server.mjs +36 -12
- package/dist/lib/server/decisioning/account.d.mts +13 -6
- package/dist/lib/server/decisioning/account.d.ts +13 -6
- package/dist/lib/server/decisioning/account.js +37 -15
- package/dist/lib/server/decisioning/account.mjs +37 -15
- package/dist/lib/server/decisioning/runtime/from-platform.d.mts +5 -5
- package/dist/lib/server/decisioning/runtime/from-platform.d.ts +5 -5
- package/dist/lib/server/decisioning/runtime/from-platform.js +6 -6
- package/dist/lib/server/decisioning/runtime/from-platform.mjs +6 -6
- package/dist/lib/server/index.d.mts +1 -1
- package/dist/lib/server/index.d.ts +1 -1
- package/dist/lib/server/index.js +2 -0
- package/dist/lib/server/index.mjs +2 -0
- package/dist/lib/server/media-buy-action-resolver.d.mts +3 -0
- package/dist/lib/server/media-buy-action-resolver.d.ts +3 -0
- package/dist/lib/server/media-buy-action-resolver.js +32 -0
- package/dist/lib/server/media-buy-action-resolver.mjs +32 -0
- package/dist/lib/server/media-buy-store.d.mts +26 -12
- package/dist/lib/server/media-buy-store.d.ts +26 -12
- package/dist/lib/server/media-buy-store.js +69 -21
- package/dist/lib/server/media-buy-store.mjs +69 -21
- package/dist/lib/server/responses.js +9 -1
- package/dist/lib/server/responses.mjs +9 -1
- package/dist/lib/server/state-machine.d.mts +10 -11
- package/dist/lib/server/state-machine.d.ts +10 -11
- package/dist/lib/server/state-machine.js +20 -5
- package/dist/lib/server/state-machine.mjs +19 -5
- 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/testing/client.d.mts +1 -3
- package/dist/lib/testing/client.d.ts +1 -3
- package/dist/lib/testing/client.js +119 -25
- package/dist/lib/testing/client.mjs +121 -26
- 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 +68 -14
- package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs +68 -14
- package/dist/lib/testing/storyboard/compliance.d.mts +2 -5
- package/dist/lib/testing/storyboard/compliance.d.ts +2 -5
- package/dist/lib/testing/storyboard/compliance.js +91 -13
- package/dist/lib/testing/storyboard/compliance.mjs +92 -14
- package/dist/lib/testing/storyboard/context.d.mts +13 -3
- package/dist/lib/testing/storyboard/context.d.ts +13 -3
- package/dist/lib/testing/storyboard/context.js +15 -10
- package/dist/lib/testing/storyboard/context.mjs +15 -10
- package/dist/lib/testing/storyboard/default-invariants.js +84 -59
- package/dist/lib/testing/storyboard/default-invariants.mjs +85 -60
- 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/request-signing/vector-loader.d.mts +2 -0
- package/dist/lib/testing/storyboard/request-signing/vector-loader.d.ts +2 -0
- package/dist/lib/testing/storyboard/request-signing/vector-loader.js +11 -0
- package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs +10 -0
- 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 +401 -60
- package/dist/lib/testing/storyboard/runner.mjs +404 -62
- 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 +11 -2
- package/dist/lib/testing/storyboard/validations.mjs +11 -2
- 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/test-controller.js +3 -0
- package/dist/lib/testing/test-controller.mjs +3 -0
- 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/asset-instances.d.mts +1 -1
- package/dist/lib/types/asset-instances.d.ts +1 -1
- package/dist/lib/types/index.d.mts +5 -0
- package/dist/lib/types/index.d.ts +5 -0
- package/dist/lib/types/index.js +6 -1
- package/dist/lib/types/index.mjs +4 -1
- package/dist/lib/types/inline-enums.generated.d.mts +30 -4
- package/dist/lib/types/inline-enums.generated.d.ts +30 -4
- package/dist/lib/types/inline-enums.generated.js +41 -2
- package/dist/lib/types/inline-enums.generated.mjs +28 -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/media-buy-delivery-report.d.mts +4 -0
- package/dist/lib/types/media-buy-delivery-report.d.ts +4 -0
- package/dist/lib/types/media-buy-delivery-report.js +16 -0
- package/dist/lib/types/media-buy-delivery-report.mjs +0 -0
- package/dist/lib/types/per-tool-index.json +1 -1
- package/dist/lib/types/schemas.generated.d.ts +366 -415
- package/dist/lib/types/schemas.generated.js +12802 -12809
- package/dist/lib/types/schemas.generated.mjs +389 -406
- package/dist/lib/types/targeting-keys.generated.d.mts +4 -0
- package/dist/lib/types/targeting-keys.generated.d.ts +4 -0
- package/dist/lib/types/targeting-keys.generated.js +105 -0
- package/dist/lib/types/targeting-keys.generated.mjs +80 -0
- 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/utils/adcp-version-config.js +5 -2
- package/dist/lib/utils/adcp-version-config.mjs +5 -2
- package/dist/lib/utils/envelope-status-compat.d.mts +18 -1
- package/dist/lib/utils/envelope-status-compat.d.ts +18 -1
- package/dist/lib/utils/envelope-status-compat.js +11 -5
- package/dist/lib/utils/envelope-status-compat.mjs +11 -5
- package/dist/lib/utils/response-unwrapper.js +18 -10
- package/dist/lib/utils/response-unwrapper.mjs +18 -10
- package/dist/lib/v2/format-schema/resolver.js +1 -1
- package/dist/lib/v2/format-schema/resolver.mjs +1 -1
- package/dist/lib/v2/projection/creative-delivery.js +123 -30
- package/dist/lib/v2/projection/creative-delivery.mjs +127 -30
- package/dist/lib/v2/projection/index.d.mts +1 -0
- package/dist/lib/v2/projection/index.d.ts +1 -0
- package/dist/lib/v2/projection/index.js +3 -0
- package/dist/lib/v2/projection/index.mjs +2 -0
- package/dist/lib/v2/projection/legacy-metadata.d.mts +19 -0
- package/dist/lib/v2/projection/legacy-metadata.d.ts +19 -0
- package/dist/lib/v2/projection/legacy-metadata.js +91 -0
- package/dist/lib/v2/projection/legacy-metadata.mjs +86 -0
- package/dist/lib/validation/compact-schema.d.mts +27 -0
- package/dist/lib/validation/compact-schema.d.ts +27 -0
- package/dist/lib/validation/compact-schema.js +276 -0
- package/dist/lib/validation/compact-schema.mjs +250 -0
- package/dist/lib/validation/media-buy-delivery-report.d.mts +8 -0
- package/dist/lib/validation/media-buy-delivery-report.d.ts +8 -0
- package/dist/lib/validation/media-buy-delivery-report.js +31 -0
- package/dist/lib/validation/media-buy-delivery-report.mjs +7 -0
- package/dist/lib/validation/schema-diagnostic-origins.d.mts +21 -0
- package/dist/lib/validation/schema-diagnostic-origins.d.ts +21 -0
- package/dist/lib/validation/schema-diagnostic-origins.js +193 -0
- package/dist/lib/validation/schema-diagnostic-origins.mjs +169 -0
- package/dist/lib/validation/schema-loader.js +86 -16
- package/dist/lib/validation/schema-loader.mjs +82 -16
- package/dist/lib/validation/schema-validator.d.mts +10 -19
- package/dist/lib/validation/schema-validator.d.ts +10 -19
- package/dist/lib/validation/schema-validator.js +136 -43
- package/dist/lib/validation/schema-validator.mjs +140 -44
- 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/dist/lib/webhooks/index.d.mts +3 -0
- package/dist/lib/webhooks/index.d.ts +3 -0
- package/dist/lib/webhooks/index.js +3 -0
- package/dist/lib/webhooks/index.mjs +2 -0
- package/dist/lib/webhooks/media-buy-delivery.d.mts +43 -0
- package/dist/lib/webhooks/media-buy-delivery.d.ts +43 -0
- package/dist/lib/webhooks/media-buy-delivery.js +119 -0
- package/dist/lib/webhooks/media-buy-delivery.mjs +94 -0
- package/docs/CLI.md +21 -0
- package/docs/TYPE-SUMMARY.md +13 -2
- package/docs/ZOD-SCHEMAS.md +3 -1
- package/docs/guides/BUILD-AN-AGENT.md +9 -1
- package/docs/guides/COLLECTION-FIXTURE-FOUNDATION.md +123 -2
- package/docs/guides/DELIVERY-WEBHOOK-PARSING.md +135 -0
- package/docs/guides/DISCOVERY-CACHE-AND-SESSION-REUSE.md +48 -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/guides/TYPED-CLIENT-TOOLS.md +49 -0
- package/docs/llms.txt +11 -7
- package/docs/migration-14.x-rc-worksheet.md +6 -6
- package/docs/migration-6.6-to-6.7.md +14 -0
- package/docs/migration-account-change-feed.md +19 -0
- package/docs/migration-agent-identity-3.3.md +11 -4
- package/docs/migration-reporting-storage-package.md +15 -0
- package/docs/releases/sdk-16.6-adoption-fixes.md +33 -0
- package/examples/reliable-reporting-buyer/worker.mjs +3 -1
- package/package.json +5 -5
- /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)();
|
|
@@ -259,7 +259,7 @@ const ProvenanceSchema = /* @__PURE__ */ (() => z.object({
|
|
|
259
259
|
feature_id: z.string().optional()
|
|
260
260
|
}).passthrough().optional(),
|
|
261
261
|
embedded_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
262
|
-
}).passthrough()).optional(),
|
|
262
|
+
}).passthrough()).min(1).optional(),
|
|
263
263
|
watermarks: z.array(z.object({
|
|
264
264
|
media_type: WatermarkMediaTypeSchema,
|
|
265
265
|
provider: z.string(),
|
|
@@ -269,7 +269,7 @@ const ProvenanceSchema = /* @__PURE__ */ (() => z.object({
|
|
|
269
269
|
}).passthrough().optional(),
|
|
270
270
|
c2pa_action: C2PAWatermarkActionSchema.optional(),
|
|
271
271
|
embedded_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
272
|
-
}).passthrough()).optional(),
|
|
272
|
+
}).passthrough()).min(1).optional(),
|
|
273
273
|
disclosure: z.object({
|
|
274
274
|
required: z.boolean(),
|
|
275
275
|
jurisdictions: z.array(z.object({
|
|
@@ -280,10 +280,10 @@ const ProvenanceSchema = /* @__PURE__ */ (() => z.object({
|
|
|
280
280
|
render_guidance: z.object({
|
|
281
281
|
persistence: DisclosurePersistenceSchema.optional(),
|
|
282
282
|
min_duration_ms: z.number().int().gte(1).optional(),
|
|
283
|
-
positions: z.array(DisclosurePositionSchema).optional(),
|
|
283
|
+
positions: z.array(DisclosurePositionSchema).min(1).optional(),
|
|
284
284
|
ext: ExtensionObjectSchema.optional()
|
|
285
285
|
}).passthrough().optional()
|
|
286
|
-
}).passthrough()).optional()
|
|
286
|
+
}).passthrough()).min(1).optional()
|
|
287
287
|
}).passthrough().optional(),
|
|
288
288
|
verification: z.array(z.object({
|
|
289
289
|
verified_by: z.string(),
|
|
@@ -291,7 +291,7 @@ const ProvenanceSchema = /* @__PURE__ */ (() => z.object({
|
|
|
291
291
|
result: z.union([z.literal("authentic"), z.literal("ai_generated"), z.literal("ai_modified"), z.literal("inconclusive")]),
|
|
292
292
|
confidence: z.number().gte(0).lte(1).optional(),
|
|
293
293
|
details_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional()
|
|
294
|
-
}).passthrough()).optional(),
|
|
294
|
+
}).passthrough()).min(1).optional(),
|
|
295
295
|
ext: ExtensionObjectSchema.optional()
|
|
296
296
|
}).passthrough())();
|
|
297
297
|
const CanonicalOptimizationGoalSchema = /* @__PURE__ */ (() => z.union([z.object({
|
|
@@ -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()))();
|
|
@@ -1230,7 +1230,7 @@ const InlineMarkupSchema = /* @__PURE__ */ (() => z.object({
|
|
|
1230
1230
|
location: z.object({
|
|
1231
1231
|
field: z.literal("markup").optional()
|
|
1232
1232
|
}).passthrough().optional()
|
|
1233
|
-
}).passthrough())).optional(),
|
|
1233
|
+
}).passthrough())).min(1).optional(),
|
|
1234
1234
|
provenance: ProvenanceSchema.optional(),
|
|
1235
1235
|
delivery_type: z.literal("inline_markup"),
|
|
1236
1236
|
markup_type: z.union([z.literal("iframe_javascript"), z.literal("javascript"), z.literal("standard")]),
|
|
@@ -1269,15 +1269,15 @@ const CatalogSchema = /* @__PURE__ */ (() => z.object({
|
|
|
1269
1269
|
url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
1270
1270
|
feed_format: FeedFormatSchema.optional(),
|
|
1271
1271
|
update_frequency: UpdateFrequencySchema.optional(),
|
|
1272
|
-
items: z.array(z.object({}).passthrough()).optional(),
|
|
1273
|
-
ids: z.array(z.string()).optional(),
|
|
1274
|
-
gtins: z.array(z.string()).optional(),
|
|
1275
|
-
tags: z.array(z.string()).optional(),
|
|
1272
|
+
items: z.array(z.object({}).passthrough()).min(1).optional(),
|
|
1273
|
+
ids: z.array(z.string()).min(1).optional(),
|
|
1274
|
+
gtins: z.array(z.string()).min(1).optional(),
|
|
1275
|
+
tags: z.array(z.string()).min(1).optional(),
|
|
1276
1276
|
category: z.string().optional(),
|
|
1277
1277
|
query: z.string().optional(),
|
|
1278
|
-
conversion_events: z.array(EventTypeSchema).optional(),
|
|
1278
|
+
conversion_events: z.array(EventTypeSchema).min(1).optional(),
|
|
1279
1279
|
content_id_type: ContentIDTypeSchema.optional(),
|
|
1280
|
-
feed_field_mappings: z.array(CatalogFieldMappingSchema).optional()
|
|
1280
|
+
feed_field_mappings: z.array(CatalogFieldMappingSchema).min(1).optional()
|
|
1281
1281
|
}).passthrough())();
|
|
1282
1282
|
const BrandReferenceSchema = /* @__PURE__ */ (() => z.object({
|
|
1283
1283
|
domain: z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")),
|
|
@@ -1448,7 +1448,7 @@ const URLAssetSchema = /* @__PURE__ */ (() => z.object({
|
|
|
1448
1448
|
location: z.object({
|
|
1449
1449
|
field: z.literal("url").optional()
|
|
1450
1450
|
}).passthrough().optional()
|
|
1451
|
-
}).passthrough())).optional(),
|
|
1451
|
+
}).passthrough())).min(1).optional(),
|
|
1452
1452
|
description: z.string().optional(),
|
|
1453
1453
|
state_id: z.string().optional(),
|
|
1454
1454
|
provenance: ProvenanceSchema.optional()
|
|
@@ -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(),
|
|
@@ -3418,25 +3418,7 @@ const UpdateMediaBuyAsyncInputRequiredSchema = /* @__PURE__ */ (() => z.object({
|
|
|
3418
3418
|
context: ContextObjectSchema.optional(),
|
|
3419
3419
|
ext: ExtensionObjectSchema.optional()
|
|
3420
3420
|
}).passthrough())();
|
|
3421
|
-
const MediaBuyDeliveryWebhookResultSchema = /* @__PURE__ */ (() => z.object({
|
|
3422
|
-
notification_type: z.union([z.literal("scheduled"), z.literal("final"), z.literal("delayed"), z.literal("adjusted"), z.literal("window_update")]),
|
|
3423
|
-
partial_data: z.boolean().optional(),
|
|
3424
|
-
unavailable_count: z.number().int().gte(0).optional(),
|
|
3425
|
-
sequence_number: z.number().int().gte(1).optional(),
|
|
3426
|
-
next_expected_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
3427
|
-
reporting_period: z.object({
|
|
3428
|
-
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
3429
|
-
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
3430
|
-
timezone: z.string().min(1).optional()
|
|
3431
|
-
}).passthrough(),
|
|
3432
|
-
currency: z.string().regex(new RegExp("^[A-Z]{3}$")).optional(),
|
|
3433
|
-
attribution_window: AttributionWindowSchema.optional(),
|
|
3434
|
-
media_buy_deliveries: z.array(z.object({}).passthrough()),
|
|
3435
|
-
errors: z.array(ErrorSchema).optional(),
|
|
3436
|
-
sandbox: z.boolean().optional(),
|
|
3437
|
-
context: ContextObjectSchema.optional(),
|
|
3438
|
-
ext: ExtensionObjectSchema.optional()
|
|
3439
|
-
}).passthrough())();
|
|
3421
|
+
const MediaBuyDeliveryWebhookResultSchema = /* @__PURE__ */ (() => z.object({ "notification_type": z.enum(["scheduled", "final", "delayed", "adjusted", "window_update"]).describe("Type of delivery-report notification: scheduled = regular periodic update, final = campaign completed, delayed = data not yet available, adjusted = corrected data for the same window, window_update = a wider measurement window supersedes a prior window."), "partial_data": z.boolean().describe("Indicates if any media buys in this webhook have missing or delayed data.").optional(), "unavailable_count": z.number().int().gte(0).describe("Number of media buys with reporting_delayed or failed status when partial_data is true.").optional(), "sequence_number": z.number().int().gte(1).describe("Sequential notification number for this reporting webhook stream.").optional(), "next_expected_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "reporting_period": z.object({ "start": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), "end": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), "timezone": z.string().min(1).describe("Reporting timezone applied to this report, as 'UTC' or an IANA timezone identifier. Same meaning as get_media_buy_delivery reporting_period.timezone. Sellers SHOULD return it whenever every reported media buy shares one reporting timezone.").optional() }).catchall(z.any()).describe("Period covered by the delivery report. start and end are instants on the reporting timezone's period boundaries (the products' reporting_capabilities.timezone, echoed in timezone). They fall on UTC midnight only when that timezone is UTC."), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")).describe("Deprecated in AdCP 3.2 and removed in AdCP 4.0. Optional legacy report-wide ISO 4217 currency code. It may be used only when every monetary value in the report has that denomination. A report can contain media buys with different currencies, so buyers MUST NOT interpret this field as an aggregation currency or evidence of currency conversion. Prefer media_buy_deliveries[].currency when present and package-level currency otherwise.").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.") }).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("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.") }).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("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("Attribution methodology and lookback windows used for conversion metrics in this report.").optional(), "media_buy_deliveries": z.array(z.object({ "media_buy_id": z.string().describe("Seller's media buy identifier."), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")).describe("ISO 4217 denomination for monetary values in this media-buy delivery row, including totals, package spend, and currency-denominated package rates. Sellers SHOULD populate this field whenever all monetary values in the row share one currency. For AdCP-authored buys it MUST equal the media-buy currency, and every by_package[].currency MUST equal it. For a legacy or externally created mixed-currency buy, omit this field and all monetary or money-derived values from row totals; report those values only at package level with each package's own currency. AdCP does not perform currency conversion.").optional(), "status": z.enum(["pending_creatives", "pending_start", "pending", "active", "paused", "completed", "rejected", "canceled", "failed", "reporting_delayed"]).describe("Current media buy lifecycle or reporting status. This is distinct from the webhook envelope's top-level task status."), "expected_availability": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "is_adjusted": z.boolean().describe("Indicates this row contains updated data for a previously reported period.").optional(), "is_final": z.boolean().describe("Whether this row's delivery data is final for the reporting period.").optional(), "finalized_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "pricing_model": z.enum(["cpm", "vcpm", "cpc", "cpcv", "cpv", "cpp", "cpa", "revenue_share", "flat_rate", "time"]).describe("Supported pricing models for advertising products").optional(), "pacing_index": z.number().gte(0).describe("Aggregate media-buy delivery pace relative to the media-buy pacing plan. Authoritative for seller-optimized buys.").optional(), "totals": z.intersection(z.object({ "impressions": z.number().gte(0).describe("Impressions delivered").optional(), "spend": z.number().gte(0).describe("Amount spent").optional(), "clicks": z.number().gte(0).describe("Total clicks").optional(), "ctr": z.number().gte(0).lte(1).describe("Click-through rate (clicks/impressions)").optional(), "views": z.number().gte(0).describe("Content engagements counted toward the billable view threshold. For video this is a platform-defined view event (e.g., 30 seconds or video midpoint); for audio/podcast it is a stream start; for other formats it follows the pricing model's view definition. When the package uses CPV pricing, spend = views \xD7 rate.").optional(), "completed_views": z.number().gte(0).describe("Video/audio completions. When the package has a completed_views optimization goal with view_duration_seconds, completions are counted at that threshold rather than 100% completion.").optional(), "completion_rate": z.union([z.number().gte(0).lte(1).describe("Completion rate (completed_views/impressions). Null indicates the metric is not applicable to this package/buy (e.g. completion rate on a non-video buy)."), z.null().describe("Completion rate (completed_views/impressions). Null indicates the metric is not applicable to this package/buy (e.g. completion rate on a non-video buy).")]).describe("Completion rate (completed_views/impressions). Null indicates the metric is not applicable to this package/buy (e.g. completion rate on a non-video buy).").optional(), "conversions": z.number().gte(0).describe("Total conversions attributed to this delivery. When by_event_type is present, this equals the sum of all by_event_type[].count entries.").optional(), "conversion_value": z.number().gte(0).describe("Total monetary value of attributed conversions (in the reporting currency)").optional(), "commissionable_value": z.number().gte(0).describe("Settled portion of attributed conversion value eligible for revenue-share commission, in the reporting currency. For revenue_share pricing, spend = round_currency(commissionable_value \xD7 commission_rate). This is distinct from conversion_value because taxes, shipping, discounts, returns, cancellations, or ineligible items may be excluded under the agreed commission basis.").optional(), "roas": z.number().gte(0).describe("Return on ad spend (conversion_value / spend)").optional(), "cost_per_acquisition": z.number().gte(0).describe("Cost per conversion (spend / conversions)").optional(), "new_to_brand_rate": z.number().gte(0).lte(1).describe("Fraction of `conversions` (transactions) from first-time brand buyers, 0 = none, 1 = all. For retail-media unit-volume tracking of first-time buyers, see `new_to_brand_units` (count, not rate).").optional(), "leads": z.number().gte(0).describe("Leads generated (convenience alias for by_event_type where event_type='lead')").optional(), "incremental_sales_lift": z.number().gte(0).describe("Incremental sales lift attributed to the campaign \u2014 sales above the control/holdout baseline. Reported as a fraction (0.15 = 15% lift) or as an absolute value depending on seller convention. The seller's `attribution_methodology` qualifier (typically `deterministic_purchase` or `modeled`) and `attribution_window` qualifier on the matching `committed_metrics` entry disambiguate the methodology and window.").optional(), "brand_lift": z.number().gte(0).describe("Brand lift \u2014 measured change in a brand metric (awareness, consideration, favorability, purchase intent, or ad recall) attributed to the campaign. Typically panel-based or survey-based. Reported as a fraction (0.05 = 5% lift). **Multidimensional in production** \u2014 Kantar, Upwave, Cint, DV all report each dimension separately with its own sample size and confidence interval. The dimension flows through `qualifier.lift_dimension` on `committed_metrics` / `by_package[].metric_values` (`awareness` | `consideration` | `favorability` | `purchase_intent` | `ad_recall`); rows under different dimensions are different surveyed outcomes and must not be combined. Use `attribution_methodology: 'panel_based'` qualifier when the underlying methodology is a panel.").optional(), "foot_traffic": z.number().gte(0).describe("Store visits attributed to ad exposure. Count of incremental visits over baseline. Typically uses location-data panel methodology (`attribution_methodology: 'panel_based'`) or deterministic loyalty-card match (`attribution_methodology: 'deterministic_purchase'`).").optional(), "conversion_lift": z.number().gte(0).describe("Incremental conversions attributed to the campaign \u2014 conversions above the control/holdout baseline. Reported as a fraction (0.10 = 10% lift) or as an absolute count depending on seller convention. Distinct from `conversions` (raw count of attributed conversions); conversion_lift requires a control group and an incrementality methodology.").optional(), "brand_search_lift": z.number().gte(0).describe("Lift in brand search query volume attributed to the campaign \u2014 measured via search-data partnerships (Google, Microsoft) or survey methodology. Reported as a fraction (0.20 = 20% lift in branded search).").optional(), "plays": z.number().gte(0).describe("Number of times the ad creative was displayed or played on DOOH or broadcast inventory. Raw play count before any impression multiplier is applied. Mirrors `forecastable-metric.json`'s `plays` token for forecast\u2194delivery reconciliation. Distinct from `dooh_metrics.loop_plays` (scheduled-rotation count) and from `impressions` (multiplied audience figure).").optional(), "measurement_source": z.string().regex(new RegExp("^[a-z0-9_]+$")).max(64).describe("Third-party measurement provider whose data produced this row's audience numbers. Mirrors delivery-forecast.json's measurement_source so forecast and delivery reconcile on the same declaration \u2014 distinct from demographic_system, which specifies demographic notation. Makes measured-channel rows (radio, broadcast, OOH) self-describing: a reconciliation join can tie delivered numbers to the system that measured them without consulting out-of-band context. Lowercase slug format.").optional(), "by_event_type": z.array(z.object({ "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("The event type"), "event_source_id": z.string().describe("Event source that produced these conversions (for disambiguation when multiple event sources are configured)").optional(), "count": z.number().gte(0).describe("Number of events of this type"), "value": z.number().gte(0).describe("Total monetary value of events of this type").optional() }).catchall(z.any())).describe("Conversion metrics broken down by event type. Spend-derived metrics (ROAS, CPA) are only available at the package/totals level since spend cannot be attributed to individual event types.").optional(), "grps": z.number().gte(0).describe("Gross Rating Points delivered (for CPP)").optional(), "reach": z.number().gte(0).describe("Unique reach in the units specified by reach_unit. When reach_unit is omitted, units are unspecified \u2014 do not compare reach values across packages or media buys without a common reach_unit. The measurement window for this value is declared in `reach_window`; when `reach_window` is omitted, the window is unspecified and buyers MUST NOT sum reach across reports (the value MAY be a daily snapshot, a cumulative total, or something else).").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.").describe("Unit of measurement for the reach field. Aligns with the reach_unit declared on optimization goals and delivery forecasts. Required when reach is present to enable cross-platform comparison.").optional(), "reach_window": z.object({ "kind": z.enum(["cumulative", "period", "rolling"]).describe("Window semantics. `cumulative` \u2014 uniques since campaign start; the value is the total unique count to date and MUST NOT be summed across rows (each later row supersedes the earlier value). `period` \u2014 uniques within a single non-overlapping reporting period (e.g., a daily snapshot for a specific calendar day). Adjacent `period` rows do not share audiences by construction, but the same person MAY appear across multiple periods, so MUST NOT be summed across rows to compute campaign reach. `rolling` \u2014 uniques within a trailing window ending at the row's reporting timestamp (e.g., trailing-7-day reach). Adjacent rolling rows overlap and MUST NOT be summed; each row's value stands alone."), "period": 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('Duration of the measurement window. REQUIRED when `kind` is `period` or `rolling` \u2014 declares the snapshot length (e.g., `{"interval": 1, "unit": "days"}` for a daily snapshot) or the trailing-window length (e.g., `{"interval": 7, "unit": "days"}` for trailing-7-day rolling reach). When `kind` is `cumulative`, this field is implicit (campaign-to-date) and SHOULD be omitted.').optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "kind": z.enum(["period", "rolling"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "kind": z.enum(["period", "rolling"]) }), z.object({ "period": z.any().refine((value) => value !== void 0, "Required") }).passthrough())]).describe("Must also satisfy at least one of these alternatives.")).describe("Measurement window for the reported `reach` and `frequency` values in this row. Declares whether the values are a per-period snapshot, a trailing rolling window, or cumulative-to-date \u2014 without this declaration, buyers summing `reach` across rows (e.g., daily delivery reports) can silently double-count audiences. Sellers SHOULD populate this whenever `reach` is present.").optional(), "frequency": z.number().gte(0).describe("Average frequency per reach unit, measured over the window declared in `reach_window`. When `reach_unit` is 'households', this is average exposures per household; when 'accounts', per logged-in account; etc. When `reach_window` is omitted, the window is unspecified \u2014 buyers MUST NOT compare or average frequency values across rows.").optional(), "quartile_data": z.union([z.object({ "q1_views": z.number().gte(0).describe("25% completion views").optional(), "q2_views": z.number().gte(0).describe("50% completion views").optional(), "q3_views": z.number().gte(0).describe("75% completion views").optional(), "q4_views": z.number().gte(0).describe("100% completion views").optional() }).describe("Audio/video quartile completion data. Null indicates the metric is not applicable to this package/buy (e.g. quartile data on a non-video buy). Individual quartiles are addressable via the leaf metric identities `quartile_25` (q1_views), `quartile_50` (q2_views), `quartile_75` (q3_views), and `quartile_100` (q4_views) for declaration, commitments, aggregates, and breakdown sorting; this object remains the canonical carrier of the values. Quartiles are player-fired events (VAST firstQuartile/midpoint/thirdQuartile/complete). `quartile_100` counts 100%-of-duration completions and is distinct from `completed_views`, which counts completions at the seller's billable view threshold (`view_duration_seconds`) when one is set."), z.null().describe("Audio/video quartile completion data. Null indicates the metric is not applicable to this package/buy (e.g. quartile data on a non-video buy). Individual quartiles are addressable via the leaf metric identities `quartile_25` (q1_views), `quartile_50` (q2_views), `quartile_75` (q3_views), and `quartile_100` (q4_views) for declaration, commitments, aggregates, and breakdown sorting; this object remains the canonical carrier of the values. Quartiles are player-fired events (VAST firstQuartile/midpoint/thirdQuartile/complete). `quartile_100` counts 100%-of-duration completions and is distinct from `completed_views`, which counts completions at the seller's billable view threshold (`view_duration_seconds`) when one is set.")]).describe("Audio/video quartile completion data. Null indicates the metric is not applicable to this package/buy (e.g. quartile data on a non-video buy). Individual quartiles are addressable via the leaf metric identities `quartile_25` (q1_views), `quartile_50` (q2_views), `quartile_75` (q3_views), and `quartile_100` (q4_views) for declaration, commitments, aggregates, and breakdown sorting; this object remains the canonical carrier of the values. Quartiles are player-fired events (VAST firstQuartile/midpoint/thirdQuartile/complete). `quartile_100` counts 100%-of-duration completions and is distinct from `completed_views`, which counts completions at the seller's billable view threshold (`view_duration_seconds`) when one is set.").optional(), "time_based_views": z.array(z.object({ "threshold_seconds": z.number().gt(0).describe("Continuous duration threshold in seconds an impression must meet to count as a view in this entry."), "basis": z.enum(["play_time", "in_view"]).describe("Whether the threshold clock runs on playback time or in-view time. Required because play-time and in-view counts at the same threshold are materially different numbers."), "views": z.number().gte(0).describe("Count of views meeting this entry's threshold and basis."), "standard": z.enum(["mrc", "groupm"]).describe("Viewability standard governing the in-view clock for this entry. RECOMMENDED when basis is 'in_view' (MRC and GroupM thresholds differ); not applicable to play_time entries.").optional() }).catchall(z.any())).describe("Time-threshold video view counts. Each entry reports views that met a continuous duration threshold under a stated basis, rather than a completion percentage (percentage-based completion is quartile_data). Thresholds of 2 and 6 seconds are RECOMMENDED cross-platform reporting points; any seller-defined threshold is permitted. One entry per (threshold_seconds, basis) pair per reporting period \u2014 sellers MUST de-duplicate before emission and MUST NOT emit the same pair twice; buyers MAY treat duplicate pairs as a seller-side conformance bug. Entries under different bases are different metrics and MUST NOT be summed (see view-threshold-basis). Primarily an autoplay/skippable-video metric (social, olv, in-feed video); completion metrics remain the currency for lean-back CTV/cinema inventory. Distinct from `views` (the single billable-threshold scalar) and from `viewability.viewed_seconds` (average in-view duration, not a threshold count). Array entries are not individually sortable in breakdown sort_by. Disclosure-grade surface: (threshold_seconds, basis) is not part of the committed-metric qualifier vocabulary, so a `committed_metrics` entry for `time_based_views` contracts the array's presence, not specific thresholds.").optional(), "dooh_metrics": z.object({ "loop_plays": z.number().int().gte(0).describe("Number of times ad played in rotation").optional(), "screens_used": z.number().int().gte(0).describe("Number of unique screens displaying the ad").optional(), "screen_time_seconds": z.number().int().gte(0).describe("Total display time in seconds").optional(), "sov_achieved": z.number().gte(0).lte(1).describe("Actual share of voice delivered on a 0.0-1.0 scale. To compare this achieved value with the selected flat-rate DOOH parameters.sov_percentage, multiply sov_achieved by 100. Share is time-weighted: the sum of the delivered segment durations divided by the full loop duration. On equal-duration loops this equals the slot-count ratio. See also ooh_metrics.share_of_voice_contracted, which uses the same 0.0-1.0 scale.").optional(), "calculation_notes": z.string().describe("Per-row supplementary methodology notes for DOOH impression calculation (e.g., 'rotation-based; 6-second slot weighted by 70% audience overlap'). Free-form prose for context that doesn't fit the structured measurement-vendor surface. Canonical methodology declarations belong on the measurement vendor's `get_adcp_capabilities.measurement.metrics[]` block where they're discoverable once and inherited across delivery rows; this field is for row-specific context (a particular daypart's calculation, a venue-mix exception) rather than the seller's general methodology.").optional(), "venue_breakdown": z.array(z.object({ "venue_id": z.string().describe("Venue identifier"), "venue_name": z.string().describe("Human-readable venue name").optional(), "venue_type": z.string().describe("Venue type (e.g., 'airport', 'transit', 'retail', 'billboard')").optional(), "impressions": z.number().int().gte(0).describe("Impressions delivered at this venue"), "loop_plays": z.number().int().gte(0).describe("Loop plays at this venue").optional(), "screens_used": z.number().int().gte(0).describe("Number of screens used at this venue").optional() }).catchall(z.any())).describe("Per-venue performance breakdown").optional() }).catchall(z.any()).describe("DOOH-specific metrics (only included for DOOH campaigns)").optional(), "ooh_metrics": z.object({ "panels": z.array(z.object({ "identifiers": z.array(z.object({ "id": z.string().describe("Panel/face identifier within the id_type namespace"), "id_type": z.enum(["geopath", "route_frame", "plant_face", "other"]).describe("Identifier scheme: geopath (US Geopath Spot ID), route_frame (UK Route frame ID), plant_face (the operator's own panel number \u2014 the identifier both sides of a direct contract know), other (markets without a listed scheme). New schemes ship as enum additions in minors.") }).catchall(z.any())).min(1).describe("All identifiers for this panel, one entry per scheme"), "name": z.string().describe("Human-readable location description (e.g., 'I-95 N of Exit 12, right-hand read')").optional() }).catchall(z.any())).describe("Panels (faces) covered by this row. A panel commonly carries multiple identifiers at once \u2014 OOH contracts key line items on the measurement-currency panel number AND the operator's own panel number together.").optional(), "posting_period_start": z.string().date().describe("First in-charge date of the posting period this row covers").optional(), "posting_period_end": z.string().date().describe("Last date of the posting period this row covers").optional(), "average_posted_date": z.string().date().describe("Average actual posting date across the row's units \u2014 the date the display term runs from under OAAA Bulletin \xA72.2 / Poster \xA73.2(a) when materials were timely. Read with materials_timely to know whether that rule was in force.").optional(), "materials_timely": z.boolean().describe("Seller's assertion that the buyer delivered acceptable materials by the contractual deadline, which determines whether the \xA72.2 posting-completion rule (term runs from average posting date) applied. An assertion about the buyer's delivery, not a derived value \u2014 it is not recomputable from postings[] evidence, and is the one field in this block that isn't checkable against it.").optional(), "share_of_voice_contracted": z.number().gte(0).lte(1).describe("Contracted share of voice where the buy is rotation-based (e.g., rotary bulletin programs) rather than an exclusive face, on a 0.0-1.0 scale. Share is time-weighted: the sum of contracted display durations divided by the full rotation duration. On equal-duration rotations this equals the slot-count ratio.").optional(), "illuminated_hours": z.number().gte(0).lte(24).describe("Contracted daily illumination hours for the panels in this row. Determines the measured day-part basis (12/18/24-hour impressions) and the illumination-credit remedy when unmet.").optional(), "estimated_impressions": z.number().int().gte(0).describe("Modeled audience impressions for the panels and period in this row. This is the channel's delivery number \u2014 there is no event-counted alternative. The methodology tier MUST be declared in estimation_basis; provider identity is declared in the row-level measurement_source; the billing vendor is declared in measurement_terms.billing_measurement. The row's top-level impressions SHOULD carry the same value so cross-channel aggregation works without channel-specific logic.").optional(), "estimation_basis": z.enum(["currency_measured", "seller_modeled"]).describe("Methodology tier of estimated_impressions: currency_measured (an audience measurement currency's estimate for the panel and period \u2014 Geopath, Route, MOVE, COMMB \u2014 with the provider named in the row-level measurement_source) or seller_modeled (the seller's own model \u2014 the honest fallback for markets without a measurement currency). Tier, not provider: currencies change over time, so provider identity is data on measurement_source, not values in this enum.").optional(), "postings": z.array(z.object({ "panel_id": z.string().describe("Panel reference matching one of panels[].identifiers[].id"), "event_type": z.enum(["posted", "rotated", "repaired", "removed"]).describe("What the record attests: initial posting, rotary rotation to a new face, repair/reposting after damage, or removal at flight end").default("posted"), "occurred_at": z.string().date().describe("Date the attested event happened. For posted events this is the posting date \u2014 display terms customarily run from the average posting date across units."), "evidence": z.object({ "url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("The evidence artifact \u2014 photograph, scanned tearsheet, or evidence package"), "captured_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "latitude": z.number().gte(-90).lte(90).describe("Capture location latitude").optional(), "longitude": z.number().gte(-180).lte(180).describe("Capture location longitude").optional(), "notes": z.string().describe("Context that doesn't fit the structured fields (e.g., 'shot from the eastbound approach at 40mph equivalent')").optional() }).catchall(z.any()).describe("Evidence artifact for this event (completion photograph); capture time and location ride the artifact").optional() }).catchall(z.any())).describe("Posting records \u2014 the seller-attested settlement artifact proving each panel was posted for the period. Industry convention (OAAA model contracts, Proof of Performance \xA73.5): photo evidence per bulletin within five calendar days of posting and again after each rotary rotation; one representative close-up photograph per creative design variation for poster showings (no deadline attached). Distinct from the \xA72.2 posting-completion obligation (posting within five business days of the scheduled date), which governs average_posted_date, not evidence.").optional(), "calculation_notes": z.string().describe("Row-specific methodology context that doesn't fit the structured fields (e.g., a partial-period proration or a market-specific estimate adjustment). Same role as dooh_metrics.calculation_notes \u2014 canonical methodology declarations belong on the measurement vendor's discoverable surfaces, not here.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "estimated_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "estimated_impressions": z.any().refine((value) => value !== void 0, "Required"), "estimation_basis": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Classic (static) OOH metrics \u2014 printed bulletins, posters, transit, and street furniture (only included for ooh campaigns). Experimental in AdCP 3.2. Static units have no play event: the delivery number is a period-level modeled audience estimate whose methodology tier is declared in estimation_basis (provider identity rides the row-level measurement_source), and the settlement artifact is the posting record \u2014 it proves the posting period, not an airing.").optional(), "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 where /.well-known/brand.json is hosted, or the brand's operating domain"), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand identifier within the house portfolio. Optional for single-brand domains.").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 for a global/default identity. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account identity and is not delivery targeting.").optional(), "industries": z.array(z.string()).describe("Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json.").optional(), "data_subject_contestation": z.object({ "url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).optional(), "email": z.string().email().optional(), "languages": z.array(z.string()).optional() }).strict().and(z.union([z.object({ "url": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "email": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand \u2192 house \u2192 missing.").optional(), "brand_kit_override": z.object({ "logo": z.object({ "asset_type": z.literal("image").describe("Discriminator identifying this as an image asset. See /schemas/creative/asset-types for the registry."), "url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to the image asset"), "width": z.number().int().gte(1).describe("Width in pixels"), "height": z.number().int().gte(1).describe("Height in pixels"), "file_size_bytes": z.number().int().gte(1).describe("Image file size in bytes. Required by agents that advertise a max_file_size_kb constraint.").optional(), "pixel_ratio": z.number().gt(0).describe("Intrinsic pixels per logical render pixel (for example `2` for a 600\xD7500 image intended to render at 300\xD7250). Optional because a validator can infer the ratio when the target format declares logical dimensions. When supplied, it MUST agree with both `width / logical_width` and `height / logical_height`; it is never a substitute for the intrinsic `width` and `height` fields.").optional(), "state_id": z.string().describe("Binding used only when this image populates a `seller_rendered_stateful_display` `state_canvases` slot. It MUST match one declared `states[].state_id` (semantic validators resolve it). Omit for ordinary image slots.").optional(), "breakpoint_id": z.string().describe("Binding used only when this image populates a `seller_rendered_stateful_display` `state_canvases` slot. It MUST match one breakpoint declared on the selected state (semantic validators resolve it). Omit for ordinary image slots.").optional(), "focal_point": z.array(z.number().gte(0).lte(1)).min(2).max(2).describe("Normalized `[x, y]` coordinates (0\u20131 from top-left) of the image's visual anchor. Seller-side renderers crop toward the focal point when deriving renditions across breakpoints and aspect ratios; absent, cropping falls back to center-weighted defaults.").optional(), "format": z.string().describe("Image file format (jpg, png, gif, webp, etc.)").optional(), "alt_text": z.string().describe("Alternative text for accessibility").optional(), "provenance": z.object({ "digital_source_type": z.enum(["digital_capture", "digital_creation", "trained_algorithmic_media", "composite_with_trained_algorithmic_media", "algorithmic_media", "composite_capture", "composite_synthetic", "human_edits", "data_driven_media"]).describe("IPTC-aligned classification of AI involvement in producing this content").optional(), "synthetic_depiction": z.boolean().describe("Assessed declaration of whether the content synthetically depicts a real or fictional person performing or appearing in a way that was generated or materially manipulated rather than captured as depicted. `true` covers both a fully synthetic performer and material manipulation of a real performer; `false` is an assessed declaration that the content does not contain such a depiction. Absence means the content has not been assessed for synthetic depiction. This field does not claim consent, legality, or independent verification, and receivers MUST NOT derive it solely from `digital_source_type`.").optional(), "ai_tool": z.object({ "name": z.string().describe("Name of the AI tool or model (e.g., 'DALL-E 3', 'Stable Diffusion XL', 'Gemini')"), "version": z.string().describe("Version identifier for the AI tool or model (e.g., '25.1', '0125', '2.1'). For generative models, use the model version rather than the API version.").optional(), "provider": z.string().describe("Organization that provides the AI tool (e.g., 'OpenAI', 'Stability AI', 'Google')").optional() }).describe("AI system used to generate or modify this content. Aligns with IPTC 2025.1 AI metadata fields and C2PA claim_generator.").optional(), "human_oversight": z.enum(["none", "prompt_only", "selected", "edited", "directed"]).describe("Level of human involvement in the AI-assisted creation process. Independent of `disclosure.required` \u2014 the protocol does not derive disclosure obligations from oversight level. Some regulations include carve-outs for human-edited or human-directed AI output, but those carve-outs have factual prerequisites the schema cannot evaluate. Asserting `edited` or `directed` does not by itself justify `disclosure.required: false`.").optional(), "declared_by": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent or service that declared this provenance").optional(), "role": z.enum(["creator", "advertiser", "agency", "platform", "tool"]).describe("Role of the declaring party in the supply chain") }).describe("Party declaring this provenance. Identifies who attached the provenance claim, enabling receiving parties to assess trust.").optional(), "declared_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "created_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "c2pa": z.object({ "manifest_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to the C2PA manifest store for this content") }).describe("C2PA sidecar manifest reference. Links to a detached cryptographic provenance manifest for this content. Note: file-level C2PA bindings break when ad servers transcode, resize, or re-encode assets. For pipelines with intermediaries, consider embedded_provenance as the primary provenance mechanism.").optional(), "embedded_provenance": z.array(z.object({ "method": z.enum(["manifest_wrapper", "provenance_markers"]).describe("How provenance data is carried within the content"), "standard": z.string().describe("Standard the embedding conforms to, if any (e.g., 'c2pa' for C2PA Section A.7 text manifest embedding)").optional(), "provider": z.string().describe("Organization that performed the embedding (e.g., 'Encypher', 'Digimarc'). Display label and audit context \u2014 not a wire identifier."), "verify_agent": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("URL of the governance agent the buyer represents was used to embed/verify this layer. MUST use the `https://` scheme and MUST appear in the seller's `creative_policy.accepted_verifiers[].agent_url` list (canonicalized per /docs/reference/url-canonicalization: lowercase scheme and host, strip default port, normalize path dot-segments). Sellers MUST NOT call this URL until the canonicalized match is confirmed."), "feature_id": z.string().describe("Optional `feature_id` the buyer represents the seller should request via `get_creative_features` (e.g., `encypher.markers_present_v2`). SHOULD match the `feature_id` declared on the matching `accepted_verifiers[]` entry, or be omitted to defer the selector to the seller. When the seller's entry pins a `feature_id`, that value wins; when neither side pins, the seller selects from the agent's `governance.creative_features` catalog.").optional() }).strict().describe("Buyer's representation that this embedding can be verified by a governance agent on the seller's `creative_policy.accepted_verifiers` list. The `agent_url` MUST match (canonicalized) one of the seller's published `accepted_verifiers[].agent_url` entries; sellers reject `sync_creatives` submissions whose `verify_agent.agent_url` is off-list with `PROVENANCE_VERIFIER_NOT_ACCEPTED`. This is buyer-supplied evidence, not buyer-driven routing \u2014 the seller is the verifier-of-record and the seller controls which agent it actually calls (the seller MAY use a different on-list agent if it determines this is more appropriate; the seller does not call buyer-asserted endpoints outside its allowlist). MAY be omitted for self-verifiable embeddings (e.g., a C2PA text manifest with a public key the seller already trusts).").optional(), "embedded_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() })).min(1).describe("Provenance metadata embedded within the content stream. Each entry declares one embedding layer: structured provenance data carried inside the content itself, as distinct from sidecar references (c2pa.manifest_url). Embedded provenance survives operations that break sidecar and file-level bindings: ad-server transcoding, CMS ingestion, copy-paste, reformatting, and CDN re-encoding. For ad-tech pipelines where content passes through multiple intermediaries, embedded provenance is the reliable path for provenance that persists from declaration through delivery. This is a declaration by the embedding party. The receiving party (the seller) is the verifier-of-record: it confirms the claim by calling a governance agent it trusts (typically one published in `creative_policy.accepted_verifiers`).").optional(), "watermarks": z.array(z.object({ "media_type": z.enum(["audio", "image", "video", "text"]).describe("Media category of the watermarked content"), "provider": z.string().describe("Organization that applied the watermark (e.g., 'Imatag', 'Steg.AI', 'Encypher'). Display label and audit context \u2014 not a wire identifier."), "verify_agent": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("URL of the governance agent the buyer represents was used to apply/detect this watermark. MUST use the `https://` scheme and MUST appear in the seller's `creative_policy.accepted_verifiers[].agent_url` list (canonicalized per /docs/reference/url-canonicalization: lowercase scheme and host, strip default port, normalize path dot-segments). Sellers MUST NOT call this URL until the canonicalized match is confirmed."), "feature_id": z.string().describe("Optional `feature_id` the buyer represents the seller should request via `get_creative_features` (e.g., `imatag.watermark_detected`). SHOULD match the `feature_id` declared on the matching `accepted_verifiers[]` entry, or be omitted to defer the selector to the seller. When the seller's entry pins a `feature_id`, that value wins; when neither side pins, the seller selects from the agent's `governance.creative_features` catalog.").optional() }).strict().describe("Buyer's representation that this watermark can be detected by a governance agent on the seller's `creative_policy.accepted_verifiers` list. The `agent_url` MUST match (canonicalized) one of the seller's published `accepted_verifiers[].agent_url` entries; sellers reject `sync_creatives` submissions whose `verify_agent.agent_url` is off-list with `PROVENANCE_VERIFIER_NOT_ACCEPTED`. This is buyer-supplied evidence, not buyer-driven routing \u2014 the seller is the verifier-of-record and the seller controls which agent it actually calls (the seller MAY use a different on-list agent if it determines this is more appropriate; the seller does not call buyer-asserted endpoints outside its allowlist).").optional(), "c2pa_action": z.enum(["c2pa.watermarked.bound", "c2pa.watermarked.unbound"]).describe("C2PA action classification for this watermark").optional(), "embedded_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() })).min(1).describe("Content watermarks applied to this asset. Each entry declares one watermarking layer: a content modification that encodes an identifier or fingerprint within the asset. Watermarks differ from embedded provenance: a watermark encodes an identifier (who generated it, who owns it), while embedded provenance carries or references a structured provenance record (the full chain of custody). A single asset may carry both. Aligns with C2PA action taxonomy: c2pa.watermarked.bound (watermark linked to a C2PA manifest) and c2pa.watermarked.unbound (watermark independent of any manifest). This is a declaration by the watermarking party. The receiving party (the seller) is the verifier-of-record: it confirms the claim by calling a governance agent it trusts (typically one published in `creative_policy.accepted_verifiers`).").optional(), "disclosure": z.object({ "required": z.boolean().describe("The declaring party's claim that AI disclosure is required for this content under applicable regulations. This is a declared signal carried through the supply chain \u2014 useful as a routing and audit input \u2014 not a regulatory determination made by the protocol. Receiving parties remain responsible for their own jurisdictional analysis and should not treat `required: false` as compliance cover."), "jurisdictions": z.array(z.object({ "country": z.string().describe("ISO 3166-1 alpha-2 country code (e.g., 'US', 'DE', 'CN')"), "region": z.string().describe("Sub-national region code (e.g., 'CA' for California, 'BY' for Bavaria)").optional(), "regulation": z.string().describe("Regulation identifier (e.g., 'eu_ai_act_article_50', 'ca_sb_942', 'cn_deep_synthesis')"), "label_text": z.string().describe("Required disclosure label text for this jurisdiction, in the local language").optional(), "render_guidance": z.object({ "persistence": z.enum(["continuous", "initial", "flexible"]).describe("How long the disclosure must persist during content playback or display").optional(), "min_duration_ms": z.number().int().gte(1).describe("Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available.").optional(), "positions": z.array(z.enum(["prominent", "footer", "audio", "subtitle", "overlay", "end_card", "pre_roll", "companion"]).describe("Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Preferred disclosure positions in priority order. The first position a format supports should be used.").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() }).describe("How the disclosure should be rendered for this jurisdiction. Expresses the declaring party's intent for persistence and position based on regulatory requirements. Publishers control actual rendering but governance agents can audit whether guidance was followed.").refine((value) => Object.keys(value).length >= 1, "Object must contain at least 1 property").optional() })).min(1).describe("Jurisdictions where disclosure obligations apply").optional() }).describe("Regulatory disclosure requirements for this content. Indicates whether AI disclosure is required and under which jurisdictions.").optional(), "verification": z.array(z.object({ "verified_by": z.string().describe("Name of the verification service (e.g., 'DoubleVerify', 'Hive Moderation', 'Reality Defender')"), "verified_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "result": z.enum(["authentic", "ai_generated", "ai_modified", "inconclusive"]).describe("Verification outcome"), "confidence": z.number().gte(0).lte(1).describe("Confidence score of the verification result (0.0 to 1.0)").optional(), "details_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to the full verification report").optional() })).min(1).describe("Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.").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() }).describe("Provenance metadata for this asset, overrides manifest-level provenance").optional() }).catchall(z.any()).describe("Override logo asset.").optional(), "colors": z.object({ "primary": z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional(), "secondary": z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional(), "accent": z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional() }).catchall(z.any()).describe("Override brand colors (hex strings).").optional(), "voice": z.string().describe("Override brand-voice description for surface-composed text/audio output.").optional(), "tagline": z.string().describe("Override tagline.").optional() }).catchall(z.any()).describe("Inline override for brand-kit fields normally resolved from `/.well-known/brand.json` on `domain` (logo, colors, voice, tagline). Use when brand.json is missing, stale, or inappropriate for this specific call \u2014 e.g., a campaign-scoped tagline, a co-branded creative, a freshly-rebranded color palette the brand.json hasn't shipped yet. Same inline-override pattern as `industries` and `data_subject_contestation` above: brand.json is canonical, the override is per-call. Adopters needing to override fields outside this subset (`voice_attributes`, `prohibited_terms`, etc.) MUST publish a different brand.json and reference it via a different `domain` \u2014 the inline override is intentionally narrow to a small high-traffic subset.\n\n**Merge semantics (normative).** The merge is **field-level**, not whole-object replacement. Each field within `brand_kit_override` (`logo`, `colors`, `voice`, `tagline`) is evaluated independently \u2014 when a field is present on the override the override value applies; when a field is absent the brand.json value applies (or is absent if brand.json doesn't carry one either). For composite fields (`colors.primary`, `colors.secondary`, `colors.accent`), the merge is one level deeper: each color slot is evaluated independently \u2014 a producer can override `colors.primary` while still inheriting `colors.secondary` from brand.json. SDKs MUST NOT treat a present `brand_kit_override.colors` as wiping the brand.json `colors` block entirely; only the per-slot fields present in the override take precedence. Without this rule, a partial-override semantics would diverge across SDKs and produce inconsistent rendering for the same payload.").optional() }).strict().describe("Vendor that produced these viewability values. Optional but RECOMMENDED so the row is self-describing \u2014 buyer agents reading delivery in isolation can attribute the numbers without joining back to `package.committed_metrics` or `package.performance_standards`. The vendor's `brand.json` `agents[type='measurement']` is the discovery anchor; the metric definitions live on the agent's `get_adcp_capabilities.measurement.metrics[]` block. Same shape as `vendor_metric_value.vendor` for symmetry across vendor-attested surfaces.").optional(), "measurable_impressions": z.number().gte(0).describe("Impressions where viewability could be measured. Excludes environments without measurement capability (e.g., non-Intersection Observer browsers, certain app environments). Coverage denominator for `viewable_rate`, `viewed_seconds`, and both viewed-seconds distributions \u2014 every duration statistic is computed over this same measurable population.").optional(), "viewable_impressions": z.number().gte(0).describe("Impressions that met the viewability threshold defined by the measurement standard.").optional(), "viewable_rate": z.number().gte(0).lte(1).describe("Viewable impression rate (viewable_impressions / measurable_impressions). Range 0.0 to 1.0.").optional(), "viewed_seconds": z.number().gte(0).describe("Average in-view duration per measurable impression, in seconds. Reporting-side counterpart to the `viewed_seconds` optimization metric in `optimization-goal.json`. Computed over `measurable_impressions`, not total impressions \u2014 the same denominator as `viewable_rate`. The viewability `standard` governs the threshold (e.g., MRC's 50% pixels for 1s display / 2s video) that defines when an impression is in view and therefore when the clock is running. Sellers reporting against a `viewed_seconds` optimization goal MUST populate this field.").optional(), "viewed_seconds_percentiles": z.object({ "p25": z.number().gte(0).describe("25th-percentile in-view duration in seconds."), "p50": z.number().gte(0).describe("Median (50th-percentile) in-view duration in seconds."), "p75": z.number().gte(0).describe("75th-percentile in-view duration in seconds."), "p90": z.number().gte(0).describe("90th-percentile in-view duration in seconds."), "p95": z.number().gte(0).describe("95th-percentile in-view duration in seconds.") }).strict().describe("Percentile summary of the per-impression in-view durations whose arithmetic mean is reported in `viewed_seconds`. This object MUST use the same reporting row, measurement vendor, viewability `standard`, and `measurable_impressions` population as `viewed_seconds`; sellers MUST omit it when `measurable_impressions` is zero. Percentiles use the nearest-rank definition: sort the N observed durations in ascending order and select rank `ceil(p \xD7 N)` (one-based) for percentile p. Values MUST be non-decreasing from p25 through p95. The structured metric identity `viewed_seconds_percentiles` makes this optional surface discoverable and requestable; it is not sortable and the nested object remains the canonical carrier.").optional(), "viewed_seconds_histogram": z.array(z.object({ "lower_bound_seconds": z.number().gte(0).describe("Inclusive lower bound of this duration bucket, in seconds."), "upper_bound_seconds": z.number().gte(0).describe("Exclusive upper bound of this duration bucket, in seconds. MUST be greater than `lower_bound_seconds`. Omit only on the final bucket to represent an unbounded upper range.").optional(), "impressions": z.number().int().gte(0).describe("Number of measurable impressions whose in-view duration falls in this bucket.") }).strict()).min(1).describe("Bucketed counts of the per-impression in-view durations whose arithmetic mean is reported in `viewed_seconds`. Buckets MUST be ordered by ascending lower bound, MUST NOT overlap, and MUST partition every impression in the same `measurable_impressions` population exactly once; therefore the sum of `impressions` MUST equal `measurable_impressions`. Buckets need not be contiguous: a gap between consecutive bucket boundaries is permitted when no impressions fall within that range \u2014 the sum constraint enforces this implicitly, and validators MUST NOT independently require contiguity. Each bucket is half-open `[lower_bound_seconds, upper_bound_seconds)`; only the final bucket MAY omit `upper_bound_seconds`, representing an unbounded upper range. Sellers choose boundaries, but buyers MUST combine histograms only when the complete boundary sequence, measurement vendor, and viewability `standard` match. The structured metric identity `viewed_seconds_histogram` makes this optional surface discoverable and requestable; it is not sortable and this nested array remains the canonical carrier.").optional(), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to these metrics. Governs the in-view threshold for `viewable_rate`, `viewed_seconds`, and both viewed-seconds distributions.").optional() }).catchall(z.any()).and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "viewed_seconds_percentiles": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "viewed_seconds_percentiles": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "measurable_impressions": z.number().int().gte(1).optional() }))]), z.union([z.any().refine((value) => !z.object({ "viewed_seconds_histogram": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "viewed_seconds_histogram": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "measurable_impressions": z.number().int().optional() }))])), z.intersection(z.union([z.any().refine((value) => !z.object({ "viewed_seconds_percentiles": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "viewed_seconds_percentiles": z.any().refine((value) => value !== void 0, "Required"), "viewed_seconds": z.any().refine((value) => value !== void 0, "Required"), "measurable_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "viewed_seconds_histogram": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "viewed_seconds_histogram": z.any().refine((value) => value !== void 0, "Required"), "viewed_seconds": z.any().refine((value) => value !== void 0, "Required"), "measurable_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Viewability metrics. Viewable rate should be calculated as viewable_impressions / measurable_impressions (not total impressions), since some environments cannot measure viewability. Includes `viewed_seconds` \u2014 average in-view duration \u2014 plus optional percentile and histogram distributions over that duration; all three use the same `measurable_impressions` population and are governed by the same viewability threshold (`standard`). Sellers SHOULD include `standard` whenever measured viewability values are reported because MRC and GroupM rows are not interchangeable. The numeric leaves are addressable via the leaf metric identities `viewable_rate`, `viewable_impressions`, `measurable_impressions`, and `viewed_seconds` for declaration, commitments, aggregates, and breakdown sorting. The structured distribution carriers require explicit `viewed_seconds_percentiles` and `viewed_seconds_histogram` identities for declaration, commitment, and selection; they are not numeric aggregate rows or sort keys. This object remains the canonical carrier of every value. When a buy reports under more than one standard, contract a specific standard via the `viewability_standard` qualifier on `committed_metrics`; when the package's `committed_metrics` carry a `viewability_standard` qualifier, sellers MUST populate `standard` on reported viewability objects so reconciliation can match the qualifier.").optional(), "engagements": z.number().gte(0).describe("Total engagements \u2014 direct interactions with the ad beyond viewing. Includes social reactions/comments/shares, story/unit opens, interactive overlay taps on CTV, companion banner interactions on audio. Platform-specific; corresponds to the 'engagements' optimization metric. Maps to DBCFM KPI_INTERACTIONS (Interaktionen) in the Reporting/Performance block.").optional(), "follows": z.number().gte(0).describe("New followers, page likes, artist/podcast/channel follows, or free channel/feed subscribes attributed to this delivery. Paid subscriptions are conversion events with `event_type: subscribe`, not `follows`.").optional(), "saves": z.number().gte(0).describe("Saves, bookmarks, playlist adds, pins attributed to this delivery.").optional(), "profile_visits": z.number().gte(0).describe("Visits to the brand's in-platform page (profile, artist page, channel, or storefront) attributed to this delivery. Does not include external website clicks.").optional(), "engagement_rate": z.number().gte(0).lte(1).describe("Platform-specific engagement rate (0.0 to 1.0). Typically engagements/impressions, but definition varies by platform.").optional(), "cost_per_click": z.number().gte(0).describe("Cost per click (spend / clicks)").optional(), "cost_per_completed_view": z.number().gte(0).describe("Cost per completed view (spend / completed_views). Primary CPCV pricing scalar for video/audio inventory; the package's `pricing_model` is `cpcv` when this field is the billing basis.").optional(), "cpm": z.number().gte(0).describe("Cost per thousand impressions, computed as (spend / impressions) \xD7 1000. Universal pricing scalar across CTV, display, mobile/web video, native, audio, and DOOH inventory; the package's `pricing_model` is `cpm` when this field is the billing basis. Field name aligns with the canonical `cpm` token in `enums/pricing-model.json` and `pricing-options/cpm-option.json` so buyers cross-walk pricing model \u2192 reported scalar without a translation table.").optional(), "downloads": z.number().gte(0).describe("Audio/podcast downloads (IAB Podcast Measurement Technical Guidelines 2.x methodology). Distinct from `views` \u2014 for podcast inventory this is the count of podcast episode downloads; for streaming audio it is the count of stream starts that meet the platform's download threshold. Prefer this over `views` for audio inventory.").optional(), "units_sold": z.number().gte(0).describe("Items sold attributed to this delivery. Retail-media scalar distinct from `conversions` \u2014 a single conversion (transaction) may carry multiple `units_sold`. Used by retail media platforms where the buyer optimizes against unit movement, not transaction count. Attribution lookback windows are platform-specific (commonly 7/14/30 days, view-through and click-through variants); sellers SHOULD declare the window via `reporting_capabilities.measurement_windows` or `measurement_terms` rather than encoding it in this scalar.").optional(), "new_to_brand_units": z.number().gte(0).describe("Units sold to first-time brand buyers (count, not rate). Retail-media scalar \u2014 the unit-volume parallel to the conversion-fraction `new_to_brand_rate`. Used by retail media platforms where new-customer acquisition unit volume is a primary KPI. Same attribution-window note as `units_sold` applies.").optional(), "by_action_source": z.array(z.object({ "action_source": z.enum(["website", "app", "offline", "phone_call", "chat", "email", "in_store", "system_generated", "other"]).describe("Where the conversion occurred"), "event_source_id": z.string().describe("Event source that produced these conversions (for disambiguation when multiple event sources are configured)").optional(), "count": z.number().gte(0).describe("Number of conversions from this action source"), "value": z.number().gte(0).describe("Total monetary value of conversions from this action source").optional() }).catchall(z.any())).describe("Conversion metrics broken down by action source (website, app, in_store, etc.). Useful for omnichannel sellers where conversions occur across digital and physical channels.").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 where /.well-known/brand.json is hosted, or the brand's operating domain"), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand identifier within the house portfolio. Optional for single-brand domains.").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 for a global/default identity. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account identity and is not delivery targeting.").optional(), "industries": z.array(z.string()).describe("Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json.").optional(), "data_subject_contestation": z.object({ "url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).optional(), "email": z.string().email().optional(), "languages": z.array(z.string()).optional() }).strict().and(z.union([z.object({ "url": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "email": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand \u2192 house \u2192 missing.").optional(), "brand_kit_override": z.object({ "logo": z.object({ "asset_type": z.literal("image").describe("Discriminator identifying this as an image asset. See /schemas/creative/asset-types for the registry."), "url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to the image asset"), "width": z.number().int().gte(1).describe("Width in pixels"), "height": z.number().int().gte(1).describe("Height in pixels"), "file_size_bytes": z.number().int().gte(1).describe("Image file size in bytes. Required by agents that advertise a max_file_size_kb constraint.").optional(), "pixel_ratio": z.number().gt(0).describe("Intrinsic pixels per logical render pixel (for example `2` for a 600\xD7500 image intended to render at 300\xD7250). Optional because a validator can infer the ratio when the target format declares logical dimensions. When supplied, it MUST agree with both `width / logical_width` and `height / logical_height`; it is never a substitute for the intrinsic `width` and `height` fields.").optional(), "state_id": z.string().describe("Binding used only when this image populates a `seller_rendered_stateful_display` `state_canvases` slot. It MUST match one declared `states[].state_id` (semantic validators resolve it). Omit for ordinary image slots.").optional(), "breakpoint_id": z.string().describe("Binding used only when this image populates a `seller_rendered_stateful_display` `state_canvases` slot. It MUST match one breakpoint declared on the selected state (semantic validators resolve it). Omit for ordinary image slots.").optional(), "focal_point": z.array(z.number().gte(0).lte(1)).min(2).max(2).describe("Normalized `[x, y]` coordinates (0\u20131 from top-left) of the image's visual anchor. Seller-side renderers crop toward the focal point when deriving renditions across breakpoints and aspect ratios; absent, cropping falls back to center-weighted defaults.").optional(), "format": z.string().describe("Image file format (jpg, png, gif, webp, etc.)").optional(), "alt_text": z.string().describe("Alternative text for accessibility").optional(), "provenance": z.object({ "digital_source_type": z.enum(["digital_capture", "digital_creation", "trained_algorithmic_media", "composite_with_trained_algorithmic_media", "algorithmic_media", "composite_capture", "composite_synthetic", "human_edits", "data_driven_media"]).describe("IPTC-aligned classification of AI involvement in producing this content").optional(), "synthetic_depiction": z.boolean().describe("Assessed declaration of whether the content synthetically depicts a real or fictional person performing or appearing in a way that was generated or materially manipulated rather than captured as depicted. `true` covers both a fully synthetic performer and material manipulation of a real performer; `false` is an assessed declaration that the content does not contain such a depiction. Absence means the content has not been assessed for synthetic depiction. This field does not claim consent, legality, or independent verification, and receivers MUST NOT derive it solely from `digital_source_type`.").optional(), "ai_tool": z.object({ "name": z.string().describe("Name of the AI tool or model (e.g., 'DALL-E 3', 'Stable Diffusion XL', 'Gemini')"), "version": z.string().describe("Version identifier for the AI tool or model (e.g., '25.1', '0125', '2.1'). For generative models, use the model version rather than the API version.").optional(), "provider": z.string().describe("Organization that provides the AI tool (e.g., 'OpenAI', 'Stability AI', 'Google')").optional() }).describe("AI system used to generate or modify this content. Aligns with IPTC 2025.1 AI metadata fields and C2PA claim_generator.").optional(), "human_oversight": z.enum(["none", "prompt_only", "selected", "edited", "directed"]).describe("Level of human involvement in the AI-assisted creation process. Independent of `disclosure.required` \u2014 the protocol does not derive disclosure obligations from oversight level. Some regulations include carve-outs for human-edited or human-directed AI output, but those carve-outs have factual prerequisites the schema cannot evaluate. Asserting `edited` or `directed` does not by itself justify `disclosure.required: false`.").optional(), "declared_by": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent or service that declared this provenance").optional(), "role": z.enum(["creator", "advertiser", "agency", "platform", "tool"]).describe("Role of the declaring party in the supply chain") }).describe("Party declaring this provenance. Identifies who attached the provenance claim, enabling receiving parties to assess trust.").optional(), "declared_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "created_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "c2pa": z.object({ "manifest_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to the C2PA manifest store for this content") }).describe("C2PA sidecar manifest reference. Links to a detached cryptographic provenance manifest for this content. Note: file-level C2PA bindings break when ad servers transcode, resize, or re-encode assets. For pipelines with intermediaries, consider embedded_provenance as the primary provenance mechanism.").optional(), "embedded_provenance": z.array(z.object({ "method": z.enum(["manifest_wrapper", "provenance_markers"]).describe("How provenance data is carried within the content"), "standard": z.string().describe("Standard the embedding conforms to, if any (e.g., 'c2pa' for C2PA Section A.7 text manifest embedding)").optional(), "provider": z.string().describe("Organization that performed the embedding (e.g., 'Encypher', 'Digimarc'). Display label and audit context \u2014 not a wire identifier."), "verify_agent": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("URL of the governance agent the buyer represents was used to embed/verify this layer. MUST use the `https://` scheme and MUST appear in the seller's `creative_policy.accepted_verifiers[].agent_url` list (canonicalized per /docs/reference/url-canonicalization: lowercase scheme and host, strip default port, normalize path dot-segments). Sellers MUST NOT call this URL until the canonicalized match is confirmed."), "feature_id": z.string().describe("Optional `feature_id` the buyer represents the seller should request via `get_creative_features` (e.g., `encypher.markers_present_v2`). SHOULD match the `feature_id` declared on the matching `accepted_verifiers[]` entry, or be omitted to defer the selector to the seller. When the seller's entry pins a `feature_id`, that value wins; when neither side pins, the seller selects from the agent's `governance.creative_features` catalog.").optional() }).strict().describe("Buyer's representation that this embedding can be verified by a governance agent on the seller's `creative_policy.accepted_verifiers` list. The `agent_url` MUST match (canonicalized) one of the seller's published `accepted_verifiers[].agent_url` entries; sellers reject `sync_creatives` submissions whose `verify_agent.agent_url` is off-list with `PROVENANCE_VERIFIER_NOT_ACCEPTED`. This is buyer-supplied evidence, not buyer-driven routing \u2014 the seller is the verifier-of-record and the seller controls which agent it actually calls (the seller MAY use a different on-list agent if it determines this is more appropriate; the seller does not call buyer-asserted endpoints outside its allowlist). MAY be omitted for self-verifiable embeddings (e.g., a C2PA text manifest with a public key the seller already trusts).").optional(), "embedded_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() })).min(1).describe("Provenance metadata embedded within the content stream. Each entry declares one embedding layer: structured provenance data carried inside the content itself, as distinct from sidecar references (c2pa.manifest_url). Embedded provenance survives operations that break sidecar and file-level bindings: ad-server transcoding, CMS ingestion, copy-paste, reformatting, and CDN re-encoding. For ad-tech pipelines where content passes through multiple intermediaries, embedded provenance is the reliable path for provenance that persists from declaration through delivery. This is a declaration by the embedding party. The receiving party (the seller) is the verifier-of-record: it confirms the claim by calling a governance agent it trusts (typically one published in `creative_policy.accepted_verifiers`).").optional(), "watermarks": z.array(z.object({ "media_type": z.enum(["audio", "image", "video", "text"]).describe("Media category of the watermarked content"), "provider": z.string().describe("Organization that applied the watermark (e.g., 'Imatag', 'Steg.AI', 'Encypher'). Display label and audit context \u2014 not a wire identifier."), "verify_agent": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("URL of the governance agent the buyer represents was used to apply/detect this watermark. MUST use the `https://` scheme and MUST appear in the seller's `creative_policy.accepted_verifiers[].agent_url` list (canonicalized per /docs/reference/url-canonicalization: lowercase scheme and host, strip default port, normalize path dot-segments). Sellers MUST NOT call this URL until the canonicalized match is confirmed."), "feature_id": z.string().describe("Optional `feature_id` the buyer represents the seller should request via `get_creative_features` (e.g., `imatag.watermark_detected`). SHOULD match the `feature_id` declared on the matching `accepted_verifiers[]` entry, or be omitted to defer the selector to the seller. When the seller's entry pins a `feature_id`, that value wins; when neither side pins, the seller selects from the agent's `governance.creative_features` catalog.").optional() }).strict().describe("Buyer's representation that this watermark can be detected by a governance agent on the seller's `creative_policy.accepted_verifiers` list. The `agent_url` MUST match (canonicalized) one of the seller's published `accepted_verifiers[].agent_url` entries; sellers reject `sync_creatives` submissions whose `verify_agent.agent_url` is off-list with `PROVENANCE_VERIFIER_NOT_ACCEPTED`. This is buyer-supplied evidence, not buyer-driven routing \u2014 the seller is the verifier-of-record and the seller controls which agent it actually calls (the seller MAY use a different on-list agent if it determines this is more appropriate; the seller does not call buyer-asserted endpoints outside its allowlist).").optional(), "c2pa_action": z.enum(["c2pa.watermarked.bound", "c2pa.watermarked.unbound"]).describe("C2PA action classification for this watermark").optional(), "embedded_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() })).min(1).describe("Content watermarks applied to this asset. Each entry declares one watermarking layer: a content modification that encodes an identifier or fingerprint within the asset. Watermarks differ from embedded provenance: a watermark encodes an identifier (who generated it, who owns it), while embedded provenance carries or references a structured provenance record (the full chain of custody). A single asset may carry both. Aligns with C2PA action taxonomy: c2pa.watermarked.bound (watermark linked to a C2PA manifest) and c2pa.watermarked.unbound (watermark independent of any manifest). This is a declaration by the watermarking party. The receiving party (the seller) is the verifier-of-record: it confirms the claim by calling a governance agent it trusts (typically one published in `creative_policy.accepted_verifiers`).").optional(), "disclosure": z.object({ "required": z.boolean().describe("The declaring party's claim that AI disclosure is required for this content under applicable regulations. This is a declared signal carried through the supply chain \u2014 useful as a routing and audit input \u2014 not a regulatory determination made by the protocol. Receiving parties remain responsible for their own jurisdictional analysis and should not treat `required: false` as compliance cover."), "jurisdictions": z.array(z.object({ "country": z.string().describe("ISO 3166-1 alpha-2 country code (e.g., 'US', 'DE', 'CN')"), "region": z.string().describe("Sub-national region code (e.g., 'CA' for California, 'BY' for Bavaria)").optional(), "regulation": z.string().describe("Regulation identifier (e.g., 'eu_ai_act_article_50', 'ca_sb_942', 'cn_deep_synthesis')"), "label_text": z.string().describe("Required disclosure label text for this jurisdiction, in the local language").optional(), "render_guidance": z.object({ "persistence": z.enum(["continuous", "initial", "flexible"]).describe("How long the disclosure must persist during content playback or display").optional(), "min_duration_ms": z.number().int().gte(1).describe("Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available.").optional(), "positions": z.array(z.enum(["prominent", "footer", "audio", "subtitle", "overlay", "end_card", "pre_roll", "companion"]).describe("Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Preferred disclosure positions in priority order. The first position a format supports should be used.").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() }).describe("How the disclosure should be rendered for this jurisdiction. Expresses the declaring party's intent for persistence and position based on regulatory requirements. Publishers control actual rendering but governance agents can audit whether guidance was followed.").refine((value) => Object.keys(value).length >= 1, "Object must contain at least 1 property").optional() })).min(1).describe("Jurisdictions where disclosure obligations apply").optional() }).describe("Regulatory disclosure requirements for this content. Indicates whether AI disclosure is required and under which jurisdictions.").optional(), "verification": z.array(z.object({ "verified_by": z.string().describe("Name of the verification service (e.g., 'DoubleVerify', 'Hive Moderation', 'Reality Defender')"), "verified_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "result": z.enum(["authentic", "ai_generated", "ai_modified", "inconclusive"]).describe("Verification outcome"), "confidence": z.number().gte(0).lte(1).describe("Confidence score of the verification result (0.0 to 1.0)").optional(), "details_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to the full verification report").optional() })).min(1).describe("Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.").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() }).describe("Provenance metadata for this asset, overrides manifest-level provenance").optional() }).catchall(z.any()).describe("Override logo asset.").optional(), "colors": z.object({ "primary": z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional(), "secondary": z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional(), "accent": z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional() }).catchall(z.any()).describe("Override brand colors (hex strings).").optional(), "voice": z.string().describe("Override brand-voice description for surface-composed text/audio output.").optional(), "tagline": z.string().describe("Override tagline.").optional() }).catchall(z.any()).describe("Inline override for brand-kit fields normally resolved from `/.well-known/brand.json` on `domain` (logo, colors, voice, tagline). Use when brand.json is missing, stale, or inappropriate for this specific call \u2014 e.g., a campaign-scoped tagline, a co-branded creative, a freshly-rebranded color palette the brand.json hasn't shipped yet. Same inline-override pattern as `industries` and `data_subject_contestation` above: brand.json is canonical, the override is per-call. Adopters needing to override fields outside this subset (`voice_attributes`, `prohibited_terms`, etc.) MUST publish a different brand.json and reference it via a different `domain` \u2014 the inline override is intentionally narrow to a small high-traffic subset.\n\n**Merge semantics (normative).** The merge is **field-level**, not whole-object replacement. Each field within `brand_kit_override` (`logo`, `colors`, `voice`, `tagline`) is evaluated independently \u2014 when a field is present on the override the override value applies; when a field is absent the brand.json value applies (or is absent if brand.json doesn't carry one either). For composite fields (`colors.primary`, `colors.secondary`, `colors.accent`), the merge is one level deeper: each color slot is evaluated independently \u2014 a producer can override `colors.primary` while still inheriting `colors.secondary` from brand.json. SDKs MUST NOT treat a present `brand_kit_override.colors` as wiping the brand.json `colors` block entirely; only the per-slot fields present in the override take precedence. Without this rule, a partial-override semantics would diverge across SDKs and produce inconsistent rendering for the same payload.").optional() }).strict().describe("Vendor that produced this value. Matches a `vendor_metrics[].vendor` declaration on the product."), "metric_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).min(1).max(64).describe("Identifier for the metric within the vendor's vocabulary. Matches a `vendor_metrics[].metric_id` declaration on the product."), "value": z.number().describe("The reported value. Unit semantics are vendor-defined \u2014 see `unit` field below and the vendor's `brand.json` measurement-agent documentation."), "unit": z.string().describe("Unit of the value. Free-form to accommodate the heterogeneity of vendor metrics (e.g., `score`, `seconds`, `persons`, `gCO2e`, `USD`, `lift_percent`). When the value is monetary, use the ISO 4217 code (e.g., `USD`, `EUR`); for non-monetary, use whatever the vendor publishes. Optional on every row \u2014 the canonical unit lives at the vendor's measurement-agent metric definition (`brand.json` `agents[type='measurement']`). When sellers populate it inline they SHOULD match the vendor's published unit; buyers MAY resolve from the vendor's measurement agent when this field is absent.").optional(), "measurable_impressions": z.number().gte(0).describe("Number of impressions in this reporting period that the vendor was able to measure. Coverage denominator \u2014 buyers compute coverage rate as `measurable_impressions / impressions`. When absent, coverage is unspecified \u2014 buyers MUST NOT compute a coverage rate or assume full coverage. When the vendor measured zero impressions but is integrated, set to 0 explicitly. When the entry is omitted from `vendor_metric_values` entirely, the buyer infers no measurement happened (no integration). This pattern parallels `viewability.measurable_impressions` (`delivery-metrics.json#/properties/viewability`), which has handled vendor coverage in the IAS/DV/MRC ecosystem for over a decade \u2014 same convention: absence is unknown, not full. For channels where the atomic observation unit is a play or screen-second rather than an impression (DOOH, cinema, place-based), report `measurable_plays` or `measurable_play_seconds` instead \u2014 `impressions` there is itself a modelled figure (`plays \xD7 audience multiplier`), so `measurable_impressions / impressions` divides a measured count by a model output and has no interpretation.").optional(), "measurable_plays": z.number().gte(0).describe("Number of plays (loop plays / spots aired) in this reporting period that the vendor was able to measure. Coverage denominator for channels where a play, not an impression, is the atomic observation unit \u2014 DOOH, cinema, place-based audio. Buyers compute coverage as `measurable_plays / plays` (top-level `plays` on `delivery-metrics.json`). Same absence semantics as `measurable_impressions`: absent means coverage is unspecified and buyers MUST NOT compute a rate; 0 means the vendor is integrated but measured nothing. A row SHOULD carry exactly one coverage denominator \u2014 the one matching the unit the vendor actually observes.").optional(), "measurable_play_seconds": z.number().gte(0).describe("Play-seconds \u2014 seconds of creative playout summed across endpoints (screens, speakers, players) \u2014 in this reporting period that the vendor was able to measure. Medium-neutral on purpose: place-based audio has plays and duration but no screen. Coverage denominator when the vendor meters exposure duration rather than discrete plays. On screen networks buyers compute coverage as `measurable_play_seconds / dooh_metrics.screen_time_seconds`; on other place-based media, against the seller's reported playout seconds for the period. Same absence semantics as `measurable_impressions`.").optional(), "vendor_relationship": z.enum(["first_party", "affiliated", "third_party"]).describe("Optional echo of the product's `reporting_capabilities.vendor_metrics[].vendor_relationship` for this `(vendor, metric_id)`, so the delivery row is self-describing without joining back to the product (same reasoning as `viewability.vendor`). When present it MUST equal the declared value; buyers MAY resolve from the product declaration when absent. Absence on the row is *undeclared*, never `third_party`. A relationship disposition, not a trust ranking. Deliberately not a `qualifier` key: the relationship is constant across every row for a (seller, vendor) pair and does not partition rows, so it stays out of the `(vendor, metric_id, qualifier)` reconciliation join.").optional(), "qualifier": z.object({ "viewability_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(), "completion_source": z.enum(["seller_attested", "vendor_attested"]).describe("Trust-source disambiguator for `completion_rate` \u2014 *who* attested to the completion event, not *how* (methodology granularity is a separate dimension; future qualifier keys may add it if buyer demand surfaces). The two paths can yield materially different rates, particularly in SSAI environments where the player's view of completion may differ from a vendor's. Used as a `qualifier.completion_source` key on `committed_metrics`, `missing_metrics`, and package-level delivery values (`metric_values` or `vendor_metric_values`) to disambiguate which trust source the row represents. Edge cases: walled gardens where the seller is also the measurement vendor (YouTube, Spotify) collapse to `seller_attested` by trust-model logic \u2014 the same party served and counted. IAB-certified first-party podcast measurement (Podtrac, Triton on their own platforms; Art19 on its own platform) likewise collapses to `seller_attested`. The same vendor's offering on a third-party platform (Podtrac on a publisher who isn't Podtrac) is `vendor_attested`. The trust axis is *not* who runs the SDK \u2014 it's who is independent of the seller's revenue interest.").optional(), "attribution_methodology": z.enum(["deterministic_purchase", "probabilistic", "panel_based", "modeled"]).describe("How attribution between ad exposure and outcome events was computed. Used as a `qualifier.attribution_methodology` key on `committed_metrics`, `missing_metrics`, package-level delivery values (`metric_values` or `vendor_metric_values`), and `performance-feedback.metric` to disambiguate the same outcome metric reported under different methodologies \u2014 `conversion_value` measured deterministically (matched purchase IDs) is not the same number as `conversion_value` measured probabilistically (modeled match) and should never be summed across methodologies. The retail-media closed-loop pattern typically reports under `deterministic_purchase`; MMM and clean-room outputs typically report under `modeled` or `probabilistic`; panel-based measurement (Nielsen, comScore, Edison) reports under `panel_based`.").optional(), "attribution_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.").optional(), "lift_dimension": z.enum(["awareness", "consideration", "favorability", "purchase_intent", "ad_recall"]).describe("Brand-lift dimension disambiguator. Brand lift is multidimensional in production \u2014 Kantar, Upwave, Cint, DoubleVerify, and similar vendors report awareness, consideration, favorability, purchase intent, and ad recall as separate measurements with their own sample sizes and confidence intervals. Used as a `qualifier.lift_dimension` key on `committed_metrics`, `missing_metrics`, package-level delivery values (`metric_values` or `vendor_metric_values`), and `performance-feedback.metric` to disambiguate which dimension of `brand_lift` a row represents. Two `brand_lift` rows under different lift dimensions represent different surveyed outcomes and must not be combined into a single number.").optional() }).strict().describe("Optional qualifier disambiguating this row from sibling rows for the same (vendor, metric_id) \u2014 e.g., the same vendor outcome metric reported under 7-day and 30-day attribution windows. Same closed key set as `committed-metric`. When the matching `committed_metrics` entry carries a qualifier, this row MUST carry the identical qualifier so reconciliation joins on `(vendor, metric_id, qualifier)`.").optional(), "breakdown": z.record(z.string(), z.any()).describe("Optional structured payload for vendor metrics that don't fit a single scalar \u2014 panel demographic breakouts, co-view audience composition, incremental reach + frequency + lift decompositions. Free-form; the keys and value semantics are defined by the vendor (see the vendor's `brand.json` measurement-agent docs). Buyers MUST treat this object as opaque without consulting the vendor's documentation. Vendors place any fields beyond the standard envelope (e.g., confidence intervals, panel sizes) inside this object rather than at the top level.").optional() }).strict().describe("A reported value for a vendor-defined metric, emitted in `delivery-metrics.json` `vendor_metric_values` parallel to standard scalars. Identifies the vendor (BrandRef), the metric name within that vendor's vocabulary, the value, and the coverage denominator (`measurable_impressions`) \u2014 vendor measurement is rarely 100% coverage. Channels whose atomic observation unit is a play or screen-second rather than an impression (DOOH, cinema, place-based) use the sibling denominators `measurable_plays` / `measurable_play_seconds`. `vendor_relationship` optionally echoes the seller's declared relationship to the vendor (`first_party` / `affiliated` / `third_party`) so a row is self-describing without a discovery hop. The `breakdown` slot accommodates vendors that emit structured payloads beyond a single scalar (panel demographic breakouts, co-view ratios, incremental decompositions). To add fields beyond what this schema defines, vendors place them inside `breakdown` rather than alongside the standard envelope.")).describe("Reported values for vendor-defined metrics that the product's `reporting_capabilities.vendor_metrics` declared. Each entry carries the vendor (BrandRef), the metric identifier within the vendor's vocabulary, the value, optional unit, and `measurable_impressions` as the coverage denominator \u2014 vendor measurement is rarely 100% of delivered impressions, since vendors only score impressions where their SDK fires or their panel matches. When a declared vendor metric is omitted from this array, buyers infer no measurement happened (no integration). One row per `(vendor.domain, vendor.brand_id, metric_id, qualifier)` per reporting period \u2014 the same vendor metric MAY appear in multiple rows only when each carries a distinct qualifier (e.g., 7-day and 30-day attribution windows); sellers MUST de-duplicate before emission and MUST NOT emit two rows with the same tuple; buyers MAY treat duplicate rows as a seller-side conformance bug. The structured `vendor_metric_values` array is the recommended path for vendor metrics; `additionalProperties: true` on this parent object is preserved so existing free-form vendor emissions remain conformant during migration.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "reach": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "reach": z.any().refine((value) => value !== void 0, "Required"), "reach_unit": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Standard delivery metrics that can be reported at media buy, package, or creative level"), z.object({ "effective_rate": z.number().gte(0).optional() }).catchall(z.any()).describe("Aggregate metrics for this media buy across all packages.")), "by_package": z.array(z.intersection(z.object({ "impressions": z.number().gte(0).describe("Impressions delivered").optional(), "spend": z.number().gte(0).describe("Amount spent").optional(), "clicks": z.number().gte(0).describe("Total clicks").optional(), "ctr": z.number().gte(0).lte(1).describe("Click-through rate (clicks/impressions)").optional(), "views": z.number().gte(0).describe("Content engagements counted toward the billable view threshold. For video this is a platform-defined view event (e.g., 30 seconds or video midpoint); for audio/podcast it is a stream start; for other formats it follows the pricing model's view definition. When the package uses CPV pricing, spend = views \xD7 rate.").optional(), "completed_views": z.number().gte(0).describe("Video/audio completions. When the package has a completed_views optimization goal with view_duration_seconds, completions are counted at that threshold rather than 100% completion.").optional(), "completion_rate": z.union([z.number().gte(0).lte(1).describe("Completion rate (completed_views/impressions). Null indicates the metric is not applicable to this package/buy (e.g. completion rate on a non-video buy)."), z.null().describe("Completion rate (completed_views/impressions). Null indicates the metric is not applicable to this package/buy (e.g. completion rate on a non-video buy).")]).describe("Completion rate (completed_views/impressions). Null indicates the metric is not applicable to this package/buy (e.g. completion rate on a non-video buy).").optional(), "conversions": z.number().gte(0).describe("Total conversions attributed to this delivery. When by_event_type is present, this equals the sum of all by_event_type[].count entries.").optional(), "conversion_value": z.number().gte(0).describe("Total monetary value of attributed conversions (in the reporting currency)").optional(), "commissionable_value": z.number().gte(0).describe("Settled portion of attributed conversion value eligible for revenue-share commission, in the reporting currency. For revenue_share pricing, spend = round_currency(commissionable_value \xD7 commission_rate). This is distinct from conversion_value because taxes, shipping, discounts, returns, cancellations, or ineligible items may be excluded under the agreed commission basis.").optional(), "roas": z.number().gte(0).describe("Return on ad spend (conversion_value / spend)").optional(), "cost_per_acquisition": z.number().gte(0).describe("Cost per conversion (spend / conversions)").optional(), "new_to_brand_rate": z.number().gte(0).lte(1).describe("Fraction of `conversions` (transactions) from first-time brand buyers, 0 = none, 1 = all. For retail-media unit-volume tracking of first-time buyers, see `new_to_brand_units` (count, not rate).").optional(), "leads": z.number().gte(0).describe("Leads generated (convenience alias for by_event_type where event_type='lead')").optional(), "incremental_sales_lift": z.number().gte(0).describe("Incremental sales lift attributed to the campaign \u2014 sales above the control/holdout baseline. Reported as a fraction (0.15 = 15% lift) or as an absolute value depending on seller convention. The seller's `attribution_methodology` qualifier (typically `deterministic_purchase` or `modeled`) and `attribution_window` qualifier on the matching `committed_metrics` entry disambiguate the methodology and window.").optional(), "brand_lift": z.number().gte(0).describe("Brand lift \u2014 measured change in a brand metric (awareness, consideration, favorability, purchase intent, or ad recall) attributed to the campaign. Typically panel-based or survey-based. Reported as a fraction (0.05 = 5% lift). **Multidimensional in production** \u2014 Kantar, Upwave, Cint, DV all report each dimension separately with its own sample size and confidence interval. The dimension flows through `qualifier.lift_dimension` on `committed_metrics` / `by_package[].metric_values` (`awareness` | `consideration` | `favorability` | `purchase_intent` | `ad_recall`); rows under different dimensions are different surveyed outcomes and must not be combined. Use `attribution_methodology: 'panel_based'` qualifier when the underlying methodology is a panel.").optional(), "foot_traffic": z.number().gte(0).describe("Store visits attributed to ad exposure. Count of incremental visits over baseline. Typically uses location-data panel methodology (`attribution_methodology: 'panel_based'`) or deterministic loyalty-card match (`attribution_methodology: 'deterministic_purchase'`).").optional(), "conversion_lift": z.number().gte(0).describe("Incremental conversions attributed to the campaign \u2014 conversions above the control/holdout baseline. Reported as a fraction (0.10 = 10% lift) or as an absolute count depending on seller convention. Distinct from `conversions` (raw count of attributed conversions); conversion_lift requires a control group and an incrementality methodology.").optional(), "brand_search_lift": z.number().gte(0).describe("Lift in brand search query volume attributed to the campaign \u2014 measured via search-data partnerships (Google, Microsoft) or survey methodology. Reported as a fraction (0.20 = 20% lift in branded search).").optional(), "plays": z.number().gte(0).describe("Number of times the ad creative was displayed or played on DOOH or broadcast inventory. Raw play count before any impression multiplier is applied. Mirrors `forecastable-metric.json`'s `plays` token for forecast\u2194delivery reconciliation. Distinct from `dooh_metrics.loop_plays` (scheduled-rotation count) and from `impressions` (multiplied audience figure).").optional(), "measurement_source": z.string().regex(new RegExp("^[a-z0-9_]+$")).max(64).describe("Third-party measurement provider whose data produced this row's audience numbers. Mirrors delivery-forecast.json's measurement_source so forecast and delivery reconcile on the same declaration \u2014 distinct from demographic_system, which specifies demographic notation. Makes measured-channel rows (radio, broadcast, OOH) self-describing: a reconciliation join can tie delivered numbers to the system that measured them without consulting out-of-band context. Lowercase slug format.").optional(), "by_event_type": z.array(z.object({ "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("The event type"), "event_source_id": z.string().describe("Event source that produced these conversions (for disambiguation when multiple event sources are configured)").optional(), "count": z.number().gte(0).describe("Number of events of this type"), "value": z.number().gte(0).describe("Total monetary value of events of this type").optional() }).catchall(z.any())).describe("Conversion metrics broken down by event type. Spend-derived metrics (ROAS, CPA) are only available at the package/totals level since spend cannot be attributed to individual event types.").optional(), "grps": z.number().gte(0).describe("Gross Rating Points delivered (for CPP)").optional(), "reach": z.number().gte(0).describe("Unique reach in the units specified by reach_unit. When reach_unit is omitted, units are unspecified \u2014 do not compare reach values across packages or media buys without a common reach_unit. The measurement window for this value is declared in `reach_window`; when `reach_window` is omitted, the window is unspecified and buyers MUST NOT sum reach across reports (the value MAY be a daily snapshot, a cumulative total, or something else).").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.").describe("Unit of measurement for the reach field. Aligns with the reach_unit declared on optimization goals and delivery forecasts. Required when reach is present to enable cross-platform comparison.").optional(), "reach_window": z.object({ "kind": z.enum(["cumulative", "period", "rolling"]).describe("Window semantics. `cumulative` \u2014 uniques since campaign start; the value is the total unique count to date and MUST NOT be summed across rows (each later row supersedes the earlier value). `period` \u2014 uniques within a single non-overlapping reporting period (e.g., a daily snapshot for a specific calendar day). Adjacent `period` rows do not share audiences by construction, but the same person MAY appear across multiple periods, so MUST NOT be summed across rows to compute campaign reach. `rolling` \u2014 uniques within a trailing window ending at the row's reporting timestamp (e.g., trailing-7-day reach). Adjacent rolling rows overlap and MUST NOT be summed; each row's value stands alone."), "period": 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('Duration of the measurement window. REQUIRED when `kind` is `period` or `rolling` \u2014 declares the snapshot length (e.g., `{"interval": 1, "unit": "days"}` for a daily snapshot) or the trailing-window length (e.g., `{"interval": 7, "unit": "days"}` for trailing-7-day rolling reach). When `kind` is `cumulative`, this field is implicit (campaign-to-date) and SHOULD be omitted.').optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "kind": z.enum(["period", "rolling"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "kind": z.enum(["period", "rolling"]) }), z.object({ "period": z.any().refine((value) => value !== void 0, "Required") }).passthrough())]).describe("Must also satisfy at least one of these alternatives.")).describe("Measurement window for the reported `reach` and `frequency` values in this row. Declares whether the values are a per-period snapshot, a trailing rolling window, or cumulative-to-date \u2014 without this declaration, buyers summing `reach` across rows (e.g., daily delivery reports) can silently double-count audiences. Sellers SHOULD populate this whenever `reach` is present.").optional(), "frequency": z.number().gte(0).describe("Average frequency per reach unit, measured over the window declared in `reach_window`. When `reach_unit` is 'households', this is average exposures per household; when 'accounts', per logged-in account; etc. When `reach_window` is omitted, the window is unspecified \u2014 buyers MUST NOT compare or average frequency values across rows.").optional(), "quartile_data": z.union([z.object({ "q1_views": z.number().gte(0).describe("25% completion views").optional(), "q2_views": z.number().gte(0).describe("50% completion views").optional(), "q3_views": z.number().gte(0).describe("75% completion views").optional(), "q4_views": z.number().gte(0).describe("100% completion views").optional() }).describe("Audio/video quartile completion data. Null indicates the metric is not applicable to this package/buy (e.g. quartile data on a non-video buy). Individual quartiles are addressable via the leaf metric identities `quartile_25` (q1_views), `quartile_50` (q2_views), `quartile_75` (q3_views), and `quartile_100` (q4_views) for declaration, commitments, aggregates, and breakdown sorting; this object remains the canonical carrier of the values. Quartiles are player-fired events (VAST firstQuartile/midpoint/thirdQuartile/complete). `quartile_100` counts 100%-of-duration completions and is distinct from `completed_views`, which counts completions at the seller's billable view threshold (`view_duration_seconds`) when one is set."), z.null().describe("Audio/video quartile completion data. Null indicates the metric is not applicable to this package/buy (e.g. quartile data on a non-video buy). Individual quartiles are addressable via the leaf metric identities `quartile_25` (q1_views), `quartile_50` (q2_views), `quartile_75` (q3_views), and `quartile_100` (q4_views) for declaration, commitments, aggregates, and breakdown sorting; this object remains the canonical carrier of the values. Quartiles are player-fired events (VAST firstQuartile/midpoint/thirdQuartile/complete). `quartile_100` counts 100%-of-duration completions and is distinct from `completed_views`, which counts completions at the seller's billable view threshold (`view_duration_seconds`) when one is set.")]).describe("Audio/video quartile completion data. Null indicates the metric is not applicable to this package/buy (e.g. quartile data on a non-video buy). Individual quartiles are addressable via the leaf metric identities `quartile_25` (q1_views), `quartile_50` (q2_views), `quartile_75` (q3_views), and `quartile_100` (q4_views) for declaration, commitments, aggregates, and breakdown sorting; this object remains the canonical carrier of the values. Quartiles are player-fired events (VAST firstQuartile/midpoint/thirdQuartile/complete). `quartile_100` counts 100%-of-duration completions and is distinct from `completed_views`, which counts completions at the seller's billable view threshold (`view_duration_seconds`) when one is set.").optional(), "time_based_views": z.array(z.object({ "threshold_seconds": z.number().gt(0).describe("Continuous duration threshold in seconds an impression must meet to count as a view in this entry."), "basis": z.enum(["play_time", "in_view"]).describe("Whether the threshold clock runs on playback time or in-view time. Required because play-time and in-view counts at the same threshold are materially different numbers."), "views": z.number().gte(0).describe("Count of views meeting this entry's threshold and basis."), "standard": z.enum(["mrc", "groupm"]).describe("Viewability standard governing the in-view clock for this entry. RECOMMENDED when basis is 'in_view' (MRC and GroupM thresholds differ); not applicable to play_time entries.").optional() }).catchall(z.any())).describe("Time-threshold video view counts. Each entry reports views that met a continuous duration threshold under a stated basis, rather than a completion percentage (percentage-based completion is quartile_data). Thresholds of 2 and 6 seconds are RECOMMENDED cross-platform reporting points; any seller-defined threshold is permitted. One entry per (threshold_seconds, basis) pair per reporting period \u2014 sellers MUST de-duplicate before emission and MUST NOT emit the same pair twice; buyers MAY treat duplicate pairs as a seller-side conformance bug. Entries under different bases are different metrics and MUST NOT be summed (see view-threshold-basis). Primarily an autoplay/skippable-video metric (social, olv, in-feed video); completion metrics remain the currency for lean-back CTV/cinema inventory. Distinct from `views` (the single billable-threshold scalar) and from `viewability.viewed_seconds` (average in-view duration, not a threshold count). Array entries are not individually sortable in breakdown sort_by. Disclosure-grade surface: (threshold_seconds, basis) is not part of the committed-metric qualifier vocabulary, so a `committed_metrics` entry for `time_based_views` contracts the array's presence, not specific thresholds.").optional(), "dooh_metrics": z.object({ "loop_plays": z.number().int().gte(0).describe("Number of times ad played in rotation").optional(), "screens_used": z.number().int().gte(0).describe("Number of unique screens displaying the ad").optional(), "screen_time_seconds": z.number().int().gte(0).describe("Total display time in seconds").optional(), "sov_achieved": z.number().gte(0).lte(1).describe("Actual share of voice delivered on a 0.0-1.0 scale. To compare this achieved value with the selected flat-rate DOOH parameters.sov_percentage, multiply sov_achieved by 100. Share is time-weighted: the sum of the delivered segment durations divided by the full loop duration. On equal-duration loops this equals the slot-count ratio. See also ooh_metrics.share_of_voice_contracted, which uses the same 0.0-1.0 scale.").optional(), "calculation_notes": z.string().describe("Per-row supplementary methodology notes for DOOH impression calculation (e.g., 'rotation-based; 6-second slot weighted by 70% audience overlap'). Free-form prose for context that doesn't fit the structured measurement-vendor surface. Canonical methodology declarations belong on the measurement vendor's `get_adcp_capabilities.measurement.metrics[]` block where they're discoverable once and inherited across delivery rows; this field is for row-specific context (a particular daypart's calculation, a venue-mix exception) rather than the seller's general methodology.").optional(), "venue_breakdown": z.array(z.object({ "venue_id": z.string().describe("Venue identifier"), "venue_name": z.string().describe("Human-readable venue name").optional(), "venue_type": z.string().describe("Venue type (e.g., 'airport', 'transit', 'retail', 'billboard')").optional(), "impressions": z.number().int().gte(0).describe("Impressions delivered at this venue"), "loop_plays": z.number().int().gte(0).describe("Loop plays at this venue").optional(), "screens_used": z.number().int().gte(0).describe("Number of screens used at this venue").optional() }).catchall(z.any())).describe("Per-venue performance breakdown").optional() }).catchall(z.any()).describe("DOOH-specific metrics (only included for DOOH campaigns)").optional(), "ooh_metrics": z.object({ "panels": z.array(z.object({ "identifiers": z.array(z.object({ "id": z.string().describe("Panel/face identifier within the id_type namespace"), "id_type": z.enum(["geopath", "route_frame", "plant_face", "other"]).describe("Identifier scheme: geopath (US Geopath Spot ID), route_frame (UK Route frame ID), plant_face (the operator's own panel number \u2014 the identifier both sides of a direct contract know), other (markets without a listed scheme). New schemes ship as enum additions in minors.") }).catchall(z.any())).min(1).describe("All identifiers for this panel, one entry per scheme"), "name": z.string().describe("Human-readable location description (e.g., 'I-95 N of Exit 12, right-hand read')").optional() }).catchall(z.any())).describe("Panels (faces) covered by this row. A panel commonly carries multiple identifiers at once \u2014 OOH contracts key line items on the measurement-currency panel number AND the operator's own panel number together.").optional(), "posting_period_start": z.string().date().describe("First in-charge date of the posting period this row covers").optional(), "posting_period_end": z.string().date().describe("Last date of the posting period this row covers").optional(), "average_posted_date": z.string().date().describe("Average actual posting date across the row's units \u2014 the date the display term runs from under OAAA Bulletin \xA72.2 / Poster \xA73.2(a) when materials were timely. Read with materials_timely to know whether that rule was in force.").optional(), "materials_timely": z.boolean().describe("Seller's assertion that the buyer delivered acceptable materials by the contractual deadline, which determines whether the \xA72.2 posting-completion rule (term runs from average posting date) applied. An assertion about the buyer's delivery, not a derived value \u2014 it is not recomputable from postings[] evidence, and is the one field in this block that isn't checkable against it.").optional(), "share_of_voice_contracted": z.number().gte(0).lte(1).describe("Contracted share of voice where the buy is rotation-based (e.g., rotary bulletin programs) rather than an exclusive face, on a 0.0-1.0 scale. Share is time-weighted: the sum of contracted display durations divided by the full rotation duration. On equal-duration rotations this equals the slot-count ratio.").optional(), "illuminated_hours": z.number().gte(0).lte(24).describe("Contracted daily illumination hours for the panels in this row. Determines the measured day-part basis (12/18/24-hour impressions) and the illumination-credit remedy when unmet.").optional(), "estimated_impressions": z.number().int().gte(0).describe("Modeled audience impressions for the panels and period in this row. This is the channel's delivery number \u2014 there is no event-counted alternative. The methodology tier MUST be declared in estimation_basis; provider identity is declared in the row-level measurement_source; the billing vendor is declared in measurement_terms.billing_measurement. The row's top-level impressions SHOULD carry the same value so cross-channel aggregation works without channel-specific logic.").optional(), "estimation_basis": z.enum(["currency_measured", "seller_modeled"]).describe("Methodology tier of estimated_impressions: currency_measured (an audience measurement currency's estimate for the panel and period \u2014 Geopath, Route, MOVE, COMMB \u2014 with the provider named in the row-level measurement_source) or seller_modeled (the seller's own model \u2014 the honest fallback for markets without a measurement currency). Tier, not provider: currencies change over time, so provider identity is data on measurement_source, not values in this enum.").optional(), "postings": z.array(z.object({ "panel_id": z.string().describe("Panel reference matching one of panels[].identifiers[].id"), "event_type": z.enum(["posted", "rotated", "repaired", "removed"]).describe("What the record attests: initial posting, rotary rotation to a new face, repair/reposting after damage, or removal at flight end").default("posted"), "occurred_at": z.string().date().describe("Date the attested event happened. For posted events this is the posting date \u2014 display terms customarily run from the average posting date across units."), "evidence": z.object({ "url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("The evidence artifact \u2014 photograph, scanned tearsheet, or evidence package"), "captured_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "latitude": z.number().gte(-90).lte(90).describe("Capture location latitude").optional(), "longitude": z.number().gte(-180).lte(180).describe("Capture location longitude").optional(), "notes": z.string().describe("Context that doesn't fit the structured fields (e.g., 'shot from the eastbound approach at 40mph equivalent')").optional() }).catchall(z.any()).describe("Evidence artifact for this event (completion photograph); capture time and location ride the artifact").optional() }).catchall(z.any())).describe("Posting records \u2014 the seller-attested settlement artifact proving each panel was posted for the period. Industry convention (OAAA model contracts, Proof of Performance \xA73.5): photo evidence per bulletin within five calendar days of posting and again after each rotary rotation; one representative close-up photograph per creative design variation for poster showings (no deadline attached). Distinct from the \xA72.2 posting-completion obligation (posting within five business days of the scheduled date), which governs average_posted_date, not evidence.").optional(), "calculation_notes": z.string().describe("Row-specific methodology context that doesn't fit the structured fields (e.g., a partial-period proration or a market-specific estimate adjustment). Same role as dooh_metrics.calculation_notes \u2014 canonical methodology declarations belong on the measurement vendor's discoverable surfaces, not here.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "estimated_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "estimated_impressions": z.any().refine((value) => value !== void 0, "Required"), "estimation_basis": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Classic (static) OOH metrics \u2014 printed bulletins, posters, transit, and street furniture (only included for ooh campaigns). Experimental in AdCP 3.2. Static units have no play event: the delivery number is a period-level modeled audience estimate whose methodology tier is declared in estimation_basis (provider identity rides the row-level measurement_source), and the settlement artifact is the posting record \u2014 it proves the posting period, not an airing.").optional(), "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 where /.well-known/brand.json is hosted, or the brand's operating domain"), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand identifier within the house portfolio. Optional for single-brand domains.").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 for a global/default identity. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account identity and is not delivery targeting.").optional(), "industries": z.array(z.string()).describe("Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json.").optional(), "data_subject_contestation": z.object({ "url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).optional(), "email": z.string().email().optional(), "languages": z.array(z.string()).optional() }).strict().and(z.union([z.object({ "url": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "email": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand \u2192 house \u2192 missing.").optional(), "brand_kit_override": z.object({ "logo": z.object({ "asset_type": z.literal("image").describe("Discriminator identifying this as an image asset. See /schemas/creative/asset-types for the registry."), "url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to the image asset"), "width": z.number().int().gte(1).describe("Width in pixels"), "height": z.number().int().gte(1).describe("Height in pixels"), "file_size_bytes": z.number().int().gte(1).describe("Image file size in bytes. Required by agents that advertise a max_file_size_kb constraint.").optional(), "pixel_ratio": z.number().gt(0).describe("Intrinsic pixels per logical render pixel (for example `2` for a 600\xD7500 image intended to render at 300\xD7250). Optional because a validator can infer the ratio when the target format declares logical dimensions. When supplied, it MUST agree with both `width / logical_width` and `height / logical_height`; it is never a substitute for the intrinsic `width` and `height` fields.").optional(), "state_id": z.string().describe("Binding used only when this image populates a `seller_rendered_stateful_display` `state_canvases` slot. It MUST match one declared `states[].state_id` (semantic validators resolve it). Omit for ordinary image slots.").optional(), "breakpoint_id": z.string().describe("Binding used only when this image populates a `seller_rendered_stateful_display` `state_canvases` slot. It MUST match one breakpoint declared on the selected state (semantic validators resolve it). Omit for ordinary image slots.").optional(), "focal_point": z.array(z.number().gte(0).lte(1)).min(2).max(2).describe("Normalized `[x, y]` coordinates (0\u20131 from top-left) of the image's visual anchor. Seller-side renderers crop toward the focal point when deriving renditions across breakpoints and aspect ratios; absent, cropping falls back to center-weighted defaults.").optional(), "format": z.string().describe("Image file format (jpg, png, gif, webp, etc.)").optional(), "alt_text": z.string().describe("Alternative text for accessibility").optional(), "provenance": z.object({ "digital_source_type": z.enum(["digital_capture", "digital_creation", "trained_algorithmic_media", "composite_with_trained_algorithmic_media", "algorithmic_media", "composite_capture", "composite_synthetic", "human_edits", "data_driven_media"]).describe("IPTC-aligned classification of AI involvement in producing this content").optional(), "synthetic_depiction": z.boolean().describe("Assessed declaration of whether the content synthetically depicts a real or fictional person performing or appearing in a way that was generated or materially manipulated rather than captured as depicted. `true` covers both a fully synthetic performer and material manipulation of a real performer; `false` is an assessed declaration that the content does not contain such a depiction. Absence means the content has not been assessed for synthetic depiction. This field does not claim consent, legality, or independent verification, and receivers MUST NOT derive it solely from `digital_source_type`.").optional(), "ai_tool": z.object({ "name": z.string().describe("Name of the AI tool or model (e.g., 'DALL-E 3', 'Stable Diffusion XL', 'Gemini')"), "version": z.string().describe("Version identifier for the AI tool or model (e.g., '25.1', '0125', '2.1'). For generative models, use the model version rather than the API version.").optional(), "provider": z.string().describe("Organization that provides the AI tool (e.g., 'OpenAI', 'Stability AI', 'Google')").optional() }).describe("AI system used to generate or modify this content. Aligns with IPTC 2025.1 AI metadata fields and C2PA claim_generator.").optional(), "human_oversight": z.enum(["none", "prompt_only", "selected", "edited", "directed"]).describe("Level of human involvement in the AI-assisted creation process. Independent of `disclosure.required` \u2014 the protocol does not derive disclosure obligations from oversight level. Some regulations include carve-outs for human-edited or human-directed AI output, but those carve-outs have factual prerequisites the schema cannot evaluate. Asserting `edited` or `directed` does not by itself justify `disclosure.required: false`.").optional(), "declared_by": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent or service that declared this provenance").optional(), "role": z.enum(["creator", "advertiser", "agency", "platform", "tool"]).describe("Role of the declaring party in the supply chain") }).describe("Party declaring this provenance. Identifies who attached the provenance claim, enabling receiving parties to assess trust.").optional(), "declared_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "created_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "c2pa": z.object({ "manifest_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to the C2PA manifest store for this content") }).describe("C2PA sidecar manifest reference. Links to a detached cryptographic provenance manifest for this content. Note: file-level C2PA bindings break when ad servers transcode, resize, or re-encode assets. For pipelines with intermediaries, consider embedded_provenance as the primary provenance mechanism.").optional(), "embedded_provenance": z.array(z.object({ "method": z.enum(["manifest_wrapper", "provenance_markers"]).describe("How provenance data is carried within the content"), "standard": z.string().describe("Standard the embedding conforms to, if any (e.g., 'c2pa' for C2PA Section A.7 text manifest embedding)").optional(), "provider": z.string().describe("Organization that performed the embedding (e.g., 'Encypher', 'Digimarc'). Display label and audit context \u2014 not a wire identifier."), "verify_agent": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("URL of the governance agent the buyer represents was used to embed/verify this layer. MUST use the `https://` scheme and MUST appear in the seller's `creative_policy.accepted_verifiers[].agent_url` list (canonicalized per /docs/reference/url-canonicalization: lowercase scheme and host, strip default port, normalize path dot-segments). Sellers MUST NOT call this URL until the canonicalized match is confirmed."), "feature_id": z.string().describe("Optional `feature_id` the buyer represents the seller should request via `get_creative_features` (e.g., `encypher.markers_present_v2`). SHOULD match the `feature_id` declared on the matching `accepted_verifiers[]` entry, or be omitted to defer the selector to the seller. When the seller's entry pins a `feature_id`, that value wins; when neither side pins, the seller selects from the agent's `governance.creative_features` catalog.").optional() }).strict().describe("Buyer's representation that this embedding can be verified by a governance agent on the seller's `creative_policy.accepted_verifiers` list. The `agent_url` MUST match (canonicalized) one of the seller's published `accepted_verifiers[].agent_url` entries; sellers reject `sync_creatives` submissions whose `verify_agent.agent_url` is off-list with `PROVENANCE_VERIFIER_NOT_ACCEPTED`. This is buyer-supplied evidence, not buyer-driven routing \u2014 the seller is the verifier-of-record and the seller controls which agent it actually calls (the seller MAY use a different on-list agent if it determines this is more appropriate; the seller does not call buyer-asserted endpoints outside its allowlist). MAY be omitted for self-verifiable embeddings (e.g., a C2PA text manifest with a public key the seller already trusts).").optional(), "embedded_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() })).min(1).describe("Provenance metadata embedded within the content stream. Each entry declares one embedding layer: structured provenance data carried inside the content itself, as distinct from sidecar references (c2pa.manifest_url). Embedded provenance survives operations that break sidecar and file-level bindings: ad-server transcoding, CMS ingestion, copy-paste, reformatting, and CDN re-encoding. For ad-tech pipelines where content passes through multiple intermediaries, embedded provenance is the reliable path for provenance that persists from declaration through delivery. This is a declaration by the embedding party. The receiving party (the seller) is the verifier-of-record: it confirms the claim by calling a governance agent it trusts (typically one published in `creative_policy.accepted_verifiers`).").optional(), "watermarks": z.array(z.object({ "media_type": z.enum(["audio", "image", "video", "text"]).describe("Media category of the watermarked content"), "provider": z.string().describe("Organization that applied the watermark (e.g., 'Imatag', 'Steg.AI', 'Encypher'). Display label and audit context \u2014 not a wire identifier."), "verify_agent": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("URL of the governance agent the buyer represents was used to apply/detect this watermark. MUST use the `https://` scheme and MUST appear in the seller's `creative_policy.accepted_verifiers[].agent_url` list (canonicalized per /docs/reference/url-canonicalization: lowercase scheme and host, strip default port, normalize path dot-segments). Sellers MUST NOT call this URL until the canonicalized match is confirmed."), "feature_id": z.string().describe("Optional `feature_id` the buyer represents the seller should request via `get_creative_features` (e.g., `imatag.watermark_detected`). SHOULD match the `feature_id` declared on the matching `accepted_verifiers[]` entry, or be omitted to defer the selector to the seller. When the seller's entry pins a `feature_id`, that value wins; when neither side pins, the seller selects from the agent's `governance.creative_features` catalog.").optional() }).strict().describe("Buyer's representation that this watermark can be detected by a governance agent on the seller's `creative_policy.accepted_verifiers` list. The `agent_url` MUST match (canonicalized) one of the seller's published `accepted_verifiers[].agent_url` entries; sellers reject `sync_creatives` submissions whose `verify_agent.agent_url` is off-list with `PROVENANCE_VERIFIER_NOT_ACCEPTED`. This is buyer-supplied evidence, not buyer-driven routing \u2014 the seller is the verifier-of-record and the seller controls which agent it actually calls (the seller MAY use a different on-list agent if it determines this is more appropriate; the seller does not call buyer-asserted endpoints outside its allowlist).").optional(), "c2pa_action": z.enum(["c2pa.watermarked.bound", "c2pa.watermarked.unbound"]).describe("C2PA action classification for this watermark").optional(), "embedded_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() })).min(1).describe("Content watermarks applied to this asset. Each entry declares one watermarking layer: a content modification that encodes an identifier or fingerprint within the asset. Watermarks differ from embedded provenance: a watermark encodes an identifier (who generated it, who owns it), while embedded provenance carries or references a structured provenance record (the full chain of custody). A single asset may carry both. Aligns with C2PA action taxonomy: c2pa.watermarked.bound (watermark linked to a C2PA manifest) and c2pa.watermarked.unbound (watermark independent of any manifest). This is a declaration by the watermarking party. The receiving party (the seller) is the verifier-of-record: it confirms the claim by calling a governance agent it trusts (typically one published in `creative_policy.accepted_verifiers`).").optional(), "disclosure": z.object({ "required": z.boolean().describe("The declaring party's claim that AI disclosure is required for this content under applicable regulations. This is a declared signal carried through the supply chain \u2014 useful as a routing and audit input \u2014 not a regulatory determination made by the protocol. Receiving parties remain responsible for their own jurisdictional analysis and should not treat `required: false` as compliance cover."), "jurisdictions": z.array(z.object({ "country": z.string().describe("ISO 3166-1 alpha-2 country code (e.g., 'US', 'DE', 'CN')"), "region": z.string().describe("Sub-national region code (e.g., 'CA' for California, 'BY' for Bavaria)").optional(), "regulation": z.string().describe("Regulation identifier (e.g., 'eu_ai_act_article_50', 'ca_sb_942', 'cn_deep_synthesis')"), "label_text": z.string().describe("Required disclosure label text for this jurisdiction, in the local language").optional(), "render_guidance": z.object({ "persistence": z.enum(["continuous", "initial", "flexible"]).describe("How long the disclosure must persist during content playback or display").optional(), "min_duration_ms": z.number().int().gte(1).describe("Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available.").optional(), "positions": z.array(z.enum(["prominent", "footer", "audio", "subtitle", "overlay", "end_card", "pre_roll", "companion"]).describe("Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Preferred disclosure positions in priority order. The first position a format supports should be used.").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() }).describe("How the disclosure should be rendered for this jurisdiction. Expresses the declaring party's intent for persistence and position based on regulatory requirements. Publishers control actual rendering but governance agents can audit whether guidance was followed.").refine((value) => Object.keys(value).length >= 1, "Object must contain at least 1 property").optional() })).min(1).describe("Jurisdictions where disclosure obligations apply").optional() }).describe("Regulatory disclosure requirements for this content. Indicates whether AI disclosure is required and under which jurisdictions.").optional(), "verification": z.array(z.object({ "verified_by": z.string().describe("Name of the verification service (e.g., 'DoubleVerify', 'Hive Moderation', 'Reality Defender')"), "verified_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "result": z.enum(["authentic", "ai_generated", "ai_modified", "inconclusive"]).describe("Verification outcome"), "confidence": z.number().gte(0).lte(1).describe("Confidence score of the verification result (0.0 to 1.0)").optional(), "details_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to the full verification report").optional() })).min(1).describe("Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.").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() }).describe("Provenance metadata for this asset, overrides manifest-level provenance").optional() }).catchall(z.any()).describe("Override logo asset.").optional(), "colors": z.object({ "primary": z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional(), "secondary": z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional(), "accent": z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional() }).catchall(z.any()).describe("Override brand colors (hex strings).").optional(), "voice": z.string().describe("Override brand-voice description for surface-composed text/audio output.").optional(), "tagline": z.string().describe("Override tagline.").optional() }).catchall(z.any()).describe("Inline override for brand-kit fields normally resolved from `/.well-known/brand.json` on `domain` (logo, colors, voice, tagline). Use when brand.json is missing, stale, or inappropriate for this specific call \u2014 e.g., a campaign-scoped tagline, a co-branded creative, a freshly-rebranded color palette the brand.json hasn't shipped yet. Same inline-override pattern as `industries` and `data_subject_contestation` above: brand.json is canonical, the override is per-call. Adopters needing to override fields outside this subset (`voice_attributes`, `prohibited_terms`, etc.) MUST publish a different brand.json and reference it via a different `domain` \u2014 the inline override is intentionally narrow to a small high-traffic subset.\n\n**Merge semantics (normative).** The merge is **field-level**, not whole-object replacement. Each field within `brand_kit_override` (`logo`, `colors`, `voice`, `tagline`) is evaluated independently \u2014 when a field is present on the override the override value applies; when a field is absent the brand.json value applies (or is absent if brand.json doesn't carry one either). For composite fields (`colors.primary`, `colors.secondary`, `colors.accent`), the merge is one level deeper: each color slot is evaluated independently \u2014 a producer can override `colors.primary` while still inheriting `colors.secondary` from brand.json. SDKs MUST NOT treat a present `brand_kit_override.colors` as wiping the brand.json `colors` block entirely; only the per-slot fields present in the override take precedence. Without this rule, a partial-override semantics would diverge across SDKs and produce inconsistent rendering for the same payload.").optional() }).strict().describe("Vendor that produced these viewability values. Optional but RECOMMENDED so the row is self-describing \u2014 buyer agents reading delivery in isolation can attribute the numbers without joining back to `package.committed_metrics` or `package.performance_standards`. The vendor's `brand.json` `agents[type='measurement']` is the discovery anchor; the metric definitions live on the agent's `get_adcp_capabilities.measurement.metrics[]` block. Same shape as `vendor_metric_value.vendor` for symmetry across vendor-attested surfaces.").optional(), "measurable_impressions": z.number().gte(0).describe("Impressions where viewability could be measured. Excludes environments without measurement capability (e.g., non-Intersection Observer browsers, certain app environments). Coverage denominator for `viewable_rate`, `viewed_seconds`, and both viewed-seconds distributions \u2014 every duration statistic is computed over this same measurable population.").optional(), "viewable_impressions": z.number().gte(0).describe("Impressions that met the viewability threshold defined by the measurement standard.").optional(), "viewable_rate": z.number().gte(0).lte(1).describe("Viewable impression rate (viewable_impressions / measurable_impressions). Range 0.0 to 1.0.").optional(), "viewed_seconds": z.number().gte(0).describe("Average in-view duration per measurable impression, in seconds. Reporting-side counterpart to the `viewed_seconds` optimization metric in `optimization-goal.json`. Computed over `measurable_impressions`, not total impressions \u2014 the same denominator as `viewable_rate`. The viewability `standard` governs the threshold (e.g., MRC's 50% pixels for 1s display / 2s video) that defines when an impression is in view and therefore when the clock is running. Sellers reporting against a `viewed_seconds` optimization goal MUST populate this field.").optional(), "viewed_seconds_percentiles": z.object({ "p25": z.number().gte(0).describe("25th-percentile in-view duration in seconds."), "p50": z.number().gte(0).describe("Median (50th-percentile) in-view duration in seconds."), "p75": z.number().gte(0).describe("75th-percentile in-view duration in seconds."), "p90": z.number().gte(0).describe("90th-percentile in-view duration in seconds."), "p95": z.number().gte(0).describe("95th-percentile in-view duration in seconds.") }).strict().describe("Percentile summary of the per-impression in-view durations whose arithmetic mean is reported in `viewed_seconds`. This object MUST use the same reporting row, measurement vendor, viewability `standard`, and `measurable_impressions` population as `viewed_seconds`; sellers MUST omit it when `measurable_impressions` is zero. Percentiles use the nearest-rank definition: sort the N observed durations in ascending order and select rank `ceil(p \xD7 N)` (one-based) for percentile p. Values MUST be non-decreasing from p25 through p95. The structured metric identity `viewed_seconds_percentiles` makes this optional surface discoverable and requestable; it is not sortable and the nested object remains the canonical carrier.").optional(), "viewed_seconds_histogram": z.array(z.object({ "lower_bound_seconds": z.number().gte(0).describe("Inclusive lower bound of this duration bucket, in seconds."), "upper_bound_seconds": z.number().gte(0).describe("Exclusive upper bound of this duration bucket, in seconds. MUST be greater than `lower_bound_seconds`. Omit only on the final bucket to represent an unbounded upper range.").optional(), "impressions": z.number().int().gte(0).describe("Number of measurable impressions whose in-view duration falls in this bucket.") }).strict()).min(1).describe("Bucketed counts of the per-impression in-view durations whose arithmetic mean is reported in `viewed_seconds`. Buckets MUST be ordered by ascending lower bound, MUST NOT overlap, and MUST partition every impression in the same `measurable_impressions` population exactly once; therefore the sum of `impressions` MUST equal `measurable_impressions`. Buckets need not be contiguous: a gap between consecutive bucket boundaries is permitted when no impressions fall within that range \u2014 the sum constraint enforces this implicitly, and validators MUST NOT independently require contiguity. Each bucket is half-open `[lower_bound_seconds, upper_bound_seconds)`; only the final bucket MAY omit `upper_bound_seconds`, representing an unbounded upper range. Sellers choose boundaries, but buyers MUST combine histograms only when the complete boundary sequence, measurement vendor, and viewability `standard` match. The structured metric identity `viewed_seconds_histogram` makes this optional surface discoverable and requestable; it is not sortable and this nested array remains the canonical carrier.").optional(), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to these metrics. Governs the in-view threshold for `viewable_rate`, `viewed_seconds`, and both viewed-seconds distributions.").optional() }).catchall(z.any()).and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "viewed_seconds_percentiles": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "viewed_seconds_percentiles": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "measurable_impressions": z.number().int().gte(1).optional() }))]), z.union([z.any().refine((value) => !z.object({ "viewed_seconds_histogram": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "viewed_seconds_histogram": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "measurable_impressions": z.number().int().optional() }))])), z.intersection(z.union([z.any().refine((value) => !z.object({ "viewed_seconds_percentiles": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "viewed_seconds_percentiles": z.any().refine((value) => value !== void 0, "Required"), "viewed_seconds": z.any().refine((value) => value !== void 0, "Required"), "measurable_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "viewed_seconds_histogram": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "viewed_seconds_histogram": z.any().refine((value) => value !== void 0, "Required"), "viewed_seconds": z.any().refine((value) => value !== void 0, "Required"), "measurable_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Viewability metrics. Viewable rate should be calculated as viewable_impressions / measurable_impressions (not total impressions), since some environments cannot measure viewability. Includes `viewed_seconds` \u2014 average in-view duration \u2014 plus optional percentile and histogram distributions over that duration; all three use the same `measurable_impressions` population and are governed by the same viewability threshold (`standard`). Sellers SHOULD include `standard` whenever measured viewability values are reported because MRC and GroupM rows are not interchangeable. The numeric leaves are addressable via the leaf metric identities `viewable_rate`, `viewable_impressions`, `measurable_impressions`, and `viewed_seconds` for declaration, commitments, aggregates, and breakdown sorting. The structured distribution carriers require explicit `viewed_seconds_percentiles` and `viewed_seconds_histogram` identities for declaration, commitment, and selection; they are not numeric aggregate rows or sort keys. This object remains the canonical carrier of every value. When a buy reports under more than one standard, contract a specific standard via the `viewability_standard` qualifier on `committed_metrics`; when the package's `committed_metrics` carry a `viewability_standard` qualifier, sellers MUST populate `standard` on reported viewability objects so reconciliation can match the qualifier.").optional(), "engagements": z.number().gte(0).describe("Total engagements \u2014 direct interactions with the ad beyond viewing. Includes social reactions/comments/shares, story/unit opens, interactive overlay taps on CTV, companion banner interactions on audio. Platform-specific; corresponds to the 'engagements' optimization metric. Maps to DBCFM KPI_INTERACTIONS (Interaktionen) in the Reporting/Performance block.").optional(), "follows": z.number().gte(0).describe("New followers, page likes, artist/podcast/channel follows, or free channel/feed subscribes attributed to this delivery. Paid subscriptions are conversion events with `event_type: subscribe`, not `follows`.").optional(), "saves": z.number().gte(0).describe("Saves, bookmarks, playlist adds, pins attributed to this delivery.").optional(), "profile_visits": z.number().gte(0).describe("Visits to the brand's in-platform page (profile, artist page, channel, or storefront) attributed to this delivery. Does not include external website clicks.").optional(), "engagement_rate": z.number().gte(0).lte(1).describe("Platform-specific engagement rate (0.0 to 1.0). Typically engagements/impressions, but definition varies by platform.").optional(), "cost_per_click": z.number().gte(0).describe("Cost per click (spend / clicks)").optional(), "cost_per_completed_view": z.number().gte(0).describe("Cost per completed view (spend / completed_views). Primary CPCV pricing scalar for video/audio inventory; the package's `pricing_model` is `cpcv` when this field is the billing basis.").optional(), "cpm": z.number().gte(0).describe("Cost per thousand impressions, computed as (spend / impressions) \xD7 1000. Universal pricing scalar across CTV, display, mobile/web video, native, audio, and DOOH inventory; the package's `pricing_model` is `cpm` when this field is the billing basis. Field name aligns with the canonical `cpm` token in `enums/pricing-model.json` and `pricing-options/cpm-option.json` so buyers cross-walk pricing model \u2192 reported scalar without a translation table.").optional(), "downloads": z.number().gte(0).describe("Audio/podcast downloads (IAB Podcast Measurement Technical Guidelines 2.x methodology). Distinct from `views` \u2014 for podcast inventory this is the count of podcast episode downloads; for streaming audio it is the count of stream starts that meet the platform's download threshold. Prefer this over `views` for audio inventory.").optional(), "units_sold": z.number().gte(0).describe("Items sold attributed to this delivery. Retail-media scalar distinct from `conversions` \u2014 a single conversion (transaction) may carry multiple `units_sold`. Used by retail media platforms where the buyer optimizes against unit movement, not transaction count. Attribution lookback windows are platform-specific (commonly 7/14/30 days, view-through and click-through variants); sellers SHOULD declare the window via `reporting_capabilities.measurement_windows` or `measurement_terms` rather than encoding it in this scalar.").optional(), "new_to_brand_units": z.number().gte(0).describe("Units sold to first-time brand buyers (count, not rate). Retail-media scalar \u2014 the unit-volume parallel to the conversion-fraction `new_to_brand_rate`. Used by retail media platforms where new-customer acquisition unit volume is a primary KPI. Same attribution-window note as `units_sold` applies.").optional(), "by_action_source": z.array(z.object({ "action_source": z.enum(["website", "app", "offline", "phone_call", "chat", "email", "in_store", "system_generated", "other"]).describe("Where the conversion occurred"), "event_source_id": z.string().describe("Event source that produced these conversions (for disambiguation when multiple event sources are configured)").optional(), "count": z.number().gte(0).describe("Number of conversions from this action source"), "value": z.number().gte(0).describe("Total monetary value of conversions from this action source").optional() }).catchall(z.any())).describe("Conversion metrics broken down by action source (website, app, in_store, etc.). Useful for omnichannel sellers where conversions occur across digital and physical channels.").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 where /.well-known/brand.json is hosted, or the brand's operating domain"), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand identifier within the house portfolio. Optional for single-brand domains.").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 for a global/default identity. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account identity and is not delivery targeting.").optional(), "industries": z.array(z.string()).describe("Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json.").optional(), "data_subject_contestation": z.object({ "url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).optional(), "email": z.string().email().optional(), "languages": z.array(z.string()).optional() }).strict().and(z.union([z.object({ "url": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "email": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand \u2192 house \u2192 missing.").optional(), "brand_kit_override": z.object({ "logo": z.object({ "asset_type": z.literal("image").describe("Discriminator identifying this as an image asset. See /schemas/creative/asset-types for the registry."), "url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to the image asset"), "width": z.number().int().gte(1).describe("Width in pixels"), "height": z.number().int().gte(1).describe("Height in pixels"), "file_size_bytes": z.number().int().gte(1).describe("Image file size in bytes. Required by agents that advertise a max_file_size_kb constraint.").optional(), "pixel_ratio": z.number().gt(0).describe("Intrinsic pixels per logical render pixel (for example `2` for a 600\xD7500 image intended to render at 300\xD7250). Optional because a validator can infer the ratio when the target format declares logical dimensions. When supplied, it MUST agree with both `width / logical_width` and `height / logical_height`; it is never a substitute for the intrinsic `width` and `height` fields.").optional(), "state_id": z.string().describe("Binding used only when this image populates a `seller_rendered_stateful_display` `state_canvases` slot. It MUST match one declared `states[].state_id` (semantic validators resolve it). Omit for ordinary image slots.").optional(), "breakpoint_id": z.string().describe("Binding used only when this image populates a `seller_rendered_stateful_display` `state_canvases` slot. It MUST match one breakpoint declared on the selected state (semantic validators resolve it). Omit for ordinary image slots.").optional(), "focal_point": z.array(z.number().gte(0).lte(1)).min(2).max(2).describe("Normalized `[x, y]` coordinates (0\u20131 from top-left) of the image's visual anchor. Seller-side renderers crop toward the focal point when deriving renditions across breakpoints and aspect ratios; absent, cropping falls back to center-weighted defaults.").optional(), "format": z.string().describe("Image file format (jpg, png, gif, webp, etc.)").optional(), "alt_text": z.string().describe("Alternative text for accessibility").optional(), "provenance": z.object({ "digital_source_type": z.enum(["digital_capture", "digital_creation", "trained_algorithmic_media", "composite_with_trained_algorithmic_media", "algorithmic_media", "composite_capture", "composite_synthetic", "human_edits", "data_driven_media"]).describe("IPTC-aligned classification of AI involvement in producing this content").optional(), "synthetic_depiction": z.boolean().describe("Assessed declaration of whether the content synthetically depicts a real or fictional person performing or appearing in a way that was generated or materially manipulated rather than captured as depicted. `true` covers both a fully synthetic performer and material manipulation of a real performer; `false` is an assessed declaration that the content does not contain such a depiction. Absence means the content has not been assessed for synthetic depiction. This field does not claim consent, legality, or independent verification, and receivers MUST NOT derive it solely from `digital_source_type`.").optional(), "ai_tool": z.object({ "name": z.string().describe("Name of the AI tool or model (e.g., 'DALL-E 3', 'Stable Diffusion XL', 'Gemini')"), "version": z.string().describe("Version identifier for the AI tool or model (e.g., '25.1', '0125', '2.1'). For generative models, use the model version rather than the API version.").optional(), "provider": z.string().describe("Organization that provides the AI tool (e.g., 'OpenAI', 'Stability AI', 'Google')").optional() }).describe("AI system used to generate or modify this content. Aligns with IPTC 2025.1 AI metadata fields and C2PA claim_generator.").optional(), "human_oversight": z.enum(["none", "prompt_only", "selected", "edited", "directed"]).describe("Level of human involvement in the AI-assisted creation process. Independent of `disclosure.required` \u2014 the protocol does not derive disclosure obligations from oversight level. Some regulations include carve-outs for human-edited or human-directed AI output, but those carve-outs have factual prerequisites the schema cannot evaluate. Asserting `edited` or `directed` does not by itself justify `disclosure.required: false`.").optional(), "declared_by": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent or service that declared this provenance").optional(), "role": z.enum(["creator", "advertiser", "agency", "platform", "tool"]).describe("Role of the declaring party in the supply chain") }).describe("Party declaring this provenance. Identifies who attached the provenance claim, enabling receiving parties to assess trust.").optional(), "declared_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "created_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "c2pa": z.object({ "manifest_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to the C2PA manifest store for this content") }).describe("C2PA sidecar manifest reference. Links to a detached cryptographic provenance manifest for this content. Note: file-level C2PA bindings break when ad servers transcode, resize, or re-encode assets. For pipelines with intermediaries, consider embedded_provenance as the primary provenance mechanism.").optional(), "embedded_provenance": z.array(z.object({ "method": z.enum(["manifest_wrapper", "provenance_markers"]).describe("How provenance data is carried within the content"), "standard": z.string().describe("Standard the embedding conforms to, if any (e.g., 'c2pa' for C2PA Section A.7 text manifest embedding)").optional(), "provider": z.string().describe("Organization that performed the embedding (e.g., 'Encypher', 'Digimarc'). Display label and audit context \u2014 not a wire identifier."), "verify_agent": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("URL of the governance agent the buyer represents was used to embed/verify this layer. MUST use the `https://` scheme and MUST appear in the seller's `creative_policy.accepted_verifiers[].agent_url` list (canonicalized per /docs/reference/url-canonicalization: lowercase scheme and host, strip default port, normalize path dot-segments). Sellers MUST NOT call this URL until the canonicalized match is confirmed."), "feature_id": z.string().describe("Optional `feature_id` the buyer represents the seller should request via `get_creative_features` (e.g., `encypher.markers_present_v2`). SHOULD match the `feature_id` declared on the matching `accepted_verifiers[]` entry, or be omitted to defer the selector to the seller. When the seller's entry pins a `feature_id`, that value wins; when neither side pins, the seller selects from the agent's `governance.creative_features` catalog.").optional() }).strict().describe("Buyer's representation that this embedding can be verified by a governance agent on the seller's `creative_policy.accepted_verifiers` list. The `agent_url` MUST match (canonicalized) one of the seller's published `accepted_verifiers[].agent_url` entries; sellers reject `sync_creatives` submissions whose `verify_agent.agent_url` is off-list with `PROVENANCE_VERIFIER_NOT_ACCEPTED`. This is buyer-supplied evidence, not buyer-driven routing \u2014 the seller is the verifier-of-record and the seller controls which agent it actually calls (the seller MAY use a different on-list agent if it determines this is more appropriate; the seller does not call buyer-asserted endpoints outside its allowlist). MAY be omitted for self-verifiable embeddings (e.g., a C2PA text manifest with a public key the seller already trusts).").optional(), "embedded_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() })).min(1).describe("Provenance metadata embedded within the content stream. Each entry declares one embedding layer: structured provenance data carried inside the content itself, as distinct from sidecar references (c2pa.manifest_url). Embedded provenance survives operations that break sidecar and file-level bindings: ad-server transcoding, CMS ingestion, copy-paste, reformatting, and CDN re-encoding. For ad-tech pipelines where content passes through multiple intermediaries, embedded provenance is the reliable path for provenance that persists from declaration through delivery. This is a declaration by the embedding party. The receiving party (the seller) is the verifier-of-record: it confirms the claim by calling a governance agent it trusts (typically one published in `creative_policy.accepted_verifiers`).").optional(), "watermarks": z.array(z.object({ "media_type": z.enum(["audio", "image", "video", "text"]).describe("Media category of the watermarked content"), "provider": z.string().describe("Organization that applied the watermark (e.g., 'Imatag', 'Steg.AI', 'Encypher'). Display label and audit context \u2014 not a wire identifier."), "verify_agent": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("URL of the governance agent the buyer represents was used to apply/detect this watermark. MUST use the `https://` scheme and MUST appear in the seller's `creative_policy.accepted_verifiers[].agent_url` list (canonicalized per /docs/reference/url-canonicalization: lowercase scheme and host, strip default port, normalize path dot-segments). Sellers MUST NOT call this URL until the canonicalized match is confirmed."), "feature_id": z.string().describe("Optional `feature_id` the buyer represents the seller should request via `get_creative_features` (e.g., `imatag.watermark_detected`). SHOULD match the `feature_id` declared on the matching `accepted_verifiers[]` entry, or be omitted to defer the selector to the seller. When the seller's entry pins a `feature_id`, that value wins; when neither side pins, the seller selects from the agent's `governance.creative_features` catalog.").optional() }).strict().describe("Buyer's representation that this watermark can be detected by a governance agent on the seller's `creative_policy.accepted_verifiers` list. The `agent_url` MUST match (canonicalized) one of the seller's published `accepted_verifiers[].agent_url` entries; sellers reject `sync_creatives` submissions whose `verify_agent.agent_url` is off-list with `PROVENANCE_VERIFIER_NOT_ACCEPTED`. This is buyer-supplied evidence, not buyer-driven routing \u2014 the seller is the verifier-of-record and the seller controls which agent it actually calls (the seller MAY use a different on-list agent if it determines this is more appropriate; the seller does not call buyer-asserted endpoints outside its allowlist).").optional(), "c2pa_action": z.enum(["c2pa.watermarked.bound", "c2pa.watermarked.unbound"]).describe("C2PA action classification for this watermark").optional(), "embedded_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() })).min(1).describe("Content watermarks applied to this asset. Each entry declares one watermarking layer: a content modification that encodes an identifier or fingerprint within the asset. Watermarks differ from embedded provenance: a watermark encodes an identifier (who generated it, who owns it), while embedded provenance carries or references a structured provenance record (the full chain of custody). A single asset may carry both. Aligns with C2PA action taxonomy: c2pa.watermarked.bound (watermark linked to a C2PA manifest) and c2pa.watermarked.unbound (watermark independent of any manifest). This is a declaration by the watermarking party. The receiving party (the seller) is the verifier-of-record: it confirms the claim by calling a governance agent it trusts (typically one published in `creative_policy.accepted_verifiers`).").optional(), "disclosure": z.object({ "required": z.boolean().describe("The declaring party's claim that AI disclosure is required for this content under applicable regulations. This is a declared signal carried through the supply chain \u2014 useful as a routing and audit input \u2014 not a regulatory determination made by the protocol. Receiving parties remain responsible for their own jurisdictional analysis and should not treat `required: false` as compliance cover."), "jurisdictions": z.array(z.object({ "country": z.string().describe("ISO 3166-1 alpha-2 country code (e.g., 'US', 'DE', 'CN')"), "region": z.string().describe("Sub-national region code (e.g., 'CA' for California, 'BY' for Bavaria)").optional(), "regulation": z.string().describe("Regulation identifier (e.g., 'eu_ai_act_article_50', 'ca_sb_942', 'cn_deep_synthesis')"), "label_text": z.string().describe("Required disclosure label text for this jurisdiction, in the local language").optional(), "render_guidance": z.object({ "persistence": z.enum(["continuous", "initial", "flexible"]).describe("How long the disclosure must persist during content playback or display").optional(), "min_duration_ms": z.number().int().gte(1).describe("Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available.").optional(), "positions": z.array(z.enum(["prominent", "footer", "audio", "subtitle", "overlay", "end_card", "pre_roll", "companion"]).describe("Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Preferred disclosure positions in priority order. The first position a format supports should be used.").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() }).describe("How the disclosure should be rendered for this jurisdiction. Expresses the declaring party's intent for persistence and position based on regulatory requirements. Publishers control actual rendering but governance agents can audit whether guidance was followed.").refine((value) => Object.keys(value).length >= 1, "Object must contain at least 1 property").optional() })).min(1).describe("Jurisdictions where disclosure obligations apply").optional() }).describe("Regulatory disclosure requirements for this content. Indicates whether AI disclosure is required and under which jurisdictions.").optional(), "verification": z.array(z.object({ "verified_by": z.string().describe("Name of the verification service (e.g., 'DoubleVerify', 'Hive Moderation', 'Reality Defender')"), "verified_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "result": z.enum(["authentic", "ai_generated", "ai_modified", "inconclusive"]).describe("Verification outcome"), "confidence": z.number().gte(0).lte(1).describe("Confidence score of the verification result (0.0 to 1.0)").optional(), "details_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to the full verification report").optional() })).min(1).describe("Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.").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() }).describe("Provenance metadata for this asset, overrides manifest-level provenance").optional() }).catchall(z.any()).describe("Override logo asset.").optional(), "colors": z.object({ "primary": z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional(), "secondary": z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional(), "accent": z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional() }).catchall(z.any()).describe("Override brand colors (hex strings).").optional(), "voice": z.string().describe("Override brand-voice description for surface-composed text/audio output.").optional(), "tagline": z.string().describe("Override tagline.").optional() }).catchall(z.any()).describe("Inline override for brand-kit fields normally resolved from `/.well-known/brand.json` on `domain` (logo, colors, voice, tagline). Use when brand.json is missing, stale, or inappropriate for this specific call \u2014 e.g., a campaign-scoped tagline, a co-branded creative, a freshly-rebranded color palette the brand.json hasn't shipped yet. Same inline-override pattern as `industries` and `data_subject_contestation` above: brand.json is canonical, the override is per-call. Adopters needing to override fields outside this subset (`voice_attributes`, `prohibited_terms`, etc.) MUST publish a different brand.json and reference it via a different `domain` \u2014 the inline override is intentionally narrow to a small high-traffic subset.\n\n**Merge semantics (normative).** The merge is **field-level**, not whole-object replacement. Each field within `brand_kit_override` (`logo`, `colors`, `voice`, `tagline`) is evaluated independently \u2014 when a field is present on the override the override value applies; when a field is absent the brand.json value applies (or is absent if brand.json doesn't carry one either). For composite fields (`colors.primary`, `colors.secondary`, `colors.accent`), the merge is one level deeper: each color slot is evaluated independently \u2014 a producer can override `colors.primary` while still inheriting `colors.secondary` from brand.json. SDKs MUST NOT treat a present `brand_kit_override.colors` as wiping the brand.json `colors` block entirely; only the per-slot fields present in the override take precedence. Without this rule, a partial-override semantics would diverge across SDKs and produce inconsistent rendering for the same payload.").optional() }).strict().describe("Vendor that produced this value. Matches a `vendor_metrics[].vendor` declaration on the product."), "metric_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).min(1).max(64).describe("Identifier for the metric within the vendor's vocabulary. Matches a `vendor_metrics[].metric_id` declaration on the product."), "value": z.number().describe("The reported value. Unit semantics are vendor-defined \u2014 see `unit` field below and the vendor's `brand.json` measurement-agent documentation."), "unit": z.string().describe("Unit of the value. Free-form to accommodate the heterogeneity of vendor metrics (e.g., `score`, `seconds`, `persons`, `gCO2e`, `USD`, `lift_percent`). When the value is monetary, use the ISO 4217 code (e.g., `USD`, `EUR`); for non-monetary, use whatever the vendor publishes. Optional on every row \u2014 the canonical unit lives at the vendor's measurement-agent metric definition (`brand.json` `agents[type='measurement']`). When sellers populate it inline they SHOULD match the vendor's published unit; buyers MAY resolve from the vendor's measurement agent when this field is absent.").optional(), "measurable_impressions": z.number().gte(0).describe("Number of impressions in this reporting period that the vendor was able to measure. Coverage denominator \u2014 buyers compute coverage rate as `measurable_impressions / impressions`. When absent, coverage is unspecified \u2014 buyers MUST NOT compute a coverage rate or assume full coverage. When the vendor measured zero impressions but is integrated, set to 0 explicitly. When the entry is omitted from `vendor_metric_values` entirely, the buyer infers no measurement happened (no integration). This pattern parallels `viewability.measurable_impressions` (`delivery-metrics.json#/properties/viewability`), which has handled vendor coverage in the IAS/DV/MRC ecosystem for over a decade \u2014 same convention: absence is unknown, not full. For channels where the atomic observation unit is a play or screen-second rather than an impression (DOOH, cinema, place-based), report `measurable_plays` or `measurable_play_seconds` instead \u2014 `impressions` there is itself a modelled figure (`plays \xD7 audience multiplier`), so `measurable_impressions / impressions` divides a measured count by a model output and has no interpretation.").optional(), "measurable_plays": z.number().gte(0).describe("Number of plays (loop plays / spots aired) in this reporting period that the vendor was able to measure. Coverage denominator for channels where a play, not an impression, is the atomic observation unit \u2014 DOOH, cinema, place-based audio. Buyers compute coverage as `measurable_plays / plays` (top-level `plays` on `delivery-metrics.json`). Same absence semantics as `measurable_impressions`: absent means coverage is unspecified and buyers MUST NOT compute a rate; 0 means the vendor is integrated but measured nothing. A row SHOULD carry exactly one coverage denominator \u2014 the one matching the unit the vendor actually observes.").optional(), "measurable_play_seconds": z.number().gte(0).describe("Play-seconds \u2014 seconds of creative playout summed across endpoints (screens, speakers, players) \u2014 in this reporting period that the vendor was able to measure. Medium-neutral on purpose: place-based audio has plays and duration but no screen. Coverage denominator when the vendor meters exposure duration rather than discrete plays. On screen networks buyers compute coverage as `measurable_play_seconds / dooh_metrics.screen_time_seconds`; on other place-based media, against the seller's reported playout seconds for the period. Same absence semantics as `measurable_impressions`.").optional(), "vendor_relationship": z.enum(["first_party", "affiliated", "third_party"]).describe("Optional echo of the product's `reporting_capabilities.vendor_metrics[].vendor_relationship` for this `(vendor, metric_id)`, so the delivery row is self-describing without joining back to the product (same reasoning as `viewability.vendor`). When present it MUST equal the declared value; buyers MAY resolve from the product declaration when absent. Absence on the row is *undeclared*, never `third_party`. A relationship disposition, not a trust ranking. Deliberately not a `qualifier` key: the relationship is constant across every row for a (seller, vendor) pair and does not partition rows, so it stays out of the `(vendor, metric_id, qualifier)` reconciliation join.").optional(), "qualifier": z.object({ "viewability_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(), "completion_source": z.enum(["seller_attested", "vendor_attested"]).describe("Trust-source disambiguator for `completion_rate` \u2014 *who* attested to the completion event, not *how* (methodology granularity is a separate dimension; future qualifier keys may add it if buyer demand surfaces). The two paths can yield materially different rates, particularly in SSAI environments where the player's view of completion may differ from a vendor's. Used as a `qualifier.completion_source` key on `committed_metrics`, `missing_metrics`, and package-level delivery values (`metric_values` or `vendor_metric_values`) to disambiguate which trust source the row represents. Edge cases: walled gardens where the seller is also the measurement vendor (YouTube, Spotify) collapse to `seller_attested` by trust-model logic \u2014 the same party served and counted. IAB-certified first-party podcast measurement (Podtrac, Triton on their own platforms; Art19 on its own platform) likewise collapses to `seller_attested`. The same vendor's offering on a third-party platform (Podtrac on a publisher who isn't Podtrac) is `vendor_attested`. The trust axis is *not* who runs the SDK \u2014 it's who is independent of the seller's revenue interest.").optional(), "attribution_methodology": z.enum(["deterministic_purchase", "probabilistic", "panel_based", "modeled"]).describe("How attribution between ad exposure and outcome events was computed. Used as a `qualifier.attribution_methodology` key on `committed_metrics`, `missing_metrics`, package-level delivery values (`metric_values` or `vendor_metric_values`), and `performance-feedback.metric` to disambiguate the same outcome metric reported under different methodologies \u2014 `conversion_value` measured deterministically (matched purchase IDs) is not the same number as `conversion_value` measured probabilistically (modeled match) and should never be summed across methodologies. The retail-media closed-loop pattern typically reports under `deterministic_purchase`; MMM and clean-room outputs typically report under `modeled` or `probabilistic`; panel-based measurement (Nielsen, comScore, Edison) reports under `panel_based`.").optional(), "attribution_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.").optional(), "lift_dimension": z.enum(["awareness", "consideration", "favorability", "purchase_intent", "ad_recall"]).describe("Brand-lift dimension disambiguator. Brand lift is multidimensional in production \u2014 Kantar, Upwave, Cint, DoubleVerify, and similar vendors report awareness, consideration, favorability, purchase intent, and ad recall as separate measurements with their own sample sizes and confidence intervals. Used as a `qualifier.lift_dimension` key on `committed_metrics`, `missing_metrics`, package-level delivery values (`metric_values` or `vendor_metric_values`), and `performance-feedback.metric` to disambiguate which dimension of `brand_lift` a row represents. Two `brand_lift` rows under different lift dimensions represent different surveyed outcomes and must not be combined into a single number.").optional() }).strict().describe("Optional qualifier disambiguating this row from sibling rows for the same (vendor, metric_id) \u2014 e.g., the same vendor outcome metric reported under 7-day and 30-day attribution windows. Same closed key set as `committed-metric`. When the matching `committed_metrics` entry carries a qualifier, this row MUST carry the identical qualifier so reconciliation joins on `(vendor, metric_id, qualifier)`.").optional(), "breakdown": z.record(z.string(), z.any()).describe("Optional structured payload for vendor metrics that don't fit a single scalar \u2014 panel demographic breakouts, co-view audience composition, incremental reach + frequency + lift decompositions. Free-form; the keys and value semantics are defined by the vendor (see the vendor's `brand.json` measurement-agent docs). Buyers MUST treat this object as opaque without consulting the vendor's documentation. Vendors place any fields beyond the standard envelope (e.g., confidence intervals, panel sizes) inside this object rather than at the top level.").optional() }).strict().describe("A reported value for a vendor-defined metric, emitted in `delivery-metrics.json` `vendor_metric_values` parallel to standard scalars. Identifies the vendor (BrandRef), the metric name within that vendor's vocabulary, the value, and the coverage denominator (`measurable_impressions`) \u2014 vendor measurement is rarely 100% coverage. Channels whose atomic observation unit is a play or screen-second rather than an impression (DOOH, cinema, place-based) use the sibling denominators `measurable_plays` / `measurable_play_seconds`. `vendor_relationship` optionally echoes the seller's declared relationship to the vendor (`first_party` / `affiliated` / `third_party`) so a row is self-describing without a discovery hop. The `breakdown` slot accommodates vendors that emit structured payloads beyond a single scalar (panel demographic breakouts, co-view ratios, incremental decompositions). To add fields beyond what this schema defines, vendors place them inside `breakdown` rather than alongside the standard envelope.")).describe("Reported values for vendor-defined metrics that the product's `reporting_capabilities.vendor_metrics` declared. Each entry carries the vendor (BrandRef), the metric identifier within the vendor's vocabulary, the value, optional unit, and `measurable_impressions` as the coverage denominator \u2014 vendor measurement is rarely 100% of delivered impressions, since vendors only score impressions where their SDK fires or their panel matches. When a declared vendor metric is omitted from this array, buyers infer no measurement happened (no integration). One row per `(vendor.domain, vendor.brand_id, metric_id, qualifier)` per reporting period \u2014 the same vendor metric MAY appear in multiple rows only when each carries a distinct qualifier (e.g., 7-day and 30-day attribution windows); sellers MUST de-duplicate before emission and MUST NOT emit two rows with the same tuple; buyers MAY treat duplicate rows as a seller-side conformance bug. The structured `vendor_metric_values` array is the recommended path for vendor metrics; `additionalProperties: true` on this parent object is preserved so existing free-form vendor emissions remain conformant during migration.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "reach": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "reach": z.any().refine((value) => value !== void 0, "Required"), "reach_unit": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Standard delivery metrics that can be reported at media buy, package, or creative level"), z.object({ "package_id": z.string().optional(), "pacing_index": z.number().gte(0).describe("Subordinate package pacing diagnostic. May be absent for seller-optimized packages without package-level pacing.").optional(), "pricing_model": z.enum(["cpm", "vcpm", "cpc", "cpcv", "cpv", "cpp", "cpa", "revenue_share", "flat_rate", "time"]).describe("Supported pricing models for advertising products").optional(), "rate": z.number().gte(0).optional(), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")).describe("ISO 4217 currency code for this package's spend and currency-denominated pricing rate. The rate for revenue_share is a dimensionless commission fraction, but attributed monetary values still use this currency. When the enclosing media_buy_deliveries[].currency is present, this value MUST equal it. For AdCP-authored buys both values MUST equal the media-buy currency. A different package currency is permitted only for a legacy or externally created mixed-currency buy whose row currency and row-level monetary totals are omitted. When both row and deprecated response-wide currency are absent, a package with monetary values MUST include this field. AdCP does not perform currency conversion.").optional(), "delivery_status": z.enum(["delivering", "not_delivering", "completed", "budget_exhausted", "flight_ended", "goal_met"]).describe("System-reported operational state of this package. Reflects actual delivery state independent of buyer pause control. 'not_delivering' means zero impressions were recorded for the entire reporting_period while the package was in-flight. Sellers SHOULD only report 'not_delivering' once the package's data is_final for the period \u2014 a provisional (is_final: false) zero may still be measurement catching up, not genuine non-delivery.").optional(), "paused": z.boolean().optional(), "is_final": z.boolean().optional(), "finalized_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "measurement_window": z.string().max(50).optional(), "supersedes_window": z.string().max(50).optional(), "metric_values": z.array(z.intersection(z.object({ "scope": z.literal("standard").describe("Standard metric from the closed `available-metric.json` enum."), "metric_id": z.intersection(z.enum(["impressions", "spend", "clicks", "ctr", "views", "completed_views", "completion_rate", "conversions", "conversion_value", "commissionable_value", "roas", "cost_per_acquisition", "new_to_brand_rate", "leads", "reach", "frequency", "grps", "engagements", "engagement_rate", "follows", "saves", "profile_visits", "viewability", "viewable_rate", "viewable_impressions", "measurable_impressions", "viewed_seconds", "viewed_seconds_percentiles", "viewed_seconds_histogram", "quartile_data", "quartile_25", "quartile_50", "quartile_75", "quartile_100", "time_based_views", "dooh_metrics", "ooh_metrics", "cost_per_click", "cost_per_completed_view", "cpm", "downloads", "units_sold", "new_to_brand_units", "plays", "incremental_sales_lift", "brand_lift", "foot_traffic", "conversion_lift", "brand_search_lift"]).describe("Standard delivery and performance metrics available for reporting. Most values name flat numeric fields of `core/delivery-metrics.json`. Leaf identities address a single numeric value nested inside an object-shaped metric so it can be declared, committed, aggregated, and sorted individually: `quartile_25`/`quartile_50`/`quartile_75`/`quartile_100` resolve to `quartile_data.q1_views`\u2013`q4_views`, and `viewable_rate`/`viewable_impressions`/`measurable_impressions`/`viewed_seconds` resolve to the same-named fields of `viewability`. Structured nested identities `viewed_seconds_percentiles` and `viewed_seconds_histogram` make the corresponding optional distribution carriers discoverable, committable, and requestable, but not aggregatable or sortable. The nested object or array remains the canonical carrier \u2014 nested identities never introduce duplicate flat response fields. Container tokens such as `viewability`, `quartile_data`, `dooh_metrics`, and `time_based_views` declare their documented nested surface. **Container subsumption applies only to numeric leaves**: `viewability` subsumes `viewable_rate`, `viewable_impressions`, `measurable_impressions`, and `viewed_seconds`; `quartile_data` subsumes `quartile_25`, `quartile_50`, `quartile_75`, and `quartile_100`. This rule applies to capability declaration, `required_metrics` filtering, format `reported_metrics` intersection, and `requested_metrics` selection. Optional structured identities MUST be declared explicitly: `viewability` alone does not satisfy `viewed_seconds_percentiles` or `viewed_seconds_histogram`. Requesting any nested identity selects its canonical carrier in the response. A nested identity declaration does not imply sibling values or the carrier's non-metric fields."), z.any().refine((value) => !z.enum(["viewability", "viewed_seconds_percentiles", "viewed_seconds_histogram", "quartile_data", "time_based_views", "dooh_metrics"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema")).describe("Identifier for a scalar standard metric. Container tokens and structured distribution identities are committed and selected through their canonical carriers, not represented as numeric aggregate rows."), "qualifier": z.object({ "viewability_standard": z.enum(["mrc", "groupm"]).describe("Viewability standard under which this row was measured. MRC and GroupM define materially different thresholds; never sum across standards.").optional(), "completion_source": z.enum(["seller_attested", "vendor_attested"]).describe("Source of `completion_rate` attestation for this row \u2014 `seller_attested` from player/ad server, `vendor_attested` from a third-party measurement vendor. The two paths can yield different rates; never sum across sources.").optional(), "attribution_methodology": z.enum(["deterministic_purchase", "probabilistic", "panel_based", "modeled"]).describe("Attribution methodology under which this outcome row was computed (`deterministic_purchase`, `probabilistic`, `panel_based`, `modeled`). Outcome metrics measured under different methodologies represent materially different numbers; never sum across methodologies.").optional(), "attribution_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("Attribution window for this outcome row. Object-valued duration (`{interval, unit}`), not a shorthand string. Outcome metrics measured over different windows represent the same metric over different time periods; the partition keeps them as separate rows so buyers don't accidentally aggregate.").optional(), "lift_dimension": z.enum(["awareness", "consideration", "favorability", "purchase_intent", "ad_recall"]).describe("Brand-lift dimension this row represents (awareness, consideration, favorability, purchase intent, or ad recall). Required when `metric_id` is `brand_lift`. Each dimension is a separate surveyed outcome with its own sample size and confidence interval; never sum across dimensions.").optional() }).strict().describe("Qualifier keys disambiguating this row from sibling rows under the same `metric_id`. Symmetric with `committed_metrics.qualifier` today; expected to diverge in future minors as transparency disclosures buyers don't commit to ship delivery-only. Closed (`additionalProperties: false`) \u2014 new qualifier keys ship explicitly.").optional(), "value": z.number().describe("Aggregated metric value for this `(metric_id, qualifier)` partition. Heterogeneous by `metric_id` \u2014 rate metrics (`viewable_rate`, `completion_rate`) are 0.0\u20131.0; cost-per metrics (`cost_per_acquisition`, `cost_per_completed_view`) are currency amounts; count metrics (`impressions`, `clicks`) are non-negative integers as numbers; ratio metrics (`roas`) are non-negative numbers. Buyer agents MUST inspect `metric_id` before doing arithmetic \u2014 same dispatch convention as `committed_metrics`."), "measurable_impressions": z.number().gte(0).describe("Coverage denominator for verification metrics (e.g., `viewable_rate`). Buyers compute coverage as `measurable_impressions / impressions` from the partition.").optional(), "viewable_impressions": z.number().gte(0).describe("Component for `viewable_rate` (numerator).").optional(), "impressions": z.number().gte(0).describe("Component for rate metrics whose denominator is total impressions (e.g., `completion_rate`, `engagement_rate`).").optional(), "completed_views": z.number().gte(0).describe("Component for `completion_rate` (numerator).").optional(), "spend": z.number().gte(0).describe("Component for cost-per metrics (denominator-ish; the cost half of the ratio).").optional(), "conversions": z.number().gte(0).describe("Component for `cost_per_acquisition` and ROAS-family metrics.").optional(), "conversion_value": z.number().gte(0).describe("Component for `roas` (numerator).").optional(), "clicks": z.number().gte(0).describe("Component for `cost_per_click` and click-rate metrics.").optional() }).strict().and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "metric_id": z.literal("viewable_rate").optional() }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "metric_id": z.literal("viewable_rate").optional() }), z.object({ "measurable_impressions": z.any().refine((value) => value !== void 0, "Required"), "viewable_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough())]), z.union([z.any().refine((value) => !z.object({ "metric_id": z.literal("completion_rate").optional() }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "metric_id": z.literal("completion_rate").optional() }), z.object({ "impressions": z.any().refine((value) => value !== void 0, "Required"), "completed_views": z.any().refine((value) => value !== void 0, "Required") }).passthrough())])), z.intersection(z.union([z.any().refine((value) => !z.object({ "metric_id": z.literal("cost_per_acquisition").optional() }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "metric_id": z.literal("cost_per_acquisition").optional() }), z.object({ "spend": z.any().refine((value) => value !== void 0, "Required"), "conversions": z.any().refine((value) => value !== void 0, "Required") }).passthrough())]), z.union([z.any().refine((value) => !z.object({ "metric_id": z.literal("roas").optional() }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "metric_id": z.literal("roas").optional() }), z.object({ "spend": z.any().refine((value) => value !== void 0, "Required"), "conversion_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough())])))), z.object({ "qualifier": z.any().refine((value) => Object.keys(value).length >= 1, "Object must contain at least 1 property") })).describe("A qualified standard delivery value reported at package grain. The qualifier is required and must be non-empty; unqualified spend remains on the package's flat spend field.")).describe("Qualified standard delivery values for this package. Each entry is the delivered counterpart to a standard-scope package.committed_metrics or by_package[].missing_metrics row, using the same atomic key (scope, metric_id, qualifier). Sellers report one row per full qualifier set at package grain; when a metric appears here, its flat scalar counterpart on the package MUST be omitted to avoid two sources of truth. Vendor-scope values continue to use vendor_metric_values. Buyers reconcile rows directly and perform any compatible cross-package aggregation themselves.").optional() }).catchall(z.any()))).describe("Metrics broken down by package.") }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "currency": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "currency": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "totals": z.object({ "spend": z.any().refine((value) => value !== void 0, "Required") }).passthrough().optional() }))]).describe("Must also satisfy at least one of these alternatives."))).describe("Delivery rows for one or more media buys included in this notification."), "errors": z.array(z.object({ "code": z.string().min(1).max(64).describe("Error code for programmatic handling. The error-code vocabulary is open: `error.code` is wire-typed `string` (not a closed enum), the standard codes published in `enums/error-code.json` are documentary, and senders MAY emit codes outside that set (platform-specific codes, or codes introduced in a later AdCP version). Receivers MUST decode unknown codes \u2014 treat the response as well-formed, read `error.recovery` for the recovery classification, and fall back to `transient` when `recovery` is absent. See `error-handling.mdx#forward-compatible-decoding-normative` for the full forward-compat contract \u2014 this rule is what lets future maintenance lines ship new codes additively."), "message": z.string().describe("Human-readable error message"), "buyer_reason": z.object({ "code": z.string().min(1).max(64).describe("Machine-readable buyer-actionable reason from the standard `enums/error-code.json` vocabulary or a producer-specific extension. Extensions MUST follow the standard `X_{VENDOR}_{CODE}` naming rule. The wire field is open for forward compatibility. Receivers MUST accept unknown values and use the enclosing `error.recovery` plus this object's `message` as the fallback."), "message": z.string().min(1).describe("Buyer-safe explanation of the actionable failure. MUST NOT expose vendor identifiers, ad-server type names, internal object names, internal IDs, stack traces, or other producer-private implementation details.") }).catchall(z.any()).describe("Optional buyer-actionable classification of the failure. Use this when the enclosing error code or message is too coarse or contains producer-internal context that must not cross the buyer trust boundary. `code` reuses the comprehensive standard vocabulary and recovery classifications published in `enums/error-code.json`, including policy, governance, account, commercial, inventory, and creative failures. The wire field remains open for forward compatibility. `message` MUST be safe to show to the buyer and MUST NOT contain vendor identifiers, ad-server type names, internal object names, internal IDs, stack traces, or other producer-private implementation details. When present, the enclosing `error.recovery` MUST classify the buyer-actionable reason. If both the enclosing code and buyer reason are registered, their standard recovery classifications MUST agree with each other and with `error.recovery`; sellers MUST choose the closest compatible enclosing code rather than retain a conflicting upstream transport wrapper. One buyer_reason classifies one error object. If a rejection contains independently actionable failures from different classes, sellers MUST emit separate error objects or omit buyer_reason rather than select a misleading single class.").optional(), "field": z.string().describe("Field path associated with the error in JSONPath-lite format (e.g., 'packages[0].targeting'). When `issues[]` is also present, sellers MUST set this to `issues[0].pointer` translated from RFC 6901 to JSONPath-lite (e.g., '/packages/0/targeting' \u2192 'packages[0].targeting') so pre-3.1 consumers reading `field` only get deterministic behavior. Will be deprecated in a future major version in favor of `issues[].pointer`.").optional(), "suggestion": z.string().describe("Suggested fix for the error").optional(), "retry_after": z.number().gte(1).lte(3600).describe("Seconds to wait before retrying the operation. AdCP 3.2 producers MUST emit an integer from 1 through 3600. The 3.x schema continues to accept finite fractional values for backward compatibility with earlier producers; consumers receiving one MUST round up to the next whole second before clamping so the retry is never scheduled earlier than intended. Non-finite values are treated as absent.").optional(), "issues": z.array(z.object({ "pointer": z.string().describe("RFC 6901 JSON Pointer to the offending field in the request payload (e.g., '/packages/0/targeting/geo_countries/2'). Format chosen to match Ajv's native validation output (`instancePath`); standardized and unambiguous on keys containing `/` or `~`. NOTE: this differs from the legacy top-level `field` which uses JSONPath-lite (`packages[0].targeting.geo_countries[2]`). When sellers populate `field` from `issues[0].pointer` for backward compatibility (see `field` description), they MUST translate the format \u2014 `/packages/0/x` \u2192 `packages[0].x`. Future major versions will deprecate `field` in favor of `issues[].pointer`."), "message": z.string().describe("Human-readable description of why this specific field was rejected."), "keyword": z.string().describe("Schema keyword that rejected the payload, drawn from the JSON Schema vocabulary (e.g., 'required', 'type', 'format', 'enum', 'pattern', 'minimum', 'maxLength'). Matches the keyword names emitted by JSON Schema validators (Ajv, jsonschema, etc.) so agents can pattern-match on rejection class without parsing message text. Implementers SHOULD use the validator's native keyword name; do not invent custom values here."), "schemaPath": z.string().describe("Optional. JSON Schema tree path of the rejecting keyword (e.g. '#/properties/packages/items/oneOf/1'). 3.1+ consumers SHOULD prefer `schema_id`; `schemaPath` is retained for 3.0.x compatibility (renamed to `schema_path` in a future major). See error-handling.mdx for the validator-internals production-emit rules.").optional(), "schema_id": z.string().describe("Optional. `$id` of the rejecting (sub-)schema (e.g. `/schemas/3.1.0/core/activation-key.json`). MUST resolve to a `$id` published in the spec at the version the seller advertises via `get_adcp_capabilities` \u2014 either a deep sub-schema (the typical case) or the response-root `$id` (the bundled-tree fallback for tools served from bundles built before #3868). Sellers MUST NOT emit when the rejection occurred against a private extension, server-only sub-schema, or pre-release element \u2014 the public-spec replay rationale only holds when the rejecting element is reachable from the public bundle. Sellers populating `schemaPath` SHOULD also populate `schema_id` when they have it so 3.1+ readers don't get strictly less than 3.0.x readers. See error-handling.mdx for resolution guidance and the bundled-tree caveat.").optional() }).catchall(z.any())).describe("Structured list of validation failures. Primary use is `VALIDATION_ERROR`, where multi-field rejections are common and `field` (singular) cannot carry the full pointer map. MAY appear on other error codes that reject multiple fields at once. When `issues` is present, sellers MUST also populate `field` from `issues[0]` for backward compatibility with pre-3.1 consumers that read `field` only \u2014 translating the RFC 6901 `pointer` format to the JSONPath-lite format `field` uses (e.g., `/packages/0/targeting` \u2192 `packages[0].targeting`). MUST (not SHOULD) so consumers reading `field` get deterministic behavior across sellers \u2014 the cost is one line of dual-write per seller; the cost of SHOULD is a long tail of seller-A-vs-seller-B inconsistency. Future major versions will deprecate `field` in favor of `issues[].pointer`.").optional(), "details": z.record(z.string(), z.any()).describe('Additional task-specific error details. Sellers MAY mirror `issues[]` here as `details.issues` for backward compatibility with pre-3.1 consumers reading from `details`; new consumers SHOULD prefer the top-level `issues` field.\n\n**Canonical rejection-set shape (3.1+).** When the error reports a rejected value against a closed set of accepted values (e.g., enum mismatch, unsupported pricing option, invalid signal id), sellers SHOULD use the canonical key `accepted_values: <array>` under `details` rather than seller-specific variants observed in the wild (`available`, `allowed`, `accepted_values` at the error root, etc.). The canonical shape:\n\n```json\n{\n "code": "INVALID_PRICING_OPTION",\n "message": "Pricing option not found: po_prism_abandoner_cpm",\n "field": "pricing_option_id",\n "details": {\n "rejected_value": "po_prism_abandoner_cpm",\n "accepted_values": ["po_prism_cart_cpm", "po_prism_view_cpm"]\n }\n}\n```\n\n- `rejected_value` (optional): the offending value the buyer supplied, echoed for buyer-side diagnostic clarity (especially when the offending field is nested or transformed before validation).\n- `accepted_values` (optional): the closed set the seller would have accepted at this field on this call. Sellers MUST NOT enumerate the full ecosystem-wide accepted set if it differs from what\'s accepted for *this caller in this context* (account, brand, scope) \u2014 leaking ecosystem-wide accepted sets to a per-caller rejection turns the error into an enumeration oracle.\n\nThis is **SHOULD-level guidance**, not MUST: `details` remains `additionalProperties: true` and pre-3.1 sellers using `available` / `allowed` / `accepted_values` at the error root remain conformant. The canonical shape lets buyer-side diagnostic tooling (SDK runner hints, dashboards, error classifiers) reliably surface the accepted-set without per-seller pattern matching. SDKs SHOULD accept any of the legacy variants and normalize on read; the canonical shape is what new sellers and 3.1+ adopters should emit going forward.').optional(), "recovery": z.enum(["transient", "correctable", "terminal"]).describe("Agent recovery classification. transient: retry after delay (rate limit, service unavailable, timeout). correctable: fix the request and resend (invalid field, budget too low, creative rejected). terminal: requires human action (account suspended, payment required, account not found). AdCP 3.2 producers MUST populate `recovery` on every error; 3.1 producers SHOULD populate it. The shared 3.x schema intentionally does not add `recovery` to `required` so retained and live errors from earlier 3.x producers remain decodable. When `buyer_reason` is present, `recovery` is required and MUST classify that buyer-actionable reason. If the enclosing code and buyer reason are both registered, their standard recovery classifications MUST agree with each other and with this field. A receiver that does not recognize `error.code` (a newer code, or a platform-specific code) MUST still be able to classify the error from `recovery`. When a legacy error omits `recovery`, receivers use the registered classification for a known code and fall back to `transient` for an unknown code, subject to the bounded retry budget. The `enumMetadata.recovery` block in `enums/error-code.json` is the documentary mirror for known top-level and buyer-reason codes; `error.recovery` on the wire is authoritative when present.").optional(), "source": z.enum(["producer", "sdk"]).describe("Who emitted this error entry. `producer` (default when absent): emitted by the response's authoring agent (the seller for `get_products`, the creative agent for `build_creative`, etc.). `sdk`: augmented by a consuming SDK that detected a non-fatal advisory condition on consumption (e.g., `FORMAT_PROJECTION_FAILED` when the buyer SDK couldn't project a v1 format to a canonical, or `FORMAT_DECLARATION_DIVERGENT` when the SDK detected a producer bug on read). SDK-augmented entries SHOULD also set `sdk_id` so downstream consumers can identify which intermediate processor inserted the entry.\n\n**Multi-hop propagation (normative).** AdCP is a federated agent network \u2014 responses commonly traverse multiple SDKs (e.g., sales agent \u2192 interchange \u2192 DSP \u2192 buyer). When an SDK augments `errors[]` with a consumption-detected entry, the augmented response carries the entry forward to subsequent hops. Each hop that detects the same condition independently SHOULD deduplicate by `(code, field)` rather than re-emit; the existing entry's `sdk_id` identifies which earlier processor saw it first. Producer entries (those without `source: \"sdk\"`) are authoritative for what the response's authoring agent self-detected; SDK entries are observations made on top.\n\n**Replay/audit safety.** Persisted or replayed responses carry `source` and `sdk_id` so the audit trail can distinguish seller-emitted entries from SDK-augmented ones. Without `source`, a downstream consumer can't tell whether a code came from the seller or an intermediate SDK, which corrupts attribution.").optional(), "sdk_id": z.string().describe('Optional identifier for the SDK that augmented this error entry. Format: `<sdk_package_name>@<version>` (e.g., `@adcontextprotocol/adcp@7.3.0`, `adcontextprotocol-adcp-python@1.2.0`). MUST be set when `source: "sdk"`; MUST be absent when `source: "producer"` or absent. Lets downstream consumers identify which intermediate processor inserted the entry, useful for debugging cross-SDK divergence (e.g., one SDK detects a projection failure that another SDK\'s registry version doesn\'t).').optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "buyer_reason": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "buyer_reason": z.any().refine((value) => value !== void 0, "Required"), "recovery": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Standard error structure for task-specific errors and warnings")).describe("Task-specific delivery errors or warnings.").optional(), "sandbox": z.boolean().optional(), "context": z.record(z.string(), z.any()).describe("Opaque correlation data that is echoed unchanged in responses. Used for internal tracking, UI session IDs, trace IDs, and other caller-specific identifiers that don't affect protocol behavior. Context data is never parsed by AdCP agents - it's simply preserved and returned.").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() }).catchall(z.any()).describe("Payload-only delivery report result carried under core/mcp-webhook-payload.json result for task_type media_buy_delivery. This is not a top-level webhook POST body and does not include protocol envelope fields such as task_id or status."))();
|
|
3440
3422
|
const BuildCreativeAsyncWorkingSchema = /* @__PURE__ */ (() => z.object({
|
|
3441
3423
|
percentage: z.number().optional(),
|
|
3442
3424
|
current_step: z.string().optional(),
|
|
@@ -4070,7 +4052,7 @@ const BuildCreativeEstimateSchema = /* @__PURE__ */ (() => z.object({
|
|
|
4070
4052
|
consumption_estimate: CreativeConsumptionSchema.optional()
|
|
4071
4053
|
}).passthrough()).optional()
|
|
4072
4054
|
}).passthrough(),
|
|
4073
|
-
expires_at: z.
|
|
4055
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
4074
4056
|
context: ContextObjectSchema.optional(),
|
|
4075
4057
|
ext: ExtensionObjectSchema.optional()
|
|
4076
4058
|
}).passthrough())();
|
|
@@ -4087,7 +4069,7 @@ const PreviewCreativeSingleResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
4087
4069
|
}).passthrough()),
|
|
4088
4070
|
quality_used: CreativeQualitySchema.optional(),
|
|
4089
4071
|
interactive_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
4090
|
-
expires_at: z.
|
|
4072
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
4091
4073
|
context: ContextObjectSchema.optional(),
|
|
4092
4074
|
ext: ExtensionObjectSchema.optional()
|
|
4093
4075
|
}).passthrough())();
|
|
@@ -4180,7 +4162,7 @@ const A2UIUserActionSchema = /* @__PURE__ */ (() => z.object({
|
|
|
4180
4162
|
name: z.string(),
|
|
4181
4163
|
context: z.object({}).passthrough().optional()
|
|
4182
4164
|
}).passthrough(),
|
|
4183
|
-
timestamp: z.
|
|
4165
|
+
timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
4184
4166
|
}).passthrough())();
|
|
4185
4167
|
const PublisherEntrySchema = /* @__PURE__ */ (() => z.object({
|
|
4186
4168
|
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 +4173,7 @@ const PublisherEntrySchema = /* @__PURE__ */ (() => z.object({
|
|
|
4191
4173
|
property_ids: z.array(z.string()).optional(),
|
|
4192
4174
|
signing_keys_pinned: z.boolean().optional(),
|
|
4193
4175
|
status: z.union([z.literal("authorized"), z.literal("revoked")]),
|
|
4194
|
-
last_verified_at: z.
|
|
4176
|
+
last_verified_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
4195
4177
|
}).passthrough())();
|
|
4196
4178
|
const AcquireRightsRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
4197
4179
|
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 +4264,7 @@ const CreativeApprovedSchema = /* @__PURE__ */ (() => z.object({
|
|
|
4282
4264
|
rights_id: z.string(),
|
|
4283
4265
|
creative_id: z.string().optional(),
|
|
4284
4266
|
creative_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
4285
|
-
approved_at: z.
|
|
4267
|
+
approved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
4286
4268
|
conditions: z.array(z.string()).optional(),
|
|
4287
4269
|
context: ContextObjectSchema.optional(),
|
|
4288
4270
|
ext: ExtensionObjectSchema.optional()
|
|
@@ -4461,7 +4443,7 @@ const RevocationNotificationSchema = /* @__PURE__ */ (() => z.object({
|
|
|
4461
4443
|
rights_id: z.string(),
|
|
4462
4444
|
brand_id: z.string(),
|
|
4463
4445
|
reason: z.string(),
|
|
4464
|
-
effective_at: z.
|
|
4446
|
+
effective_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
4465
4447
|
revoked_uses: z.array(RightUseSchema).optional(),
|
|
4466
4448
|
context: ContextObjectSchema.optional(),
|
|
4467
4449
|
ext: ExtensionObjectSchema.optional()
|
|
@@ -4488,7 +4470,7 @@ const SearchBrandResultSchema = /* @__PURE__ */ (() => z.object({
|
|
|
4488
4470
|
name: z.string()
|
|
4489
4471
|
}).passthrough().optional(),
|
|
4490
4472
|
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.
|
|
4473
|
+
relationship_verified_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
4492
4474
|
claimed_house_domain: z.string().optional(),
|
|
4493
4475
|
names: z.array(z.record(z.string(), z.string())),
|
|
4494
4476
|
description: z.string().optional(),
|
|
@@ -4532,7 +4514,7 @@ const VerifySubsidiaryClaimSchema = /* @__PURE__ */ (() => z.object({
|
|
|
4532
4514
|
claim: z.object({
|
|
4533
4515
|
subsidiary_domain: z.string(),
|
|
4534
4516
|
subsidiary_brand_id: z.string().regex(/^[a-z0-9_]+$/).optional(),
|
|
4535
|
-
observed_at: z.
|
|
4517
|
+
observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
4536
4518
|
}).passthrough()
|
|
4537
4519
|
}).passthrough())();
|
|
4538
4520
|
const VerifyParentClaimSchema = /* @__PURE__ */ (() => z.object({
|
|
@@ -4540,7 +4522,7 @@ const VerifyParentClaimSchema = /* @__PURE__ */ (() => z.object({
|
|
|
4540
4522
|
claim: z.object({
|
|
4541
4523
|
parent_domain: z.string(),
|
|
4542
4524
|
claimant_says: z.string().optional(),
|
|
4543
|
-
observed_at: z.
|
|
4525
|
+
observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
4544
4526
|
}).passthrough()
|
|
4545
4527
|
}).passthrough())();
|
|
4546
4528
|
const VerifyPropertyClaimSchema = /* @__PURE__ */ (() => z.object({
|
|
@@ -4642,8 +4624,8 @@ const CollectionListChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
|
4642
4624
|
collections_removed: z.int().optional(),
|
|
4643
4625
|
total_collections: z.int().optional()
|
|
4644
4626
|
}).passthrough().optional(),
|
|
4645
|
-
resolved_at: z.
|
|
4646
|
-
cache_valid_until: z.
|
|
4627
|
+
resolved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
4628
|
+
cache_valid_until: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
4647
4629
|
signature: z.string(),
|
|
4648
4630
|
ext: ExtensionObjectSchema.optional()
|
|
4649
4631
|
}).passthrough())();
|
|
@@ -4893,11 +4875,11 @@ const AccountChangeRecordedWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
|
4893
4875
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
4894
4876
|
notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
4895
4877
|
notification_type: z.literal("account.change_recorded"),
|
|
4896
|
-
fired_at: z.
|
|
4878
|
+
fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
4897
4879
|
subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
4898
4880
|
account_id: z.string().min(1).max(255),
|
|
4899
4881
|
change_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
4900
|
-
recorded_at: z.
|
|
4882
|
+
recorded_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
4901
4883
|
resource: z.object({
|
|
4902
4884
|
type: z.string().min(1).max(100).regex(/^[a-z][a-z0-9_.-]{0,99}$/),
|
|
4903
4885
|
resource_id: z.string().min(1).max(255),
|
|
@@ -4962,17 +4944,17 @@ const AccountStatusChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
|
4962
4944
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
4963
4945
|
notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
4964
4946
|
notification_type: z.literal("account.status_changed"),
|
|
4965
|
-
fired_at: z.
|
|
4947
|
+
fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
4966
4948
|
subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
4967
4949
|
account_id: z.string(),
|
|
4968
4950
|
previous_status: AccountStatusSchema,
|
|
4969
4951
|
status: AccountStatusSchema,
|
|
4970
|
-
observed_at: z.
|
|
4952
|
+
observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
4971
4953
|
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
4954
|
reason_detail: z.string().max(500).optional(),
|
|
4973
4955
|
setup: z.object({
|
|
4974
4956
|
message: z.string(),
|
|
4975
|
-
expires_at: z.
|
|
4957
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
4976
4958
|
}).passthrough().optional(),
|
|
4977
4959
|
ext: ExtensionObjectSchema.optional()
|
|
4978
4960
|
}).passthrough())();
|
|
@@ -5043,7 +5025,7 @@ const AgentSigningKeySchema = /* @__PURE__ */ (() => z.object({
|
|
|
5043
5025
|
y: z.string().optional(),
|
|
5044
5026
|
n: z.string().optional(),
|
|
5045
5027
|
e: z.string().optional(),
|
|
5046
|
-
revoked_at: z.
|
|
5028
|
+
revoked_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
5047
5029
|
}).passthrough())();
|
|
5048
5030
|
const AgentWebhookChallengeSchema = /* @__PURE__ */ (() => z.object({
|
|
5049
5031
|
type: z.literal("webhook.challenge"),
|
|
@@ -5065,7 +5047,7 @@ const PriceSchema = /* @__PURE__ */ (() => z.object({
|
|
|
5065
5047
|
const VASTAssetSchema = /* @__PURE__ */ (() => z.object({
|
|
5066
5048
|
asset_type: z.literal("vast"),
|
|
5067
5049
|
vast_version: VASTVersionSchema.optional(),
|
|
5068
|
-
macro_declarations: z.array(MacroDeclarationSchema).optional(),
|
|
5050
|
+
macro_declarations: z.array(MacroDeclarationSchema).min(1).optional(),
|
|
5069
5051
|
vpaid_enabled: z.boolean().optional(),
|
|
5070
5052
|
duration_ms: z.number().int().gte(0).optional(),
|
|
5071
5053
|
tracking_events: z.array(VASTTrackingEventSchema).optional(),
|
|
@@ -5079,7 +5061,7 @@ const VASTAssetSchema = /* @__PURE__ */ (() => z.object({
|
|
|
5079
5061
|
location: z.object({
|
|
5080
5062
|
field: z.literal("url").optional()
|
|
5081
5063
|
}).passthrough().optional()
|
|
5082
|
-
}).passthrough()).optional()
|
|
5064
|
+
}).passthrough()).min(1).optional()
|
|
5083
5065
|
}).passthrough(), z.object({
|
|
5084
5066
|
delivery_type: z.literal("inline"),
|
|
5085
5067
|
content: z.string(),
|
|
@@ -5087,8 +5069,8 @@ const VASTAssetSchema = /* @__PURE__ */ (() => z.object({
|
|
|
5087
5069
|
location: z.object({
|
|
5088
5070
|
field: z.literal("content").optional()
|
|
5089
5071
|
}).passthrough().optional()
|
|
5090
|
-
}).passthrough()).optional()
|
|
5091
|
-
}).passthrough()])))();
|
|
5072
|
+
}).passthrough()).min(1).optional()
|
|
5073
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
5092
5074
|
const AdCPAssetGroupVocabularyRegistrySchema = /* @__PURE__ */ (() => z.object({}).passthrough())();
|
|
5093
5075
|
const AttestationIssuerSchema = /* @__PURE__ */ (() => z.union([AttestationBrandIssuerSchema, AttestationAgentIssuerSchema, AttestationOriginIssuerSchema]))();
|
|
5094
5076
|
const AudienceEvidenceRequirementsSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({
|
|
@@ -5131,7 +5113,7 @@ const AuthorizedAgentBaseFieldsSchema = /* @__PURE__ */ (() => z.object({
|
|
|
5131
5113
|
authorized_for: z.string().min(1).max(500),
|
|
5132
5114
|
signing_keys: z.array(AgentSigningKeySchema).optional(),
|
|
5133
5115
|
encryption_keys: z.array(AgentEncryptionKeySchema).optional(),
|
|
5134
|
-
last_updated: z.
|
|
5116
|
+
last_updated: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
5135
5117
|
}).passthrough())();
|
|
5136
5118
|
const MaxBidWithCostPerSchema = /* @__PURE__ */ (() => z.object({
|
|
5137
5119
|
kind: z.literal("max_bid_with_cost_per"),
|
|
@@ -5155,7 +5137,7 @@ const BrandResponseAuthorizationResultSchema = /* @__PURE__ */ (() => z.object({
|
|
|
5155
5137
|
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
5138
|
kid: z.string().min(1).optional(),
|
|
5157
5139
|
jwks_uri: z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(/^https:\/\//).optional()
|
|
5158
|
-
}).passthrough()])))();
|
|
5140
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
5159
5141
|
const BudgetRangeSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({
|
|
5160
5142
|
min: z.number().gte(0).optional(),
|
|
5161
5143
|
max: z.number().gte(0).optional(),
|
|
@@ -5182,10 +5164,10 @@ const CapabilitiesChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
|
5182
5164
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
5183
5165
|
notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
5184
5166
|
notification_type: z.literal("capabilities.changed"),
|
|
5185
|
-
fired_at: z.
|
|
5167
|
+
fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
5186
5168
|
subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
5187
5169
|
agent_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"),
|
|
5188
|
-
changed_at: z.
|
|
5170
|
+
changed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
5189
5171
|
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
5172
|
capabilities_version: z.string().min(1).max(255),
|
|
5191
5173
|
changed_paths: z.array(z.string()).optional(),
|
|
@@ -5268,7 +5250,7 @@ const CatchmentSchema = /* @__PURE__ */ (() => z.object({
|
|
|
5268
5250
|
coordinates: z.array(z.unknown())
|
|
5269
5251
|
}).passthrough(),
|
|
5270
5252
|
ext: ExtensionObjectSchema.optional()
|
|
5271
|
-
}).passthrough()])))();
|
|
5253
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
5272
5254
|
const CollectionDistributionSchema = /* @__PURE__ */ (() => z.object({
|
|
5273
5255
|
publisher_domain: z.string(),
|
|
5274
5256
|
property_ids: z.array(PropertyIDSchema).optional(),
|
|
@@ -5627,7 +5609,7 @@ const GeographicPlaceCatalogEntrySchema = /* @__PURE__ */ (() => z.object({
|
|
|
5627
5609
|
parent_labels: z.array(z.string()),
|
|
5628
5610
|
status: z.union([z.literal("active"), z.literal("removal_planned"), z.literal("deprecated")]),
|
|
5629
5611
|
replaced_by_values: z.array(z.string()).optional(),
|
|
5630
|
-
valid_until: z.
|
|
5612
|
+
valid_until: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
5631
5613
|
ext: ExtensionObjectSchema.optional()
|
|
5632
5614
|
}).passthrough())();
|
|
5633
5615
|
const GeographicPlaceCatalogCapabilitySchema = /* @__PURE__ */ (() => z.object({
|
|
@@ -5664,7 +5646,7 @@ const IndicatorsChangedWebhookSchema = /* @__PURE__ */ (() => z.union([z.object(
|
|
|
5664
5646
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
5665
5647
|
notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
5666
5648
|
notification_type: z.literal("indicators.changed"),
|
|
5667
|
-
fired_at: z.
|
|
5649
|
+
fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
5668
5650
|
subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
5669
5651
|
account_id: z.string(),
|
|
5670
5652
|
relationship_kind: z.literal("media_buy"),
|
|
@@ -5673,13 +5655,13 @@ const IndicatorsChangedWebhookSchema = /* @__PURE__ */ (() => z.union([z.object(
|
|
|
5673
5655
|
creative_id: z.string().optional(),
|
|
5674
5656
|
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
5657
|
changed_indicator_types: z.array(IndicatorTypeSchema),
|
|
5676
|
-
observed_at: z.
|
|
5658
|
+
observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
5677
5659
|
ext: ExtensionObjectSchema.optional()
|
|
5678
5660
|
}).passthrough(), z.object({
|
|
5679
5661
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
5680
5662
|
notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
5681
5663
|
notification_type: z.literal("indicators.changed"),
|
|
5682
|
-
fired_at: z.
|
|
5664
|
+
fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
5683
5665
|
subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
5684
5666
|
account_id: z.string(),
|
|
5685
5667
|
relationship_kind: z.literal("package"),
|
|
@@ -5688,13 +5670,13 @@ const IndicatorsChangedWebhookSchema = /* @__PURE__ */ (() => z.union([z.object(
|
|
|
5688
5670
|
creative_id: z.string().optional(),
|
|
5689
5671
|
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
5672
|
changed_indicator_types: z.array(IndicatorTypeSchema),
|
|
5691
|
-
observed_at: z.
|
|
5673
|
+
observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
5692
5674
|
ext: ExtensionObjectSchema.optional()
|
|
5693
5675
|
}).passthrough(), z.object({
|
|
5694
5676
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
5695
5677
|
notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
5696
5678
|
notification_type: z.literal("indicators.changed"),
|
|
5697
|
-
fired_at: z.
|
|
5679
|
+
fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
5698
5680
|
subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
5699
5681
|
account_id: z.string(),
|
|
5700
5682
|
relationship_kind: z.literal("creative_assignment"),
|
|
@@ -5703,7 +5685,7 @@ const IndicatorsChangedWebhookSchema = /* @__PURE__ */ (() => z.union([z.object(
|
|
|
5703
5685
|
creative_id: z.string(),
|
|
5704
5686
|
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
5687
|
changed_indicator_types: z.array(IndicatorTypeSchema),
|
|
5706
|
-
observed_at: z.
|
|
5688
|
+
observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
5707
5689
|
ext: ExtensionObjectSchema.optional()
|
|
5708
5690
|
}).passthrough()]))();
|
|
5709
5691
|
const InstallmentReferenceSchema = /* @__PURE__ */ (() => z.object({
|
|
@@ -5825,7 +5807,7 @@ const PerformanceFeedbackAssertionSchema = /* @__PURE__ */ (() => z.object({
|
|
|
5825
5807
|
}).passthrough().optional()
|
|
5826
5808
|
}).passthrough().optional(),
|
|
5827
5809
|
evidence_ref: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
5828
|
-
as_of: z.
|
|
5810
|
+
as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
5829
5811
|
final: z.boolean().optional(),
|
|
5830
5812
|
supersedes_feedback_id: z.string().min(1).optional()
|
|
5831
5813
|
}).passthrough())();
|
|
@@ -5835,8 +5817,8 @@ const PerformanceFeedbackSchema = /* @__PURE__ */ (() => z.object({
|
|
|
5835
5817
|
package_id: z.string().optional(),
|
|
5836
5818
|
creative_id: z.string().optional(),
|
|
5837
5819
|
measurement_period: z.object({
|
|
5838
|
-
start: z.
|
|
5839
|
-
end: z.
|
|
5820
|
+
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
5821
|
+
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
5840
5822
|
}).passthrough(),
|
|
5841
5823
|
performance_index: z.number().min(0),
|
|
5842
5824
|
metric_type: MetricTypeSchema.optional(),
|
|
@@ -5865,8 +5847,8 @@ const PerformanceFeedbackSchema = /* @__PURE__ */ (() => z.object({
|
|
|
5865
5847
|
feedback_source: FeedbackSourceSchema,
|
|
5866
5848
|
vendor: BrandReferenceSchema.optional(),
|
|
5867
5849
|
status: z.union([z.literal("accepted"), z.literal("queued"), z.literal("applied"), z.literal("rejected")]),
|
|
5868
|
-
submitted_at: z.
|
|
5869
|
-
applied_at: z.
|
|
5850
|
+
submitted_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
5851
|
+
applied_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
5870
5852
|
}).passthrough())();
|
|
5871
5853
|
const PlacementPresentationReferenceSchema = /* @__PURE__ */ (() => z.object({
|
|
5872
5854
|
uri: z.string().regex(new RegExp("^https://")).refine(adcpJsonSchemaUri, "Invalid URI"),
|
|
@@ -5945,10 +5927,10 @@ const PrincipalChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
|
5945
5927
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
5946
5928
|
notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
5947
5929
|
notification_type: z.literal("principal.changed"),
|
|
5948
|
-
fired_at: z.
|
|
5930
|
+
fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
5949
5931
|
subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
5950
5932
|
agent_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"),
|
|
5951
|
-
changed_at: z.
|
|
5933
|
+
changed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
5952
5934
|
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
5935
|
destination_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/).optional(),
|
|
5954
5936
|
ext: ExtensionObjectSchema.optional()
|
|
@@ -6093,7 +6075,7 @@ const AgentProfilePayloadSchema = /* @__PURE__ */ (() => z.object({
|
|
|
6093
6075
|
property_count: z.int().min(0).optional(),
|
|
6094
6076
|
publisher_count: z.int().min(0).optional(),
|
|
6095
6077
|
has_tmp: z.boolean().optional(),
|
|
6096
|
-
updated_at: z.
|
|
6078
|
+
updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
6097
6079
|
}).passthrough())();
|
|
6098
6080
|
const CompliancePayloadSchema = /* @__PURE__ */ (() => z.object({
|
|
6099
6081
|
agent_url: z.string(),
|
|
@@ -6324,7 +6306,7 @@ const ReportingDeliveryReadyWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
|
6324
6306
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
6325
6307
|
notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
6326
6308
|
notification_type: z.literal("reporting.delivery_ready"),
|
|
6327
|
-
fired_at: z.
|
|
6309
|
+
fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
6328
6310
|
subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
6329
6311
|
account_id: z.string().min(1),
|
|
6330
6312
|
delivery_config_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
@@ -6333,7 +6315,7 @@ const ReportingDeliveryReadyWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
|
6333
6315
|
reporting_materialization_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
6334
6316
|
readiness: z.union([z.literal("available"), z.literal("delivered")]),
|
|
6335
6317
|
finality: ReportingFinalitySchema,
|
|
6336
|
-
data_through: z.
|
|
6318
|
+
data_through: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").nullable(),
|
|
6337
6319
|
feed_purpose: ReportingFeedPurposeSchema
|
|
6338
6320
|
}).passthrough())();
|
|
6339
6321
|
const ReportingFileCompressionSchema = /* @__PURE__ */ (() => z.union([z.literal("none"), z.literal("gzip"), z.literal("zstd"), z.literal("snappy")]))();
|
|
@@ -6354,8 +6336,8 @@ const ReportingFileManifestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
6354
6336
|
reporting_obligation_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
6355
6337
|
reporting_materialization_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
6356
6338
|
period: z.object({
|
|
6357
|
-
start: z.
|
|
6358
|
-
end: z.
|
|
6339
|
+
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
6340
|
+
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
6359
6341
|
source_timezone: z.string().min(1)
|
|
6360
6342
|
}).strict(),
|
|
6361
6343
|
format: z.union([z.literal("jsonl"), z.literal("csv"), z.literal("parquet"), z.literal("avro"), z.literal("orc")]),
|
|
@@ -6364,13 +6346,13 @@ const ReportingFileManifestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
6364
6346
|
total_size_bytes: z.int().min(0),
|
|
6365
6347
|
row_count: z.int().min(0),
|
|
6366
6348
|
control_totals: z.array(ReportingControlTotalSchema),
|
|
6367
|
-
created_at: z.
|
|
6349
|
+
created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
6368
6350
|
}).strict())();
|
|
6369
6351
|
const ReportingLedgerChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
6370
6352
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
6371
6353
|
notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
6372
6354
|
notification_type: z.literal("reporting.ledger_changed"),
|
|
6373
|
-
fired_at: z.
|
|
6355
|
+
fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
6374
6356
|
subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
6375
6357
|
account_id: z.string().min(1),
|
|
6376
6358
|
change_kind: z.union([z.literal("revision_published"), z.literal("adjustment_published")]),
|
|
@@ -6588,7 +6570,7 @@ const ReportingStatusChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
|
6588
6570
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
6589
6571
|
notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
6590
6572
|
notification_type: z.literal("reporting.status_changed"),
|
|
6591
|
-
fired_at: z.
|
|
6573
|
+
fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
6592
6574
|
subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
6593
6575
|
account_id: z.string().min(1),
|
|
6594
6576
|
delivery_config_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
@@ -6670,7 +6652,7 @@ const AttestationReferenceSchema = /* @__PURE__ */ (() => z.object({
|
|
|
6670
6652
|
agent_url: z.string().regex(new RegExp("^https://[^/?#@]+(?:/[^?#]*)?(?:\\?[^#]*)?$")).refine(adcpJsonSchemaUri, "Invalid URI")
|
|
6671
6653
|
}).passthrough().optional(),
|
|
6672
6654
|
ext: ExtensionObjectSchema.optional()
|
|
6673
|
-
}).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
|
|
6655
|
+
}).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
|
|
6674
6656
|
issuer: AttestationIssuerSchema,
|
|
6675
6657
|
claim_type: z.string().refine(adcpJsonSchemaUri, "Invalid URI"),
|
|
6676
6658
|
subject: AttestationSubjectSchema,
|
|
@@ -6768,7 +6750,7 @@ const SignalDefinitionSchema = /* @__PURE__ */ (() => z.object({
|
|
|
6768
6750
|
response_sla_days: z.int().min(1).max(90).optional(),
|
|
6769
6751
|
ccpa_opt_out_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(/^https:\/\//).optional()
|
|
6770
6752
|
}).passthrough().optional(),
|
|
6771
|
-
last_updated: z.
|
|
6753
|
+
last_updated: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
6772
6754
|
dts_compliant_version: z.string().optional()
|
|
6773
6755
|
}).passthrough())();
|
|
6774
6756
|
const SignalFiltersSchema = /* @__PURE__ */ (() => z.object({
|
|
@@ -6827,9 +6809,9 @@ const TasksGetResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
6827
6809
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
6828
6810
|
task_type: TaskTypeSchema,
|
|
6829
6811
|
protocol: AdCPProtocolSchema,
|
|
6830
|
-
created_at: z.
|
|
6831
|
-
updated_at: z.
|
|
6832
|
-
completed_at: z.
|
|
6812
|
+
created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
6813
|
+
updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
6814
|
+
completed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
6833
6815
|
has_webhook: z.boolean().optional(),
|
|
6834
6816
|
progress: z.object({
|
|
6835
6817
|
percentage: z.number().min(0).max(100).optional(),
|
|
@@ -6847,7 +6829,7 @@ const TasksGetResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
6847
6829
|
}).passthrough().optional()
|
|
6848
6830
|
}).passthrough().optional(),
|
|
6849
6831
|
history: z.array(z.object({
|
|
6850
|
-
timestamp: z.
|
|
6832
|
+
timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
6851
6833
|
type: z.union([z.literal("request"), z.literal("response")]),
|
|
6852
6834
|
data: z.object({}).passthrough()
|
|
6853
6835
|
}).passthrough()).optional(),
|
|
@@ -6865,10 +6847,10 @@ const TasksListRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
6865
6847
|
statuses: z.array(TaskStatusSchema).optional(),
|
|
6866
6848
|
task_type: TaskTypeSchema.optional(),
|
|
6867
6849
|
task_types: z.array(TaskTypeSchema).optional(),
|
|
6868
|
-
created_after: z.
|
|
6869
|
-
created_before: z.
|
|
6870
|
-
updated_after: z.
|
|
6871
|
-
updated_before: z.
|
|
6850
|
+
created_after: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
6851
|
+
created_before: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
6852
|
+
updated_after: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
6853
|
+
updated_before: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
6872
6854
|
task_ids: z.array(z.string()).max(100).optional(),
|
|
6873
6855
|
context_contains: z.string().optional(),
|
|
6874
6856
|
has_webhook: z.boolean().optional()
|
|
@@ -6916,9 +6898,9 @@ const TasksListResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
6916
6898
|
task_type: TaskTypeSchema,
|
|
6917
6899
|
domain: z.union([z.literal("media-buy"), z.literal("signals"), z.literal("creative")]),
|
|
6918
6900
|
status: TaskStatusSchema,
|
|
6919
|
-
created_at: z.
|
|
6920
|
-
updated_at: z.
|
|
6921
|
-
completed_at: z.
|
|
6901
|
+
created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
6902
|
+
updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
6903
|
+
completed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
6922
6904
|
has_webhook: z.boolean().optional()
|
|
6923
6905
|
}).passthrough()),
|
|
6924
6906
|
pagination: PaginationResponseSchema,
|
|
@@ -6970,7 +6952,7 @@ const AgenticAdvertisingOrgVerificationTokenClaimsSchema = /* @__PURE__ */ (() =
|
|
|
6970
6952
|
verified_specialisms: z.array(z.string()),
|
|
6971
6953
|
verification_modes: z.array(VerificationTokenModeSchema),
|
|
6972
6954
|
grading_profile: z.union([z.literal("legacy"), z.literal("spec")]).optional(),
|
|
6973
|
-
first_failing_spec_at: z.
|
|
6955
|
+
first_failing_spec_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
6974
6956
|
adcp_version: z.string().regex(/^[1-9][0-9]*\.[0-9]+$/).optional(),
|
|
6975
6957
|
protocol_version: z.string().optional()
|
|
6976
6958
|
}).passthrough())();
|
|
@@ -7002,26 +6984,26 @@ const CreativeAssignmentChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
|
7002
6984
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
7003
6985
|
notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
7004
6986
|
notification_type: z.literal("creative.assignment_changed"),
|
|
7005
|
-
fired_at: z.
|
|
6987
|
+
fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
7006
6988
|
subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
7007
6989
|
account_id: z.string(),
|
|
7008
6990
|
media_buy_id: z.string(),
|
|
7009
6991
|
package_id: z.string(),
|
|
7010
6992
|
creative_id: z.string(),
|
|
7011
6993
|
change_kind: z.union([z.literal("assigned"), z.literal("unassigned"), z.literal("approval_changed")]),
|
|
7012
|
-
observed_at: z.
|
|
6994
|
+
observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
7013
6995
|
ext: ExtensionObjectSchema.optional()
|
|
7014
6996
|
}).passthrough())();
|
|
7015
6997
|
const CreativePurgedWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
7016
6998
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
7017
6999
|
notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
7018
7000
|
notification_type: z.literal("creative.purged"),
|
|
7019
|
-
fired_at: z.
|
|
7001
|
+
fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
7020
7002
|
subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
7021
7003
|
account_id: z.string(),
|
|
7022
7004
|
creative_id: z.string(),
|
|
7023
7005
|
purge_kind: z.union([z.literal("soft"), z.literal("hard")]),
|
|
7024
|
-
purged_at: z.
|
|
7006
|
+
purged_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
7025
7007
|
reason_code: CreativeEventReasonCodeSchema,
|
|
7026
7008
|
reason_detail: z.string().max(500).optional(),
|
|
7027
7009
|
initiator: z.union([z.literal("seller"), z.literal("system")]),
|
|
@@ -7031,7 +7013,7 @@ const CreativeStatusChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
|
7031
7013
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
7032
7014
|
notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
|
|
7033
7015
|
notification_type: z.literal("creative.status_changed"),
|
|
7034
|
-
fired_at: z.
|
|
7016
|
+
fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
7035
7017
|
subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
7036
7018
|
account_id: z.string(),
|
|
7037
7019
|
creative_id: z.string(),
|
|
@@ -7039,7 +7021,7 @@ const CreativeStatusChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
|
7039
7021
|
transition: z.object({
|
|
7040
7022
|
from: z.union([z.literal("processing"), z.literal("pending_review"), z.literal("approved"), z.literal("suspended")]),
|
|
7041
7023
|
to: CreativeStatusSchema,
|
|
7042
|
-
observed_at: z.
|
|
7024
|
+
observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
7043
7025
|
}).passthrough(),
|
|
7044
7026
|
reason_code: CreativeEventReasonCodeSchema,
|
|
7045
7027
|
reason_detail: z.string().max(500).optional(),
|
|
@@ -7291,7 +7273,7 @@ const ToolNameSchema = /* @__PURE__ */ (() => z.string().regex(/^[a-z][a-z0-9_]*
|
|
|
7291
7273
|
const AdCPManifestSchema = /* @__PURE__ */ (() => z.object({
|
|
7292
7274
|
$schema: z.string().optional(),
|
|
7293
7275
|
adcp_version: z.string().regex(/^\d+\.\d+\.\d+(-[A-Za-z0-9.-]+)?$/),
|
|
7294
|
-
generated_at: z.
|
|
7276
|
+
generated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
7295
7277
|
tools: z.record(z.string(), z.object({
|
|
7296
7278
|
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
7279
|
mutating: z.boolean(),
|
|
@@ -7479,8 +7461,8 @@ const PropertyListChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
|
7479
7461
|
properties_removed: z.int().optional(),
|
|
7480
7462
|
total_properties: z.int().optional()
|
|
7481
7463
|
}).passthrough().optional(),
|
|
7482
|
-
resolved_at: z.
|
|
7483
|
-
cache_valid_until: z.
|
|
7464
|
+
resolved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
7465
|
+
cache_valid_until: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
7484
7466
|
signature: z.string(),
|
|
7485
7467
|
ext: ExtensionObjectSchema.optional()
|
|
7486
7468
|
}).passthrough())();
|
|
@@ -7682,7 +7664,7 @@ const IdentityMatchRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
7682
7664
|
verification_level: z.union([z.literal("orb"), z.literal("device"), z.literal("document")]).optional(),
|
|
7683
7665
|
signal_binding: z.string().optional(),
|
|
7684
7666
|
proof: z.object({}).passthrough(),
|
|
7685
|
-
expires_at: z.
|
|
7667
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
7686
7668
|
}).strict().optional()
|
|
7687
7669
|
}).strict()).max(3),
|
|
7688
7670
|
consent: z.object({
|
|
@@ -8091,25 +8073,25 @@ const FrequencyCapIntervalConstraintsSchema = /* @__PURE__ */ (() => z.object({
|
|
|
8091
8073
|
maximum_interval: z.number().optional(),
|
|
8092
8074
|
allowed_intervals: z.array(z.number()).optional(),
|
|
8093
8075
|
ext: ExtensionObjectSchema.optional()
|
|
8094
|
-
}).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
|
|
8076
|
+
}).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
|
|
8095
8077
|
unit: FrequencyCapDurationUnitSchema,
|
|
8096
8078
|
minimum_interval: z.number().optional(),
|
|
8097
8079
|
maximum_interval: z.number().optional(),
|
|
8098
8080
|
allowed_intervals: z.array(z.number()).optional(),
|
|
8099
8081
|
ext: ExtensionObjectSchema.optional()
|
|
8100
|
-
}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
|
|
8082
|
+
}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
|
|
8101
8083
|
unit: FrequencyCapDurationUnitSchema,
|
|
8102
8084
|
minimum_interval: z.number().optional(),
|
|
8103
8085
|
maximum_interval: z.number().optional(),
|
|
8104
8086
|
allowed_intervals: z.array(z.number()).optional(),
|
|
8105
8087
|
ext: ExtensionObjectSchema.optional()
|
|
8106
|
-
}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
|
|
8088
|
+
}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
|
|
8107
8089
|
unit: FrequencyCapDurationUnitSchema,
|
|
8108
8090
|
minimum_interval: z.number().optional(),
|
|
8109
8091
|
maximum_interval: z.number().optional(),
|
|
8110
8092
|
allowed_intervals: z.array(z.number()).optional(),
|
|
8111
8093
|
ext: ExtensionObjectSchema.optional()
|
|
8112
|
-
}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])))();
|
|
8094
|
+
}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
8113
8095
|
const FrequencyCapConstraintsSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({
|
|
8114
8096
|
mutable_fields: z.array(FrequencyCapMutableFieldSchema).optional(),
|
|
8115
8097
|
supported_control_modes: z.array(FrequencyCapControlModeSchema).optional(),
|
|
@@ -8314,7 +8296,7 @@ const AcceptProposalRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
8314
8296
|
budget_cap_timezone: z.string().min(1).optional(),
|
|
8315
8297
|
io_acceptance: z.object({
|
|
8316
8298
|
io_id: z.string().min(1),
|
|
8317
|
-
accepted_at: z.
|
|
8299
|
+
accepted_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
8318
8300
|
signatory: z.string().min(1).max(250),
|
|
8319
8301
|
signature_id: z.string().min(1).optional()
|
|
8320
8302
|
}).passthrough().optional(),
|
|
@@ -8333,7 +8315,7 @@ const ControlAppliedSchema = /* @__PURE__ */ (() => z.object({
|
|
|
8333
8315
|
media_buy_id: z.string().min(1),
|
|
8334
8316
|
revision: z.int().min(1),
|
|
8335
8317
|
media_buy_status: MediaBuyStatusSchema.optional(),
|
|
8336
|
-
implementation_date: z.
|
|
8318
|
+
implementation_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
|
|
8337
8319
|
affected_package_ids: z.array(z.string()).optional(),
|
|
8338
8320
|
available_actions: z.array(CanonicalMediaBuyActionSchema).optional(),
|
|
8339
8321
|
warnings: z.array(WarningSchema.and(z.object({
|
|
@@ -8467,7 +8449,7 @@ const TagURLSchema = /* @__PURE__ */ (() => z.object({
|
|
|
8467
8449
|
location: z.object({
|
|
8468
8450
|
field: z.literal("url").optional()
|
|
8469
8451
|
}).passthrough().optional()
|
|
8470
|
-
}).passthrough())).optional(),
|
|
8452
|
+
}).passthrough())).min(1).optional(),
|
|
8471
8453
|
provenance: ProvenanceSchema.optional(),
|
|
8472
8454
|
delivery_type: z.literal("tag_url"),
|
|
8473
8455
|
url: MacroBearingURL1Schema
|
|
@@ -8478,7 +8460,7 @@ const PairedRedirectSchema = /* @__PURE__ */ (() => z.object({
|
|
|
8478
8460
|
location: z.object({
|
|
8479
8461
|
field: z.union([z.literal("ad_request_url"), z.literal("clickthrough_url")]).optional()
|
|
8480
8462
|
}).passthrough().optional()
|
|
8481
|
-
}).passthrough())).optional(),
|
|
8463
|
+
}).passthrough())).min(1).optional(),
|
|
8482
8464
|
provenance: ProvenanceSchema.optional(),
|
|
8483
8465
|
delivery_type: z.literal("paired_redirect"),
|
|
8484
8466
|
ad_request_url: MacroBearingURL2Schema,
|
|
@@ -8492,7 +8474,7 @@ const URLAsset1Schema = /* @__PURE__ */ (() => z.object({
|
|
|
8492
8474
|
location: z.object({
|
|
8493
8475
|
field: z.literal("url").optional()
|
|
8494
8476
|
}).passthrough().optional()
|
|
8495
|
-
}).passthrough())).optional(),
|
|
8477
|
+
}).passthrough())).min(1).optional(),
|
|
8496
8478
|
description: z.string().optional(),
|
|
8497
8479
|
state_id: z.string().optional(),
|
|
8498
8480
|
provenance: ProvenanceSchema.optional()
|
|
@@ -8531,7 +8513,7 @@ const GetMediaBuysRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
8531
8513
|
}).passthrough())();
|
|
8532
8514
|
const ScopedCreativeApprovalSchema = /* @__PURE__ */ (() => z.object({
|
|
8533
8515
|
scope: IndicatorScopeSchema,
|
|
8534
|
-
approval_status: CreativeApprovalStatusSchema.and(z.union([z.literal("pending_review"), z.literal("approved"), z.literal("rejected")])),
|
|
8516
|
+
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
8517
|
rejection_reason: z.string().optional()
|
|
8536
8518
|
}).passthrough())();
|
|
8537
8519
|
const GetMediaBuyDeliveryRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
@@ -8684,8 +8666,8 @@ const GetReportingStatusRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
8684
8666
|
delivery_config_ids: z.array(z.string()).max(16).optional(),
|
|
8685
8667
|
feed_purposes: z.array(ReportingFeedPurposeSchema).optional(),
|
|
8686
8668
|
period: z.object({
|
|
8687
|
-
start: z.
|
|
8688
|
-
end: z.
|
|
8669
|
+
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
8670
|
+
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
8689
8671
|
}).passthrough().optional(),
|
|
8690
8672
|
health: z.array(ReportingHealthSchema).optional(),
|
|
8691
8673
|
finality: z.array(ReportingFinalitySchema).optional(),
|
|
@@ -8804,7 +8786,7 @@ const UnavailableLookupSchema = /* @__PURE__ */ (() => z.object({
|
|
|
8804
8786
|
context_id: z.string().optional(),
|
|
8805
8787
|
context: ContextObjectSchema.optional(),
|
|
8806
8788
|
message: z.literal("Reporting status resource is unavailable.").optional(),
|
|
8807
|
-
timestamp: z.
|
|
8789
|
+
timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
8808
8790
|
replayed: z.boolean().optional(),
|
|
8809
8791
|
adcp_error: z.object({
|
|
8810
8792
|
code: z.literal("NOT_FOUND"),
|
|
@@ -8824,7 +8806,7 @@ const OperationalFailureSchema = /* @__PURE__ */ (() => z.object({
|
|
|
8824
8806
|
context_id: z.string().optional(),
|
|
8825
8807
|
context: ContextObjectSchema.optional(),
|
|
8826
8808
|
message: z.string().optional(),
|
|
8827
|
-
timestamp: z.
|
|
8809
|
+
timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
8828
8810
|
replayed: z.boolean().optional(),
|
|
8829
8811
|
adcp_error: ErrorSchema.optional(),
|
|
8830
8812
|
errors: z.array(ErrorSchema)
|
|
@@ -8943,8 +8925,8 @@ const ProvidePerformanceFeedbackSuccessSchema = /* @__PURE__ */ (() => z.object(
|
|
|
8943
8925
|
feedback_id: z.string().min(1).optional(),
|
|
8944
8926
|
application_status: z.union([z.literal("accepted"), z.literal("applied"), z.literal("not_applied")]).optional(),
|
|
8945
8927
|
status_reason: z.string().max(500).optional(),
|
|
8946
|
-
received_at: z.
|
|
8947
|
-
applied_at: z.
|
|
8928
|
+
received_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
8929
|
+
applied_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
8948
8930
|
sandbox: z.boolean().optional(),
|
|
8949
8931
|
context: ContextObjectSchema.optional(),
|
|
8950
8932
|
ext: ExtensionObjectSchema.optional()
|
|
@@ -9079,7 +9061,7 @@ const SyncAudiencesSuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
|
9079
9061
|
matched: z.int().min(0),
|
|
9080
9062
|
match_rate: z.number().min(0).max(1)
|
|
9081
9063
|
}).passthrough()).optional(),
|
|
9082
|
-
last_synced_at: z.
|
|
9064
|
+
last_synced_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
9083
9065
|
source: z.object({
|
|
9084
9066
|
kind: z.union([z.literal("dataset"), z.literal("platform_segment")]),
|
|
9085
9067
|
vendor: BrandReferenceSchema,
|
|
@@ -9141,8 +9123,8 @@ const SyncCatalogsSuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
|
9141
9123
|
status: CatalogItemStatusSchema,
|
|
9142
9124
|
reasons: z.array(z.string()).optional()
|
|
9143
9125
|
}).passthrough()).optional(),
|
|
9144
|
-
last_synced_at: z.
|
|
9145
|
-
next_fetch_at: z.
|
|
9126
|
+
last_synced_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
9127
|
+
next_fetch_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
9146
9128
|
changes: z.array(z.string()).optional(),
|
|
9147
9129
|
errors: z.array(ErrorSchema).optional(),
|
|
9148
9130
|
warnings: z.array(z.string()).optional()
|
|
@@ -9182,7 +9164,7 @@ const EvaluatorSpecSchema = /* @__PURE__ */ (() => z.object({
|
|
|
9182
9164
|
evaluator_id: z.string()
|
|
9183
9165
|
}).passthrough(), z.object({
|
|
9184
9166
|
agent_url: z.string().regex(new RegExp("^https://")).refine(adcpJsonSchemaUri, "Invalid URI")
|
|
9185
|
-
}).passthrough()])))();
|
|
9167
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
9186
9168
|
const RightsConstraintSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({
|
|
9187
9169
|
rights_id: z.string(),
|
|
9188
9170
|
rights_agent: z.object({
|
|
@@ -9712,8 +9694,8 @@ const GetPropertyListResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
9712
9694
|
list: PropertyListSchema,
|
|
9713
9695
|
identifiers: z.array(IdentifierSchema).optional(),
|
|
9714
9696
|
pagination: PaginationResponseSchema.optional(),
|
|
9715
|
-
resolved_at: z.
|
|
9716
|
-
cache_valid_until: z.
|
|
9697
|
+
resolved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
9698
|
+
cache_valid_until: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
9717
9699
|
coverage_gaps: z.record(z.string(), z.array(IdentifierSchema)).optional(),
|
|
9718
9700
|
ext: ExtensionObjectSchema.optional()
|
|
9719
9701
|
}).passthrough())();
|
|
@@ -9873,8 +9855,8 @@ const GetCollectionListResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
9873
9855
|
kind: CollectionKindSchema.optional()
|
|
9874
9856
|
}).passthrough()).optional(),
|
|
9875
9857
|
pagination: PaginationResponseSchema.optional(),
|
|
9876
|
-
resolved_at: z.
|
|
9877
|
-
cache_valid_until: z.
|
|
9858
|
+
resolved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
9859
|
+
cache_valid_until: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
9878
9860
|
coverage_gaps: z.record(z.string(), z.array(z.object({
|
|
9879
9861
|
type: DistributionIdentifierTypeSchema,
|
|
9880
9862
|
value: z.string()
|
|
@@ -10116,7 +10098,7 @@ const CreateContentStandardsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10116
10098
|
conflicting_standards_id: z.string().optional(),
|
|
10117
10099
|
context: ContextObjectSchema.optional(),
|
|
10118
10100
|
ext: ExtensionObjectSchema.optional()
|
|
10119
|
-
}).passthrough()])))();
|
|
10101
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
10120
10102
|
const UpdateContentStandardsRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
10121
10103
|
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
10104
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
@@ -10198,7 +10180,7 @@ const CalibrateContentResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10198
10180
|
errors: z.array(ErrorSchema),
|
|
10199
10181
|
context: ContextObjectSchema.optional(),
|
|
10200
10182
|
ext: ExtensionObjectSchema.optional()
|
|
10201
|
-
}).passthrough()])))();
|
|
10183
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
10202
10184
|
const ValidateContentDeliveryRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
10203
10185
|
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
10186
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
@@ -10206,7 +10188,7 @@ const ValidateContentDeliveryRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10206
10188
|
records: z.array(z.object({
|
|
10207
10189
|
record_id: z.string(),
|
|
10208
10190
|
media_buy_id: z.string().optional(),
|
|
10209
|
-
timestamp: z.
|
|
10191
|
+
timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
10210
10192
|
artifact: ArtifactSchema,
|
|
10211
10193
|
country: z.string().optional(),
|
|
10212
10194
|
channel: z.string().optional(),
|
|
@@ -10257,7 +10239,7 @@ const ValidateContentDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10257
10239
|
errors: z.array(ErrorSchema),
|
|
10258
10240
|
context: ContextObjectSchema.optional(),
|
|
10259
10241
|
ext: ExtensionObjectSchema.optional()
|
|
10260
|
-
}).passthrough()])))();
|
|
10242
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
10261
10243
|
const GetMediaBuyArtifactsRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
10262
10244
|
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
10245
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
@@ -10266,8 +10248,8 @@ const GetMediaBuyArtifactsRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10266
10248
|
package_ids: z.array(z.string()).optional(),
|
|
10267
10249
|
failures_only: z.boolean().optional(),
|
|
10268
10250
|
time_range: z.object({
|
|
10269
|
-
start: z.
|
|
10270
|
-
end: z.
|
|
10251
|
+
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
10252
|
+
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
10271
10253
|
}).passthrough().optional(),
|
|
10272
10254
|
pagination: z.object({
|
|
10273
10255
|
max_results: z.int().min(1).max(1e4).optional(),
|
|
@@ -10294,7 +10276,7 @@ const GetMediaBuyArtifactsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10294
10276
|
media_buy_id: z.string(),
|
|
10295
10277
|
artifacts: z.array(z.object({
|
|
10296
10278
|
record_id: z.string(),
|
|
10297
|
-
timestamp: z.
|
|
10279
|
+
timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
10298
10280
|
package_id: z.string().optional(),
|
|
10299
10281
|
artifact: ArtifactSchema,
|
|
10300
10282
|
country: z.string().optional(),
|
|
@@ -10318,7 +10300,7 @@ const GetMediaBuyArtifactsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10318
10300
|
errors: z.array(ErrorSchema),
|
|
10319
10301
|
context: ContextObjectSchema.optional(),
|
|
10320
10302
|
ext: ExtensionObjectSchema.optional()
|
|
10321
|
-
}).passthrough()])))();
|
|
10303
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
10322
10304
|
const GetCreativeFeaturesSuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
10323
10305
|
evaluation_id: z.string().min(1).optional(),
|
|
10324
10306
|
results: z.array(CreativeFeatureResultSchema),
|
|
@@ -10369,8 +10351,8 @@ const SyncPlansRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10369
10351
|
}).passthrough()).optional()
|
|
10370
10352
|
}).passthrough().optional(),
|
|
10371
10353
|
flight: z.object({
|
|
10372
|
-
start: z.
|
|
10373
|
-
end: z.
|
|
10354
|
+
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
10355
|
+
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
10374
10356
|
}).passthrough(),
|
|
10375
10357
|
countries: z.array(z.string()).optional(),
|
|
10376
10358
|
regions: z.array(z.string()).optional(),
|
|
@@ -10391,7 +10373,7 @@ const SyncPlansRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10391
10373
|
currency: z.string()
|
|
10392
10374
|
}).passthrough().optional(),
|
|
10393
10375
|
markets: z.array(z.string()).optional(),
|
|
10394
|
-
expires_at: z.
|
|
10376
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
10395
10377
|
}).passthrough()).optional(),
|
|
10396
10378
|
portfolio: z.object({
|
|
10397
10379
|
member_plan_ids: z.array(z.string()),
|
|
@@ -10486,12 +10468,12 @@ const ReportPlanAdjustmentRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10486
10468
|
currency: z.string().regex(/^[A-Z]{3}$/)
|
|
10487
10469
|
}).passthrough().optional(),
|
|
10488
10470
|
reason: z.string().min(1).max(1e3).optional(),
|
|
10489
|
-
effective_at: z.
|
|
10471
|
+
effective_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
10490
10472
|
evidence: z.object({
|
|
10491
10473
|
evidence_id: z.string().min(1).max(255),
|
|
10492
10474
|
evidence_type: z.union([z.literal("decommitment_agreement"), z.literal("refund_settlement"), z.literal("credit_note"), z.literal("makegood_agreement")]),
|
|
10493
10475
|
digest: z.string().regex(/^sha256:[a-f0-9]{64}$/),
|
|
10494
|
-
issued_at: z.
|
|
10476
|
+
issued_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
10495
10477
|
}).passthrough().optional(),
|
|
10496
10478
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
10497
10479
|
context: ContextObjectSchema.optional(),
|
|
@@ -10586,7 +10568,7 @@ const GetPlanAuditLogsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10586
10568
|
check_id: z.string(),
|
|
10587
10569
|
reason: z.string(),
|
|
10588
10570
|
resolution: z.string().optional(),
|
|
10589
|
-
resolved_at: z.
|
|
10571
|
+
resolved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
10590
10572
|
}).passthrough()).optional(),
|
|
10591
10573
|
drift_metrics: z.object({
|
|
10592
10574
|
escalation_rate: z.number().min(0).max(1).optional(),
|
|
@@ -10605,7 +10587,7 @@ const GetPlanAuditLogsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10605
10587
|
entries: z.array(z.object({
|
|
10606
10588
|
id: z.string(),
|
|
10607
10589
|
type: z.union([z.literal("check"), z.literal("outcome"), z.literal("adjustment")]),
|
|
10608
|
-
timestamp: z.
|
|
10590
|
+
timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
10609
10591
|
plan_id: z.string().optional(),
|
|
10610
10592
|
caller: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
10611
10593
|
tool: z.string().optional(),
|
|
@@ -10630,13 +10612,13 @@ const GetPlanAuditLogsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10630
10612
|
statement_id: z.string(),
|
|
10631
10613
|
statement_digest: z.string().regex(/^sha256:[a-f0-9]{64}$/),
|
|
10632
10614
|
sequence: z.int().min(1),
|
|
10633
|
-
issued_at: z.
|
|
10615
|
+
issued_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
10634
10616
|
seller_reference: z.string(),
|
|
10635
10617
|
cumulative_spend: z.number().min(0),
|
|
10636
10618
|
currency: z.string().regex(/^[A-Z]{3}$/),
|
|
10637
10619
|
reporting_period: z.object({
|
|
10638
|
-
start: z.
|
|
10639
|
-
end: z.
|
|
10620
|
+
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
10621
|
+
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
10640
10622
|
}).passthrough(),
|
|
10641
10623
|
canonical_payload: z.object({
|
|
10642
10624
|
seller_reference: z.string(),
|
|
@@ -10654,19 +10636,19 @@ const GetPlanAuditLogsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10654
10636
|
}).passthrough().optional(),
|
|
10655
10637
|
headroom_restored: z.number().min(0).optional(),
|
|
10656
10638
|
reason: z.string().optional(),
|
|
10657
|
-
effective_at: z.
|
|
10639
|
+
effective_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
10658
10640
|
committed_budget: z.number().optional(),
|
|
10659
10641
|
reported_committed_budget: z.number().min(0).optional(),
|
|
10660
10642
|
seller_reference: z.string().optional(),
|
|
10661
10643
|
delivery: z.object({
|
|
10662
10644
|
observation_id: z.string().min(1).max(255).optional(),
|
|
10663
10645
|
source: z.union([z.literal("seller_statement_copy"), z.literal("buyer_measurement")]).optional(),
|
|
10664
|
-
observed_at: z.
|
|
10646
|
+
observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
10665
10647
|
seller_statement_id: z.string().optional(),
|
|
10666
10648
|
seller_statement_digest: z.string().regex(/^sha256:[a-f0-9]{64}$/).optional(),
|
|
10667
10649
|
reporting_period: z.object({
|
|
10668
|
-
start: z.
|
|
10669
|
-
end: z.
|
|
10650
|
+
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
10651
|
+
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
10670
10652
|
}).passthrough().optional(),
|
|
10671
10653
|
cumulative_spend: z.number().min(0).optional(),
|
|
10672
10654
|
currency: z.string().regex(/^[A-Z]{3}$/).optional(),
|
|
@@ -10690,10 +10672,10 @@ const GetPlanAuditLogsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10690
10672
|
evidence_id: z.string(),
|
|
10691
10673
|
evidence_type: z.union([z.literal("decommitment_agreement"), z.literal("refund_settlement"), z.literal("credit_note"), z.literal("makegood_agreement")]),
|
|
10692
10674
|
digest: z.string().regex(/^sha256:[a-f0-9]{64}$/),
|
|
10693
|
-
issued_at: z.
|
|
10675
|
+
issued_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
10694
10676
|
}).passthrough().optional(),
|
|
10695
10677
|
reviewed_by: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
10696
|
-
reviewed_at: z.
|
|
10678
|
+
reviewed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
10697
10679
|
review_reason: z.string().optional()
|
|
10698
10680
|
}).passthrough()).optional(),
|
|
10699
10681
|
governed_actions: z.array(z.object({
|
|
@@ -10709,8 +10691,8 @@ const GetPlanAuditLogsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10709
10691
|
seller_reported_spend: z.number().min(0).optional(),
|
|
10710
10692
|
buyer_observed_spend: z.number().min(0).optional(),
|
|
10711
10693
|
delivery_reporting_period: z.object({
|
|
10712
|
-
start: z.
|
|
10713
|
-
end: z.
|
|
10694
|
+
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
10695
|
+
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
10714
10696
|
}).passthrough().optional(),
|
|
10715
10697
|
conservative_exposure: z.number().min(0).optional(),
|
|
10716
10698
|
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 +10728,17 @@ const CheckGovernanceResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10746
10728
|
reason: z.string()
|
|
10747
10729
|
}).passthrough()).optional(),
|
|
10748
10730
|
consultation_context: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]+$/).optional(),
|
|
10749
|
-
expires_at: z.
|
|
10750
|
-
next_check: z.
|
|
10731
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
10732
|
+
next_check: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
10751
10733
|
delivery_statement: z.object({
|
|
10752
10734
|
statement_id: z.string(),
|
|
10753
10735
|
statement_digest: z.string().regex(/^sha256:[a-f0-9]{64}$/),
|
|
10754
10736
|
sequence: z.int().min(1),
|
|
10755
|
-
issued_at: z.
|
|
10737
|
+
issued_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
10756
10738
|
seller_reference: z.string(),
|
|
10757
10739
|
reporting_period: z.object({
|
|
10758
|
-
start: z.
|
|
10759
|
-
end: z.
|
|
10740
|
+
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
10741
|
+
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
10760
10742
|
}).passthrough(),
|
|
10761
10743
|
cumulative_spend: z.number().min(0),
|
|
10762
10744
|
currency: z.string().regex(/^[A-Z]{3}$/),
|
|
@@ -10805,13 +10787,13 @@ const SIGetOfferingResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10805
10787
|
available: z.boolean(),
|
|
10806
10788
|
offering_token: z.string().optional(),
|
|
10807
10789
|
ttl_seconds: z.int().min(0).optional(),
|
|
10808
|
-
checked_at: z.
|
|
10790
|
+
checked_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
10809
10791
|
offering: z.object({
|
|
10810
10792
|
offering_id: z.string().optional(),
|
|
10811
10793
|
title: z.string().optional(),
|
|
10812
10794
|
summary: z.string().optional(),
|
|
10813
10795
|
tagline: z.string().optional(),
|
|
10814
|
-
expires_at: z.
|
|
10796
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
10815
10797
|
availability_status: OfferingAvailabilityStatusSchema.optional(),
|
|
10816
10798
|
price_hint: z.string().optional(),
|
|
10817
10799
|
image_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
@@ -10972,7 +10954,7 @@ const SITerminateSessionResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10972
10954
|
checkout_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
10973
10955
|
checkout_token: z.string().optional(),
|
|
10974
10956
|
payload: z.object({}).passthrough().optional(),
|
|
10975
|
-
expires_at: z.
|
|
10957
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
10976
10958
|
}).passthrough().optional(),
|
|
10977
10959
|
follow_up: z.object({
|
|
10978
10960
|
action: z.union([z.literal("save_for_later"), z.literal("set_reminder"), z.literal("subscribe_updates"), z.literal("none")]).optional(),
|
|
@@ -11133,9 +11115,9 @@ const GetTaskStatusResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11133
11115
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
11134
11116
|
task_type: TaskTypeSchema,
|
|
11135
11117
|
protocol: AdCPProtocolSchema,
|
|
11136
|
-
created_at: z.
|
|
11137
|
-
updated_at: z.
|
|
11138
|
-
completed_at: z.
|
|
11118
|
+
created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
11119
|
+
updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
11120
|
+
completed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11139
11121
|
has_webhook: z.boolean().optional(),
|
|
11140
11122
|
progress: z.object({
|
|
11141
11123
|
percentage: z.number().min(0).max(100).optional(),
|
|
@@ -11153,7 +11135,7 @@ const GetTaskStatusResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11153
11135
|
}).passthrough().optional()
|
|
11154
11136
|
}).passthrough().optional(),
|
|
11155
11137
|
history: z.array(z.object({
|
|
11156
|
-
timestamp: z.
|
|
11138
|
+
timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
11157
11139
|
type: z.union([z.literal("request"), z.literal("response")]),
|
|
11158
11140
|
data: z.object({}).passthrough()
|
|
11159
11141
|
}).passthrough()).optional(),
|
|
@@ -11171,10 +11153,10 @@ const ListTasksRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11171
11153
|
statuses: z.array(TaskStatusSchema).optional(),
|
|
11172
11154
|
task_type: TaskTypeSchema.optional(),
|
|
11173
11155
|
task_types: z.array(TaskTypeSchema).optional(),
|
|
11174
|
-
created_after: z.
|
|
11175
|
-
created_before: z.
|
|
11176
|
-
updated_after: z.
|
|
11177
|
-
updated_before: z.
|
|
11156
|
+
created_after: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11157
|
+
created_before: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11158
|
+
updated_after: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11159
|
+
updated_before: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11178
11160
|
task_ids: z.array(z.string()).max(100).optional(),
|
|
11179
11161
|
context_contains: z.string().optional(),
|
|
11180
11162
|
has_webhook: z.boolean().optional()
|
|
@@ -11222,9 +11204,9 @@ const ListTasksResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11222
11204
|
task_type: TaskTypeSchema,
|
|
11223
11205
|
domain: z.union([z.literal("media-buy"), z.literal("signals"), z.literal("creative")]),
|
|
11224
11206
|
status: TaskStatusSchema,
|
|
11225
|
-
created_at: z.
|
|
11226
|
-
updated_at: z.
|
|
11227
|
-
completed_at: z.
|
|
11207
|
+
created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
11208
|
+
updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
11209
|
+
completed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11228
11210
|
has_webhook: z.boolean().optional()
|
|
11229
11211
|
}).passthrough()),
|
|
11230
11212
|
pagination: PaginationResponseSchema,
|
|
@@ -11368,15 +11350,15 @@ const ListAccountChangesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11368
11350
|
changes: z.array(AccountChangeSchema).max(100).optional(),
|
|
11369
11351
|
cursor: z.string().min(1).max(4096).optional(),
|
|
11370
11352
|
has_more: z.boolean().optional(),
|
|
11371
|
-
available_since: z.
|
|
11372
|
-
generated_at: z.
|
|
11353
|
+
available_since: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11354
|
+
generated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11373
11355
|
source_coverage: z.array(z.object({
|
|
11374
11356
|
source_id: z.string().max(255),
|
|
11375
11357
|
kind: z.union([z.literal("seller"), z.literal("connected_platform")]),
|
|
11376
11358
|
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.
|
|
11359
|
+
coverage_start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11360
|
+
observed_through: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11361
|
+
last_successful_sync_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11380
11362
|
stale_after_seconds: z.int().min(1).max(2592e3).optional(),
|
|
11381
11363
|
resource_types: z.array(z.string()).max(50)
|
|
11382
11364
|
}).passthrough()).max(50).optional(),
|
|
@@ -11386,15 +11368,15 @@ const ListAccountChangesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11386
11368
|
changes: z.array(AccountChangeSchema).max(100),
|
|
11387
11369
|
cursor: z.string().min(1).max(4096),
|
|
11388
11370
|
has_more: z.boolean(),
|
|
11389
|
-
available_since: z.
|
|
11390
|
-
generated_at: z.
|
|
11371
|
+
available_since: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
11372
|
+
generated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
11391
11373
|
source_coverage: z.array(z.object({
|
|
11392
11374
|
source_id: z.string().max(255),
|
|
11393
11375
|
kind: z.union([z.literal("seller"), z.literal("connected_platform")]),
|
|
11394
11376
|
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.
|
|
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(),
|
|
11398
11380
|
stale_after_seconds: z.int().min(1).max(2592e3).optional(),
|
|
11399
11381
|
resource_types: z.array(z.string()).max(50)
|
|
11400
11382
|
}).passthrough()).max(50).optional(),
|
|
@@ -11406,15 +11388,15 @@ const ListAccountChangesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11406
11388
|
changes: z.array(AccountChangeSchema).max(100).optional(),
|
|
11407
11389
|
cursor: z.string().min(1).max(4096).optional(),
|
|
11408
11390
|
has_more: z.boolean().optional(),
|
|
11409
|
-
available_since: z.
|
|
11410
|
-
generated_at: z.
|
|
11391
|
+
available_since: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11392
|
+
generated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11411
11393
|
source_coverage: z.array(z.object({
|
|
11412
11394
|
source_id: z.string().max(255),
|
|
11413
11395
|
kind: z.union([z.literal("seller"), z.literal("connected_platform")]),
|
|
11414
11396
|
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.
|
|
11397
|
+
coverage_start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11398
|
+
observed_through: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11399
|
+
last_successful_sync_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11418
11400
|
stale_after_seconds: z.int().min(1).max(2592e3).optional(),
|
|
11419
11401
|
resource_types: z.array(z.string()).max(50)
|
|
11420
11402
|
}).passthrough()).max(50).optional(),
|
|
@@ -11422,7 +11404,7 @@ const ListAccountChangesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11422
11404
|
context: ContextObjectSchema.optional(),
|
|
11423
11405
|
ext: ExtensionObjectSchema.optional(),
|
|
11424
11406
|
status: z.literal("failed")
|
|
11425
|
-
}).passthrough()])))();
|
|
11407
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
11426
11408
|
const ListAccountsRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
11427
11409
|
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
11410
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
@@ -11503,7 +11485,7 @@ const ReportUsageRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11503
11485
|
build_variant_id: z.string().optional(),
|
|
11504
11486
|
property_list_id: z.string().optional(),
|
|
11505
11487
|
final: z.boolean().optional(),
|
|
11506
|
-
finalized_at: z.
|
|
11488
|
+
finalized_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
11507
11489
|
measurement_window: z.string().max(50).optional()
|
|
11508
11490
|
}).passthrough()),
|
|
11509
11491
|
context: ContextObjectSchema.optional(),
|
|
@@ -11701,7 +11683,7 @@ const RawAttestationSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11701
11683
|
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
11684
|
payload: z.object({}).passthrough(),
|
|
11703
11685
|
payload_length: z.int().min(0),
|
|
11704
|
-
timestamp: z.
|
|
11686
|
+
timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
11705
11687
|
status_code: z.int().min(100).max(599).optional()
|
|
11706
11688
|
}).passthrough())();
|
|
11707
11689
|
const DigestAttestationSchema = /* @__PURE__ */ (() => z.object({
|
|
@@ -11719,7 +11701,7 @@ const DigestAttestationSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11719
11701
|
identifier_value_sha256: z.string().regex(/^[a-f0-9]{64}$/),
|
|
11720
11702
|
found: z.boolean()
|
|
11721
11703
|
}).passthrough()).max(64).optional(),
|
|
11722
|
-
timestamp: z.
|
|
11704
|
+
timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
11723
11705
|
status_code: z.int().min(100).max(599).optional()
|
|
11724
11706
|
}).passthrough())();
|
|
11725
11707
|
const IndividualImageAssetSchema = /* @__PURE__ */ (() => BaseIndividualAssetSchema.merge(z.object({
|
|
@@ -11768,7 +11750,7 @@ const BudgetChangeConstraintsSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11768
11750
|
min_result_amount: MoneySchema
|
|
11769
11751
|
}).passthrough(), z.object({
|
|
11770
11752
|
max_result_amount: MoneySchema
|
|
11771
|
-
}).passthrough()])))();
|
|
11753
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
11772
11754
|
const MediaBuyChangeTermConstraintsSchema = /* @__PURE__ */ (() => z.union([BudgetChangeConstraintsSchema, FlightChangeConstraintsSchema, PackageCountConstraintsSchema, EffectiveTimingConstraintsSchema]))();
|
|
11773
11755
|
const ReportingFileTransferSchema = /* @__PURE__ */ (() => z.object({
|
|
11774
11756
|
pattern: z.literal("file_transfer"),
|
|
@@ -11784,9 +11766,9 @@ const SelectedPlacementsSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11784
11766
|
}).passthrough())();
|
|
11785
11767
|
const DisplayTagAssetSchema = /* @__PURE__ */ (() => z.object({
|
|
11786
11768
|
asset_type: z.literal("display_tag"),
|
|
11787
|
-
macro_declarations: z.array(MacroDeclarationSchema).optional(),
|
|
11769
|
+
macro_declarations: z.array(MacroDeclarationSchema).min(1).optional(),
|
|
11788
11770
|
provenance: ProvenanceSchema.optional()
|
|
11789
|
-
}).passthrough().and(z.union([TagURLSchema, InlineMarkupSchema, PairedRedirectSchema])))();
|
|
11771
|
+
}).passthrough().and(z.union([TagURLSchema, InlineMarkupSchema, PairedRedirectSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
11790
11772
|
const DAASTAssetSchema = /* @__PURE__ */ (() => z.object({
|
|
11791
11773
|
asset_type: z.literal("daast"),
|
|
11792
11774
|
daast_version: DAASTVersionSchema.optional(),
|
|
@@ -11795,7 +11777,7 @@ const DAASTAssetSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11795
11777
|
companion_ads: z.boolean().optional(),
|
|
11796
11778
|
transcript_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
11797
11779
|
provenance: ProvenanceSchema.optional(),
|
|
11798
|
-
macro_declarations: z.array(MacroDeclarationSchema).optional()
|
|
11780
|
+
macro_declarations: z.array(MacroDeclarationSchema).min(1).optional()
|
|
11799
11781
|
}).passthrough().and(z.union([z.object({
|
|
11800
11782
|
delivery_type: z.literal("url"),
|
|
11801
11783
|
url: MacroBearingURL5Schema,
|
|
@@ -11803,7 +11785,7 @@ const DAASTAssetSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11803
11785
|
location: z.object({
|
|
11804
11786
|
field: z.literal("url").optional()
|
|
11805
11787
|
}).passthrough().optional()
|
|
11806
|
-
}).passthrough()).optional()
|
|
11788
|
+
}).passthrough()).min(1).optional()
|
|
11807
11789
|
}).passthrough(), z.object({
|
|
11808
11790
|
delivery_type: z.literal("inline"),
|
|
11809
11791
|
content: z.string(),
|
|
@@ -11811,8 +11793,8 @@ const DAASTAssetSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11811
11793
|
location: z.object({
|
|
11812
11794
|
field: z.literal("content").optional()
|
|
11813
11795
|
}).passthrough().optional()
|
|
11814
|
-
}).passthrough()).optional()
|
|
11815
|
-
}).passthrough()])))();
|
|
11796
|
+
}).passthrough()).min(1).optional()
|
|
11797
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
11816
11798
|
const CardAssetSchema = /* @__PURE__ */ (() => z.object({
|
|
11817
11799
|
asset_type: z.literal("card"),
|
|
11818
11800
|
media: z.union([ImageAssetSchema, VideoAssetSchema]),
|
|
@@ -11832,7 +11814,7 @@ const PixelTrackerAssetSchema = /* @__PURE__ */ (() => z.object({}).passthrough(
|
|
|
11832
11814
|
location: z.object({
|
|
11833
11815
|
field: z.literal("url").optional()
|
|
11834
11816
|
}).passthrough().optional()
|
|
11835
|
-
}).passthrough())).optional(),
|
|
11817
|
+
}).passthrough())).min(1).optional(),
|
|
11836
11818
|
custom_event_name: z.string().optional(),
|
|
11837
11819
|
provenance: ProvenanceSchema.optional()
|
|
11838
11820
|
}).passthrough()))();
|
|
@@ -11844,7 +11826,7 @@ const VASTTrackerAssetSchema = /* @__PURE__ */ (() => z.object({}).passthrough()
|
|
|
11844
11826
|
location: z.object({
|
|
11845
11827
|
field: z.literal("url").optional()
|
|
11846
11828
|
}).passthrough().optional()
|
|
11847
|
-
}).passthrough())).optional(),
|
|
11829
|
+
}).passthrough())).min(1).optional(),
|
|
11848
11830
|
offset: z.string().regex(new RegExp("^(\\d{2}:[0-5]\\d:[0-5]\\d(\\.\\d{3})?|(100|\\d{1,2})%)$")).optional(),
|
|
11849
11831
|
target: z.union([z.literal("linear"), z.literal("non_linear"), z.literal("companion")]).optional(),
|
|
11850
11832
|
provenance: ProvenanceSchema.optional()
|
|
@@ -11857,7 +11839,7 @@ const DAASTTrackerAssetSchema = /* @__PURE__ */ (() => z.object({}).passthrough(
|
|
|
11857
11839
|
location: z.object({
|
|
11858
11840
|
field: z.literal("url").optional()
|
|
11859
11841
|
}).passthrough().optional()
|
|
11860
|
-
}).passthrough())).optional(),
|
|
11842
|
+
}).passthrough())).min(1).optional(),
|
|
11861
11843
|
offset: z.string().regex(new RegExp("^(\\d{2}:[0-5]\\d:[0-5]\\d(\\.\\d{3})?|(100|\\d{1,2})%)$")).optional(),
|
|
11862
11844
|
target: z.union([z.literal("linear"), z.literal("companion")]).optional(),
|
|
11863
11845
|
provenance: ProvenanceSchema.optional()
|
|
@@ -11907,8 +11889,8 @@ const ProductFormatDeclarationSchema = /* @__PURE__ */ (() => z.object({}).passt
|
|
|
11907
11889
|
format_shape: z.string().optional(),
|
|
11908
11890
|
v1_format_ref: z.array(FormatReferenceStructuredObjectSchema).optional(),
|
|
11909
11891
|
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({
|
|
11892
|
+
}).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.")))();
|
|
11893
|
+
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
11894
|
kind: z.union([z.literal("publisher_ref"), z.literal("seller_inline")]),
|
|
11913
11895
|
placement_id: z.string(),
|
|
11914
11896
|
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 +12069,7 @@ const GetCreativeFeaturesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
12087
12069
|
payload: z.object({}).passthrough().optional(),
|
|
12088
12070
|
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
12071
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
12090
|
-
}).passthrough().and(z.union([GetCreativeFeaturesSuccessSchema, GetCreativeFeaturesErrorSchema, GetCreativeFeaturesSubmittedSchema])))();
|
|
12072
|
+
}).passthrough().and(z.union([GetCreativeFeaturesSuccessSchema, GetCreativeFeaturesErrorSchema, GetCreativeFeaturesSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
12091
12073
|
const SyncCatalogsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
12092
12074
|
context_id: z.string().optional(),
|
|
12093
12075
|
context: ContextObjectSchema.optional(),
|
|
@@ -12102,7 +12084,7 @@ const SyncCatalogsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
12102
12084
|
payload: z.object({}).passthrough().optional(),
|
|
12103
12085
|
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
12086
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
12105
|
-
}).passthrough().and(z.union([SyncCatalogsSuccessSchema, SyncCatalogsErrorSchema, SyncCatalogsSubmittedSchema])))();
|
|
12087
|
+
}).passthrough().and(z.union([SyncCatalogsSuccessSchema, SyncCatalogsErrorSchema, SyncCatalogsSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
12106
12088
|
const ProductSchema = /* @__PURE__ */ (() => z.object({
|
|
12107
12089
|
product_id: z.string(),
|
|
12108
12090
|
name: z.string(),
|
|
@@ -12281,7 +12263,7 @@ const CanonicalProductPlacementSchema = /* @__PURE__ */ (() => z.object({
|
|
|
12281
12263
|
kind: z.literal("publisher_ref")
|
|
12282
12264
|
}).passthrough(), z.object({
|
|
12283
12265
|
kind: z.literal("seller_inline")
|
|
12284
|
-
}).passthrough()])))();
|
|
12266
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
12285
12267
|
const TargetingOverlaySupport1Schema = /* @__PURE__ */ (() => TargetingOverlaySupportSchema)();
|
|
12286
12268
|
const CanonicalProductActionSchema = /* @__PURE__ */ (() => z.object({
|
|
12287
12269
|
action: CanonicalMediaBuyActionNameSchema,
|
|
@@ -12291,9 +12273,10 @@ const CanonicalProductActionSchema = /* @__PURE__ */ (() => z.object({
|
|
|
12291
12273
|
constraints: MediaBuyChangeTermConstraintsSchema.optional(),
|
|
12292
12274
|
terms_ref: z.string().optional()
|
|
12293
12275
|
}).passthrough())();
|
|
12294
|
-
const
|
|
12276
|
+
const AssetVariantSchemaOptionsSource = /* @__PURE__ */ (() => z.union([ImageAssetSchema, VideoAssetSchema, AudioAssetSchema, VASTAssetSchema, DisplayTagAssetSchema, TextAssetSchema, URLAssetSchema, HTMLAssetSchema, JavaScriptAssetSchema, ZipAssetSchema, WebhookAssetSchema, CSSAssetSchema, DAASTAssetSchema, MarkdownAssetSchema, BriefAssetSchema, CatalogAssetSchema, PublishedPostAssetSchema, CardAssetSchema, PixelTrackerAssetSchema, VASTTrackerAssetSchema, DAASTTrackerAssetSchema]))();
|
|
12277
|
+
const AssetVariantSchema = /* @__PURE__ */ (() => AssetVariantSchemaOptionsSource)();
|
|
12295
12278
|
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) => {
|
|
12279
|
+
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
12280
|
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
12281
|
const { errors, failed } = schemas.reduce(
|
|
12299
12282
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
@@ -12394,7 +12377,7 @@ const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
|
|
|
12394
12377
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
12395
12378
|
});
|
|
12396
12379
|
}
|
|
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.")];
|
|
12380
|
+
}).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
12381
|
const { errors, failed } = schemas.reduce(
|
|
12399
12382
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
12400
12383
|
errors: [...errors2, ...result.error.issues],
|
|
@@ -12469,7 +12452,7 @@ const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
|
|
|
12469
12452
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
12470
12453
|
});
|
|
12471
12454
|
}
|
|
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) => {
|
|
12455
|
+
}).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
12456
|
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
12457
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
12475
12458
|
({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
|
|
@@ -12519,7 +12502,7 @@ const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
|
|
|
12519
12502
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
12520
12503
|
});
|
|
12521
12504
|
}
|
|
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) => {
|
|
12505
|
+
}).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
12506
|
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
12507
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
12525
12508
|
({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
|
|
@@ -12569,7 +12552,7 @@ const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
|
|
|
12569
12552
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
12570
12553
|
});
|
|
12571
12554
|
}
|
|
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).")];
|
|
12555
|
+
}).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
12556
|
const { errors, failed } = schemas.reduce(
|
|
12574
12557
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
12575
12558
|
errors: [...errors2, ...result.error.issues],
|
|
@@ -12593,7 +12576,7 @@ const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
|
|
|
12593
12576
|
message: "Invalid input: Should pass single schema. Passed " + passed
|
|
12594
12577
|
});
|
|
12595
12578
|
}
|
|
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) => {
|
|
12579
|
+
}).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
12580
|
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
12581
|
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
12582
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
@@ -12817,7 +12800,7 @@ const CreativeManifestSchema = /* @__PURE__ */ (() => z.object({}).passthrough()
|
|
|
12817
12800
|
const BuildCreativeMultiSuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
12818
12801
|
creative_manifests: z.array(CreativeManifestSchema),
|
|
12819
12802
|
sandbox: z.boolean().optional(),
|
|
12820
|
-
expires_at: z.
|
|
12803
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
12821
12804
|
preview: z.object({
|
|
12822
12805
|
previews: z.array(z.object({
|
|
12823
12806
|
preview_id: z.string(),
|
|
@@ -12831,7 +12814,7 @@ const BuildCreativeMultiSuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
|
12831
12814
|
}).passthrough()
|
|
12832
12815
|
}).passthrough()),
|
|
12833
12816
|
interactive_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
12834
|
-
expires_at: z.
|
|
12817
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
12835
12818
|
}).passthrough().optional(),
|
|
12836
12819
|
preview_error: ErrorSchema.optional(),
|
|
12837
12820
|
pricing_option_id: z.string().optional(),
|
|
@@ -12882,7 +12865,7 @@ const BuildCreativeVariantSuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
|
12882
12865
|
budget_status: z.union([z.literal("complete"), z.literal("capped")]).optional(),
|
|
12883
12866
|
errors: z.array(ErrorSchema).optional(),
|
|
12884
12867
|
sandbox: z.boolean().optional(),
|
|
12885
|
-
expires_at: z.
|
|
12868
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
12886
12869
|
context: ContextObjectSchema.optional(),
|
|
12887
12870
|
ext: ExtensionObjectSchema.optional()
|
|
12888
12871
|
}).passthrough())();
|
|
@@ -12895,13 +12878,13 @@ const PreviewCreativeVariantResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
12895
12878
|
renders: z.array(PreviewRenderSchema)
|
|
12896
12879
|
}).passthrough()),
|
|
12897
12880
|
manifest: CreativeManifestSchema.optional(),
|
|
12898
|
-
expires_at: z.
|
|
12881
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
12899
12882
|
context: ContextObjectSchema.optional(),
|
|
12900
12883
|
ext: ExtensionObjectSchema.optional()
|
|
12901
12884
|
}).passthrough())();
|
|
12902
12885
|
const AAODirectoryAgentPublishersInverseLookupResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
12903
12886
|
agent_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"),
|
|
12904
|
-
directory_indexed_at: z.
|
|
12887
|
+
directory_indexed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").nullable(),
|
|
12905
12888
|
publishers: z.array(PublisherEntrySchema),
|
|
12906
12889
|
next_cursor: z.string().optional().nullable()
|
|
12907
12890
|
}).passthrough())();
|
|
@@ -12936,7 +12919,7 @@ const CreativeApprovalResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
12936
12919
|
payload: z.object({}).passthrough().optional(),
|
|
12937
12920
|
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
12921
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
12939
|
-
}).passthrough().and(z.union([CreativeApprovedSchema, CreativeRejectedSchema, CreativePendingReviewSchema, CreativeApprovalErrorSchema])))();
|
|
12922
|
+
}).passthrough().and(z.union([CreativeApprovedSchema, CreativeRejectedSchema, CreativePendingReviewSchema, CreativeApprovalErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
12940
12923
|
const GetBrandIdentityResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
12941
12924
|
context_id: z.string().optional(),
|
|
12942
12925
|
context: ContextObjectSchema.optional(),
|
|
@@ -12951,7 +12934,7 @@ const GetBrandIdentityResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
12951
12934
|
payload: z.object({}).passthrough().optional(),
|
|
12952
12935
|
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
12936
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
12954
|
-
}).passthrough().and(z.union([GetBrandIdentitySuccessSchema, GetBrandIdentityErrorSchema])))();
|
|
12937
|
+
}).passthrough().and(z.union([GetBrandIdentitySuccessSchema, GetBrandIdentityErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
12955
12938
|
const GetRightsSuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
12956
12939
|
rights: z.array(z.object({
|
|
12957
12940
|
rights_id: z.string(),
|
|
@@ -12996,7 +12979,7 @@ const UpdateRightsSuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
|
12996
12979
|
generation_credentials: z.array(GenerationCredentialSchema),
|
|
12997
12980
|
rights_constraint: RightsConstraintSchema.and(z.object({}).passthrough()),
|
|
12998
12981
|
paused: z.boolean().optional(),
|
|
12999
|
-
implementation_date: z.
|
|
12982
|
+
implementation_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
|
|
13000
12983
|
context: ContextObjectSchema.optional(),
|
|
13001
12984
|
ext: ExtensionObjectSchema.optional()
|
|
13002
12985
|
}).passthrough())();
|
|
@@ -13055,10 +13038,10 @@ const ArtifactWebhookPayloadSchema = /* @__PURE__ */ (() => z.object({
|
|
|
13055
13038
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
13056
13039
|
media_buy_id: z.string(),
|
|
13057
13040
|
batch_id: z.string(),
|
|
13058
|
-
timestamp: z.
|
|
13041
|
+
timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
13059
13042
|
artifacts: z.array(z.object({
|
|
13060
13043
|
artifact: ArtifactSchema,
|
|
13061
|
-
delivered_at: z.
|
|
13044
|
+
delivered_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
13062
13045
|
impression_id: z.string().optional(),
|
|
13063
13046
|
package_id: z.string().optional()
|
|
13064
13047
|
}).passthrough()),
|
|
@@ -13236,8 +13219,8 @@ const FlightItemSchema = /* @__PURE__ */ (() => z.object({
|
|
|
13236
13219
|
airline: z.string().optional(),
|
|
13237
13220
|
price: PriceSchema.optional(),
|
|
13238
13221
|
description: z.string().optional(),
|
|
13239
|
-
departure_time: z.
|
|
13240
|
-
arrival_time: z.
|
|
13222
|
+
departure_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
13223
|
+
arrival_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
13241
13224
|
image_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
13242
13225
|
url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
13243
13226
|
tags: z.array(z.string()).optional(),
|
|
@@ -13336,7 +13319,7 @@ const HotelItemSchema = /* @__PURE__ */ (() => z.object({
|
|
|
13336
13319
|
const IndicatorBearingResourceStateSchema = /* @__PURE__ */ (() => z.object({
|
|
13337
13320
|
indicators: z.array(IndicatorSchema).optional(),
|
|
13338
13321
|
indicator_types_evaluated: z.array(IndicatorTypeSchema).optional(),
|
|
13339
|
-
indicators_as_of: z.
|
|
13322
|
+
indicators_as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
13340
13323
|
indicators_evaluated_scope: z.array(IndicatorScopeSchema).optional()
|
|
13341
13324
|
}).passthrough())();
|
|
13342
13325
|
const InstallmentDeliveryMetricsSchema = /* @__PURE__ */ (() => DeliveryMetricsSchema.merge(z.object({
|
|
@@ -13385,8 +13368,8 @@ const OfferingSchema = /* @__PURE__ */ (() => z.object({
|
|
|
13385
13368
|
name: z.string(),
|
|
13386
13369
|
description: z.string().optional(),
|
|
13387
13370
|
tagline: z.string().optional(),
|
|
13388
|
-
valid_from: z.
|
|
13389
|
-
valid_to: z.
|
|
13371
|
+
valid_from: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
13372
|
+
valid_to: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
13390
13373
|
checkout_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
13391
13374
|
landing_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
13392
13375
|
assets: z.array(OfferingAssetGroupSchema).optional(),
|
|
@@ -13423,7 +13406,7 @@ const InlineDeclarationSchema = /* @__PURE__ */ (() => z.object({}).passthrough(
|
|
|
13423
13406
|
format_shape: z.string().optional(),
|
|
13424
13407
|
v1_format_ref: z.array(FormatReferenceStructuredObjectSchema).optional(),
|
|
13425
13408
|
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])))();
|
|
13409
|
+
}).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
13410
|
const PublisherDOOHPlacementAttributesSchema = /* @__PURE__ */ (() => z.object({
|
|
13428
13411
|
slot_duration_seconds: z.int().min(1).optional(),
|
|
13429
13412
|
loop_duration_seconds: z.int().min(1).optional(),
|
|
@@ -13647,14 +13630,14 @@ const AuthorizationPayloadSchema = /* @__PURE__ */ (() => z.object({
|
|
|
13647
13630
|
delegation_type: z.union([z.literal("direct"), z.literal("delegated"), z.literal("ad_network")]).optional(),
|
|
13648
13631
|
exclusive: z.boolean().optional(),
|
|
13649
13632
|
signing_keys: z.array(AgentSigningKeySchema).optional(),
|
|
13650
|
-
effective_from: z.
|
|
13651
|
-
effective_until: z.
|
|
13633
|
+
effective_from: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
13634
|
+
effective_until: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
13652
13635
|
evidence: z.union([z.literal("adagents_json"), z.literal("agent_claim"), z.literal("community"), z.literal("override")]).optional(),
|
|
13653
13636
|
disputed: z.boolean().optional(),
|
|
13654
13637
|
created_by: z.string().optional().nullable(),
|
|
13655
|
-
expires_at: z.
|
|
13656
|
-
created_at: z.
|
|
13657
|
-
updated_at: z.
|
|
13638
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
|
|
13639
|
+
created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
|
|
13640
|
+
updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
|
|
13658
13641
|
override_applied: z.boolean().optional(),
|
|
13659
13642
|
override_reason: z.string().optional().nullable()
|
|
13660
13643
|
}).passthrough())();
|
|
@@ -13665,7 +13648,7 @@ const RegistryEventSchema = /* @__PURE__ */ (() => z.object({
|
|
|
13665
13648
|
entity_id: z.string(),
|
|
13666
13649
|
payload: z.object({}).passthrough(),
|
|
13667
13650
|
actor: z.string(),
|
|
13668
|
-
created_at: z.
|
|
13651
|
+
created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
13669
13652
|
}).passthrough().and(z.union([z.object({
|
|
13670
13653
|
event_type: z.literal("property.created"),
|
|
13671
13654
|
entity_type: z.literal("property").optional(),
|
|
@@ -13687,14 +13670,14 @@ const RegistryEventSchema = /* @__PURE__ */ (() => z.object({
|
|
|
13687
13670
|
entity_type: z.literal("property").optional(),
|
|
13688
13671
|
payload: z.object({
|
|
13689
13672
|
property_rid: z.uuid(),
|
|
13690
|
-
last_resolved_at: z.
|
|
13673
|
+
last_resolved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
13691
13674
|
reason: z.string().optional()
|
|
13692
13675
|
}).passthrough().optional()
|
|
13693
13676
|
}).passthrough(), z.object({
|
|
13694
13677
|
event_type: z.literal("property.reactivated"),
|
|
13695
13678
|
entity_type: z.literal("property").optional(),
|
|
13696
13679
|
payload: PropertyPayloadSchema.merge(z.object({
|
|
13697
|
-
reactivated_at: z.
|
|
13680
|
+
reactivated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
13698
13681
|
}).passthrough()).optional()
|
|
13699
13682
|
}).passthrough(), z.object({
|
|
13700
13683
|
event_type: z.literal("collection.created"),
|
|
@@ -13785,7 +13768,7 @@ const RegistryEventSchema = /* @__PURE__ */ (() => z.object({
|
|
|
13785
13768
|
event_type: z.literal("authorization.modified"),
|
|
13786
13769
|
entity_type: z.literal("authorization").optional(),
|
|
13787
13770
|
payload: AuthorizationPayloadSchema.optional()
|
|
13788
|
-
}).passthrough()])))();
|
|
13771
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
13789
13772
|
const ReportingCanonicalizationContractSchema = /* @__PURE__ */ (() => z.object({
|
|
13790
13773
|
contract_version: z.literal("1.0"),
|
|
13791
13774
|
media_type: z.literal("application/vnd.adcp.reporting-canonicalization+json"),
|
|
@@ -13908,7 +13891,7 @@ const GovernanceAgentNotAcceptedDetailsSchema = /* @__PURE__ */ (() => z.union([
|
|
|
13908
13891
|
disclosure: z.literal("opaque"),
|
|
13909
13892
|
rejection_ref: z.string().max(128).regex(/^[A-Za-z0-9_.:-]+$/).optional()
|
|
13910
13893
|
}).passthrough()]))();
|
|
13911
|
-
const VASTVersionMismatchDetailsSchema = /* @__PURE__ */ (() => z.union([AssetOutsideAcceptedVersionIntersectionSchema, InspectedDocumentVersionMismatchSchema, SupportedVersionsCompatibilityDetailsSchema]).and(z.object({
|
|
13894
|
+
const VASTVersionMismatchDetailsSchema = /* @__PURE__ */ (() => z.union([AssetOutsideAcceptedVersionIntersectionSchema, InspectedDocumentVersionMismatchSchema, SupportedVersionsCompatibilityDetailsSchema]).describe("Must also satisfy at least one of these alternatives.").and(z.object({
|
|
13912
13895
|
mismatch_reason: z.union([z.literal("asset_outside_acceptance"), z.literal("document_version_mismatch")]).optional(),
|
|
13913
13896
|
asset_vast_version: VASTVersionSchema.optional(),
|
|
13914
13897
|
observed_document_vast_version: z.string().optional().nullable(),
|
|
@@ -13922,13 +13905,13 @@ const BoundedValueLevel_2Schema = /* @__PURE__ */ (() => z.union([BoundedScalarS
|
|
|
13922
13905
|
const BoundedValueSchema = /* @__PURE__ */ (() => z.union([BoundedScalarSchema, z.array(BoundedValueLevel_2Schema), z.record(z.string(), BoundedValueLevel_2Schema)]))();
|
|
13923
13906
|
const AcceptancePolicyCatalogSchema = /* @__PURE__ */ (() => z.object({
|
|
13924
13907
|
catalog_version: z.string().min(1),
|
|
13925
|
-
generated_at: z.
|
|
13908
|
+
generated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
13926
13909
|
profiles: z.array(AcceptancePolicyProfileSchema).optional(),
|
|
13927
13910
|
registry_profiles: z.array(RegistryAcceptancePolicyProfileReferenceSchema).optional(),
|
|
13928
13911
|
ext: ExtensionObjectSchema.optional()
|
|
13929
13912
|
}).passthrough())();
|
|
13930
13913
|
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) => {
|
|
13914
|
+
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
13915
|
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
13916
|
const { errors, failed } = schemas.reduce(
|
|
13934
13917
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
@@ -14029,7 +14012,7 @@ const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
|
|
|
14029
14012
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
14030
14013
|
});
|
|
14031
14014
|
}
|
|
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.")];
|
|
14015
|
+
}).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
14016
|
const { errors, failed } = schemas.reduce(
|
|
14034
14017
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
14035
14018
|
errors: [...errors2, ...result.error.issues],
|
|
@@ -14104,7 +14087,7 @@ const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
|
|
|
14104
14087
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
14105
14088
|
});
|
|
14106
14089
|
}
|
|
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) => {
|
|
14090
|
+
}).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
14091
|
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
14092
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
14110
14093
|
({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
|
|
@@ -14154,7 +14137,7 @@ const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
|
|
|
14154
14137
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
14155
14138
|
});
|
|
14156
14139
|
}
|
|
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) => {
|
|
14140
|
+
}).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
14141
|
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
14142
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
14160
14143
|
({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
|
|
@@ -14204,7 +14187,7 @@ const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
|
|
|
14204
14187
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
14205
14188
|
});
|
|
14206
14189
|
}
|
|
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).")];
|
|
14190
|
+
}).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
14191
|
const { errors, failed } = schemas.reduce(
|
|
14209
14192
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
14210
14193
|
errors: [...errors2, ...result.error.issues],
|
|
@@ -14228,7 +14211,7 @@ const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
|
|
|
14228
14211
|
message: "Invalid input: Should pass single schema. Passed " + passed
|
|
14229
14212
|
});
|
|
14230
14213
|
}
|
|
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) => {
|
|
14214
|
+
}).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
14215
|
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
14216
|
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
14217
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
@@ -14406,12 +14389,12 @@ const ProposalRefinementSchema = /* @__PURE__ */ (() => z.object({
|
|
|
14406
14389
|
action: z.literal("finalize")
|
|
14407
14390
|
}).passthrough(), z.union([z.object({}).passthrough(), z.object({
|
|
14408
14391
|
change_kind: z.literal("cancellation")
|
|
14409
|
-
}).passthrough()])])))();
|
|
14392
|
+
}).passthrough()])]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
14410
14393
|
const PropertyFeatureResultSchema = /* @__PURE__ */ (() => z.object({
|
|
14411
14394
|
property: PropertyIDSchema,
|
|
14412
14395
|
features: z.record(z.string(), PropertyFeatureValueSchema).optional(),
|
|
14413
14396
|
coverage_status: z.union([z.literal("covered"), z.literal("not_covered"), z.literal("pending")]),
|
|
14414
|
-
last_evaluated: z.
|
|
14397
|
+
last_evaluated: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
14415
14398
|
ext: ExtensionObjectSchema.optional()
|
|
14416
14399
|
}).passthrough())();
|
|
14417
14400
|
const PackageFormatSnapshotSchema = /* @__PURE__ */ (() => ProductFormatDeclarationSchema.and(z.object({}).passthrough()).and(z.object({
|
|
@@ -14728,7 +14711,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
14728
14711
|
message: "Invalid input: Should pass single schema. Passed " + passed
|
|
14729
14712
|
});
|
|
14730
14713
|
}
|
|
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) => {
|
|
14714
|
+
})).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
14715
|
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
14716
|
const { errors, failed } = schemas.reduce(
|
|
14734
14717
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
@@ -14829,7 +14812,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
14829
14812
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
14830
14813
|
});
|
|
14831
14814
|
}
|
|
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.")];
|
|
14815
|
+
}).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
14816
|
const { errors, failed } = schemas.reduce(
|
|
14834
14817
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
14835
14818
|
errors: [...errors2, ...result.error.issues],
|
|
@@ -14904,7 +14887,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
14904
14887
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
14905
14888
|
});
|
|
14906
14889
|
}
|
|
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) => {
|
|
14890
|
+
}).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
14891
|
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
14892
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
14910
14893
|
({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
|
|
@@ -14954,7 +14937,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
14954
14937
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
14955
14938
|
});
|
|
14956
14939
|
}
|
|
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) => {
|
|
14940
|
+
}).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
14941
|
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
14942
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
14960
14943
|
({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
|
|
@@ -15004,7 +14987,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
15004
14987
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
15005
14988
|
});
|
|
15006
14989
|
}
|
|
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).")];
|
|
14990
|
+
}).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
14991
|
const { errors, failed } = schemas.reduce(
|
|
15009
14992
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
15010
14993
|
errors: [...errors2, ...result.error.issues],
|
|
@@ -15028,7 +15011,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
15028
15011
|
message: "Invalid input: Should pass single schema. Passed " + passed
|
|
15029
15012
|
});
|
|
15030
15013
|
}
|
|
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) => {
|
|
15014
|
+
}).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
15015
|
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
15016
|
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
15017
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
@@ -15129,7 +15112,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
15129
15112
|
});
|
|
15130
15113
|
}
|
|
15131
15114
|
}))).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()];
|
|
15115
|
+
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
15116
|
const { errors, failed } = schemas.reduce(
|
|
15134
15117
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
15135
15118
|
errors: [...errors2, ...result.error.issues],
|
|
@@ -15178,7 +15161,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
15178
15161
|
message: "Invalid input: Should pass single schema. Passed " + passed
|
|
15179
15162
|
});
|
|
15180
15163
|
}
|
|
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) => {
|
|
15164
|
+
})).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
15165
|
const schemas = [z.literal("asap").describe("Start campaign as soon as possible"), z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")];
|
|
15183
15166
|
const { errors, failed } = schemas.reduce(
|
|
15184
15167
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
@@ -15203,9 +15186,9 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
15203
15186
|
message: "Invalid input: Should pass single schema. Passed " + passed
|
|
15204
15187
|
});
|
|
15205
15188
|
}
|
|
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) => {
|
|
15189
|
+
}).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
15190
|
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()];
|
|
15191
|
+
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
15192
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
15210
15193
|
({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
|
|
15211
15194
|
errors: [...errors3, ...result.error.issues],
|
|
@@ -15279,7 +15262,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
15279
15262
|
});
|
|
15280
15263
|
}
|
|
15281
15264
|
})).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()]))];
|
|
15265
|
+
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
15266
|
const { errors, failed } = schemas.reduce(
|
|
15284
15267
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
15285
15268
|
errors: [...errors2, ...result.error.issues],
|
|
@@ -15303,8 +15286,8 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
15303
15286
|
message: "Invalid input: Should pass single schema. Passed " + passed
|
|
15304
15287
|
});
|
|
15305
15288
|
}
|
|
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) => {
|
|
15289
|
+
}).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) => {
|
|
15290
|
+
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
15291
|
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
15292
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
15310
15293
|
({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
|
|
@@ -15329,7 +15312,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
15329
15312
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
15330
15313
|
});
|
|
15331
15314
|
}
|
|
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.")];
|
|
15315
|
+
}).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
15316
|
const { errors, failed } = schemas.reduce(
|
|
15334
15317
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
15335
15318
|
errors: [...errors2, ...result.error.issues],
|
|
@@ -15353,7 +15336,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
15353
15336
|
message: "Invalid input: Should pass single schema. Passed " + passed
|
|
15354
15337
|
});
|
|
15355
15338
|
}
|
|
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.");
|
|
15339
|
+
})).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
15340
|
const exactSchema = objectSchema.superRefine((value, ctx) => {
|
|
15358
15341
|
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
15342
|
if (!checked.success) {
|
|
@@ -15434,7 +15417,7 @@ const BuyProductsRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
15434
15417
|
budget_cap_timezone: z.string().min(1).optional(),
|
|
15435
15418
|
budget_allocation: CanonicalBudgetAllocationSchema.optional(),
|
|
15436
15419
|
start_time: StartTimingSchema,
|
|
15437
|
-
end_time: z.
|
|
15420
|
+
end_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
15438
15421
|
pacing: PacingSchema.optional(),
|
|
15439
15422
|
bidding: BiddingPolicySchema.optional(),
|
|
15440
15423
|
paused: z.boolean().optional(),
|
|
@@ -15456,7 +15439,7 @@ const CommittedMediaBuySchema = /* @__PURE__ */ (() => z.object({
|
|
|
15456
15439
|
name: z.string().min(1).max(255).regex(/\S/).optional(),
|
|
15457
15440
|
revision: z.int().min(1),
|
|
15458
15441
|
media_buy_status: MediaBuyStatusSchema.optional(),
|
|
15459
|
-
confirmed_at: z.
|
|
15442
|
+
confirmed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
|
|
15460
15443
|
accepted_proposal: CanonicalProposalSchema.and(z.object({
|
|
15461
15444
|
proposal_status: z.literal("accepted"),
|
|
15462
15445
|
media_buy_id: z.string().min(1)
|
|
@@ -15987,8 +15970,8 @@ const PackageUpdateSchema = /* @__PURE__ */ (() => z.object({
|
|
|
15987
15970
|
bidding: BiddingPolicySchema.optional().nullable(),
|
|
15988
15971
|
impressions: z.number().min(0).optional(),
|
|
15989
15972
|
daily_budget_cap: z.number().min(0).optional().nullable(),
|
|
15990
|
-
start_time: z.
|
|
15991
|
-
end_time: z.
|
|
15973
|
+
start_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
15974
|
+
end_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
15992
15975
|
paused: z.boolean().optional(),
|
|
15993
15976
|
canceled: z.literal(true).optional(),
|
|
15994
15977
|
cancellation_reason: z.string().max(500).optional(),
|
|
@@ -16030,7 +16013,7 @@ const UpdateMediaBuySuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16030
16013
|
budget_allocation: BudgetAllocationSchema.optional(),
|
|
16031
16014
|
pacing: PacingSchema.optional(),
|
|
16032
16015
|
bidding: BiddingPolicySchema.optional(),
|
|
16033
|
-
implementation_date: z.
|
|
16016
|
+
implementation_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
|
|
16034
16017
|
invoice_recipient: BusinessEntitySchema.optional(),
|
|
16035
16018
|
affected_packages: z.array(PackageSchema).optional(),
|
|
16036
16019
|
valid_actions: z.array(MediaBuyValidActionSchema).optional(),
|
|
@@ -16105,16 +16088,16 @@ const PackageStatusSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16105
16088
|
pacing: PacingSchema.optional(),
|
|
16106
16089
|
targeting_overlay: TargetingOverlaySchema.optional(),
|
|
16107
16090
|
targeting_resolution: PackageTargetingResolutionSchema.optional(),
|
|
16108
|
-
start_time: z.
|
|
16109
|
-
end_time: z.
|
|
16091
|
+
start_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
16092
|
+
end_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
16110
16093
|
paused: z.boolean().optional(),
|
|
16111
16094
|
canceled: z.boolean().optional(),
|
|
16112
16095
|
cancellation: z.object({
|
|
16113
|
-
canceled_at: z.
|
|
16096
|
+
canceled_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
16114
16097
|
canceled_by: CanceledBySchema,
|
|
16115
16098
|
reason: z.string().max(500).optional()
|
|
16116
16099
|
}).passthrough().optional(),
|
|
16117
|
-
creative_deadline: z.
|
|
16100
|
+
creative_deadline: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
16118
16101
|
context: ContextObjectSchema.optional(),
|
|
16119
16102
|
creative_approvals: z.array(z.object({
|
|
16120
16103
|
creative_id: z.string(),
|
|
@@ -16124,8 +16107,8 @@ const PackageStatusSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16124
16107
|
indicators: z.array(IndicatorSchema.and(z.object({
|
|
16125
16108
|
type: z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]).optional()
|
|
16126
16109
|
}).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.
|
|
16110
|
+
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(),
|
|
16111
|
+
indicators_as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
16129
16112
|
indicators_evaluated_scope: z.array(IndicatorScopeSchema).optional()
|
|
16130
16113
|
}).passthrough()).optional(),
|
|
16131
16114
|
formats_to_provide: z.array(PackageFormatSnapshotSchema).optional(),
|
|
@@ -16134,7 +16117,7 @@ const PackageStatusSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16134
16117
|
format_ids_pending: z.array(FormatReferenceStructuredObjectSchema).optional(),
|
|
16135
16118
|
snapshot_unavailable_reason: SnapshotUnavailableReasonSchema.optional(),
|
|
16136
16119
|
snapshot: z.object({
|
|
16137
|
-
as_of: z.
|
|
16120
|
+
as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
16138
16121
|
staleness_seconds: z.int().min(0),
|
|
16139
16122
|
impressions: z.number().min(0),
|
|
16140
16123
|
spend: z.number().min(0),
|
|
@@ -16200,10 +16183,10 @@ const GetMediaBuyDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16200
16183
|
partial_data: z.boolean().optional(),
|
|
16201
16184
|
unavailable_count: z.int().min(0).optional(),
|
|
16202
16185
|
sequence_number: z.int().min(1).optional(),
|
|
16203
|
-
next_expected_at: z.
|
|
16186
|
+
next_expected_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
16204
16187
|
reporting_period: z.object({
|
|
16205
|
-
start: z.
|
|
16206
|
-
end: z.
|
|
16188
|
+
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
16189
|
+
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
16207
16190
|
timezone: z.string().min(1).optional()
|
|
16208
16191
|
}).passthrough(),
|
|
16209
16192
|
reporting_revision_binding: z.object({
|
|
@@ -16241,10 +16224,10 @@ const GetMediaBuyDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16241
16224
|
media_buy_id: z.string(),
|
|
16242
16225
|
currency: z.string().regex(/^[A-Z]{3}$/).optional(),
|
|
16243
16226
|
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.
|
|
16227
|
+
expected_availability: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
16245
16228
|
is_adjusted: z.boolean().optional(),
|
|
16246
16229
|
is_final: z.boolean().optional(),
|
|
16247
|
-
finalized_at: z.
|
|
16230
|
+
finalized_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
16248
16231
|
pricing_model: PricingModelSchema.optional(),
|
|
16249
16232
|
pacing_index: z.number().min(0).optional(),
|
|
16250
16233
|
totals: DeliveryMetricsSchema.merge(z.object({
|
|
@@ -16259,7 +16242,7 @@ const GetMediaBuyDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16259
16242
|
delivery_status: DeliveryStatusSchema.optional(),
|
|
16260
16243
|
paused: z.boolean().optional(),
|
|
16261
16244
|
is_final: z.boolean().optional(),
|
|
16262
|
-
finalized_at: z.
|
|
16245
|
+
finalized_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
16263
16246
|
measurement_window: z.string().max(50).optional(),
|
|
16264
16247
|
supersedes_window: z.string().max(50).optional(),
|
|
16265
16248
|
missing_metrics: z.array(MissingMetricSchema).optional(),
|
|
@@ -16346,7 +16329,7 @@ const GetMediaBuyDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16346
16329
|
by_spot: z.array(DeliveryMetricsSchema.merge(z.object({
|
|
16347
16330
|
spot_id: z.string().min(1),
|
|
16348
16331
|
creative_id: z.string().min(1).optional(),
|
|
16349
|
-
aired_at: z.
|
|
16332
|
+
aired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
16350
16333
|
network: z.string().min(1).optional(),
|
|
16351
16334
|
station: z.string().min(1).optional(),
|
|
16352
16335
|
daypart: z.string().min(1).optional()
|
|
@@ -16364,8 +16347,8 @@ const GetMediaBuyDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16364
16347
|
}).passthrough()).optional()
|
|
16365
16348
|
}).passthrough())),
|
|
16366
16349
|
windows: z.array(z.object({
|
|
16367
|
-
window_start: z.
|
|
16368
|
-
window_end: z.
|
|
16350
|
+
window_start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
16351
|
+
window_end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
16369
16352
|
totals: DeliveryMetricsSchema,
|
|
16370
16353
|
by_package: z.array(DeliveryMetricsSchema.merge(z.object({
|
|
16371
16354
|
package_id: z.string(),
|
|
@@ -16454,7 +16437,7 @@ const ProvidePerformanceFeedbackResponseSchema = /* @__PURE__ */ (() => z.object
|
|
|
16454
16437
|
payload: z.object({}).passthrough().optional(),
|
|
16455
16438
|
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
16439
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
16457
|
-
}).passthrough().and(z.union([ProvidePerformanceFeedbackSuccessSchema, ProvidePerformanceFeedbackErrorSchema])))();
|
|
16440
|
+
}).passthrough().and(z.union([ProvidePerformanceFeedbackSuccessSchema, ProvidePerformanceFeedbackErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
16458
16441
|
const SyncEventSourcesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
16459
16442
|
context_id: z.string().optional(),
|
|
16460
16443
|
context: ContextObjectSchema.optional(),
|
|
@@ -16469,7 +16452,7 @@ const SyncEventSourcesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16469
16452
|
payload: z.object({}).passthrough().optional(),
|
|
16470
16453
|
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
16454
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
16472
|
-
}).passthrough().and(z.union([SyncEventSourcesSuccessSchema, SyncEventSourcesErrorSchema])))();
|
|
16455
|
+
}).passthrough().and(z.union([SyncEventSourcesSuccessSchema, SyncEventSourcesErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
16473
16456
|
const LogEventResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
16474
16457
|
context_id: z.string().optional(),
|
|
16475
16458
|
context: ContextObjectSchema.optional(),
|
|
@@ -16484,7 +16467,7 @@ const LogEventResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16484
16467
|
payload: z.object({}).passthrough().optional(),
|
|
16485
16468
|
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
16469
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
16487
|
-
}).passthrough().and(z.union([LogEventSuccessSchema, LogEventErrorSchema])))();
|
|
16470
|
+
}).passthrough().and(z.union([LogEventSuccessSchema, LogEventErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
16488
16471
|
const SyncAudiencesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
16489
16472
|
context_id: z.string().optional(),
|
|
16490
16473
|
context: ContextObjectSchema.optional(),
|
|
@@ -16499,7 +16482,7 @@ const SyncAudiencesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16499
16482
|
payload: z.object({}).passthrough().optional(),
|
|
16500
16483
|
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
16484
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
16502
|
-
}).passthrough().and(z.union([SyncAudiencesSuccessSchema, SyncAudiencesErrorSchema, SyncAudiencesSubmittedSchema])))();
|
|
16485
|
+
}).passthrough().and(z.union([SyncAudiencesSuccessSchema, SyncAudiencesErrorSchema, SyncAudiencesSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
16503
16486
|
const BuildCreativeRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
16504
16487
|
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
16488
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
@@ -16562,7 +16545,7 @@ const BuildCreativeSuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16562
16545
|
build_variant_id: z.string().optional(),
|
|
16563
16546
|
recipe_hash: z.string().optional(),
|
|
16564
16547
|
sandbox: z.boolean().optional(),
|
|
16565
|
-
expires_at: z.
|
|
16548
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
16566
16549
|
preview: z.object({
|
|
16567
16550
|
previews: z.array(z.object({
|
|
16568
16551
|
preview_id: z.string(),
|
|
@@ -16574,7 +16557,7 @@ const BuildCreativeSuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16574
16557
|
}).passthrough()
|
|
16575
16558
|
}).passthrough()),
|
|
16576
16559
|
interactive_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
16577
|
-
expires_at: z.
|
|
16560
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
16578
16561
|
}).passthrough().optional(),
|
|
16579
16562
|
preview_error: ErrorSchema.optional(),
|
|
16580
16563
|
pricing_option_id: z.string().optional(),
|
|
@@ -16675,7 +16658,7 @@ const PreviewCreativeResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16675
16658
|
payload: z.object({}).passthrough().optional(),
|
|
16676
16659
|
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
16660
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
16678
|
-
}).passthrough().and(z.union([PreviewCreativeSingleResponseSchema, PreviewCreativeBatchResponseSchema, PreviewCreativeVariantResponseSchema, PreviewCreativeSubmittedSchema])))();
|
|
16661
|
+
}).passthrough().and(z.union([PreviewCreativeSingleResponseSchema, PreviewCreativeBatchResponseSchema, PreviewCreativeVariantResponseSchema, PreviewCreativeSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
16679
16662
|
const ListTransformersResponseCreativeAgentSchema = /* @__PURE__ */ (() => z.object({
|
|
16680
16663
|
context_id: z.string().optional(),
|
|
16681
16664
|
context: ContextObjectSchema.optional(),
|
|
@@ -16713,8 +16696,8 @@ const GetCreativeDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16713
16696
|
media_buy_id: z.string().optional(),
|
|
16714
16697
|
currency: z.string().regex(/^[A-Z]{3}$/),
|
|
16715
16698
|
reporting_period: z.object({
|
|
16716
|
-
start: z.
|
|
16717
|
-
end: z.
|
|
16699
|
+
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
16700
|
+
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
16718
16701
|
timezone: z.string().optional()
|
|
16719
16702
|
}).passthrough(),
|
|
16720
16703
|
creatives: z.array(z.object({
|
|
@@ -16792,7 +16775,7 @@ const SyncCreativesSuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16792
16775
|
warnings: z.array(z.string()).optional(),
|
|
16793
16776
|
macro_resolution_results: z.array(MacroResolutionResultSchema).optional(),
|
|
16794
16777
|
preview_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
16795
|
-
expires_at: z.
|
|
16778
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
16796
16779
|
assigned_to: z.array(z.string()).optional(),
|
|
16797
16780
|
assignment_errors: z.record(z.string(), z.string()).optional()
|
|
16798
16781
|
}).passthrough()),
|
|
@@ -16820,7 +16803,7 @@ const ActivateSignalResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16820
16803
|
payload: z.object({}).passthrough().optional(),
|
|
16821
16804
|
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
16805
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
16823
|
-
}).passthrough().and(z.union([ActivateSignalSuccessSchema, ActivateSignalErrorSchema])))();
|
|
16806
|
+
}).passthrough().and(z.union([ActivateSignalSuccessSchema, ActivateSignalErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
16824
16807
|
const CreatePropertyListResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
16825
16808
|
context_id: z.string().optional(),
|
|
16826
16809
|
context: ContextObjectSchema.optional(),
|
|
@@ -16880,7 +16863,7 @@ const ListContentStandardsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16880
16863
|
errors: z.array(ErrorSchema),
|
|
16881
16864
|
context: ContextObjectSchema.optional(),
|
|
16882
16865
|
ext: ExtensionObjectSchema.optional()
|
|
16883
|
-
}).passthrough()])))();
|
|
16866
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
16884
16867
|
const GetContentStandardsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
16885
16868
|
context_id: z.string().optional(),
|
|
16886
16869
|
context: ContextObjectSchema.optional(),
|
|
@@ -16913,7 +16896,7 @@ const GetContentStandardsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16913
16896
|
errors: z.array(ErrorSchema),
|
|
16914
16897
|
context: ContextObjectSchema.optional(),
|
|
16915
16898
|
ext: ExtensionObjectSchema.optional()
|
|
16916
|
-
}).passthrough()])))();
|
|
16899
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
16917
16900
|
const CreateContentStandardsRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
16918
16901
|
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
16902
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
@@ -16955,7 +16938,7 @@ const UpdateContentStandardsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16955
16938
|
payload: z.object({}).passthrough().optional(),
|
|
16956
16939
|
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
16940
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
16958
|
-
}).passthrough().and(z.union([UpdateContentStandardsSuccessSchema, UpdateContentStandardsErrorSchema])))();
|
|
16941
|
+
}).passthrough().and(z.union([UpdateContentStandardsSuccessSchema, UpdateContentStandardsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
16959
16942
|
const GetCreativeFeaturesRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
16960
16943
|
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
16944
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
@@ -16982,17 +16965,17 @@ const ReportPlanOutcomeRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16982
16965
|
budget: z.number().min(0).optional()
|
|
16983
16966
|
}).passthrough()).optional(),
|
|
16984
16967
|
planned_delivery: PlannedDeliverySchema.optional(),
|
|
16985
|
-
creative_deadline: z.
|
|
16968
|
+
creative_deadline: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
16986
16969
|
}).passthrough().optional(),
|
|
16987
16970
|
delivery: z.union([z.object({
|
|
16988
16971
|
observation_id: z.string().min(1).max(255),
|
|
16989
16972
|
source: z.literal("seller_statement_copy"),
|
|
16990
|
-
observed_at: z.
|
|
16973
|
+
observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
16991
16974
|
seller_statement_id: z.string(),
|
|
16992
16975
|
seller_statement_digest: z.string().regex(/^sha256:[a-f0-9]{64}$/),
|
|
16993
16976
|
reporting_period: z.object({
|
|
16994
|
-
start: z.
|
|
16995
|
-
end: z.
|
|
16977
|
+
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
16978
|
+
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
16996
16979
|
}).passthrough(),
|
|
16997
16980
|
cumulative_spend: z.number().min(0),
|
|
16998
16981
|
currency: z.string().regex(/^[A-Z]{3}$/),
|
|
@@ -17001,12 +16984,12 @@ const ReportPlanOutcomeRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
17001
16984
|
}).passthrough(), z.object({
|
|
17002
16985
|
observation_id: z.string().min(1).max(255),
|
|
17003
16986
|
source: z.literal("buyer_measurement"),
|
|
17004
|
-
observed_at: z.
|
|
16987
|
+
observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
17005
16988
|
seller_statement_id: z.string().optional(),
|
|
17006
16989
|
seller_statement_digest: z.string().regex(/^sha256:[a-f0-9]{64}$/).optional(),
|
|
17007
16990
|
reporting_period: z.object({
|
|
17008
|
-
start: z.
|
|
17009
|
-
end: z.
|
|
16991
|
+
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
16992
|
+
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
17010
16993
|
}).passthrough(),
|
|
17011
16994
|
cumulative_spend: z.number().min(0),
|
|
17012
16995
|
currency: z.string().regex(/^[A-Z]{3}$/),
|
|
@@ -17044,10 +17027,10 @@ const CheckGovernanceRequestSchema = /* @__PURE__ */ (() => z.object({}).passthr
|
|
|
17044
17027
|
statement_id: z.string().min(1).max(255).optional(),
|
|
17045
17028
|
statement_digest: z.string().regex(/^sha256:[a-f0-9]{64}$/).optional(),
|
|
17046
17029
|
sequence: z.int().min(1).optional(),
|
|
17047
|
-
issued_at: z.
|
|
17030
|
+
issued_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
17048
17031
|
reporting_period: z.object({
|
|
17049
|
-
start: z.
|
|
17050
|
-
end: z.
|
|
17032
|
+
start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
17033
|
+
end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
17051
17034
|
}).passthrough(),
|
|
17052
17035
|
spend: z.number().min(0).optional(),
|
|
17053
17036
|
cumulative_spend: z.number().min(0).optional(),
|
|
@@ -17113,7 +17096,7 @@ const GetAdCPCapabilitiesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
17113
17096
|
}).passthrough().optional(),
|
|
17114
17097
|
capability_changes: z.object({
|
|
17115
17098
|
capabilities_version: z.string().min(1).max(255).optional(),
|
|
17116
|
-
last_modified: z.
|
|
17099
|
+
last_modified: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
17117
17100
|
cache_ttl_seconds: z.int().min(60).max(604800).optional(),
|
|
17118
17101
|
notifications: z.union([CapabilityChangeNotificationsSupportedSchema, CapabilityChangeNotificationsUnsupportedSchema]).optional()
|
|
17119
17102
|
}).passthrough().optional(),
|
|
@@ -17485,7 +17468,7 @@ const GetAdCPCapabilitiesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
17485
17468
|
pricing_version_separate: z.boolean().optional(),
|
|
17486
17469
|
cache_scope_account: z.boolean().optional()
|
|
17487
17470
|
}).passthrough().optional(),
|
|
17488
|
-
last_updated: z.
|
|
17471
|
+
last_updated: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
17489
17472
|
errors: z.array(ErrorSchema).optional(),
|
|
17490
17473
|
ext: ExtensionObjectSchema.optional(),
|
|
17491
17474
|
wholesale_feed_webhooks: z.object({
|
|
@@ -17606,7 +17589,7 @@ const SyncAccountsSuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
|
17606
17589
|
setup: z.object({
|
|
17607
17590
|
url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
|
|
17608
17591
|
message: z.string(),
|
|
17609
|
-
expires_at: z.
|
|
17592
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
17610
17593
|
}).passthrough().optional(),
|
|
17611
17594
|
rate_card: z.string().optional(),
|
|
17612
17595
|
payment_terms: PaymentTermsSchema.optional(),
|
|
@@ -17638,7 +17621,7 @@ const SyncGovernanceResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
17638
17621
|
payload: z.object({}).passthrough().optional(),
|
|
17639
17622
|
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
17623
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
17641
|
-
}).passthrough().and(z.union([SyncGovernanceSuccessSchema, SyncGovernanceErrorSchema])))();
|
|
17624
|
+
}).passthrough().and(z.union([SyncGovernanceSuccessSchema, SyncGovernanceErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
17642
17625
|
const GetAccountFinancialsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
17643
17626
|
context_id: z.string().optional(),
|
|
17644
17627
|
context: ContextObjectSchema.optional(),
|
|
@@ -17653,7 +17636,7 @@ const GetAccountFinancialsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
17653
17636
|
payload: z.object({}).passthrough().optional(),
|
|
17654
17637
|
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
17638
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
17656
|
-
}).passthrough().and(z.union([GetAccountFinancialsSuccessSchema, GetAccountFinancialsErrorSchema])))();
|
|
17639
|
+
}).passthrough().and(z.union([GetAccountFinancialsSuccessSchema, GetAccountFinancialsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
17657
17640
|
const GetProductsCompletionSchema = /* @__PURE__ */ (() => AdCPVersionEnvelopeSchema.merge(ProtocolEnvelopeSchema).merge(z.object({}).passthrough()).merge(z.object({
|
|
17658
17641
|
products: z.array(ProductSchema).optional(),
|
|
17659
17642
|
targeting_resolution: ProductDiscoveryTargetingResolutionSchema.optional(),
|
|
@@ -17708,7 +17691,7 @@ const UpstreamTrafficSuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
|
17708
17691
|
recorded_calls: z.array(z.union([RawAttestationSchema, DigestAttestationSchema])),
|
|
17709
17692
|
total_count: z.int().min(0),
|
|
17710
17693
|
truncated: z.boolean().optional(),
|
|
17711
|
-
since_timestamp: z.
|
|
17694
|
+
since_timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
17712
17695
|
context: ContextObjectSchema.optional(),
|
|
17713
17696
|
ext: ExtensionObjectSchema.optional()
|
|
17714
17697
|
}).passthrough())();
|
|
@@ -17768,8 +17751,8 @@ const ValidatePropertyDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
17768
17751
|
unknown_impressions: z.int()
|
|
17769
17752
|
}).passthrough().optional(),
|
|
17770
17753
|
results: z.array(ValidationResultSchema),
|
|
17771
|
-
validated_at: z.
|
|
17772
|
-
list_resolved_at: z.
|
|
17754
|
+
validated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
17755
|
+
list_resolved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
17773
17756
|
ext: ExtensionObjectSchema.optional()
|
|
17774
17757
|
}).passthrough())();
|
|
17775
17758
|
const RequestProposalsResponseSchema = /* @__PURE__ */ (() => z.union([z.object({
|
|
@@ -17779,7 +17762,7 @@ const RequestProposalsResponseSchema = /* @__PURE__ */ (() => z.union([z.object(
|
|
|
17779
17762
|
suggestions: z.never().optional(),
|
|
17780
17763
|
proposals: z.array(CanonicalProposalSchema.and(z.object({
|
|
17781
17764
|
proposal_status: z.literal("draft"),
|
|
17782
|
-
expires_at: z.
|
|
17765
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
17783
17766
|
}).passthrough())),
|
|
17784
17767
|
products: z.array(CanonicalProductSchema),
|
|
17785
17768
|
incomplete: z.array(z.object({
|
|
@@ -17817,7 +17800,7 @@ const RequestProposalsResponseSchema = /* @__PURE__ */ (() => z.union([z.object(
|
|
|
17817
17800
|
}).passthrough(), z.object({
|
|
17818
17801
|
kind: z.literal("legacy_create"),
|
|
17819
17802
|
continuation_token: z.string().min(16),
|
|
17820
|
-
continuation_expires_at: z.
|
|
17803
|
+
continuation_expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
17821
17804
|
source_adcp_version: z.union([z.literal("2.5"), z.literal("3.0"), z.literal("3.1")]),
|
|
17822
17805
|
product_ids: z.array(z.string()),
|
|
17823
17806
|
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 +17862,7 @@ const RequestProposalsResponseSchema = /* @__PURE__ */ (() => z.union([z.object(
|
|
|
17879
17862
|
suggestions: z.array(z.string()).optional(),
|
|
17880
17863
|
proposals: z.array(CanonicalProposalSchema.and(z.object({
|
|
17881
17864
|
proposal_status: z.literal("draft"),
|
|
17882
|
-
expires_at: z.
|
|
17865
|
+
expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
17883
17866
|
}).passthrough())).optional(),
|
|
17884
17867
|
products: z.array(CanonicalProductSchema).optional(),
|
|
17885
17868
|
incomplete: z.array(z.object({
|
|
@@ -17896,7 +17879,7 @@ const RequestProposalsResponseSchema = /* @__PURE__ */ (() => z.union([z.object(
|
|
|
17896
17879
|
}).passthrough(), z.object({
|
|
17897
17880
|
kind: z.literal("legacy_create"),
|
|
17898
17881
|
continuation_token: z.string().min(16),
|
|
17899
|
-
continuation_expires_at: z.
|
|
17882
|
+
continuation_expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
17900
17883
|
source_adcp_version: z.union([z.literal("2.5"), z.literal("3.0"), z.literal("3.1")]),
|
|
17901
17884
|
product_ids: z.array(z.string()),
|
|
17902
17885
|
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 +17985,9 @@ const MediaBuySchema = /* @__PURE__ */ (() => z.object({
|
|
|
18002
17985
|
health: MediaBuyHealthSchema.and(z.string()).optional(),
|
|
18003
17986
|
impairments: z.array(ImpairmentSchema).optional(),
|
|
18004
17987
|
rejection_reason: z.string().optional(),
|
|
18005
|
-
confirmed_at: z.
|
|
17988
|
+
confirmed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").nullable(),
|
|
18006
17989
|
cancellation: z.object({
|
|
18007
|
-
canceled_at: z.
|
|
17990
|
+
canceled_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18008
17991
|
canceled_by: CanceledBySchema,
|
|
18009
17992
|
reason: z.string().max(500).optional()
|
|
18010
17993
|
}).passthrough().optional(),
|
|
@@ -18019,10 +18002,10 @@ const MediaBuySchema = /* @__PURE__ */ (() => z.object({
|
|
|
18019
18002
|
packages: z.array(PackageSchema),
|
|
18020
18003
|
context: ContextObjectSchema.optional(),
|
|
18021
18004
|
invoice_recipient: BusinessEntity1Schema.optional(),
|
|
18022
|
-
creative_deadline: z.
|
|
18005
|
+
creative_deadline: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18023
18006
|
revision: z.int().min(1),
|
|
18024
|
-
created_at: z.
|
|
18025
|
-
updated_at: z.
|
|
18007
|
+
created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18008
|
+
updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18026
18009
|
ext: ExtensionObjectSchema.optional()
|
|
18027
18010
|
}).passthrough())();
|
|
18028
18011
|
const RefineProposalsResponseSchema = /* @__PURE__ */ (() => z.union([z.object({
|
|
@@ -18228,7 +18211,7 @@ const UpdateMediaBuyResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18228
18211
|
payload: z.object({}).passthrough().optional(),
|
|
18229
18212
|
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
18213
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
18231
|
-
}).passthrough().and(z.union([UpdateMediaBuySuccessSchema, UpdateMediaBuyErrorSchema, UpdateMediaBuySubmittedSchema])))();
|
|
18214
|
+
}).passthrough().and(z.union([UpdateMediaBuySuccessSchema, UpdateMediaBuyErrorSchema, UpdateMediaBuySubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18232
18215
|
const BuildCreativeResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
18233
18216
|
context_id: z.string().optional(),
|
|
18234
18217
|
context: ContextObjectSchema.optional(),
|
|
@@ -18243,7 +18226,7 @@ const BuildCreativeResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18243
18226
|
payload: z.object({}).passthrough().optional(),
|
|
18244
18227
|
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
18228
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
18246
|
-
}).passthrough().and(z.union([BuildCreativeSuccessSchema, BuildCreativeMultiSuccessSchema, BuildCreativeVariantSuccessSchema, BuildCreativeEstimateSchema, BuildCreativeErrorSchema, BuildCreativeSubmittedSchema])))();
|
|
18229
|
+
}).passthrough().and(z.union([BuildCreativeSuccessSchema, BuildCreativeMultiSuccessSchema, BuildCreativeVariantSuccessSchema, BuildCreativeEstimateSchema, BuildCreativeErrorSchema, BuildCreativeSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18247
18230
|
const SyncCreativesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
18248
18231
|
context_id: z.string().optional(),
|
|
18249
18232
|
context: ContextObjectSchema.optional(),
|
|
@@ -18258,7 +18241,7 @@ const SyncCreativesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18258
18241
|
payload: z.object({}).passthrough().optional(),
|
|
18259
18242
|
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
18243
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
18261
|
-
}).passthrough().and(z.union([SyncCreativesSuccessSchema, SyncCreativesErrorSchema, SyncCreativesSubmittedSchema])))();
|
|
18244
|
+
}).passthrough().and(z.union([SyncCreativesSuccessSchema, SyncCreativesErrorSchema, SyncCreativesSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18262
18245
|
const CreateMediaBuySuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
18263
18246
|
proposal_id: z.string().min(1).optional(),
|
|
18264
18247
|
media_buy_id: z.string(),
|
|
@@ -18266,8 +18249,8 @@ const CreateMediaBuySuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18266
18249
|
account: AccountSchema.optional(),
|
|
18267
18250
|
invoice_recipient: BusinessEntitySchema.optional(),
|
|
18268
18251
|
media_buy_status: MediaBuyStatusSchema.optional(),
|
|
18269
|
-
confirmed_at: z.
|
|
18270
|
-
creative_deadline: z.
|
|
18252
|
+
confirmed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
|
|
18253
|
+
creative_deadline: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18271
18254
|
revision: z.int().min(1).optional(),
|
|
18272
18255
|
currency: z.string().regex(/^[A-Z]{3}$/).optional(),
|
|
18273
18256
|
total_budget: z.number().min(0).optional(),
|
|
@@ -18300,7 +18283,7 @@ const AcquireRightsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18300
18283
|
payload: z.object({}).passthrough().optional(),
|
|
18301
18284
|
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
18285
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
18303
|
-
}).passthrough().and(z.union([AcquireRightsAcquiredSchema, AcquireRightsPendingApprovalSchema, AcquireRightsRejectedSchema, AcquireRightsErrorSchema])))();
|
|
18286
|
+
}).passthrough().and(z.union([AcquireRightsAcquiredSchema, AcquireRightsPendingApprovalSchema, AcquireRightsRejectedSchema, AcquireRightsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18304
18287
|
const GetRightsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
18305
18288
|
context_id: z.string().optional(),
|
|
18306
18289
|
context: ContextObjectSchema.optional(),
|
|
@@ -18315,8 +18298,8 @@ const GetRightsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18315
18298
|
payload: z.object({}).passthrough().optional(),
|
|
18316
18299
|
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
18300
|
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])))();
|
|
18301
|
+
}).passthrough().and(z.union([GetRightsSuccessSchema, GetRightsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18302
|
+
const SearchBrandsResponseSchema = /* @__PURE__ */ (() => AdCPVersionEnvelopeSchema.merge(ProtocolEnvelopeSchema).and(z.union([SearchBrandsSuccessSchema, SearchBrandsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18320
18303
|
const UpdateRightsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
18321
18304
|
context_id: z.string().optional(),
|
|
18322
18305
|
context: ContextObjectSchema.optional(),
|
|
@@ -18331,7 +18314,7 @@ const UpdateRightsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18331
18314
|
payload: z.object({}).passthrough().optional(),
|
|
18332
18315
|
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
18316
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
18334
|
-
}).passthrough().and(z.union([UpdateRightsSuccessSchema, UpdateRightsErrorSchema])))();
|
|
18317
|
+
}).passthrough().and(z.union([UpdateRightsSuccessSchema, UpdateRightsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18335
18318
|
const VerifyBrandClaimResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
18336
18319
|
context_id: z.string().optional(),
|
|
18337
18320
|
context: ContextObjectSchema.optional(),
|
|
@@ -18346,7 +18329,7 @@ const VerifyBrandClaimResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18346
18329
|
payload: z.object({}).passthrough().optional(),
|
|
18347
18330
|
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
18331
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
18349
|
-
}).passthrough().and(z.union([VerifyBrandClaimSuccessSchema, VerifyBrandClaimErrorSchema])))();
|
|
18332
|
+
}).passthrough().and(z.union([VerifyBrandClaimSuccessSchema, VerifyBrandClaimErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18350
18333
|
const VerifyBrandClaimsResponseBulkSchema = /* @__PURE__ */ (() => z.object({
|
|
18351
18334
|
context_id: z.string().optional(),
|
|
18352
18335
|
context: ContextObjectSchema.optional(),
|
|
@@ -18361,7 +18344,7 @@ const VerifyBrandClaimsResponseBulkSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18361
18344
|
payload: z.object({}).passthrough().optional(),
|
|
18362
18345
|
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
18346
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
18364
|
-
}).passthrough().and(z.union([VerifyBrandClaimsSuccessSchema, VerifyBrandClaimsErrorSchema])))();
|
|
18347
|
+
}).passthrough().and(z.union([VerifyBrandClaimsSuccessSchema, VerifyBrandClaimsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18365
18348
|
const AppItemSchema = /* @__PURE__ */ (() => z.object({
|
|
18366
18349
|
app_id: z.string(),
|
|
18367
18350
|
name: z.string(),
|
|
@@ -18439,8 +18422,8 @@ const RegistryFeedResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18439
18422
|
cursor: z.uuid().nullable(),
|
|
18440
18423
|
has_more: z.boolean(),
|
|
18441
18424
|
freshness: z.object({
|
|
18442
|
-
generated_at: z.
|
|
18443
|
-
latest_event_created_at: z.
|
|
18425
|
+
generated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18426
|
+
latest_event_created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").nullable(),
|
|
18444
18427
|
lag_seconds: z.int().min(0).nullable(),
|
|
18445
18428
|
retention_days: z.int().min(1)
|
|
18446
18429
|
}).passthrough()
|
|
@@ -18450,7 +18433,7 @@ const WholesaleFeedEventSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18450
18433
|
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
18434
|
entity_type: z.union([z.literal("product"), z.literal("signal"), z.literal("feed")]),
|
|
18452
18435
|
entity_id: z.string(),
|
|
18453
|
-
created_at: z.
|
|
18436
|
+
created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18454
18437
|
payload: z.object({}).passthrough()
|
|
18455
18438
|
}).passthrough().and(z.union([z.object({
|
|
18456
18439
|
event_type: z.literal("product.created"),
|
|
@@ -18479,7 +18462,7 @@ const WholesaleFeedEventSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18479
18462
|
pricing_options: z.array(PricingOptionSchema).optional(),
|
|
18480
18463
|
canonical_pricing_options: z.array(CanonicalPricingOptionSchema).optional(),
|
|
18481
18464
|
previous_pricing_option_ids: z.array(z.string()).optional(),
|
|
18482
|
-
effective_at: z.
|
|
18465
|
+
effective_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18483
18466
|
retracts_event_id: z.uuid().optional(),
|
|
18484
18467
|
applies_to: CacheLayerScopeSchema
|
|
18485
18468
|
}).passthrough().optional()
|
|
@@ -18518,7 +18501,7 @@ const WholesaleFeedEventSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18518
18501
|
signal_ref: SignalRefSchema.optional(),
|
|
18519
18502
|
pricing_options: z.array(VendorPricingOptionSchema),
|
|
18520
18503
|
previous_pricing_option_ids: z.array(z.string()).optional(),
|
|
18521
|
-
effective_at: z.
|
|
18504
|
+
effective_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18522
18505
|
retracts_event_id: z.uuid().optional(),
|
|
18523
18506
|
applies_to: CacheLayerScopeSchema
|
|
18524
18507
|
}).passthrough().optional()
|
|
@@ -18541,12 +18524,12 @@ const WholesaleFeedEventSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18541
18524
|
applies_to: CacheLayerScopeSchema,
|
|
18542
18525
|
affected_entity_type: z.union([z.literal("product"), z.literal("signal")])
|
|
18543
18526
|
}).passthrough().optional()
|
|
18544
|
-
}).passthrough()])))();
|
|
18527
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18545
18528
|
const WholesaleFeedWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
18546
18529
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
18547
18530
|
notification_id: z.uuid(),
|
|
18548
18531
|
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.
|
|
18532
|
+
fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18550
18533
|
subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
|
|
18551
18534
|
account_id: z.string(),
|
|
18552
18535
|
wholesale_feed_version: z.string(),
|
|
@@ -18609,7 +18592,7 @@ const ListProductsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18609
18592
|
replayed: z.literal(true).optional(),
|
|
18610
18593
|
context: ContextObjectSchema.optional(),
|
|
18611
18594
|
ext: ExtensionObjectSchema.optional()
|
|
18612
|
-
}).passthrough()])))();
|
|
18595
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18613
18596
|
const BuyProductsResponseSchema = /* @__PURE__ */ (() => MediaBuyCommitmentResponseSchema)();
|
|
18614
18597
|
const AcceptProposalResponseSchema = /* @__PURE__ */ (() => MediaBuyCommitmentResponseSchema)();
|
|
18615
18598
|
const ExplicitPackagesWithFixedAllocationSchema = /* @__PURE__ */ (() => z.object({
|
|
@@ -18632,7 +18615,7 @@ const CreateMediaBuyResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18632
18615
|
payload: z.object({}).passthrough().optional(),
|
|
18633
18616
|
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
18617
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
18635
|
-
}).passthrough().and(z.union([CreateMediaBuySuccessSchema, CreateMediaBuyErrorSchema, CreateMediaBuySubmittedSchema])))();
|
|
18618
|
+
}).passthrough().and(z.union([CreateMediaBuySuccessSchema, CreateMediaBuyErrorSchema, CreateMediaBuySubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18636
18619
|
const UpdateMediaBuyRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
18637
18620
|
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
18621
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
@@ -18645,7 +18628,7 @@ const UpdateMediaBuyRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18645
18628
|
canceled: z.literal(true).optional(),
|
|
18646
18629
|
cancellation_reason: z.string().max(500).optional(),
|
|
18647
18630
|
start_time: StartTimingSchema.optional(),
|
|
18648
|
-
end_time: z.
|
|
18631
|
+
end_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18649
18632
|
total_budget: z.object({
|
|
18650
18633
|
amount: z.number().min(0),
|
|
18651
18634
|
currency: z.string().regex(/^[A-Z]{3}$/)
|
|
@@ -18677,7 +18660,7 @@ const GetMediaBuysResponseMediaBuySchema = /* @__PURE__ */ (() => z.object({
|
|
|
18677
18660
|
account: AccountSchema.optional(),
|
|
18678
18661
|
invoice_recipient: BusinessEntitySchema.optional(),
|
|
18679
18662
|
status: MediaBuyStatusSchema,
|
|
18680
|
-
status_as_of: z.
|
|
18663
|
+
status_as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
|
|
18681
18664
|
health: MediaBuyHealthSchema.and(z.string()).optional(),
|
|
18682
18665
|
impairments: z.array(ImpairmentSchema).optional(),
|
|
18683
18666
|
rejection_reason: z.string().optional(),
|
|
@@ -18689,25 +18672,25 @@ const GetMediaBuysResponseMediaBuySchema = /* @__PURE__ */ (() => z.object({
|
|
|
18689
18672
|
budget_allocation: BudgetAllocationSchema.optional(),
|
|
18690
18673
|
pacing: PacingSchema.optional(),
|
|
18691
18674
|
bidding: BiddingPolicySchema.optional(),
|
|
18692
|
-
start_time: z.
|
|
18693
|
-
end_time: z.
|
|
18694
|
-
creative_deadline: z.
|
|
18695
|
-
confirmed_at: z.
|
|
18675
|
+
start_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18676
|
+
end_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18677
|
+
creative_deadline: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18678
|
+
confirmed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
|
|
18696
18679
|
cancellation: z.object({
|
|
18697
|
-
canceled_at: z.
|
|
18680
|
+
canceled_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18698
18681
|
canceled_by: CanceledBySchema,
|
|
18699
18682
|
reason: z.string().max(500).optional()
|
|
18700
18683
|
}).passthrough().optional(),
|
|
18701
18684
|
revision: z.int().min(1).optional(),
|
|
18702
|
-
created_at: z.
|
|
18703
|
-
updated_at: z.
|
|
18685
|
+
created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18686
|
+
updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18704
18687
|
context: ContextObjectSchema.optional(),
|
|
18705
18688
|
valid_actions: z.array(MediaBuyValidActionSchema).optional(),
|
|
18706
18689
|
available_actions: z.array(z.union([CanonicalMediaBuyActionSchema, MediaBuyAvailableActionSchema])).optional(),
|
|
18707
18690
|
webhook_activity: z.array(WebhookActivityRecordSchema).max(200).optional(),
|
|
18708
18691
|
history: z.array(z.object({
|
|
18709
18692
|
revision: z.int().min(1),
|
|
18710
|
-
timestamp: z.
|
|
18693
|
+
timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18711
18694
|
actor: z.string().optional(),
|
|
18712
18695
|
action: z.string(),
|
|
18713
18696
|
summary: z.string().max(500).optional(),
|
|
@@ -18737,12 +18720,12 @@ const GetReportingStatusResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18737
18720
|
adcp_major_version: z.number().gte(1).lte(99).int().optional(),
|
|
18738
18721
|
view: ReportingStatusViewSchema.optional(),
|
|
18739
18722
|
ledger_snapshot_id: z.string().min(1).max(255).optional(),
|
|
18740
|
-
ledger_as_of: z.
|
|
18723
|
+
ledger_as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18741
18724
|
changes_checkpoint: z.string().min(1).max(2048).optional(),
|
|
18742
18725
|
account_id: z.string().min(1).optional(),
|
|
18743
18726
|
scope: z.object({
|
|
18744
|
-
period_start: z.
|
|
18745
|
-
period_end: z.
|
|
18727
|
+
period_start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18728
|
+
period_end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18746
18729
|
scope_closed: z.boolean(),
|
|
18747
18730
|
media_buy_ids: z.array(ReportingMediaBuyIDSchema).optional(),
|
|
18748
18731
|
all_accessible_media_buys: z.boolean(),
|
|
@@ -18753,13 +18736,13 @@ const GetReportingStatusResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18753
18736
|
}).passthrough()),
|
|
18754
18737
|
feed_purposes: z.array(ReportingFeedPurposeSchema),
|
|
18755
18738
|
finality: z.array(ReportingFinalitySchema),
|
|
18756
|
-
ledger_retained_from: z.
|
|
18739
|
+
ledger_retained_from: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18757
18740
|
coverage_complete: z.boolean()
|
|
18758
18741
|
}).passthrough().optional(),
|
|
18759
18742
|
health: ReportingHealthSchema.optional(),
|
|
18760
18743
|
coverage: ReportingCoverageSchema.optional(),
|
|
18761
|
-
data_through: z.
|
|
18762
|
-
next_expected_at: z.
|
|
18744
|
+
data_through: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
|
|
18745
|
+
next_expected_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18763
18746
|
obligation_counts: z.object({
|
|
18764
18747
|
total: z.int().min(0),
|
|
18765
18748
|
waiting: z.int().min(0),
|
|
@@ -18781,7 +18764,7 @@ const GetReportingStatusResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18781
18764
|
receipts: z.array(ReportingReceiptSchema).optional(),
|
|
18782
18765
|
errors: z.array(ErrorSchema).optional(),
|
|
18783
18766
|
ext: ExtensionObjectSchema.optional()
|
|
18784
|
-
}).passthrough().and(z.union([SuccessfulLookupSchema, FailedLookupSchema])).superRefine((value, ctx) => {
|
|
18767
|
+
}).passthrough().and(z.union([SuccessfulLookupSchema, FailedLookupSchema]).describe("Must also satisfy at least one of these alternatives.")).superRefine((value, ctx) => {
|
|
18785
18768
|
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
18769
|
const addIssues = (schema, candidate, path) => {
|
|
18787
18770
|
const parsed = schema.safeParse(candidate);
|
|
@@ -18870,8 +18853,8 @@ const ListedCreativeNamedFormatReferenceSchema = /* @__PURE__ */ (() => z.object
|
|
|
18870
18853
|
format_id: FormatReferenceStructuredObjectSchema,
|
|
18871
18854
|
format_option_ref: FormatOptionReferenceSchema.optional(),
|
|
18872
18855
|
status: CreativeStatusSchema,
|
|
18873
|
-
created_date: z.
|
|
18874
|
-
updated_date: z.
|
|
18856
|
+
created_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18857
|
+
updated_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18875
18858
|
assets: z.record(z.string(), z.union([AssetVariantSchema, z.array(AssetVariantSchema)])).optional(),
|
|
18876
18859
|
component_assets: z.record(z.string(), CreativeAssetsSchema).optional(),
|
|
18877
18860
|
localization: CreativeLocalizationReadbackSchema.optional(),
|
|
@@ -18893,30 +18876,30 @@ const ListedCreativeNamedFormatReferenceSchema = /* @__PURE__ */ (() => z.object
|
|
|
18893
18876
|
assigned_packages: z.array(z.object({
|
|
18894
18877
|
package_id: z.string(),
|
|
18895
18878
|
media_buy_id: z.string().optional(),
|
|
18896
|
-
assigned_date: z.
|
|
18879
|
+
assigned_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18897
18880
|
approval_status: CreativeApprovalStatusSchema.optional(),
|
|
18898
18881
|
rejection_reason: z.string().optional(),
|
|
18899
18882
|
approval_scopes: z.array(ScopedCreativeApprovalSchema).optional(),
|
|
18900
18883
|
indicators: z.array(IndicatorSchema.and(z.object({
|
|
18901
18884
|
type: z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]).optional()
|
|
18902
18885
|
}).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.
|
|
18886
|
+
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(),
|
|
18887
|
+
indicators_as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18905
18888
|
indicators_evaluated_scope: z.array(IndicatorScopeSchema).optional()
|
|
18906
18889
|
}).passthrough()).optional()
|
|
18907
18890
|
}).passthrough().optional(),
|
|
18908
18891
|
snapshot: z.object({
|
|
18909
|
-
as_of: z.
|
|
18892
|
+
as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18910
18893
|
staleness_seconds: z.int().min(0),
|
|
18911
18894
|
impressions: z.int().min(0),
|
|
18912
|
-
last_served: z.
|
|
18895
|
+
last_served: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
18913
18896
|
}).passthrough().optional(),
|
|
18914
18897
|
snapshot_unavailable_reason: SnapshotUnavailableReasonSchema.optional(),
|
|
18915
18898
|
items: z.array(CreativeItemSchema).optional(),
|
|
18916
18899
|
pricing_options: z.array(VendorPricingOptionSchema).optional(),
|
|
18917
18900
|
purge: z.object({
|
|
18918
18901
|
kind: z.literal("soft"),
|
|
18919
|
-
at: z.
|
|
18902
|
+
at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18920
18903
|
reason_code: CreativeEventReasonCodeSchema
|
|
18921
18904
|
}).passthrough().optional(),
|
|
18922
18905
|
webhook_activity: z.array(WebhookActivityRecordSchema).max(200).optional()
|
|
@@ -18930,8 +18913,8 @@ const ListedCreativeCanonicalFormatKindSchema = /* @__PURE__ */ (() => z.object(
|
|
|
18930
18913
|
format_kind: CanonicalFormatKindSchema,
|
|
18931
18914
|
format_option_ref: FormatOptionReferenceSchema.optional(),
|
|
18932
18915
|
status: CreativeStatusSchema,
|
|
18933
|
-
created_date: z.
|
|
18934
|
-
updated_date: z.
|
|
18916
|
+
created_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18917
|
+
updated_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18935
18918
|
assets: z.record(z.string(), z.union([AssetVariantSchema, z.array(AssetVariantSchema)])).optional(),
|
|
18936
18919
|
component_assets: z.record(z.string(), CreativeAssetsSchema).optional(),
|
|
18937
18920
|
localization: CreativeLocalizationReadbackSchema.optional(),
|
|
@@ -18953,30 +18936,30 @@ const ListedCreativeCanonicalFormatKindSchema = /* @__PURE__ */ (() => z.object(
|
|
|
18953
18936
|
assigned_packages: z.array(z.object({
|
|
18954
18937
|
package_id: z.string(),
|
|
18955
18938
|
media_buy_id: z.string().optional(),
|
|
18956
|
-
assigned_date: z.
|
|
18939
|
+
assigned_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18957
18940
|
approval_status: CreativeApprovalStatusSchema.optional(),
|
|
18958
18941
|
rejection_reason: z.string().optional(),
|
|
18959
18942
|
approval_scopes: z.array(ScopedCreativeApprovalSchema).optional(),
|
|
18960
18943
|
indicators: z.array(IndicatorSchema.and(z.object({
|
|
18961
18944
|
type: z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]).optional()
|
|
18962
18945
|
}).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.
|
|
18946
|
+
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(),
|
|
18947
|
+
indicators_as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
18965
18948
|
indicators_evaluated_scope: z.array(IndicatorScopeSchema).optional()
|
|
18966
18949
|
}).passthrough()).optional()
|
|
18967
18950
|
}).passthrough().optional(),
|
|
18968
18951
|
snapshot: z.object({
|
|
18969
|
-
as_of: z.
|
|
18952
|
+
as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18970
18953
|
staleness_seconds: z.int().min(0),
|
|
18971
18954
|
impressions: z.int().min(0),
|
|
18972
|
-
last_served: z.
|
|
18955
|
+
last_served: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
|
|
18973
18956
|
}).passthrough().optional(),
|
|
18974
18957
|
snapshot_unavailable_reason: SnapshotUnavailableReasonSchema.optional(),
|
|
18975
18958
|
items: z.array(CreativeItemSchema).optional(),
|
|
18976
18959
|
pricing_options: z.array(VendorPricingOptionSchema).optional(),
|
|
18977
18960
|
purge: z.object({
|
|
18978
18961
|
kind: z.literal("soft"),
|
|
18979
|
-
at: z.
|
|
18962
|
+
at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
18980
18963
|
reason_code: CreativeEventReasonCodeSchema
|
|
18981
18964
|
}).passthrough().optional(),
|
|
18982
18965
|
webhook_activity: z.array(WebhookActivityRecordSchema).max(200).optional()
|
|
@@ -19023,7 +19006,7 @@ const SyncAccountsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
19023
19006
|
payload: z.object({}).passthrough().optional(),
|
|
19024
19007
|
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
19008
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
19026
|
-
}).passthrough().and(z.union([SyncAccountsSuccessSchema, SyncAccountsErrorSchema])))();
|
|
19009
|
+
}).passthrough().and(z.union([SyncAccountsSuccessSchema, SyncAccountsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
19027
19010
|
const ComplyTestControllerRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
19028
19011
|
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
19012
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
@@ -19046,7 +19029,7 @@ const ComplyTestControllerRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
19046
19029
|
catalog_id: z.string().min(1).max(255).optional(),
|
|
19047
19030
|
catalog_generation: z.string().min(1).max(255).optional(),
|
|
19048
19031
|
item_id: z.string().min(1).max(255).optional(),
|
|
19049
|
-
target_time: z.
|
|
19032
|
+
target_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
19050
19033
|
status: z.string().optional(),
|
|
19051
19034
|
rejection_reason: z.string().optional(),
|
|
19052
19035
|
purge_kind: z.union([z.literal("soft"), z.literal("hard")]).optional(),
|
|
@@ -19101,7 +19084,7 @@ const ComplyTestControllerRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
19101
19084
|
upstream_name: z.string().optional(),
|
|
19102
19085
|
cache_age_seconds: z.int().min(0).optional(),
|
|
19103
19086
|
result: ComplianceTaskCompletionDataSchema.optional(),
|
|
19104
|
-
since_timestamp: z.
|
|
19087
|
+
since_timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
|
|
19105
19088
|
endpoint_pattern: z.string().optional(),
|
|
19106
19089
|
limit: z.int().min(1).max(1e3).optional(),
|
|
19107
19090
|
attestation_mode: z.union([z.literal("raw"), z.literal("digest")]).optional(),
|
|
@@ -19127,7 +19110,7 @@ const ComplyTestControllerResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
19127
19110
|
payload: z.object({}).passthrough().optional(),
|
|
19128
19111
|
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
19112
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
19130
|
-
}).passthrough().and(z.union([ListScenariosSuccessSchema, StateTransitionSuccessSchema, SimulationSuccessSchema, ForcedDirectiveSuccessSchema, SeedSuccessSchema, ProvenanceAuditObservationsSuccessSchema, UpstreamTrafficSuccessSchema, ControllerErrorSchema])))();
|
|
19113
|
+
}).passthrough().and(z.union([ListScenariosSuccessSchema, StateTransitionSuccessSchema, SimulationSuccessSchema, ForcedDirectiveSuccessSchema, SeedSuccessSchema, ProvenanceAuditObservationsSuccessSchema, UpstreamTrafficSuccessSchema, ControllerErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
19131
19114
|
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
19115
|
const MCPWebhookPayloadSchema = /* @__PURE__ */ (() => z.object({
|
|
19133
19116
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
@@ -19137,7 +19120,7 @@ const MCPWebhookPayloadSchema = /* @__PURE__ */ (() => z.object({
|
|
|
19137
19120
|
task_type: TaskTypeSchema,
|
|
19138
19121
|
protocol: AdCPProtocolSchema.optional(),
|
|
19139
19122
|
status: TaskStatusSchema,
|
|
19140
|
-
timestamp: z.
|
|
19123
|
+
timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
19141
19124
|
message: z.string().optional(),
|
|
19142
19125
|
context_id: z.string().optional(),
|
|
19143
19126
|
token: z.string().min(16).max(4096).optional(),
|
|
@@ -19168,7 +19151,7 @@ const CreateMediaBuyRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
19168
19151
|
invoice_recipient: BusinessEntitySchema.optional(),
|
|
19169
19152
|
io_acceptance: z.object({
|
|
19170
19153
|
io_id: z.string(),
|
|
19171
|
-
accepted_at: z.
|
|
19154
|
+
accepted_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
19172
19155
|
signatory: z.string().min(1).max(250),
|
|
19173
19156
|
signature_id: z.string().optional()
|
|
19174
19157
|
}).passthrough().optional(),
|
|
@@ -19176,7 +19159,7 @@ const CreateMediaBuyRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
19176
19159
|
name: z.string().min(1).max(255).regex(/\S/).optional(),
|
|
19177
19160
|
agency_estimate_number: z.string().max(100).optional(),
|
|
19178
19161
|
start_time: StartTimingSchema,
|
|
19179
|
-
end_time: z.
|
|
19162
|
+
end_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
|
|
19180
19163
|
pacing: PacingSchema.optional(),
|
|
19181
19164
|
bidding: BiddingPolicySchema.optional(),
|
|
19182
19165
|
paused: z.boolean().optional(),
|