@adcp/sdk 15.9.6 → 15.9.7
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/bin/adcp.js +1 -1
- package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +2 -4
- package/compliance/cache/{3.1.29/protocols → 3.1.30/domains}/media-buy/scenarios/dependency_impairment.yaml +2 -4
- package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +2 -4
- package/compliance/cache/{3.1.29/protocols → 3.1.30/domains}/media-buy/scenarios/invalid_transitions.yaml +2 -4
- package/compliance/cache/{3.1.29/protocols → 3.1.30/domains}/media-buy/scenarios/measurement_terms_rejected.yaml +6 -7
- package/compliance/cache/{3.1.29/protocols → 3.1.30/domains}/media-buy/scenarios/provenance_audit_observation.yaml +10 -5
- package/compliance/cache/{3.1.29/protocols → 3.1.30/domains}/media-buy/scenarios/provenance_truth_of_claim.yaml +13 -14
- package/compliance/cache/{3.1.29 → 3.1.30}/index.json +3 -3
- package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +2 -4
- package/compliance/cache/{3.1.29/domains → 3.1.30/protocols}/media-buy/scenarios/dependency_impairment.yaml +2 -4
- package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +2 -4
- package/compliance/cache/{3.1.29/domains → 3.1.30/protocols}/media-buy/scenarios/invalid_transitions.yaml +2 -4
- package/compliance/cache/{3.1.29/domains → 3.1.30/protocols}/media-buy/scenarios/measurement_terms_rejected.yaml +6 -7
- package/compliance/cache/{3.1.29/domains → 3.1.30/protocols}/media-buy/scenarios/provenance_audit_observation.yaml +10 -5
- package/compliance/cache/{3.1.29/domains → 3.1.30/protocols}/media-buy/scenarios/provenance_truth_of_claim.yaml +13 -14
- package/compliance/cache/{3.1.29 → 3.1.30}/universal/stale-response-advisory.yaml +75 -67
- package/compliance/cache/{3.1.29 → 3.1.30}/universal/storyboard-schema.yaml +7 -0
- package/dist/lib/registry/types.generated.d.mts +63 -6
- package/dist/lib/registry/types.generated.d.ts +63 -6
- package/dist/lib/reporting/source/schemas/reporting-source-capabilities-v1.json +1 -1
- package/dist/lib/reporting/source/schemas/reporting-source-error-v1.json +1 -1
- package/dist/lib/reporting/source/schemas/reporting-source-offering-v1.json +1 -1
- 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/schemas-data/3.1/a2ui/bound-value.json +1 -1
- package/dist/lib/schemas-data/3.1/a2ui/component.json +1 -1
- package/dist/lib/schemas-data/3.1/a2ui/si-catalog.json +25 -25
- package/dist/lib/schemas-data/3.1/a2ui/surface.json +2 -2
- package/dist/lib/schemas-data/3.1/a2ui/user-action.json +1 -1
- package/dist/lib/schemas-data/3.1/aao/agent-publishers.json +1 -1
- package/dist/lib/schemas-data/3.1/account/get-account-financials-request.json +6 -6
- package/dist/lib/schemas-data/3.1/account/get-account-financials-response.json +12 -12
- package/dist/lib/schemas-data/3.1/account/list-accounts-request.json +6 -6
- package/dist/lib/schemas-data/3.1/account/list-accounts-response.json +8 -8
- package/dist/lib/schemas-data/3.1/account/report-usage-request.json +6 -6
- package/dist/lib/schemas-data/3.1/account/report-usage-response.json +6 -6
- package/dist/lib/schemas-data/3.1/account/sync-accounts-request.json +12 -12
- package/dist/lib/schemas-data/3.1/account/sync-accounts-response.json +16 -16
- package/dist/lib/schemas-data/3.1/account/sync-governance-request.json +6 -6
- package/dist/lib/schemas-data/3.1/account/sync-governance-response.json +10 -10
- package/dist/lib/schemas-data/3.1/adagents.json +29 -29
- package/dist/lib/schemas-data/3.1/brand/acquire-rights-request.json +10 -10
- package/dist/lib/schemas-data/3.1/brand/acquire-rights-response.json +16 -16
- package/dist/lib/schemas-data/3.1/brand/creative-approval-request.json +5 -5
- package/dist/lib/schemas-data/3.1/brand/creative-approval-response.json +12 -12
- package/dist/lib/schemas-data/3.1/brand/get-brand-identity-request.json +4 -4
- package/dist/lib/schemas-data/3.1/brand/get-brand-identity-response.json +10 -10
- package/dist/lib/schemas-data/3.1/brand/get-rights-request.json +8 -8
- package/dist/lib/schemas-data/3.1/brand/get-rights-response.json +11 -11
- package/dist/lib/schemas-data/3.1/brand/revocation-notification.json +4 -4
- package/dist/lib/schemas-data/3.1/brand/rights-pricing-option.json +5 -5
- package/dist/lib/schemas-data/3.1/brand/rights-terms.json +3 -3
- package/dist/lib/schemas-data/3.1/brand/search-brands-request.json +6 -6
- package/dist/lib/schemas-data/3.1/brand/search-brands-response.json +11 -11
- package/dist/lib/schemas-data/3.1/brand/update-rights-request.json +6 -6
- package/dist/lib/schemas-data/3.1/brand/update-rights-response.json +11 -11
- package/dist/lib/schemas-data/3.1/brand/verification-status.json +1 -1
- package/dist/lib/schemas-data/3.1/brand/verify-brand-claim-request.json +2 -2
- package/dist/lib/schemas-data/3.1/brand/verify-brand-claim-response.json +13 -13
- package/dist/lib/schemas-data/3.1/brand/verify-brand-claims-request.json +2 -2
- package/dist/lib/schemas-data/3.1/brand/verify-brand-claims-response.json +13 -13
- package/dist/lib/schemas-data/3.1/brand.json +21 -21
- package/dist/lib/schemas-data/3.1/bundled.schemas.br +0 -0
- package/dist/lib/schemas-data/3.1/collection/base-collection-source.json +3 -3
- package/dist/lib/schemas-data/3.1/collection/collection-list-changed-webhook.json +2 -2
- package/dist/lib/schemas-data/3.1/collection/collection-list-filters.json +7 -7
- package/dist/lib/schemas-data/3.1/collection/collection-list.json +5 -5
- package/dist/lib/schemas-data/3.1/collection/create-collection-list-request.json +8 -8
- package/dist/lib/schemas-data/3.1/collection/create-collection-list-response.json +6 -6
- package/dist/lib/schemas-data/3.1/collection/delete-collection-list-request.json +5 -5
- package/dist/lib/schemas-data/3.1/collection/delete-collection-list-response.json +5 -5
- package/dist/lib/schemas-data/3.1/collection/get-collection-list-request.json +5 -5
- package/dist/lib/schemas-data/3.1/collection/get-collection-list-response.json +12 -12
- package/dist/lib/schemas-data/3.1/collection/list-collection-lists-request.json +6 -6
- package/dist/lib/schemas-data/3.1/collection/list-collection-lists-response.json +7 -7
- package/dist/lib/schemas-data/3.1/collection/update-collection-list-request.json +8 -8
- package/dist/lib/schemas-data/3.1/collection/update-collection-list-response.json +6 -6
- package/dist/lib/schemas-data/3.1/content-standards/artifact-webhook-payload.json +3 -3
- package/dist/lib/schemas-data/3.1/content-standards/artifact.json +7 -7
- package/dist/lib/schemas-data/3.1/content-standards/calibrate-content-request.json +5 -5
- package/dist/lib/schemas-data/3.1/content-standards/calibrate-content-response.json +10 -10
- package/dist/lib/schemas-data/3.1/content-standards/content-standards.json +7 -7
- package/dist/lib/schemas-data/3.1/content-standards/create-content-standards-request.json +8 -8
- package/dist/lib/schemas-data/3.1/content-standards/create-content-standards-response.json +8 -8
- package/dist/lib/schemas-data/3.1/content-standards/get-content-standards-request.json +4 -4
- package/dist/lib/schemas-data/3.1/content-standards/get-content-standards-response.json +9 -9
- package/dist/lib/schemas-data/3.1/content-standards/get-media-buy-artifacts-request.json +5 -5
- package/dist/lib/schemas-data/3.1/content-standards/get-media-buy-artifacts-response.json +10 -10
- package/dist/lib/schemas-data/3.1/content-standards/list-content-standards-request.json +6 -6
- package/dist/lib/schemas-data/3.1/content-standards/list-content-standards-response.json +10 -10
- package/dist/lib/schemas-data/3.1/content-standards/update-content-standards-request.json +8 -8
- package/dist/lib/schemas-data/3.1/content-standards/update-content-standards-response.json +8 -8
- package/dist/lib/schemas-data/3.1/content-standards/validate-content-delivery-request.json +5 -5
- package/dist/lib/schemas-data/3.1/content-standards/validate-content-delivery-response.json +10 -10
- package/dist/lib/schemas-data/3.1/core/account-authorization.json +1 -1
- package/dist/lib/schemas-data/3.1/core/account-ref.json +2 -2
- package/dist/lib/schemas-data/3.1/core/account-with-authorization.json +3 -3
- package/dist/lib/schemas-data/3.1/core/account.json +10 -10
- package/dist/lib/schemas-data/3.1/core/activation-key.json +1 -1
- package/dist/lib/schemas-data/3.1/core/ad-inventory-config.json +1 -1
- package/dist/lib/schemas-data/3.1/core/agent-encryption-key.json +1 -1
- package/dist/lib/schemas-data/3.1/core/agent-signing-key.json +1 -1
- package/dist/lib/schemas-data/3.1/core/app-item.json +4 -4
- package/dist/lib/schemas-data/3.1/core/asset-group-vocabulary.json +1 -1
- package/dist/lib/schemas-data/3.1/core/assets/asset-union.json +21 -21
- package/dist/lib/schemas-data/3.1/core/assets/audio-asset.json +3 -3
- package/dist/lib/schemas-data/3.1/core/assets/brief-asset.json +2 -2
- package/dist/lib/schemas-data/3.1/core/assets/card-asset.json +6 -6
- package/dist/lib/schemas-data/3.1/core/assets/catalog-asset.json +2 -2
- package/dist/lib/schemas-data/3.1/core/assets/css-asset.json +2 -2
- package/dist/lib/schemas-data/3.1/core/assets/daast-asset.json +5 -5
- package/dist/lib/schemas-data/3.1/core/assets/daast-tracker-asset.json +4 -4
- package/dist/lib/schemas-data/3.1/core/assets/html-asset.json +2 -2
- package/dist/lib/schemas-data/3.1/core/assets/image-asset.json +2 -2
- package/dist/lib/schemas-data/3.1/core/assets/javascript-asset.json +3 -3
- package/dist/lib/schemas-data/3.1/core/assets/markdown-asset.json +2 -2
- package/dist/lib/schemas-data/3.1/core/assets/pixel-tracker-asset.json +3 -3
- package/dist/lib/schemas-data/3.1/core/assets/published-post-asset.json +2 -2
- package/dist/lib/schemas-data/3.1/core/assets/text-asset.json +2 -2
- package/dist/lib/schemas-data/3.1/core/assets/url-asset.json +4 -4
- package/dist/lib/schemas-data/3.1/core/assets/vast-asset.json +5 -5
- package/dist/lib/schemas-data/3.1/core/assets/vast-tracker-asset.json +4 -4
- package/dist/lib/schemas-data/3.1/core/assets/video-asset.json +7 -7
- package/dist/lib/schemas-data/3.1/core/assets/webhook-asset.json +7 -7
- package/dist/lib/schemas-data/3.1/core/assets/zip-asset.json +2 -2
- package/dist/lib/schemas-data/3.1/core/async-response-data.json +29 -29
- package/dist/lib/schemas-data/3.1/core/async-response-refs/creative/sync-creatives-async-response-input-required.json +3 -3
- package/dist/lib/schemas-data/3.1/core/async-response-refs/creative/sync-creatives-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.1/core/async-response-refs/creative/sync-creatives-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/build-creative-async-response-input-required.json +4 -4
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/build-creative-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/build-creative-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/create-media-buy-async-response-input-required.json +4 -4
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/create-media-buy-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/create-media-buy-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/get-products-async-response-input-required.json +4 -4
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/get-products-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/get-products-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/sync-catalogs-async-response-input-required.json +3 -3
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/sync-catalogs-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/sync-catalogs-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/update-media-buy-async-response-input-required.json +3 -3
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/update-media-buy-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.1/core/async-response-refs/media-buy/update-media-buy-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.1/core/async-response-refs/signals/get-signals-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.1/core/async-response-refs/signals/get-signals-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.1/core/attribution-window.json +4 -4
- package/dist/lib/schemas-data/3.1/core/audience-member.json +3 -3
- package/dist/lib/schemas-data/3.1/core/audience-selector.json +7 -7
- package/dist/lib/schemas-data/3.1/core/authorized-agent-base.json +3 -3
- package/dist/lib/schemas-data/3.1/core/brand-id.json +1 -1
- package/dist/lib/schemas-data/3.1/core/brand-ref.json +3 -3
- package/dist/lib/schemas-data/3.1/core/business-entity.json +2 -2
- package/dist/lib/schemas-data/3.1/core/cancellation-policy.json +2 -2
- package/dist/lib/schemas-data/3.1/core/canonical-format-kind.json +1 -1
- package/dist/lib/schemas-data/3.1/core/canonical-projection-ref.json +3 -3
- package/dist/lib/schemas-data/3.1/core/canonical-projection-slot-override.json +1 -1
- package/dist/lib/schemas-data/3.1/core/catalog-field-mapping.json +2 -2
- package/dist/lib/schemas-data/3.1/core/catalog-item-delivery-metrics.json +3 -3
- package/dist/lib/schemas-data/3.1/core/catalog.json +7 -7
- package/dist/lib/schemas-data/3.1/core/catchment.json +5 -5
- package/dist/lib/schemas-data/3.1/core/collection-distribution.json +2 -2
- package/dist/lib/schemas-data/3.1/core/collection-list-ref.json +1 -1
- package/dist/lib/schemas-data/3.1/core/collection-selector.json +1 -1
- package/dist/lib/schemas-data/3.1/core/collection.json +13 -13
- package/dist/lib/schemas-data/3.1/core/committed-metric.json +9 -9
- package/dist/lib/schemas-data/3.1/core/content-rating.json +2 -2
- package/dist/lib/schemas-data/3.1/core/context.json +1 -1
- package/dist/lib/schemas-data/3.1/core/creative-asset.json +10 -10
- package/dist/lib/schemas-data/3.1/core/creative-assignment.json +2 -2
- package/dist/lib/schemas-data/3.1/core/creative-brief.json +4 -4
- package/dist/lib/schemas-data/3.1/core/creative-consumption.json +1 -1
- package/dist/lib/schemas-data/3.1/core/creative-delivery-metrics.json +2 -2
- package/dist/lib/schemas-data/3.1/core/creative-filters.json +5 -5
- package/dist/lib/schemas-data/3.1/core/creative-item.json +1 -1
- package/dist/lib/schemas-data/3.1/core/creative-manifest.json +11 -11
- package/dist/lib/schemas-data/3.1/core/creative-policy.json +3 -3
- package/dist/lib/schemas-data/3.1/core/creative-variable.json +1 -1
- package/dist/lib/schemas-data/3.1/core/creative-variant.json +5 -5
- package/dist/lib/schemas-data/3.1/core/data-provider-signal-selector.json +1 -1
- package/dist/lib/schemas-data/3.1/core/date-range.json +1 -1
- package/dist/lib/schemas-data/3.1/core/datetime-range.json +1 -1
- package/dist/lib/schemas-data/3.1/core/daypart-target.json +2 -2
- package/dist/lib/schemas-data/3.1/core/deadline-policy.json +1 -1
- package/dist/lib/schemas-data/3.1/core/delivery-forecast.json +7 -7
- package/dist/lib/schemas-data/3.1/core/delivery-metric-aggregate.json +9 -9
- package/dist/lib/schemas-data/3.1/core/delivery-metrics.json +8 -8
- package/dist/lib/schemas-data/3.1/core/deployment.json +3 -3
- package/dist/lib/schemas-data/3.1/core/destination-item.json +4 -4
- package/dist/lib/schemas-data/3.1/core/destination.json +1 -1
- package/dist/lib/schemas-data/3.1/core/diagnostic-issue.json +1 -1
- package/dist/lib/schemas-data/3.1/core/downstream-connection-requirement.json +1 -1
- package/dist/lib/schemas-data/3.1/core/duration.json +1 -1
- package/dist/lib/schemas-data/3.1/core/education-item.json +4 -4
- package/dist/lib/schemas-data/3.1/core/error.json +1 -1
- package/dist/lib/schemas-data/3.1/core/evaluator-spec.json +5 -5
- package/dist/lib/schemas-data/3.1/core/event-custom-data.json +2 -2
- package/dist/lib/schemas-data/3.1/core/event-source-health.json +3 -3
- package/dist/lib/schemas-data/3.1/core/event-surface.json +2 -2
- package/dist/lib/schemas-data/3.1/core/event.json +8 -8
- package/dist/lib/schemas-data/3.1/core/ext.json +1 -1
- package/dist/lib/schemas-data/3.1/core/feature-requirement.json +1 -1
- package/dist/lib/schemas-data/3.1/core/flight-item.json +4 -4
- package/dist/lib/schemas-data/3.1/core/forecast-dimension-audience.json +2 -2
- package/dist/lib/schemas-data/3.1/core/forecast-dimension-device-platform.json +2 -2
- package/dist/lib/schemas-data/3.1/core/forecast-dimension-device-type.json +2 -2
- package/dist/lib/schemas-data/3.1/core/forecast-dimension-geo.json +5 -5
- package/dist/lib/schemas-data/3.1/core/forecast-dimension-placement.json +2 -2
- package/dist/lib/schemas-data/3.1/core/forecast-dimension-signal.json +2 -2
- package/dist/lib/schemas-data/3.1/core/forecast-point-dimensions.json +7 -7
- package/dist/lib/schemas-data/3.1/core/forecast-point.json +27 -27
- package/dist/lib/schemas-data/3.1/core/forecast-range.json +1 -1
- package/dist/lib/schemas-data/3.1/core/forecast-vendor-metric-value.json +5 -5
- package/dist/lib/schemas-data/3.1/core/format-id.json +1 -1
- package/dist/lib/schemas-data/3.1/core/format-option-ref.json +1 -1
- package/dist/lib/schemas-data/3.1/core/format-shape-vocabulary.json +1 -1
- package/dist/lib/schemas-data/3.1/core/format.json +45 -45
- package/dist/lib/schemas-data/3.1/core/frequency-cap.json +4 -4
- package/dist/lib/schemas-data/3.1/core/generation-credential.json +3 -3
- package/dist/lib/schemas-data/3.1/core/geo-breakdown-support.json +3 -3
- package/dist/lib/schemas-data/3.1/core/geo-delivery-metrics.json +6 -6
- package/dist/lib/schemas-data/3.1/core/hotel-item.json +4 -4
- package/dist/lib/schemas-data/3.1/core/identifier.json +2 -2
- package/dist/lib/schemas-data/3.1/core/impairment.json +3 -3
- package/dist/lib/schemas-data/3.1/core/industry-identifier.json +2 -2
- package/dist/lib/schemas-data/3.1/core/insertion-order.json +1 -1
- package/dist/lib/schemas-data/3.1/core/installment-deadlines.json +2 -2
- package/dist/lib/schemas-data/3.1/core/installment.json +9 -9
- package/dist/lib/schemas-data/3.1/core/job-item.json +3 -3
- package/dist/lib/schemas-data/3.1/core/keyword-delivery-metrics.json +3 -3
- package/dist/lib/schemas-data/3.1/core/limited-series.json +1 -1
- package/dist/lib/schemas-data/3.1/core/macro-bearing-url.json +1 -1
- package/dist/lib/schemas-data/3.1/core/material-deadline.json +1 -1
- package/dist/lib/schemas-data/3.1/core/mcp-webhook-payload.json +5 -5
- package/dist/lib/schemas-data/3.1/core/measurement-readiness.json +5 -5
- package/dist/lib/schemas-data/3.1/core/measurement-terms.json +3 -3
- package/dist/lib/schemas-data/3.1/core/measurement-window.json +1 -1
- package/dist/lib/schemas-data/3.1/core/media-buy-available-action.json +4 -4
- package/dist/lib/schemas-data/3.1/core/media-buy-features.json +1 -1
- package/dist/lib/schemas-data/3.1/core/media-buy.json +10 -10
- package/dist/lib/schemas-data/3.1/core/missing-metric.json +9 -9
- package/dist/lib/schemas-data/3.1/core/notification-config.json +4 -4
- package/dist/lib/schemas-data/3.1/core/offering-asset-group.json +16 -16
- package/dist/lib/schemas-data/3.1/core/offering.json +5 -5
- package/dist/lib/schemas-data/3.1/core/optimization-goal.json +7 -7
- package/dist/lib/schemas-data/3.1/core/outcome-measurement.json +2 -2
- package/dist/lib/schemas-data/3.1/core/overlay.json +1 -1
- package/dist/lib/schemas-data/3.1/core/package-signal-targeting-group.json +2 -2
- package/dist/lib/schemas-data/3.1/core/package-signal-targeting-groups.json +2 -2
- package/dist/lib/schemas-data/3.1/core/package-signal-targeting.json +3 -3
- package/dist/lib/schemas-data/3.1/core/package.json +17 -17
- package/dist/lib/schemas-data/3.1/core/pagination-request.json +1 -1
- package/dist/lib/schemas-data/3.1/core/pagination-response.json +1 -1
- package/dist/lib/schemas-data/3.1/core/performance-feedback.json +12 -12
- package/dist/lib/schemas-data/3.1/core/performance-standard.json +4 -4
- package/dist/lib/schemas-data/3.1/core/placement-definition.json +10 -10
- package/dist/lib/schemas-data/3.1/core/placement-ref.json +1 -1
- package/dist/lib/schemas-data/3.1/core/placement.json +7 -7
- package/dist/lib/schemas-data/3.1/core/planned-delivery.json +5 -5
- package/dist/lib/schemas-data/3.1/core/platform-extension-ref.json +1 -1
- package/dist/lib/schemas-data/3.1/core/postal-area-support.json +2 -2
- package/dist/lib/schemas-data/3.1/core/postal-area.json +4 -4
- package/dist/lib/schemas-data/3.1/core/postal-country-system.json +2 -2
- package/dist/lib/schemas-data/3.1/core/price.json +1 -1
- package/dist/lib/schemas-data/3.1/core/pricing-option.json +10 -10
- package/dist/lib/schemas-data/3.1/core/product-allocation.json +4 -4
- package/dist/lib/schemas-data/3.1/core/product-allowed-action.json +5 -5
- package/dist/lib/schemas-data/3.1/core/product-filters.json +27 -27
- package/dist/lib/schemas-data/3.1/core/product-format-declaration.json +16 -16
- package/dist/lib/schemas-data/3.1/core/product-signal-targeting-option.json +3 -3
- package/dist/lib/schemas-data/3.1/core/product.json +40 -40
- package/dist/lib/schemas-data/3.1/core/property-id.json +1 -1
- package/dist/lib/schemas-data/3.1/core/property-list-ref.json +1 -1
- package/dist/lib/schemas-data/3.1/core/property-tag.json +1 -1
- package/dist/lib/schemas-data/3.1/core/property.json +6 -6
- package/dist/lib/schemas-data/3.1/core/proposal.json +6 -6
- package/dist/lib/schemas-data/3.1/core/protocol-envelope.json +5 -5
- package/dist/lib/schemas-data/3.1/core/provenance.json +9 -9
- package/dist/lib/schemas-data/3.1/core/publisher-property-selector.json +3 -3
- package/dist/lib/schemas-data/3.1/core/push-notification-config.json +2 -2
- package/dist/lib/schemas-data/3.1/core/real-estate-item.json +4 -4
- package/dist/lib/schemas-data/3.1/core/reference-asset.json +1 -1
- package/dist/lib/schemas-data/3.1/core/registry-event.json +14 -14
- package/dist/lib/schemas-data/3.1/core/registry-feed-response.json +2 -2
- package/dist/lib/schemas-data/3.1/core/reporting-capabilities.json +8 -8
- package/dist/lib/schemas-data/3.1/core/reporting-webhook.json +3 -3
- package/dist/lib/schemas-data/3.1/core/requirements/asset-requirements.json +13 -13
- package/dist/lib/schemas-data/3.1/core/requirements/audio-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.1/core/requirements/catalog-field-binding.json +4 -4
- package/dist/lib/schemas-data/3.1/core/requirements/catalog-requirements.json +5 -5
- package/dist/lib/schemas-data/3.1/core/requirements/css-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.1/core/requirements/daast-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.1/core/requirements/html-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.1/core/requirements/image-asset-requirements.json +2 -2
- package/dist/lib/schemas-data/3.1/core/requirements/javascript-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.1/core/requirements/markdown-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.1/core/requirements/offering-asset-constraint.json +4 -4
- package/dist/lib/schemas-data/3.1/core/requirements/text-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.1/core/requirements/url-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.1/core/requirements/vast-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.1/core/requirements/video-asset-requirements.json +6 -6
- package/dist/lib/schemas-data/3.1/core/requirements/webhook-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.1/core/response-payload-jws-envelope.json +1 -1
- package/dist/lib/schemas-data/3.1/core/response.json +1 -1
- package/dist/lib/schemas-data/3.1/core/rights-constraint.json +4 -4
- package/dist/lib/schemas-data/3.1/core/seller-agent-ref.json +1 -1
- package/dist/lib/schemas-data/3.1/core/signal-coverage-forecast.json +5 -5
- package/dist/lib/schemas-data/3.1/core/signal-definition-enrichment.json +4 -4
- package/dist/lib/schemas-data/3.1/core/signal-definition.json +5 -5
- package/dist/lib/schemas-data/3.1/core/signal-filters.json +3 -3
- package/dist/lib/schemas-data/3.1/core/signal-id.json +1 -1
- package/dist/lib/schemas-data/3.1/core/signal-listing.json +4 -4
- package/dist/lib/schemas-data/3.1/core/signal-modeling-disclosure.json +1 -1
- package/dist/lib/schemas-data/3.1/core/signal-pricing-option.json +2 -2
- package/dist/lib/schemas-data/3.1/core/signal-pricing.json +6 -6
- package/dist/lib/schemas-data/3.1/core/signal-ref.json +1 -1
- package/dist/lib/schemas-data/3.1/core/signal-selection-group-rule.json +1 -1
- package/dist/lib/schemas-data/3.1/core/signal-targeting-expression.json +4 -4
- package/dist/lib/schemas-data/3.1/core/signal-targeting-rules.json +2 -2
- package/dist/lib/schemas-data/3.1/core/signal-targeting.json +7 -7
- package/dist/lib/schemas-data/3.1/core/sla-window.json +1 -1
- package/dist/lib/schemas-data/3.1/core/special.json +2 -2
- package/dist/lib/schemas-data/3.1/core/start-timing.json +1 -1
- package/dist/lib/schemas-data/3.1/core/store-item.json +3 -3
- package/dist/lib/schemas-data/3.1/core/talent.json +2 -2
- package/dist/lib/schemas-data/3.1/core/targeting.json +22 -22
- package/dist/lib/schemas-data/3.1/core/tasks-get-request.json +5 -5
- package/dist/lib/schemas-data/3.1/core/tasks-get-response.json +10 -10
- package/dist/lib/schemas-data/3.1/core/tasks-list-request.json +13 -13
- package/dist/lib/schemas-data/3.1/core/tasks-list-response.json +8 -8
- package/dist/lib/schemas-data/3.1/core/transformer-param.json +1 -1
- package/dist/lib/schemas-data/3.1/core/transformer.json +5 -5
- package/dist/lib/schemas-data/3.1/core/truncation-sentinel.json +1 -1
- package/dist/lib/schemas-data/3.1/core/user-match.json +3 -3
- package/dist/lib/schemas-data/3.1/core/vehicle-item.json +4 -4
- package/dist/lib/schemas-data/3.1/core/vendor-metric-id.json +1 -1
- package/dist/lib/schemas-data/3.1/core/vendor-metric-optimization-supported-metric.json +3 -3
- package/dist/lib/schemas-data/3.1/core/vendor-metric-optimization.json +2 -2
- package/dist/lib/schemas-data/3.1/core/vendor-metric-value.json +3 -3
- package/dist/lib/schemas-data/3.1/core/vendor-pricing-option.json +3 -3
- package/dist/lib/schemas-data/3.1/core/version-envelope.json +1 -1
- package/dist/lib/schemas-data/3.1/core/webhook-activity-record.json +3 -3
- package/dist/lib/schemas-data/3.1/core/webhook-challenge-response.json +1 -1
- package/dist/lib/schemas-data/3.1/core/webhook-challenge.json +2 -2
- package/dist/lib/schemas-data/3.1/core/wholesale-feed-event.json +17 -17
- package/dist/lib/schemas-data/3.1/core/wholesale-feed-webhook.json +3 -3
- package/dist/lib/schemas-data/3.1/core/x-entity-types.json +1 -1
- package/dist/lib/schemas-data/3.1/creative/asset-types/index.json +6 -6
- package/dist/lib/schemas-data/3.1/creative/audit-observation.json +2 -2
- package/dist/lib/schemas-data/3.1/creative/creative-feature-result.json +2 -2
- package/dist/lib/schemas-data/3.1/creative/creative-purged-webhook.json +3 -3
- package/dist/lib/schemas-data/3.1/creative/creative-status-changed-webhook.json +4 -4
- package/dist/lib/schemas-data/3.1/creative/get-creative-delivery-request.json +6 -6
- package/dist/lib/schemas-data/3.1/creative/get-creative-delivery-response.json +9 -9
- package/dist/lib/schemas-data/3.1/creative/get-creative-features-request.json +6 -6
- package/dist/lib/schemas-data/3.1/creative/get-creative-features-response.json +11 -11
- package/dist/lib/schemas-data/3.1/creative/list-creative-formats-request.json +13 -13
- package/dist/lib/schemas-data/3.1/creative/list-creative-formats-response.json +9 -9
- package/dist/lib/schemas-data/3.1/creative/list-creatives-request.json +9 -9
- package/dist/lib/schemas-data/3.1/creative/list-creatives-response.json +21 -21
- package/dist/lib/schemas-data/3.1/creative/list-transformers-request.json +8 -8
- package/dist/lib/schemas-data/3.1/creative/list-transformers-response.json +8 -8
- package/dist/lib/schemas-data/3.1/creative/preview-creative-request.json +12 -12
- package/dist/lib/schemas-data/3.1/creative/preview-creative-response.json +14 -14
- package/dist/lib/schemas-data/3.1/creative/preview-render.json +1 -1
- package/dist/lib/schemas-data/3.1/creative/sync-creatives-async-response-input-required.json +3 -3
- package/dist/lib/schemas-data/3.1/creative/sync-creatives-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.1/creative/sync-creatives-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.1/creative/sync-creatives-request.json +8 -8
- package/dist/lib/schemas-data/3.1/creative/sync-creatives-response.json +15 -15
- package/dist/lib/schemas-data/3.1/creative/validate-input-request.json +4 -4
- package/dist/lib/schemas-data/3.1/creative/validate-input-response.json +4 -4
- package/dist/lib/schemas-data/3.1/creative/validate-input-result.json +1 -1
- package/dist/lib/schemas-data/3.1/creative/video-brief.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/account-scope.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/account-status.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/action-not-allowed-reason.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/action-source.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/adcp-protocol.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/adjustment-kind.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/advertiser-industry.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/age-verification-method.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/assessment-status.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/asset-content-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/attestation-claim.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/attribution-methodology.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/attribution-model.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/audience-source.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/audience-status.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/audio-channel-layout.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/audio-distribution-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/auth-scheme.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/available-metric.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/billing-party.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/binary-verdict.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/brand-agent-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/c2pa-watermark-action.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/canceled-by.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/catalog-action.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/catalog-item-status.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/catalog-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/channels.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/cloud-storage-protocol.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/co-branding-requirement.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/collection-cadence.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/collection-kind.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/collection-relationship.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/collection-status.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/completion-source.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/consent-basis.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/content-id-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/content-rating-system.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/creative-action.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/creative-agent-capability.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/creative-approval-status.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/creative-event-reason-code.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/creative-identifier-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/creative-quality.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/creative-selection-strategy.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/creative-sort-field.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/creative-status.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/daast-tracking-event.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/daast-version.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/day-of-week.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/delegation-authority.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/delivery-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/demographic-system.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/derivative-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/device-platform.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/device-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/digital-source-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/dimension-unit.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/disclosure-persistence.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/disclosure-position.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/distance-unit.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/distribution-identifier-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/embedded-provenance-method.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/error-code.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/error-scope.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/escalation-severity.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/event-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/exclusivity.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/feature-check-status.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/feed-format.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/feedback-source.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/forecast-method.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/forecast-range-unit.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/forecastable-metric.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/format-id-parameter.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/frame-rate-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/frequency-cap-scope.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/genre-taxonomy.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/geo-level.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/gop-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/governance-decision.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/governance-domain.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/governance-mode.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/governance-phase.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/history-entry-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/http-method.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/identifier-types.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/impairment-offline-state.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/impairment-reason-code.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/installment-status.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/javascript-module-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/landing-page-requirement.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/legacy-postal-system.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/lift-dimension.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/logo-slot.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/makegood-remedy.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/markdown-flavor.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/match-id-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/match-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/media-buy-action-mode.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/media-buy-health.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/media-buy-status.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/media-buy-valid-action.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/metric-scope.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/metric-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/metro-system.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/moov-atom-position.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/notification-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/offering-availability-status.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/outcome-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/pacing.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/payment-terms.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/performance-standard-metric.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/policy-category.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/policy-enforcement.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/postal-system.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/preview-output-format.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/pricing-model.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/production-quality.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/property-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/proposal-status.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/publisher-identifier-types.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/purchase-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/reach-unit.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/reporting-frequency.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/response-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/restricted-attribute.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/right-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/right-use.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/rights-billing-period.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/scan-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/si-session-status.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/signal-catalog-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/signal-source.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/signal-value-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/snapshot-unavailable-reason.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/social-placement-surface.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/sort-direction.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/sort-metric.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/special-category.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/specialism.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/sponsored-placement-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/talent-role.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/task-status.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/task-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/transport-mode.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/travel-time-unit.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/uid-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/universal-macro.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/update-frequency.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/url-asset-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/validation-mode.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/vast-tracking-event.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/vast-version.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/video-placement-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/viewability-standard.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/watermark-media-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/wcag-level.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/webhook-response-type.json +1 -1
- package/dist/lib/schemas-data/3.1/enums/webhook-security-method.json +1 -1
- package/dist/lib/schemas-data/3.1/error-details/account-setup-required.json +1 -1
- package/dist/lib/schemas-data/3.1/error-details/action-not-allowed.json +4 -4
- package/dist/lib/schemas-data/3.1/error-details/agent-permission-denied.json +1 -1
- package/dist/lib/schemas-data/3.1/error-details/audience-too-small.json +1 -1
- package/dist/lib/schemas-data/3.1/error-details/authorization-required.json +3 -3
- package/dist/lib/schemas-data/3.1/error-details/billing-not-permitted-for-agent.json +3 -3
- package/dist/lib/schemas-data/3.1/error-details/billing-not-supported.json +2 -2
- package/dist/lib/schemas-data/3.1/error-details/budget-too-low.json +1 -1
- package/dist/lib/schemas-data/3.1/error-details/conflict.json +1 -1
- package/dist/lib/schemas-data/3.1/error-details/creative-rejected.json +1 -1
- package/dist/lib/schemas-data/3.1/error-details/policy-violation.json +1 -1
- package/dist/lib/schemas-data/3.1/error-details/rate-limited.json +1 -1
- package/dist/lib/schemas-data/3.1/error-details/stale-response.json +1 -1
- package/dist/lib/schemas-data/3.1/error-details/vendor-error-codes.json +1 -1
- package/dist/lib/schemas-data/3.1/error-details/version-unsupported.json +2 -2
- package/dist/lib/schemas-data/3.1/extensions/extension-meta.json +1 -1
- package/dist/lib/schemas-data/3.1/extensions/index.json +2 -2
- package/dist/lib/schemas-data/3.1/formats/canonical/_base.json +5 -5
- package/dist/lib/schemas-data/3.1/formats/canonical/agent_placement.json +2 -2
- package/dist/lib/schemas-data/3.1/formats/canonical/audio_daast.json +2 -2
- package/dist/lib/schemas-data/3.1/formats/canonical/audio_hosted.json +2 -2
- package/dist/lib/schemas-data/3.1/formats/canonical/display_tag.json +2 -2
- package/dist/lib/schemas-data/3.1/formats/canonical/html5.json +2 -2
- package/dist/lib/schemas-data/3.1/formats/canonical/image.json +2 -2
- package/dist/lib/schemas-data/3.1/formats/canonical/image_carousel.json +2 -2
- package/dist/lib/schemas-data/3.1/formats/canonical/native_in_feed.json +2 -2
- package/dist/lib/schemas-data/3.1/formats/canonical/responsive_creative.json +2 -2
- package/dist/lib/schemas-data/3.1/formats/canonical/sponsored_placement.json +3 -3
- package/dist/lib/schemas-data/3.1/formats/canonical/video_hosted.json +2 -2
- package/dist/lib/schemas-data/3.1/formats/canonical/video_vast.json +2 -2
- package/dist/lib/schemas-data/3.1/governance/attribute-definition.json +1 -1
- package/dist/lib/schemas-data/3.1/governance/audience-constraints.json +3 -3
- package/dist/lib/schemas-data/3.1/governance/check-governance-request.json +8 -8
- package/dist/lib/schemas-data/3.1/governance/check-governance-response.json +7 -7
- package/dist/lib/schemas-data/3.1/governance/get-plan-audit-logs-request.json +5 -5
- package/dist/lib/schemas-data/3.1/governance/get-plan-audit-logs-response.json +11 -11
- package/dist/lib/schemas-data/3.1/governance/policy-category-definition.json +2 -2
- package/dist/lib/schemas-data/3.1/governance/policy-entry.json +6 -6
- package/dist/lib/schemas-data/3.1/governance/policy-ref.json +1 -1
- package/dist/lib/schemas-data/3.1/governance/report-plan-outcome-request.json +7 -7
- package/dist/lib/schemas-data/3.1/governance/report-plan-outcome-response.json +5 -5
- package/dist/lib/schemas-data/3.1/governance/sync-plans-request.json +14 -14
- package/dist/lib/schemas-data/3.1/governance/sync-plans-response.json +6 -6
- package/dist/lib/schemas-data/3.1/index.json +443 -443
- package/dist/lib/schemas-data/3.1/manifest.json +3 -3
- package/dist/lib/schemas-data/3.1/manifest.schema.json +1 -1
- package/dist/lib/schemas-data/3.1/media-buy/build-creative-async-response-input-required.json +4 -4
- package/dist/lib/schemas-data/3.1/media-buy/build-creative-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.1/media-buy/build-creative-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.1/media-buy/build-creative-request.json +16 -16
- package/dist/lib/schemas-data/3.1/media-buy/build-creative-response.json +35 -35
- package/dist/lib/schemas-data/3.1/media-buy/create-media-buy-async-response-input-required.json +4 -4
- package/dist/lib/schemas-data/3.1/media-buy/create-media-buy-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.1/media-buy/create-media-buy-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.1/media-buy/create-media-buy-request.json +13 -13
- package/dist/lib/schemas-data/3.1/media-buy/create-media-buy-response.json +19 -19
- package/dist/lib/schemas-data/3.1/media-buy/get-media-buy-delivery-request.json +23 -23
- package/dist/lib/schemas-data/3.1/media-buy/get-media-buy-delivery-response.json +27 -27
- package/dist/lib/schemas-data/3.1/media-buy/get-media-buys-request.json +8 -8
- package/dist/lib/schemas-data/3.1/media-buy/get-media-buys-response.json +30 -30
- package/dist/lib/schemas-data/3.1/media-buy/get-products-async-response-input-required.json +4 -4
- package/dist/lib/schemas-data/3.1/media-buy/get-products-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.1/media-buy/get-products-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.1/media-buy/get-products-request.json +13 -13
- package/dist/lib/schemas-data/3.1/media-buy/get-products-response.json +10 -10
- package/dist/lib/schemas-data/3.1/media-buy/list-creative-formats-request.json +13 -13
- package/dist/lib/schemas-data/3.1/media-buy/list-creative-formats-response.json +9 -9
- package/dist/lib/schemas-data/3.1/media-buy/log-event-request.json +5 -5
- package/dist/lib/schemas-data/3.1/media-buy/log-event-response.json +8 -8
- package/dist/lib/schemas-data/3.1/media-buy/media-buy-delivery-webhook-result.json +9 -9
- package/dist/lib/schemas-data/3.1/media-buy/package-request.json +23 -23
- package/dist/lib/schemas-data/3.1/media-buy/package-update.json +13 -13
- package/dist/lib/schemas-data/3.1/media-buy/provide-performance-feedback-request.json +7 -7
- package/dist/lib/schemas-data/3.1/media-buy/provide-performance-feedback-response.json +8 -8
- package/dist/lib/schemas-data/3.1/media-buy/sync-audiences-request.json +8 -8
- package/dist/lib/schemas-data/3.1/media-buy/sync-audiences-response.json +14 -14
- package/dist/lib/schemas-data/3.1/media-buy/sync-catalogs-async-response-input-required.json +3 -3
- package/dist/lib/schemas-data/3.1/media-buy/sync-catalogs-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.1/media-buy/sync-catalogs-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.1/media-buy/sync-catalogs-request.json +8 -8
- package/dist/lib/schemas-data/3.1/media-buy/sync-catalogs-response.json +14 -14
- package/dist/lib/schemas-data/3.1/media-buy/sync-event-sources-request.json +8 -8
- package/dist/lib/schemas-data/3.1/media-buy/sync-event-sources-response.json +14 -14
- package/dist/lib/schemas-data/3.1/media-buy/update-media-buy-async-response-input-required.json +3 -3
- package/dist/lib/schemas-data/3.1/media-buy/update-media-buy-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.1/media-buy/update-media-buy-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.1/media-buy/update-media-buy-request.json +11 -11
- package/dist/lib/schemas-data/3.1/media-buy/update-media-buy-response.json +17 -17
- package/dist/lib/schemas-data/3.1/pricing-options/cpa-option.json +4 -4
- package/dist/lib/schemas-data/3.1/pricing-options/cpc-option.json +4 -4
- package/dist/lib/schemas-data/3.1/pricing-options/cpcv-option.json +4 -4
- package/dist/lib/schemas-data/3.1/pricing-options/cpm-option.json +4 -4
- package/dist/lib/schemas-data/3.1/pricing-options/cpp-option.json +5 -5
- package/dist/lib/schemas-data/3.1/pricing-options/cpv-option.json +4 -4
- package/dist/lib/schemas-data/3.1/pricing-options/flat-rate-option.json +4 -4
- package/dist/lib/schemas-data/3.1/pricing-options/price-breakdown.json +2 -2
- package/dist/lib/schemas-data/3.1/pricing-options/price-guidance.json +1 -1
- package/dist/lib/schemas-data/3.1/pricing-options/time-option.json +4 -4
- package/dist/lib/schemas-data/3.1/pricing-options/vcpm-option.json +4 -4
- package/dist/lib/schemas-data/3.1/property/authorization-result.json +1 -1
- package/dist/lib/schemas-data/3.1/property/base-property-source.json +4 -4
- package/dist/lib/schemas-data/3.1/property/create-property-list-request.json +8 -8
- package/dist/lib/schemas-data/3.1/property/create-property-list-response.json +6 -6
- package/dist/lib/schemas-data/3.1/property/delete-property-list-request.json +5 -5
- package/dist/lib/schemas-data/3.1/property/delete-property-list-response.json +5 -5
- package/dist/lib/schemas-data/3.1/property/delivery-record.json +3 -3
- package/dist/lib/schemas-data/3.1/property/get-property-list-request.json +5 -5
- package/dist/lib/schemas-data/3.1/property/get-property-list-response.json +9 -9
- package/dist/lib/schemas-data/3.1/property/list-property-lists-request.json +6 -6
- package/dist/lib/schemas-data/3.1/property/list-property-lists-response.json +7 -7
- package/dist/lib/schemas-data/3.1/property/property-error.json +2 -2
- package/dist/lib/schemas-data/3.1/property/property-feature-definition.json +2 -2
- package/dist/lib/schemas-data/3.1/property/property-feature-result.json +4 -4
- package/dist/lib/schemas-data/3.1/property/property-feature-value.json +2 -2
- package/dist/lib/schemas-data/3.1/property/property-feature.json +1 -1
- package/dist/lib/schemas-data/3.1/property/property-list-changed-webhook.json +2 -2
- package/dist/lib/schemas-data/3.1/property/property-list-filters.json +5 -5
- package/dist/lib/schemas-data/3.1/property/property-list.json +6 -6
- package/dist/lib/schemas-data/3.1/property/update-property-list-request.json +8 -8
- package/dist/lib/schemas-data/3.1/property/update-property-list-response.json +6 -6
- package/dist/lib/schemas-data/3.1/property/validate-property-delivery-request.json +6 -6
- package/dist/lib/schemas-data/3.1/property/validate-property-delivery-response.json +6 -6
- package/dist/lib/schemas-data/3.1/property/validation-result.json +5 -5
- package/dist/lib/schemas-data/3.1/protocol/get-adcp-capabilities-request.json +4 -4
- package/dist/lib/schemas-data/3.1/protocol/get-adcp-capabilities-response.json +34 -34
- package/dist/lib/schemas-data/3.1/protocol/get-task-status-request.json +5 -5
- package/dist/lib/schemas-data/3.1/protocol/get-task-status-response.json +10 -10
- package/dist/lib/schemas-data/3.1/protocol/list-tasks-request.json +13 -13
- package/dist/lib/schemas-data/3.1/protocol/list-tasks-response.json +8 -8
- package/dist/lib/schemas-data/3.1/registries/v1-canonical-mapping.json +2 -2
- package/dist/lib/schemas-data/3.1/signals/activate-signal-request.json +6 -6
- package/dist/lib/schemas-data/3.1/signals/activate-signal-response.json +9 -9
- package/dist/lib/schemas-data/3.1/signals/get-signals-async-response-submitted.json +4 -4
- package/dist/lib/schemas-data/3.1/signals/get-signals-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.1/signals/get-signals-request.json +11 -11
- package/dist/lib/schemas-data/3.1/signals/get-signals-response.json +17 -17
- package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-capabilities.json +1 -1
- package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-context-use.json +1 -1
- package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-get-offering-request.json +4 -4
- package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-get-offering-response.json +9 -9
- package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-identity.json +1 -1
- package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-initiate-session-request.json +7 -7
- package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-initiate-session-response.json +10 -10
- package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-send-message-request.json +5 -5
- package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-send-message-response.json +10 -10
- package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-sponsored-context-receipt.json +4 -4
- package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-sponsored-context.json +4 -4
- package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-terminate-session-request.json +4 -4
- package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-terminate-session-response.json +7 -7
- package/dist/lib/schemas-data/3.1/sponsored-intelligence/si-ui-element.json +1 -1
- package/dist/lib/schemas-data/3.1/trusted-match/available-package.json +4 -4
- package/dist/lib/schemas-data/3.1/trusted-match/context-match-request.json +5 -5
- package/dist/lib/schemas-data/3.1/trusted-match/context-match-response.json +4 -4
- package/dist/lib/schemas-data/3.1/trusted-match/error.json +1 -1
- package/dist/lib/schemas-data/3.1/trusted-match/identity-match-request.json +4 -4
- package/dist/lib/schemas-data/3.1/trusted-match/identity-match-response.json +4 -4
- package/dist/lib/schemas-data/3.1/trusted-match/offer-price.json +1 -1
- package/dist/lib/schemas-data/3.1/trusted-match/offer.json +5 -5
- package/dist/lib/schemas-data/3.1/trusted-match/provider-identity-match-response.json +4 -4
- package/dist/lib/schemas-data/3.1/trusted-match/provider-registration.json +2 -2
- package/dist/lib/schemas-data/3.1/trusted-match/publisher-tmpx-config.json +1 -1
- package/dist/lib/schemas-data/3.1/trusted-match/tmpx-chunk.json +1 -1
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/server/test-controller.d.mts +1 -0
- package/dist/lib/server/test-controller.d.ts +1 -0
- package/dist/lib/server/test-controller.js +5 -1
- package/dist/lib/server/test-controller.mjs +5 -1
- package/dist/lib/testing/storyboard/loader.js +5 -0
- package/dist/lib/testing/storyboard/loader.mjs +5 -0
- package/dist/lib/testing/storyboard/request-builder.js +16 -5
- package/dist/lib/testing/storyboard/request-builder.mjs +16 -5
- package/dist/lib/testing/storyboard/runner.js +1 -1
- package/dist/lib/testing/storyboard/runner.mjs +1 -1
- package/dist/lib/testing/storyboard/types.d.mts +5 -0
- package/dist/lib/testing/storyboard/types.d.ts +5 -0
- package/dist/lib/testing/storyboard/validations.d.mts +1 -1
- package/dist/lib/testing/storyboard/validations.d.ts +1 -1
- package/dist/lib/types/schemas.generated.d.ts +1 -1
- package/dist/lib/types/schemas.generated.js +12797 -12787
- package/dist/lib/types/schemas.generated.mjs +101 -101
- package/dist/lib/version.d.mts +5 -5
- package/dist/lib/version.d.ts +5 -5
- package/dist/lib/version.js +4 -3
- package/dist/lib/version.mjs +4 -3
- package/docs/CLI.md +2 -2
- package/docs/TYPE-SUMMARY.md +2 -2
- package/docs/ZOD-SCHEMAS.md +1 -1
- package/docs/llms.txt +2 -2
- package/docs/migration-14.x-rc-worksheet.md +5 -5
- package/package.json +6 -6
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/brand/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/brand/scenarios/distributed_brand_resolution.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/brand/scenarios/single_side_trust_extension.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/creative/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/creative/scenarios/billing_out_of_band.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/creative/scenarios/canonical_supported_formats.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/creative/scenarios/evaluator_auth.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/creative/scenarios/native_in_feed.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/governance/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/audience_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/available_actions.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/canonical_formats.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/create_media_buy_async.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/creative_reception.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/delivery_reporting.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/dependency_impairment_audience.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/event_dedup_flow.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/get_products_async.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/governance_approved.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/governance_conditions.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/inline_creatives_without_sync.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/inventory_list_no_match.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/inventory_list_targeting.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/measurement_accountability.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/pending_creatives_to_start.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/performance_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/product_signal_targeting.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/proposal_finalize.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/provenance_enforcement.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/reach_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/refine_products.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/vendor_metric_accountability.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/media-buy/state-machine.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/signals/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/signals/scenarios/get_signals_async.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/sponsored-intelligence/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/domains/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/brand/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/brand/scenarios/distributed_brand_resolution.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/brand/scenarios/single_side_trust_extension.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/creative/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/creative/scenarios/billing_out_of_band.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/creative/scenarios/canonical_supported_formats.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/creative/scenarios/evaluator_auth.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/creative/scenarios/native_in_feed.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/governance/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/audience_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/available_actions.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/canonical_formats.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/create_media_buy_async.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/creative_reception.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/delivery_reporting.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/dependency_impairment_audience.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/event_dedup_flow.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/get_products_async.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/governance_approved.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/governance_conditions.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/inline_creatives_without_sync.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/inventory_list_no_match.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/inventory_list_targeting.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/measurement_accountability.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/performance_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/product_signal_targeting.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/proposal_finalize.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/provenance_enforcement.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/reach_buy_flow.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/refine_products.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/media-buy/state-machine.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/signals/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/signals/scenarios/get_signals_async.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/sponsored-intelligence/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/protocols/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/specialisms/audience-sync/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/specialisms/brand-rights/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/specialisms/brand-rights/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/specialisms/collection-lists/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/specialisms/content-standards/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/specialisms/creative-ad-server/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/specialisms/creative-generative/generative-seller.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/specialisms/creative-generative/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/specialisms/creative-template/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/specialisms/creative-transformers/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/specialisms/governance-aware-seller/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/specialisms/governance-delivery-monitor/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/specialisms/governance-spend-authority/denied.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/specialisms/governance-spend-authority/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/specialisms/property-lists/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/specialisms/sales-broadcast-tv/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/specialisms/sales-catalog-driven/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/specialisms/sales-guaranteed/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/specialisms/sales-non-guaranteed/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/specialisms/sales-proposal-mode/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/specialisms/sales-social/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/specialisms/signal-marketplace/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/specialisms/signal-marketplace/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/specialisms/signal-owned/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/specialisms/sponsored-intelligence/index.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-kits/acme-outdoor-live.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-kits/acme-outdoor.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-kits/billing-gate-runner.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-kits/bistro-oranje.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-kits/distributed-brand-runner.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-kits/hosted-grader.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-kits/nova-motors.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-kits/osei-natural.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-kits/parallel-dispatch-runner.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-kits/rate-limit-trip-runner.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-kits/signed-requests-runner.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-kits/single-side-trust-runner.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-kits/substitution-observer-runner.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-kits/summit-foods.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-kits/webhook-receiver-runner.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/catalog-macro-substitution.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/plan-hash/001-minimal-plan.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/plan-hash/002-full-plan.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/plan-hash/003-bookkeeping-stripped.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/plan-hash/004a-human-review-omitted.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/plan-hash/004b-human-review-explicit-null.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/plan-hash/005a-policy-categories-order-1.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/plan-hash/005b-policy-categories-order-2.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/plan-hash/006a-ext-trace-v1.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/plan-hash/006b-ext-trace-v2.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/plan-hash/007-unicode-objectives.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/plan-hash/008-numeric-canonicalization.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/README.md +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/canonicalization.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/keys.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/negative/001-no-signature-header.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/negative/002-wrong-tag.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/negative/003-expired-signature.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/negative/004-window-too-long.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/negative/005-alg-not-allowed.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/negative/006-missing-covered-component.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/negative/007-missing-content-digest.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/negative/008-unknown-keyid.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/negative/010-content-digest-mismatch.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/negative/011-malformed-header.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/negative/012-missing-expires-param.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/negative/013-expires-le-created.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/negative/014-missing-nonce-param.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/negative/015-signature-invalid.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/negative/016-replayed-nonce.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/negative/017-key-revoked.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/negative/019-signature-without-signature-input.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/negative/020-rate-abuse.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/negative/022-multi-valued-content-type.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/negative/024-unquoted-string-param.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/negative/026-non-ascii-host.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/positive/001-basic-post.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/positive/002-post-with-content-digest.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/positive/003-es256-post.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/positive/004-multiple-signature-labels.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/positive/005-default-port-stripped.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/positive/006-dot-segment-path.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/positive/007-query-byte-preserved.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/positive/008-percent-encoded-path.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/positive/011-ipv6-authority.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-receiver-envelope.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/README.md +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/keys.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/negative/001-wrong-tag.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/negative/002-expired-signature.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/negative/003-window-too-long.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/negative/005-missing-authority-component.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/negative/006-missing-content-digest.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/negative/007-unknown-keyid.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/negative/011-signature-without-input.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/negative/012-missing-expires-param.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/negative/013-expires-le-created.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/negative/015-signature-invalid.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/negative/016-replayed-nonce.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/negative/017-key-revoked.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/negative/018-rate-abuse.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/negative/019-revocation-stale.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/positive/001-basic-post.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/positive/002-es256-post.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/positive/004-default-port-stripped.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/test-vectors/webhook-signing/positive/008-request-signing-key-reuse.json +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/billing-gate-dispatch.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/canonical-format-validate-input.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/capability-discovery.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/collection-lists-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/comply-controller-mode-gate.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/content-standards-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/deterministic-testing.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/error-compliance-signals.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/error-compliance.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/fictional-entities.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/get-media-buys-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/get-products-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/get-signals-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/idempotency.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/notification-config-event-scope.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/notification-config-lifecycle.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/notification-config-rejections.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/pagination-integrity-creative-formats.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/pagination-integrity-list-accounts.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/property-lists-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/read-tool-idempotency.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/runner-output-contract.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/schema-validation-signals.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/schema-validation.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/security.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/signed-requests.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/v3-envelope-integrity.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/version-negotiation.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/webhook-emission.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/webhook-receiver-envelope.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/wholesale-feed-bulk-webhooks.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/wholesale-feed-product-webhooks.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/wholesale-feed-products.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/wholesale-feed-signal-webhooks.yaml +0 -0
- /package/compliance/cache/{3.1.29 → 3.1.30}/universal/wholesale-feed-signals.yaml +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as z from "zod";
|
|
2
2
|
import { fullFormats as adcpJsonSchemaFormats } from "ajv-formats/dist/formats.js";
|
|
3
3
|
const adcpDateTimeFormat = /* @__PURE__ */ (() => adcpJsonSchemaFormats["date-time"])();
|
|
4
4
|
const adcpUriFormat = /* @__PURE__ */ (() => adcpJsonSchemaFormats.uri)();
|
|
@@ -447,7 +447,7 @@ const AudienceForecastDimensionSchema = /* @__PURE__ */ (() => z.object({
|
|
|
447
447
|
audience_source: AudienceSourceSchema,
|
|
448
448
|
audience_name: z.string().optional()
|
|
449
449
|
}).passthrough())();
|
|
450
|
-
const SignalForecastDimensionSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
|
|
450
|
+
const SignalForecastDimensionSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
|
|
451
451
|
kind: z.literal("signal"),
|
|
452
452
|
signal_ref: SignalRefSchema.optional(),
|
|
453
453
|
signal_id: z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).optional(),
|
|
@@ -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,7 +732,7 @@ 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(),
|
|
@@ -744,7 +744,7 @@ const EffectiveTimingConstraintsSchema = /* @__PURE__ */ (() => z.object({
|
|
|
744
744
|
earliest_effective_at: z.string()
|
|
745
745
|
}).passthrough(), z.object({
|
|
746
746
|
latest_effective_at: z.string()
|
|
747
|
-
}).passthrough()])))();
|
|
747
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
748
748
|
const MoneySchema = /* @__PURE__ */ (() => z.object({
|
|
749
749
|
amount: z.number().min(0),
|
|
750
750
|
currency: z.string().regex(/^[A-Z]{3}$/)
|
|
@@ -939,7 +939,7 @@ const PostalCountrySystemSchema = /* @__PURE__ */ (() => z.union([z.object({
|
|
|
939
939
|
}).passthrough(), z.object({
|
|
940
940
|
country: z.string().refine((country) => !["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"].includes(country)).optional(),
|
|
941
941
|
system: z.union([z.literal("postal_code"), z.literal("custom")]).optional()
|
|
942
|
-
}).passthrough()]).and(z.object({
|
|
942
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.").and(z.object({
|
|
943
943
|
country: z.string(),
|
|
944
944
|
system: PostalCodeSystemSchema
|
|
945
945
|
}).passthrough()))();
|
|
@@ -2183,7 +2183,7 @@ const CanonicalFormatVASTVideoSchema = /* @__PURE__ */ (() => z.object({
|
|
|
2183
2183
|
max_wrapper_depth: z.int().min(0).optional(),
|
|
2184
2184
|
ssl_required: z.boolean().optional()
|
|
2185
2185
|
}).passthrough())();
|
|
2186
|
-
const CanonicalFormatSellerRenderedStatefulDisplaySchema = /* @__PURE__ */ (() => z.object({ "experimental": z.boolean().describe("Experimental in AdCP 3.2 while the creative working group gathers implementation evidence across premium web and mobile/app sellers.").optional(), "deprecated": z.boolean().describe("When true, this canonical (or a seller's specific narrowing of it) is going away. Existing adopters are supported through the deprecation cycle; new adoption is discouraged. Pair with `migration_target_version` to indicate when the canonical is expected to be removed. Distinct from `experimental`: an experimental canonical may stabilize and stop being experimental; a deprecated canonical is on a sunset path.").optional(), "v1_translatable": z.boolean().describe("No v1 named-format equivalent can express multiple seller-rendered states and their breakpoint bindings.").optional(), "since_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version that introduced this canonical (e.g., '3.1', '3.2'). Lets adopters reason about minimum protocol version requirements when consuming a format declaration. Patch precision is intentionally rejected \u2014 canonicals are introduced at minor-version boundaries.").optional(), "migration_target_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version by which the working group expects this canonical to stabilize, surface a breaking revision, or (when `deprecated: true`) be removed. Patch precision is intentionally rejected \u2014 canonicals shift at minor-version boundaries. Absence signals 'no specific target' (omit the field rather than use a placeholder like 'unknown').").optional(), "composition_model": z.enum(["deterministic", "algorithmic"]).describe("Whether the surface composes deterministically (buyer can predict per-slot rendering \u2014 sponsored_placement, image, video) or algorithmically (surface chooses combinations or phrasing \u2014 responsive_creative, agent_placement).").optional(), "provenance_required": z.boolean().describe("When true, the product rejects unsigned synthesized assets. Builders calling build_creative MUST attach a C2PA-compatible provenance manifest attributing synthesis to the creative agent.").optional(), "platform_extensions": z.array(z.object({ "uri": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("HTTPS URL identifying the extension. `https://` is mandatory \u2014 `http://`, `file://`, `data:`, and other schemes are rejected at the schema layer (defense-in-depth on top of the fetch-contract normative rules). The URI base is the owning agent's URL; the path identifies the extension within that agent. Example: 'https://creative.adcontextprotocol.org/translated/meta/extensions/meta_pixel'. The full fetch contract \u2014 SSRF allowlist, response-size cap, $ref sandbox, schema-compile bounds \u2014 is documented on `product-format-declaration.json#format_schema` and applies to ALL fetches of this reference shape regardless of whether the field is named `format_schema` (load-bearing for validation) or `platform_extensions` (informational); the *transport* rules are identical, only the *consumption* semantics differ."), "digest": z.string().regex(new RegExp("^sha256:[a-f0-9]{64}$")).describe("SHA-256 content digest of the extension definition (sha256:<hex>). Used to detect drift \u2014 if the agent revises the extension, the digest changes and cached definitions become invalid.") }).catchall(z.any()).describe("Reference to a platform extension definition. The agent that owns the URI is authoritative for the extension's schema. Buyers fetch the definition once per content digest and cache it. Platform extensions are typically bundled in `get_products` responses under an `extensions` map keyed by `uri@digest`, eliminating the need for a separate fetch.\n\n**Within a single response**, multiple references to the same `uri` MUST carry the same `digest` \u2014 divergent digests in one response indicate producer-side error (e.g., concurrent extension revision mid-render). Buyers encountering divergent digests for the same URI MUST fail closed: treat all references to that URI as unresolved and surface a validation error rather than picking one branch silently. **Across responses**, digest divergence is normal \u2014 extension authors revise their schemas, the new digest differs, the cache key changes, and the buyer refetches. Cache by `uri@digest`, not by `uri` alone.")).describe('Platform-specific extensions narrowing the canonical (pixel ID shapes, conversion event taxonomies, platform-specific CTAs/destinations). Each extension is a URI+digest reference resolved against the bundled `extensions` map in get_products responses or fetched directly.\n\n**Collision precedence (normative).** When two or more `platform_extensions[]` entries on the same declaration extend the same target (e.g., both extend `tracking`) with overlapping field names, **array order is authoritative \u2014 later entries override earlier ones on a per-field basis** (last-in-array-wins). SDKs MUST surface the overlap via the `errors[]` array on the `get_products` response with a structured code (`FORMAT_DECLARATION_DIVERGENT` is appropriate when the overlap appears across dual-emitted shapes; a producer-self-emitted overlap on a single declaration SHOULD use the same code with `error.details: { collision_kind: "platform_extension_field", target, overlapping_fields, winning_extension_uri }`). Producers SHOULD avoid the collision by emitting one extension per target or by partitioning fields across extensions; the deterministic precedence is for last-resort consistency across SDK implementations, not a sanctioned merging strategy.').optional(), "synthesis_nondeterministic": z.boolean().describe("When true, the format's production pipeline is genuinely nondeterministic \u2014 the platform cannot guarantee that synthesis from a given input set produces in-spec output. Veo / Sora / Runway-class generative video, and other AI-synthesis flows where output dimensions, duration, or quality vary per run. Implies a different validation contract: predictive `validate_input` is impossible; the platform's own post-synthesis QA loop applies; if the QA loop exhausts without producing a valid artifact, `build_creative` returns task_failed with a synthesis_failed reason. Distinct from `composition_model` (which describes how the surface composes per-slot rendering, not whether synthesis is deterministic). When false or absent, the format's production is predictable enough that `validate_input` can predict output properties from input properties.\n\n**Compatibility with `asset_source` / `item_production_model`**: `synthesis_nondeterministic: true` MAY pair with any of `seller_pre_rendered_from_brief`, `seller_human_designed`, or `agent_synthesized` (the QA loop is concept-level, not source-specific \u2014 'seller renders from brief but each retry differs' is just as nondeterministic as Veo). It MUST NOT pair with `buyer_uploaded` (the buyer ships pre-rendered bytes; there's no synthesis step to be nondeterministic about). It MUST NOT pair with `publisher_host_recorded` (the publisher's host produces a deterministic-from-script output even if the human voice varies). When `synthesis_nondeterministic: true` is set with an incompatible source, validators SHOULD reject with a structured error.").optional(), "slots": z.array(z.object({ "asset_group_id": z.string().describe("Canonical asset_group_id from /schemas/core/asset-group-vocabulary.json. Non-canonical IDs are valid but trigger soft warnings."), "asset_type": z.enum(["image", "video", "audio", "text", "markdown", "url", "html", "css", "javascript", "vast", "daast", "display_tag", "webhook", "brief", "catalog", "published_post", "zip", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]).describe("Discriminator selecting the asset schema this slot accepts. SDK codegen uses this to type the slot value. `display_tag` is the atomic third-party display representation (URL, inline markup, or paired redirect). `published_post` is an existing-post reference asset. `pixel_tracker` / `vast_tracker` / `daast_tracker` are renderer-fired tracker primitives. `object` is a last-resort fallback."), "required": z.boolean().describe("Whether this slot is required for a valid manifest.").optional(), "min": z.number().int().gte(0).describe("Minimum count for repeatable / pool slots.").optional(), "max": z.number().int().gte(1).describe("Maximum count for repeatable / pool slots.").optional(), "max_chars": z.number().int().gte(1).describe("Per-slot character limit. Valid only when `asset_type` is `text`, `markdown`, or `brief`. Mutually exclusive with `max_size_kb` (which applies to binary asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "max_size_kb": z.number().int().gte(1).describe("Per-slot file size limit in exact kilobytes, where 1 KB = 1,000 bytes. Valid only when `asset_type` is `image`, `video`, `audio`, or `zip`. Mutually exclusive with `max_chars` (which applies to text asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Accepted intrinsic-pixel densities for this image-bearing slot. Valid when `asset_type` is `image`, and on a `card` slot where it constrains each card's image media (video media is unaffected). This makes density available to every canonical carrying image assets (native, carousel, responsive, companion images, and image itself), not only `format_kind: image`. When the image canonical also declares top-level `params.pixel_ratios`, the effective set is the intersection; an empty intersection is invalid. One matching asset satisfies the slot unless `required_pixel_ratios` requires rendition coverage.").optional(), "required_pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Required density coverage for an image rendition set. Valid only when `asset_type` is `image` and `pixel_ratios` is also declared. Every value MUST appear in the effective accepted set after intersecting any top-level image `params.pixel_ratios`, and the manifest slot value MUST be an array containing exactly one matching image rendition for each required ratio. Other accepted ratios remain optional. For example, `pixel_ratios: [1, 1.5, 2]` with `required_pixel_ratios: [1, 2]` requires the 1x and 2x renditions while making 1.5x optional. SDKs enforce intersection, subset, coverage, and duplicate-ratio rules because JSON Schema draft-07 cannot express them generically.").optional(), "logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("When `asset_group_id` is `logo`, renderer-facing brand.json logo slots acceptable for this format slot. Producers selecting from brand.json SHOULD prefer `logos[]` entries whose `slots[]` intersects this list, then apply `visual_guidelines.logo_usage_rules[]`.").optional(), "required_logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Subset of `logo_slots` for which this format expects explicit logo coverage. A manifest or brand-derived logo pool SHOULD include at least one usable logo for each required slot; if coverage is missing, builders SHOULD surface a validation warning or approval mapping instead of guessing from prose.").optional(), "description": z.string().describe("Human-readable description of what the slot expects from the buyer.").optional(), "consumed_for_production": z.boolean().describe("Dispatch hint for `build_creative` and v1\u2194v2 wire translators: when `true`, the slot's value is consumed as INPUT to a production step (host-read script, brief copy fed to generative synthesis, catalog feed driving per-SKU rendering) and is not rendered verbatim. When `false` (default), the slot's value is rendered verbatim on the placement (image bytes, video file, display tag).\n\nMotivates the v1\u2194v2 dispatch table: pre-v2 buyers shipped production-consumed inputs separately in a `inputs` map on the build_creative request; v2 collapses inputs and rendered assets into a single `assets` map keyed by `asset_group_id`. SDK translators between v1 and v2 use this flag per canonical to know which assets in the v2 manifest map back to v1 `inputs` vs v1 `assets`. Without the per-slot flag the dispatch table lives in adopter code and every SDK gets it slightly different.\n\nProducers SHOULD set this explicitly on slots whose consumption pattern isn't obvious (host-read scripts on `audio_hosted`, briefs on generative `video_hosted`, catalog feeds on `sponsored_placement`). For canonicals where every slot is render-verbatim (`image`, `display_tag`, `video_vast`, `audio_vast`), the default `false` is sufficient and the flag MAY be omitted.").optional() }).catchall(z.any()).and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }), z.any().refine((value) => !z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }), z.any().refine((value) => !z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.union([z.any().refine((value) => !z.any().refine((value2) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema").safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.any().refine((value) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.any().refine((value) => !z.union([z.object({ "logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "required_logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]))), z.intersection(z.any(), z.intersection(z.union([z.any().refine((value) => !z.object({ "required_pixel_ratios": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "required_pixel_ratios": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "asset_type": z.literal("image").optional() }))]), z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }), z.any().refine((value) => !z.union([z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))])))))).describe("Default manifest slots; which are consumed depends on `supply_mode`. `state_canvases` images MUST carry `state_id` and `breakpoint_id`, and `state_click_urls` entries MUST carry `state_id` (semantic validators resolve the bindings). Component images SHOULD carry `focal_point` for deterministic seller cropping. `landing_page_url` is the default destination (see `clickthrough`). `font_files` MUST contain only buyer-licensed fonts; publisher-proprietary fonts never travel in manifests. Only image, video, text, url, zip, and pixel_tracker slot asset types are accepted \u2014 executable types (javascript, html, css, webhook) are rejected even via `slots` overrides.").optional(), "required_connections": z.array(z.object({ "provider": z.string().describe("Stable provider or platform namespace, preferably lowercase. Examples: `social.example`, `shortvideo.example`, or a seller-defined namespace. Omit only when the requirement is provider-agnostic, or when an `authorization_url` fully routes the human to the correct provider-specific connection flow.").optional(), "connection_type": z.enum(["advertiser_account", "publisher_identity", "post_authorization"]).describe("Kind of downstream connection required. `advertiser_account` is the platform account used to buy/manage ads. `publisher_identity` is the creator, page, channel, organization, or profile that owns source posts. `post_authorization` is a post-scoped grant when the platform authorizes individual posts instead of, or in addition to, the owning identity."), "required_for": z.array(z.string().min(1)).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Concrete AdCP protocol operation names that require this downstream connection. Sellers SHOULD include this in product declarations when the requirement is known ahead of time, and in AUTHORIZATION_REQUIRED details when it explains the failed operation. Prefer specific operation names such as `list_creatives`, `sync_creatives`, `create_media_buy`, `get_media_buy_delivery`, or `get_creative_delivery` over broad category labels such as `reporting`.").optional(), "scope": z.enum(["account", "identity", "post", "unknown"]).describe("Granularity of the downstream grant.").optional(), "status": z.enum(["connected", "missing", "pending", "expired", "revoked", "not_required", "unknown"]).describe("Current seller-observed state for this downstream connection when known. Product declarations MAY omit status or use `unknown`; AUTHORIZATION_REQUIRED details SHOULD use `missing`, `expired`, or `revoked` for the connection that blocked the call.").optional(), "connection_id": z.string().describe("Seller-defined identifier for an already-created downstream connection. Omit when no connection exists yet or when exposing it would leak platform/account state.").optional(), "resource_ref": z.object({ "platform_account_id": z.string().describe("Provider-native advertiser or business account id, when safe to disclose.").optional(), "identity_id": z.string().describe("Provider-native creator, page, channel, organization, or profile id, when safe to disclose.").optional(), "handle": z.string().describe("Provider-native public handle for the owning identity, when available.").optional(), "profile_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the owning identity, when available.").optional(), "post_id": z.string().describe("Provider-native post id, when the grant is post-scoped or the failed request referenced a specific post.").optional(), "post_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the referenced post, when available.").optional() }).catchall(z.any()).describe("Optional opaque provider-native resource hint, such as a platform account id, profile URL, handle, channel id, post id, or post URL. This is a hint for routing authorization, not proof that authorization exists.").optional(), "authorization_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Seller-hosted or provider-hosted URL where a human can complete or restore this downstream connection.").optional(), "authorization_instructions": z.string().describe("Human-readable instructions for completing or restoring this downstream connection.").optional(), "expires_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }), z.union([z.object({ "provider": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "authorization_url": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]))])).describe("A seller/platform-side connection or grant required by a product, format, or request. This is not the AdCP caller credential: the AdCP request is still authenticated once, and the seller uses these stored downstream connections to call a platform or service on the buyer's behalf. Use this shape for platforms that require more than one downstream grant, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.")).describe("Downstream platform connections or grants required to use this format declaration. These are in addition to the single AdCP caller credential. Use this when a platform product requires multiple downstream grants, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.").optional(), "reference_mutability": z.enum(["immutable_snapshot", "mutable_requires_reapproval", "mutable_auto_recheck"]).describe("Policy for formats whose `slots` accept a `published_post` reference. `immutable_snapshot`: seller snapshots the referenced post at approval and later source changes do not change the served creative. `mutable_requires_reapproval`: the source post may change and material changes require review before continued serving. `mutable_auto_recheck`: the source post may change and the seller continuously or periodically rechecks authorization/policy without requiring buyer resubmission. Omit when the format has no `published_post` slot.").optional(), "production_window_business_days": z.number().int().gte(0).describe("Typical production turnaround in business days when the format requires seller-side production (e.g., host-recording from a buyer-supplied script). 0 for synchronous (e.g., generative AI); >0 for human-produced (e.g., podcast host-read). Absent when no production is required (buyer uploads complete creative).").optional(), "supply_mode": z.enum(["components", "rendered_canvases", "layered_source"]).describe("Which end of the template contract the buyer feeds. `components`: buyer supplies component slots; seller renders states (no `state_canvases`/`layered_source` assets allowed). `rendered_canvases`: buyer supplies exactly one `state_canvases` image per declared state \xD7 breakpoint pair. `layered_source`: buyer ships design source (+ optional `font_files`); seller production derives states (`production_window_business_days` applies) \u2014 transitional for sellers without executable templates.").optional(), "states": z.array(z.object({ "state_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).describe("Stable identifier used by `state_canvases[].state_id` and `state_click_urls[].state_id`."), "anchoring": z.enum(["inline", "sticky_top", "sticky_bottom", "overlay", "fullscreen_overlay", "underlay"]).describe("`underlay` renders the canvas beneath page content, which scrolls over it (IAB New Ad Portfolio underlay class: skins, reveal units). Transitions into `overlay`/`fullscreen_overlay` states SHOULD be user-initiated; non-user-action entries emit LEAN policy warnings."), "slot_bindings": z.array(z.string().regex(new RegExp("^[a-z0-9_]+$"))).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Asset group IDs rendered in this state (components mode). Makes the template executable: given components and bindings, assembly is deterministic. Every value MUST resolve to a declared slot. Omitted means all supplied component slots may render.").optional(), "motion": z.enum(["static", "animated"]).describe("Whether the seller-rendered layout animates within this state (attract loops, load animations). Intra-state animation is seller-rendered; buyer canvases stay static images.").optional(), "max_animation_s": z.number().gt(0).describe("Upper bound on intra-state animation duration. Required when `motion` is `animated`.").optional(), "breakpoints": z.array(z.object({ "breakpoint_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).describe("Stable identifier used by `state_canvases[].breakpoint_id`."), "width": z.number().int().gte(1).optional(), "width_range": z.array(z.number().int().gte(1)).min(2).max(2).describe("Inclusive [minimum, maximum] accepted canvas width. The first value MUST be no greater than the second; semantic validators enforce ordering.").optional(), "width_mode": z.enum(["full_bleed", "gutter_residual"]).describe("Fluid width classes. `full_bleed`: edge-to-edge viewport width (IAB adhesion, topscroll). `gutter_residual`: the margin remaining beside the page content column (desktop skins). Fluid breakpoints cannot be targeted by `rendered_canvases` supply \u2014 semantic validation rejects that pairing.").optional(), "height": z.number().int().gte(1).optional(), "height_range": z.array(z.number().int().gte(1)).min(2).max(2).describe("Inclusive [minimum, maximum] accepted canvas height. The first value MUST be no greater than the second; semantic validators enforce ordering.").optional(), "viewport_height_percent": z.number().gt(0).lte(100).describe("Height as a percentage of the viewport (topscroll 80%, mobile skin panel 15%). Fluid; cannot be targeted by `rendered_canvases` supply.").optional(), "canvas_aspect_ratio": z.string().regex(new RegExp("^[0-9]+(\\.[0-9]+)?:[0-9]+(\\.[0-9]+)?$")).describe("Aspect ratio the rendered canvas maintains across the size range (IAB flexible units, ratio-bucket responsive). When both fixed `width` and `height` are declared, the ratio MUST be consistent with them.").optional() }).catchall(z.any()).and(z.intersection(z.union([z.object({ "width": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "width_range": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "width_mode": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.object({ "height": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "height_range": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "viewport_height_percent": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).min(1).superRefine((breakpoints, ctx) => {
|
|
2186
|
+
const CanonicalFormatSellerRenderedStatefulDisplaySchema = /* @__PURE__ */ (() => z.object({ "experimental": z.boolean().describe("Experimental in AdCP 3.2 while the creative working group gathers implementation evidence across premium web and mobile/app sellers.").optional(), "deprecated": z.boolean().describe("When true, this canonical (or a seller's specific narrowing of it) is going away. Existing adopters are supported through the deprecation cycle; new adoption is discouraged. Pair with `migration_target_version` to indicate when the canonical is expected to be removed. Distinct from `experimental`: an experimental canonical may stabilize and stop being experimental; a deprecated canonical is on a sunset path.").optional(), "v1_translatable": z.boolean().describe("No v1 named-format equivalent can express multiple seller-rendered states and their breakpoint bindings.").optional(), "since_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version that introduced this canonical (e.g., '3.1', '3.2'). Lets adopters reason about minimum protocol version requirements when consuming a format declaration. Patch precision is intentionally rejected \u2014 canonicals are introduced at minor-version boundaries.").optional(), "migration_target_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version by which the working group expects this canonical to stabilize, surface a breaking revision, or (when `deprecated: true`) be removed. Patch precision is intentionally rejected \u2014 canonicals shift at minor-version boundaries. Absence signals 'no specific target' (omit the field rather than use a placeholder like 'unknown').").optional(), "composition_model": z.enum(["deterministic", "algorithmic"]).describe("Whether the surface composes deterministically (buyer can predict per-slot rendering \u2014 sponsored_placement, image, video) or algorithmically (surface chooses combinations or phrasing \u2014 responsive_creative, agent_placement).").optional(), "provenance_required": z.boolean().describe("When true, the product rejects unsigned synthesized assets. Builders calling build_creative MUST attach a C2PA-compatible provenance manifest attributing synthesis to the creative agent.").optional(), "platform_extensions": z.array(z.object({ "uri": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("HTTPS URL identifying the extension. `https://` is mandatory \u2014 `http://`, `file://`, `data:`, and other schemes are rejected at the schema layer (defense-in-depth on top of the fetch-contract normative rules). The URI base is the owning agent's URL; the path identifies the extension within that agent. Example: 'https://creative.adcontextprotocol.org/translated/meta/extensions/meta_pixel'. The full fetch contract \u2014 SSRF allowlist, response-size cap, $ref sandbox, schema-compile bounds \u2014 is documented on `product-format-declaration.json#format_schema` and applies to ALL fetches of this reference shape regardless of whether the field is named `format_schema` (load-bearing for validation) or `platform_extensions` (informational); the *transport* rules are identical, only the *consumption* semantics differ."), "digest": z.string().regex(new RegExp("^sha256:[a-f0-9]{64}$")).describe("SHA-256 content digest of the extension definition (sha256:<hex>). Used to detect drift \u2014 if the agent revises the extension, the digest changes and cached definitions become invalid.") }).catchall(z.any()).describe("Reference to a platform extension definition. The agent that owns the URI is authoritative for the extension's schema. Buyers fetch the definition once per content digest and cache it. Platform extensions are typically bundled in `get_products` responses under an `extensions` map keyed by `uri@digest`, eliminating the need for a separate fetch.\n\n**Within a single response**, multiple references to the same `uri` MUST carry the same `digest` \u2014 divergent digests in one response indicate producer-side error (e.g., concurrent extension revision mid-render). Buyers encountering divergent digests for the same URI MUST fail closed: treat all references to that URI as unresolved and surface a validation error rather than picking one branch silently. **Across responses**, digest divergence is normal \u2014 extension authors revise their schemas, the new digest differs, the cache key changes, and the buyer refetches. Cache by `uri@digest`, not by `uri` alone.")).describe('Platform-specific extensions narrowing the canonical (pixel ID shapes, conversion event taxonomies, platform-specific CTAs/destinations). Each extension is a URI+digest reference resolved against the bundled `extensions` map in get_products responses or fetched directly.\n\n**Collision precedence (normative).** When two or more `platform_extensions[]` entries on the same declaration extend the same target (e.g., both extend `tracking`) with overlapping field names, **array order is authoritative \u2014 later entries override earlier ones on a per-field basis** (last-in-array-wins). SDKs MUST surface the overlap via the `errors[]` array on the `get_products` response with a structured code (`FORMAT_DECLARATION_DIVERGENT` is appropriate when the overlap appears across dual-emitted shapes; a producer-self-emitted overlap on a single declaration SHOULD use the same code with `error.details: { collision_kind: "platform_extension_field", target, overlapping_fields, winning_extension_uri }`). Producers SHOULD avoid the collision by emitting one extension per target or by partitioning fields across extensions; the deterministic precedence is for last-resort consistency across SDK implementations, not a sanctioned merging strategy.').optional(), "synthesis_nondeterministic": z.boolean().describe("When true, the format's production pipeline is genuinely nondeterministic \u2014 the platform cannot guarantee that synthesis from a given input set produces in-spec output. Veo / Sora / Runway-class generative video, and other AI-synthesis flows where output dimensions, duration, or quality vary per run. Implies a different validation contract: predictive `validate_input` is impossible; the platform's own post-synthesis QA loop applies; if the QA loop exhausts without producing a valid artifact, `build_creative` returns task_failed with a synthesis_failed reason. Distinct from `composition_model` (which describes how the surface composes per-slot rendering, not whether synthesis is deterministic). When false or absent, the format's production is predictable enough that `validate_input` can predict output properties from input properties.\n\n**Compatibility with `asset_source` / `item_production_model`**: `synthesis_nondeterministic: true` MAY pair with any of `seller_pre_rendered_from_brief`, `seller_human_designed`, or `agent_synthesized` (the QA loop is concept-level, not source-specific \u2014 'seller renders from brief but each retry differs' is just as nondeterministic as Veo). It MUST NOT pair with `buyer_uploaded` (the buyer ships pre-rendered bytes; there's no synthesis step to be nondeterministic about). It MUST NOT pair with `publisher_host_recorded` (the publisher's host produces a deterministic-from-script output even if the human voice varies). When `synthesis_nondeterministic: true` is set with an incompatible source, validators SHOULD reject with a structured error.").optional(), "slots": z.array(z.object({ "asset_group_id": z.string().describe("Canonical asset_group_id from /schemas/core/asset-group-vocabulary.json. Non-canonical IDs are valid but trigger soft warnings."), "asset_type": z.enum(["image", "video", "audio", "text", "markdown", "url", "html", "css", "javascript", "vast", "daast", "display_tag", "webhook", "brief", "catalog", "published_post", "zip", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]).describe("Discriminator selecting the asset schema this slot accepts. SDK codegen uses this to type the slot value. `display_tag` is the atomic third-party display representation (URL, inline markup, or paired redirect). `published_post` is an existing-post reference asset. `pixel_tracker` / `vast_tracker` / `daast_tracker` are renderer-fired tracker primitives. `object` is a last-resort fallback."), "required": z.boolean().describe("Whether this slot is required for a valid manifest.").optional(), "min": z.number().int().gte(0).describe("Minimum count for repeatable / pool slots.").optional(), "max": z.number().int().gte(1).describe("Maximum count for repeatable / pool slots.").optional(), "max_chars": z.number().int().gte(1).describe("Per-slot character limit. Valid only when `asset_type` is `text`, `markdown`, or `brief`. Mutually exclusive with `max_size_kb` (which applies to binary asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "max_size_kb": z.number().int().gte(1).describe("Per-slot file size limit in exact kilobytes, where 1 KB = 1,000 bytes. Valid only when `asset_type` is `image`, `video`, `audio`, or `zip`. Mutually exclusive with `max_chars` (which applies to text asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Accepted intrinsic-pixel densities for this image-bearing slot. Valid when `asset_type` is `image`, and on a `card` slot where it constrains each card's image media (video media is unaffected). This makes density available to every canonical carrying image assets (native, carousel, responsive, companion images, and image itself), not only `format_kind: image`. When the image canonical also declares top-level `params.pixel_ratios`, the effective set is the intersection; an empty intersection is invalid. One matching asset satisfies the slot unless `required_pixel_ratios` requires rendition coverage.").optional(), "required_pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Required density coverage for an image rendition set. Valid only when `asset_type` is `image` and `pixel_ratios` is also declared. Every value MUST appear in the effective accepted set after intersecting any top-level image `params.pixel_ratios`, and the manifest slot value MUST be an array containing exactly one matching image rendition for each required ratio. Other accepted ratios remain optional. For example, `pixel_ratios: [1, 1.5, 2]` with `required_pixel_ratios: [1, 2]` requires the 1x and 2x renditions while making 1.5x optional. SDKs enforce intersection, subset, coverage, and duplicate-ratio rules because JSON Schema draft-07 cannot express them generically.").optional(), "logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("When `asset_group_id` is `logo`, renderer-facing brand.json logo slots acceptable for this format slot. Producers selecting from brand.json SHOULD prefer `logos[]` entries whose `slots[]` intersects this list, then apply `visual_guidelines.logo_usage_rules[]`.").optional(), "required_logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Subset of `logo_slots` for which this format expects explicit logo coverage. A manifest or brand-derived logo pool SHOULD include at least one usable logo for each required slot; if coverage is missing, builders SHOULD surface a validation warning or approval mapping instead of guessing from prose.").optional(), "description": z.string().describe("Human-readable description of what the slot expects from the buyer.").optional(), "consumed_for_production": z.boolean().describe("Dispatch hint for `build_creative` and v1\u2194v2 wire translators: when `true`, the slot's value is consumed as INPUT to a production step (host-read script, brief copy fed to generative synthesis, catalog feed driving per-SKU rendering) and is not rendered verbatim. When `false` (default), the slot's value is rendered verbatim on the placement (image bytes, video file, display tag).\n\nMotivates the v1\u2194v2 dispatch table: pre-v2 buyers shipped production-consumed inputs separately in a `inputs` map on the build_creative request; v2 collapses inputs and rendered assets into a single `assets` map keyed by `asset_group_id`. SDK translators between v1 and v2 use this flag per canonical to know which assets in the v2 manifest map back to v1 `inputs` vs v1 `assets`. Without the per-slot flag the dispatch table lives in adopter code and every SDK gets it slightly different.\n\nProducers SHOULD set this explicitly on slots whose consumption pattern isn't obvious (host-read scripts on `audio_hosted`, briefs on generative `video_hosted`, catalog feeds on `sponsored_placement`). For canonicals where every slot is render-verbatim (`image`, `display_tag`, `video_vast`, `audio_vast`), the default `false` is sufficient and the flag MAY be omitted.").optional() }).catchall(z.any()).and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }), z.any().refine((value) => !z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }), z.any().refine((value) => !z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.union([z.any().refine((value) => !z.any().refine((value2) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema").safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.any().refine((value) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.any().refine((value) => !z.union([z.object({ "logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "required_logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]))), z.intersection(z.any(), z.intersection(z.union([z.any().refine((value) => !z.object({ "required_pixel_ratios": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "required_pixel_ratios": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "asset_type": z.literal("image").optional() }))]), z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }), z.any().refine((value) => !z.union([z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))])))))).describe("Default manifest slots; which are consumed depends on `supply_mode`. `state_canvases` images MUST carry `state_id` and `breakpoint_id`, and `state_click_urls` entries MUST carry `state_id` (semantic validators resolve the bindings). Component images SHOULD carry `focal_point` for deterministic seller cropping. `landing_page_url` is the default destination (see `clickthrough`). `font_files` MUST contain only buyer-licensed fonts; publisher-proprietary fonts never travel in manifests. Only image, video, text, url, zip, and pixel_tracker slot asset types are accepted \u2014 executable types (javascript, html, css, webhook) are rejected even via `slots` overrides.").optional(), "required_connections": z.array(z.object({ "provider": z.string().describe("Stable provider or platform namespace, preferably lowercase. Examples: `social.example`, `shortvideo.example`, or a seller-defined namespace. Omit only when the requirement is provider-agnostic, or when an `authorization_url` fully routes the human to the correct provider-specific connection flow.").optional(), "connection_type": z.enum(["advertiser_account", "publisher_identity", "post_authorization"]).describe("Kind of downstream connection required. `advertiser_account` is the platform account used to buy/manage ads. `publisher_identity` is the creator, page, channel, organization, or profile that owns source posts. `post_authorization` is a post-scoped grant when the platform authorizes individual posts instead of, or in addition to, the owning identity."), "required_for": z.array(z.string().min(1)).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Concrete AdCP protocol operation names that require this downstream connection. Sellers SHOULD include this in product declarations when the requirement is known ahead of time, and in AUTHORIZATION_REQUIRED details when it explains the failed operation. Prefer specific operation names such as `list_creatives`, `sync_creatives`, `create_media_buy`, `get_media_buy_delivery`, or `get_creative_delivery` over broad category labels such as `reporting`.").optional(), "scope": z.enum(["account", "identity", "post", "unknown"]).describe("Granularity of the downstream grant.").optional(), "status": z.enum(["connected", "missing", "pending", "expired", "revoked", "not_required", "unknown"]).describe("Current seller-observed state for this downstream connection when known. Product declarations MAY omit status or use `unknown`; AUTHORIZATION_REQUIRED details SHOULD use `missing`, `expired`, or `revoked` for the connection that blocked the call.").optional(), "connection_id": z.string().describe("Seller-defined identifier for an already-created downstream connection. Omit when no connection exists yet or when exposing it would leak platform/account state.").optional(), "resource_ref": z.object({ "platform_account_id": z.string().describe("Provider-native advertiser or business account id, when safe to disclose.").optional(), "identity_id": z.string().describe("Provider-native creator, page, channel, organization, or profile id, when safe to disclose.").optional(), "handle": z.string().describe("Provider-native public handle for the owning identity, when available.").optional(), "profile_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the owning identity, when available.").optional(), "post_id": z.string().describe("Provider-native post id, when the grant is post-scoped or the failed request referenced a specific post.").optional(), "post_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the referenced post, when available.").optional() }).catchall(z.any()).describe("Optional opaque provider-native resource hint, such as a platform account id, profile URL, handle, channel id, post id, or post URL. This is a hint for routing authorization, not proof that authorization exists.").optional(), "authorization_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Seller-hosted or provider-hosted URL where a human can complete or restore this downstream connection.").optional(), "authorization_instructions": z.string().describe("Human-readable instructions for completing or restoring this downstream connection.").optional(), "expires_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }), z.union([z.object({ "provider": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "authorization_url": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]))]).describe("Must also satisfy at least one of these alternatives.")).describe("A seller/platform-side connection or grant required by a product, format, or request. This is not the AdCP caller credential: the AdCP request is still authenticated once, and the seller uses these stored downstream connections to call a platform or service on the buyer's behalf. Use this shape for platforms that require more than one downstream grant, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.")).describe("Downstream platform connections or grants required to use this format declaration. These are in addition to the single AdCP caller credential. Use this when a platform product requires multiple downstream grants, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.").optional(), "reference_mutability": z.enum(["immutable_snapshot", "mutable_requires_reapproval", "mutable_auto_recheck"]).describe("Policy for formats whose `slots` accept a `published_post` reference. `immutable_snapshot`: seller snapshots the referenced post at approval and later source changes do not change the served creative. `mutable_requires_reapproval`: the source post may change and material changes require review before continued serving. `mutable_auto_recheck`: the source post may change and the seller continuously or periodically rechecks authorization/policy without requiring buyer resubmission. Omit when the format has no `published_post` slot.").optional(), "production_window_business_days": z.number().int().gte(0).describe("Typical production turnaround in business days when the format requires seller-side production (e.g., host-recording from a buyer-supplied script). 0 for synchronous (e.g., generative AI); >0 for human-produced (e.g., podcast host-read). Absent when no production is required (buyer uploads complete creative).").optional(), "supply_mode": z.enum(["components", "rendered_canvases", "layered_source"]).describe("Which end of the template contract the buyer feeds. `components`: buyer supplies component slots; seller renders states (no `state_canvases`/`layered_source` assets allowed). `rendered_canvases`: buyer supplies exactly one `state_canvases` image per declared state \xD7 breakpoint pair. `layered_source`: buyer ships design source (+ optional `font_files`); seller production derives states (`production_window_business_days` applies) \u2014 transitional for sellers without executable templates.").optional(), "states": z.array(z.object({ "state_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).describe("Stable identifier used by `state_canvases[].state_id` and `state_click_urls[].state_id`."), "anchoring": z.enum(["inline", "sticky_top", "sticky_bottom", "overlay", "fullscreen_overlay", "underlay"]).describe("`underlay` renders the canvas beneath page content, which scrolls over it (IAB New Ad Portfolio underlay class: skins, reveal units). Transitions into `overlay`/`fullscreen_overlay` states SHOULD be user-initiated; non-user-action entries emit LEAN policy warnings."), "slot_bindings": z.array(z.string().regex(new RegExp("^[a-z0-9_]+$"))).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Asset group IDs rendered in this state (components mode). Makes the template executable: given components and bindings, assembly is deterministic. Every value MUST resolve to a declared slot. Omitted means all supplied component slots may render.").optional(), "motion": z.enum(["static", "animated"]).describe("Whether the seller-rendered layout animates within this state (attract loops, load animations). Intra-state animation is seller-rendered; buyer canvases stay static images.").optional(), "max_animation_s": z.number().gt(0).describe("Upper bound on intra-state animation duration. Required when `motion` is `animated`.").optional(), "breakpoints": z.array(z.object({ "breakpoint_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).describe("Stable identifier used by `state_canvases[].breakpoint_id`."), "width": z.number().int().gte(1).optional(), "width_range": z.array(z.number().int().gte(1)).min(2).max(2).describe("Inclusive [minimum, maximum] accepted canvas width. The first value MUST be no greater than the second; semantic validators enforce ordering.").optional(), "width_mode": z.enum(["full_bleed", "gutter_residual"]).describe("Fluid width classes. `full_bleed`: edge-to-edge viewport width (IAB adhesion, topscroll). `gutter_residual`: the margin remaining beside the page content column (desktop skins). Fluid breakpoints cannot be targeted by `rendered_canvases` supply \u2014 semantic validation rejects that pairing.").optional(), "height": z.number().int().gte(1).optional(), "height_range": z.array(z.number().int().gte(1)).min(2).max(2).describe("Inclusive [minimum, maximum] accepted canvas height. The first value MUST be no greater than the second; semantic validators enforce ordering.").optional(), "viewport_height_percent": z.number().gt(0).lte(100).describe("Height as a percentage of the viewport (topscroll 80%, mobile skin panel 15%). Fluid; cannot be targeted by `rendered_canvases` supply.").optional(), "canvas_aspect_ratio": z.string().regex(new RegExp("^[0-9]+(\\.[0-9]+)?:[0-9]+(\\.[0-9]+)?$")).describe("Aspect ratio the rendered canvas maintains across the size range (IAB flexible units, ratio-bucket responsive). When both fixed `width` and `height` are declared, the ratio MUST be consistent with them.").optional() }).catchall(z.any()).and(z.intersection(z.union([z.object({ "width": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "width_range": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "width_mode": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.object({ "height": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "height_range": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "viewport_height_percent": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).min(1).superRefine((breakpoints, ctx) => {
|
|
2187
2187
|
breakpoints.forEach((breakpoint, index) => {
|
|
2188
2188
|
const widthKeys = ["width", "width_range", "width_mode"].filter((key) => breakpoint[key] !== void 0);
|
|
2189
2189
|
const heightKeys = ["height", "height_range", "viewport_height_percent"].filter((key) => breakpoint[key] !== void 0);
|
|
@@ -2239,7 +2239,7 @@ const CanonicalFormatSellerRenderedStatefulDisplaySchema = /* @__PURE__ */ (() =
|
|
|
2239
2239
|
ctx.addIssue({ code: "custom", path: [index, "input"], message: "scroll transitions require input=scroll" });
|
|
2240
2240
|
}
|
|
2241
2241
|
});
|
|
2242
|
-
}), "clickthrough": z.enum(["required", "optional", "none"]).describe("Destination policy. `required` (default): manifest MUST supply `landing_page_url`. `optional`: click-optional units (in-feed brand units) may omit it. `none`: unit is non-clickable; manifests MUST NOT supply `landing_page_url` or `state_click_urls`. Per-state overrides via `state_click_urls` entries carrying `state_id`; `landing_page_url` is the fallback for unlisted states.").optional(), "user_controls": z.object({ "dismissible": z.boolean(), "user_collapsible": z.boolean() }).catchall(z.any()).describe("When any state anchors as `overlay` or `fullscreen_overlay`, either `dismissible` MUST be true or that state's `close_affordance` MUST be true (dismissibility floor; semantic validators enforce)."), "canvas_constraints": z.array(z.object({ "constraint": z.enum(["safe_area", "reserved_region", "decoration_only_edge", "no_text_or_logos"]), "state_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "breakpoint_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "region": z.object({ "x": z.number().gte(0), "y": z.number().gte(0), "width": z.number().gt(0), "height": z.number().gt(0), "unit": z.enum(["px", "percent"]).optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "unit": z.literal("percent") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "unit": z.literal("percent") }), z.object({ "x": z.any().optional(), "y": z.any().optional(), "width": z.any().optional(), "height": z.any().optional() }))])) }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "breakpoint_id": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "breakpoint_id": z.any().refine((value) => value !== void 0, "Required"), "state_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Rectangular rule applied to buyer artwork. State and breakpoint selectors are optional so the same shape can constrain a coordinated-placement component or a specific stateful-display canvas.")).describe("Rectangular areas constraining buyer artwork. Omitted state/breakpoint selectors apply the constraint to every canvas. For fluid or range-sized breakpoints, use percent-unit regions.").optional(), "duration_ms_range": z.array(z.union([z.number().int().gte(0), z.null()])).min(2).max(2).describe("Accepted embedded-video duration [min, max]. `duration_ms_exact` takes precedence when both are present.").optional().superRefine((range, ctx) => {
|
|
2242
|
+
}), "clickthrough": z.enum(["required", "optional", "none"]).describe("Destination policy. `required` (default): manifest MUST supply `landing_page_url`. `optional`: click-optional units (in-feed brand units) may omit it. `none`: unit is non-clickable; manifests MUST NOT supply `landing_page_url` or `state_click_urls`. Per-state overrides via `state_click_urls` entries carrying `state_id`; `landing_page_url` is the fallback for unlisted states.").optional(), "user_controls": z.object({ "dismissible": z.boolean(), "user_collapsible": z.boolean() }).catchall(z.any()).describe("When any state anchors as `overlay` or `fullscreen_overlay`, either `dismissible` MUST be true or that state's `close_affordance` MUST be true (dismissibility floor; semantic validators enforce)."), "canvas_constraints": z.array(z.object({ "constraint": z.enum(["safe_area", "reserved_region", "decoration_only_edge", "no_text_or_logos"]), "state_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "breakpoint_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "region": z.object({ "x": z.number().gte(0), "y": z.number().gte(0), "width": z.number().gt(0), "height": z.number().gt(0), "unit": z.enum(["px", "percent"]).optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "unit": z.literal("percent") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "unit": z.literal("percent") }), z.object({ "x": z.any().optional(), "y": z.any().optional(), "width": z.any().optional(), "height": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")) }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "breakpoint_id": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "breakpoint_id": z.any().refine((value) => value !== void 0, "Required"), "state_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Rectangular rule applied to buyer artwork. State and breakpoint selectors are optional so the same shape can constrain a coordinated-placement component or a specific stateful-display canvas.")).describe("Rectangular areas constraining buyer artwork. Omitted state/breakpoint selectors apply the constraint to every canvas. For fluid or range-sized breakpoints, use percent-unit regions.").optional(), "duration_ms_range": z.array(z.union([z.number().int().gte(0), z.null()])).min(2).max(2).describe("Accepted embedded-video duration [min, max]. `duration_ms_exact` takes precedence when both are present.").optional().superRefine((range, ctx) => {
|
|
2243
2243
|
if (range !== void 0 && !range.some((value) => value !== null)) {
|
|
2244
2244
|
ctx.addIssue({ code: "custom", path: [], message: "duration_ms_range requires at least one finite bound" });
|
|
2245
2245
|
}
|
|
@@ -2643,7 +2643,7 @@ const CommittedMetricSchema = /* @__PURE__ */ (() => z.union([z.object({
|
|
|
2643
2643
|
committed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
|
|
2644
2644
|
}).passthrough()]))();
|
|
2645
2645
|
const AudienceCharacteristicSchema = /* @__PURE__ */ (() => z.object({
|
|
2646
|
-
dimension: z.union([z.literal("age"), z.object({}).passthrough()]).and(z.string()),
|
|
2646
|
+
dimension: z.union([z.literal("age"), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.").and(z.string()),
|
|
2647
2647
|
value: z.union([z.string(), z.number(), z.boolean(), z.array(z.union([z.string(), z.number(), z.boolean()]))]).optional(),
|
|
2648
2648
|
range: z.object({
|
|
2649
2649
|
min: z.number().optional(),
|
|
@@ -2655,8 +2655,8 @@ const AudienceCharacteristicSchema = /* @__PURE__ */ (() => z.object({
|
|
|
2655
2655
|
value_id: z.string().min(1).optional()
|
|
2656
2656
|
}).passthrough().optional(),
|
|
2657
2657
|
label: z.string().optional()
|
|
2658
|
-
}).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
|
|
2659
|
-
dimension: z.union([z.literal("age"), z.object({}).passthrough()]).and(z.string()),
|
|
2658
|
+
}).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
|
|
2659
|
+
dimension: z.union([z.literal("age"), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.").and(z.string()),
|
|
2660
2660
|
value: z.union([z.string(), z.number(), z.boolean(), z.array(z.union([z.string(), z.number(), z.boolean()]))]).optional(),
|
|
2661
2661
|
range: z.object({
|
|
2662
2662
|
min: z.number().optional(),
|
|
@@ -2873,7 +2873,7 @@ const CoordinatedPlacementInlineParamsRuntimeSchemas = /* @__PURE__ */ (() => ({
|
|
|
2873
2873
|
agent_placement: CanonicalFormatAgentPlacementAISurfaceSponsoredPlacementSchema,
|
|
2874
2874
|
seller_rendered_stateful_display: CanonicalFormatSellerRenderedStatefulDisplaySchema
|
|
2875
2875
|
}))();
|
|
2876
|
-
const CanonicalFormatCoordinatedPlacementsSchema = /* @__PURE__ */ (() => z.object({ "experimental": z.boolean().describe("Experimental in AdCP 3.2 while the creative working group gathers implementation evidence for atomic cross-placement composition.").optional(), "deprecated": z.boolean().describe("When true, this canonical (or a seller's specific narrowing of it) is going away. Existing adopters are supported through the deprecation cycle; new adoption is discouraged. Pair with `migration_target_version` to indicate when the canonical is expected to be removed. Distinct from `experimental`: an experimental canonical may stabilize and stop being experimental; a deprecated canonical is on a sunset path.").optional(), "v1_translatable": z.boolean().describe("No v1 named-format equivalent can express a coordinated multi-placement buy.").optional(), "since_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version that introduced this canonical (e.g., '3.1', '3.2'). Lets adopters reason about minimum protocol version requirements when consuming a format declaration. Patch precision is intentionally rejected \u2014 canonicals are introduced at minor-version boundaries.").optional(), "migration_target_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version by which the working group expects this canonical to stabilize, surface a breaking revision, or (when `deprecated: true`) be removed. Patch precision is intentionally rejected \u2014 canonicals shift at minor-version boundaries. Absence signals 'no specific target' (omit the field rather than use a placeholder like 'unknown').").optional(), "composition_model": z.enum(["deterministic", "algorithmic"]).describe("Whether the surface composes deterministically (buyer can predict per-slot rendering \u2014 sponsored_placement, image, video) or algorithmically (surface chooses combinations or phrasing \u2014 responsive_creative, agent_placement).").optional(), "provenance_required": z.boolean().describe("When true, the product rejects unsigned synthesized assets. Builders calling build_creative MUST attach a C2PA-compatible provenance manifest attributing synthesis to the creative agent.").optional(), "platform_extensions": z.array(z.object({ "uri": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("HTTPS URL identifying the extension. `https://` is mandatory \u2014 `http://`, `file://`, `data:`, and other schemes are rejected at the schema layer (defense-in-depth on top of the fetch-contract normative rules). The URI base is the owning agent's URL; the path identifies the extension within that agent. Example: 'https://creative.adcontextprotocol.org/translated/meta/extensions/meta_pixel'. The full fetch contract \u2014 SSRF allowlist, response-size cap, $ref sandbox, schema-compile bounds \u2014 is documented on `product-format-declaration.json#format_schema` and applies to ALL fetches of this reference shape regardless of whether the field is named `format_schema` (load-bearing for validation) or `platform_extensions` (informational); the *transport* rules are identical, only the *consumption* semantics differ."), "digest": z.string().regex(new RegExp("^sha256:[a-f0-9]{64}$")).describe("SHA-256 content digest of the extension definition (sha256:<hex>). Used to detect drift \u2014 if the agent revises the extension, the digest changes and cached definitions become invalid.") }).catchall(z.any()).describe("Reference to a platform extension definition. The agent that owns the URI is authoritative for the extension's schema. Buyers fetch the definition once per content digest and cache it. Platform extensions are typically bundled in `get_products` responses under an `extensions` map keyed by `uri@digest`, eliminating the need for a separate fetch.\n\n**Within a single response**, multiple references to the same `uri` MUST carry the same `digest` \u2014 divergent digests in one response indicate producer-side error (e.g., concurrent extension revision mid-render). Buyers encountering divergent digests for the same URI MUST fail closed: treat all references to that URI as unresolved and surface a validation error rather than picking one branch silently. **Across responses**, digest divergence is normal \u2014 extension authors revise their schemas, the new digest differs, the cache key changes, and the buyer refetches. Cache by `uri@digest`, not by `uri` alone.")).describe('Platform-specific extensions narrowing the canonical (pixel ID shapes, conversion event taxonomies, platform-specific CTAs/destinations). Each extension is a URI+digest reference resolved against the bundled `extensions` map in get_products responses or fetched directly.\n\n**Collision precedence (normative).** When two or more `platform_extensions[]` entries on the same declaration extend the same target (e.g., both extend `tracking`) with overlapping field names, **array order is authoritative \u2014 later entries override earlier ones on a per-field basis** (last-in-array-wins). SDKs MUST surface the overlap via the `errors[]` array on the `get_products` response with a structured code (`FORMAT_DECLARATION_DIVERGENT` is appropriate when the overlap appears across dual-emitted shapes; a producer-self-emitted overlap on a single declaration SHOULD use the same code with `error.details: { collision_kind: "platform_extension_field", target, overlapping_fields, winning_extension_uri }`). Producers SHOULD avoid the collision by emitting one extension per target or by partitioning fields across extensions; the deterministic precedence is for last-resort consistency across SDK implementations, not a sanctioned merging strategy.').optional(), "synthesis_nondeterministic": z.boolean().describe("When true, the format's production pipeline is genuinely nondeterministic \u2014 the platform cannot guarantee that synthesis from a given input set produces in-spec output. Veo / Sora / Runway-class generative video, and other AI-synthesis flows where output dimensions, duration, or quality vary per run. Implies a different validation contract: predictive `validate_input` is impossible; the platform's own post-synthesis QA loop applies; if the QA loop exhausts without producing a valid artifact, `build_creative` returns task_failed with a synthesis_failed reason. Distinct from `composition_model` (which describes how the surface composes per-slot rendering, not whether synthesis is deterministic). When false or absent, the format's production is predictable enough that `validate_input` can predict output properties from input properties.\n\n**Compatibility with `asset_source` / `item_production_model`**: `synthesis_nondeterministic: true` MAY pair with any of `seller_pre_rendered_from_brief`, `seller_human_designed`, or `agent_synthesized` (the QA loop is concept-level, not source-specific \u2014 'seller renders from brief but each retry differs' is just as nondeterministic as Veo). It MUST NOT pair with `buyer_uploaded` (the buyer ships pre-rendered bytes; there's no synthesis step to be nondeterministic about). It MUST NOT pair with `publisher_host_recorded` (the publisher's host produces a deterministic-from-script output even if the human voice varies). When `synthesis_nondeterministic: true` is set with an incompatible source, validators SHOULD reject with a structured error.").optional(), "slots": z.array(z.object({ "asset_group_id": z.string().describe("Canonical asset_group_id from /schemas/core/asset-group-vocabulary.json. Non-canonical IDs are valid but trigger soft warnings."), "asset_type": z.enum(["image", "video", "audio", "text", "markdown", "url", "html", "css", "javascript", "vast", "daast", "display_tag", "webhook", "brief", "catalog", "published_post", "zip", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]).describe("Discriminator selecting the asset schema this slot accepts. SDK codegen uses this to type the slot value. `display_tag` is the atomic third-party display representation (URL, inline markup, or paired redirect). `published_post` is an existing-post reference asset. `pixel_tracker` / `vast_tracker` / `daast_tracker` are renderer-fired tracker primitives. `object` is a last-resort fallback."), "required": z.boolean().describe("Whether this slot is required for a valid manifest.").optional(), "min": z.number().int().gte(0).describe("Minimum count for repeatable / pool slots.").optional(), "max": z.number().int().gte(1).describe("Maximum count for repeatable / pool slots.").optional(), "max_chars": z.number().int().gte(1).describe("Per-slot character limit. Valid only when `asset_type` is `text`, `markdown`, or `brief`. Mutually exclusive with `max_size_kb` (which applies to binary asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "max_size_kb": z.number().int().gte(1).describe("Per-slot file size limit in exact kilobytes, where 1 KB = 1,000 bytes. Valid only when `asset_type` is `image`, `video`, `audio`, or `zip`. Mutually exclusive with `max_chars` (which applies to text asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Accepted intrinsic-pixel densities for this image-bearing slot. Valid when `asset_type` is `image`, and on a `card` slot where it constrains each card's image media (video media is unaffected). This makes density available to every canonical carrying image assets (native, carousel, responsive, companion images, and image itself), not only `format_kind: image`. When the image canonical also declares top-level `params.pixel_ratios`, the effective set is the intersection; an empty intersection is invalid. One matching asset satisfies the slot unless `required_pixel_ratios` requires rendition coverage.").optional(), "required_pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Required density coverage for an image rendition set. Valid only when `asset_type` is `image` and `pixel_ratios` is also declared. Every value MUST appear in the effective accepted set after intersecting any top-level image `params.pixel_ratios`, and the manifest slot value MUST be an array containing exactly one matching image rendition for each required ratio. Other accepted ratios remain optional. For example, `pixel_ratios: [1, 1.5, 2]` with `required_pixel_ratios: [1, 2]` requires the 1x and 2x renditions while making 1.5x optional. SDKs enforce intersection, subset, coverage, and duplicate-ratio rules because JSON Schema draft-07 cannot express them generically.").optional(), "logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("When `asset_group_id` is `logo`, renderer-facing brand.json logo slots acceptable for this format slot. Producers selecting from brand.json SHOULD prefer `logos[]` entries whose `slots[]` intersects this list, then apply `visual_guidelines.logo_usage_rules[]`.").optional(), "required_logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Subset of `logo_slots` for which this format expects explicit logo coverage. A manifest or brand-derived logo pool SHOULD include at least one usable logo for each required slot; if coverage is missing, builders SHOULD surface a validation warning or approval mapping instead of guessing from prose.").optional(), "description": z.string().describe("Human-readable description of what the slot expects from the buyer.").optional(), "consumed_for_production": z.boolean().describe("Dispatch hint for `build_creative` and v1\u2194v2 wire translators: when `true`, the slot's value is consumed as INPUT to a production step (host-read script, brief copy fed to generative synthesis, catalog feed driving per-SKU rendering) and is not rendered verbatim. When `false` (default), the slot's value is rendered verbatim on the placement (image bytes, video file, display tag).\n\nMotivates the v1\u2194v2 dispatch table: pre-v2 buyers shipped production-consumed inputs separately in a `inputs` map on the build_creative request; v2 collapses inputs and rendered assets into a single `assets` map keyed by `asset_group_id`. SDK translators between v1 and v2 use this flag per canonical to know which assets in the v2 manifest map back to v1 `inputs` vs v1 `assets`. Without the per-slot flag the dispatch table lives in adopter code and every SDK gets it slightly different.\n\nProducers SHOULD set this explicitly on slots whose consumption pattern isn't obvious (host-read scripts on `audio_hosted`, briefs on generative `video_hosted`, catalog feeds on `sponsored_placement`). For canonicals where every slot is render-verbatim (`image`, `display_tag`, `video_vast`, `audio_vast`), the default `false` is sufficient and the flag MAY be omitted.").optional() }).catchall(z.any()).and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }), z.any().refine((value) => !z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }), z.any().refine((value) => !z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.union([z.any().refine((value) => !z.any().refine((value2) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema").safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.any().refine((value) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.any().refine((value) => !z.union([z.object({ "logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "required_logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]))), z.intersection(z.any(), z.intersection(z.union([z.any().refine((value) => !z.object({ "required_pixel_ratios": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "required_pixel_ratios": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "asset_type": z.literal("image").optional() }))]), z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }), z.any().refine((value) => !z.union([z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))])))))).describe("Programmatic declaration of which canonical asset_group_id slots a manifest targeting this format must (or may) populate. Lets SDK codegen and validators enumerate expected slots without parsing the format's prose description. Each entry references an asset_group_id from the canonical vocabulary registry, paired with an `asset_type` so the validator knows which asset schema to apply. Format-level narrowing parameters that apply across all slots (e.g., flat `headline_max_chars` on responsive_creative) may also live on the format declaration; per-slot constraints (a specific slot's `max_chars` or `max_size_kb`) live on the slot entry.").optional(), "required_connections": z.array(z.object({ "provider": z.string().describe("Stable provider or platform namespace, preferably lowercase. Examples: `social.example`, `shortvideo.example`, or a seller-defined namespace. Omit only when the requirement is provider-agnostic, or when an `authorization_url` fully routes the human to the correct provider-specific connection flow.").optional(), "connection_type": z.enum(["advertiser_account", "publisher_identity", "post_authorization"]).describe("Kind of downstream connection required. `advertiser_account` is the platform account used to buy/manage ads. `publisher_identity` is the creator, page, channel, organization, or profile that owns source posts. `post_authorization` is a post-scoped grant when the platform authorizes individual posts instead of, or in addition to, the owning identity."), "required_for": z.array(z.string().min(1)).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Concrete AdCP protocol operation names that require this downstream connection. Sellers SHOULD include this in product declarations when the requirement is known ahead of time, and in AUTHORIZATION_REQUIRED details when it explains the failed operation. Prefer specific operation names such as `list_creatives`, `sync_creatives`, `create_media_buy`, `get_media_buy_delivery`, or `get_creative_delivery` over broad category labels such as `reporting`.").optional(), "scope": z.enum(["account", "identity", "post", "unknown"]).describe("Granularity of the downstream grant.").optional(), "status": z.enum(["connected", "missing", "pending", "expired", "revoked", "not_required", "unknown"]).describe("Current seller-observed state for this downstream connection when known. Product declarations MAY omit status or use `unknown`; AUTHORIZATION_REQUIRED details SHOULD use `missing`, `expired`, or `revoked` for the connection that blocked the call.").optional(), "connection_id": z.string().describe("Seller-defined identifier for an already-created downstream connection. Omit when no connection exists yet or when exposing it would leak platform/account state.").optional(), "resource_ref": z.object({ "platform_account_id": z.string().describe("Provider-native advertiser or business account id, when safe to disclose.").optional(), "identity_id": z.string().describe("Provider-native creator, page, channel, organization, or profile id, when safe to disclose.").optional(), "handle": z.string().describe("Provider-native public handle for the owning identity, when available.").optional(), "profile_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the owning identity, when available.").optional(), "post_id": z.string().describe("Provider-native post id, when the grant is post-scoped or the failed request referenced a specific post.").optional(), "post_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the referenced post, when available.").optional() }).catchall(z.any()).describe("Optional opaque provider-native resource hint, such as a platform account id, profile URL, handle, channel id, post id, or post URL. This is a hint for routing authorization, not proof that authorization exists.").optional(), "authorization_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Seller-hosted or provider-hosted URL where a human can complete or restore this downstream connection.").optional(), "authorization_instructions": z.string().describe("Human-readable instructions for completing or restoring this downstream connection.").optional(), "expires_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }), z.union([z.object({ "provider": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "authorization_url": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]))])).describe("A seller/platform-side connection or grant required by a product, format, or request. This is not the AdCP caller credential: the AdCP request is still authenticated once, and the seller uses these stored downstream connections to call a platform or service on the buyer's behalf. Use this shape for platforms that require more than one downstream grant, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.")).describe("Downstream platform connections or grants required to use this format declaration. These are in addition to the single AdCP caller credential. Use this when a platform product requires multiple downstream grants, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.").optional(), "reference_mutability": z.enum(["immutable_snapshot", "mutable_requires_reapproval", "mutable_auto_recheck"]).describe("Policy for formats whose `slots` accept a `published_post` reference. `immutable_snapshot`: seller snapshots the referenced post at approval and later source changes do not change the served creative. `mutable_requires_reapproval`: the source post may change and material changes require review before continued serving. `mutable_auto_recheck`: the source post may change and the seller continuously or periodically rechecks authorization/policy without requiring buyer resubmission. Omit when the format has no `published_post` slot.").optional(), "production_window_business_days": z.number().int().gte(0).describe("Typical production turnaround in business days when the format requires seller-side production (e.g., host-recording from a buyer-supplied script). 0 for synchronous (e.g., generative AI); >0 for human-produced (e.g., podcast host-read). Absent when no production is required (buyer uploads complete creative).").optional(), "components": z.array(z.object({ "component_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).describe("Stable coordination-local component identifier. Values MUST be unique within `components[]`."), "placement_ref": z.object({ "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring a publisher-catalog placement is hosted, or the inventory publisher associated with an inline placement. Omitted only for legacy single-publisher product-context references.").optional(), "placement_id": z.string().describe("Placement ID from the publisher's adagents.json placement catalog, or an inline seller-defined placement ID interpreted within the enclosing seller and product context.") }).catchall(z.any()).describe("Public product placement this component supplies. MUST resolve against the containing product's `placements[]`."), "required": z.boolean(), "sequence": z.number().int().gte(1).describe("Declared presentation order for sequential-messaging coordinated buys. Components sharing a sequence value present simultaneously; absent means unordered/simultaneous (default). Sequence declares seller-rendered ordering, not buyer-controlled timing.").optional(), "serving_policy": z.enum(["seller_served_only", "third_party_allowed"]).describe("Per-component serving/tracking policy. Some sellers restrict specific components (e.g., page skins) to first-party serving while allowing third-party tags on sibling components. Defaults to the product-level policy when absent.").optional(), "canvas_constraints": z.array(z.object({ "constraint": z.enum(["safe_area", "reserved_region", "decoration_only_edge", "no_text_or_logos"]), "state_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "breakpoint_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "region": z.object({ "x": z.number().gte(0), "y": z.number().gte(0), "width": z.number().gt(0), "height": z.number().gt(0), "unit": z.enum(["px", "percent"]).optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "unit": z.literal("percent") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "unit": z.literal("percent") }), z.object({ "x": z.any().optional(), "y": z.any().optional(), "width": z.any().optional(), "height": z.any().optional() }))])) }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "breakpoint_id": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "breakpoint_id": z.any().refine((value) => value !== void 0, "Required"), "state_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Rectangular rule applied to buyer artwork. State and breakpoint selectors are optional so the same shape can constrain a coordinated-placement component or a specific stateful-display canvas.")).describe("Artwork constraints applied to this component, including safe areas and seller-reserved regions.").optional(), "format_option_ref": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
|
|
2876
|
+
const CanonicalFormatCoordinatedPlacementsSchema = /* @__PURE__ */ (() => z.object({ "experimental": z.boolean().describe("Experimental in AdCP 3.2 while the creative working group gathers implementation evidence for atomic cross-placement composition.").optional(), "deprecated": z.boolean().describe("When true, this canonical (or a seller's specific narrowing of it) is going away. Existing adopters are supported through the deprecation cycle; new adoption is discouraged. Pair with `migration_target_version` to indicate when the canonical is expected to be removed. Distinct from `experimental`: an experimental canonical may stabilize and stop being experimental; a deprecated canonical is on a sunset path.").optional(), "v1_translatable": z.boolean().describe("No v1 named-format equivalent can express a coordinated multi-placement buy.").optional(), "since_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version that introduced this canonical (e.g., '3.1', '3.2'). Lets adopters reason about minimum protocol version requirements when consuming a format declaration. Patch precision is intentionally rejected \u2014 canonicals are introduced at minor-version boundaries.").optional(), "migration_target_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version by which the working group expects this canonical to stabilize, surface a breaking revision, or (when `deprecated: true`) be removed. Patch precision is intentionally rejected \u2014 canonicals shift at minor-version boundaries. Absence signals 'no specific target' (omit the field rather than use a placeholder like 'unknown').").optional(), "composition_model": z.enum(["deterministic", "algorithmic"]).describe("Whether the surface composes deterministically (buyer can predict per-slot rendering \u2014 sponsored_placement, image, video) or algorithmically (surface chooses combinations or phrasing \u2014 responsive_creative, agent_placement).").optional(), "provenance_required": z.boolean().describe("When true, the product rejects unsigned synthesized assets. Builders calling build_creative MUST attach a C2PA-compatible provenance manifest attributing synthesis to the creative agent.").optional(), "platform_extensions": z.array(z.object({ "uri": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("HTTPS URL identifying the extension. `https://` is mandatory \u2014 `http://`, `file://`, `data:`, and other schemes are rejected at the schema layer (defense-in-depth on top of the fetch-contract normative rules). The URI base is the owning agent's URL; the path identifies the extension within that agent. Example: 'https://creative.adcontextprotocol.org/translated/meta/extensions/meta_pixel'. The full fetch contract \u2014 SSRF allowlist, response-size cap, $ref sandbox, schema-compile bounds \u2014 is documented on `product-format-declaration.json#format_schema` and applies to ALL fetches of this reference shape regardless of whether the field is named `format_schema` (load-bearing for validation) or `platform_extensions` (informational); the *transport* rules are identical, only the *consumption* semantics differ."), "digest": z.string().regex(new RegExp("^sha256:[a-f0-9]{64}$")).describe("SHA-256 content digest of the extension definition (sha256:<hex>). Used to detect drift \u2014 if the agent revises the extension, the digest changes and cached definitions become invalid.") }).catchall(z.any()).describe("Reference to a platform extension definition. The agent that owns the URI is authoritative for the extension's schema. Buyers fetch the definition once per content digest and cache it. Platform extensions are typically bundled in `get_products` responses under an `extensions` map keyed by `uri@digest`, eliminating the need for a separate fetch.\n\n**Within a single response**, multiple references to the same `uri` MUST carry the same `digest` \u2014 divergent digests in one response indicate producer-side error (e.g., concurrent extension revision mid-render). Buyers encountering divergent digests for the same URI MUST fail closed: treat all references to that URI as unresolved and surface a validation error rather than picking one branch silently. **Across responses**, digest divergence is normal \u2014 extension authors revise their schemas, the new digest differs, the cache key changes, and the buyer refetches. Cache by `uri@digest`, not by `uri` alone.")).describe('Platform-specific extensions narrowing the canonical (pixel ID shapes, conversion event taxonomies, platform-specific CTAs/destinations). Each extension is a URI+digest reference resolved against the bundled `extensions` map in get_products responses or fetched directly.\n\n**Collision precedence (normative).** When two or more `platform_extensions[]` entries on the same declaration extend the same target (e.g., both extend `tracking`) with overlapping field names, **array order is authoritative \u2014 later entries override earlier ones on a per-field basis** (last-in-array-wins). SDKs MUST surface the overlap via the `errors[]` array on the `get_products` response with a structured code (`FORMAT_DECLARATION_DIVERGENT` is appropriate when the overlap appears across dual-emitted shapes; a producer-self-emitted overlap on a single declaration SHOULD use the same code with `error.details: { collision_kind: "platform_extension_field", target, overlapping_fields, winning_extension_uri }`). Producers SHOULD avoid the collision by emitting one extension per target or by partitioning fields across extensions; the deterministic precedence is for last-resort consistency across SDK implementations, not a sanctioned merging strategy.').optional(), "synthesis_nondeterministic": z.boolean().describe("When true, the format's production pipeline is genuinely nondeterministic \u2014 the platform cannot guarantee that synthesis from a given input set produces in-spec output. Veo / Sora / Runway-class generative video, and other AI-synthesis flows where output dimensions, duration, or quality vary per run. Implies a different validation contract: predictive `validate_input` is impossible; the platform's own post-synthesis QA loop applies; if the QA loop exhausts without producing a valid artifact, `build_creative` returns task_failed with a synthesis_failed reason. Distinct from `composition_model` (which describes how the surface composes per-slot rendering, not whether synthesis is deterministic). When false or absent, the format's production is predictable enough that `validate_input` can predict output properties from input properties.\n\n**Compatibility with `asset_source` / `item_production_model`**: `synthesis_nondeterministic: true` MAY pair with any of `seller_pre_rendered_from_brief`, `seller_human_designed`, or `agent_synthesized` (the QA loop is concept-level, not source-specific \u2014 'seller renders from brief but each retry differs' is just as nondeterministic as Veo). It MUST NOT pair with `buyer_uploaded` (the buyer ships pre-rendered bytes; there's no synthesis step to be nondeterministic about). It MUST NOT pair with `publisher_host_recorded` (the publisher's host produces a deterministic-from-script output even if the human voice varies). When `synthesis_nondeterministic: true` is set with an incompatible source, validators SHOULD reject with a structured error.").optional(), "slots": z.array(z.object({ "asset_group_id": z.string().describe("Canonical asset_group_id from /schemas/core/asset-group-vocabulary.json. Non-canonical IDs are valid but trigger soft warnings."), "asset_type": z.enum(["image", "video", "audio", "text", "markdown", "url", "html", "css", "javascript", "vast", "daast", "display_tag", "webhook", "brief", "catalog", "published_post", "zip", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]).describe("Discriminator selecting the asset schema this slot accepts. SDK codegen uses this to type the slot value. `display_tag` is the atomic third-party display representation (URL, inline markup, or paired redirect). `published_post` is an existing-post reference asset. `pixel_tracker` / `vast_tracker` / `daast_tracker` are renderer-fired tracker primitives. `object` is a last-resort fallback."), "required": z.boolean().describe("Whether this slot is required for a valid manifest.").optional(), "min": z.number().int().gte(0).describe("Minimum count for repeatable / pool slots.").optional(), "max": z.number().int().gte(1).describe("Maximum count for repeatable / pool slots.").optional(), "max_chars": z.number().int().gte(1).describe("Per-slot character limit. Valid only when `asset_type` is `text`, `markdown`, or `brief`. Mutually exclusive with `max_size_kb` (which applies to binary asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "max_size_kb": z.number().int().gte(1).describe("Per-slot file size limit in exact kilobytes, where 1 KB = 1,000 bytes. Valid only when `asset_type` is `image`, `video`, `audio`, or `zip`. Mutually exclusive with `max_chars` (which applies to text asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Accepted intrinsic-pixel densities for this image-bearing slot. Valid when `asset_type` is `image`, and on a `card` slot where it constrains each card's image media (video media is unaffected). This makes density available to every canonical carrying image assets (native, carousel, responsive, companion images, and image itself), not only `format_kind: image`. When the image canonical also declares top-level `params.pixel_ratios`, the effective set is the intersection; an empty intersection is invalid. One matching asset satisfies the slot unless `required_pixel_ratios` requires rendition coverage.").optional(), "required_pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Required density coverage for an image rendition set. Valid only when `asset_type` is `image` and `pixel_ratios` is also declared. Every value MUST appear in the effective accepted set after intersecting any top-level image `params.pixel_ratios`, and the manifest slot value MUST be an array containing exactly one matching image rendition for each required ratio. Other accepted ratios remain optional. For example, `pixel_ratios: [1, 1.5, 2]` with `required_pixel_ratios: [1, 2]` requires the 1x and 2x renditions while making 1.5x optional. SDKs enforce intersection, subset, coverage, and duplicate-ratio rules because JSON Schema draft-07 cannot express them generically.").optional(), "logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("When `asset_group_id` is `logo`, renderer-facing brand.json logo slots acceptable for this format slot. Producers selecting from brand.json SHOULD prefer `logos[]` entries whose `slots[]` intersects this list, then apply `visual_guidelines.logo_usage_rules[]`.").optional(), "required_logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Subset of `logo_slots` for which this format expects explicit logo coverage. A manifest or brand-derived logo pool SHOULD include at least one usable logo for each required slot; if coverage is missing, builders SHOULD surface a validation warning or approval mapping instead of guessing from prose.").optional(), "description": z.string().describe("Human-readable description of what the slot expects from the buyer.").optional(), "consumed_for_production": z.boolean().describe("Dispatch hint for `build_creative` and v1\u2194v2 wire translators: when `true`, the slot's value is consumed as INPUT to a production step (host-read script, brief copy fed to generative synthesis, catalog feed driving per-SKU rendering) and is not rendered verbatim. When `false` (default), the slot's value is rendered verbatim on the placement (image bytes, video file, display tag).\n\nMotivates the v1\u2194v2 dispatch table: pre-v2 buyers shipped production-consumed inputs separately in a `inputs` map on the build_creative request; v2 collapses inputs and rendered assets into a single `assets` map keyed by `asset_group_id`. SDK translators between v1 and v2 use this flag per canonical to know which assets in the v2 manifest map back to v1 `inputs` vs v1 `assets`. Without the per-slot flag the dispatch table lives in adopter code and every SDK gets it slightly different.\n\nProducers SHOULD set this explicitly on slots whose consumption pattern isn't obvious (host-read scripts on `audio_hosted`, briefs on generative `video_hosted`, catalog feeds on `sponsored_placement`). For canonicals where every slot is render-verbatim (`image`, `display_tag`, `video_vast`, `audio_vast`), the default `false` is sufficient and the flag MAY be omitted.").optional() }).catchall(z.any()).and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }), z.any().refine((value) => !z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }), z.any().refine((value) => !z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.union([z.any().refine((value) => !z.any().refine((value2) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema").safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.any().refine((value) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.any().refine((value) => !z.union([z.object({ "logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "required_logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]))), z.intersection(z.any(), z.intersection(z.union([z.any().refine((value) => !z.object({ "required_pixel_ratios": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "required_pixel_ratios": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "asset_type": z.literal("image").optional() }))]), z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }), z.any().refine((value) => !z.union([z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))])))))).describe("Programmatic declaration of which canonical asset_group_id slots a manifest targeting this format must (or may) populate. Lets SDK codegen and validators enumerate expected slots without parsing the format's prose description. Each entry references an asset_group_id from the canonical vocabulary registry, paired with an `asset_type` so the validator knows which asset schema to apply. Format-level narrowing parameters that apply across all slots (e.g., flat `headline_max_chars` on responsive_creative) may also live on the format declaration; per-slot constraints (a specific slot's `max_chars` or `max_size_kb`) live on the slot entry.").optional(), "required_connections": z.array(z.object({ "provider": z.string().describe("Stable provider or platform namespace, preferably lowercase. Examples: `social.example`, `shortvideo.example`, or a seller-defined namespace. Omit only when the requirement is provider-agnostic, or when an `authorization_url` fully routes the human to the correct provider-specific connection flow.").optional(), "connection_type": z.enum(["advertiser_account", "publisher_identity", "post_authorization"]).describe("Kind of downstream connection required. `advertiser_account` is the platform account used to buy/manage ads. `publisher_identity` is the creator, page, channel, organization, or profile that owns source posts. `post_authorization` is a post-scoped grant when the platform authorizes individual posts instead of, or in addition to, the owning identity."), "required_for": z.array(z.string().min(1)).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Concrete AdCP protocol operation names that require this downstream connection. Sellers SHOULD include this in product declarations when the requirement is known ahead of time, and in AUTHORIZATION_REQUIRED details when it explains the failed operation. Prefer specific operation names such as `list_creatives`, `sync_creatives`, `create_media_buy`, `get_media_buy_delivery`, or `get_creative_delivery` over broad category labels such as `reporting`.").optional(), "scope": z.enum(["account", "identity", "post", "unknown"]).describe("Granularity of the downstream grant.").optional(), "status": z.enum(["connected", "missing", "pending", "expired", "revoked", "not_required", "unknown"]).describe("Current seller-observed state for this downstream connection when known. Product declarations MAY omit status or use `unknown`; AUTHORIZATION_REQUIRED details SHOULD use `missing`, `expired`, or `revoked` for the connection that blocked the call.").optional(), "connection_id": z.string().describe("Seller-defined identifier for an already-created downstream connection. Omit when no connection exists yet or when exposing it would leak platform/account state.").optional(), "resource_ref": z.object({ "platform_account_id": z.string().describe("Provider-native advertiser or business account id, when safe to disclose.").optional(), "identity_id": z.string().describe("Provider-native creator, page, channel, organization, or profile id, when safe to disclose.").optional(), "handle": z.string().describe("Provider-native public handle for the owning identity, when available.").optional(), "profile_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the owning identity, when available.").optional(), "post_id": z.string().describe("Provider-native post id, when the grant is post-scoped or the failed request referenced a specific post.").optional(), "post_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the referenced post, when available.").optional() }).catchall(z.any()).describe("Optional opaque provider-native resource hint, such as a platform account id, profile URL, handle, channel id, post id, or post URL. This is a hint for routing authorization, not proof that authorization exists.").optional(), "authorization_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Seller-hosted or provider-hosted URL where a human can complete or restore this downstream connection.").optional(), "authorization_instructions": z.string().describe("Human-readable instructions for completing or restoring this downstream connection.").optional(), "expires_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }), z.union([z.object({ "provider": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "authorization_url": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]))]).describe("Must also satisfy at least one of these alternatives.")).describe("A seller/platform-side connection or grant required by a product, format, or request. This is not the AdCP caller credential: the AdCP request is still authenticated once, and the seller uses these stored downstream connections to call a platform or service on the buyer's behalf. Use this shape for platforms that require more than one downstream grant, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.")).describe("Downstream platform connections or grants required to use this format declaration. These are in addition to the single AdCP caller credential. Use this when a platform product requires multiple downstream grants, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.").optional(), "reference_mutability": z.enum(["immutable_snapshot", "mutable_requires_reapproval", "mutable_auto_recheck"]).describe("Policy for formats whose `slots` accept a `published_post` reference. `immutable_snapshot`: seller snapshots the referenced post at approval and later source changes do not change the served creative. `mutable_requires_reapproval`: the source post may change and material changes require review before continued serving. `mutable_auto_recheck`: the source post may change and the seller continuously or periodically rechecks authorization/policy without requiring buyer resubmission. Omit when the format has no `published_post` slot.").optional(), "production_window_business_days": z.number().int().gte(0).describe("Typical production turnaround in business days when the format requires seller-side production (e.g., host-recording from a buyer-supplied script). 0 for synchronous (e.g., generative AI); >0 for human-produced (e.g., podcast host-read). Absent when no production is required (buyer uploads complete creative).").optional(), "components": z.array(z.object({ "component_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).describe("Stable coordination-local component identifier. Values MUST be unique within `components[]`."), "placement_ref": z.object({ "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring a publisher-catalog placement is hosted, or the inventory publisher associated with an inline placement. Omitted only for legacy single-publisher product-context references.").optional(), "placement_id": z.string().describe("Placement ID from the publisher's adagents.json placement catalog, or an inline seller-defined placement ID interpreted within the enclosing seller and product context.") }).catchall(z.any()).describe("Public product placement this component supplies. MUST resolve against the containing product's `placements[]`."), "required": z.boolean(), "sequence": z.number().int().gte(1).describe("Declared presentation order for sequential-messaging coordinated buys. Components sharing a sequence value present simultaneously; absent means unordered/simultaneous (default). Sequence declares seller-rendered ordering, not buyer-controlled timing.").optional(), "serving_policy": z.enum(["seller_served_only", "third_party_allowed"]).describe("Per-component serving/tracking policy. Some sellers restrict specific components (e.g., page skins) to first-party serving while allowing third-party tags on sibling components. Defaults to the product-level policy when absent.").optional(), "canvas_constraints": z.array(z.object({ "constraint": z.enum(["safe_area", "reserved_region", "decoration_only_edge", "no_text_or_logos"]), "state_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "breakpoint_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "region": z.object({ "x": z.number().gte(0), "y": z.number().gte(0), "width": z.number().gt(0), "height": z.number().gt(0), "unit": z.enum(["px", "percent"]).optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "unit": z.literal("percent") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "unit": z.literal("percent") }), z.object({ "x": z.any().optional(), "y": z.any().optional(), "width": z.any().optional(), "height": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")) }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "breakpoint_id": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "breakpoint_id": z.any().refine((value) => value !== void 0, "Required"), "state_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Rectangular rule applied to buyer artwork. State and breakpoint selectors are optional so the same shape can constrain a coordinated-placement component or a specific stateful-display canvas.")).describe("Artwork constraints applied to this component, including safe areas and seller-reserved regions.").optional(), "format_option_ref": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
|
|
2877
2877
|
const schemas = [z.object({ "scope": z.literal("publisher").describe("Reference resolves against the named publisher's adagents.json top-level `formats[]` catalog."), "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Publisher domain where the adagents.json declaring this format option is hosted."), "format_option_id": z.string().describe("Stable format option ID from the publisher's adagents.json top-level `formats[]`, matching a publisher-catalog-backed entry in the target product's `format_options[]`.") }).catchall(z.any()).describe("Selects a publisher-catalog-backed product format option by publisher domain and format option ID."), z.object({ "scope": z.literal("product").describe("Reference resolves only against the target product's inline `format_options[]`."), "format_option_id": z.string().describe("Stable format option ID from the target product's inline `format_options[]`."), "publisher_domain": z.never().optional() }).catchall(z.any()).describe('Selects a product-local format option by ID within the enclosing package/product context. This branch deliberately forbids `publisher_domain` (`publisher_domain: false` in the schema) because product-local references are namespaced by the enclosing product only; include `scope: "publisher"` when the selector must cross into a publisher catalog.')];
|
|
2878
2878
|
const { errors, failed } = schemas.reduce(
|
|
2879
2879
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
@@ -2898,7 +2898,7 @@ const CanonicalFormatCoordinatedPlacementsSchema = /* @__PURE__ */ (() => z.obje
|
|
|
2898
2898
|
message: "Invalid input: Should pass single schema. Passed " + passed
|
|
2899
2899
|
});
|
|
2900
2900
|
}
|
|
2901
|
-
})).describe("Reference to a sibling `format_options[]` entry on the same product. It MUST NOT resolve to `custom` or `coordinated_placements`.").optional(), "format_kind": z.string().optional(), "params": z.record(z.string(), z.any()).optional() }).catchall(z.any()).and(z.union([z.object({ "format_option_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "format_kind": z.any().refine((value) => value !== void 0, "Required"), "params": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]))).min(2).superRefine((components, ctx) => {
|
|
2901
|
+
})).describe("Reference to a sibling `format_options[]` entry on the same product. It MUST NOT resolve to `custom` or `coordinated_placements`.").optional(), "format_kind": z.string().optional(), "params": z.record(z.string(), z.any()).optional() }).catchall(z.any()).and(z.union([z.object({ "format_option_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "format_kind": z.any().refine((value) => value !== void 0, "Required"), "params": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives."))).min(2).superRefine((components, ctx) => {
|
|
2902
2902
|
if (!components.some((component) => component.required === true)) {
|
|
2903
2903
|
ctx.addIssue({ code: "custom", path: [], message: "At least one component must be required" });
|
|
2904
2904
|
}
|
|
@@ -3025,7 +3025,7 @@ const SignalIDSchema = /* @__PURE__ */ (() => z.union([z.object({
|
|
|
3025
3025
|
agent_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"),
|
|
3026
3026
|
id: z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$"))
|
|
3027
3027
|
}).passthrough()]))();
|
|
3028
|
-
const SignalListingSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
|
|
3028
|
+
const SignalListingSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
|
|
3029
3029
|
signal_ref: SignalRefSchema.optional(),
|
|
3030
3030
|
signal_id: SignalIDSchema.optional(),
|
|
3031
3031
|
name: z.string().optional(),
|
|
@@ -3040,7 +3040,7 @@ const SignalListingSchema = /* @__PURE__ */ (() => z.object({}).passthrough().me
|
|
|
3040
3040
|
}).passthrough().optional(),
|
|
3041
3041
|
restricted_attributes: z.array(RestrictedAttributeSchema).optional(),
|
|
3042
3042
|
demographic_predicate: DemographicPredicateSchema.optional()
|
|
3043
|
-
}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
|
|
3043
|
+
}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
|
|
3044
3044
|
signal_ref: SignalRefSchema.optional(),
|
|
3045
3045
|
signal_id: SignalIDSchema.optional(),
|
|
3046
3046
|
name: z.string().optional(),
|
|
@@ -3055,7 +3055,7 @@ const SignalListingSchema = /* @__PURE__ */ (() => z.object({}).passthrough().me
|
|
|
3055
3055
|
}).passthrough().optional(),
|
|
3056
3056
|
restricted_attributes: z.array(RestrictedAttributeSchema).optional(),
|
|
3057
3057
|
demographic_predicate: DemographicPredicateSchema.optional()
|
|
3058
|
-
}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
|
|
3058
|
+
}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
|
|
3059
3059
|
signal_ref: SignalRefSchema.optional(),
|
|
3060
3060
|
signal_id: SignalIDSchema.optional(),
|
|
3061
3061
|
name: z.string().optional(),
|
|
@@ -5088,7 +5088,7 @@ const VASTAssetSchema = /* @__PURE__ */ (() => z.object({
|
|
|
5088
5088
|
field: z.literal("content").optional()
|
|
5089
5089
|
}).passthrough().optional()
|
|
5090
5090
|
}).passthrough()).optional()
|
|
5091
|
-
}).passthrough()])))();
|
|
5091
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
5092
5092
|
const AdCPAssetGroupVocabularyRegistrySchema = /* @__PURE__ */ (() => z.object({}).passthrough())();
|
|
5093
5093
|
const AttestationIssuerSchema = /* @__PURE__ */ (() => z.union([AttestationBrandIssuerSchema, AttestationAgentIssuerSchema, AttestationOriginIssuerSchema]))();
|
|
5094
5094
|
const AudienceEvidenceRequirementsSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({
|
|
@@ -5155,7 +5155,7 @@ const BrandResponseAuthorizationResultSchema = /* @__PURE__ */ (() => z.object({
|
|
|
5155
5155
|
reason: z.union([z.literal("brand_json_unavailable"), z.literal("agent_not_authorized"), z.literal("agent_authorization_ambiguous"), z.literal("jwks_unavailable"), z.literal("kid_not_authorized"), z.literal("kid_authorization_ambiguous"), z.literal("key_material_mismatch"), z.literal("key_purpose_invalid")]),
|
|
5156
5156
|
kid: z.string().min(1).optional(),
|
|
5157
5157
|
jwks_uri: z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(/^https:\/\//).optional()
|
|
5158
|
-
}).passthrough()])))();
|
|
5158
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
5159
5159
|
const BudgetRangeSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({
|
|
5160
5160
|
min: z.number().gte(0).optional(),
|
|
5161
5161
|
max: z.number().gte(0).optional(),
|
|
@@ -5268,7 +5268,7 @@ const CatchmentSchema = /* @__PURE__ */ (() => z.object({
|
|
|
5268
5268
|
coordinates: z.array(z.unknown())
|
|
5269
5269
|
}).passthrough(),
|
|
5270
5270
|
ext: ExtensionObjectSchema.optional()
|
|
5271
|
-
}).passthrough()])))();
|
|
5271
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
5272
5272
|
const CollectionDistributionSchema = /* @__PURE__ */ (() => z.object({
|
|
5273
5273
|
publisher_domain: z.string(),
|
|
5274
5274
|
property_ids: z.array(PropertyIDSchema).optional(),
|
|
@@ -6670,7 +6670,7 @@ const AttestationReferenceSchema = /* @__PURE__ */ (() => z.object({
|
|
|
6670
6670
|
agent_url: z.string().regex(new RegExp("^https://[^/?#@]+(?:/[^?#]*)?(?:\\?[^#]*)?$")).refine(adcpJsonSchemaUri, "Invalid URI")
|
|
6671
6671
|
}).passthrough().optional(),
|
|
6672
6672
|
ext: ExtensionObjectSchema.optional()
|
|
6673
|
-
}).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
|
|
6673
|
+
}).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
|
|
6674
6674
|
issuer: AttestationIssuerSchema,
|
|
6675
6675
|
claim_type: z.string().refine(adcpJsonSchemaUri, "Invalid URI"),
|
|
6676
6676
|
subject: AttestationSubjectSchema,
|
|
@@ -8091,25 +8091,25 @@ const FrequencyCapIntervalConstraintsSchema = /* @__PURE__ */ (() => z.object({
|
|
|
8091
8091
|
maximum_interval: z.number().optional(),
|
|
8092
8092
|
allowed_intervals: z.array(z.number()).optional(),
|
|
8093
8093
|
ext: ExtensionObjectSchema.optional()
|
|
8094
|
-
}).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
|
|
8094
|
+
}).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
|
|
8095
8095
|
unit: FrequencyCapDurationUnitSchema,
|
|
8096
8096
|
minimum_interval: z.number().optional(),
|
|
8097
8097
|
maximum_interval: z.number().optional(),
|
|
8098
8098
|
allowed_intervals: z.array(z.number()).optional(),
|
|
8099
8099
|
ext: ExtensionObjectSchema.optional()
|
|
8100
|
-
}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
|
|
8100
|
+
}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
|
|
8101
8101
|
unit: FrequencyCapDurationUnitSchema,
|
|
8102
8102
|
minimum_interval: z.number().optional(),
|
|
8103
8103
|
maximum_interval: z.number().optional(),
|
|
8104
8104
|
allowed_intervals: z.array(z.number()).optional(),
|
|
8105
8105
|
ext: ExtensionObjectSchema.optional()
|
|
8106
|
-
}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
|
|
8106
|
+
}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
|
|
8107
8107
|
unit: FrequencyCapDurationUnitSchema,
|
|
8108
8108
|
minimum_interval: z.number().optional(),
|
|
8109
8109
|
maximum_interval: z.number().optional(),
|
|
8110
8110
|
allowed_intervals: z.array(z.number()).optional(),
|
|
8111
8111
|
ext: ExtensionObjectSchema.optional()
|
|
8112
|
-
}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])))();
|
|
8112
|
+
}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
8113
8113
|
const FrequencyCapConstraintsSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({
|
|
8114
8114
|
mutable_fields: z.array(FrequencyCapMutableFieldSchema).optional(),
|
|
8115
8115
|
supported_control_modes: z.array(FrequencyCapControlModeSchema).optional(),
|
|
@@ -8531,7 +8531,7 @@ const GetMediaBuysRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
|
8531
8531
|
}).passthrough())();
|
|
8532
8532
|
const ScopedCreativeApprovalSchema = /* @__PURE__ */ (() => z.object({
|
|
8533
8533
|
scope: IndicatorScopeSchema,
|
|
8534
|
-
approval_status: CreativeApprovalStatusSchema.and(z.union([z.literal("pending_review"), z.literal("approved"), z.literal("rejected")])),
|
|
8534
|
+
approval_status: CreativeApprovalStatusSchema.and(z.union([z.literal("pending_review"), z.literal("approved"), z.literal("rejected")]).describe("Must also satisfy at least one of these alternatives.")),
|
|
8535
8535
|
rejection_reason: z.string().optional()
|
|
8536
8536
|
}).passthrough())();
|
|
8537
8537
|
const GetMediaBuyDeliveryRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
@@ -9182,7 +9182,7 @@ const EvaluatorSpecSchema = /* @__PURE__ */ (() => z.object({
|
|
|
9182
9182
|
evaluator_id: z.string()
|
|
9183
9183
|
}).passthrough(), z.object({
|
|
9184
9184
|
agent_url: z.string().regex(new RegExp("^https://")).refine(adcpJsonSchemaUri, "Invalid URI")
|
|
9185
|
-
}).passthrough()])))();
|
|
9185
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
9186
9186
|
const RightsConstraintSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({
|
|
9187
9187
|
rights_id: z.string(),
|
|
9188
9188
|
rights_agent: z.object({
|
|
@@ -10116,7 +10116,7 @@ const CreateContentStandardsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10116
10116
|
conflicting_standards_id: z.string().optional(),
|
|
10117
10117
|
context: ContextObjectSchema.optional(),
|
|
10118
10118
|
ext: ExtensionObjectSchema.optional()
|
|
10119
|
-
}).passthrough()])))();
|
|
10119
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
10120
10120
|
const UpdateContentStandardsRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
10121
10121
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
10122
10122
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
@@ -10198,7 +10198,7 @@ const CalibrateContentResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10198
10198
|
errors: z.array(ErrorSchema),
|
|
10199
10199
|
context: ContextObjectSchema.optional(),
|
|
10200
10200
|
ext: ExtensionObjectSchema.optional()
|
|
10201
|
-
}).passthrough()])))();
|
|
10201
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
10202
10202
|
const ValidateContentDeliveryRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
10203
10203
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
10204
10204
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
@@ -10257,7 +10257,7 @@ const ValidateContentDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10257
10257
|
errors: z.array(ErrorSchema),
|
|
10258
10258
|
context: ContextObjectSchema.optional(),
|
|
10259
10259
|
ext: ExtensionObjectSchema.optional()
|
|
10260
|
-
}).passthrough()])))();
|
|
10260
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
10261
10261
|
const GetMediaBuyArtifactsRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
10262
10262
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
10263
10263
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
@@ -10318,7 +10318,7 @@ const GetMediaBuyArtifactsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
10318
10318
|
errors: z.array(ErrorSchema),
|
|
10319
10319
|
context: ContextObjectSchema.optional(),
|
|
10320
10320
|
ext: ExtensionObjectSchema.optional()
|
|
10321
|
-
}).passthrough()])))();
|
|
10321
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
10322
10322
|
const GetCreativeFeaturesSuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
10323
10323
|
evaluation_id: z.string().min(1).optional(),
|
|
10324
10324
|
results: z.array(CreativeFeatureResultSchema),
|
|
@@ -11422,7 +11422,7 @@ const ListAccountChangesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11422
11422
|
context: ContextObjectSchema.optional(),
|
|
11423
11423
|
ext: ExtensionObjectSchema.optional(),
|
|
11424
11424
|
status: z.literal("failed")
|
|
11425
|
-
}).passthrough()])))();
|
|
11425
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
11426
11426
|
const ListAccountsRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
11427
11427
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
11428
11428
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
@@ -11768,7 +11768,7 @@ const BudgetChangeConstraintsSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11768
11768
|
min_result_amount: MoneySchema
|
|
11769
11769
|
}).passthrough(), z.object({
|
|
11770
11770
|
max_result_amount: MoneySchema
|
|
11771
|
-
}).passthrough()])))();
|
|
11771
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
11772
11772
|
const MediaBuyChangeTermConstraintsSchema = /* @__PURE__ */ (() => z.union([BudgetChangeConstraintsSchema, FlightChangeConstraintsSchema, PackageCountConstraintsSchema, EffectiveTimingConstraintsSchema]))();
|
|
11773
11773
|
const ReportingFileTransferSchema = /* @__PURE__ */ (() => z.object({
|
|
11774
11774
|
pattern: z.literal("file_transfer"),
|
|
@@ -11786,7 +11786,7 @@ const DisplayTagAssetSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11786
11786
|
asset_type: z.literal("display_tag"),
|
|
11787
11787
|
macro_declarations: z.array(MacroDeclarationSchema).optional(),
|
|
11788
11788
|
provenance: ProvenanceSchema.optional()
|
|
11789
|
-
}).passthrough().and(z.union([TagURLSchema, InlineMarkupSchema, PairedRedirectSchema])))();
|
|
11789
|
+
}).passthrough().and(z.union([TagURLSchema, InlineMarkupSchema, PairedRedirectSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
11790
11790
|
const DAASTAssetSchema = /* @__PURE__ */ (() => z.object({
|
|
11791
11791
|
asset_type: z.literal("daast"),
|
|
11792
11792
|
daast_version: DAASTVersionSchema.optional(),
|
|
@@ -11812,7 +11812,7 @@ const DAASTAssetSchema = /* @__PURE__ */ (() => z.object({
|
|
|
11812
11812
|
field: z.literal("content").optional()
|
|
11813
11813
|
}).passthrough().optional()
|
|
11814
11814
|
}).passthrough()).optional()
|
|
11815
|
-
}).passthrough()])))();
|
|
11815
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
11816
11816
|
const CardAssetSchema = /* @__PURE__ */ (() => z.object({
|
|
11817
11817
|
asset_type: z.literal("card"),
|
|
11818
11818
|
media: z.union([ImageAssetSchema, VideoAssetSchema]),
|
|
@@ -11907,8 +11907,8 @@ const ProductFormatDeclarationSchema = /* @__PURE__ */ (() => z.object({}).passt
|
|
|
11907
11907
|
format_shape: z.string().optional(),
|
|
11908
11908
|
v1_format_ref: z.array(FormatReferenceStructuredObjectSchema).optional(),
|
|
11909
11909
|
format_schema: PlatformExtensionReferenceSchema.optional()
|
|
11910
|
-
}).passthrough()).and(z.union([ImageFormatDeclarationSchema, HTML5FormatDeclarationSchema, DisplayTagFormatDeclarationSchema, ImageCarouselFormatDeclarationSchema, HostedVideoFormatDeclarationSchema, VASTVideoFormatDeclarationSchema, HostedAudioFormatDeclarationSchema, VASTAudioFormatDeclarationSchema, DAASTAudioFormatDeclarationSchema, SponsoredPlacementFormatDeclarationSchema, NativeInFeedFormatDeclarationSchema, ResponsiveCreativeFormatDeclarationSchema, AgentPlacementFormatDeclarationSchema, SellerRenderedStatefulDisplayFormatDeclarationSchema, CoordinatedPlacementsFormatDeclarationSchema, CustomFormatDeclarationSchema])))();
|
|
11911
|
-
const PlacementSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({}).passthrough()).merge(z.object({}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
|
|
11910
|
+
}).passthrough()).describe("Common constraints for every product format.").and(z.union([ImageFormatDeclarationSchema, HTML5FormatDeclarationSchema, DisplayTagFormatDeclarationSchema, ImageCarouselFormatDeclarationSchema, HostedVideoFormatDeclarationSchema, VASTVideoFormatDeclarationSchema, HostedAudioFormatDeclarationSchema, VASTAudioFormatDeclarationSchema, DAASTAudioFormatDeclarationSchema, SponsoredPlacementFormatDeclarationSchema, NativeInFeedFormatDeclarationSchema, ResponsiveCreativeFormatDeclarationSchema, AgentPlacementFormatDeclarationSchema, SellerRenderedStatefulDisplayFormatDeclarationSchema, CoordinatedPlacementsFormatDeclarationSchema, CustomFormatDeclarationSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
11911
|
+
const PlacementSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({}).passthrough()).merge(z.object({}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
|
|
11912
11912
|
kind: z.union([z.literal("publisher_ref"), z.literal("seller_inline")]),
|
|
11913
11913
|
placement_id: z.string(),
|
|
11914
11914
|
publisher_domain: z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).optional(),
|
|
@@ -12087,7 +12087,7 @@ const GetCreativeFeaturesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
12087
12087
|
payload: z.object({}).passthrough().optional(),
|
|
12088
12088
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
12089
12089
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
12090
|
-
}).passthrough().and(z.union([GetCreativeFeaturesSuccessSchema, GetCreativeFeaturesErrorSchema, GetCreativeFeaturesSubmittedSchema])))();
|
|
12090
|
+
}).passthrough().and(z.union([GetCreativeFeaturesSuccessSchema, GetCreativeFeaturesErrorSchema, GetCreativeFeaturesSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
12091
12091
|
const SyncCatalogsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
12092
12092
|
context_id: z.string().optional(),
|
|
12093
12093
|
context: ContextObjectSchema.optional(),
|
|
@@ -12102,7 +12102,7 @@ const SyncCatalogsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
12102
12102
|
payload: z.object({}).passthrough().optional(),
|
|
12103
12103
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
12104
12104
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
12105
|
-
}).passthrough().and(z.union([SyncCatalogsSuccessSchema, SyncCatalogsErrorSchema, SyncCatalogsSubmittedSchema])))();
|
|
12105
|
+
}).passthrough().and(z.union([SyncCatalogsSuccessSchema, SyncCatalogsErrorSchema, SyncCatalogsSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
12106
12106
|
const ProductSchema = /* @__PURE__ */ (() => z.object({
|
|
12107
12107
|
product_id: z.string(),
|
|
12108
12108
|
name: z.string(),
|
|
@@ -12281,7 +12281,7 @@ const CanonicalProductPlacementSchema = /* @__PURE__ */ (() => z.object({
|
|
|
12281
12281
|
kind: z.literal("publisher_ref")
|
|
12282
12282
|
}).passthrough(), z.object({
|
|
12283
12283
|
kind: z.literal("seller_inline")
|
|
12284
|
-
}).passthrough()])))();
|
|
12284
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
12285
12285
|
const TargetingOverlaySupport1Schema = /* @__PURE__ */ (() => TargetingOverlaySupportSchema)();
|
|
12286
12286
|
const CanonicalProductActionSchema = /* @__PURE__ */ (() => z.object({
|
|
12287
12287
|
action: CanonicalMediaBuyActionNameSchema,
|
|
@@ -12293,7 +12293,7 @@ const CanonicalProductActionSchema = /* @__PURE__ */ (() => z.object({
|
|
|
12293
12293
|
}).passthrough())();
|
|
12294
12294
|
const AssetVariantSchema = /* @__PURE__ */ (() => z.union([ImageAssetSchema, VideoAssetSchema, AudioAssetSchema, VASTAssetSchema, DisplayTagAssetSchema, TextAssetSchema, URLAssetSchema, HTMLAssetSchema, JavaScriptAssetSchema, ZipAssetSchema, WebhookAssetSchema, CSSAssetSchema, DAASTAssetSchema, MarkdownAssetSchema, BriefAssetSchema, CatalogAssetSchema, PublishedPostAssetSchema, CardAssetSchema, PixelTrackerAssetSchema, VASTTrackerAssetSchema, DAASTTrackerAssetSchema]))();
|
|
12295
12295
|
const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
|
|
12296
|
-
const objectSchema = z.object({ "geo_countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_countries_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Exclude specific countries from delivery. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_regions": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Restrict delivery to exact canonical ISO 3166-2 subdivisions (states, provinces, regions, departments, or other subdivision categories). Unknown identifiers are invalid. At create or update, sellers MUST reject unsupported identifiers and MUST NOT silently widen, drop, or partially apply the list. During get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome. Exact internal translation preserves accepted identifiers in package readback.").optional(), "geo_regions_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Exclude exact canonical ISO 3166-2 subdivisions. Support is independent from geo_regions inclusion support. Unknown identifiers and values also present in geo_regions are invalid. At create or update, sellers MUST reject unsupported identifiers and partial application; during get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome.").optional(), "geo_metros": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict().describe("A targeted metro area.")).min(1).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_metros_exclude": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes to exclude within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict()).min(1).describe("Exclude specific metro areas from delivery. Each entry specifies the classification system and excluded values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })])).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Restrict delivery to specific postal areas. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas_exclude": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })])).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Exclude specific postal areas from delivery. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_places": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))])).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Restrict delivery to catalog-backed named places. Values MUST be stable identifiers in the declared system, not display names. Sellers must declare supported systems, countries, and place types in get_adcp_capabilities and reject unsupported entries rather than silently dropping them.").optional(), "geo_places_exclude": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))])).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Exclude catalog-backed named places. Uses the same identifier-based shape as geo_places. Sellers MUST reject overlap with geo_places for the same country, system, place_type, and value.").optional(), "daypart_targets": z.array(z.object({ "days": z.array(z.enum(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]).describe("Days of the week for daypart targeting")).min(1).describe("Days of week this window applies to. Use multiple days for compact targeting (e.g., monday-friday in one object)."), "start_hour": z.number().int().gte(0).lte(23).describe("Start hour (inclusive), 0-23 in 24-hour format. 0 = midnight, 6 = 6:00am, 18 = 6:00pm."), "end_hour": z.number().int().gte(1).lte(24).describe("End hour (exclusive), 1-24 in 24-hour format. 10 = 10:00am, 24 = midnight. Must be greater than start_hour."), "timezone": z.union([z.literal("inventory_local"), z.any().refine((value) => !z.literal("inventory_local").safeParse(value).success, "Invalid input: Should NOT be valid against schema").describe("Concrete timezone identifier in the implementation's supported IANA Time Zone Database, such as America/New_York, CET, or UTC.")]).describe("Civil-time clock used to evaluate this window. 'inventory_local' evaluates the hours in the seller-assigned local timezone of each inventory unit that can deliver the impression, such as a screen, venue, station, or publisher property; it never means the buyer, account, or server timezone. A concrete IANA timezone identifier (for example, 'America/New_York', 'CET', or 'UTC') evaluates one shared civil-time clock across the targeted inventory. Omission defaults to 'inventory_local'. Buyers that begin with a user or account preference MUST resolve it to a concrete IANA identifier before sending the daypart; 'user_timezone' and 'account_timezone' are not wire values. For each candidate delivery instant, convert the instant into this clock and compare its resulting local day and hour with the half-open window: a skipped DST hour has no matching instants, while both occurrences of a repeated hour match. This delivery clock is independent of reporting_capabilities.timezone.").default("inventory_local"), "label": z.string().describe("Optional human-readable name for this time window (e.g., 'Morning Drive', 'Prime Time')").optional() }).strict().describe("A time window for daypart targeting. Specifies days of week, an hour range, and the civil-time clock used to evaluate it. start_hour is inclusive, end_hour is exclusive (e.g., 6-10 = 6:00am to 10:00am). Follows the Google Ads AdScheduleInfo / DV360 DayPartTargeting pattern.")).min(1).describe("Restrict delivery to specific time windows. Each entry specifies days of week, an hour range, and an optional timezone that defaults to inventory_local. A concrete IANA zone uses one shared civil-time clock, while inventory_local evaluates each inventory unit in its seller-assigned local timezone. Entries are independent and MAY use different clocks.").optional(), "axe_include_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to include for targeting.").optional(), "axe_exclude_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to exclude from targeting.").optional(), "audience_include": z.array(z.string()).min(1).describe("Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities.").optional(), "audience_exclude": z.array(z.string()).min(1).describe("Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities.").optional(), "signal_targeting_groups": z.object({ "operator": z.literal("all").describe("Groups-level operator. Required even though v1 only supports 'all': every child group must be satisfied."), "groups": z.array(z.object({ "operator": z.enum(["any", "none"]).describe("How to evaluate the signals in this group. 'any' is an OR include group. 'none' is an exclusion group equivalent to NOT (A OR B OR C)."), "signals": z.array(z.object({ "pricing_option_id": z.string().describe("Pricing option selected for this signal. Use the pricing_option_id from the product's signal_targeting_options entry when product-scoped pricing is present; otherwise use the seller get_signals pricing only when the product option does not override it. Required when the selected signal has pricing_options; omit only when the signal is bundled into the product price or has no incremental cost.").optional(), "signal_agent_segment_id": z.string().describe("Optional opaque resolved-segment or seller execution handle for this signal. Omit when signal_ref plus the value expression is sufficient for the seller to resolve the signal. Include when the product option exposes a separate runtime or activation handle, and pass it verbatim. Buyers SHOULD prefer an exposed segment handle over reconstructing condition identity from categorical values because the handle can carry provider namespace and methodology distinctions.").optional(), "activation_key": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
|
|
12296
|
+
const objectSchema = z.object({ "geo_countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_countries_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Exclude specific countries from delivery. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_regions": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Restrict delivery to exact canonical ISO 3166-2 subdivisions (states, provinces, regions, departments, or other subdivision categories). Unknown identifiers are invalid. At create or update, sellers MUST reject unsupported identifiers and MUST NOT silently widen, drop, or partially apply the list. During get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome. Exact internal translation preserves accepted identifiers in package readback.").optional(), "geo_regions_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Exclude exact canonical ISO 3166-2 subdivisions. Support is independent from geo_regions inclusion support. Unknown identifiers and values also present in geo_regions are invalid. At create or update, sellers MUST reject unsupported identifiers and partial application; during get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome.").optional(), "geo_metros": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict().describe("A targeted metro area.")).min(1).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_metros_exclude": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes to exclude within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict()).min(1).describe("Exclude specific metro areas from delivery. Each entry specifies the classification system and excluded values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })]).describe("Must also satisfy at least one of these alternatives.")).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Restrict delivery to specific postal areas. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas_exclude": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })]).describe("Must also satisfy at least one of these alternatives.")).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Exclude specific postal areas from delivery. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_places": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Restrict delivery to catalog-backed named places. Values MUST be stable identifiers in the declared system, not display names. Sellers must declare supported systems, countries, and place types in get_adcp_capabilities and reject unsupported entries rather than silently dropping them.").optional(), "geo_places_exclude": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Exclude catalog-backed named places. Uses the same identifier-based shape as geo_places. Sellers MUST reject overlap with geo_places for the same country, system, place_type, and value.").optional(), "daypart_targets": z.array(z.object({ "days": z.array(z.enum(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]).describe("Days of the week for daypart targeting")).min(1).describe("Days of week this window applies to. Use multiple days for compact targeting (e.g., monday-friday in one object)."), "start_hour": z.number().int().gte(0).lte(23).describe("Start hour (inclusive), 0-23 in 24-hour format. 0 = midnight, 6 = 6:00am, 18 = 6:00pm."), "end_hour": z.number().int().gte(1).lte(24).describe("End hour (exclusive), 1-24 in 24-hour format. 10 = 10:00am, 24 = midnight. Must be greater than start_hour."), "timezone": z.union([z.literal("inventory_local"), z.any().refine((value) => !z.literal("inventory_local").safeParse(value).success, "Invalid input: Should NOT be valid against schema").describe("Concrete timezone identifier in the implementation's supported IANA Time Zone Database, such as America/New_York, CET, or UTC.")]).describe("Civil-time clock used to evaluate this window. 'inventory_local' evaluates the hours in the seller-assigned local timezone of each inventory unit that can deliver the impression, such as a screen, venue, station, or publisher property; it never means the buyer, account, or server timezone. A concrete IANA timezone identifier (for example, 'America/New_York', 'CET', or 'UTC') evaluates one shared civil-time clock across the targeted inventory. Omission defaults to 'inventory_local'. Buyers that begin with a user or account preference MUST resolve it to a concrete IANA identifier before sending the daypart; 'user_timezone' and 'account_timezone' are not wire values. For each candidate delivery instant, convert the instant into this clock and compare its resulting local day and hour with the half-open window: a skipped DST hour has no matching instants, while both occurrences of a repeated hour match. This delivery clock is independent of reporting_capabilities.timezone.").default("inventory_local"), "label": z.string().describe("Optional human-readable name for this time window (e.g., 'Morning Drive', 'Prime Time')").optional() }).strict().describe("A time window for daypart targeting. Specifies days of week, an hour range, and the civil-time clock used to evaluate it. start_hour is inclusive, end_hour is exclusive (e.g., 6-10 = 6:00am to 10:00am). Follows the Google Ads AdScheduleInfo / DV360 DayPartTargeting pattern.")).min(1).describe("Restrict delivery to specific time windows. Each entry specifies days of week, an hour range, and an optional timezone that defaults to inventory_local. A concrete IANA zone uses one shared civil-time clock, while inventory_local evaluates each inventory unit in its seller-assigned local timezone. Entries are independent and MAY use different clocks.").optional(), "axe_include_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to include for targeting.").optional(), "axe_exclude_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to exclude from targeting.").optional(), "audience_include": z.array(z.string()).min(1).describe("Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities.").optional(), "audience_exclude": z.array(z.string()).min(1).describe("Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities.").optional(), "signal_targeting_groups": z.object({ "operator": z.literal("all").describe("Groups-level operator. Required even though v1 only supports 'all': every child group must be satisfied."), "groups": z.array(z.object({ "operator": z.enum(["any", "none"]).describe("How to evaluate the signals in this group. 'any' is an OR include group. 'none' is an exclusion group equivalent to NOT (A OR B OR C)."), "signals": z.array(z.object({ "pricing_option_id": z.string().describe("Pricing option selected for this signal. Use the pricing_option_id from the product's signal_targeting_options entry when product-scoped pricing is present; otherwise use the seller get_signals pricing only when the product option does not override it. Required when the selected signal has pricing_options; omit only when the signal is bundled into the product price or has no incremental cost.").optional(), "signal_agent_segment_id": z.string().describe("Optional opaque resolved-segment or seller execution handle for this signal. Omit when signal_ref plus the value expression is sufficient for the seller to resolve the signal. Include when the product option exposes a separate runtime or activation handle, and pass it verbatim. Buyers SHOULD prefer an exposed segment handle over reconstructing condition identity from categorical values because the handle can carry provider namespace and methodology distinctions.").optional(), "activation_key": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
|
|
12297
12297
|
const schemas = [z.object({ "type": z.literal("segment_id").describe("Segment ID based targeting"), "segment_id": z.string().describe("The platform-specific segment identifier to use in campaign targeting") }).catchall(z.any()), z.object({ "type": z.literal("key_value").describe("Key-value pair based targeting"), "key": z.string().describe("The targeting parameter key"), "value": z.string().describe("The targeting parameter value") }).catchall(z.any())];
|
|
12298
12298
|
const { errors, failed } = schemas.reduce(
|
|
12299
12299
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
@@ -12394,7 +12394,7 @@ const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
|
|
|
12394
12394
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
12395
12395
|
});
|
|
12396
12396
|
}
|
|
12397
|
-
}).describe("Named signal being targeted."), "value_type": z.literal("numeric").describe("Discriminator for numeric signals."), "min_value": z.number().describe("Minimum value, inclusive. Omit for no minimum. Should be within the signal definition's range when declared.").optional(), "max_value": z.number().describe("Maximum value, inclusive. Omit for no maximum. Should be within the signal definition's range when declared.").optional() }).catchall(z.any()).and(z.union([z.object({ "min_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Numeric signal expression - target users within a value range. At least one of min_value or max_value is required. If both min_value and max_value are provided, min_value MUST be <= max_value.")];
|
|
12397
|
+
}).describe("Named signal being targeted."), "value_type": z.literal("numeric").describe("Discriminator for numeric signals."), "min_value": z.number().describe("Minimum value, inclusive. Omit for no minimum. Should be within the signal definition's range when declared.").optional(), "max_value": z.number().describe("Maximum value, inclusive. Omit for no maximum. Should be within the signal definition's range when declared.").optional() }).catchall(z.any()).and(z.union([z.object({ "min_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Numeric signal expression - target users within a value range. At least one of min_value or max_value is required. If both min_value and max_value are provided, min_value MUST be <= max_value.")];
|
|
12398
12398
|
const { errors, failed } = schemas.reduce(
|
|
12399
12399
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
12400
12400
|
errors: [...errors2, ...result.error.issues],
|
|
@@ -12469,7 +12469,7 @@ const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
|
|
|
12469
12469
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
12470
12470
|
});
|
|
12471
12471
|
}
|
|
12472
|
-
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("binary").describe("Discriminator for binary signals"), "value": z.boolean().describe("Whether to include (true) or exclude (false) users matching this signal") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Binary signal targeting - user either matches or doesn't"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
|
|
12472
|
+
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("binary").describe("Discriminator for binary signals"), "value": z.boolean().describe("Whether to include (true) or exclude (false) users matching this signal") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Binary signal targeting - user either matches or doesn't"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
|
|
12473
12473
|
const schemas2 = [z.object({ "scope": z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Product-local signal identifier. For local signals exposed on both get_signals and get_products, this MUST match get_signals.signals[].signal_ref.signal_id for the same signal.") }).catchall(z.any()).describe("Product-scoped signal. The signal_id is meaningful only within the selected product/package context and MUST match a Product.included_signals[].signal_ref.signal_id or Product.signal_targeting_options[].signal_ref.signal_id for that product, depending on whether the signal is descriptive or selectable."), z.object({ "scope": z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that publishes the signal definition in its adagents.json signals[]."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(z.any()).describe("Data-provider-scoped signal. The signal_id resolves through the data provider's published adagents.json signals[] and can be authorization-verified there."), z.object({ "scope": z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(z.any()).describe("Signal-source-scoped signal. Use this for source-native signals that are not published in upstream adagents.json signals[]. The buyer trusts the issuing signal source for this identity; use scope 'data_provider' instead when the signal is published in adagents.json signals[], even if the publisher is also the seller or signal source.")];
|
|
12474
12474
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
12475
12475
|
({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
|
|
@@ -12519,7 +12519,7 @@ const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
|
|
|
12519
12519
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
12520
12520
|
});
|
|
12521
12521
|
}
|
|
12522
|
-
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("categorical").describe("Discriminator for categorical signals"), "values": z.array(z.string()).min(1).describe("Values to target. Users with any of these values will be included.") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Categorical signal targeting - target users with specific values"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
|
|
12522
|
+
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("categorical").describe("Discriminator for categorical signals"), "values": z.array(z.string()).min(1).describe("Values to target. Users with any of these values will be included.") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Categorical signal targeting - target users with specific values"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
|
|
12523
12523
|
const schemas2 = [z.object({ "scope": z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Product-local signal identifier. For local signals exposed on both get_signals and get_products, this MUST match get_signals.signals[].signal_ref.signal_id for the same signal.") }).catchall(z.any()).describe("Product-scoped signal. The signal_id is meaningful only within the selected product/package context and MUST match a Product.included_signals[].signal_ref.signal_id or Product.signal_targeting_options[].signal_ref.signal_id for that product, depending on whether the signal is descriptive or selectable."), z.object({ "scope": z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that publishes the signal definition in its adagents.json signals[]."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(z.any()).describe("Data-provider-scoped signal. The signal_id resolves through the data provider's published adagents.json signals[] and can be authorization-verified there."), z.object({ "scope": z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(z.any()).describe("Signal-source-scoped signal. Use this for source-native signals that are not published in upstream adagents.json signals[]. The buyer trusts the issuing signal source for this identity; use scope 'data_provider' instead when the signal is published in adagents.json signals[], even if the publisher is also the seller or signal source.")];
|
|
12524
12524
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
12525
12525
|
({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
|
|
@@ -12569,7 +12569,7 @@ const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
|
|
|
12569
12569
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
12570
12570
|
});
|
|
12571
12571
|
}
|
|
12572
|
-
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("numeric").describe("Discriminator for numeric signals"), "min_value": z.number().describe("Minimum value (inclusive). Omit for no minimum. Must be <= max_value when both are provided. Should be >= signal's range.min if defined.").optional(), "max_value": z.number().describe("Maximum value (inclusive). Omit for no maximum. Must be >= min_value when both are provided. Should be <= signal's range.max if defined.").optional() }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Numeric signal targeting - target users within a value range. If min_value is provided, it must be <= max_value. Values should be within the signal's defined range (see signal definition).")];
|
|
12572
|
+
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("numeric").describe("Discriminator for numeric signals"), "min_value": z.number().describe("Minimum value (inclusive). Omit for no minimum. Must be <= max_value when both are provided. Should be >= signal's range.min if defined.").optional(), "max_value": z.number().describe("Maximum value (inclusive). Omit for no maximum. Must be >= min_value when both are provided. Should be <= signal's range.max if defined.").optional() }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Numeric signal targeting - target users within a value range. If min_value is provided, it must be <= max_value. Values should be within the signal's defined range (see signal definition).")];
|
|
12573
12573
|
const { errors, failed } = schemas.reduce(
|
|
12574
12574
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
12575
12575
|
errors: [...errors2, ...result.error.issues],
|
|
@@ -12593,7 +12593,7 @@ const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
|
|
|
12593
12593
|
message: "Invalid input: Should pass single schema. Passed " + passed
|
|
12594
12594
|
});
|
|
12595
12595
|
}
|
|
12596
|
-
}).describe("Targeting constraint for a specific signal. Uses value_type as discriminator to determine the targeting expression format.")).min(1).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.").optional(), "demographics": z.object({ "age": z.intersection(z.object({ "min": z.number().int().gte(0).lte(150).describe("Inclusive minimum age in completed years. Omit for an open lower bound.").optional(), "max": z.number().int().gte(0).lte(150).describe("Inclusive maximum age in completed years. Omit for an open upper bound.").optional(), "include_unknown": z.boolean().describe("Whether delivery to people whose age is unavailable is part of this predicate. This field has no default and MUST be supplied.") }).catchall(z.any()).and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A canonical audience-age predicate in completed integer years. min and max are inclusive; omitting one bound means no restriction in that direction. At least one bound is required. include_unknown is always explicit because people whose age is unavailable are not members of any numeric interval. Implementations MUST reject min greater than max; JSON Schema draft-07 cannot compare sibling numeric values."), z.object({ "accepted_bases": z.array(z.enum(["verified", "declared", "inferred"]).describe("User-level bases that may resolve age for demographic targeting execution. Population estimates are deliberately absent because aggregate composition cannot establish an individual impression's age.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("User-level age determination bases the buyer permits for this predicate. Sellers MUST use only these bases or reject the request; they MUST NOT silently fall back to another basis. When omitted, the buyer imposes no determination-basis constraint beyond product capability and any age_restriction. population_estimate is structurally unavailable because aggregate evidence cannot identify an eligible user.").optional(), "accepted_verification_methods": z.array(z.enum(["facial_age_estimation", "id_document", "digital_id", "credit_card", "world_id"]).describe("Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Verification methods acceptable when verified is an accepted basis. This field narrows verified demographic execution; age_restriction.accepted_methods independently governs legal eligibility and the two sets are intersected when both are present.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "accepted_verification_methods": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "accepted_verification_methods": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "accepted_bases": z.any().refine((value) => !z.array(z.any().refine((value2) => !z.literal("verified").safeParse(value2).success, "Invalid input: Should NOT be valid against schema")).safeParse(value).success, "Invalid input: Should NOT be valid against schema") }))]))) }).catchall(z.any()).describe("Canonical demographic audience targeting intent with optional constraints on how age may be determined. This is distinct from age_restriction: demographics selects an audience, while age_restriction expresses a legal eligibility or verification floor. Fresh create/update targeting MUST compile exactly or be rejected. During get_products, a seller may offer a different configured predicate only through sparse targeting_resolution modifications on a distinguishable product_id; selecting that product accepts the alternative. Sellers never silently broaden, narrow, default, drop, or substitute the basis.").optional(), "frequency_cap": z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2.").optional(), "property_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list for targeting specific properties within this product. The package runs on the intersection of the product's publisher_properties and this list. Sellers SHOULD return a validation error if the product has property_targeting_allowed: false.").optional(), "property_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list whose properties must not carry the buyer's ads. Matched properties are removed from delivery. Use for brand-safety do-not-run lists (apps, sites). Exclude wins on overlap with property_list, and applies regardless of the product's property_targeting_allowed flag. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for including specific collections (programs, publications, channels) within this product. The package runs on the intersection of matched collections and this list. Use for inclusion-based collection targeting. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for excluding specific collections (programs, publications, channels) from this product. Matched collections must not carry the buyer's ads. Use for brand safety do-not-air lists. Seller must declare support in get_adcp_capabilities.").optional(), "placement_selection": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
|
|
12596
|
+
}).describe("Targeting constraint for a specific signal. Uses value_type as discriminator to determine the targeting expression format.")).min(1).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.").optional(), "demographics": z.object({ "age": z.intersection(z.object({ "min": z.number().int().gte(0).lte(150).describe("Inclusive minimum age in completed years. Omit for an open lower bound.").optional(), "max": z.number().int().gte(0).lte(150).describe("Inclusive maximum age in completed years. Omit for an open upper bound.").optional(), "include_unknown": z.boolean().describe("Whether delivery to people whose age is unavailable is part of this predicate. This field has no default and MUST be supplied.") }).catchall(z.any()).and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A canonical audience-age predicate in completed integer years. min and max are inclusive; omitting one bound means no restriction in that direction. At least one bound is required. include_unknown is always explicit because people whose age is unavailable are not members of any numeric interval. Implementations MUST reject min greater than max; JSON Schema draft-07 cannot compare sibling numeric values."), z.object({ "accepted_bases": z.array(z.enum(["verified", "declared", "inferred"]).describe("User-level bases that may resolve age for demographic targeting execution. Population estimates are deliberately absent because aggregate composition cannot establish an individual impression's age.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("User-level age determination bases the buyer permits for this predicate. Sellers MUST use only these bases or reject the request; they MUST NOT silently fall back to another basis. When omitted, the buyer imposes no determination-basis constraint beyond product capability and any age_restriction. population_estimate is structurally unavailable because aggregate evidence cannot identify an eligible user.").optional(), "accepted_verification_methods": z.array(z.enum(["facial_age_estimation", "id_document", "digital_id", "credit_card", "world_id"]).describe("Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Verification methods acceptable when verified is an accepted basis. This field narrows verified demographic execution; age_restriction.accepted_methods independently governs legal eligibility and the two sets are intersected when both are present.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "accepted_verification_methods": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "accepted_verification_methods": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "accepted_bases": z.any().refine((value) => !z.array(z.any().refine((value2) => !z.literal("verified").safeParse(value2).success, "Invalid input: Should NOT be valid against schema")).safeParse(value).success, "Invalid input: Should NOT be valid against schema") }))]).describe("Must also satisfy at least one of these alternatives."))) }).catchall(z.any()).describe("Canonical demographic audience targeting intent with optional constraints on how age may be determined. This is distinct from age_restriction: demographics selects an audience, while age_restriction expresses a legal eligibility or verification floor. Fresh create/update targeting MUST compile exactly or be rejected. During get_products, a seller may offer a different configured predicate only through sparse targeting_resolution modifications on a distinguishable product_id; selecting that product accepts the alternative. Sellers never silently broaden, narrow, default, drop, or substitute the basis.").optional(), "frequency_cap": z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2.").optional(), "property_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list for targeting specific properties within this product. The package runs on the intersection of the product's publisher_properties and this list. Sellers SHOULD return a validation error if the product has property_targeting_allowed: false.").optional(), "property_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list whose properties must not carry the buyer's ads. Matched properties are removed from delivery. Use for brand-safety do-not-run lists (apps, sites). Exclude wins on overlap with property_list, and applies regardless of the product's property_targeting_allowed flag. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for including specific collections (programs, publications, channels) within this product. The package runs on the intersection of matched collections and this list. Use for inclusion-based collection targeting. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for excluding specific collections (programs, publications, channels) from this product. Matched collections must not carry the buyer's ads. Use for brand safety do-not-air lists. Seller must declare support in get_adcp_capabilities.").optional(), "placement_selection": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
|
|
12597
12597
|
const schemas = [z.object({ "mode": z.literal("selected"), "placement_refs": z.array(z.union([z.intersection(z.object({ "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring a publisher-catalog placement is hosted, or the inventory publisher associated with an inline placement. Omitted only for legacy single-publisher product-context references.").optional(), "placement_id": z.string().describe("Placement ID from the publisher's adagents.json placement catalog, or an inline seller-defined placement ID interpreted within the enclosing seller and product context.") }).catchall(z.any()).describe("Legacy-compatible product-context reference to a placement. For publisher-catalog placements, publisher_domain plus placement_id resolves the declaration in that publisher's adagents.json. For seller-inline placements, the enclosing seller and product supply scope. When publisher_domain is omitted on legacy inputs, receivers MAY interpret the ID relative to the enclosing single-publisher product. Use placement-identity.json when a self-contained cross-document identity is required."), z.object({ "publisher_domain": z.any().refine((value) => value !== void 0, "Required") }).passthrough()), z.any().superRefine((x2, ctx2) => {
|
|
12598
12598
|
const schemas2 = [z.object({ "kind": z.literal("publisher_ref"), "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain whose adagents.json declares placement_id."), "placement_id": z.string().min(1) }).strict(), z.object({ "kind": z.literal("seller_inline"), "seller_agent": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("The seller agent's API endpoint URL as declared in the property publisher's adagents.json `authorized_agents[].url`. MUST use the `https://` scheme. Receivers compare this URL against the `authorized_agents` list using the AdCP URL canonicalization rules \u2014 not byte-equality \u2014 and reject mismatches with `seller_not_authorized`. See docs/reference/url-canonicalization."), "id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).min(1).describe("Reserved for a future registry-assigned stable seller identifier. Not used today \u2014 senders MUST NOT populate this field until a registry is defined. When a future release populates both `agent_url` and `id`, `agent_url` remains authoritative and `id` is advisory.").optional() }).strict().describe("Sales agent that defines and maintains the inline placement namespace."), "placement_id": z.string().min(1).describe("Stable placement ID within the defining sales agent's namespace. The agent MUST NOT reuse it for a different semantic placement.") }).strict()];
|
|
12599
12599
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
@@ -12936,7 +12936,7 @@ const CreativeApprovalResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
12936
12936
|
payload: z.object({}).passthrough().optional(),
|
|
12937
12937
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
12938
12938
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
12939
|
-
}).passthrough().and(z.union([CreativeApprovedSchema, CreativeRejectedSchema, CreativePendingReviewSchema, CreativeApprovalErrorSchema])))();
|
|
12939
|
+
}).passthrough().and(z.union([CreativeApprovedSchema, CreativeRejectedSchema, CreativePendingReviewSchema, CreativeApprovalErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
12940
12940
|
const GetBrandIdentityResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
12941
12941
|
context_id: z.string().optional(),
|
|
12942
12942
|
context: ContextObjectSchema.optional(),
|
|
@@ -12951,7 +12951,7 @@ const GetBrandIdentityResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
12951
12951
|
payload: z.object({}).passthrough().optional(),
|
|
12952
12952
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
12953
12953
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
12954
|
-
}).passthrough().and(z.union([GetBrandIdentitySuccessSchema, GetBrandIdentityErrorSchema])))();
|
|
12954
|
+
}).passthrough().and(z.union([GetBrandIdentitySuccessSchema, GetBrandIdentityErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
12955
12955
|
const GetRightsSuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
12956
12956
|
rights: z.array(z.object({
|
|
12957
12957
|
rights_id: z.string(),
|
|
@@ -13423,7 +13423,7 @@ const InlineDeclarationSchema = /* @__PURE__ */ (() => z.object({}).passthrough(
|
|
|
13423
13423
|
format_shape: z.string().optional(),
|
|
13424
13424
|
v1_format_ref: z.array(FormatReferenceStructuredObjectSchema).optional(),
|
|
13425
13425
|
format_schema: PlatformExtensionReferenceSchema.optional()
|
|
13426
|
-
}).passthrough()).and(z.union([ImageFormatDeclarationSchema, HTML5FormatDeclarationSchema, DisplayTagFormatDeclarationSchema, ImageCarouselFormatDeclarationSchema, HostedVideoFormatDeclarationSchema, VASTVideoFormatDeclarationSchema, HostedAudioFormatDeclarationSchema, VASTAudioFormatDeclarationSchema, DAASTAudioFormatDeclarationSchema, SponsoredPlacementFormatDeclarationSchema, NativeInFeedFormatDeclarationSchema, ResponsiveCreativeFormatDeclarationSchema, AgentPlacementFormatDeclarationSchema, SellerRenderedStatefulDisplayFormatDeclarationSchema, CoordinatedPlacementsFormatDeclarationSchema, CustomFormatDeclarationSchema])))();
|
|
13426
|
+
}).passthrough()).and(z.union([ImageFormatDeclarationSchema, HTML5FormatDeclarationSchema, DisplayTagFormatDeclarationSchema, ImageCarouselFormatDeclarationSchema, HostedVideoFormatDeclarationSchema, VASTVideoFormatDeclarationSchema, HostedAudioFormatDeclarationSchema, VASTAudioFormatDeclarationSchema, DAASTAudioFormatDeclarationSchema, SponsoredPlacementFormatDeclarationSchema, NativeInFeedFormatDeclarationSchema, ResponsiveCreativeFormatDeclarationSchema, AgentPlacementFormatDeclarationSchema, SellerRenderedStatefulDisplayFormatDeclarationSchema, CoordinatedPlacementsFormatDeclarationSchema, CustomFormatDeclarationSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
13427
13427
|
const PublisherDOOHPlacementAttributesSchema = /* @__PURE__ */ (() => z.object({
|
|
13428
13428
|
slot_duration_seconds: z.int().min(1).optional(),
|
|
13429
13429
|
loop_duration_seconds: z.int().min(1).optional(),
|
|
@@ -13785,7 +13785,7 @@ const RegistryEventSchema = /* @__PURE__ */ (() => z.object({
|
|
|
13785
13785
|
event_type: z.literal("authorization.modified"),
|
|
13786
13786
|
entity_type: z.literal("authorization").optional(),
|
|
13787
13787
|
payload: AuthorizationPayloadSchema.optional()
|
|
13788
|
-
}).passthrough()])))();
|
|
13788
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
13789
13789
|
const ReportingCanonicalizationContractSchema = /* @__PURE__ */ (() => z.object({
|
|
13790
13790
|
contract_version: z.literal("1.0"),
|
|
13791
13791
|
media_type: z.literal("application/vnd.adcp.reporting-canonicalization+json"),
|
|
@@ -13908,7 +13908,7 @@ const GovernanceAgentNotAcceptedDetailsSchema = /* @__PURE__ */ (() => z.union([
|
|
|
13908
13908
|
disclosure: z.literal("opaque"),
|
|
13909
13909
|
rejection_ref: z.string().max(128).regex(/^[A-Za-z0-9_.:-]+$/).optional()
|
|
13910
13910
|
}).passthrough()]))();
|
|
13911
|
-
const VASTVersionMismatchDetailsSchema = /* @__PURE__ */ (() => z.union([AssetOutsideAcceptedVersionIntersectionSchema, InspectedDocumentVersionMismatchSchema, SupportedVersionsCompatibilityDetailsSchema]).and(z.object({
|
|
13911
|
+
const VASTVersionMismatchDetailsSchema = /* @__PURE__ */ (() => z.union([AssetOutsideAcceptedVersionIntersectionSchema, InspectedDocumentVersionMismatchSchema, SupportedVersionsCompatibilityDetailsSchema]).describe("Must also satisfy at least one of these alternatives.").and(z.object({
|
|
13912
13912
|
mismatch_reason: z.union([z.literal("asset_outside_acceptance"), z.literal("document_version_mismatch")]).optional(),
|
|
13913
13913
|
asset_vast_version: VASTVersionSchema.optional(),
|
|
13914
13914
|
observed_document_vast_version: z.string().optional().nullable(),
|
|
@@ -13928,7 +13928,7 @@ const AcceptancePolicyCatalogSchema = /* @__PURE__ */ (() => z.object({
|
|
|
13928
13928
|
ext: ExtensionObjectSchema.optional()
|
|
13929
13929
|
}).passthrough())();
|
|
13930
13930
|
const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
|
|
13931
|
-
const objectSchema = z.object({ "geo_countries": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE')."), z.null()]).optional(), "geo_countries_exclude": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Exclude specific countries from delivery. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE')."), z.null()]).optional(), "geo_regions": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Restrict delivery to exact canonical ISO 3166-2 subdivisions (states, provinces, regions, departments, or other subdivision categories). Unknown identifiers are invalid. At create or update, sellers MUST reject unsupported identifiers and MUST NOT silently widen, drop, or partially apply the list. During get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome. Exact internal translation preserves accepted identifiers in package readback."), z.null()]).optional(), "geo_regions_exclude": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Exclude exact canonical ISO 3166-2 subdivisions. Support is independent from geo_regions inclusion support. Unknown identifiers and values also present in geo_regions are invalid. At create or update, sellers MUST reject unsupported identifiers and partial application; during get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome."), z.null()]).optional(), "geo_metros": z.union([z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict().describe("A targeted metro area.")).min(1).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities."), z.null().describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.")]).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_metros_exclude": z.union([z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes to exclude within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict()).min(1).describe("Exclude specific metro areas from delivery. Each entry specifies the classification system and excluded values. Seller must declare supported systems in get_adcp_capabilities."), z.null()]).optional(), "geo_postal_areas": z.union([z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })])).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Restrict delivery to specific postal areas. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities."), z.null()]).optional(), "geo_postal_areas_exclude": z.union([z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })])).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Exclude specific postal areas from delivery. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities."), z.null()]).optional(), "geo_places": z.union([z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))])).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Restrict delivery to catalog-backed named places. Values MUST be stable identifiers in the declared system, not display names. Sellers must declare supported systems, countries, and place types in get_adcp_capabilities and reject unsupported entries rather than silently dropping them."), z.null()]).optional(), "geo_places_exclude": z.union([z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))])).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Exclude catalog-backed named places. Uses the same identifier-based shape as geo_places. Sellers MUST reject overlap with geo_places for the same country, system, place_type, and value."), z.null()]).optional(), "daypart_targets": z.union([z.array(z.object({ "days": z.array(z.enum(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]).describe("Days of the week for daypart targeting")).min(1).describe("Days of week this window applies to. Use multiple days for compact targeting (e.g., monday-friday in one object)."), "start_hour": z.number().int().gte(0).lte(23).describe("Start hour (inclusive), 0-23 in 24-hour format. 0 = midnight, 6 = 6:00am, 18 = 6:00pm."), "end_hour": z.number().int().gte(1).lte(24).describe("End hour (exclusive), 1-24 in 24-hour format. 10 = 10:00am, 24 = midnight. Must be greater than start_hour."), "timezone": z.union([z.literal("inventory_local"), z.any().refine((value) => !z.literal("inventory_local").safeParse(value).success, "Invalid input: Should NOT be valid against schema").describe("Concrete timezone identifier in the implementation's supported IANA Time Zone Database, such as America/New_York, CET, or UTC.")]).describe("Civil-time clock used to evaluate this window. 'inventory_local' evaluates the hours in the seller-assigned local timezone of each inventory unit that can deliver the impression, such as a screen, venue, station, or publisher property; it never means the buyer, account, or server timezone. A concrete IANA timezone identifier (for example, 'America/New_York', 'CET', or 'UTC') evaluates one shared civil-time clock across the targeted inventory. Omission defaults to 'inventory_local'. Buyers that begin with a user or account preference MUST resolve it to a concrete IANA identifier before sending the daypart; 'user_timezone' and 'account_timezone' are not wire values. For each candidate delivery instant, convert the instant into this clock and compare its resulting local day and hour with the half-open window: a skipped DST hour has no matching instants, while both occurrences of a repeated hour match. This delivery clock is independent of reporting_capabilities.timezone.").default("inventory_local"), "label": z.string().describe("Optional human-readable name for this time window (e.g., 'Morning Drive', 'Prime Time')").optional() }).strict().describe("A time window for daypart targeting. Specifies days of week, an hour range, and the civil-time clock used to evaluate it. start_hour is inclusive, end_hour is exclusive (e.g., 6-10 = 6:00am to 10:00am). Follows the Google Ads AdScheduleInfo / DV360 DayPartTargeting pattern.")).min(1).describe("Restrict delivery to specific time windows. Each entry specifies days of week, an hour range, and an optional timezone that defaults to inventory_local. A concrete IANA zone uses one shared civil-time clock, while inventory_local evaluates each inventory unit in its seller-assigned local timezone. Entries are independent and MAY use different clocks."), z.null()]).optional(), "axe_include_segment": z.union([z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to include for targeting."), z.null()]).optional(), "axe_exclude_segment": z.union([z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to exclude from targeting."), z.null()]).optional(), "audience_include": z.union([z.array(z.string()).min(1).describe("Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "audience_exclude": z.union([z.array(z.string()).min(1).describe("Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "signal_targeting_groups": z.union([z.object({ "operator": z.literal("all").describe("Groups-level operator. Required even though v1 only supports 'all': every child group must be satisfied."), "groups": z.array(z.object({ "operator": z.enum(["any", "none"]).describe("How to evaluate the signals in this group. 'any' is an OR include group. 'none' is an exclusion group equivalent to NOT (A OR B OR C)."), "signals": z.array(z.object({ "pricing_option_id": z.string().describe("Pricing option selected for this signal. Use the pricing_option_id from the product's signal_targeting_options entry when product-scoped pricing is present; otherwise use the seller get_signals pricing only when the product option does not override it. Required when the selected signal has pricing_options; omit only when the signal is bundled into the product price or has no incremental cost.").optional(), "signal_agent_segment_id": z.string().describe("Optional opaque resolved-segment or seller execution handle for this signal. Omit when signal_ref plus the value expression is sufficient for the seller to resolve the signal. Include when the product option exposes a separate runtime or activation handle, and pass it verbatim. Buyers SHOULD prefer an exposed segment handle over reconstructing condition identity from categorical values because the handle can carry provider namespace and methodology distinctions.").optional(), "activation_key": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
|
|
13931
|
+
const objectSchema = z.object({ "geo_countries": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE')."), z.null()]).optional(), "geo_countries_exclude": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Exclude specific countries from delivery. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE')."), z.null()]).optional(), "geo_regions": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Restrict delivery to exact canonical ISO 3166-2 subdivisions (states, provinces, regions, departments, or other subdivision categories). Unknown identifiers are invalid. At create or update, sellers MUST reject unsupported identifiers and MUST NOT silently widen, drop, or partially apply the list. During get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome. Exact internal translation preserves accepted identifiers in package readback."), z.null()]).optional(), "geo_regions_exclude": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Exclude exact canonical ISO 3166-2 subdivisions. Support is independent from geo_regions inclusion support. Unknown identifiers and values also present in geo_regions are invalid. At create or update, sellers MUST reject unsupported identifiers and partial application; during get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome."), z.null()]).optional(), "geo_metros": z.union([z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict().describe("A targeted metro area.")).min(1).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities."), z.null().describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.")]).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_metros_exclude": z.union([z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes to exclude within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict()).min(1).describe("Exclude specific metro areas from delivery. Each entry specifies the classification system and excluded values. Seller must declare supported systems in get_adcp_capabilities."), z.null()]).optional(), "geo_postal_areas": z.union([z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })]).describe("Must also satisfy at least one of these alternatives.")).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Restrict delivery to specific postal areas. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities."), z.null()]).optional(), "geo_postal_areas_exclude": z.union([z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })]).describe("Must also satisfy at least one of these alternatives.")).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Exclude specific postal areas from delivery. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities."), z.null()]).optional(), "geo_places": z.union([z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Restrict delivery to catalog-backed named places. Values MUST be stable identifiers in the declared system, not display names. Sellers must declare supported systems, countries, and place types in get_adcp_capabilities and reject unsupported entries rather than silently dropping them."), z.null()]).optional(), "geo_places_exclude": z.union([z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Exclude catalog-backed named places. Uses the same identifier-based shape as geo_places. Sellers MUST reject overlap with geo_places for the same country, system, place_type, and value."), z.null()]).optional(), "daypart_targets": z.union([z.array(z.object({ "days": z.array(z.enum(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]).describe("Days of the week for daypart targeting")).min(1).describe("Days of week this window applies to. Use multiple days for compact targeting (e.g., monday-friday in one object)."), "start_hour": z.number().int().gte(0).lte(23).describe("Start hour (inclusive), 0-23 in 24-hour format. 0 = midnight, 6 = 6:00am, 18 = 6:00pm."), "end_hour": z.number().int().gte(1).lte(24).describe("End hour (exclusive), 1-24 in 24-hour format. 10 = 10:00am, 24 = midnight. Must be greater than start_hour."), "timezone": z.union([z.literal("inventory_local"), z.any().refine((value) => !z.literal("inventory_local").safeParse(value).success, "Invalid input: Should NOT be valid against schema").describe("Concrete timezone identifier in the implementation's supported IANA Time Zone Database, such as America/New_York, CET, or UTC.")]).describe("Civil-time clock used to evaluate this window. 'inventory_local' evaluates the hours in the seller-assigned local timezone of each inventory unit that can deliver the impression, such as a screen, venue, station, or publisher property; it never means the buyer, account, or server timezone. A concrete IANA timezone identifier (for example, 'America/New_York', 'CET', or 'UTC') evaluates one shared civil-time clock across the targeted inventory. Omission defaults to 'inventory_local'. Buyers that begin with a user or account preference MUST resolve it to a concrete IANA identifier before sending the daypart; 'user_timezone' and 'account_timezone' are not wire values. For each candidate delivery instant, convert the instant into this clock and compare its resulting local day and hour with the half-open window: a skipped DST hour has no matching instants, while both occurrences of a repeated hour match. This delivery clock is independent of reporting_capabilities.timezone.").default("inventory_local"), "label": z.string().describe("Optional human-readable name for this time window (e.g., 'Morning Drive', 'Prime Time')").optional() }).strict().describe("A time window for daypart targeting. Specifies days of week, an hour range, and the civil-time clock used to evaluate it. start_hour is inclusive, end_hour is exclusive (e.g., 6-10 = 6:00am to 10:00am). Follows the Google Ads AdScheduleInfo / DV360 DayPartTargeting pattern.")).min(1).describe("Restrict delivery to specific time windows. Each entry specifies days of week, an hour range, and an optional timezone that defaults to inventory_local. A concrete IANA zone uses one shared civil-time clock, while inventory_local evaluates each inventory unit in its seller-assigned local timezone. Entries are independent and MAY use different clocks."), z.null()]).optional(), "axe_include_segment": z.union([z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to include for targeting."), z.null()]).optional(), "axe_exclude_segment": z.union([z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to exclude from targeting."), z.null()]).optional(), "audience_include": z.union([z.array(z.string()).min(1).describe("Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "audience_exclude": z.union([z.array(z.string()).min(1).describe("Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "signal_targeting_groups": z.union([z.object({ "operator": z.literal("all").describe("Groups-level operator. Required even though v1 only supports 'all': every child group must be satisfied."), "groups": z.array(z.object({ "operator": z.enum(["any", "none"]).describe("How to evaluate the signals in this group. 'any' is an OR include group. 'none' is an exclusion group equivalent to NOT (A OR B OR C)."), "signals": z.array(z.object({ "pricing_option_id": z.string().describe("Pricing option selected for this signal. Use the pricing_option_id from the product's signal_targeting_options entry when product-scoped pricing is present; otherwise use the seller get_signals pricing only when the product option does not override it. Required when the selected signal has pricing_options; omit only when the signal is bundled into the product price or has no incremental cost.").optional(), "signal_agent_segment_id": z.string().describe("Optional opaque resolved-segment or seller execution handle for this signal. Omit when signal_ref plus the value expression is sufficient for the seller to resolve the signal. Include when the product option exposes a separate runtime or activation handle, and pass it verbatim. Buyers SHOULD prefer an exposed segment handle over reconstructing condition identity from categorical values because the handle can carry provider namespace and methodology distinctions.").optional(), "activation_key": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
|
|
13932
13932
|
const schemas = [z.object({ "type": z.literal("segment_id").describe("Segment ID based targeting"), "segment_id": z.string().describe("The platform-specific segment identifier to use in campaign targeting") }).catchall(z.any()), z.object({ "type": z.literal("key_value").describe("Key-value pair based targeting"), "key": z.string().describe("The targeting parameter key"), "value": z.string().describe("The targeting parameter value") }).catchall(z.any())];
|
|
13933
13933
|
const { errors, failed } = schemas.reduce(
|
|
13934
13934
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
@@ -14029,7 +14029,7 @@ const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
|
|
|
14029
14029
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
14030
14030
|
});
|
|
14031
14031
|
}
|
|
14032
|
-
}).describe("Named signal being targeted."), "value_type": z.literal("numeric").describe("Discriminator for numeric signals."), "min_value": z.number().describe("Minimum value, inclusive. Omit for no minimum. Should be within the signal definition's range when declared.").optional(), "max_value": z.number().describe("Maximum value, inclusive. Omit for no maximum. Should be within the signal definition's range when declared.").optional() }).catchall(z.any()).and(z.union([z.object({ "min_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Numeric signal expression - target users within a value range. At least one of min_value or max_value is required. If both min_value and max_value are provided, min_value MUST be <= max_value.")];
|
|
14032
|
+
}).describe("Named signal being targeted."), "value_type": z.literal("numeric").describe("Discriminator for numeric signals."), "min_value": z.number().describe("Minimum value, inclusive. Omit for no minimum. Should be within the signal definition's range when declared.").optional(), "max_value": z.number().describe("Maximum value, inclusive. Omit for no maximum. Should be within the signal definition's range when declared.").optional() }).catchall(z.any()).and(z.union([z.object({ "min_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Numeric signal expression - target users within a value range. At least one of min_value or max_value is required. If both min_value and max_value are provided, min_value MUST be <= max_value.")];
|
|
14033
14033
|
const { errors, failed } = schemas.reduce(
|
|
14034
14034
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
14035
14035
|
errors: [...errors2, ...result.error.issues],
|
|
@@ -14104,7 +14104,7 @@ const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
|
|
|
14104
14104
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
14105
14105
|
});
|
|
14106
14106
|
}
|
|
14107
|
-
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("binary").describe("Discriminator for binary signals"), "value": z.boolean().describe("Whether to include (true) or exclude (false) users matching this signal") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Binary signal targeting - user either matches or doesn't"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
|
|
14107
|
+
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("binary").describe("Discriminator for binary signals"), "value": z.boolean().describe("Whether to include (true) or exclude (false) users matching this signal") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Binary signal targeting - user either matches or doesn't"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
|
|
14108
14108
|
const schemas2 = [z.object({ "scope": z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Product-local signal identifier. For local signals exposed on both get_signals and get_products, this MUST match get_signals.signals[].signal_ref.signal_id for the same signal.") }).catchall(z.any()).describe("Product-scoped signal. The signal_id is meaningful only within the selected product/package context and MUST match a Product.included_signals[].signal_ref.signal_id or Product.signal_targeting_options[].signal_ref.signal_id for that product, depending on whether the signal is descriptive or selectable."), z.object({ "scope": z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that publishes the signal definition in its adagents.json signals[]."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(z.any()).describe("Data-provider-scoped signal. The signal_id resolves through the data provider's published adagents.json signals[] and can be authorization-verified there."), z.object({ "scope": z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(z.any()).describe("Signal-source-scoped signal. Use this for source-native signals that are not published in upstream adagents.json signals[]. The buyer trusts the issuing signal source for this identity; use scope 'data_provider' instead when the signal is published in adagents.json signals[], even if the publisher is also the seller or signal source.")];
|
|
14109
14109
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
14110
14110
|
({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
|
|
@@ -14154,7 +14154,7 @@ const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
|
|
|
14154
14154
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
14155
14155
|
});
|
|
14156
14156
|
}
|
|
14157
|
-
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("categorical").describe("Discriminator for categorical signals"), "values": z.array(z.string()).min(1).describe("Values to target. Users with any of these values will be included.") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Categorical signal targeting - target users with specific values"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
|
|
14157
|
+
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("categorical").describe("Discriminator for categorical signals"), "values": z.array(z.string()).min(1).describe("Values to target. Users with any of these values will be included.") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Categorical signal targeting - target users with specific values"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
|
|
14158
14158
|
const schemas2 = [z.object({ "scope": z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Product-local signal identifier. For local signals exposed on both get_signals and get_products, this MUST match get_signals.signals[].signal_ref.signal_id for the same signal.") }).catchall(z.any()).describe("Product-scoped signal. The signal_id is meaningful only within the selected product/package context and MUST match a Product.included_signals[].signal_ref.signal_id or Product.signal_targeting_options[].signal_ref.signal_id for that product, depending on whether the signal is descriptive or selectable."), z.object({ "scope": z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that publishes the signal definition in its adagents.json signals[]."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(z.any()).describe("Data-provider-scoped signal. The signal_id resolves through the data provider's published adagents.json signals[] and can be authorization-verified there."), z.object({ "scope": z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(z.any()).describe("Signal-source-scoped signal. Use this for source-native signals that are not published in upstream adagents.json signals[]. The buyer trusts the issuing signal source for this identity; use scope 'data_provider' instead when the signal is published in adagents.json signals[], even if the publisher is also the seller or signal source.")];
|
|
14159
14159
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
14160
14160
|
({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
|
|
@@ -14204,7 +14204,7 @@ const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
|
|
|
14204
14204
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
14205
14205
|
});
|
|
14206
14206
|
}
|
|
14207
|
-
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("numeric").describe("Discriminator for numeric signals"), "min_value": z.number().describe("Minimum value (inclusive). Omit for no minimum. Must be <= max_value when both are provided. Should be >= signal's range.min if defined.").optional(), "max_value": z.number().describe("Maximum value (inclusive). Omit for no maximum. Must be >= min_value when both are provided. Should be <= signal's range.max if defined.").optional() }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Numeric signal targeting - target users within a value range. If min_value is provided, it must be <= max_value. Values should be within the signal's defined range (see signal definition).")];
|
|
14207
|
+
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("numeric").describe("Discriminator for numeric signals"), "min_value": z.number().describe("Minimum value (inclusive). Omit for no minimum. Must be <= max_value when both are provided. Should be >= signal's range.min if defined.").optional(), "max_value": z.number().describe("Maximum value (inclusive). Omit for no maximum. Must be >= min_value when both are provided. Should be <= signal's range.max if defined.").optional() }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Numeric signal targeting - target users within a value range. If min_value is provided, it must be <= max_value. Values should be within the signal's defined range (see signal definition).")];
|
|
14208
14208
|
const { errors, failed } = schemas.reduce(
|
|
14209
14209
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
14210
14210
|
errors: [...errors2, ...result.error.issues],
|
|
@@ -14228,7 +14228,7 @@ const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
|
|
|
14228
14228
|
message: "Invalid input: Should pass single schema. Passed " + passed
|
|
14229
14229
|
});
|
|
14230
14230
|
}
|
|
14231
|
-
}).describe("Targeting constraint for a specific signal. Uses value_type as discriminator to determine the targeting expression format.")).min(1).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing."), z.null().describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.")]).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.").optional(), "demographics": z.union([z.object({ "age": z.intersection(z.object({ "min": z.number().int().gte(0).lte(150).describe("Inclusive minimum age in completed years. Omit for an open lower bound.").optional(), "max": z.number().int().gte(0).lte(150).describe("Inclusive maximum age in completed years. Omit for an open upper bound.").optional(), "include_unknown": z.boolean().describe("Whether delivery to people whose age is unavailable is part of this predicate. This field has no default and MUST be supplied.") }).catchall(z.any()).and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A canonical audience-age predicate in completed integer years. min and max are inclusive; omitting one bound means no restriction in that direction. At least one bound is required. include_unknown is always explicit because people whose age is unavailable are not members of any numeric interval. Implementations MUST reject min greater than max; JSON Schema draft-07 cannot compare sibling numeric values."), z.object({ "accepted_bases": z.array(z.enum(["verified", "declared", "inferred"]).describe("User-level bases that may resolve age for demographic targeting execution. Population estimates are deliberately absent because aggregate composition cannot establish an individual impression's age.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("User-level age determination bases the buyer permits for this predicate. Sellers MUST use only these bases or reject the request; they MUST NOT silently fall back to another basis. When omitted, the buyer imposes no determination-basis constraint beyond product capability and any age_restriction. population_estimate is structurally unavailable because aggregate evidence cannot identify an eligible user.").optional(), "accepted_verification_methods": z.array(z.enum(["facial_age_estimation", "id_document", "digital_id", "credit_card", "world_id"]).describe("Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Verification methods acceptable when verified is an accepted basis. This field narrows verified demographic execution; age_restriction.accepted_methods independently governs legal eligibility and the two sets are intersected when both are present.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "accepted_verification_methods": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "accepted_verification_methods": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "accepted_bases": z.any().refine((value) => !z.array(z.any().refine((value2) => !z.literal("verified").safeParse(value2).success, "Invalid input: Should NOT be valid against schema")).safeParse(value).success, "Invalid input: Should NOT be valid against schema") }))]))) }).catchall(z.any()).describe("Canonical demographic audience targeting intent with optional constraints on how age may be determined. This is distinct from age_restriction: demographics selects an audience, while age_restriction expresses a legal eligibility or verification floor. Fresh create/update targeting MUST compile exactly or be rejected. During get_products, a seller may offer a different configured predicate only through sparse targeting_resolution modifications on a distinguishable product_id; selecting that product accepts the alternative. Sellers never silently broaden, narrow, default, drop, or substitute the basis."), z.null()]).optional(), "frequency_cap": z.union([z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2."), z.null()]).optional(), "property_list": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list for targeting specific properties within this product. The package runs on the intersection of the product's publisher_properties and this list. Sellers SHOULD return a validation error if the product has property_targeting_allowed: false."), z.null()]).optional(), "property_list_exclude": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list whose properties must not carry the buyer's ads. Matched properties are removed from delivery. Use for brand-safety do-not-run lists (apps, sites). Exclude wins on overlap with property_list, and applies regardless of the product's property_targeting_allowed flag. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "collection_list": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for including specific collections (programs, publications, channels) within this product. The package runs on the intersection of matched collections and this list. Use for inclusion-based collection targeting. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "collection_list_exclude": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for excluding specific collections (programs, publications, channels) from this product. Matched collections must not carry the buyer's ads. Use for brand safety do-not-air lists. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "placement_selection": z.union([z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
|
|
14231
|
+
}).describe("Targeting constraint for a specific signal. Uses value_type as discriminator to determine the targeting expression format.")).min(1).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing."), z.null().describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.")]).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.").optional(), "demographics": z.union([z.object({ "age": z.intersection(z.object({ "min": z.number().int().gte(0).lte(150).describe("Inclusive minimum age in completed years. Omit for an open lower bound.").optional(), "max": z.number().int().gte(0).lte(150).describe("Inclusive maximum age in completed years. Omit for an open upper bound.").optional(), "include_unknown": z.boolean().describe("Whether delivery to people whose age is unavailable is part of this predicate. This field has no default and MUST be supplied.") }).catchall(z.any()).and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A canonical audience-age predicate in completed integer years. min and max are inclusive; omitting one bound means no restriction in that direction. At least one bound is required. include_unknown is always explicit because people whose age is unavailable are not members of any numeric interval. Implementations MUST reject min greater than max; JSON Schema draft-07 cannot compare sibling numeric values."), z.object({ "accepted_bases": z.array(z.enum(["verified", "declared", "inferred"]).describe("User-level bases that may resolve age for demographic targeting execution. Population estimates are deliberately absent because aggregate composition cannot establish an individual impression's age.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("User-level age determination bases the buyer permits for this predicate. Sellers MUST use only these bases or reject the request; they MUST NOT silently fall back to another basis. When omitted, the buyer imposes no determination-basis constraint beyond product capability and any age_restriction. population_estimate is structurally unavailable because aggregate evidence cannot identify an eligible user.").optional(), "accepted_verification_methods": z.array(z.enum(["facial_age_estimation", "id_document", "digital_id", "credit_card", "world_id"]).describe("Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Verification methods acceptable when verified is an accepted basis. This field narrows verified demographic execution; age_restriction.accepted_methods independently governs legal eligibility and the two sets are intersected when both are present.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "accepted_verification_methods": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "accepted_verification_methods": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "accepted_bases": z.any().refine((value) => !z.array(z.any().refine((value2) => !z.literal("verified").safeParse(value2).success, "Invalid input: Should NOT be valid against schema")).safeParse(value).success, "Invalid input: Should NOT be valid against schema") }))]).describe("Must also satisfy at least one of these alternatives."))) }).catchall(z.any()).describe("Canonical demographic audience targeting intent with optional constraints on how age may be determined. This is distinct from age_restriction: demographics selects an audience, while age_restriction expresses a legal eligibility or verification floor. Fresh create/update targeting MUST compile exactly or be rejected. During get_products, a seller may offer a different configured predicate only through sparse targeting_resolution modifications on a distinguishable product_id; selecting that product accepts the alternative. Sellers never silently broaden, narrow, default, drop, or substitute the basis."), z.null()]).optional(), "frequency_cap": z.union([z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2."), z.null()]).optional(), "property_list": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list for targeting specific properties within this product. The package runs on the intersection of the product's publisher_properties and this list. Sellers SHOULD return a validation error if the product has property_targeting_allowed: false."), z.null()]).optional(), "property_list_exclude": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list whose properties must not carry the buyer's ads. Matched properties are removed from delivery. Use for brand-safety do-not-run lists (apps, sites). Exclude wins on overlap with property_list, and applies regardless of the product's property_targeting_allowed flag. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "collection_list": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for including specific collections (programs, publications, channels) within this product. The package runs on the intersection of matched collections and this list. Use for inclusion-based collection targeting. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "collection_list_exclude": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for excluding specific collections (programs, publications, channels) from this product. Matched collections must not carry the buyer's ads. Use for brand safety do-not-air lists. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "placement_selection": z.union([z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
|
|
14232
14232
|
const schemas = [z.object({ "mode": z.literal("selected"), "placement_refs": z.array(z.union([z.intersection(z.object({ "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring a publisher-catalog placement is hosted, or the inventory publisher associated with an inline placement. Omitted only for legacy single-publisher product-context references.").optional(), "placement_id": z.string().describe("Placement ID from the publisher's adagents.json placement catalog, or an inline seller-defined placement ID interpreted within the enclosing seller and product context.") }).catchall(z.any()).describe("Legacy-compatible product-context reference to a placement. For publisher-catalog placements, publisher_domain plus placement_id resolves the declaration in that publisher's adagents.json. For seller-inline placements, the enclosing seller and product supply scope. When publisher_domain is omitted on legacy inputs, receivers MAY interpret the ID relative to the enclosing single-publisher product. Use placement-identity.json when a self-contained cross-document identity is required."), z.object({ "publisher_domain": z.any().refine((value) => value !== void 0, "Required") }).passthrough()), z.any().superRefine((x2, ctx2) => {
|
|
14233
14233
|
const schemas2 = [z.object({ "kind": z.literal("publisher_ref"), "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain whose adagents.json declares placement_id."), "placement_id": z.string().min(1) }).strict(), z.object({ "kind": z.literal("seller_inline"), "seller_agent": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("The seller agent's API endpoint URL as declared in the property publisher's adagents.json `authorized_agents[].url`. MUST use the `https://` scheme. Receivers compare this URL against the `authorized_agents` list using the AdCP URL canonicalization rules \u2014 not byte-equality \u2014 and reject mismatches with `seller_not_authorized`. See docs/reference/url-canonicalization."), "id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).min(1).describe("Reserved for a future registry-assigned stable seller identifier. Not used today \u2014 senders MUST NOT populate this field until a registry is defined. When a future release populates both `agent_url` and `id`, `agent_url` remains authoritative and `id` is advisory.").optional() }).strict().describe("Sales agent that defines and maintains the inline placement namespace."), "placement_id": z.string().min(1).describe("Stable placement ID within the defining sales agent's namespace. The agent MUST NOT reuse it for a different semantic placement.") }).strict()];
|
|
14234
14234
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
@@ -14406,7 +14406,7 @@ const ProposalRefinementSchema = /* @__PURE__ */ (() => z.object({
|
|
|
14406
14406
|
action: z.literal("finalize")
|
|
14407
14407
|
}).passthrough(), z.union([z.object({}).passthrough(), z.object({
|
|
14408
14408
|
change_kind: z.literal("cancellation")
|
|
14409
|
-
}).passthrough()])])))();
|
|
14409
|
+
}).passthrough()])]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
14410
14410
|
const PropertyFeatureResultSchema = /* @__PURE__ */ (() => z.object({
|
|
14411
14411
|
property: PropertyIDSchema,
|
|
14412
14412
|
features: z.record(z.string(), PropertyFeatureValueSchema).optional(),
|
|
@@ -14728,7 +14728,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
14728
14728
|
message: "Invalid input: Should pass single schema. Passed " + passed
|
|
14729
14729
|
});
|
|
14730
14730
|
}
|
|
14731
|
-
})).describe('Discriminated reference to a product format option. The global canonical shape is still named by `format_kind`; this reference selects one concrete product `format_options[]` entry. `scope: "publisher"` identifies a publisher-declared catalog option by `{ publisher_domain, format_option_id }`. `scope: "product"` identifies a product-local option by `format_option_id`; the enclosing package/product context supplies the namespace.')).min(1).describe("Canonical format options selected from the published product offer. Legacy named-format identifiers are not accepted.").optional(), "catalog_ids": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Previously synchronized account catalog IDs promoted by this selection. Callers manage catalog bodies through sync_catalogs rather than inlining them here.").optional(), "budget": z.number().gte(0).describe("Hard spend cap for this selection in the media-buy currency. In seller-optimized allocation it is an optional ceiling, not a reserved allocation, and requires advertised media_buy.features.seller_optimized_package_budgets; otherwise rejected with UNSUPPORTED_FEATURE before any over-subscription validation.").optional(), "daily_budget_cap": z.number().gte(0).describe("Optional hard daily spend ceiling for this purchase. It is subordinate to the media-buy aggregate daily cap and is not a reserved daily allocation. Its day boundary is the media buy's budget_cap_timezone.").optional(), "min_spend_target": z.number().gte(0).describe("Soft lifetime spend target for seller-optimized allocation. Requires advertised media_buy.features.seller_optimized_min_spend_targets; otherwise rejected with UNSUPPORTED_FEATURE before any over-subscription validation.").optional(), "impressions": z.number().gte(0).optional(), "start_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "end_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "pacing": z.enum(["even", "asap", "front_loaded"]).describe("Purchase pacing, subordinate to media-buy pacing. In seller-optimized allocation, pacing that differs from the media-buy pacing requires advertised media_buy.features.seller_optimized_package_pacing; otherwise rejected with UNSUPPORTED_FEATURE.").optional(), "bidding": z.object({ "automatic": z.literal(true).describe("Explicitly use seller/provider automatic bidding at this authored scope. At package scope this is a complete override of a media-buy policy, not inheritance. It MUST be the only field in the block and MUST be preserved on readback.").optional(), "bid_amount": z.number().gt(0).describe("Manual auction bid denominated in the media-buy currency and expressed per the selected pricing option's auction unit. For example, a CPM option interprets the amount per thousand impressions. This is the amount submitted to the auction, not a promise that the clearing price equals it. Requires an auction-priced pricing option whose currency equals the media-buy currency.").optional(), "max_bid": z.number().gt(0).describe("Hard per-auction ceiling denominated in the media-buy currency and expressed per the selected pricing option's auction unit. This is the only canonical hard auction ceiling and MUST NOT be translated into an average outcome-cost control. Requires an auction-priced pricing option whose currency equals the media-buy currency. May stand alone or supplement cost_per/roas only when the relevant scope capability advertises that combination.").optional(), "cost_per": z.object({ "amount": z.number().gt(0).describe("Average cost amount per scope-bound primary-goal result, denominated in the media-buy currency."), "strength": z.enum(["cap", "target"]).describe("`cap` optimizes for an average at or below the amount and accepts underdelivery when necessary; `target` optimizes around the amount while balancing volume and spend. Neither is a per-result or per-auction guarantee.") }).passthrough().describe("Average cost control per result of the scope-bound primary optimization goal. At seller-optimized media-buy scope it binds to budget_allocation.optimization_goals; at package scope it binds to that package's optimization_goals; at fixed media-buy scope it binds independently to each inheriting package and is valid only when their primary-goal result units are compatible. Metric goals are compatible only when metric and every result-defining qualifier match; vendor_metric goals only when vendor and metric_id match; event goals only when the event_type/custom_event_name set and resolved attribution_window match. Primary is the earliest array entry among goals tied for the lowest explicit numeric priority; unprioritized goals follow explicitly prioritized goals; when all priorities are absent, the first entry is primary.").optional(), "roas": z.object({ "value": z.number().gt(0).describe("Return per unit of ad spend; 4 means 4 units of value per 1 unit spent."), "strength": z.enum(["floor", "target"]).describe("`floor` prefers underdelivery to knowingly optimizing below the requested return; `target` optimizes around the requested return. Neither guarantees realized return.") }).passthrough().describe("Dimensionless return-on-ad-spend control bound to the same scope-specific primary goal rules as cost_per. The bound goal must be value-bearing; a fixed media-buy default requires a value-bearing primary goal on every inheriting package. Every referenced value-bearing event source MUST declare value_currencies containing the media-buy currency. The seller validates this at buy creation; each buy consumes only exact-currency records, while other declared currencies remain available to other buys. Sellers MUST NOT perform currency conversion.").optional() }).passthrough().and(z.any().refine((value) => !z.union([z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "max_bid": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "cost_per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "roas": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required"), "max_bid": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required"), "cost_per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required"), "roas": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "cost_per": z.any().refine((value2) => value2 !== void 0, "Required"), "roas": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema")).describe("Buyer-authored execution policy for automatic delivery, auction bidding, average outcome cost, or return on ad spend. The containing object determines authored scope: media-buy `bidding` is a complete inherited default and package `bidding` is a complete package override. Sellers MUST preserve authored scope on readback and MUST NOT copy an inherited media-buy policy into package `bidding`. Every monetary field in this block is denominated in the media-buy currency; the selected pricing option supplies the auction unit, never another denomination. Auction-unit identity is the pricing_model plus every canonical billing-event qualifier after defaults are applied: for example CPV view threshold, CPP demographic system/demographic, CPA event tuple, time time_unit, and flat-rate/DOOH parameters. An extension qualifier participates only when its registered extension specification explicitly defines how it contributes to auction-unit identity. A media-buy bid_amount or max_bid is valid only when every inheriting package resolves the same auction-unit identity. Every affected pricing option MUST use the media-buy currency; split currency-mismatched packages into separate buys. Seller-optimized media-buy cost_per/roas bind to the primary budget_allocation.optimization_goals goal. Package-authored cost_per/roas bind to the package primary optimization goal. The primary goal is the earliest array entry among goals with the lowest explicit numeric priority; unprioritized goals follow explicitly prioritized goals; when all priorities are absent, the first entry is primary. In fixed allocation, an inherited media-buy cost_per is valid only when all inheriting packages have compatible primary-goal result units; inherited roas requires value-bearing primary goals on every inheriting package. Canonical ROAS requires each value-bearing event source to declare the media-buy currency in value_currencies; each buy consumes only exact-currency records and sellers MUST NOT convert them. Absence invokes inheritance or provider automatic delivery; `{automatic:true}` is an explicit authored policy that overrides inheritance. Sellers MUST reject unsupported modes, combinations, units, currency, goal bindings, or native placements before any provider mutation and MUST NOT silently translate semantics.").refine((value) => Object.keys(value).length >= 1, "Object must contain at least 1 property").optional(), "targeting_overlay": z.object({ "geo_countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_countries_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Exclude specific countries from delivery. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_regions": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Restrict delivery to exact canonical ISO 3166-2 subdivisions (states, provinces, regions, departments, or other subdivision categories). Unknown identifiers are invalid. At create or update, sellers MUST reject unsupported identifiers and MUST NOT silently widen, drop, or partially apply the list. During get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome. Exact internal translation preserves accepted identifiers in package readback.").optional(), "geo_regions_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Exclude exact canonical ISO 3166-2 subdivisions. Support is independent from geo_regions inclusion support. Unknown identifiers and values also present in geo_regions are invalid. At create or update, sellers MUST reject unsupported identifiers and partial application; during get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome.").optional(), "geo_metros": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).passthrough().describe("A targeted metro area.")).min(1).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_metros_exclude": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes to exclude within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).passthrough()).min(1).describe("Exclude specific metro areas from delivery. Each entry specifies the classification system and excluded values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).passthrough().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })])).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).passthrough()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Restrict delivery to specific postal areas. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas_exclude": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).passthrough().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })])).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).passthrough()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Exclude specific postal areas from delivery. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_places": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))])).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Restrict delivery to catalog-backed named places. Values MUST be stable identifiers in the declared system, not display names. Sellers must declare supported systems, countries, and place types in get_adcp_capabilities and reject unsupported entries rather than silently dropping them.").optional(), "geo_places_exclude": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))])).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Exclude catalog-backed named places. Uses the same identifier-based shape as geo_places. Sellers MUST reject overlap with geo_places for the same country, system, place_type, and value.").optional(), "daypart_targets": z.array(z.object({ "days": z.array(z.enum(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]).describe("Days of the week for daypart targeting")).min(1).describe("Days of week this window applies to. Use multiple days for compact targeting (e.g., monday-friday in one object)."), "start_hour": z.number().int().gte(0).lte(23).describe("Start hour (inclusive), 0-23 in 24-hour format. 0 = midnight, 6 = 6:00am, 18 = 6:00pm."), "end_hour": z.number().int().gte(1).lte(24).describe("End hour (exclusive), 1-24 in 24-hour format. 10 = 10:00am, 24 = midnight. Must be greater than start_hour."), "timezone": z.union([z.literal("inventory_local"), z.any().refine((value) => !z.literal("inventory_local").safeParse(value).success, "Invalid input: Should NOT be valid against schema").describe("Concrete timezone identifier in the implementation's supported IANA Time Zone Database, such as America/New_York, CET, or UTC.")]).describe("Civil-time clock used to evaluate this window. 'inventory_local' evaluates the hours in the seller-assigned local timezone of each inventory unit that can deliver the impression, such as a screen, venue, station, or publisher property; it never means the buyer, account, or server timezone. A concrete IANA timezone identifier (for example, 'America/New_York', 'CET', or 'UTC') evaluates one shared civil-time clock across the targeted inventory. Omission defaults to 'inventory_local'. Buyers that begin with a user or account preference MUST resolve it to a concrete IANA identifier before sending the daypart; 'user_timezone' and 'account_timezone' are not wire values. For each candidate delivery instant, convert the instant into this clock and compare its resulting local day and hour with the half-open window: a skipped DST hour has no matching instants, while both occurrences of a repeated hour match. This delivery clock is independent of reporting_capabilities.timezone.").default("inventory_local"), "label": z.string().describe("Optional human-readable name for this time window (e.g., 'Morning Drive', 'Prime Time')").optional() }).passthrough().describe("A time window for daypart targeting. Specifies days of week, an hour range, and the civil-time clock used to evaluate it. start_hour is inclusive, end_hour is exclusive (e.g., 6-10 = 6:00am to 10:00am). Follows the Google Ads AdScheduleInfo / DV360 DayPartTargeting pattern.")).min(1).describe("Restrict delivery to specific time windows. Each entry specifies days of week, an hour range, and an optional timezone that defaults to inventory_local. A concrete IANA zone uses one shared civil-time clock, while inventory_local evaluates each inventory unit in its seller-assigned local timezone. Entries are independent and MAY use different clocks.").optional(), "axe_include_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to include for targeting.").optional(), "axe_exclude_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to exclude from targeting.").optional(), "audience_include": z.array(z.string()).min(1).describe("Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities.").optional(), "audience_exclude": z.array(z.string()).min(1).describe("Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities.").optional(), "signal_targeting_groups": z.object({ "operator": z.literal("all").describe("Groups-level operator. Required even though v1 only supports 'all': every child group must be satisfied."), "groups": z.array(z.object({ "operator": z.enum(["any", "none"]).describe("How to evaluate the signals in this group. 'any' is an OR include group. 'none' is an exclusion group equivalent to NOT (A OR B OR C)."), "signals": z.array(z.object({ "pricing_option_id": z.string().describe("Pricing option selected for this signal. Use the pricing_option_id from the product's signal_targeting_options entry when product-scoped pricing is present; otherwise use the seller get_signals pricing only when the product option does not override it. Required when the selected signal has pricing_options; omit only when the signal is bundled into the product price or has no incremental cost.").optional(), "signal_agent_segment_id": z.string().describe("Optional opaque resolved-segment or seller execution handle for this signal. Omit when signal_ref plus the value expression is sufficient for the seller to resolve the signal. Include when the product option exposes a separate runtime or activation handle, and pass it verbatim. Buyers SHOULD prefer an exposed segment handle over reconstructing condition identity from categorical values because the handle can carry provider namespace and methodology distinctions.").optional(), "activation_key": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
|
|
14731
|
+
})).describe('Discriminated reference to a product format option. The global canonical shape is still named by `format_kind`; this reference selects one concrete product `format_options[]` entry. `scope: "publisher"` identifies a publisher-declared catalog option by `{ publisher_domain, format_option_id }`. `scope: "product"` identifies a product-local option by `format_option_id`; the enclosing package/product context supplies the namespace.')).min(1).describe("Canonical format options selected from the published product offer. Legacy named-format identifiers are not accepted.").optional(), "catalog_ids": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Previously synchronized account catalog IDs promoted by this selection. Callers manage catalog bodies through sync_catalogs rather than inlining them here.").optional(), "budget": z.number().gte(0).describe("Hard spend cap for this selection in the media-buy currency. In seller-optimized allocation it is an optional ceiling, not a reserved allocation, and requires advertised media_buy.features.seller_optimized_package_budgets; otherwise rejected with UNSUPPORTED_FEATURE before any over-subscription validation.").optional(), "daily_budget_cap": z.number().gte(0).describe("Optional hard daily spend ceiling for this purchase. It is subordinate to the media-buy aggregate daily cap and is not a reserved daily allocation. Its day boundary is the media buy's budget_cap_timezone.").optional(), "min_spend_target": z.number().gte(0).describe("Soft lifetime spend target for seller-optimized allocation. Requires advertised media_buy.features.seller_optimized_min_spend_targets; otherwise rejected with UNSUPPORTED_FEATURE before any over-subscription validation.").optional(), "impressions": z.number().gte(0).optional(), "start_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "end_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "pacing": z.enum(["even", "asap", "front_loaded"]).describe("Purchase pacing, subordinate to media-buy pacing. In seller-optimized allocation, pacing that differs from the media-buy pacing requires advertised media_buy.features.seller_optimized_package_pacing; otherwise rejected with UNSUPPORTED_FEATURE.").optional(), "bidding": z.object({ "automatic": z.literal(true).describe("Explicitly use seller/provider automatic bidding at this authored scope. At package scope this is a complete override of a media-buy policy, not inheritance. It MUST be the only field in the block and MUST be preserved on readback.").optional(), "bid_amount": z.number().gt(0).describe("Manual auction bid denominated in the media-buy currency and expressed per the selected pricing option's auction unit. For example, a CPM option interprets the amount per thousand impressions. This is the amount submitted to the auction, not a promise that the clearing price equals it. Requires an auction-priced pricing option whose currency equals the media-buy currency.").optional(), "max_bid": z.number().gt(0).describe("Hard per-auction ceiling denominated in the media-buy currency and expressed per the selected pricing option's auction unit. This is the only canonical hard auction ceiling and MUST NOT be translated into an average outcome-cost control. Requires an auction-priced pricing option whose currency equals the media-buy currency. May stand alone or supplement cost_per/roas only when the relevant scope capability advertises that combination.").optional(), "cost_per": z.object({ "amount": z.number().gt(0).describe("Average cost amount per scope-bound primary-goal result, denominated in the media-buy currency."), "strength": z.enum(["cap", "target"]).describe("`cap` optimizes for an average at or below the amount and accepts underdelivery when necessary; `target` optimizes around the amount while balancing volume and spend. Neither is a per-result or per-auction guarantee.") }).passthrough().describe("Average cost control per result of the scope-bound primary optimization goal. At seller-optimized media-buy scope it binds to budget_allocation.optimization_goals; at package scope it binds to that package's optimization_goals; at fixed media-buy scope it binds independently to each inheriting package and is valid only when their primary-goal result units are compatible. Metric goals are compatible only when metric and every result-defining qualifier match; vendor_metric goals only when vendor and metric_id match; event goals only when the event_type/custom_event_name set and resolved attribution_window match. Primary is the earliest array entry among goals tied for the lowest explicit numeric priority; unprioritized goals follow explicitly prioritized goals; when all priorities are absent, the first entry is primary.").optional(), "roas": z.object({ "value": z.number().gt(0).describe("Return per unit of ad spend; 4 means 4 units of value per 1 unit spent."), "strength": z.enum(["floor", "target"]).describe("`floor` prefers underdelivery to knowingly optimizing below the requested return; `target` optimizes around the requested return. Neither guarantees realized return.") }).passthrough().describe("Dimensionless return-on-ad-spend control bound to the same scope-specific primary goal rules as cost_per. The bound goal must be value-bearing; a fixed media-buy default requires a value-bearing primary goal on every inheriting package. Every referenced value-bearing event source MUST declare value_currencies containing the media-buy currency. The seller validates this at buy creation; each buy consumes only exact-currency records, while other declared currencies remain available to other buys. Sellers MUST NOT perform currency conversion.").optional() }).passthrough().and(z.any().refine((value) => !z.union([z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "max_bid": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "cost_per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "roas": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required"), "max_bid": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required"), "cost_per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required"), "roas": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "cost_per": z.any().refine((value2) => value2 !== void 0, "Required"), "roas": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema")).describe("Buyer-authored execution policy for automatic delivery, auction bidding, average outcome cost, or return on ad spend. The containing object determines authored scope: media-buy `bidding` is a complete inherited default and package `bidding` is a complete package override. Sellers MUST preserve authored scope on readback and MUST NOT copy an inherited media-buy policy into package `bidding`. Every monetary field in this block is denominated in the media-buy currency; the selected pricing option supplies the auction unit, never another denomination. Auction-unit identity is the pricing_model plus every canonical billing-event qualifier after defaults are applied: for example CPV view threshold, CPP demographic system/demographic, CPA event tuple, time time_unit, and flat-rate/DOOH parameters. An extension qualifier participates only when its registered extension specification explicitly defines how it contributes to auction-unit identity. A media-buy bid_amount or max_bid is valid only when every inheriting package resolves the same auction-unit identity. Every affected pricing option MUST use the media-buy currency; split currency-mismatched packages into separate buys. Seller-optimized media-buy cost_per/roas bind to the primary budget_allocation.optimization_goals goal. Package-authored cost_per/roas bind to the package primary optimization goal. The primary goal is the earliest array entry among goals with the lowest explicit numeric priority; unprioritized goals follow explicitly prioritized goals; when all priorities are absent, the first entry is primary. In fixed allocation, an inherited media-buy cost_per is valid only when all inheriting packages have compatible primary-goal result units; inherited roas requires value-bearing primary goals on every inheriting package. Canonical ROAS requires each value-bearing event source to declare the media-buy currency in value_currencies; each buy consumes only exact-currency records and sellers MUST NOT convert them. Absence invokes inheritance or provider automatic delivery; `{automatic:true}` is an explicit authored policy that overrides inheritance. Sellers MUST reject unsupported modes, combinations, units, currency, goal bindings, or native placements before any provider mutation and MUST NOT silently translate semantics.").refine((value) => Object.keys(value).length >= 1, "Object must contain at least 1 property").optional(), "targeting_overlay": z.object({ "geo_countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_countries_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Exclude specific countries from delivery. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_regions": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Restrict delivery to exact canonical ISO 3166-2 subdivisions (states, provinces, regions, departments, or other subdivision categories). Unknown identifiers are invalid. At create or update, sellers MUST reject unsupported identifiers and MUST NOT silently widen, drop, or partially apply the list. During get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome. Exact internal translation preserves accepted identifiers in package readback.").optional(), "geo_regions_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Exclude exact canonical ISO 3166-2 subdivisions. Support is independent from geo_regions inclusion support. Unknown identifiers and values also present in geo_regions are invalid. At create or update, sellers MUST reject unsupported identifiers and partial application; during get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome.").optional(), "geo_metros": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).passthrough().describe("A targeted metro area.")).min(1).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_metros_exclude": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes to exclude within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).passthrough()).min(1).describe("Exclude specific metro areas from delivery. Each entry specifies the classification system and excluded values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).passthrough().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })]).describe("Must also satisfy at least one of these alternatives.")).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).passthrough()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Restrict delivery to specific postal areas. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas_exclude": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).passthrough().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })]).describe("Must also satisfy at least one of these alternatives.")).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).passthrough()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Exclude specific postal areas from delivery. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_places": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Restrict delivery to catalog-backed named places. Values MUST be stable identifiers in the declared system, not display names. Sellers must declare supported systems, countries, and place types in get_adcp_capabilities and reject unsupported entries rather than silently dropping them.").optional(), "geo_places_exclude": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Exclude catalog-backed named places. Uses the same identifier-based shape as geo_places. Sellers MUST reject overlap with geo_places for the same country, system, place_type, and value.").optional(), "daypart_targets": z.array(z.object({ "days": z.array(z.enum(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]).describe("Days of the week for daypart targeting")).min(1).describe("Days of week this window applies to. Use multiple days for compact targeting (e.g., monday-friday in one object)."), "start_hour": z.number().int().gte(0).lte(23).describe("Start hour (inclusive), 0-23 in 24-hour format. 0 = midnight, 6 = 6:00am, 18 = 6:00pm."), "end_hour": z.number().int().gte(1).lte(24).describe("End hour (exclusive), 1-24 in 24-hour format. 10 = 10:00am, 24 = midnight. Must be greater than start_hour."), "timezone": z.union([z.literal("inventory_local"), z.any().refine((value) => !z.literal("inventory_local").safeParse(value).success, "Invalid input: Should NOT be valid against schema").describe("Concrete timezone identifier in the implementation's supported IANA Time Zone Database, such as America/New_York, CET, or UTC.")]).describe("Civil-time clock used to evaluate this window. 'inventory_local' evaluates the hours in the seller-assigned local timezone of each inventory unit that can deliver the impression, such as a screen, venue, station, or publisher property; it never means the buyer, account, or server timezone. A concrete IANA timezone identifier (for example, 'America/New_York', 'CET', or 'UTC') evaluates one shared civil-time clock across the targeted inventory. Omission defaults to 'inventory_local'. Buyers that begin with a user or account preference MUST resolve it to a concrete IANA identifier before sending the daypart; 'user_timezone' and 'account_timezone' are not wire values. For each candidate delivery instant, convert the instant into this clock and compare its resulting local day and hour with the half-open window: a skipped DST hour has no matching instants, while both occurrences of a repeated hour match. This delivery clock is independent of reporting_capabilities.timezone.").default("inventory_local"), "label": z.string().describe("Optional human-readable name for this time window (e.g., 'Morning Drive', 'Prime Time')").optional() }).passthrough().describe("A time window for daypart targeting. Specifies days of week, an hour range, and the civil-time clock used to evaluate it. start_hour is inclusive, end_hour is exclusive (e.g., 6-10 = 6:00am to 10:00am). Follows the Google Ads AdScheduleInfo / DV360 DayPartTargeting pattern.")).min(1).describe("Restrict delivery to specific time windows. Each entry specifies days of week, an hour range, and an optional timezone that defaults to inventory_local. A concrete IANA zone uses one shared civil-time clock, while inventory_local evaluates each inventory unit in its seller-assigned local timezone. Entries are independent and MAY use different clocks.").optional(), "axe_include_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to include for targeting.").optional(), "axe_exclude_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to exclude from targeting.").optional(), "audience_include": z.array(z.string()).min(1).describe("Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities.").optional(), "audience_exclude": z.array(z.string()).min(1).describe("Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities.").optional(), "signal_targeting_groups": z.object({ "operator": z.literal("all").describe("Groups-level operator. Required even though v1 only supports 'all': every child group must be satisfied."), "groups": z.array(z.object({ "operator": z.enum(["any", "none"]).describe("How to evaluate the signals in this group. 'any' is an OR include group. 'none' is an exclusion group equivalent to NOT (A OR B OR C)."), "signals": z.array(z.object({ "pricing_option_id": z.string().describe("Pricing option selected for this signal. Use the pricing_option_id from the product's signal_targeting_options entry when product-scoped pricing is present; otherwise use the seller get_signals pricing only when the product option does not override it. Required when the selected signal has pricing_options; omit only when the signal is bundled into the product price or has no incremental cost.").optional(), "signal_agent_segment_id": z.string().describe("Optional opaque resolved-segment or seller execution handle for this signal. Omit when signal_ref plus the value expression is sufficient for the seller to resolve the signal. Include when the product option exposes a separate runtime or activation handle, and pass it verbatim. Buyers SHOULD prefer an exposed segment handle over reconstructing condition identity from categorical values because the handle can carry provider namespace and methodology distinctions.").optional(), "activation_key": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
|
|
14732
14732
|
const schemas = [z.object({ "type": z.literal("segment_id").describe("Segment ID based targeting"), "segment_id": z.string().describe("The platform-specific segment identifier to use in campaign targeting") }).catchall(z.any()), z.object({ "type": z.literal("key_value").describe("Key-value pair based targeting"), "key": z.string().describe("The targeting parameter key"), "value": z.string().describe("The targeting parameter value") }).catchall(z.any())];
|
|
14733
14733
|
const { errors, failed } = schemas.reduce(
|
|
14734
14734
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
@@ -14829,7 +14829,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
14829
14829
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
14830
14830
|
});
|
|
14831
14831
|
}
|
|
14832
|
-
}).describe("Named signal being targeted."), "value_type": z.literal("numeric").describe("Discriminator for numeric signals."), "min_value": z.number().describe("Minimum value, inclusive. Omit for no minimum. Should be within the signal definition's range when declared.").optional(), "max_value": z.number().describe("Maximum value, inclusive. Omit for no maximum. Should be within the signal definition's range when declared.").optional() }).catchall(z.any()).and(z.union([z.object({ "min_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Numeric signal expression - target users within a value range. At least one of min_value or max_value is required. If both min_value and max_value are provided, min_value MUST be <= max_value.")];
|
|
14832
|
+
}).describe("Named signal being targeted."), "value_type": z.literal("numeric").describe("Discriminator for numeric signals."), "min_value": z.number().describe("Minimum value, inclusive. Omit for no minimum. Should be within the signal definition's range when declared.").optional(), "max_value": z.number().describe("Maximum value, inclusive. Omit for no maximum. Should be within the signal definition's range when declared.").optional() }).catchall(z.any()).and(z.union([z.object({ "min_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Numeric signal expression - target users within a value range. At least one of min_value or max_value is required. If both min_value and max_value are provided, min_value MUST be <= max_value.")];
|
|
14833
14833
|
const { errors, failed } = schemas.reduce(
|
|
14834
14834
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
14835
14835
|
errors: [...errors2, ...result.error.issues],
|
|
@@ -14904,7 +14904,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
14904
14904
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
14905
14905
|
});
|
|
14906
14906
|
}
|
|
14907
|
-
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("binary").describe("Discriminator for binary signals"), "value": z.boolean().describe("Whether to include (true) or exclude (false) users matching this signal") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Binary signal targeting - user either matches or doesn't"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
|
|
14907
|
+
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("binary").describe("Discriminator for binary signals"), "value": z.boolean().describe("Whether to include (true) or exclude (false) users matching this signal") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Binary signal targeting - user either matches or doesn't"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
|
|
14908
14908
|
const schemas2 = [z.object({ "scope": z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Product-local signal identifier. For local signals exposed on both get_signals and get_products, this MUST match get_signals.signals[].signal_ref.signal_id for the same signal.") }).catchall(z.any()).describe("Product-scoped signal. The signal_id is meaningful only within the selected product/package context and MUST match a Product.included_signals[].signal_ref.signal_id or Product.signal_targeting_options[].signal_ref.signal_id for that product, depending on whether the signal is descriptive or selectable."), z.object({ "scope": z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that publishes the signal definition in its adagents.json signals[]."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(z.any()).describe("Data-provider-scoped signal. The signal_id resolves through the data provider's published adagents.json signals[] and can be authorization-verified there."), z.object({ "scope": z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(z.any()).describe("Signal-source-scoped signal. Use this for source-native signals that are not published in upstream adagents.json signals[]. The buyer trusts the issuing signal source for this identity; use scope 'data_provider' instead when the signal is published in adagents.json signals[], even if the publisher is also the seller or signal source.")];
|
|
14909
14909
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
14910
14910
|
({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
|
|
@@ -14954,7 +14954,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
14954
14954
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
14955
14955
|
});
|
|
14956
14956
|
}
|
|
14957
|
-
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("categorical").describe("Discriminator for categorical signals"), "values": z.array(z.string()).min(1).describe("Values to target. Users with any of these values will be included.") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Categorical signal targeting - target users with specific values"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
|
|
14957
|
+
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("categorical").describe("Discriminator for categorical signals"), "values": z.array(z.string()).min(1).describe("Values to target. Users with any of these values will be included.") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Categorical signal targeting - target users with specific values"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
|
|
14958
14958
|
const schemas2 = [z.object({ "scope": z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Product-local signal identifier. For local signals exposed on both get_signals and get_products, this MUST match get_signals.signals[].signal_ref.signal_id for the same signal.") }).catchall(z.any()).describe("Product-scoped signal. The signal_id is meaningful only within the selected product/package context and MUST match a Product.included_signals[].signal_ref.signal_id or Product.signal_targeting_options[].signal_ref.signal_id for that product, depending on whether the signal is descriptive or selectable."), z.object({ "scope": z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that publishes the signal definition in its adagents.json signals[]."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(z.any()).describe("Data-provider-scoped signal. The signal_id resolves through the data provider's published adagents.json signals[] and can be authorization-verified there."), z.object({ "scope": z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(z.any()).describe("Signal-source-scoped signal. Use this for source-native signals that are not published in upstream adagents.json signals[]. The buyer trusts the issuing signal source for this identity; use scope 'data_provider' instead when the signal is published in adagents.json signals[], even if the publisher is also the seller or signal source.")];
|
|
14959
14959
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
14960
14960
|
({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
|
|
@@ -15004,7 +15004,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
15004
15004
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
15005
15005
|
});
|
|
15006
15006
|
}
|
|
15007
|
-
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("numeric").describe("Discriminator for numeric signals"), "min_value": z.number().describe("Minimum value (inclusive). Omit for no minimum. Must be <= max_value when both are provided. Should be >= signal's range.min if defined.").optional(), "max_value": z.number().describe("Maximum value (inclusive). Omit for no maximum. Must be >= min_value when both are provided. Should be <= signal's range.max if defined.").optional() }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Numeric signal targeting - target users within a value range. If min_value is provided, it must be <= max_value. Values should be within the signal's defined range (see signal definition).")];
|
|
15007
|
+
}).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("numeric").describe("Discriminator for numeric signals"), "min_value": z.number().describe("Minimum value (inclusive). Omit for no minimum. Must be <= max_value when both are provided. Should be >= signal's range.min if defined.").optional(), "max_value": z.number().describe("Maximum value (inclusive). Omit for no maximum. Must be >= min_value when both are provided. Should be <= signal's range.max if defined.").optional() }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Numeric signal targeting - target users within a value range. If min_value is provided, it must be <= max_value. Values should be within the signal's defined range (see signal definition).")];
|
|
15008
15008
|
const { errors, failed } = schemas.reduce(
|
|
15009
15009
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
15010
15010
|
errors: [...errors2, ...result.error.issues],
|
|
@@ -15028,7 +15028,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
15028
15028
|
message: "Invalid input: Should pass single schema. Passed " + passed
|
|
15029
15029
|
});
|
|
15030
15030
|
}
|
|
15031
|
-
}).describe("Targeting constraint for a specific signal. Uses value_type as discriminator to determine the targeting expression format.")).min(1).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.").optional(), "demographics": z.object({ "age": z.intersection(z.object({ "min": z.number().int().gte(0).lte(150).describe("Inclusive minimum age in completed years. Omit for an open lower bound.").optional(), "max": z.number().int().gte(0).lte(150).describe("Inclusive maximum age in completed years. Omit for an open upper bound.").optional(), "include_unknown": z.boolean().describe("Whether delivery to people whose age is unavailable is part of this predicate. This field has no default and MUST be supplied.") }).catchall(z.any()).and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A canonical audience-age predicate in completed integer years. min and max are inclusive; omitting one bound means no restriction in that direction. At least one bound is required. include_unknown is always explicit because people whose age is unavailable are not members of any numeric interval. Implementations MUST reject min greater than max; JSON Schema draft-07 cannot compare sibling numeric values."), z.object({ "accepted_bases": z.array(z.enum(["verified", "declared", "inferred"]).describe("User-level bases that may resolve age for demographic targeting execution. Population estimates are deliberately absent because aggregate composition cannot establish an individual impression's age.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("User-level age determination bases the buyer permits for this predicate. Sellers MUST use only these bases or reject the request; they MUST NOT silently fall back to another basis. When omitted, the buyer imposes no determination-basis constraint beyond product capability and any age_restriction. population_estimate is structurally unavailable because aggregate evidence cannot identify an eligible user.").optional(), "accepted_verification_methods": z.array(z.enum(["facial_age_estimation", "id_document", "digital_id", "credit_card", "world_id"]).describe("Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Verification methods acceptable when verified is an accepted basis. This field narrows verified demographic execution; age_restriction.accepted_methods independently governs legal eligibility and the two sets are intersected when both are present.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "accepted_verification_methods": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "accepted_verification_methods": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "accepted_bases": z.any().refine((value) => !z.array(z.any().refine((value2) => !z.literal("verified").safeParse(value2).success, "Invalid input: Should NOT be valid against schema")).safeParse(value).success, "Invalid input: Should NOT be valid against schema") }))]))) }).catchall(z.any()).describe("Canonical demographic audience targeting intent with optional constraints on how age may be determined. This is distinct from age_restriction: demographics selects an audience, while age_restriction expresses a legal eligibility or verification floor. Fresh create/update targeting MUST compile exactly or be rejected. During get_products, a seller may offer a different configured predicate only through sparse targeting_resolution modifications on a distinguishable product_id; selecting that product accepts the alternative. Sellers never silently broaden, narrow, default, drop, or substitute the basis.").optional(), "frequency_cap": z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2.").optional(), "property_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a property list for targeting specific properties within this product. The package runs on the intersection of the product's publisher_properties and this list. Sellers SHOULD return a validation error if the product has property_targeting_allowed: false.").optional(), "property_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a property list whose properties must not carry the buyer's ads. Matched properties are removed from delivery. Use for brand-safety do-not-run lists (apps, sites). Exclude wins on overlap with property_list, and applies regardless of the product's property_targeting_allowed flag. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a collection list for including specific collections (programs, publications, channels) within this product. The package runs on the intersection of matched collections and this list. Use for inclusion-based collection targeting. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a collection list for excluding specific collections (programs, publications, channels) from this product. Matched collections must not carry the buyer's ads. Use for brand safety do-not-air lists. Seller must declare support in get_adcp_capabilities.").optional(), "placement_selection": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
|
|
15031
|
+
}).describe("Targeting constraint for a specific signal. Uses value_type as discriminator to determine the targeting expression format.")).min(1).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.").optional(), "demographics": z.object({ "age": z.intersection(z.object({ "min": z.number().int().gte(0).lte(150).describe("Inclusive minimum age in completed years. Omit for an open lower bound.").optional(), "max": z.number().int().gte(0).lte(150).describe("Inclusive maximum age in completed years. Omit for an open upper bound.").optional(), "include_unknown": z.boolean().describe("Whether delivery to people whose age is unavailable is part of this predicate. This field has no default and MUST be supplied.") }).catchall(z.any()).and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A canonical audience-age predicate in completed integer years. min and max are inclusive; omitting one bound means no restriction in that direction. At least one bound is required. include_unknown is always explicit because people whose age is unavailable are not members of any numeric interval. Implementations MUST reject min greater than max; JSON Schema draft-07 cannot compare sibling numeric values."), z.object({ "accepted_bases": z.array(z.enum(["verified", "declared", "inferred"]).describe("User-level bases that may resolve age for demographic targeting execution. Population estimates are deliberately absent because aggregate composition cannot establish an individual impression's age.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("User-level age determination bases the buyer permits for this predicate. Sellers MUST use only these bases or reject the request; they MUST NOT silently fall back to another basis. When omitted, the buyer imposes no determination-basis constraint beyond product capability and any age_restriction. population_estimate is structurally unavailable because aggregate evidence cannot identify an eligible user.").optional(), "accepted_verification_methods": z.array(z.enum(["facial_age_estimation", "id_document", "digital_id", "credit_card", "world_id"]).describe("Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Verification methods acceptable when verified is an accepted basis. This field narrows verified demographic execution; age_restriction.accepted_methods independently governs legal eligibility and the two sets are intersected when both are present.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "accepted_verification_methods": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "accepted_verification_methods": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "accepted_bases": z.any().refine((value) => !z.array(z.any().refine((value2) => !z.literal("verified").safeParse(value2).success, "Invalid input: Should NOT be valid against schema")).safeParse(value).success, "Invalid input: Should NOT be valid against schema") }))]).describe("Must also satisfy at least one of these alternatives."))) }).catchall(z.any()).describe("Canonical demographic audience targeting intent with optional constraints on how age may be determined. This is distinct from age_restriction: demographics selects an audience, while age_restriction expresses a legal eligibility or verification floor. Fresh create/update targeting MUST compile exactly or be rejected. During get_products, a seller may offer a different configured predicate only through sparse targeting_resolution modifications on a distinguishable product_id; selecting that product accepts the alternative. Sellers never silently broaden, narrow, default, drop, or substitute the basis.").optional(), "frequency_cap": z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2.").optional(), "property_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a property list for targeting specific properties within this product. The package runs on the intersection of the product's publisher_properties and this list. Sellers SHOULD return a validation error if the product has property_targeting_allowed: false.").optional(), "property_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a property list whose properties must not carry the buyer's ads. Matched properties are removed from delivery. Use for brand-safety do-not-run lists (apps, sites). Exclude wins on overlap with property_list, and applies regardless of the product's property_targeting_allowed flag. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a collection list for including specific collections (programs, publications, channels) within this product. The package runs on the intersection of matched collections and this list. Use for inclusion-based collection targeting. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a collection list for excluding specific collections (programs, publications, channels) from this product. Matched collections must not carry the buyer's ads. Use for brand safety do-not-air lists. Seller must declare support in get_adcp_capabilities.").optional(), "placement_selection": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
|
|
15032
15032
|
const schemas = [z.object({ "mode": z.literal("selected"), "placement_refs": z.array(z.union([z.intersection(z.object({ "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring a publisher-catalog placement is hosted, or the inventory publisher associated with an inline placement. Omitted only for legacy single-publisher product-context references.").optional(), "placement_id": z.string().describe("Placement ID from the publisher's adagents.json placement catalog, or an inline seller-defined placement ID interpreted within the enclosing seller and product context.") }).catchall(z.any()).describe("Legacy-compatible product-context reference to a placement. For publisher-catalog placements, publisher_domain plus placement_id resolves the declaration in that publisher's adagents.json. For seller-inline placements, the enclosing seller and product supply scope. When publisher_domain is omitted on legacy inputs, receivers MAY interpret the ID relative to the enclosing single-publisher product. Use placement-identity.json when a self-contained cross-document identity is required."), z.object({ "publisher_domain": z.any().refine((value) => value !== void 0, "Required") }).passthrough()), z.any().superRefine((x2, ctx2) => {
|
|
15033
15033
|
const schemas2 = [z.object({ "kind": z.literal("publisher_ref"), "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain whose adagents.json declares placement_id."), "placement_id": z.string().min(1) }).passthrough(), z.object({ "kind": z.literal("seller_inline"), "seller_agent": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("The seller agent's API endpoint URL as declared in the property publisher's adagents.json `authorized_agents[].url`. MUST use the `https://` scheme. Receivers compare this URL against the `authorized_agents` list using the AdCP URL canonicalization rules \u2014 not byte-equality \u2014 and reject mismatches with `seller_not_authorized`. See docs/reference/url-canonicalization."), "id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).min(1).describe("Reserved for a future registry-assigned stable seller identifier. Not used today \u2014 senders MUST NOT populate this field until a registry is defined. When a future release populates both `agent_url` and `id`, `agent_url` remains authoritative and `id` is advisory.").optional() }).passthrough().describe("Sales agent that defines and maintains the inline placement namespace."), "placement_id": z.string().min(1).describe("Stable placement ID within the defining sales agent's namespace. The agent MUST NOT reuse it for a different semantic placement.") }).passthrough()];
|
|
15034
15034
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
@@ -15129,7 +15129,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
15129
15129
|
});
|
|
15130
15130
|
}
|
|
15131
15131
|
}))).min(1).describe("Target users within travel time, distance, or a custom boundary around arbitrary geographic points. Multiple entries use OR semantics \u2014 a user within range of any listed point is eligible. For campaigns targeting 10+ locations, consider using store_catchments with a location catalog instead. Seller must declare support in get_adcp_capabilities.").optional(), "language": z.array(z.string().regex(new RegExp("^(?:[a-z]{2,8}(?:-[A-Z][a-z]{3})?(?:-(?:[A-Z]{2}|[0-9]{3}))?(?:-(?:[a-z0-9]{5,8}|[0-9][a-z0-9]{3}))*(?:-[0-9a-wy-z](?:-[a-z0-9]{2,8})+)*(?:-x(?:-[a-z0-9]{1,8})+)?|x(?:-[a-z0-9]{1,8})+)$")).min(2).max(63).describe("A well-formed BCP 47 language tag used by AdCP only as language identity. Script and region may refine that identity; other valid BCP 47 subtags remain part of tag matching but do not make this a general locale-settings object. It does not determine currency, time zone, number/date formatting, market, or legal jurisdiction. The AdCP canonical wire profile requires lower-case language and variants, title-case script, and upper-case region (for example `en-US`, `zh-Hant-TW`, or `x-private`). RFC 5646 comparisons are case-insensitive and its case regularization is optional; AdCP intentionally requires this stricter single wire spelling and receivers MUST reject differently cased tags rather than silently normalizing them. The schema pattern enforces the AdCP casing profile and extension structure for commonly used tags; conforming receivers additionally validate the complete RFC 5646 grammar and registry rules. Every new AdCP field carrying BCP 47 language identity or a concrete language range MUST reference this schema instead of declaring independent string constraints.")).min(1).describe("Restrict to users with specific language preferences using canonical BCP 47 language ranges. Each buyer range is evaluated against a user's language-preference tag with RFC 4647 section 3.3.1 Basic Filtering: 'fr' matches 'fr', 'fr-CA', and 'fr-FR', while 'fr-CA' matches 'fr-CA' and more-specific descendants but not 'fr' or 'fr-FR'. Values use OR logic.").optional(), "keyword_targets": z.array(z.object({ "keyword": z.string().min(1).describe("The keyword to target"), "match_type": z.enum(["broad", "phrase", "exact"]).describe("Keyword targeting match type. broad: ads may serve on queries semantically related to the keyword. phrase: ads serve when the query contains the keyword phrase. exact: ads serve only when the query matches the keyword exactly."), "bid_price": z.number().gte(0).describe("Per-keyword bid price, denominated in the same currency as the package's pricing option. Overrides the package-level bid_price for this keyword. Inherits the max_bid interpretation from the pricing option: when max_bid is true, this is the keyword's bid ceiling; when false, this is the exact bid. If omitted, the package bid_price applies.").optional() }).passthrough()).min(1).describe("Keyword targeting for search and retail media platforms. Restricts delivery to queries matching the specified keywords. Each keyword is identified by the tuple (keyword, match_type) \u2014 the same keyword string with different match types are distinct targets. Sellers SHOULD reject duplicate (keyword, match_type) pairs within a single request. Seller must declare support in get_adcp_capabilities.").optional(), "negative_keywords": z.array(z.object({ "keyword": z.string().min(1).describe("The keyword to exclude"), "match_type": z.enum(["broad", "phrase", "exact"]).describe("Keyword targeting match type. broad: ads may serve on queries semantically related to the keyword. phrase: ads serve when the query contains the keyword phrase. exact: ads serve only when the query matches the keyword exactly.") }).passthrough().describe("An excluded keyword.")).min(1).describe("Keywords to exclude from delivery. Queries matching these keywords will not trigger the ad. Each negative keyword is identified by the tuple (keyword, match_type). Seller must declare support in get_adcp_capabilities.").optional() }).catchall(z.any()).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "demographics": z.any().refine((value2) => value2 !== void 0, "Required"), "age_restriction": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "demographics": z.any().refine((value) => value !== void 0, "Required"), "age_restriction": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "demographics": z.object({ "age": z.object({ "include_unknown": z.literal(false).optional() }).optional() }).optional() }))]).describe("Unknown-age delivery cannot satisfy a minimum-age eligibility policy. When demographic audience targeting and age_restriction are both present, include_unknown must be false."), z.union([z.any().refine((value) => !z.object({ "age_restriction": z.object({ "verification_required": z.literal(true) }), "demographics": z.object({ "age": z.object({ "accepted_bases": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough() }) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "age_restriction": z.object({ "verification_required": z.literal(true) }), "demographics": z.object({ "age": z.object({ "accepted_bases": z.any().refine((value) => value !== void 0, "Required") }).passthrough() }) }), z.object({ "demographics": z.object({ "age": z.object({ "accepted_bases": z.any().refine((value) => !z.array(z.any().refine((value2) => !z.literal("verified").safeParse(value2).success, "Invalid input: Should NOT be valid against schema")).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional() }).optional() }).optional() }))]).describe("A legal verification requirement always narrows demographic targeting. When the buyer supplies accepted_bases and age_restriction requires verification, verified must be accepted; otherwise the constraints have an empty intersection and the request is invalid."))).describe("Resolved effective buyer-selected targeting, including compatible wholesale signal selections, applied within the product's published targeting contract. Cleared dimensions are omitted; null is invalid in an accepted snapshot.").optional(), "optimization_goals": z.array(z.any().superRefine((x, ctx) => {
|
|
15132
|
-
const schemas = [z.object({ "kind": z.literal("metric"), "metric": z.enum(["clicks", "views", "completed_views", "viewed_seconds", "viewable_rate", "engagements", "follows", "saves", "profile_visits", "reach"]), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional(), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.").optional(), "reach_unit": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").optional(), "target_frequency": z.object({ "min": z.number().int().gte(1).optional(), "max": z.number().int().gte(1).optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.") }).passthrough().and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).optional(), "view_duration_seconds": z.number().gt(0).optional(), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough().and(z.intersection(z.union([z.any().refine((value) => !z.object({ "metric": z.literal("viewable_rate") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "metric": z.literal("viewable_rate") }), z.object({ "target": z.object({ "value": z.any().optional() }).optional() }))]), z.any())), z.object({ "kind": z.literal("event"), "event_sources": z.array(z.object({ "event_source_id": z.string().min(1), "event_type": z.enum(["page_view", "view_content", "select_content", "select_item", "search", "share", "add_to_cart", "remove_from_cart", "viewed_cart", "add_to_wishlist", "initiate_checkout", "add_payment_info", "purchase", "refund", "lead", "qualify_lead", "close_convert_lead", "disqualify_lead", "complete_registration", "subscribe", "follow", "content_view", "watch_milestone", "start_trial", "app_install", "app_launch", "contact", "schedule", "donate", "submit_application", "custom"]).describe("Standard marketing event types for event logging, aligned with IAB ECAPI"), "custom_event_name": z.string().min(1).optional(), "value_field": z.string().min(1).optional(), "value_factor": z.number().default(1) }).passthrough()).min(1), "target": z.object({ "kind": z.literal("maximize_value") }).passthrough().optional(), "attribution_window": z.object({ "post_click": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-click attribution window. Conversions occurring within this duration after a click are attributed to the ad.").optional(), "post_view": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-view attribution window. Conversions occurring within this duration after an ad impression (without click) are attributed to the ad.").optional(), "model": z.enum(["last_touch", "first_touch", "linear", "time_decay", "data_driven"]).describe("Attribution model used to assign credit when multiple touchpoints exist. SHOULD be populated when committing to a specific model; when absent, the seller's default applies.").optional() }).catchall(z.any()).describe("Describes the attribution methodology and lookback windows used for conversion measurement. Enables cross-platform comparison by making attribution methodology transparent. Used as a `$ref` from `optimization-goal.json` (buyer's optimization-time attribution choice), `get-media-buy-delivery-response.json` (seller-declared attribution methodology in delivery reports), and similar surfaces. All fields are optional individually but at least one of `post_click`, `post_view`, or `model` SHOULD be populated; absence of `model` means the seller's default attribution model applies (typically `last_touch` per industry convention) \u2014 sellers SHOULD populate `model` explicitly when committing to a specific methodology.").optional(), "priority": z.number().int().gte(1).optional() }).passthrough(), z.object({ "kind": z.literal("vendor_metric"), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "metric_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).min(1).max(64).describe("Identifier for a vendor-defined metric within the vendor's vocabulary. Stable lookup key; the vendor publishes the canonical list (with category, methodology, and standard alignment) in `brand.json` `agents[type='measurement']`. Lowercase with underscores so a future enum promotion into `available-metric.json` is a literal string lift. Identifier is namespaced by the vendor \u2014 the same `metric_id` may mean different things in different vendors' vocabularies."), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough()];
|
|
15132
|
+
const schemas = [z.object({ "kind": z.literal("metric"), "metric": z.enum(["clicks", "views", "completed_views", "viewed_seconds", "viewable_rate", "engagements", "follows", "saves", "profile_visits", "reach"]), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional(), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.").optional(), "reach_unit": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").optional(), "target_frequency": z.object({ "min": z.number().int().gte(1).optional(), "max": z.number().int().gte(1).optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.") }).passthrough().and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).optional(), "view_duration_seconds": z.number().gt(0).optional(), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough().and(z.intersection(z.union([z.any().refine((value) => !z.object({ "metric": z.literal("viewable_rate") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "metric": z.literal("viewable_rate") }), z.object({ "target": z.object({ "value": z.any().optional() }).optional() }))]), z.any())), z.object({ "kind": z.literal("event"), "event_sources": z.array(z.object({ "event_source_id": z.string().min(1), "event_type": z.enum(["page_view", "view_content", "select_content", "select_item", "search", "share", "add_to_cart", "remove_from_cart", "viewed_cart", "add_to_wishlist", "initiate_checkout", "add_payment_info", "purchase", "refund", "lead", "qualify_lead", "close_convert_lead", "disqualify_lead", "complete_registration", "subscribe", "follow", "content_view", "watch_milestone", "start_trial", "app_install", "app_launch", "contact", "schedule", "donate", "submit_application", "custom"]).describe("Standard marketing event types for event logging, aligned with IAB ECAPI"), "custom_event_name": z.string().min(1).optional(), "value_field": z.string().min(1).optional(), "value_factor": z.number().default(1) }).passthrough()).min(1), "target": z.object({ "kind": z.literal("maximize_value") }).passthrough().optional(), "attribution_window": z.object({ "post_click": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-click attribution window. Conversions occurring within this duration after a click are attributed to the ad.").optional(), "post_view": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-view attribution window. Conversions occurring within this duration after an ad impression (without click) are attributed to the ad.").optional(), "model": z.enum(["last_touch", "first_touch", "linear", "time_decay", "data_driven"]).describe("Attribution model used to assign credit when multiple touchpoints exist. SHOULD be populated when committing to a specific model; when absent, the seller's default applies.").optional() }).catchall(z.any()).describe("Describes the attribution methodology and lookback windows used for conversion measurement. Enables cross-platform comparison by making attribution methodology transparent. Used as a `$ref` from `optimization-goal.json` (buyer's optimization-time attribution choice), `get-media-buy-delivery-response.json` (seller-declared attribution methodology in delivery reports), and similar surfaces. All fields are optional individually but at least one of `post_click`, `post_view`, or `model` SHOULD be populated; absence of `model` means the seller's default attribution model applies (typically `last_touch` per industry convention) \u2014 sellers SHOULD populate `model` explicitly when committing to a specific methodology.").optional(), "priority": z.number().int().gte(1).optional() }).passthrough(), z.object({ "kind": z.literal("vendor_metric"), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "metric_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).min(1).max(64).describe("Identifier for a vendor-defined metric within the vendor's vocabulary. Stable lookup key; the vendor publishes the canonical list (with category, methodology, and standard alignment) in `brand.json` `agents[type='measurement']`. Lowercase with underscores so a future enum promotion into `available-metric.json` is a literal string lift. Identifier is namespaced by the vendor \u2014 the same `metric_id` may mean different things in different vendors' vocabularies."), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough()];
|
|
15133
15133
|
const { errors, failed } = schemas.reduce(
|
|
15134
15134
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
15135
15135
|
errors: [...errors2, ...result.error.issues],
|
|
@@ -15178,7 +15178,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
15178
15178
|
message: "Invalid input: Should pass single schema. Passed " + passed
|
|
15179
15179
|
});
|
|
15180
15180
|
}
|
|
15181
|
-
})).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").optional(), "accepted_attestation_claim_types": z.array(z.string().refine(adcpJsonSchemaUri, "Invalid URI")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.object({ "independent_attestation_required": z.literal(true) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "independent_attestation_required": z.literal(true) }), z.object({ "accepted_attestation_issuers": z.any().refine((value) => value !== void 0, "Required") }).passthrough())])).describe("Buyer evidence-admissibility policy carried into the accepted purchase snapshot.").optional(), "audience_evidence_pins": z.array(z.object({ "evidence_id": z.string().min(1), "snapshot_id": z.string().min(1), "version": z.string().min(1), "content_digest": z.string().regex(new RegExp("^sha256:[a-f0-9]{64}$")), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().describe("Buyer-authored pin to one exact immutable audience-evidence snapshot selected during discovery. Sellers MUST match all four fields against a single published snapshot; they MUST reject the package rather than substitute a newer version or reuse snapshot_id with changed content. A confirmed package MUST return the same identity in audience_evidence_selections with decision_use package_construction.")).min(1).describe("Exact immutable audience-evidence snapshots selected for package construction.").optional(), "agency_estimate_number": z.string().max(100).describe("Package-level agency estimate or authorization reference.").optional(), "context": z.record(z.string(), z.any()).describe("Opaque buyer package correlation preserved in the accepted snapshot and readback.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional(), "measurement_terms": z.object({ "billing_measurement": z.object({ "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "max_variance_percent": z.number().gte(0).lt(100).optional(), "measurement_window": z.string().min(1).optional(), "finalization_deadline_hours": z.number().int().gte(0).optional() }).passthrough().optional(), "makegood_policy": z.object({ "available_remedies": z.array(z.enum(["additional_delivery", "credit", "invoice_adjustment"]).describe("Remedy types available when a performance standard or billing measurement threshold is breached.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!") }).passthrough().optional() }).passthrough().describe("Published or negotiated billing-measurement and makegood terms for this purchase. Direct buyers may omit this to inherit the product default; accepted proposal snapshots preserve the resolved terms.").optional(), "performance_standards": z.array(z.object({ "metric": z.enum(["viewability", "ivt", "completion_rate", "brand_safety", "attention_score"]).describe("Performance metrics that support rate thresholds on media buys \u2014 the verification subset of the broader metric vocabulary. Each metric specifies whether its threshold is a floor (must exceed) or ceiling (must not exceed). Shared values with `available-metric.json` mirror the delivery vocabulary (`viewability` \u2192 `viewable_rate` family, `completion_rate` \u2192 same name); verification-only values (`ivt`, `brand_safety`, `attention_score`) are typically vendor-attested and do not appear in `available-metric.json` because they're not seller-reportable scalars \u2014 they flow through `vendor_metric_values` or vendor-scope `committed_metrics` entries with the matching `performance_standard.vendor` BrandRef anchoring identity."), "threshold": z.number().gte(0).lte(1), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional(), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.") }).passthrough().describe("Compact committed metric threshold with resolvable vendor identity and no creative or brand-asset graph.")).min(1).describe("Published or negotiated metric thresholds and measurement vendors. Direct buyers may omit this to inherit the product defaults; accepted proposal snapshots preserve every applicable standard.").optional() }).passthrough().describe("One resolved canonical product selection in a compact proposal or accepted commercial snapshot. Request-side buy_products selections use product-purchase-input.json. This strict snapshot shape contains effective non-null targeting and resolved inherited terms. Creative content and creative assignments are intentionally absent."), z.object({ "product_id": z.any().refine((value) => value !== void 0, "Required"), "pricing_option_id": z.any().refine((value) => value !== void 0, "Required"), "pricing": z.any().refine((value) => value !== void 0, "Required"), "start_time": z.any().refine((value) => value !== void 0, "Required"), "end_time": z.any().refine((value) => value !== void 0, "Required") }).passthrough())).min(1).describe("Exact canonical product, pricing, format, catalog, budget, targeting, bidding, optimization, resolved flight, measurement, and performance terms in the commercial envelope."), "start_time": z.any().superRefine((x, ctx) => {
|
|
15181
|
+
})).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").optional(), "accepted_attestation_claim_types": z.array(z.string().refine(adcpJsonSchemaUri, "Invalid URI")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.object({ "independent_attestation_required": z.literal(true) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "independent_attestation_required": z.literal(true) }), z.object({ "accepted_attestation_issuers": z.any().refine((value) => value !== void 0, "Required") }).passthrough())]).describe("Must also satisfy at least one of these alternatives.")).describe("Buyer evidence-admissibility policy carried into the accepted purchase snapshot.").optional(), "audience_evidence_pins": z.array(z.object({ "evidence_id": z.string().min(1), "snapshot_id": z.string().min(1), "version": z.string().min(1), "content_digest": z.string().regex(new RegExp("^sha256:[a-f0-9]{64}$")), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().describe("Buyer-authored pin to one exact immutable audience-evidence snapshot selected during discovery. Sellers MUST match all four fields against a single published snapshot; they MUST reject the package rather than substitute a newer version or reuse snapshot_id with changed content. A confirmed package MUST return the same identity in audience_evidence_selections with decision_use package_construction.")).min(1).describe("Exact immutable audience-evidence snapshots selected for package construction.").optional(), "agency_estimate_number": z.string().max(100).describe("Package-level agency estimate or authorization reference.").optional(), "context": z.record(z.string(), z.any()).describe("Opaque buyer package correlation preserved in the accepted snapshot and readback.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional(), "measurement_terms": z.object({ "billing_measurement": z.object({ "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "max_variance_percent": z.number().gte(0).lt(100).optional(), "measurement_window": z.string().min(1).optional(), "finalization_deadline_hours": z.number().int().gte(0).optional() }).passthrough().optional(), "makegood_policy": z.object({ "available_remedies": z.array(z.enum(["additional_delivery", "credit", "invoice_adjustment"]).describe("Remedy types available when a performance standard or billing measurement threshold is breached.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!") }).passthrough().optional() }).passthrough().describe("Published or negotiated billing-measurement and makegood terms for this purchase. Direct buyers may omit this to inherit the product default; accepted proposal snapshots preserve the resolved terms.").optional(), "performance_standards": z.array(z.object({ "metric": z.enum(["viewability", "ivt", "completion_rate", "brand_safety", "attention_score"]).describe("Performance metrics that support rate thresholds on media buys \u2014 the verification subset of the broader metric vocabulary. Each metric specifies whether its threshold is a floor (must exceed) or ceiling (must not exceed). Shared values with `available-metric.json` mirror the delivery vocabulary (`viewability` \u2192 `viewable_rate` family, `completion_rate` \u2192 same name); verification-only values (`ivt`, `brand_safety`, `attention_score`) are typically vendor-attested and do not appear in `available-metric.json` because they're not seller-reportable scalars \u2014 they flow through `vendor_metric_values` or vendor-scope `committed_metrics` entries with the matching `performance_standard.vendor` BrandRef anchoring identity."), "threshold": z.number().gte(0).lte(1), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional(), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.") }).passthrough().describe("Compact committed metric threshold with resolvable vendor identity and no creative or brand-asset graph.")).min(1).describe("Published or negotiated metric thresholds and measurement vendors. Direct buyers may omit this to inherit the product defaults; accepted proposal snapshots preserve every applicable standard.").optional() }).passthrough().describe("One resolved canonical product selection in a compact proposal or accepted commercial snapshot. Request-side buy_products selections use product-purchase-input.json. This strict snapshot shape contains effective non-null targeting and resolved inherited terms. Creative content and creative assignments are intentionally absent."), z.object({ "product_id": z.any().refine((value) => value !== void 0, "Required"), "pricing_option_id": z.any().refine((value) => value !== void 0, "Required"), "pricing": z.any().refine((value) => value !== void 0, "Required"), "start_time": z.any().refine((value) => value !== void 0, "Required"), "end_time": z.any().refine((value) => value !== void 0, "Required") }).passthrough())).min(1).describe("Exact canonical product, pricing, format, catalog, budget, targeting, bidding, optimization, resolved flight, measurement, and performance terms in the commercial envelope."), "start_time": z.any().superRefine((x, ctx) => {
|
|
15182
15182
|
const schemas = [z.literal("asap").describe("Start campaign as soon as possible"), z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")];
|
|
15183
15183
|
const { errors, failed } = schemas.reduce(
|
|
15184
15184
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
@@ -15203,9 +15203,9 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
15203
15203
|
message: "Invalid input: Should pass single schema. Passed " + passed
|
|
15204
15204
|
});
|
|
15205
15205
|
}
|
|
15206
|
-
}).describe("Campaign start timing: 'asap' or ISO 8601 date-time"), "end_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), "total_budget": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().optional(), "daily_budget_cap": z.number().gte(0).describe("Hard aggregate daily spend ceiling accepted as part of these terms. It bounds total spend without creating purchase allocations.").optional(), "frequency_cap": z.intersection(z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2."), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()).describe("Hard MediaBuy-level cap accepted as part of these terms. One counter aggregates exposures across every purchase; purchase targeting caps remain independently binding.").optional(), "budget_cap_timezone": z.string().min(1).describe("Shared IANA calendar-day boundary for aggregate and purchase daily caps in these terms.").optional(), "budget_allocation": z.any().superRefine((x, ctx) => {
|
|
15206
|
+
}).describe("Campaign start timing: 'asap' or ISO 8601 date-time"), "end_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), "total_budget": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().optional(), "daily_budget_cap": z.number().gte(0).describe("Hard aggregate daily spend ceiling accepted as part of these terms. It bounds total spend without creating purchase allocations.").optional(), "frequency_cap": z.intersection(z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2."), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()).describe("Hard MediaBuy-level cap accepted as part of these terms. One counter aggregates exposures across every purchase; purchase targeting caps remain independently binding.").optional(), "budget_cap_timezone": z.string().min(1).describe("Shared IANA calendar-day boundary for aggregate and purchase daily caps in these terms.").optional(), "budget_allocation": z.any().superRefine((x, ctx) => {
|
|
15207
15207
|
const schemas = [z.object({ "mode": z.literal("fixed") }).passthrough(), z.object({ "mode": z.literal("seller_optimized"), "optimization_goals": z.array(z.any().superRefine((x2, ctx2) => {
|
|
15208
|
-
const schemas2 = [z.object({ "kind": z.literal("metric"), "metric": z.enum(["clicks", "views", "completed_views", "viewed_seconds", "viewable_rate", "engagements", "follows", "saves", "profile_visits", "reach"]), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional(), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.").optional(), "reach_unit": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").optional(), "target_frequency": z.object({ "min": z.number().int().gte(1).optional(), "max": z.number().int().gte(1).optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.") }).passthrough().and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).optional(), "view_duration_seconds": z.number().gt(0).optional(), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough().and(z.intersection(z.union([z.any().refine((value) => !z.object({ "metric": z.literal("viewable_rate") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "metric": z.literal("viewable_rate") }), z.object({ "target": z.object({ "value": z.any().optional() }).optional() }))]), z.any())), z.object({ "kind": z.literal("event"), "event_sources": z.array(z.object({ "event_source_id": z.string().min(1), "event_type": z.enum(["page_view", "view_content", "select_content", "select_item", "search", "share", "add_to_cart", "remove_from_cart", "viewed_cart", "add_to_wishlist", "initiate_checkout", "add_payment_info", "purchase", "refund", "lead", "qualify_lead", "close_convert_lead", "disqualify_lead", "complete_registration", "subscribe", "follow", "content_view", "watch_milestone", "start_trial", "app_install", "app_launch", "contact", "schedule", "donate", "submit_application", "custom"]).describe("Standard marketing event types for event logging, aligned with IAB ECAPI"), "custom_event_name": z.string().min(1).optional(), "value_field": z.string().min(1).optional(), "value_factor": z.number().default(1) }).passthrough()).min(1), "target": z.object({ "kind": z.literal("maximize_value") }).passthrough().optional(), "attribution_window": z.object({ "post_click": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-click attribution window. Conversions occurring within this duration after a click are attributed to the ad.").optional(), "post_view": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-view attribution window. Conversions occurring within this duration after an ad impression (without click) are attributed to the ad.").optional(), "model": z.enum(["last_touch", "first_touch", "linear", "time_decay", "data_driven"]).describe("Attribution model used to assign credit when multiple touchpoints exist. SHOULD be populated when committing to a specific model; when absent, the seller's default applies.").optional() }).catchall(z.any()).describe("Describes the attribution methodology and lookback windows used for conversion measurement. Enables cross-platform comparison by making attribution methodology transparent. Used as a `$ref` from `optimization-goal.json` (buyer's optimization-time attribution choice), `get-media-buy-delivery-response.json` (seller-declared attribution methodology in delivery reports), and similar surfaces. All fields are optional individually but at least one of `post_click`, `post_view`, or `model` SHOULD be populated; absence of `model` means the seller's default attribution model applies (typically `last_touch` per industry convention) \u2014 sellers SHOULD populate `model` explicitly when committing to a specific methodology.").optional(), "priority": z.number().int().gte(1).optional() }).passthrough(), z.object({ "kind": z.literal("vendor_metric"), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "metric_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).min(1).max(64).describe("Identifier for a vendor-defined metric within the vendor's vocabulary. Stable lookup key; the vendor publishes the canonical list (with category, methodology, and standard alignment) in `brand.json` `agents[type='measurement']`. Lowercase with underscores so a future enum promotion into `available-metric.json` is a literal string lift. Identifier is namespaced by the vendor \u2014 the same `metric_id` may mean different things in different vendors' vocabularies."), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough()];
|
|
15208
|
+
const schemas2 = [z.object({ "kind": z.literal("metric"), "metric": z.enum(["clicks", "views", "completed_views", "viewed_seconds", "viewable_rate", "engagements", "follows", "saves", "profile_visits", "reach"]), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional(), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.").optional(), "reach_unit": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").optional(), "target_frequency": z.object({ "min": z.number().int().gte(1).optional(), "max": z.number().int().gte(1).optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.") }).passthrough().and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).optional(), "view_duration_seconds": z.number().gt(0).optional(), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough().and(z.intersection(z.union([z.any().refine((value) => !z.object({ "metric": z.literal("viewable_rate") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "metric": z.literal("viewable_rate") }), z.object({ "target": z.object({ "value": z.any().optional() }).optional() }))]), z.any())), z.object({ "kind": z.literal("event"), "event_sources": z.array(z.object({ "event_source_id": z.string().min(1), "event_type": z.enum(["page_view", "view_content", "select_content", "select_item", "search", "share", "add_to_cart", "remove_from_cart", "viewed_cart", "add_to_wishlist", "initiate_checkout", "add_payment_info", "purchase", "refund", "lead", "qualify_lead", "close_convert_lead", "disqualify_lead", "complete_registration", "subscribe", "follow", "content_view", "watch_milestone", "start_trial", "app_install", "app_launch", "contact", "schedule", "donate", "submit_application", "custom"]).describe("Standard marketing event types for event logging, aligned with IAB ECAPI"), "custom_event_name": z.string().min(1).optional(), "value_field": z.string().min(1).optional(), "value_factor": z.number().default(1) }).passthrough()).min(1), "target": z.object({ "kind": z.literal("maximize_value") }).passthrough().optional(), "attribution_window": z.object({ "post_click": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-click attribution window. Conversions occurring within this duration after a click are attributed to the ad.").optional(), "post_view": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-view attribution window. Conversions occurring within this duration after an ad impression (without click) are attributed to the ad.").optional(), "model": z.enum(["last_touch", "first_touch", "linear", "time_decay", "data_driven"]).describe("Attribution model used to assign credit when multiple touchpoints exist. SHOULD be populated when committing to a specific model; when absent, the seller's default applies.").optional() }).catchall(z.any()).describe("Describes the attribution methodology and lookback windows used for conversion measurement. Enables cross-platform comparison by making attribution methodology transparent. Used as a `$ref` from `optimization-goal.json` (buyer's optimization-time attribution choice), `get-media-buy-delivery-response.json` (seller-declared attribution methodology in delivery reports), and similar surfaces. All fields are optional individually but at least one of `post_click`, `post_view`, or `model` SHOULD be populated; absence of `model` means the seller's default attribution model applies (typically `last_touch` per industry convention) \u2014 sellers SHOULD populate `model` explicitly when committing to a specific methodology.").optional(), "priority": z.number().int().gte(1).optional() }).passthrough(), z.object({ "kind": z.literal("vendor_metric"), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "metric_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).min(1).max(64).describe("Identifier for a vendor-defined metric within the vendor's vocabulary. Stable lookup key; the vendor publishes the canonical list (with category, methodology, and standard alignment) in `brand.json` `agents[type='measurement']`. Lowercase with underscores so a future enum promotion into `available-metric.json` is a literal string lift. Identifier is namespaced by the vendor \u2014 the same `metric_id` may mean different things in different vendors' vocabularies."), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough()];
|
|
15209
15209
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
15210
15210
|
({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
|
|
15211
15211
|
errors: [...errors3, ...result.error.issues],
|
|
@@ -15279,7 +15279,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
15279
15279
|
});
|
|
15280
15280
|
}
|
|
15281
15281
|
})).describe("One metric the seller commits to report for a commercial product term. Vendor identity uses BrandKey so the compact lifecycle does not inline brand or provenance documents.")).min(1) }).passthrough()).min(1).describe("Binding reporting contract keyed by position in purchases. Amendments preserve prior entries and add metrics with effective_at; seller-assigned package IDs live in the execution binding, outside this digest.").optional(), "cancellation_terms": z.object({ "effective_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), "fee": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().optional(), "reason": z.string().min(1).max(500).optional() }).passthrough().optional(), "change_terms": z.array(z.object({ "term_id": z.string().regex(new RegExp("^[A-Za-z0-9_.:-]+$")), "action": z.enum(["pause", "resume", "cancel", "extend_flight", "shorten_flight", "update_flight_dates", "increase_budget", "decrease_budget", "reallocate_budget", "update_budget_allocation", "update_targeting", "update_pacing", "update_bidding", "update_frequency_caps", "update_media_buy_frequency_cap", "update_catalog_assignments", "update_keywords", "update_optimization_goals", "update_impression_goal", "update_spend_target", "update_reporting_webhook", "replace_creative", "update_creative_assignments", "remove_creative", "add_packages", "remove_packages"]).describe("Fine-grained MediaBuy action vocabulary for compact product and lifecycle surfaces. Deprecated coarse 3.x actions are absent."), "service_mode": z.enum(["self_serve", "conditional_self_serve", "seller_managed", "requires_approval"]).describe("How a seller honors a routed compact-lifecycle action."), "allowed_statuses": z.array(z.enum(["pending_creatives", "pending_start", "active", "paused"])).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Non-terminal MediaBuy statuses in which this negotiated right may be exercised. When absent, the right applies in every non-terminal status where the canonical action itself is meaningful. This field describes contractual lifecycle scope; available_actions[] remains authoritative for the current instant.").optional(), "processing_sla": z.object({ "response_max": z.string().regex(new RegExp("^P(?!$)(\\d+Y)?(\\d+M)?(\\d+D)?(T(\\d+H)?(\\d+M)?(\\d+S)?)?$")).describe("Maximum elapsed time from when the buyer issues the action to when the seller acknowledges receipt (mode-appropriate: synchronous response for self_serve, tolerance decision for conditional_self_serve, or queue acknowledgement for seller_managed and legacy requires_approval). Sellers include weekends and non-working periods in the maximum. ISO 8601 duration.").optional(), "completion_max": z.string().regex(new RegExp("^P(?!$)(\\d+Y)?(\\d+M)?(\\d+D)?(T(\\d+H)?(\\d+M)?(\\d+S)?)?$")).describe("Maximum elapsed time from buyer issuing the action to the seller completing it (mutation applied, proposal finalized, or seller-managed decision resolved). Sellers include weekends and non-working periods in the maximum. ISO 8601 duration.").optional() }).passthrough().describe("Binding elapsed-time acknowledgement and completion commitment. Sellers account for weekends and non-working periods when declaring the maximum.").optional(), "conditions": z.array(z.string().regex(new RegExp("^[A-Za-z0-9][A-Za-z0-9_.:-]{0,199}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Opaque stable condition identifiers defined by terms_ref or bilateral commercial documentation. Implementations compare identifiers; they MUST NOT execute or interpret them as instructions.").optional(), "constraints": z.any().superRefine((x, ctx) => {
|
|
15282
|
-
const schemas = [z.object({ "kind": z.literal("budget"), "max_delta_amount": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().describe("Maximum absolute amount by which the affected budget may change in the direction named by the action.").optional(), "max_delta_percent": z.number().gte(0).describe("Maximum percentage change relative to the current committed value. Values above 100 are valid for increases greater than the current value.").optional(), "min_result_amount": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().describe("Minimum resulting committed value after the change.").optional(), "max_result_amount": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().describe("Maximum resulting committed value after the change.").optional() }).passthrough().and(z.union([z.object({ "max_delta_amount": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_delta_percent": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "min_result_amount": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_result_amount": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])), z.object({ "kind": z.literal("flight"), "max_change": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("Maximum extension, shortening, or shift in the direction named by the action.").optional(), "earliest_result": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "latest_result": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "minimum_notice": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("Minimum elapsed notice before the requested flight change may take effect.").optional() }).passthrough().and(z.union([z.object({ "max_change": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "earliest_result": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "latest_result": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "minimum_notice": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])), z.object({ "kind": z.literal("package_count"), "max_additions": z.number().int().gte(0).describe("Maximum packages that may be added by one exercise of the right.").optional(), "max_removals": z.number().int().gte(0).describe("Maximum packages that may be removed by one exercise of the right.").optional(), "max_result_count": z.number().int().gte(0).describe("Maximum active package count after the change.").optional() }).passthrough().and(z.union([z.object({ "max_additions": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_removals": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_result_count": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])), z.object({ "kind": z.literal("effective_timing"), "minimum_notice": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("Minimum elapsed notice before pause, resume, cancellation, or another operational action may take effect.").optional(), "earliest_effective_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "latest_effective_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() }).passthrough().and(z.union([z.object({ "minimum_notice": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "earliest_effective_at": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "latest_effective_at": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]))];
|
|
15282
|
+
const schemas = [z.object({ "kind": z.literal("budget"), "max_delta_amount": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().describe("Maximum absolute amount by which the affected budget may change in the direction named by the action.").optional(), "max_delta_percent": z.number().gte(0).describe("Maximum percentage change relative to the current committed value. Values above 100 are valid for increases greater than the current value.").optional(), "min_result_amount": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().describe("Minimum resulting committed value after the change.").optional(), "max_result_amount": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().describe("Maximum resulting committed value after the change.").optional() }).passthrough().and(z.union([z.object({ "max_delta_amount": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_delta_percent": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "min_result_amount": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_result_amount": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")), z.object({ "kind": z.literal("flight"), "max_change": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("Maximum extension, shortening, or shift in the direction named by the action.").optional(), "earliest_result": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "latest_result": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "minimum_notice": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("Minimum elapsed notice before the requested flight change may take effect.").optional() }).passthrough().and(z.union([z.object({ "max_change": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "earliest_result": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "latest_result": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "minimum_notice": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")), z.object({ "kind": z.literal("package_count"), "max_additions": z.number().int().gte(0).describe("Maximum packages that may be added by one exercise of the right.").optional(), "max_removals": z.number().int().gte(0).describe("Maximum packages that may be removed by one exercise of the right.").optional(), "max_result_count": z.number().int().gte(0).describe("Maximum active package count after the change.").optional() }).passthrough().and(z.union([z.object({ "max_additions": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_removals": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_result_count": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")), z.object({ "kind": z.literal("effective_timing"), "minimum_notice": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("Minimum elapsed notice before pause, resume, cancellation, or another operational action may take effect.").optional(), "earliest_effective_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "latest_effective_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() }).passthrough().and(z.union([z.object({ "minimum_notice": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "earliest_effective_at": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "latest_effective_at": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives."))];
|
|
15283
15283
|
const { errors, failed } = schemas.reduce(
|
|
15284
15284
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
15285
15285
|
errors: [...errors2, ...result.error.issues],
|
|
@@ -15303,8 +15303,8 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
15303
15303
|
message: "Invalid input: Should pass single schema. Passed " + passed
|
|
15304
15304
|
});
|
|
15305
15305
|
}
|
|
15306
|
-
}).describe("Portable bounds that buyer and seller SDKs can preflight. Omission means no machine-readable bound was promised; opaque conditions remain unevaluated.").optional(), "terms_ref": z.string().min(1).max(1e3).describe("Stable contract reference. Resolving it cannot expand the typed right and MUST use the caller's normal authenticated contract-document path, never ambient seller credentials.").optional(), "description": z.string().min(1).max(1e3).describe("Display-only summary; it cannot grant authority, add an action, or override typed fields.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().describe("A proposal-bound buyer change right. It binds to the resulting media buy and account, not personally to the caller, and may be exercised by any caller admitted by both seller account authorization and applicable signed governance delegation.")).min(1).describe("Binding buyer change rights included in the commercial envelope and therefore covered by terms_digest. Entries are uniquely keyed by action. When this field is present, an omitted action is not a negotiated change right. Omission of the entire field means legacy-unspecified rights, not a prohibition.").optional() }).passthrough().describe("Complete typed commercial envelope for a compact-lifecycle proposal. This is the authoritative audit and refinement snapshot; allocations and narrative fields are explanatory views rather than substitutes for these terms."), "terms_digest": z.string().regex(new RegExp("^sha256:[A-Za-z0-9_-]{43}$")).describe("Base64url SHA-256 digest of the RFC 8785 JCS serialization of commercial_terms, prefixed with sha256:."), "insertion_order": z.object({ "io_id": z.string().max(255).describe("Unique identifier for this insertion order. Referenced by io_acceptance on create_media_buy."), "terms": z.object({ "advertiser": z.string().max(500).describe("Advertiser name or identifier").optional(), "publisher": z.string().max(500).describe("Publisher name or identifier").optional(), "total_budget": z.object({ "amount": z.number().gte(0), "currency": z.string().min(3).max(3).describe("ISO 4217 currency code") }).describe("Total committed budget").optional(), "flight_start": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "flight_end": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "payment_terms": z.enum(["net_30", "net_60", "net_90", "prepaid", "due_on_receipt"]).describe("Payment terms").optional() }).catchall(z.any()).describe("Summary fields echoed from the committed proposal for agent verification. Buyer agents use these to confirm the IO matches what was negotiated before a human signs. These are read-only summaries, not negotiation surfaces \u2014 deal terms live on products and packages.").optional(), "terms_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to a human-readable document containing the full insertion order terms").optional(), "signing_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to an electronic signing service (e.g., DocuSign) for human signature workflows. When present, a human must sign before the buyer agent can proceed with create_media_buy.").optional(), "requires_signature": z.boolean().describe("Whether the buyer must accept this IO before creating a media buy. When true, create_media_buy requires an io_acceptance referencing this io_id.") }).catchall(z.any()).describe("A signing wrapper attached to a committed proposal. The IO does not introduce new deal terms \u2014 all negotiated terms (performance standards, measurement terms, cancellation policy, pricing) live on the product and package. The IO exists for human signature workflows and provides summary fields so buyer agents can verify the IO matches the committed proposal before a human signs.").optional(), "total_budget_guidance": z.object({ "min": z.number().gte(0).optional(), "recommended": z.number().gte(0).optional(), "max": z.number().gte(0).optional(), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().and(z.union([z.object({ "recommended": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Optional budget guidance for this proposal \u2014 the planning answer to criteria.outcome_target and to open-budget briefs. commercial_terms.total_budget remains the concrete figure the plan is priced at; this band expresses the seller's recommended range around it. When criteria.outcome_target carries cost_per, the cost answer is commercial_terms.bidding.cost_per and this band's currency equals cost_per.currency.").optional(), "forecast": z.object({ "points": z.array(z.object({ "label": z.string().max(128).optional(), "budget": z.number().gte(0).optional(), "product_id": z.string().optional(), "dimensions": z.array(z.any().superRefine((x, ctx) => {
|
|
15307
|
-
const schemas = [z.object({ "kind": z.literal("geo").describe("Dimension family discriminator."), "geo_level": z.enum(["country", "region", "metro", "postal_area"]).describe("Geographic level for this forecast point."), "system": z.string().describe("Classification system for metro or postal_area levels. Required when geo_level is 'metro' or 'postal_area'. Metro rows use metro-system enum values such as 'nielsen_dma'; native postal rows use country-local postal-system enum values such as 'zip' with country 'US'; deprecated legacy postal rows may use legacy-postal-system enum values such as 'us_zip'. Omit for country and region rows.").optional(), "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code. Required for native postal_area rows and omitted for legacy postal rows, metro rows, country rows, and region rows.").optional(), "geo_code": z.string().describe("Geographic code within the level and system. Country: ISO 3166-1 alpha-2 ('US'). Region: ISO 3166-2 with country prefix ('US-CA'). Metro/postal: system-specific code ('501', '10001')."), "geo_name": z.string().describe("Human-readable geographic name (e.g., 'United States', 'California', 'New York DMA').").optional() }).passthrough().and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("country") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("country") }), z.object({ "geo_code": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code.").optional() }))]), z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("region") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("region") }), z.object({ "geo_code": z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$")).describe("ISO 3166-2 subdivision code.").optional() }))])), z.intersection(z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("metro") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("metro") }), z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')") }))]), z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("postal_area") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("postal_area") }), z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })])).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom."), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system.") })]))])))).describe("A geographic dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("placement").describe("Dimension family discriminator."), "placement_ref": z.object({ "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring a publisher-catalog placement is hosted, or the inventory publisher associated with an inline placement. Omitted only for legacy single-publisher product-context references.").optional(), "placement_id": z.string().describe("Placement ID from the publisher's adagents.json placement catalog, or an inline seller-defined placement ID interpreted within the enclosing seller and product context.") }).catchall(z.any()).describe("Structured placement reference for this forecast row. References an entry from the product's placements array."), "placement_name": z.string().describe("Human-readable placement name, useful when the buyer has not resolved the placement catalog.").optional() }).passthrough().describe("A placement dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("device_type").describe("Dimension family discriminator."), "device_type": z.enum(["desktop", "mobile", "tablet", "ctv", "dooh", "unknown"]).describe("Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) \u2192 mobile, 2 (PC) \u2192 desktop, 4 (Phone) \u2192 mobile, 5 (Tablet) \u2192 tablet, 6 (Connected Device) \u2192 ctv, 7 (Set Top Box) \u2192 ctv. DOOH inventory uses dooh.") }).passthrough().describe("A device form-factor dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("device_platform").describe("Dimension family discriminator."), "device_platform": z.enum(["ios", "android", "windows", "macos", "linux", "chromeos", "tvos", "tizen", "webos", "fire_os", "roku_os", "unknown"]).describe("Operating system platforms for device targeting. Browser values from Sec-CH-UA-Platform standard, extended for CTV.") }).passthrough().describe("An operating-system or platform dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("audience").describe("Dimension family discriminator."), "audience_id": z.string().describe("Audience segment identifier for this forecast row."), "audience_source": z.enum(["synced", "platform", "third_party", "lookalike", "retargeting", "unknown"]).describe("Origin of the audience segment."), "audience_name": z.string().describe("Human-readable audience segment name.").optional() }).passthrough().describe("An audience segment dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("signal").describe("Dimension family discriminator."), "signal_ref": z.any().superRefine((x2, ctx2) => {
|
|
15306
|
+
}).describe("Portable bounds that buyer and seller SDKs can preflight. Omission means no machine-readable bound was promised; opaque conditions remain unevaluated.").optional(), "terms_ref": z.string().min(1).max(1e3).describe("Stable contract reference. Resolving it cannot expand the typed right and MUST use the caller's normal authenticated contract-document path, never ambient seller credentials.").optional(), "description": z.string().min(1).max(1e3).describe("Display-only summary; it cannot grant authority, add an action, or override typed fields.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().describe("A proposal-bound buyer change right. It binds to the resulting media buy and account, not personally to the caller, and may be exercised by any caller admitted by both seller account authorization and applicable signed governance delegation.")).min(1).describe("Binding buyer change rights included in the commercial envelope and therefore covered by terms_digest. Entries are uniquely keyed by action. When this field is present, an omitted action is not a negotiated change right. Omission of the entire field means legacy-unspecified rights, not a prohibition.").optional() }).passthrough().describe("Complete typed commercial envelope for a compact-lifecycle proposal. This is the authoritative audit and refinement snapshot; allocations and narrative fields are explanatory views rather than substitutes for these terms."), "terms_digest": z.string().regex(new RegExp("^sha256:[A-Za-z0-9_-]{43}$")).describe("Base64url SHA-256 digest of the RFC 8785 JCS serialization of commercial_terms, prefixed with sha256:."), "insertion_order": z.object({ "io_id": z.string().max(255).describe("Unique identifier for this insertion order. Referenced by io_acceptance on create_media_buy."), "terms": z.object({ "advertiser": z.string().max(500).describe("Advertiser name or identifier").optional(), "publisher": z.string().max(500).describe("Publisher name or identifier").optional(), "total_budget": z.object({ "amount": z.number().gte(0), "currency": z.string().min(3).max(3).describe("ISO 4217 currency code") }).describe("Total committed budget").optional(), "flight_start": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "flight_end": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "payment_terms": z.enum(["net_30", "net_60", "net_90", "prepaid", "due_on_receipt"]).describe("Payment terms").optional() }).catchall(z.any()).describe("Summary fields echoed from the committed proposal for agent verification. Buyer agents use these to confirm the IO matches what was negotiated before a human signs. These are read-only summaries, not negotiation surfaces \u2014 deal terms live on products and packages.").optional(), "terms_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to a human-readable document containing the full insertion order terms").optional(), "signing_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to an electronic signing service (e.g., DocuSign) for human signature workflows. When present, a human must sign before the buyer agent can proceed with create_media_buy.").optional(), "requires_signature": z.boolean().describe("Whether the buyer must accept this IO before creating a media buy. When true, create_media_buy requires an io_acceptance referencing this io_id.") }).catchall(z.any()).describe("A signing wrapper attached to a committed proposal. The IO does not introduce new deal terms \u2014 all negotiated terms (performance standards, measurement terms, cancellation policy, pricing) live on the product and package. The IO exists for human signature workflows and provides summary fields so buyer agents can verify the IO matches the committed proposal before a human signs.").optional(), "total_budget_guidance": z.object({ "min": z.number().gte(0).optional(), "recommended": z.number().gte(0).optional(), "max": z.number().gte(0).optional(), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().and(z.union([z.object({ "recommended": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Optional budget guidance for this proposal \u2014 the planning answer to criteria.outcome_target and to open-budget briefs. commercial_terms.total_budget remains the concrete figure the plan is priced at; this band expresses the seller's recommended range around it. When criteria.outcome_target carries cost_per, the cost answer is commercial_terms.bidding.cost_per and this band's currency equals cost_per.currency.").optional(), "forecast": z.object({ "points": z.array(z.object({ "label": z.string().max(128).optional(), "budget": z.number().gte(0).optional(), "product_id": z.string().optional(), "dimensions": z.array(z.any().superRefine((x, ctx) => {
|
|
15307
|
+
const schemas = [z.object({ "kind": z.literal("geo").describe("Dimension family discriminator."), "geo_level": z.enum(["country", "region", "metro", "postal_area"]).describe("Geographic level for this forecast point."), "system": z.string().describe("Classification system for metro or postal_area levels. Required when geo_level is 'metro' or 'postal_area'. Metro rows use metro-system enum values such as 'nielsen_dma'; native postal rows use country-local postal-system enum values such as 'zip' with country 'US'; deprecated legacy postal rows may use legacy-postal-system enum values such as 'us_zip'. Omit for country and region rows.").optional(), "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code. Required for native postal_area rows and omitted for legacy postal rows, metro rows, country rows, and region rows.").optional(), "geo_code": z.string().describe("Geographic code within the level and system. Country: ISO 3166-1 alpha-2 ('US'). Region: ISO 3166-2 with country prefix ('US-CA'). Metro/postal: system-specific code ('501', '10001')."), "geo_name": z.string().describe("Human-readable geographic name (e.g., 'United States', 'California', 'New York DMA').").optional() }).passthrough().and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("country") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("country") }), z.object({ "geo_code": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code.").optional() }))]), z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("region") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("region") }), z.object({ "geo_code": z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$")).describe("ISO 3166-2 subdivision code.").optional() }))])), z.intersection(z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("metro") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("metro") }), z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')") }))]), z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("postal_area") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("postal_area") }), z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })]).describe("Must also satisfy at least one of these alternatives.")).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom."), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system.") })]))])))).describe("A geographic dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("placement").describe("Dimension family discriminator."), "placement_ref": z.object({ "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring a publisher-catalog placement is hosted, or the inventory publisher associated with an inline placement. Omitted only for legacy single-publisher product-context references.").optional(), "placement_id": z.string().describe("Placement ID from the publisher's adagents.json placement catalog, or an inline seller-defined placement ID interpreted within the enclosing seller and product context.") }).catchall(z.any()).describe("Structured placement reference for this forecast row. References an entry from the product's placements array."), "placement_name": z.string().describe("Human-readable placement name, useful when the buyer has not resolved the placement catalog.").optional() }).passthrough().describe("A placement dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("device_type").describe("Dimension family discriminator."), "device_type": z.enum(["desktop", "mobile", "tablet", "ctv", "dooh", "unknown"]).describe("Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) \u2192 mobile, 2 (PC) \u2192 desktop, 4 (Phone) \u2192 mobile, 5 (Tablet) \u2192 tablet, 6 (Connected Device) \u2192 ctv, 7 (Set Top Box) \u2192 ctv. DOOH inventory uses dooh.") }).passthrough().describe("A device form-factor dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("device_platform").describe("Dimension family discriminator."), "device_platform": z.enum(["ios", "android", "windows", "macos", "linux", "chromeos", "tvos", "tizen", "webos", "fire_os", "roku_os", "unknown"]).describe("Operating system platforms for device targeting. Browser values from Sec-CH-UA-Platform standard, extended for CTV.") }).passthrough().describe("An operating-system or platform dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("audience").describe("Dimension family discriminator."), "audience_id": z.string().describe("Audience segment identifier for this forecast row."), "audience_source": z.enum(["synced", "platform", "third_party", "lookalike", "retargeting", "unknown"]).describe("Origin of the audience segment."), "audience_name": z.string().describe("Human-readable audience segment name.").optional() }).passthrough().describe("An audience segment dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("signal").describe("Dimension family discriminator."), "signal_ref": z.any().superRefine((x2, ctx2) => {
|
|
15308
15308
|
const schemas2 = [z.object({ "scope": z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Product-local signal identifier. For local signals exposed on both get_signals and get_products, this MUST match get_signals.signals[].signal_ref.signal_id for the same signal.") }).catchall(z.any()).describe("Product-scoped signal. The signal_id is meaningful only within the selected product/package context and MUST match a Product.included_signals[].signal_ref.signal_id or Product.signal_targeting_options[].signal_ref.signal_id for that product, depending on whether the signal is descriptive or selectable."), z.object({ "scope": z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that publishes the signal definition in its adagents.json signals[]."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(z.any()).describe("Data-provider-scoped signal. The signal_id resolves through the data provider's published adagents.json signals[] and can be authorization-verified there."), z.object({ "scope": z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(z.any()).describe("Signal-source-scoped signal. Use this for source-native signals that are not published in upstream adagents.json signals[]. The buyer trusts the issuing signal source for this identity; use scope 'data_provider' instead when the signal is published in adagents.json signals[], even if the publisher is also the seller or signal source.")];
|
|
15309
15309
|
const { errors: errors2, failed: failed2 } = schemas2.reduce(
|
|
15310
15310
|
({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
|
|
@@ -15329,7 +15329,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
15329
15329
|
message: "Invalid input: Should pass single schema. Passed " + passed2
|
|
15330
15330
|
});
|
|
15331
15331
|
}
|
|
15332
|
-
}).describe("Canonical signal reference for this forecast row. Required when the row needs to disambiguate product-local, data-provider, or signal-source identity. Product-relative forecasts SHOULD use signal_ref.").optional(), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier shorthand for this forecast row. Use only when the enclosing context already identifies the signal unambiguously, such as a coverage_forecast nested directly under one get_signals signal item. Otherwise use signal_ref.").optional(), "signal_value": z.union([z.string().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value."), z.number().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value."), z.boolean().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value."), z.null().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value.")]).describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value.").optional(), "presence": z.enum(["present", "absent"]).describe("Whether the signal is present for this point. Use 'absent' for the explicit not-present bucket."), "signal_name": z.string().describe("Human-readable signal name, useful when the buyer has not resolved the signal definition.").optional(), "signal_value_name": z.string().describe("Human-readable label for the signal value bucket.").optional() }).passthrough().and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "presence": z.literal("absent") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "presence": z.literal("absent") }), z.object({ "signal_value": z.null() }))]), z.union([z.any().refine((value) => !z.object({ "presence": z.literal("present") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "presence": z.literal("present") }), z.object({ "signal_value": z.union([z.string(), z.number(), z.boolean()]).optional() }))]))).describe("A signal value or signal-presence dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("time").describe("Dimension family discriminator."), "start_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), "end_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time") }).passthrough().describe("A calendar-window dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules. Windows are half-open intervals [start_time, end_time): the row covers instants at or after start_time and strictly before end_time, so adjacent windows share a boundary without overlapping. end_time MUST be after start_time; JSON Schema draft-07 cannot compare sibling values, so conformance tooling enforces the ordering. Within one forecast, sellers MUST emit non-overlapping windows and SHOULD coalesce adjacent windows whose availability_status and metrics do not materially differ. When the request scoped the forecast with offer_filters.availability_horizon, a complete forecast partitions the requested horizon; a seller that cannot cover the full horizon signals the gap through the response's incomplete[] mechanism rather than silently omitting windows.")];
|
|
15332
|
+
}).describe("Canonical signal reference for this forecast row. Required when the row needs to disambiguate product-local, data-provider, or signal-source identity. Product-relative forecasts SHOULD use signal_ref.").optional(), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier shorthand for this forecast row. Use only when the enclosing context already identifies the signal unambiguously, such as a coverage_forecast nested directly under one get_signals signal item. Otherwise use signal_ref.").optional(), "signal_value": z.union([z.string().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value."), z.number().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value."), z.boolean().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value."), z.null().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value.")]).describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value.").optional(), "presence": z.enum(["present", "absent"]).describe("Whether the signal is present for this point. Use 'absent' for the explicit not-present bucket."), "signal_name": z.string().describe("Human-readable signal name, useful when the buyer has not resolved the signal definition.").optional(), "signal_value_name": z.string().describe("Human-readable label for the signal value bucket.").optional() }).passthrough().and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "presence": z.literal("absent") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "presence": z.literal("absent") }), z.object({ "signal_value": z.null() }))]), z.union([z.any().refine((value) => !z.object({ "presence": z.literal("present") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "presence": z.literal("present") }), z.object({ "signal_value": z.union([z.string(), z.number(), z.boolean()]).optional() }))]))).describe("A signal value or signal-presence dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("time").describe("Dimension family discriminator."), "start_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), "end_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time") }).passthrough().describe("A calendar-window dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules. Windows are half-open intervals [start_time, end_time): the row covers instants at or after start_time and strictly before end_time, so adjacent windows share a boundary without overlapping. end_time MUST be after start_time; JSON Schema draft-07 cannot compare sibling values, so conformance tooling enforces the ordering. Within one forecast, sellers MUST emit non-overlapping windows and SHOULD coalesce adjacent windows whose availability_status and metrics do not materially differ. When the request scoped the forecast with offer_filters.availability_horizon, a complete forecast partitions the requested horizon; a seller that cannot cover the full horizon signals the gap through the response's incomplete[] mechanism rather than silently omitting windows.")];
|
|
15333
15333
|
const { errors, failed } = schemas.reduce(
|
|
15334
15334
|
({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
|
|
15335
15335
|
errors: [...errors2, ...result.error.issues],
|
|
@@ -15353,7 +15353,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
|
|
|
15353
15353
|
message: "Invalid input: Should pass single schema. Passed " + passed
|
|
15354
15354
|
});
|
|
15355
15355
|
}
|
|
15356
|
-
})).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Dimension constraints represented by a ForecastPoint. Use this when one product, proposal, or signal coverage forecast needs to expose availability or forecasted delivery by country, region, placement, device, audience, signal value, time window, or intersections such as placement x country without creating separate products solely for each slice. Each item declares one dimension family via `kind`; when multiple items are present, the point represents their intersection. Sellers MUST NOT emit more than one item for each `kind` in a point. Consumers MUST NOT treat repeated kinds as OR semantics; repeated peer values such as two countries are a seller conformance issue. Dimension values are descriptors of the forecast row and are independent of pricing_options.").optional(), "availability_status": z.enum(["available", "unavailable"]).describe("Bookability of the inventory a forecast row describes, as of the forecast's generated_at. A snapshot, never a hold: valid_until bounds freshness, and proposal finalization or purchase remains the commitment boundary.").optional(), "metrics": z.object({ "coverage_rate": z.intersection(z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together."), z.object({ "low": z.any().optional(), "mid": z.any().optional(), "high": z.any().optional() })).describe("A forecast range whose low, midpoint, and high values are rates in the inclusive interval from 0 to 1.").optional() }).catchall(z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.")), "viewability": z.object({ "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.").optional(), "measurable_impressions": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "viewable_impressions": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "viewable_rate": z.intersection(z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together."), z.object({ "low": z.any().optional(), "mid": z.any().optional(), "high": z.any().optional() })).describe("A forecast range whose low, midpoint, and high values are rates in the inclusive interval from 0 to 1.").optional(), "viewed_seconds": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.union([z.object({ "measurable_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "viewable_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "viewable_rate": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "viewed_seconds": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "standard": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).optional(), "vendor_metric_values": z.array(z.object({ "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "metric_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).min(1).max(64).describe("Identifier for a vendor-defined metric within the vendor's vocabulary. Stable lookup key; the vendor publishes the canonical list (with category, methodology, and standard alignment) in `brand.json` `agents[type='measurement']`. Lowercase with underscores so a future enum promotion into `available-metric.json` is a literal string lift. Identifier is namespaced by the vendor \u2014 the same `metric_id` may mean different things in different vendors' vocabularies."), "value": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together."), "unit": z.string().optional(), "measurable_impressions": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "breakdown": z.record(z.string(), z.any()).optional() }).passthrough().describe("Compact forecasted vendor metric with a BrandKey vendor pointer and no embedded brand assets.")).optional() }).passthrough().describe("Compact forecast row with numeric ranges and identity-only measurement-vendor references.")).min(1), "forecast_range_unit": z.enum(["spend", "availability", "reach_freq", "weekly", "daily", "clicks", "conversions", "package"]).describe("Describes how to interpret the points array in a DeliveryForecast \u2014 what axis the curve represents").optional(), "method": z.enum(["estimate", "modeled", "guaranteed"]).describe("Method used to produce a delivery forecast"), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")), "demographic_system": z.enum(["nielsen", "nielsen_audio", "barb", "agf", "oztam", "mediametrie", "custom"]).describe("Audience measurement systems for demographic notation in GRP forecasts and pricing, across video and audio channels. Specifies how demographics are written, not whose panel produced the numbers \u2014 provider identity is measurement_source.").optional(), "demographic": z.string().optional(), "measurement_source": z.string().regex(new RegExp("^[a-z0-9_]+$")).max(64).optional(), "reach_unit": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").optional(), "generated_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "valid_until": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().describe("Compact product forecast without legacy BrandRef or creative dependencies.").describe("Aggregate forecasted delivery for the proposal. For outcome_target requests, points carry the goal's metric or event key in metrics; with cost_per, that is the goal volume planned under the commercial_terms.bidding policy, and currency equals cost_per.currency.").optional() }).passthrough().describe("Compact immutable proposal for the AdCP 3.2 lifecycle. commercial_terms is the sole authoritative commercial envelope; narrative fields do not duplicate legacy allocation or creative graphs.");
|
|
15356
|
+
})).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Dimension constraints represented by a ForecastPoint. Use this when one product, proposal, or signal coverage forecast needs to expose availability or forecasted delivery by country, region, placement, device, audience, signal value, time window, or intersections such as placement x country without creating separate products solely for each slice. Each item declares one dimension family via `kind`; when multiple items are present, the point represents their intersection. Sellers MUST NOT emit more than one item for each `kind` in a point. Consumers MUST NOT treat repeated kinds as OR semantics; repeated peer values such as two countries are a seller conformance issue. Dimension values are descriptors of the forecast row and are independent of pricing_options.").optional(), "availability_status": z.enum(["available", "unavailable"]).describe("Bookability of the inventory a forecast row describes, as of the forecast's generated_at. A snapshot, never a hold: valid_until bounds freshness, and proposal finalization or purchase remains the commitment boundary.").optional(), "metrics": z.object({ "coverage_rate": z.intersection(z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together."), z.object({ "low": z.any().optional(), "mid": z.any().optional(), "high": z.any().optional() })).describe("A forecast range whose low, midpoint, and high values are rates in the inclusive interval from 0 to 1.").optional() }).catchall(z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.")), "viewability": z.object({ "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.").optional(), "measurable_impressions": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "viewable_impressions": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "viewable_rate": z.intersection(z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together."), z.object({ "low": z.any().optional(), "mid": z.any().optional(), "high": z.any().optional() })).describe("A forecast range whose low, midpoint, and high values are rates in the inclusive interval from 0 to 1.").optional(), "viewed_seconds": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.union([z.object({ "measurable_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "viewable_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "viewable_rate": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "viewed_seconds": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "standard": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).optional(), "vendor_metric_values": z.array(z.object({ "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "metric_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).min(1).max(64).describe("Identifier for a vendor-defined metric within the vendor's vocabulary. Stable lookup key; the vendor publishes the canonical list (with category, methodology, and standard alignment) in `brand.json` `agents[type='measurement']`. Lowercase with underscores so a future enum promotion into `available-metric.json` is a literal string lift. Identifier is namespaced by the vendor \u2014 the same `metric_id` may mean different things in different vendors' vocabularies."), "value": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together."), "unit": z.string().optional(), "measurable_impressions": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "breakdown": z.record(z.string(), z.any()).optional() }).passthrough().describe("Compact forecasted vendor metric with a BrandKey vendor pointer and no embedded brand assets.")).optional() }).passthrough().describe("Compact forecast row with numeric ranges and identity-only measurement-vendor references.")).min(1), "forecast_range_unit": z.enum(["spend", "availability", "reach_freq", "weekly", "daily", "clicks", "conversions", "package"]).describe("Describes how to interpret the points array in a DeliveryForecast \u2014 what axis the curve represents").optional(), "method": z.enum(["estimate", "modeled", "guaranteed"]).describe("Method used to produce a delivery forecast"), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")), "demographic_system": z.enum(["nielsen", "nielsen_audio", "barb", "agf", "oztam", "mediametrie", "custom"]).describe("Audience measurement systems for demographic notation in GRP forecasts and pricing, across video and audio channels. Specifies how demographics are written, not whose panel produced the numbers \u2014 provider identity is measurement_source.").optional(), "demographic": z.string().optional(), "measurement_source": z.string().regex(new RegExp("^[a-z0-9_]+$")).max(64).optional(), "reach_unit": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").optional(), "generated_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "valid_until": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().describe("Compact product forecast without legacy BrandRef or creative dependencies.").describe("Aggregate forecasted delivery for the proposal. For outcome_target requests, points carry the goal's metric or event key in metrics; with cost_per, that is the goal volume planned under the commercial_terms.bidding policy, and currency equals cost_per.currency.").optional() }).passthrough().describe("Compact immutable proposal for the AdCP 3.2 lifecycle. commercial_terms is the sole authoritative commercial envelope; narrative fields do not duplicate legacy allocation or creative graphs.");
|
|
15357
15357
|
const exactSchema = objectSchema.superRefine((value, ctx) => {
|
|
15358
15358
|
const checked = z.intersection(z.intersection(z.union([z.any().refine((value2) => !z.object({ "proposal_kind": z.enum(["media_buy_update", "media_buy_cancellation"]) }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "proposal_kind": z.enum(["media_buy_update", "media_buy_cancellation"]) }), z.object({ "parent_proposal_id": z.any().refine((value2) => value2 !== void 0, "Required"), "media_buy_id": z.any().refine((value2) => value2 !== void 0, "Required"), "base_media_buy_revision": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough())]), z.union([z.any().refine((value2) => !z.object({ "proposal_status": z.literal("accepted") }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "proposal_status": z.literal("accepted") }), z.object({ "media_buy_id": z.any().refine((value2) => value2 !== void 0, "Required"), "accepted_at": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough())])), z.intersection(z.union([z.any().refine((value2) => !z.object({ "proposal_status": z.literal("committed") }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "proposal_status": z.literal("committed") }), z.object({ "expires_at": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough())]), z.union([z.any().refine((value2) => !z.object({ "proposal_kind": z.literal("media_buy_cancellation") }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "proposal_kind": z.literal("media_buy_cancellation") }), z.object({ "commercial_terms": z.object({ "cancellation_terms": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().optional() }))]))).safeParse(value);
|
|
15359
15359
|
if (!checked.success) {
|
|
@@ -16124,7 +16124,7 @@ const PackageStatusSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16124
16124
|
indicators: z.array(IndicatorSchema.and(z.object({
|
|
16125
16125
|
type: z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]).optional()
|
|
16126
16126
|
}).passthrough())).optional(),
|
|
16127
|
-
indicator_types_evaluated: z.array(IndicatorTypeSchema.and(z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]))).optional(),
|
|
16127
|
+
indicator_types_evaluated: z.array(IndicatorTypeSchema.and(z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]).describe("Must also satisfy at least one of these alternatives."))).optional(),
|
|
16128
16128
|
indicators_as_of: z.iso.datetime().optional(),
|
|
16129
16129
|
indicators_evaluated_scope: z.array(IndicatorScopeSchema).optional()
|
|
16130
16130
|
}).passthrough()).optional(),
|
|
@@ -16454,7 +16454,7 @@ const ProvidePerformanceFeedbackResponseSchema = /* @__PURE__ */ (() => z.object
|
|
|
16454
16454
|
payload: z.object({}).passthrough().optional(),
|
|
16455
16455
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
16456
16456
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
16457
|
-
}).passthrough().and(z.union([ProvidePerformanceFeedbackSuccessSchema, ProvidePerformanceFeedbackErrorSchema])))();
|
|
16457
|
+
}).passthrough().and(z.union([ProvidePerformanceFeedbackSuccessSchema, ProvidePerformanceFeedbackErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
16458
16458
|
const SyncEventSourcesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
16459
16459
|
context_id: z.string().optional(),
|
|
16460
16460
|
context: ContextObjectSchema.optional(),
|
|
@@ -16469,7 +16469,7 @@ const SyncEventSourcesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16469
16469
|
payload: z.object({}).passthrough().optional(),
|
|
16470
16470
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
16471
16471
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
16472
|
-
}).passthrough().and(z.union([SyncEventSourcesSuccessSchema, SyncEventSourcesErrorSchema])))();
|
|
16472
|
+
}).passthrough().and(z.union([SyncEventSourcesSuccessSchema, SyncEventSourcesErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
16473
16473
|
const LogEventResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
16474
16474
|
context_id: z.string().optional(),
|
|
16475
16475
|
context: ContextObjectSchema.optional(),
|
|
@@ -16484,7 +16484,7 @@ const LogEventResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16484
16484
|
payload: z.object({}).passthrough().optional(),
|
|
16485
16485
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
16486
16486
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
16487
|
-
}).passthrough().and(z.union([LogEventSuccessSchema, LogEventErrorSchema])))();
|
|
16487
|
+
}).passthrough().and(z.union([LogEventSuccessSchema, LogEventErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
16488
16488
|
const SyncAudiencesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
16489
16489
|
context_id: z.string().optional(),
|
|
16490
16490
|
context: ContextObjectSchema.optional(),
|
|
@@ -16499,7 +16499,7 @@ const SyncAudiencesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16499
16499
|
payload: z.object({}).passthrough().optional(),
|
|
16500
16500
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
16501
16501
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
16502
|
-
}).passthrough().and(z.union([SyncAudiencesSuccessSchema, SyncAudiencesErrorSchema, SyncAudiencesSubmittedSchema])))();
|
|
16502
|
+
}).passthrough().and(z.union([SyncAudiencesSuccessSchema, SyncAudiencesErrorSchema, SyncAudiencesSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
16503
16503
|
const BuildCreativeRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
16504
16504
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
16505
16505
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
@@ -16675,7 +16675,7 @@ const PreviewCreativeResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16675
16675
|
payload: z.object({}).passthrough().optional(),
|
|
16676
16676
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
16677
16677
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
16678
|
-
}).passthrough().and(z.union([PreviewCreativeSingleResponseSchema, PreviewCreativeBatchResponseSchema, PreviewCreativeVariantResponseSchema, PreviewCreativeSubmittedSchema])))();
|
|
16678
|
+
}).passthrough().and(z.union([PreviewCreativeSingleResponseSchema, PreviewCreativeBatchResponseSchema, PreviewCreativeVariantResponseSchema, PreviewCreativeSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
16679
16679
|
const ListTransformersResponseCreativeAgentSchema = /* @__PURE__ */ (() => z.object({
|
|
16680
16680
|
context_id: z.string().optional(),
|
|
16681
16681
|
context: ContextObjectSchema.optional(),
|
|
@@ -16820,7 +16820,7 @@ const ActivateSignalResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16820
16820
|
payload: z.object({}).passthrough().optional(),
|
|
16821
16821
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
16822
16822
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
16823
|
-
}).passthrough().and(z.union([ActivateSignalSuccessSchema, ActivateSignalErrorSchema])))();
|
|
16823
|
+
}).passthrough().and(z.union([ActivateSignalSuccessSchema, ActivateSignalErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
16824
16824
|
const CreatePropertyListResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
16825
16825
|
context_id: z.string().optional(),
|
|
16826
16826
|
context: ContextObjectSchema.optional(),
|
|
@@ -16880,7 +16880,7 @@ const ListContentStandardsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16880
16880
|
errors: z.array(ErrorSchema),
|
|
16881
16881
|
context: ContextObjectSchema.optional(),
|
|
16882
16882
|
ext: ExtensionObjectSchema.optional()
|
|
16883
|
-
}).passthrough()])))();
|
|
16883
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
16884
16884
|
const GetContentStandardsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
16885
16885
|
context_id: z.string().optional(),
|
|
16886
16886
|
context: ContextObjectSchema.optional(),
|
|
@@ -16913,7 +16913,7 @@ const GetContentStandardsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16913
16913
|
errors: z.array(ErrorSchema),
|
|
16914
16914
|
context: ContextObjectSchema.optional(),
|
|
16915
16915
|
ext: ExtensionObjectSchema.optional()
|
|
16916
|
-
}).passthrough()])))();
|
|
16916
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
16917
16917
|
const CreateContentStandardsRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
16918
16918
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
16919
16919
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
@@ -16955,7 +16955,7 @@ const UpdateContentStandardsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
16955
16955
|
payload: z.object({}).passthrough().optional(),
|
|
16956
16956
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
16957
16957
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
16958
|
-
}).passthrough().and(z.union([UpdateContentStandardsSuccessSchema, UpdateContentStandardsErrorSchema])))();
|
|
16958
|
+
}).passthrough().and(z.union([UpdateContentStandardsSuccessSchema, UpdateContentStandardsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
16959
16959
|
const GetCreativeFeaturesRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
16960
16960
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
16961
16961
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
@@ -17638,7 +17638,7 @@ const SyncGovernanceResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
17638
17638
|
payload: z.object({}).passthrough().optional(),
|
|
17639
17639
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
17640
17640
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
17641
|
-
}).passthrough().and(z.union([SyncGovernanceSuccessSchema, SyncGovernanceErrorSchema])))();
|
|
17641
|
+
}).passthrough().and(z.union([SyncGovernanceSuccessSchema, SyncGovernanceErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
17642
17642
|
const GetAccountFinancialsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
17643
17643
|
context_id: z.string().optional(),
|
|
17644
17644
|
context: ContextObjectSchema.optional(),
|
|
@@ -17653,7 +17653,7 @@ const GetAccountFinancialsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
17653
17653
|
payload: z.object({}).passthrough().optional(),
|
|
17654
17654
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
17655
17655
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
17656
|
-
}).passthrough().and(z.union([GetAccountFinancialsSuccessSchema, GetAccountFinancialsErrorSchema])))();
|
|
17656
|
+
}).passthrough().and(z.union([GetAccountFinancialsSuccessSchema, GetAccountFinancialsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
17657
17657
|
const GetProductsCompletionSchema = /* @__PURE__ */ (() => AdCPVersionEnvelopeSchema.merge(ProtocolEnvelopeSchema).merge(z.object({}).passthrough()).merge(z.object({
|
|
17658
17658
|
products: z.array(ProductSchema).optional(),
|
|
17659
17659
|
targeting_resolution: ProductDiscoveryTargetingResolutionSchema.optional(),
|
|
@@ -18228,7 +18228,7 @@ const UpdateMediaBuyResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18228
18228
|
payload: z.object({}).passthrough().optional(),
|
|
18229
18229
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
18230
18230
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
18231
|
-
}).passthrough().and(z.union([UpdateMediaBuySuccessSchema, UpdateMediaBuyErrorSchema, UpdateMediaBuySubmittedSchema])))();
|
|
18231
|
+
}).passthrough().and(z.union([UpdateMediaBuySuccessSchema, UpdateMediaBuyErrorSchema, UpdateMediaBuySubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18232
18232
|
const BuildCreativeResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
18233
18233
|
context_id: z.string().optional(),
|
|
18234
18234
|
context: ContextObjectSchema.optional(),
|
|
@@ -18243,7 +18243,7 @@ const BuildCreativeResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18243
18243
|
payload: z.object({}).passthrough().optional(),
|
|
18244
18244
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
18245
18245
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
18246
|
-
}).passthrough().and(z.union([BuildCreativeSuccessSchema, BuildCreativeMultiSuccessSchema, BuildCreativeVariantSuccessSchema, BuildCreativeEstimateSchema, BuildCreativeErrorSchema, BuildCreativeSubmittedSchema])))();
|
|
18246
|
+
}).passthrough().and(z.union([BuildCreativeSuccessSchema, BuildCreativeMultiSuccessSchema, BuildCreativeVariantSuccessSchema, BuildCreativeEstimateSchema, BuildCreativeErrorSchema, BuildCreativeSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18247
18247
|
const SyncCreativesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
18248
18248
|
context_id: z.string().optional(),
|
|
18249
18249
|
context: ContextObjectSchema.optional(),
|
|
@@ -18258,7 +18258,7 @@ const SyncCreativesResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18258
18258
|
payload: z.object({}).passthrough().optional(),
|
|
18259
18259
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
18260
18260
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
18261
|
-
}).passthrough().and(z.union([SyncCreativesSuccessSchema, SyncCreativesErrorSchema, SyncCreativesSubmittedSchema])))();
|
|
18261
|
+
}).passthrough().and(z.union([SyncCreativesSuccessSchema, SyncCreativesErrorSchema, SyncCreativesSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18262
18262
|
const CreateMediaBuySuccessSchema = /* @__PURE__ */ (() => z.object({
|
|
18263
18263
|
proposal_id: z.string().min(1).optional(),
|
|
18264
18264
|
media_buy_id: z.string(),
|
|
@@ -18300,7 +18300,7 @@ const AcquireRightsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18300
18300
|
payload: z.object({}).passthrough().optional(),
|
|
18301
18301
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
18302
18302
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
18303
|
-
}).passthrough().and(z.union([AcquireRightsAcquiredSchema, AcquireRightsPendingApprovalSchema, AcquireRightsRejectedSchema, AcquireRightsErrorSchema])))();
|
|
18303
|
+
}).passthrough().and(z.union([AcquireRightsAcquiredSchema, AcquireRightsPendingApprovalSchema, AcquireRightsRejectedSchema, AcquireRightsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18304
18304
|
const GetRightsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
18305
18305
|
context_id: z.string().optional(),
|
|
18306
18306
|
context: ContextObjectSchema.optional(),
|
|
@@ -18315,8 +18315,8 @@ const GetRightsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18315
18315
|
payload: z.object({}).passthrough().optional(),
|
|
18316
18316
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
18317
18317
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
18318
|
-
}).passthrough().and(z.union([GetRightsSuccessSchema, GetRightsErrorSchema])))();
|
|
18319
|
-
const SearchBrandsResponseSchema = /* @__PURE__ */ (() => AdCPVersionEnvelopeSchema.merge(ProtocolEnvelopeSchema).and(z.union([SearchBrandsSuccessSchema, SearchBrandsErrorSchema])))();
|
|
18318
|
+
}).passthrough().and(z.union([GetRightsSuccessSchema, GetRightsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18319
|
+
const SearchBrandsResponseSchema = /* @__PURE__ */ (() => AdCPVersionEnvelopeSchema.merge(ProtocolEnvelopeSchema).and(z.union([SearchBrandsSuccessSchema, SearchBrandsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18320
18320
|
const UpdateRightsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
18321
18321
|
context_id: z.string().optional(),
|
|
18322
18322
|
context: ContextObjectSchema.optional(),
|
|
@@ -18331,7 +18331,7 @@ const UpdateRightsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18331
18331
|
payload: z.object({}).passthrough().optional(),
|
|
18332
18332
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
18333
18333
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
18334
|
-
}).passthrough().and(z.union([UpdateRightsSuccessSchema, UpdateRightsErrorSchema])))();
|
|
18334
|
+
}).passthrough().and(z.union([UpdateRightsSuccessSchema, UpdateRightsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18335
18335
|
const VerifyBrandClaimResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
18336
18336
|
context_id: z.string().optional(),
|
|
18337
18337
|
context: ContextObjectSchema.optional(),
|
|
@@ -18346,7 +18346,7 @@ const VerifyBrandClaimResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18346
18346
|
payload: z.object({}).passthrough().optional(),
|
|
18347
18347
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
18348
18348
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
18349
|
-
}).passthrough().and(z.union([VerifyBrandClaimSuccessSchema, VerifyBrandClaimErrorSchema])))();
|
|
18349
|
+
}).passthrough().and(z.union([VerifyBrandClaimSuccessSchema, VerifyBrandClaimErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18350
18350
|
const VerifyBrandClaimsResponseBulkSchema = /* @__PURE__ */ (() => z.object({
|
|
18351
18351
|
context_id: z.string().optional(),
|
|
18352
18352
|
context: ContextObjectSchema.optional(),
|
|
@@ -18361,7 +18361,7 @@ const VerifyBrandClaimsResponseBulkSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18361
18361
|
payload: z.object({}).passthrough().optional(),
|
|
18362
18362
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
18363
18363
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
18364
|
-
}).passthrough().and(z.union([VerifyBrandClaimsSuccessSchema, VerifyBrandClaimsErrorSchema])))();
|
|
18364
|
+
}).passthrough().and(z.union([VerifyBrandClaimsSuccessSchema, VerifyBrandClaimsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18365
18365
|
const AppItemSchema = /* @__PURE__ */ (() => z.object({
|
|
18366
18366
|
app_id: z.string(),
|
|
18367
18367
|
name: z.string(),
|
|
@@ -18541,7 +18541,7 @@ const WholesaleFeedEventSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18541
18541
|
applies_to: CacheLayerScopeSchema,
|
|
18542
18542
|
affected_entity_type: z.union([z.literal("product"), z.literal("signal")])
|
|
18543
18543
|
}).passthrough().optional()
|
|
18544
|
-
}).passthrough()])))();
|
|
18544
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18545
18545
|
const WholesaleFeedWebhookSchema = /* @__PURE__ */ (() => z.object({
|
|
18546
18546
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|
|
18547
18547
|
notification_id: z.uuid(),
|
|
@@ -18609,7 +18609,7 @@ const ListProductsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18609
18609
|
replayed: z.literal(true).optional(),
|
|
18610
18610
|
context: ContextObjectSchema.optional(),
|
|
18611
18611
|
ext: ExtensionObjectSchema.optional()
|
|
18612
|
-
}).passthrough()])))();
|
|
18612
|
+
}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18613
18613
|
const BuyProductsResponseSchema = /* @__PURE__ */ (() => MediaBuyCommitmentResponseSchema)();
|
|
18614
18614
|
const AcceptProposalResponseSchema = /* @__PURE__ */ (() => MediaBuyCommitmentResponseSchema)();
|
|
18615
18615
|
const ExplicitPackagesWithFixedAllocationSchema = /* @__PURE__ */ (() => z.object({
|
|
@@ -18632,7 +18632,7 @@ const CreateMediaBuyResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18632
18632
|
payload: z.object({}).passthrough().optional(),
|
|
18633
18633
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
18634
18634
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
18635
|
-
}).passthrough().and(z.union([CreateMediaBuySuccessSchema, CreateMediaBuyErrorSchema, CreateMediaBuySubmittedSchema])))();
|
|
18635
|
+
}).passthrough().and(z.union([CreateMediaBuySuccessSchema, CreateMediaBuyErrorSchema, CreateMediaBuySubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
18636
18636
|
const UpdateMediaBuyRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
18637
18637
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
18638
18638
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
@@ -18781,7 +18781,7 @@ const GetReportingStatusResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
18781
18781
|
receipts: z.array(ReportingReceiptSchema).optional(),
|
|
18782
18782
|
errors: z.array(ErrorSchema).optional(),
|
|
18783
18783
|
ext: ExtensionObjectSchema.optional()
|
|
18784
|
-
}).passthrough().and(z.union([SuccessfulLookupSchema, FailedLookupSchema])).superRefine((value, ctx) => {
|
|
18784
|
+
}).passthrough().and(z.union([SuccessfulLookupSchema, FailedLookupSchema]).describe("Must also satisfy at least one of these alternatives.")).superRefine((value, ctx) => {
|
|
18785
18785
|
const closedStructures = { "scope": { "allowedFields": ["period_start", "period_end", "scope_closed", "media_buy_ids", "all_accessible_media_buys", "delivery_config_generations", "feed_purposes", "finality", "ledger_retained_from", "coverage_complete"], "requiredFields": ["period_start", "period_end", "scope_closed", "all_accessible_media_buys", "delivery_config_generations", "feed_purposes", "finality", "ledger_retained_from", "coverage_complete"] }, "deliveryConfigGeneration": { "allowedFields": ["delivery_config_id", "delivery_config_version", "feed_purpose"], "requiredFields": ["delivery_config_id", "delivery_config_version", "feed_purpose"] }, "obligationCounts": { "allowedFields": ["total", "waiting", "healthy", "delayed", "action_required", "complete", "consumer_status_pending"], "requiredFields": ["total", "waiting", "healthy", "delayed", "action_required", "complete"] }, "pagination": { "allowedFields": ["has_more", "cursor", "total_count"], "requiredFields": ["has_more"] }, "paginationRequiredByView": { "periods": ["has_more", "total_count"], "revision": ["has_more", "total_count"] } };
|
|
18786
18786
|
const addIssues = (schema, candidate, path) => {
|
|
18787
18787
|
const parsed = schema.safeParse(candidate);
|
|
@@ -18900,7 +18900,7 @@ const ListedCreativeNamedFormatReferenceSchema = /* @__PURE__ */ (() => z.object
|
|
|
18900
18900
|
indicators: z.array(IndicatorSchema.and(z.object({
|
|
18901
18901
|
type: z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]).optional()
|
|
18902
18902
|
}).passthrough())).optional(),
|
|
18903
|
-
indicator_types_evaluated: z.array(IndicatorTypeSchema.and(z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]))).optional(),
|
|
18903
|
+
indicator_types_evaluated: z.array(IndicatorTypeSchema.and(z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]).describe("Must also satisfy at least one of these alternatives."))).optional(),
|
|
18904
18904
|
indicators_as_of: z.iso.datetime().optional(),
|
|
18905
18905
|
indicators_evaluated_scope: z.array(IndicatorScopeSchema).optional()
|
|
18906
18906
|
}).passthrough()).optional()
|
|
@@ -18960,7 +18960,7 @@ const ListedCreativeCanonicalFormatKindSchema = /* @__PURE__ */ (() => z.object(
|
|
|
18960
18960
|
indicators: z.array(IndicatorSchema.and(z.object({
|
|
18961
18961
|
type: z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]).optional()
|
|
18962
18962
|
}).passthrough())).optional(),
|
|
18963
|
-
indicator_types_evaluated: z.array(IndicatorTypeSchema.and(z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]))).optional(),
|
|
18963
|
+
indicator_types_evaluated: z.array(IndicatorTypeSchema.and(z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]).describe("Must also satisfy at least one of these alternatives."))).optional(),
|
|
18964
18964
|
indicators_as_of: z.iso.datetime().optional(),
|
|
18965
18965
|
indicators_evaluated_scope: z.array(IndicatorScopeSchema).optional()
|
|
18966
18966
|
}).passthrough()).optional()
|
|
@@ -19023,7 +19023,7 @@ const SyncAccountsResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
19023
19023
|
payload: z.object({}).passthrough().optional(),
|
|
19024
19024
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
19025
19025
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
19026
|
-
}).passthrough().and(z.union([SyncAccountsSuccessSchema, SyncAccountsErrorSchema])))();
|
|
19026
|
+
}).passthrough().and(z.union([SyncAccountsSuccessSchema, SyncAccountsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
19027
19027
|
const ComplyTestControllerRequestSchema = /* @__PURE__ */ (() => z.object({
|
|
19028
19028
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
19029
19029
|
adcp_major_version: z.number().int().gte(1).lte(99).optional(),
|
|
@@ -19127,7 +19127,7 @@ const ComplyTestControllerResponseSchema = /* @__PURE__ */ (() => z.object({
|
|
|
19127
19127
|
payload: z.object({}).passthrough().optional(),
|
|
19128
19128
|
adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
|
|
19129
19129
|
adcp_major_version: z.number().int().gte(1).lte(99).optional()
|
|
19130
|
-
}).passthrough().and(z.union([ListScenariosSuccessSchema, StateTransitionSuccessSchema, SimulationSuccessSchema, ForcedDirectiveSuccessSchema, SeedSuccessSchema, ProvenanceAuditObservationsSuccessSchema, UpstreamTrafficSuccessSchema, ControllerErrorSchema])))();
|
|
19130
|
+
}).passthrough().and(z.union([ListScenariosSuccessSchema, StateTransitionSuccessSchema, SimulationSuccessSchema, ForcedDirectiveSuccessSchema, SeedSuccessSchema, ProvenanceAuditObservationsSuccessSchema, UpstreamTrafficSuccessSchema, ControllerErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
|
|
19131
19131
|
const AdCPAsyncResponseDataSchema = /* @__PURE__ */ (() => z.union([GetProductsResponseSchema, GetProductsRejectedSchema, GetProductsAsyncWorkingSchema, GetProductsAsyncInputRequiredSchema, GetProductsAsyncSubmittedSchema, RequestProposalsResponseSchema, RequestProposalsAsyncSubmittedSchema, RefineProposalsResponseSchema, RefineProposalsAsyncSubmittedSchema, DeclineProposalsResponseSchema, MediaBuyCommitmentResponseSchema, ControlMediaBuyResponseSchema, CompactTaskSubmittedSchema, CompactTaskWorkingSchema, CompactTaskInputRequiredSchema, GetSignalsResponseSchema, GetSignalsAsyncWorkingSchema, GetSignalsAsyncSubmittedSchema, CreateMediaBuyResponseSchema, CreateMediaBuyAsyncWorkingSchema, CreateMediaBuyAsyncInputRequiredSchema, CreateMediaBuyAsyncSubmittedSchema, UpdateMediaBuyResponseSchema, UpdateMediaBuyAsyncWorkingSchema, UpdateMediaBuyAsyncInputRequiredSchema, UpdateMediaBuyAsyncSubmittedSchema, MediaBuyDeliveryWebhookResultSchema, BuildCreativeResponseSchema, PreviewCreativeResponseSchema, BuildCreativeAsyncWorkingSchema, BuildCreativeAsyncInputRequiredSchema, BuildCreativeAsyncSubmittedSchema, GetCreativeFeaturesResponseSchema, GetCreativeFeaturesAsyncSubmittedSchema, SyncCreativesResponseSchema, SyncCreativesAsyncWorkingSchema, SyncCreativesAsyncInputRequiredSchema, SyncCreativesAsyncSubmittedSchema, SyncCatalogsResponseSchema, SyncCatalogsAsyncWorkingSchema, SyncCatalogsAsyncInputRequiredSchema, SyncCatalogsAsyncSubmittedSchema]))();
|
|
19132
19132
|
const MCPWebhookPayloadSchema = /* @__PURE__ */ (() => z.object({
|
|
19133
19133
|
idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
|