@adcp/sdk 16.3.0 → 16.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2027) hide show
  1. package/ADCP_VERSION +1 -1
  2. package/README.md +6 -2
  3. package/compliance/cache/{3.2.5 → 3.2.7}/domains/creative/scenarios/billing_out_of_band.yaml +1 -0
  4. package/compliance/cache/{3.2.5 → 3.2.7}/domains/creative/scenarios/canonical_supported_formats.yaml +2 -0
  5. package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/creative/scenarios/evaluator_auth.yaml +138 -55
  6. package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/creative/scenarios/native_in_feed.yaml +6 -0
  7. package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/governance/scenarios/property_list_change_webhook_signing.yaml +2 -0
  8. package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/media-buy/index.yaml +22 -0
  9. package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/media-buy/scenarios/availability_windows.yaml +15 -1
  10. package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/media-buy/scenarios/available_actions.yaml +9 -0
  11. package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/change_rights_state_projection.yaml +4 -0
  12. package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/media-buy/scenarios/creative_fate_after_cancellation.yaml +8 -0
  13. package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/media-buy/scenarios/creative_reception.yaml +2 -0
  14. package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/media-buy/scenarios/dependency_impairment.yaml +10 -0
  15. package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +15 -0
  16. package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/frequency_cap_capability_updates.yaml +14 -3
  17. package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/geo_place_targeting.yaml +39 -3
  18. package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/get_products_rejected.yaml +0 -2
  19. package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/media-buy/scenarios/inline_creatives_without_sync.yaml +14 -0
  20. package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/invalid_transitions.yaml +6 -0
  21. package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/inventory_list_no_match.yaml +2 -0
  22. package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/media-buy/scenarios/measurement_terms_accepted.yaml +2 -0
  23. package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/measurement_terms_rejected.yaml +2 -0
  24. package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/media_buy_frequency_cap_updates.yaml +12 -2
  25. package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/media-buy/scenarios/pending_creatives_to_start.yaml +5 -0
  26. package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/media-buy/scenarios/product_coverage_filters.yaml +1 -0
  27. package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/product_filter_behavior.yaml +18 -6
  28. package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/provenance_audit_observation.yaml +12 -5
  29. package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/media-buy/scenarios/provenance_enforcement.yaml +6 -0
  30. package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/media-buy/scenarios/provenance_truth_of_claim.yaml +16 -14
  31. package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/refine_frequency_cap_negotiation.yaml +3 -0
  32. package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/media-buy/scenarios/revenue_share_pricing.yaml +5 -0
  33. package/compliance/cache/{3.2.5/protocols → 3.2.7/domains}/media-buy/scenarios/total_budget_redistribution.yaml +51 -7
  34. package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/typed_proposal_negotiation.yaml +5 -0
  35. package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/vendor_metric_accountability.yaml +68 -5
  36. package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/state-machine.yaml +8 -0
  37. package/compliance/cache/{3.2.5 → 3.2.7}/domains/signals/index.yaml +1 -0
  38. package/compliance/cache/{3.2.5 → 3.2.7}/index.json +5 -3
  39. package/compliance/cache/{3.2.5 → 3.2.7}/protocols/creative/scenarios/billing_out_of_band.yaml +1 -0
  40. package/compliance/cache/{3.2.5 → 3.2.7}/protocols/creative/scenarios/canonical_supported_formats.yaml +2 -0
  41. package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/creative/scenarios/evaluator_auth.yaml +138 -55
  42. package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/creative/scenarios/native_in_feed.yaml +6 -0
  43. package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/governance/scenarios/property_list_change_webhook_signing.yaml +2 -0
  44. package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/media-buy/index.yaml +22 -0
  45. package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/media-buy/scenarios/availability_windows.yaml +15 -1
  46. package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/media-buy/scenarios/available_actions.yaml +9 -0
  47. package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/change_rights_state_projection.yaml +4 -0
  48. package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/media-buy/scenarios/creative_fate_after_cancellation.yaml +8 -0
  49. package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/media-buy/scenarios/creative_reception.yaml +2 -0
  50. package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/media-buy/scenarios/dependency_impairment.yaml +10 -0
  51. package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +15 -0
  52. package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/frequency_cap_capability_updates.yaml +14 -3
  53. package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/geo_place_targeting.yaml +39 -3
  54. package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/get_products_rejected.yaml +0 -2
  55. package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/media-buy/scenarios/inline_creatives_without_sync.yaml +14 -0
  56. package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/invalid_transitions.yaml +6 -0
  57. package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/inventory_list_no_match.yaml +2 -0
  58. package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/media-buy/scenarios/measurement_terms_accepted.yaml +2 -0
  59. package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +2 -0
  60. package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/media_buy_frequency_cap_updates.yaml +12 -2
  61. package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/media-buy/scenarios/pending_creatives_to_start.yaml +5 -0
  62. package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/media-buy/scenarios/product_coverage_filters.yaml +1 -0
  63. package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/product_filter_behavior.yaml +18 -6
  64. package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/provenance_audit_observation.yaml +12 -5
  65. package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/media-buy/scenarios/provenance_enforcement.yaml +6 -0
  66. package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/media-buy/scenarios/provenance_truth_of_claim.yaml +16 -14
  67. package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/refine_frequency_cap_negotiation.yaml +3 -0
  68. package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/media-buy/scenarios/revenue_share_pricing.yaml +5 -0
  69. package/compliance/cache/{3.2.5/domains → 3.2.7/protocols}/media-buy/scenarios/total_budget_redistribution.yaml +51 -7
  70. package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/typed_proposal_negotiation.yaml +5 -0
  71. package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +68 -5
  72. package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/state-machine.yaml +8 -0
  73. package/compliance/cache/{3.2.5 → 3.2.7}/protocols/signals/index.yaml +1 -0
  74. package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/audience-sync/index.yaml +3 -0
  75. package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/brand-rights/index.yaml +3 -0
  76. package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/buyer-monitoring/index.yaml +8 -0
  77. package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/collection-lists/index.yaml +5 -0
  78. package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/content-standards/index.yaml +9 -0
  79. package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/creative-generative/index.yaml +8 -0
  80. package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/creative-template/index.yaml +4 -0
  81. package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/creative-transformers/index.yaml +6 -0
  82. package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/governance-delivery-monitor/index.yaml +3 -0
  83. package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/governance-spend-authority/index.yaml +3 -0
  84. package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/property-lists/index.yaml +8 -0
  85. package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sales-dooh/index.yaml +71 -17
  86. package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sales-non-guaranteed/index.yaml +5 -0
  87. package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/signal-marketplace/index.yaml +5 -0
  88. package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/signal-owned/index.yaml +2 -0
  89. package/compliance/cache/3.2.7/test-kits/creative-build-probe-runner.yaml +127 -0
  90. package/compliance/cache/{3.2.5 → 3.2.7}/universal/canonical-format-validate-input.yaml +0 -16
  91. package/compliance/cache/{3.2.5 → 3.2.7}/universal/capability-discovery.yaml +8 -0
  92. package/compliance/cache/{3.2.5 → 3.2.7}/universal/collection-lists-pagination-integrity.yaml +5 -0
  93. package/compliance/cache/{3.2.5 → 3.2.7}/universal/content-standards-pagination-integrity.yaml +5 -0
  94. package/compliance/cache/{3.2.5 → 3.2.7}/universal/ctv-experience-validate-input.yaml +0 -14
  95. package/compliance/cache/{3.2.5 → 3.2.7}/universal/error-compliance-signals.yaml +6 -0
  96. package/compliance/cache/{3.2.5 → 3.2.7}/universal/error-compliance.yaml +9 -0
  97. package/compliance/cache/{3.2.5 → 3.2.7}/universal/get-media-buys-pagination-integrity.yaml +1 -0
  98. package/compliance/cache/{3.2.5 → 3.2.7}/universal/get-signals-pagination-integrity.yaml +2 -0
  99. package/compliance/cache/{3.2.5 → 3.2.7}/universal/premium-display-canonical-validation.yaml +0 -21
  100. package/compliance/cache/{3.2.5 → 3.2.7}/universal/property-lists-pagination-integrity.yaml +5 -0
  101. package/compliance/cache/{3.2.5 → 3.2.7}/universal/read-tool-idempotency.yaml +2 -0
  102. package/compliance/cache/{3.2.5 → 3.2.7}/universal/runner-output-contract.yaml +24 -1
  103. package/compliance/cache/{3.2.5 → 3.2.7}/universal/schema-validation-signals.yaml +2 -0
  104. package/compliance/cache/{3.2.5 → 3.2.7}/universal/schema-validation.yaml +5 -0
  105. package/compliance/cache/{3.2.5 → 3.2.7}/universal/stale-response-advisory.yaml +1 -0
  106. package/compliance/cache/{3.2.5 → 3.2.7}/universal/storyboard-schema.yaml +79 -0
  107. package/compliance/cache/3.2.7/universal/v4-compatibility.yaml +331 -0
  108. package/compliance/cache/{3.2.5 → 3.2.7}/universal/version-negotiation.yaml +9 -2
  109. package/compliance/cache/{3.2.5 → 3.2.7}/universal/webhook-emission.yaml +7 -0
  110. package/dist/lib/adapters/version/3.1/assignments.d.mts +12 -0
  111. package/dist/lib/adapters/version/3.1/assignments.d.ts +12 -0
  112. package/dist/lib/adapters/version/3.1/assignments.js +67 -0
  113. package/dist/lib/adapters/version/3.1/assignments.mjs +43 -0
  114. package/dist/lib/adapters/version/3.1/bidding.d.mts +3 -0
  115. package/dist/lib/adapters/version/3.1/bidding.d.ts +3 -0
  116. package/dist/lib/adapters/version/3.1/bidding.js +115 -0
  117. package/dist/lib/adapters/version/3.1/bidding.mjs +90 -0
  118. package/dist/lib/adapters/version/3.1/delivery.d.mts +7 -0
  119. package/dist/lib/adapters/version/3.1/delivery.d.ts +7 -0
  120. package/dist/lib/adapters/version/3.1/delivery.js +78 -0
  121. package/dist/lib/adapters/version/3.1/delivery.mjs +54 -0
  122. package/dist/lib/adapters/version/3.1/index.d.mts +3 -0
  123. package/dist/lib/adapters/version/3.1/index.d.ts +3 -0
  124. package/dist/lib/adapters/version/3.1/index.js +36 -0
  125. package/dist/lib/adapters/version/3.1/index.mjs +12 -0
  126. package/dist/lib/adapters/version/index.d.mts +59 -7
  127. package/dist/lib/adapters/version/index.d.ts +59 -7
  128. package/dist/lib/adapters/version/index.js +51 -2
  129. package/dist/lib/adapters/version/index.mjs +49 -1
  130. package/dist/lib/adapters/version/negotiate.d.mts +71 -0
  131. package/dist/lib/adapters/version/negotiate.d.ts +71 -0
  132. package/dist/lib/adapters/version/negotiate.js +101 -0
  133. package/dist/lib/adapters/version/negotiate.mjs +73 -0
  134. package/dist/lib/adapters/version/schema-projection.d.mts +33 -0
  135. package/dist/lib/adapters/version/schema-projection.d.ts +33 -0
  136. package/dist/lib/adapters/version/schema-projection.js +294 -0
  137. package/dist/lib/adapters/version/schema-projection.mjs +269 -0
  138. package/dist/lib/adapters/version/translate.d.mts +122 -0
  139. package/dist/lib/adapters/version/translate.d.ts +122 -0
  140. package/dist/lib/adapters/version/translate.js +169 -0
  141. package/dist/lib/adapters/version/translate.mjs +141 -0
  142. package/dist/lib/adapters/version/types.d.mts +51 -10
  143. package/dist/lib/adapters/version/types.d.ts +51 -10
  144. package/dist/lib/compliance-fixtures/canonical-storyboards-provenance.json +4 -4
  145. package/dist/lib/compliance-fixtures/canonical-storyboards.d.mts +2 -2
  146. package/dist/lib/compliance-fixtures/canonical-storyboards.d.ts +2 -2
  147. package/dist/lib/conformance/oracle.js +4 -7
  148. package/dist/lib/conformance/oracle.mjs +4 -7
  149. package/dist/lib/conformance/schemaLoader.js +35 -1
  150. package/dist/lib/conformance/schemaLoader.mjs +35 -1
  151. package/dist/lib/core/AgentClient.d.mts +1 -1
  152. package/dist/lib/core/AgentClient.d.ts +1 -1
  153. package/dist/lib/core/ConversationTypes.d.mts +9 -1
  154. package/dist/lib/core/ConversationTypes.d.ts +9 -1
  155. package/dist/lib/core/SingleAgentClient.d.mts +86 -0
  156. package/dist/lib/core/SingleAgentClient.d.ts +86 -0
  157. package/dist/lib/core/SingleAgentClient.js +357 -18
  158. package/dist/lib/core/SingleAgentClient.mjs +371 -20
  159. package/dist/lib/core/TaskExecutor.d.mts +1 -1
  160. package/dist/lib/core/TaskExecutor.d.ts +1 -1
  161. package/dist/lib/core/TaskExecutor.js +183 -39
  162. package/dist/lib/core/TaskExecutor.mjs +191 -39
  163. package/dist/lib/core/account-reduction.d.mts +36 -0
  164. package/dist/lib/core/account-reduction.d.ts +36 -0
  165. package/dist/lib/core/account-reduction.js +127 -0
  166. package/dist/lib/core/account-reduction.mjs +98 -0
  167. package/dist/lib/core/agent-discovery-cache.d.mts +2 -0
  168. package/dist/lib/core/agent-discovery-cache.d.ts +2 -0
  169. package/dist/lib/core/agent-discovery-cache.js +1 -0
  170. package/dist/lib/core/agent-discovery-cache.mjs +1 -0
  171. package/dist/lib/core/buyer-account-registry.d.mts +52 -0
  172. package/dist/lib/core/buyer-account-registry.d.ts +52 -0
  173. package/dist/lib/core/buyer-account-registry.js +142 -6
  174. package/dist/lib/core/buyer-account-registry.mjs +142 -6
  175. package/dist/lib/errors/index.js +1 -1
  176. package/dist/lib/errors/index.mjs +1 -1
  177. package/dist/lib/identity-3.3/trust.d.mts +20 -3
  178. package/dist/lib/identity-3.3/trust.d.ts +20 -3
  179. package/dist/lib/identity-3.3/trust.js +11 -2
  180. package/dist/lib/identity-3.3/trust.mjs +11 -2
  181. package/dist/lib/identity-3.3/types.d.mts +1 -1
  182. package/dist/lib/identity-3.3/types.d.ts +1 -1
  183. package/dist/lib/media-buy/action-contracts.js +4 -4
  184. package/dist/lib/media-buy/action-contracts.mjs +4 -4
  185. package/dist/lib/media-buy/action-types.d.mts +3 -2
  186. package/dist/lib/media-buy/action-types.d.ts +3 -2
  187. package/dist/lib/media-buy/update-fields.generated.d.mts +3 -2
  188. package/dist/lib/media-buy/update-fields.generated.d.ts +3 -2
  189. package/dist/lib/negotiation/commercial-terms-semantics.d.mts +1 -1
  190. package/dist/lib/negotiation/commercial-terms-semantics.d.ts +1 -1
  191. package/dist/lib/negotiation/commercial-terms-semantics.js +22 -0
  192. package/dist/lib/negotiation/commercial-terms-semantics.mjs +22 -0
  193. package/dist/lib/protocols/a2a.d.mts +3 -3
  194. package/dist/lib/protocols/a2a.d.ts +3 -3
  195. package/dist/lib/protocols/a2a.js +14 -8
  196. package/dist/lib/protocols/a2a.mjs +19 -9
  197. package/dist/lib/protocols/index.d.mts +12 -0
  198. package/dist/lib/protocols/index.d.ts +12 -0
  199. package/dist/lib/protocols/index.js +51 -35
  200. package/dist/lib/protocols/index.mjs +50 -34
  201. package/dist/lib/protocols/mcp-connection-policy.d.mts +12 -0
  202. package/dist/lib/protocols/mcp-connection-policy.d.ts +12 -0
  203. package/dist/lib/protocols/mcp-connection-policy.js +67 -0
  204. package/dist/lib/protocols/mcp-connection-policy.mjs +45 -0
  205. package/dist/lib/protocols/mcp-modern.js +9 -6
  206. package/dist/lib/protocols/mcp-modern.mjs +9 -6
  207. package/dist/lib/protocols/mcp-tasks.d.mts +17 -8
  208. package/dist/lib/protocols/mcp-tasks.d.ts +17 -8
  209. package/dist/lib/protocols/mcp-tasks.js +89 -40
  210. package/dist/lib/protocols/mcp-tasks.mjs +85 -40
  211. package/dist/lib/protocols/mcp.d.mts +3 -2
  212. package/dist/lib/protocols/mcp.d.ts +3 -2
  213. package/dist/lib/protocols/mcp.js +58 -14
  214. package/dist/lib/protocols/mcp.mjs +60 -14
  215. package/dist/lib/protocols/rawResponseCapture.js +20 -5
  216. package/dist/lib/protocols/rawResponseCapture.mjs +20 -5
  217. package/dist/lib/registry/types.generated.d.mts +9 -3
  218. package/dist/lib/registry/types.generated.d.ts +9 -3
  219. package/dist/lib/reporting/ledger/producer.js +4 -2
  220. package/dist/lib/reporting/ledger/producer.mjs +4 -2
  221. package/dist/lib/reporting/service/index.js +13 -1
  222. package/dist/lib/reporting/service/index.mjs +13 -1
  223. package/dist/lib/reporting/source/applicability.d.mts +23 -0
  224. package/dist/lib/reporting/source/applicability.d.ts +23 -0
  225. package/dist/lib/reporting/source/applicability.js +46 -0
  226. package/dist/lib/reporting/source/applicability.mjs +21 -0
  227. package/dist/lib/reporting/source/conformance.d.mts +1 -1
  228. package/dist/lib/reporting/source/conformance.d.ts +1 -1
  229. package/dist/lib/reporting/source/conformance.js +4 -1
  230. package/dist/lib/reporting/source/conformance.mjs +4 -1
  231. package/dist/lib/reporting/source/fixtures.d.mts +14 -0
  232. package/dist/lib/reporting/source/fixtures.d.ts +14 -0
  233. package/dist/lib/reporting/source/index.d.mts +1 -0
  234. package/dist/lib/reporting/source/index.d.ts +1 -0
  235. package/dist/lib/reporting/source/index.js +2 -0
  236. package/dist/lib/reporting/source/index.mjs +1 -0
  237. package/dist/lib/reporting/source/schemas/reporting-source-capabilities-v1.json +167 -59
  238. package/dist/lib/reporting/source/schemas/reporting-source-error-v1.json +1 -1
  239. package/dist/lib/reporting/source/schemas/reporting-source-offering-v1.json +167 -59
  240. package/dist/lib/reporting/source/schemas/reporting-source-slice-request-v1.json +4 -4
  241. package/dist/lib/reporting/source/schemas/source-batch-manifest-basic-v1.json +20 -20
  242. package/dist/lib/reporting/source/schemas/source-batch-manifest-v1.json +27 -27
  243. package/dist/lib/reporting/source/source.d.mts +106 -18
  244. package/dist/lib/reporting/source/source.d.ts +106 -18
  245. package/dist/lib/reporting/source/source.js +4 -5
  246. package/dist/lib/reporting/source/source.mjs +4 -5
  247. package/dist/lib/schemas-data/3.2/a2ui/bound-value.json +1 -1
  248. package/dist/lib/schemas-data/3.2/a2ui/component.json +1 -1
  249. package/dist/lib/schemas-data/3.2/a2ui/si-catalog.json +25 -25
  250. package/dist/lib/schemas-data/3.2/a2ui/surface.json +2 -2
  251. package/dist/lib/schemas-data/3.2/a2ui/user-action.json +1 -1
  252. package/dist/lib/schemas-data/3.2/aao/agent-publishers.json +1 -1
  253. package/dist/lib/schemas-data/3.2/account/get-account-financials-request.json +6 -6
  254. package/dist/lib/schemas-data/3.2/account/get-account-financials-response.json +12 -12
  255. package/dist/lib/schemas-data/3.2/account/list-account-changes-request.json +7 -7
  256. package/dist/lib/schemas-data/3.2/account/list-account-changes-response.json +7 -7
  257. package/dist/lib/schemas-data/3.2/account/list-accounts-request.json +6 -6
  258. package/dist/lib/schemas-data/3.2/account/list-accounts-response.json +8 -8
  259. package/dist/lib/schemas-data/3.2/account/report-usage-request.json +6 -6
  260. package/dist/lib/schemas-data/3.2/account/report-usage-response.json +6 -6
  261. package/dist/lib/schemas-data/3.2/account/sync-accounts-request.json +16 -16
  262. package/dist/lib/schemas-data/3.2/account/sync-accounts-response.json +21 -21
  263. package/dist/lib/schemas-data/3.2/account/sync-governance-request.json +5 -5
  264. package/dist/lib/schemas-data/3.2/account/sync-governance-response.json +10 -10
  265. package/dist/lib/schemas-data/3.2/adagents.json +30 -30
  266. package/dist/lib/schemas-data/3.2/brand/acquire-rights-request.json +13 -12
  267. package/dist/lib/schemas-data/3.2/brand/acquire-rights-response.json +16 -16
  268. package/dist/lib/schemas-data/3.2/brand/creative-approval-request.json +5 -5
  269. package/dist/lib/schemas-data/3.2/brand/creative-approval-response.json +12 -12
  270. package/dist/lib/schemas-data/3.2/brand/get-brand-identity-request.json +4 -4
  271. package/dist/lib/schemas-data/3.2/brand/get-brand-identity-response.json +10 -10
  272. package/dist/lib/schemas-data/3.2/brand/get-rights-request.json +8 -8
  273. package/dist/lib/schemas-data/3.2/brand/get-rights-response.json +11 -11
  274. package/dist/lib/schemas-data/3.2/brand/revocation-notification.json +4 -4
  275. package/dist/lib/schemas-data/3.2/brand/rights-pricing-option.json +5 -5
  276. package/dist/lib/schemas-data/3.2/brand/rights-terms.json +3 -3
  277. package/dist/lib/schemas-data/3.2/brand/search-brands-request.json +6 -6
  278. package/dist/lib/schemas-data/3.2/brand/search-brands-response.json +11 -11
  279. package/dist/lib/schemas-data/3.2/brand/update-rights-request.json +6 -6
  280. package/dist/lib/schemas-data/3.2/brand/update-rights-response.json +11 -11
  281. package/dist/lib/schemas-data/3.2/brand/verification-status.json +1 -1
  282. package/dist/lib/schemas-data/3.2/brand/verify-brand-claim-request.json +3 -3
  283. package/dist/lib/schemas-data/3.2/brand/verify-brand-claim-response.json +13 -13
  284. package/dist/lib/schemas-data/3.2/brand/verify-brand-claims-request.json +3 -3
  285. package/dist/lib/schemas-data/3.2/brand/verify-brand-claims-response.json +13 -13
  286. package/dist/lib/schemas-data/3.2/brand.json +23 -23
  287. package/dist/lib/schemas-data/3.2/bundled.schemas.br +0 -0
  288. package/dist/lib/schemas-data/3.2/collection/base-collection-source.json +3 -3
  289. package/dist/lib/schemas-data/3.2/collection/collection-list-changed-webhook.json +2 -2
  290. package/dist/lib/schemas-data/3.2/collection/collection-list-filters.json +7 -7
  291. package/dist/lib/schemas-data/3.2/collection/collection-list.json +5 -5
  292. package/dist/lib/schemas-data/3.2/collection/create-collection-list-request.json +8 -8
  293. package/dist/lib/schemas-data/3.2/collection/create-collection-list-response.json +6 -6
  294. package/dist/lib/schemas-data/3.2/collection/delete-collection-list-request.json +5 -5
  295. package/dist/lib/schemas-data/3.2/collection/delete-collection-list-response.json +5 -5
  296. package/dist/lib/schemas-data/3.2/collection/get-collection-list-request.json +5 -5
  297. package/dist/lib/schemas-data/3.2/collection/get-collection-list-response.json +12 -12
  298. package/dist/lib/schemas-data/3.2/collection/list-collection-lists-request.json +6 -6
  299. package/dist/lib/schemas-data/3.2/collection/list-collection-lists-response.json +7 -7
  300. package/dist/lib/schemas-data/3.2/collection/update-collection-list-request.json +8 -8
  301. package/dist/lib/schemas-data/3.2/collection/update-collection-list-response.json +6 -6
  302. package/dist/lib/schemas-data/3.2/content-standards/artifact-webhook-payload.json +3 -3
  303. package/dist/lib/schemas-data/3.2/content-standards/artifact.json +8 -8
  304. package/dist/lib/schemas-data/3.2/content-standards/calibrate-content-request.json +5 -5
  305. package/dist/lib/schemas-data/3.2/content-standards/calibrate-content-response.json +10 -10
  306. package/dist/lib/schemas-data/3.2/content-standards/content-standards.json +7 -7
  307. package/dist/lib/schemas-data/3.2/content-standards/create-content-standards-request.json +8 -8
  308. package/dist/lib/schemas-data/3.2/content-standards/create-content-standards-response.json +8 -8
  309. package/dist/lib/schemas-data/3.2/content-standards/get-content-standards-request.json +4 -4
  310. package/dist/lib/schemas-data/3.2/content-standards/get-content-standards-response.json +9 -9
  311. package/dist/lib/schemas-data/3.2/content-standards/get-media-buy-artifacts-request.json +5 -5
  312. package/dist/lib/schemas-data/3.2/content-standards/get-media-buy-artifacts-response.json +10 -10
  313. package/dist/lib/schemas-data/3.2/content-standards/list-content-standards-request.json +6 -6
  314. package/dist/lib/schemas-data/3.2/content-standards/list-content-standards-response.json +10 -10
  315. package/dist/lib/schemas-data/3.2/content-standards/update-content-standards-request.json +8 -8
  316. package/dist/lib/schemas-data/3.2/content-standards/update-content-standards-response.json +8 -8
  317. package/dist/lib/schemas-data/3.2/content-standards/validate-content-delivery-request.json +5 -5
  318. package/dist/lib/schemas-data/3.2/content-standards/validate-content-delivery-response.json +10 -10
  319. package/dist/lib/schemas-data/3.2/core/acceptance-policy-profile-ids.json +1 -1
  320. package/dist/lib/schemas-data/3.2/core/account-authorization.json +1 -1
  321. package/dist/lib/schemas-data/3.2/core/account-change-recorded-webhook.json +2 -2
  322. package/dist/lib/schemas-data/3.2/core/account-change.json +2 -2
  323. package/dist/lib/schemas-data/3.2/core/account-identity-change-preview.json +4 -4
  324. package/dist/lib/schemas-data/3.2/core/account-identity-change.json +3 -3
  325. package/dist/lib/schemas-data/3.2/core/account-ref.json +3 -3
  326. package/dist/lib/schemas-data/3.2/core/account-status-changed-webhook.json +4 -4
  327. package/dist/lib/schemas-data/3.2/core/account-timezone-capability.json +1 -1
  328. package/dist/lib/schemas-data/3.2/core/account-with-authorization.json +3 -3
  329. package/dist/lib/schemas-data/3.2/core/account.json +14 -14
  330. package/dist/lib/schemas-data/3.2/core/activation-key.json +1 -1
  331. package/dist/lib/schemas-data/3.2/core/ad-inventory-config.json +1 -1
  332. package/dist/lib/schemas-data/3.2/core/agent-encryption-key.json +1 -1
  333. package/dist/lib/schemas-data/3.2/core/agent-notification-config-state.json +4 -4
  334. package/dist/lib/schemas-data/3.2/core/agent-notification-config.json +5 -4
  335. package/dist/lib/schemas-data/3.2/core/agent-reporting-destination-state.json +4 -4
  336. package/dist/lib/schemas-data/3.2/core/agent-reporting-destination.json +8 -8
  337. package/dist/lib/schemas-data/3.2/core/agent-signing-key.json +1 -1
  338. package/dist/lib/schemas-data/3.2/core/agent-webhook-challenge.json +1 -1
  339. package/dist/lib/schemas-data/3.2/core/app-item.json +4 -4
  340. package/dist/lib/schemas-data/3.2/core/applicable-package-id.json +1 -1
  341. package/dist/lib/schemas-data/3.2/core/asset-group-vocabulary.json +1 -1
  342. package/dist/lib/schemas-data/3.2/core/assets/asset-union.json +22 -22
  343. package/dist/lib/schemas-data/3.2/core/assets/audio-asset.json +3 -3
  344. package/dist/lib/schemas-data/3.2/core/assets/brief-asset.json +2 -2
  345. package/dist/lib/schemas-data/3.2/core/assets/card-asset.json +6 -6
  346. package/dist/lib/schemas-data/3.2/core/assets/catalog-asset.json +2 -2
  347. package/dist/lib/schemas-data/3.2/core/assets/css-asset.json +2 -2
  348. package/dist/lib/schemas-data/3.2/core/assets/daast-asset.json +6 -6
  349. package/dist/lib/schemas-data/3.2/core/assets/daast-tracker-asset.json +5 -5
  350. package/dist/lib/schemas-data/3.2/core/assets/display-tag-asset.json +12 -12
  351. package/dist/lib/schemas-data/3.2/core/assets/html-asset.json +2 -2
  352. package/dist/lib/schemas-data/3.2/core/assets/image-asset.json +2 -2
  353. package/dist/lib/schemas-data/3.2/core/assets/javascript-asset.json +3 -3
  354. package/dist/lib/schemas-data/3.2/core/assets/markdown-asset.json +2 -2
  355. package/dist/lib/schemas-data/3.2/core/assets/pixel-tracker-asset.json +5 -5
  356. package/dist/lib/schemas-data/3.2/core/assets/published-post-asset.json +2 -2
  357. package/dist/lib/schemas-data/3.2/core/assets/text-asset.json +2 -2
  358. package/dist/lib/schemas-data/3.2/core/assets/url-asset.json +5 -5
  359. package/dist/lib/schemas-data/3.2/core/assets/vast-asset.json +6 -6
  360. package/dist/lib/schemas-data/3.2/core/assets/vast-tracker-asset.json +5 -5
  361. package/dist/lib/schemas-data/3.2/core/assets/video-asset.json +7 -7
  362. package/dist/lib/schemas-data/3.2/core/assets/webhook-asset.json +7 -7
  363. package/dist/lib/schemas-data/3.2/core/assets/zip-asset.json +2 -2
  364. package/dist/lib/schemas-data/3.2/core/async-response-data.json +43 -43
  365. package/dist/lib/schemas-data/3.2/core/async-response-refs/creative/get-creative-features-async-response-submitted.json +3 -3
  366. package/dist/lib/schemas-data/3.2/core/async-response-refs/creative/sync-creatives-async-response-input-required.json +3 -3
  367. package/dist/lib/schemas-data/3.2/core/async-response-refs/creative/sync-creatives-async-response-submitted.json +4 -4
  368. package/dist/lib/schemas-data/3.2/core/async-response-refs/creative/sync-creatives-async-response-working.json +3 -3
  369. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/accept-proposal-async-response-input-required.json +2 -2
  370. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/accept-proposal-async-response-submitted.json +2 -2
  371. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/accept-proposal-async-response-working.json +2 -2
  372. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/build-creative-async-response-input-required.json +4 -4
  373. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/build-creative-async-response-submitted.json +4 -4
  374. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/build-creative-async-response-working.json +3 -3
  375. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/buy-products-async-response-input-required.json +2 -2
  376. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/buy-products-async-response-submitted.json +2 -2
  377. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/buy-products-async-response-working.json +2 -2
  378. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/control-media-buy-async-response-input-required.json +2 -2
  379. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/control-media-buy-async-response-submitted.json +2 -2
  380. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/control-media-buy-async-response-working.json +2 -2
  381. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/create-media-buy-async-response-input-required.json +4 -4
  382. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/create-media-buy-async-response-submitted.json +4 -4
  383. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/create-media-buy-async-response-working.json +3 -3
  384. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/decline-proposals-async-response-input-required.json +2 -2
  385. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/decline-proposals-async-response-submitted.json +2 -2
  386. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/decline-proposals-async-response-working.json +2 -2
  387. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/get-products-async-response-input-required.json +4 -4
  388. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/get-products-async-response-submitted.json +4 -4
  389. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/get-products-async-response-working.json +3 -3
  390. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/refine-proposals-async-response-input-required.json +2 -2
  391. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/refine-proposals-async-response-submitted.json +2 -2
  392. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/refine-proposals-async-response-working.json +2 -2
  393. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/request-proposals-async-response-input-required.json +2 -2
  394. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/request-proposals-async-response-submitted.json +2 -2
  395. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/request-proposals-async-response-working.json +2 -2
  396. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/sync-catalogs-async-response-input-required.json +3 -3
  397. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/sync-catalogs-async-response-submitted.json +4 -4
  398. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/sync-catalogs-async-response-working.json +3 -3
  399. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/update-media-buy-async-response-input-required.json +3 -3
  400. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/update-media-buy-async-response-submitted.json +4 -4
  401. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/update-media-buy-async-response-working.json +3 -3
  402. package/dist/lib/schemas-data/3.2/core/async-response-refs/signals/get-signals-async-response-submitted.json +4 -4
  403. package/dist/lib/schemas-data/3.2/core/async-response-refs/signals/get-signals-async-response-working.json +3 -3
  404. package/dist/lib/schemas-data/3.2/core/attestation-capabilities.json +5 -5
  405. package/dist/lib/schemas-data/3.2/core/attestation-evaluation.json +2 -2
  406. package/dist/lib/schemas-data/3.2/core/attestation-issuer.json +5 -5
  407. package/dist/lib/schemas-data/3.2/core/attestation-reference.json +7 -7
  408. package/dist/lib/schemas-data/3.2/core/attestation-subject.json +5 -5
  409. package/dist/lib/schemas-data/3.2/core/attribution-window.json +4 -4
  410. package/dist/lib/schemas-data/3.2/core/audience-activation-method.json +6 -6
  411. package/dist/lib/schemas-data/3.2/core/audience-characteristic.json +1 -1
  412. package/dist/lib/schemas-data/3.2/core/audience-evidence-pin.json +2 -2
  413. package/dist/lib/schemas-data/3.2/core/audience-evidence-requirements.json +10 -10
  414. package/dist/lib/schemas-data/3.2/core/audience-evidence-selection.json +5 -5
  415. package/dist/lib/schemas-data/3.2/core/audience-evidence.json +10 -10
  416. package/dist/lib/schemas-data/3.2/core/audience-member.json +3 -3
  417. package/dist/lib/schemas-data/3.2/core/audience-selector.json +7 -7
  418. package/dist/lib/schemas-data/3.2/core/audience-source.json +3 -3
  419. package/dist/lib/schemas-data/3.2/core/authorized-agent-base.json +3 -3
  420. package/dist/lib/schemas-data/3.2/core/bidding-policy-capability.json +1 -1
  421. package/dist/lib/schemas-data/3.2/core/bidding-policy.json +1 -1
  422. package/dist/lib/schemas-data/3.2/core/brand-id.json +1 -1
  423. package/dist/lib/schemas-data/3.2/core/brand-key.json +2 -2
  424. package/dist/lib/schemas-data/3.2/core/brand-ref.json +3 -3
  425. package/dist/lib/schemas-data/3.2/core/brand-response-authorization-result.json +1 -1
  426. package/dist/lib/schemas-data/3.2/core/budget-allocation.json +2 -2
  427. package/dist/lib/schemas-data/3.2/core/budget-range.json +1 -1
  428. package/dist/lib/schemas-data/3.2/core/business-entity.json +2 -2
  429. package/dist/lib/schemas-data/3.2/core/cancellation-policy.json +2 -2
  430. package/dist/lib/schemas-data/3.2/core/canonical-account-ref.json +3 -3
  431. package/dist/lib/schemas-data/3.2/core/canonical-audience-evidence-selection.json +3 -3
  432. package/dist/lib/schemas-data/3.2/core/canonical-audience-evidence.json +8 -8
  433. package/dist/lib/schemas-data/3.2/core/canonical-budget-allocation.json +2 -2
  434. package/dist/lib/schemas-data/3.2/core/canonical-delivery-forecast.json +7 -7
  435. package/dist/lib/schemas-data/3.2/core/canonical-forecast-point.json +12 -12
  436. package/dist/lib/schemas-data/3.2/core/canonical-forecast-vendor-metric-value.json +5 -5
  437. package/dist/lib/schemas-data/3.2/core/canonical-format-kind.json +1 -1
  438. package/dist/lib/schemas-data/3.2/core/canonical-format-option.json +6 -6
  439. package/dist/lib/schemas-data/3.2/core/canonical-measurement-terms.json +3 -3
  440. package/dist/lib/schemas-data/3.2/core/canonical-media-buy-action-fields.json +6 -6
  441. package/dist/lib/schemas-data/3.2/core/canonical-media-buy-action.json +4 -4
  442. package/dist/lib/schemas-data/3.2/core/canonical-media-buy-features.json +2 -2
  443. package/dist/lib/schemas-data/3.2/core/canonical-metric-qualifier.json +6 -6
  444. package/dist/lib/schemas-data/3.2/core/canonical-optimization-goal.json +9 -9
  445. package/dist/lib/schemas-data/3.2/core/canonical-performance-standard.json +4 -4
  446. package/dist/lib/schemas-data/3.2/core/canonical-placement.json +9 -9
  447. package/dist/lib/schemas-data/3.2/core/canonical-pricing-option.json +5 -5
  448. package/dist/lib/schemas-data/3.2/core/canonical-product-action.json +6 -6
  449. package/dist/lib/schemas-data/3.2/core/canonical-product.json +31 -31
  450. package/dist/lib/schemas-data/3.2/core/canonical-projection-ref.json +3 -3
  451. package/dist/lib/schemas-data/3.2/core/canonical-projection-slot-override.json +1 -1
  452. package/dist/lib/schemas-data/3.2/core/canonical-proposal.json +5 -5
  453. package/dist/lib/schemas-data/3.2/core/canonical-reporting-capabilities.json +11 -11
  454. package/dist/lib/schemas-data/3.2/core/canonical-reporting-commitment.json +6 -6
  455. package/dist/lib/schemas-data/3.2/core/canvas-constraint.json +1 -1
  456. package/dist/lib/schemas-data/3.2/core/capabilities-changed-webhook.json +2 -2
  457. package/dist/lib/schemas-data/3.2/core/catalog-field-mapping.json +2 -2
  458. package/dist/lib/schemas-data/3.2/core/catalog-item-availability-error.json +3 -3
  459. package/dist/lib/schemas-data/3.2/core/catalog-item-availability-ref.json +1 -1
  460. package/dist/lib/schemas-data/3.2/core/catalog-item-availability-state.json +4 -4
  461. package/dist/lib/schemas-data/3.2/core/catalog-item-availability-update-result.json +4 -4
  462. package/dist/lib/schemas-data/3.2/core/catalog-item-availability-update.json +2 -2
  463. package/dist/lib/schemas-data/3.2/core/catalog-item-delivery-metrics.json +3 -3
  464. package/dist/lib/schemas-data/3.2/core/catalog-item-reference-not-found-error.json +1 -1
  465. package/dist/lib/schemas-data/3.2/core/catalog-selection.json +7 -7
  466. package/dist/lib/schemas-data/3.2/core/catalog.json +7 -7
  467. package/dist/lib/schemas-data/3.2/core/catchment.json +5 -5
  468. package/dist/lib/schemas-data/3.2/core/collection-delivery-metrics.json +3 -3
  469. package/dist/lib/schemas-data/3.2/core/collection-distribution.json +3 -3
  470. package/dist/lib/schemas-data/3.2/core/collection-list-ref.json +1 -1
  471. package/dist/lib/schemas-data/3.2/core/collection-property-delivery-metrics.json +5 -5
  472. package/dist/lib/schemas-data/3.2/core/collection-ref.json +1 -1
  473. package/dist/lib/schemas-data/3.2/core/collection-selection.json +4 -4
  474. package/dist/lib/schemas-data/3.2/core/collection-selector.json +1 -1
  475. package/dist/lib/schemas-data/3.2/core/collection.json +13 -13
  476. package/dist/lib/schemas-data/3.2/core/committed-metric.json +14 -14
  477. package/dist/lib/schemas-data/3.2/core/compact-task-input-required.json +4 -4
  478. package/dist/lib/schemas-data/3.2/core/compact-task-submitted.json +6 -6
  479. package/dist/lib/schemas-data/3.2/core/compact-task-working.json +3 -3
  480. package/dist/lib/schemas-data/3.2/core/content-rating.json +2 -2
  481. package/dist/lib/schemas-data/3.2/core/context.json +1 -1
  482. package/dist/lib/schemas-data/3.2/core/creative-approval-scope.json +3 -3
  483. package/dist/lib/schemas-data/3.2/core/creative-asset.json +13 -13
  484. package/dist/lib/schemas-data/3.2/core/creative-assets.json +3 -3
  485. package/dist/lib/schemas-data/3.2/core/creative-assignment.json +2 -2
  486. package/dist/lib/schemas-data/3.2/core/creative-brief.json +4 -4
  487. package/dist/lib/schemas-data/3.2/core/creative-consumption.json +1 -1
  488. package/dist/lib/schemas-data/3.2/core/creative-delivery-metrics.json +2 -2
  489. package/dist/lib/schemas-data/3.2/core/creative-filters.json +9 -8
  490. package/dist/lib/schemas-data/3.2/core/creative-item.json +1 -1
  491. package/dist/lib/schemas-data/3.2/core/creative-locale-policy.json +2 -2
  492. package/dist/lib/schemas-data/3.2/core/creative-localization-readback.json +6 -6
  493. package/dist/lib/schemas-data/3.2/core/creative-localization.json +6 -6
  494. package/dist/lib/schemas-data/3.2/core/creative-manifest.json +13 -13
  495. package/dist/lib/schemas-data/3.2/core/creative-operation-format-declaration.json +7 -7
  496. package/dist/lib/schemas-data/3.2/core/creative-policy.json +3 -3
  497. package/dist/lib/schemas-data/3.2/core/creative-representation-set.json +4 -4
  498. package/dist/lib/schemas-data/3.2/core/creative-representation.json +2 -2
  499. package/dist/lib/schemas-data/3.2/core/creative-revision-id.json +1 -1
  500. package/dist/lib/schemas-data/3.2/core/creative-variable.json +1 -1
  501. package/dist/lib/schemas-data/3.2/core/creative-variant.json +6 -6
  502. package/dist/lib/schemas-data/3.2/core/daast-tracker-constraints.json +2 -2
  503. package/dist/lib/schemas-data/3.2/core/data-provider-signal-selector.json +1 -1
  504. package/dist/lib/schemas-data/3.2/core/date-range.json +1 -1
  505. package/dist/lib/schemas-data/3.2/core/datetime-range.json +1 -1
  506. package/dist/lib/schemas-data/3.2/core/daypart-target.json +3 -3
  507. package/dist/lib/schemas-data/3.2/core/deadline-policy.json +1 -1
  508. package/dist/lib/schemas-data/3.2/core/delivery-breakdown-controls.json +3 -3
  509. package/dist/lib/schemas-data/3.2/core/delivery-forecast.json +7 -7
  510. package/dist/lib/schemas-data/3.2/core/delivery-metric-aggregate.json +14 -14
  511. package/dist/lib/schemas-data/3.2/core/delivery-metrics.json +11 -11
  512. package/dist/lib/schemas-data/3.2/core/delivery-provider.json +1 -1
  513. package/dist/lib/schemas-data/3.2/core/delivery-recipient.json +2 -2
  514. package/dist/lib/schemas-data/3.2/core/demographic-age-range.json +1 -1
  515. package/dist/lib/schemas-data/3.2/core/demographic-predicate.json +2 -2
  516. package/dist/lib/schemas-data/3.2/core/demographic-reporting-capability.json +4 -4
  517. package/dist/lib/schemas-data/3.2/core/demographic-targeting-capability.json +4 -4
  518. package/dist/lib/schemas-data/3.2/core/demographic-targeting-intent.json +4 -4
  519. package/dist/lib/schemas-data/3.2/core/demographic-targeting-resolution.json +10 -10
  520. package/dist/lib/schemas-data/3.2/core/deployment.json +3 -3
  521. package/dist/lib/schemas-data/3.2/core/destination-item.json +4 -4
  522. package/dist/lib/schemas-data/3.2/core/destination.json +1 -1
  523. package/dist/lib/schemas-data/3.2/core/diagnostic-issue.json +1 -1
  524. package/dist/lib/schemas-data/3.2/core/downstream-connection-requirement.json +1 -1
  525. package/dist/lib/schemas-data/3.2/core/duration.json +1 -1
  526. package/dist/lib/schemas-data/3.2/core/education-item.json +4 -4
  527. package/dist/lib/schemas-data/3.2/core/error.json +1 -1
  528. package/dist/lib/schemas-data/3.2/core/evaluator-spec.json +5 -5
  529. package/dist/lib/schemas-data/3.2/core/event-custom-data.json +2 -2
  530. package/dist/lib/schemas-data/3.2/core/event-source-health.json +3 -3
  531. package/dist/lib/schemas-data/3.2/core/event-surface.json +2 -2
  532. package/dist/lib/schemas-data/3.2/core/event.json +8 -8
  533. package/dist/lib/schemas-data/3.2/core/experimental-feature-id.json +1 -1
  534. package/dist/lib/schemas-data/3.2/core/ext.json +1 -1
  535. package/dist/lib/schemas-data/3.2/core/feature-requirement.json +1 -1
  536. package/dist/lib/schemas-data/3.2/core/flight-item.json +4 -4
  537. package/dist/lib/schemas-data/3.2/core/forecast-dimension-audience.json +2 -2
  538. package/dist/lib/schemas-data/3.2/core/forecast-dimension-device-platform.json +2 -2
  539. package/dist/lib/schemas-data/3.2/core/forecast-dimension-device-type.json +2 -2
  540. package/dist/lib/schemas-data/3.2/core/forecast-dimension-geo.json +5 -5
  541. package/dist/lib/schemas-data/3.2/core/forecast-dimension-placement.json +2 -2
  542. package/dist/lib/schemas-data/3.2/core/forecast-dimension-signal.json +2 -2
  543. package/dist/lib/schemas-data/3.2/core/forecast-dimension-time.json +1 -1
  544. package/dist/lib/schemas-data/3.2/core/forecast-point-dimensions.json +8 -8
  545. package/dist/lib/schemas-data/3.2/core/forecast-point.json +28 -28
  546. package/dist/lib/schemas-data/3.2/core/forecast-range.json +1 -1
  547. package/dist/lib/schemas-data/3.2/core/forecast-rate-range.json +2 -2
  548. package/dist/lib/schemas-data/3.2/core/forecast-vendor-metric-value.json +7 -7
  549. package/dist/lib/schemas-data/3.2/core/format-id.json +1 -1
  550. package/dist/lib/schemas-data/3.2/core/format-option-ref.json +1 -1
  551. package/dist/lib/schemas-data/3.2/core/format-shape-vocabulary.json +1 -1
  552. package/dist/lib/schemas-data/3.2/core/format.json +49 -45
  553. package/dist/lib/schemas-data/3.2/core/frequency-cap-constraints.json +8 -8
  554. package/dist/lib/schemas-data/3.2/core/frequency-cap-duration-unit.json +1 -1
  555. package/dist/lib/schemas-data/3.2/core/frequency-cap-impression-constraints.json +2 -2
  556. package/dist/lib/schemas-data/3.2/core/frequency-cap-interval-constraints.json +3 -3
  557. package/dist/lib/schemas-data/3.2/core/frequency-cap-requirements.json +6 -6
  558. package/dist/lib/schemas-data/3.2/core/frequency-cap.json +4 -4
  559. package/dist/lib/schemas-data/3.2/core/generation-credential.json +3 -3
  560. package/dist/lib/schemas-data/3.2/core/geo-breakdown-support.json +3 -3
  561. package/dist/lib/schemas-data/3.2/core/geo-delivery-metrics.json +6 -6
  562. package/dist/lib/schemas-data/3.2/core/geo-metro.json +2 -2
  563. package/dist/lib/schemas-data/3.2/core/geo-place-area.json +4 -4
  564. package/dist/lib/schemas-data/3.2/core/geo-place-catalog-capability.json +2 -2
  565. package/dist/lib/schemas-data/3.2/core/geo-place-catalog-entry.json +3 -3
  566. package/dist/lib/schemas-data/3.2/core/geo-place-requirement.json +3 -3
  567. package/dist/lib/schemas-data/3.2/core/geo-place-resolver.json +1 -1
  568. package/dist/lib/schemas-data/3.2/core/geo-place-support.json +3 -3
  569. package/dist/lib/schemas-data/3.2/core/geo-place-system.json +1 -1
  570. package/dist/lib/schemas-data/3.2/core/geo-place-type.json +1 -1
  571. package/dist/lib/schemas-data/3.2/core/geo-region-requirement.json +1 -1
  572. package/dist/lib/schemas-data/3.2/core/geo-region-support.json +2 -2
  573. package/dist/lib/schemas-data/3.2/core/get-geo-place-resolution-request.json +3 -3
  574. package/dist/lib/schemas-data/3.2/core/get-geo-place-resolution-response.json +4 -4
  575. package/dist/lib/schemas-data/3.2/core/hotel-item.json +4 -4
  576. package/dist/lib/schemas-data/3.2/core/iana-timezone.json +1 -1
  577. package/dist/lib/schemas-data/3.2/core/identifier.json +2 -2
  578. package/dist/lib/schemas-data/3.2/core/impairment.json +3 -3
  579. package/dist/lib/schemas-data/3.2/core/indicator-bearing.json +4 -4
  580. package/dist/lib/schemas-data/3.2/core/indicator-scope.json +1 -1
  581. package/dist/lib/schemas-data/3.2/core/indicator.json +4 -4
  582. package/dist/lib/schemas-data/3.2/core/indicators-changed-webhook.json +3 -3
  583. package/dist/lib/schemas-data/3.2/core/industry-identifier.json +2 -2
  584. package/dist/lib/schemas-data/3.2/core/insertion-order.json +1 -1
  585. package/dist/lib/schemas-data/3.2/core/installment-deadlines.json +2 -2
  586. package/dist/lib/schemas-data/3.2/core/installment-delivery-metrics.json +3 -3
  587. package/dist/lib/schemas-data/3.2/core/installment-property-delivery-metrics.json +5 -5
  588. package/dist/lib/schemas-data/3.2/core/installment-ref.json +2 -2
  589. package/dist/lib/schemas-data/3.2/core/installment.json +10 -10
  590. package/dist/lib/schemas-data/3.2/core/inventory-list-application.json +1 -1
  591. package/dist/lib/schemas-data/3.2/core/job-item.json +3 -3
  592. package/dist/lib/schemas-data/3.2/core/keyword-delivery-metrics.json +3 -3
  593. package/dist/lib/schemas-data/3.2/core/keyword-target.json +2 -2
  594. package/dist/lib/schemas-data/3.2/core/limited-series.json +1 -1
  595. package/dist/lib/schemas-data/3.2/core/locale-tag.json +1 -1
  596. package/dist/lib/schemas-data/3.2/core/localized-creative-asset.json +3 -3
  597. package/dist/lib/schemas-data/3.2/core/macro-bearing-url.json +1 -1
  598. package/dist/lib/schemas-data/3.2/core/macro-declaration.json +10 -10
  599. package/dist/lib/schemas-data/3.2/core/macro-encoding.json +1 -1
  600. package/dist/lib/schemas-data/3.2/core/macro-resolution-capability.json +8 -8
  601. package/dist/lib/schemas-data/3.2/core/macro-resolution-result.json +10 -10
  602. package/dist/lib/schemas-data/3.2/core/macro-translation-target.json +7 -7
  603. package/dist/lib/schemas-data/3.2/core/material-deadline.json +1 -1
  604. package/dist/lib/schemas-data/3.2/core/mcp-webhook-payload.json +6 -6
  605. package/dist/lib/schemas-data/3.2/core/measurement-readiness.json +5 -5
  606. package/dist/lib/schemas-data/3.2/core/measurement-terms.json +3 -3
  607. package/dist/lib/schemas-data/3.2/core/measurement-window.json +1 -1
  608. package/dist/lib/schemas-data/3.2/core/media-buy-available-action-id.json +2 -2
  609. package/dist/lib/schemas-data/3.2/core/media-buy-available-action.json +7 -7
  610. package/dist/lib/schemas-data/3.2/core/media-buy-change-term-id.json +1 -1
  611. package/dist/lib/schemas-data/3.2/core/media-buy-features.json +3 -2
  612. package/dist/lib/schemas-data/3.2/core/media-buy-frequency-cap-capability.json +3 -3
  613. package/dist/lib/schemas-data/3.2/core/media-buy-frequency-cap-requirement.json +3 -3
  614. package/dist/lib/schemas-data/3.2/core/media-buy-frequency-cap-support.json +3 -3
  615. package/dist/lib/schemas-data/3.2/core/media-buy-frequency-cap.json +2 -2
  616. package/dist/lib/schemas-data/3.2/core/media-buy-legacy-terms-ref.json +1 -1
  617. package/dist/lib/schemas-data/3.2/core/media-buy-support-requirements.json +2 -2
  618. package/dist/lib/schemas-data/3.2/core/media-buy-support.json +3 -3
  619. package/dist/lib/schemas-data/3.2/core/media-buy.json +14 -14
  620. package/dist/lib/schemas-data/3.2/core/missing-metric.json +14 -14
  621. package/dist/lib/schemas-data/3.2/core/negative-keyword.json +2 -2
  622. package/dist/lib/schemas-data/3.2/core/notification-config.json +4 -3
  623. package/dist/lib/schemas-data/3.2/core/offering-asset-group.json +16 -16
  624. package/dist/lib/schemas-data/3.2/core/offering.json +5 -5
  625. package/dist/lib/schemas-data/3.2/core/operator-identity.json +2 -2
  626. package/dist/lib/schemas-data/3.2/core/operator-unit.json +1 -1
  627. package/dist/lib/schemas-data/3.2/core/opportunity-context.json +2 -2
  628. package/dist/lib/schemas-data/3.2/core/optimization-goal.json +9 -9
  629. package/dist/lib/schemas-data/3.2/core/outcome-measurement.json +2 -2
  630. package/dist/lib/schemas-data/3.2/core/outcome-target-cost-per.json +2 -2
  631. package/dist/lib/schemas-data/3.2/core/overlay.json +1 -1
  632. package/dist/lib/schemas-data/3.2/core/package-delivery-metric-value.json +2 -2
  633. package/dist/lib/schemas-data/3.2/core/package-format-snapshot.json +5 -5
  634. package/dist/lib/schemas-data/3.2/core/package-signal-targeting-group.json +2 -2
  635. package/dist/lib/schemas-data/3.2/core/package-signal-targeting-groups.json +2 -2
  636. package/dist/lib/schemas-data/3.2/core/package-signal-targeting.json +3 -3
  637. package/dist/lib/schemas-data/3.2/core/package-targeting-resolution.json +3 -3
  638. package/dist/lib/schemas-data/3.2/core/package.json +24 -23
  639. package/dist/lib/schemas-data/3.2/core/pagination-request.json +1 -1
  640. package/dist/lib/schemas-data/3.2/core/pagination-response.json +1 -1
  641. package/dist/lib/schemas-data/3.2/core/performance-feedback-assertion.json +8 -8
  642. package/dist/lib/schemas-data/3.2/core/performance-feedback-metric.json +14 -14
  643. package/dist/lib/schemas-data/3.2/core/performance-feedback.json +17 -17
  644. package/dist/lib/schemas-data/3.2/core/performance-standard.json +4 -4
  645. package/dist/lib/schemas-data/3.2/core/placement-definition.json +15 -15
  646. package/dist/lib/schemas-data/3.2/core/placement-delivery-metrics.json +3 -3
  647. package/dist/lib/schemas-data/3.2/core/placement-evidence.json +1 -1
  648. package/dist/lib/schemas-data/3.2/core/placement-identity.json +2 -2
  649. package/dist/lib/schemas-data/3.2/core/placement-presentation.json +1 -1
  650. package/dist/lib/schemas-data/3.2/core/placement-property-delivery-metrics.json +5 -5
  651. package/dist/lib/schemas-data/3.2/core/placement-ref.json +1 -1
  652. package/dist/lib/schemas-data/3.2/core/placement-selection.json +5 -5
  653. package/dist/lib/schemas-data/3.2/core/placement.json +11 -10
  654. package/dist/lib/schemas-data/3.2/core/planned-delivery.json +8 -8
  655. package/dist/lib/schemas-data/3.2/core/platform-extension-ref.json +1 -1
  656. package/dist/lib/schemas-data/3.2/core/positive-postal-area-support.json +2 -2
  657. package/dist/lib/schemas-data/3.2/core/postal-area-support.json +2 -2
  658. package/dist/lib/schemas-data/3.2/core/postal-area.json +4 -4
  659. package/dist/lib/schemas-data/3.2/core/postal-country-system.json +2 -2
  660. package/dist/lib/schemas-data/3.2/core/presentation-ref.json +1 -1
  661. package/dist/lib/schemas-data/3.2/core/preview-provider.json +1 -1
  662. package/dist/lib/schemas-data/3.2/core/preview-renderer-metadata.json +1 -1
  663. package/dist/lib/schemas-data/3.2/core/price.json +1 -1
  664. package/dist/lib/schemas-data/3.2/core/pricing-option.json +11 -11
  665. package/dist/lib/schemas-data/3.2/core/principal-changed-webhook.json +2 -2
  666. package/dist/lib/schemas-data/3.2/core/principal-declarations-state.json +3 -3
  667. package/dist/lib/schemas-data/3.2/core/principal-declarations.json +2 -2
  668. package/dist/lib/schemas-data/3.2/core/principal-state.json +4 -4
  669. package/dist/lib/schemas-data/3.2/core/product-allocation.json +5 -5
  670. package/dist/lib/schemas-data/3.2/core/product-allowed-action.json +6 -6
  671. package/dist/lib/schemas-data/3.2/core/product-audience-evidence-requirements.json +13 -13
  672. package/dist/lib/schemas-data/3.2/core/product-card-reference-asset.json +5 -5
  673. package/dist/lib/schemas-data/3.2/core/product-change-map.json +1 -1
  674. package/dist/lib/schemas-data/3.2/core/product-execution-requirement.json +7 -7
  675. package/dist/lib/schemas-data/3.2/core/product-filters.json +37 -36
  676. package/dist/lib/schemas-data/3.2/core/product-format-declaration.json +22 -22
  677. package/dist/lib/schemas-data/3.2/core/product-identity.json +1 -1
  678. package/dist/lib/schemas-data/3.2/core/product-offer-filters.json +26 -26
  679. package/dist/lib/schemas-data/3.2/core/product-signal-targeting-option.json +3 -3
  680. package/dist/lib/schemas-data/3.2/core/product-targeting-resolution.json +3 -3
  681. package/dist/lib/schemas-data/3.2/core/product.json +55 -54
  682. package/dist/lib/schemas-data/3.2/core/property-delivery-metrics.json +4 -4
  683. package/dist/lib/schemas-data/3.2/core/property-id.json +1 -1
  684. package/dist/lib/schemas-data/3.2/core/property-list-ref.json +1 -1
  685. package/dist/lib/schemas-data/3.2/core/property-ref.json +2 -2
  686. package/dist/lib/schemas-data/3.2/core/property-tag.json +1 -1
  687. package/dist/lib/schemas-data/3.2/core/property.json +6 -6
  688. package/dist/lib/schemas-data/3.2/core/proposal.json +9 -9
  689. package/dist/lib/schemas-data/3.2/core/protocol-envelope.json +5 -5
  690. package/dist/lib/schemas-data/3.2/core/provenance.json +9 -9
  691. package/dist/lib/schemas-data/3.2/core/publisher-property-selector.json +3 -3
  692. package/dist/lib/schemas-data/3.2/core/push-notification-config.json +3 -2
  693. package/dist/lib/schemas-data/3.2/core/real-estate-item.json +4 -4
  694. package/dist/lib/schemas-data/3.2/core/reference-asset.json +1 -1
  695. package/dist/lib/schemas-data/3.2/core/reference-renderer.json +1 -1
  696. package/dist/lib/schemas-data/3.2/core/registry-event.json +16 -15
  697. package/dist/lib/schemas-data/3.2/core/registry-feed-response.json +2 -2
  698. package/dist/lib/schemas-data/3.2/core/reporting-adjustment-receipt.json +1 -1
  699. package/dist/lib/schemas-data/3.2/core/reporting-adjustment.json +2 -2
  700. package/dist/lib/schemas-data/3.2/core/reporting-canonical-content-digest.json +1 -1
  701. package/dist/lib/schemas-data/3.2/core/reporting-canonicalization-contract.json +1 -1
  702. package/dist/lib/schemas-data/3.2/core/reporting-capabilities.json +12 -12
  703. package/dist/lib/schemas-data/3.2/core/reporting-consumer-status.json +1 -1
  704. package/dist/lib/schemas-data/3.2/core/reporting-control-total.json +1 -1
  705. package/dist/lib/schemas-data/3.2/core/reporting-coverage.json +1 -1
  706. package/dist/lib/schemas-data/3.2/core/reporting-dataset-share-destination.json +1 -1
  707. package/dist/lib/schemas-data/3.2/core/reporting-delivery-capabilities.json +3 -3
  708. package/dist/lib/schemas-data/3.2/core/reporting-delivery-config-state.json +4 -4
  709. package/dist/lib/schemas-data/3.2/core/reporting-delivery-config.json +7 -7
  710. package/dist/lib/schemas-data/3.2/core/reporting-delivery-method.json +4 -4
  711. package/dist/lib/schemas-data/3.2/core/reporting-delivery-offering-id.json +1 -1
  712. package/dist/lib/schemas-data/3.2/core/reporting-delivery-offering.json +8 -8
  713. package/dist/lib/schemas-data/3.2/core/reporting-delivery-ready-webhook.json +3 -3
  714. package/dist/lib/schemas-data/3.2/core/reporting-file-compression.json +1 -1
  715. package/dist/lib/schemas-data/3.2/core/reporting-file-entry.json +3 -3
  716. package/dist/lib/schemas-data/3.2/core/reporting-file-manifest.json +4 -4
  717. package/dist/lib/schemas-data/3.2/core/reporting-file-object-ref.json +1 -1
  718. package/dist/lib/schemas-data/3.2/core/reporting-ledger-changed-webhook.json +3 -3
  719. package/dist/lib/schemas-data/3.2/core/reporting-materialization.json +4 -4
  720. package/dist/lib/schemas-data/3.2/core/reporting-native-version-ref.json +1 -1
  721. package/dist/lib/schemas-data/3.2/core/reporting-obligation.json +9 -9
  722. package/dist/lib/schemas-data/3.2/core/reporting-receipt.json +5 -5
  723. package/dist/lib/schemas-data/3.2/core/reporting-reconciliation-mode.json +1 -1
  724. package/dist/lib/schemas-data/3.2/core/reporting-reliability-statistics.json +1 -1
  725. package/dist/lib/schemas-data/3.2/core/reporting-report-definition.json +1 -1
  726. package/dist/lib/schemas-data/3.2/core/reporting-resource.json +2 -2
  727. package/dist/lib/schemas-data/3.2/core/reporting-revision.json +6 -6
  728. package/dist/lib/schemas-data/3.2/core/reporting-schedule-offering.json +2 -2
  729. package/dist/lib/schemas-data/3.2/core/reporting-schedule.json +1 -1
  730. package/dist/lib/schemas-data/3.2/core/reporting-status-changed-webhook.json +5 -5
  731. package/dist/lib/schemas-data/3.2/core/reporting-status-issue.json +4 -4
  732. package/dist/lib/schemas-data/3.2/core/reporting-verification-profile-set.json +1 -1
  733. package/dist/lib/schemas-data/3.2/core/reporting-verification-profile.json +1 -1
  734. package/dist/lib/schemas-data/3.2/core/reporting-verification.json +7 -7
  735. package/dist/lib/schemas-data/3.2/core/reporting-webhook.json +4 -3
  736. package/dist/lib/schemas-data/3.2/core/reporting-write-destination.json +1 -1
  737. package/dist/lib/schemas-data/3.2/core/representation-destination.json +5 -5
  738. package/dist/lib/schemas-data/3.2/core/representation-rejection.json +1 -1
  739. package/dist/lib/schemas-data/3.2/core/representation-selection.json +5 -5
  740. package/dist/lib/schemas-data/3.2/core/requirements/asset-requirements.json +13 -13
  741. package/dist/lib/schemas-data/3.2/core/requirements/audio-asset-requirements.json +1 -1
  742. package/dist/lib/schemas-data/3.2/core/requirements/catalog-field-binding.json +4 -4
  743. package/dist/lib/schemas-data/3.2/core/requirements/catalog-requirements.json +5 -5
  744. package/dist/lib/schemas-data/3.2/core/requirements/css-asset-requirements.json +1 -1
  745. package/dist/lib/schemas-data/3.2/core/requirements/daast-asset-requirements.json +3 -3
  746. package/dist/lib/schemas-data/3.2/core/requirements/html-asset-requirements.json +1 -1
  747. package/dist/lib/schemas-data/3.2/core/requirements/image-asset-requirements.json +2 -2
  748. package/dist/lib/schemas-data/3.2/core/requirements/javascript-asset-requirements.json +1 -1
  749. package/dist/lib/schemas-data/3.2/core/requirements/markdown-asset-requirements.json +1 -1
  750. package/dist/lib/schemas-data/3.2/core/requirements/offering-asset-constraint.json +4 -4
  751. package/dist/lib/schemas-data/3.2/core/requirements/text-asset-requirements.json +1 -1
  752. package/dist/lib/schemas-data/3.2/core/requirements/url-asset-requirements.json +1 -1
  753. package/dist/lib/schemas-data/3.2/core/requirements/vast-asset-requirements.json +4 -4
  754. package/dist/lib/schemas-data/3.2/core/requirements/video-asset-requirements.json +6 -6
  755. package/dist/lib/schemas-data/3.2/core/requirements/webhook-asset-requirements.json +1 -1
  756. package/dist/lib/schemas-data/3.2/core/response-payload-jws-envelope.json +1 -1
  757. package/dist/lib/schemas-data/3.2/core/response.json +1 -1
  758. package/dist/lib/schemas-data/3.2/core/rights-attestation-evaluation.json +5 -5
  759. package/dist/lib/schemas-data/3.2/core/rights-constraint.json +7 -7
  760. package/dist/lib/schemas-data/3.2/core/seller-agent-ref.json +1 -1
  761. package/dist/lib/schemas-data/3.2/core/signal-coverage-forecast.json +5 -5
  762. package/dist/lib/schemas-data/3.2/core/signal-definition-enrichment.json +5 -5
  763. package/dist/lib/schemas-data/3.2/core/signal-definition.json +8 -8
  764. package/dist/lib/schemas-data/3.2/core/signal-filters.json +3 -3
  765. package/dist/lib/schemas-data/3.2/core/signal-id.json +1 -1
  766. package/dist/lib/schemas-data/3.2/core/signal-listing.json +6 -6
  767. package/dist/lib/schemas-data/3.2/core/signal-modeling-disclosure.json +1 -1
  768. package/dist/lib/schemas-data/3.2/core/signal-pricing-option.json +2 -2
  769. package/dist/lib/schemas-data/3.2/core/signal-pricing.json +6 -6
  770. package/dist/lib/schemas-data/3.2/core/signal-ref.json +1 -1
  771. package/dist/lib/schemas-data/3.2/core/signal-selection-group-rule.json +1 -1
  772. package/dist/lib/schemas-data/3.2/core/signal-targeting-expression.json +4 -4
  773. package/dist/lib/schemas-data/3.2/core/signal-targeting-rules.json +2 -2
  774. package/dist/lib/schemas-data/3.2/core/signal-targeting.json +7 -7
  775. package/dist/lib/schemas-data/3.2/core/sla-window.json +1 -1
  776. package/dist/lib/schemas-data/3.2/core/special.json +2 -2
  777. package/dist/lib/schemas-data/3.2/core/spot-reporting-capability.json +2 -2
  778. package/dist/lib/schemas-data/3.2/core/start-timing.json +1 -1
  779. package/dist/lib/schemas-data/3.2/core/store-item.json +3 -3
  780. package/dist/lib/schemas-data/3.2/core/talent.json +2 -2
  781. package/dist/lib/schemas-data/3.2/core/targeting-input.json +40 -40
  782. package/dist/lib/schemas-data/3.2/core/targeting-modification.json +3 -3
  783. package/dist/lib/schemas-data/3.2/core/targeting-overlay-requirements.json +15 -15
  784. package/dist/lib/schemas-data/3.2/core/targeting-overlay-support.json +25 -25
  785. package/dist/lib/schemas-data/3.2/core/targeting-unknown-age-eligibility-constraint.json +1 -1
  786. package/dist/lib/schemas-data/3.2/core/targeting-verified-age-basis-constraint.json +1 -1
  787. package/dist/lib/schemas-data/3.2/core/targeting.json +34 -34
  788. package/dist/lib/schemas-data/3.2/core/tasks-get-request.json +5 -5
  789. package/dist/lib/schemas-data/3.2/core/tasks-get-response.json +10 -10
  790. package/dist/lib/schemas-data/3.2/core/tasks-list-request.json +13 -13
  791. package/dist/lib/schemas-data/3.2/core/tasks-list-response.json +8 -8
  792. package/dist/lib/schemas-data/3.2/core/tracker-execution-contract.json +2 -2
  793. package/dist/lib/schemas-data/3.2/core/tracker-execution-selector.json +18 -18
  794. package/dist/lib/schemas-data/3.2/core/transformer-param.json +1 -1
  795. package/dist/lib/schemas-data/3.2/core/transformer.json +6 -6
  796. package/dist/lib/schemas-data/3.2/core/truncation-sentinel.json +1 -1
  797. package/dist/lib/schemas-data/3.2/core/user-match.json +3 -3
  798. package/dist/lib/schemas-data/3.2/core/vast-media-file-requirements.json +2 -2
  799. package/dist/lib/schemas-data/3.2/core/vast-tracker-constraints.json +2 -2
  800. package/dist/lib/schemas-data/3.2/core/vehicle-item.json +4 -4
  801. package/dist/lib/schemas-data/3.2/core/vendor-metric-id.json +1 -1
  802. package/dist/lib/schemas-data/3.2/core/vendor-metric-optimization-supported-metric.json +3 -3
  803. package/dist/lib/schemas-data/3.2/core/vendor-metric-optimization.json +2 -2
  804. package/dist/lib/schemas-data/3.2/core/vendor-metric-value.json +9 -9
  805. package/dist/lib/schemas-data/3.2/core/vendor-pricing-option.json +3 -3
  806. package/dist/lib/schemas-data/3.2/core/verification-token-claims.json +1 -1
  807. package/dist/lib/schemas-data/3.2/core/version-envelope.json +2 -1
  808. package/dist/lib/schemas-data/3.2/core/warning-resource.json +1 -1
  809. package/dist/lib/schemas-data/3.2/core/warning.json +4 -4
  810. package/dist/lib/schemas-data/3.2/core/webhook-activity-record.json +3 -3
  811. package/dist/lib/schemas-data/3.2/core/webhook-challenge-response.json +1 -1
  812. package/dist/lib/schemas-data/3.2/core/webhook-challenge.json +2 -2
  813. package/dist/lib/schemas-data/3.2/core/wholesale-feed-event.json +20 -20
  814. package/dist/lib/schemas-data/3.2/core/wholesale-feed-webhook.json +3 -3
  815. package/dist/lib/schemas-data/3.2/core/x-entity-types.json +1 -1
  816. package/dist/lib/schemas-data/3.2/creative/asset-types/index.json +6 -6
  817. package/dist/lib/schemas-data/3.2/creative/audit-observation.json +2 -2
  818. package/dist/lib/schemas-data/3.2/creative/creative-assignment-changed-webhook.json +2 -2
  819. package/dist/lib/schemas-data/3.2/creative/creative-feature-result.json +2 -2
  820. package/dist/lib/schemas-data/3.2/creative/creative-purged-webhook.json +3 -3
  821. package/dist/lib/schemas-data/3.2/creative/creative-status-changed-webhook.json +5 -5
  822. package/dist/lib/schemas-data/3.2/creative/get-creative-delivery-request.json +6 -6
  823. package/dist/lib/schemas-data/3.2/creative/get-creative-delivery-response.json +13 -12
  824. package/dist/lib/schemas-data/3.2/creative/get-creative-features-async-response-submitted.json +3 -3
  825. package/dist/lib/schemas-data/3.2/creative/get-creative-features-request.json +7 -7
  826. package/dist/lib/schemas-data/3.2/creative/get-creative-features-response.json +9 -9
  827. package/dist/lib/schemas-data/3.2/creative/get-creative-features-terminal-success.json +6 -6
  828. package/dist/lib/schemas-data/3.2/creative/list-creative-formats-request.json +16 -13
  829. package/dist/lib/schemas-data/3.2/creative/list-creative-formats-response.json +9 -9
  830. package/dist/lib/schemas-data/3.2/creative/list-creatives-request.json +9 -9
  831. package/dist/lib/schemas-data/3.2/creative/list-creatives-response.json +34 -34
  832. package/dist/lib/schemas-data/3.2/creative/list-transformers-request.json +9 -9
  833. package/dist/lib/schemas-data/3.2/creative/list-transformers-response.json +8 -8
  834. package/dist/lib/schemas-data/3.2/creative/preview-creative-request.json +13 -13
  835. package/dist/lib/schemas-data/3.2/creative/preview-creative-response.json +18 -18
  836. package/dist/lib/schemas-data/3.2/creative/preview-render.json +4 -4
  837. package/dist/lib/schemas-data/3.2/creative/sync-creatives-async-response-input-required.json +3 -3
  838. package/dist/lib/schemas-data/3.2/creative/sync-creatives-async-response-submitted.json +4 -4
  839. package/dist/lib/schemas-data/3.2/creative/sync-creatives-async-response-working.json +3 -3
  840. package/dist/lib/schemas-data/3.2/creative/sync-creatives-request.json +10 -10
  841. package/dist/lib/schemas-data/3.2/creative/sync-creatives-response.json +18 -18
  842. package/dist/lib/schemas-data/3.2/creative/validate-input-request.json +4 -4
  843. package/dist/lib/schemas-data/3.2/creative/validate-input-response.json +4 -4
  844. package/dist/lib/schemas-data/3.2/creative/validate-input-result.json +2 -2
  845. package/dist/lib/schemas-data/3.2/creative/video-brief.json +1 -1
  846. package/dist/lib/schemas-data/3.2/enums/account-currency-mode.json +1 -1
  847. package/dist/lib/schemas-data/3.2/enums/account-scope.json +1 -1
  848. package/dist/lib/schemas-data/3.2/enums/account-status.json +1 -1
  849. package/dist/lib/schemas-data/3.2/enums/action-not-allowed-reason.json +1 -1
  850. package/dist/lib/schemas-data/3.2/enums/action-source.json +1 -1
  851. package/dist/lib/schemas-data/3.2/enums/activation-method.json +1 -1
  852. package/dist/lib/schemas-data/3.2/enums/adcp-protocol.json +1 -1
  853. package/dist/lib/schemas-data/3.2/enums/adjustment-kind.json +1 -1
  854. package/dist/lib/schemas-data/3.2/enums/advertiser-industry.json +1 -1
  855. package/dist/lib/schemas-data/3.2/enums/age-determination-basis.json +1 -1
  856. package/dist/lib/schemas-data/3.2/enums/age-verification-method.json +1 -1
  857. package/dist/lib/schemas-data/3.2/enums/assessment-status.json +1 -1
  858. package/dist/lib/schemas-data/3.2/enums/asset-content-type.json +1 -1
  859. package/dist/lib/schemas-data/3.2/enums/attestation-claim.json +1 -1
  860. package/dist/lib/schemas-data/3.2/enums/attribution-methodology.json +1 -1
  861. package/dist/lib/schemas-data/3.2/enums/attribution-model.json +1 -1
  862. package/dist/lib/schemas-data/3.2/enums/audience-evidence-methodology.json +1 -1
  863. package/dist/lib/schemas-data/3.2/enums/audience-resolution-method.json +1 -1
  864. package/dist/lib/schemas-data/3.2/enums/audience-source.json +1 -1
  865. package/dist/lib/schemas-data/3.2/enums/audience-status.json +1 -1
  866. package/dist/lib/schemas-data/3.2/enums/audience-subject-type.json +1 -1
  867. package/dist/lib/schemas-data/3.2/enums/audio-channel-layout.json +1 -1
  868. package/dist/lib/schemas-data/3.2/enums/audio-distribution-type.json +1 -1
  869. package/dist/lib/schemas-data/3.2/enums/auth-scheme.json +2 -1
  870. package/dist/lib/schemas-data/3.2/enums/availability-status.json +1 -1
  871. package/dist/lib/schemas-data/3.2/enums/available-metric.json +1 -1
  872. package/dist/lib/schemas-data/3.2/enums/billing-party.json +1 -1
  873. package/dist/lib/schemas-data/3.2/enums/binary-verdict.json +1 -1
  874. package/dist/lib/schemas-data/3.2/enums/brand-agent-type.json +1 -1
  875. package/dist/lib/schemas-data/3.2/enums/browser-family.json +1 -1
  876. package/dist/lib/schemas-data/3.2/enums/c2pa-watermark-action.json +1 -1
  877. package/dist/lib/schemas-data/3.2/enums/canceled-by.json +1 -1
  878. package/dist/lib/schemas-data/3.2/enums/canonical-media-buy-action-mode.json +1 -1
  879. package/dist/lib/schemas-data/3.2/enums/canonical-media-buy-action.json +1 -1
  880. package/dist/lib/schemas-data/3.2/enums/catalog-action.json +1 -1
  881. package/dist/lib/schemas-data/3.2/enums/catalog-item-status.json +1 -1
  882. package/dist/lib/schemas-data/3.2/enums/catalog-type.json +1 -1
  883. package/dist/lib/schemas-data/3.2/enums/channels.json +1 -1
  884. package/dist/lib/schemas-data/3.2/enums/cloud-storage-protocol.json +1 -1
  885. package/dist/lib/schemas-data/3.2/enums/co-branding-requirement.json +1 -1
  886. package/dist/lib/schemas-data/3.2/enums/collection-cadence.json +1 -1
  887. package/dist/lib/schemas-data/3.2/enums/collection-kind.json +1 -1
  888. package/dist/lib/schemas-data/3.2/enums/collection-relationship.json +1 -1
  889. package/dist/lib/schemas-data/3.2/enums/collection-status.json +1 -1
  890. package/dist/lib/schemas-data/3.2/enums/completion-source.json +1 -1
  891. package/dist/lib/schemas-data/3.2/enums/consent-basis.json +1 -1
  892. package/dist/lib/schemas-data/3.2/enums/content-id-type.json +1 -1
  893. package/dist/lib/schemas-data/3.2/enums/content-rating-system.json +1 -1
  894. package/dist/lib/schemas-data/3.2/enums/creative-action.json +1 -1
  895. package/dist/lib/schemas-data/3.2/enums/creative-agent-capability.json +1 -1
  896. package/dist/lib/schemas-data/3.2/enums/creative-approval-status.json +1 -1
  897. package/dist/lib/schemas-data/3.2/enums/creative-event-reason-code.json +1 -1
  898. package/dist/lib/schemas-data/3.2/enums/creative-identifier-type.json +1 -1
  899. package/dist/lib/schemas-data/3.2/enums/creative-quality.json +1 -1
  900. package/dist/lib/schemas-data/3.2/enums/creative-selection-strategy.json +1 -1
  901. package/dist/lib/schemas-data/3.2/enums/creative-sort-field.json +1 -1
  902. package/dist/lib/schemas-data/3.2/enums/creative-status.json +1 -1
  903. package/dist/lib/schemas-data/3.2/enums/ctv-ad-experience.json +1 -1
  904. package/dist/lib/schemas-data/3.2/enums/daast-tracking-event.json +1 -1
  905. package/dist/lib/schemas-data/3.2/enums/daast-version.json +1 -1
  906. package/dist/lib/schemas-data/3.2/enums/day-of-week.json +1 -1
  907. package/dist/lib/schemas-data/3.2/enums/daypart-timezone-mode.json +1 -1
  908. package/dist/lib/schemas-data/3.2/enums/delegation-authority.json +1 -1
  909. package/dist/lib/schemas-data/3.2/enums/delivery-recipient-cloud.json +1 -1
  910. package/dist/lib/schemas-data/3.2/enums/delivery-status.json +1 -1
  911. package/dist/lib/schemas-data/3.2/enums/delivery-type.json +1 -1
  912. package/dist/lib/schemas-data/3.2/enums/demographic-system.json +1 -1
  913. package/dist/lib/schemas-data/3.2/enums/derivative-type.json +1 -1
  914. package/dist/lib/schemas-data/3.2/enums/device-platform.json +1 -1
  915. package/dist/lib/schemas-data/3.2/enums/device-type.json +1 -1
  916. package/dist/lib/schemas-data/3.2/enums/digital-source-type.json +1 -1
  917. package/dist/lib/schemas-data/3.2/enums/dimension-unit.json +1 -1
  918. package/dist/lib/schemas-data/3.2/enums/disclosure-persistence.json +1 -1
  919. package/dist/lib/schemas-data/3.2/enums/disclosure-position.json +1 -1
  920. package/dist/lib/schemas-data/3.2/enums/distance-unit.json +1 -1
  921. package/dist/lib/schemas-data/3.2/enums/distribution-identifier-type.json +1 -1
  922. package/dist/lib/schemas-data/3.2/enums/dooh-motion-type.json +1 -1
  923. package/dist/lib/schemas-data/3.2/enums/embedded-provenance-method.json +1 -1
  924. package/dist/lib/schemas-data/3.2/enums/error-code.json +1 -1
  925. package/dist/lib/schemas-data/3.2/enums/error-scope.json +1 -1
  926. package/dist/lib/schemas-data/3.2/enums/escalation-severity.json +1 -1
  927. package/dist/lib/schemas-data/3.2/enums/event-type.json +1 -1
  928. package/dist/lib/schemas-data/3.2/enums/exclusivity.json +1 -1
  929. package/dist/lib/schemas-data/3.2/enums/feature-check-status.json +1 -1
  930. package/dist/lib/schemas-data/3.2/enums/feed-format.json +1 -1
  931. package/dist/lib/schemas-data/3.2/enums/feedback-source.json +1 -1
  932. package/dist/lib/schemas-data/3.2/enums/forecast-method.json +1 -1
  933. package/dist/lib/schemas-data/3.2/enums/forecast-range-unit.json +1 -1
  934. package/dist/lib/schemas-data/3.2/enums/forecastable-metric.json +1 -1
  935. package/dist/lib/schemas-data/3.2/enums/format-id-parameter.json +1 -1
  936. package/dist/lib/schemas-data/3.2/enums/frame-rate-type.json +1 -1
  937. package/dist/lib/schemas-data/3.2/enums/frequency-cap-control-mode.json +1 -1
  938. package/dist/lib/schemas-data/3.2/enums/frequency-cap-mutable-field.json +1 -1
  939. package/dist/lib/schemas-data/3.2/enums/frequency-cap-scope.json +1 -1
  940. package/dist/lib/schemas-data/3.2/enums/genre-taxonomy.json +1 -1
  941. package/dist/lib/schemas-data/3.2/enums/geo-level.json +1 -1
  942. package/dist/lib/schemas-data/3.2/enums/gop-type.json +1 -1
  943. package/dist/lib/schemas-data/3.2/enums/governance-decision.json +1 -1
  944. package/dist/lib/schemas-data/3.2/enums/governance-domain.json +1 -1
  945. package/dist/lib/schemas-data/3.2/enums/governance-mode.json +1 -1
  946. package/dist/lib/schemas-data/3.2/enums/governance-phase.json +1 -1
  947. package/dist/lib/schemas-data/3.2/enums/history-entry-type.json +1 -1
  948. package/dist/lib/schemas-data/3.2/enums/http-method.json +1 -1
  949. package/dist/lib/schemas-data/3.2/enums/identifier-types.json +1 -1
  950. package/dist/lib/schemas-data/3.2/enums/impairment-offline-state.json +1 -1
  951. package/dist/lib/schemas-data/3.2/enums/impairment-reason-code.json +1 -1
  952. package/dist/lib/schemas-data/3.2/enums/indicator-type.json +1 -1
  953. package/dist/lib/schemas-data/3.2/enums/installment-status.json +1 -1
  954. package/dist/lib/schemas-data/3.2/enums/javascript-module-type.json +1 -1
  955. package/dist/lib/schemas-data/3.2/enums/landing-page-requirement.json +1 -1
  956. package/dist/lib/schemas-data/3.2/enums/legacy-postal-system.json +1 -1
  957. package/dist/lib/schemas-data/3.2/enums/lift-dimension.json +1 -1
  958. package/dist/lib/schemas-data/3.2/enums/logo-slot.json +1 -1
  959. package/dist/lib/schemas-data/3.2/enums/macro-dialect.json +1 -1
  960. package/dist/lib/schemas-data/3.2/enums/macro-mapping-status.json +1 -1
  961. package/dist/lib/schemas-data/3.2/enums/macro-processing-operation.json +1 -1
  962. package/dist/lib/schemas-data/3.2/enums/macro-resolution-reason.json +1 -1
  963. package/dist/lib/schemas-data/3.2/enums/macro-resolver.json +1 -1
  964. package/dist/lib/schemas-data/3.2/enums/macro-value-context.json +1 -1
  965. package/dist/lib/schemas-data/3.2/enums/makegood-remedy.json +1 -1
  966. package/dist/lib/schemas-data/3.2/enums/markdown-flavor.json +1 -1
  967. package/dist/lib/schemas-data/3.2/enums/match-id-type.json +1 -1
  968. package/dist/lib/schemas-data/3.2/enums/match-type.json +1 -1
  969. package/dist/lib/schemas-data/3.2/enums/media-buy-action-mode.json +1 -1
  970. package/dist/lib/schemas-data/3.2/enums/media-buy-frequency-cap-control-mode.json +1 -1
  971. package/dist/lib/schemas-data/3.2/enums/media-buy-health.json +1 -1
  972. package/dist/lib/schemas-data/3.2/enums/media-buy-status.json +1 -1
  973. package/dist/lib/schemas-data/3.2/enums/media-buy-valid-action.json +1 -1
  974. package/dist/lib/schemas-data/3.2/enums/metric-scope.json +1 -1
  975. package/dist/lib/schemas-data/3.2/enums/metric-type.json +1 -1
  976. package/dist/lib/schemas-data/3.2/enums/metro-system.json +1 -1
  977. package/dist/lib/schemas-data/3.2/enums/moov-atom-position.json +1 -1
  978. package/dist/lib/schemas-data/3.2/enums/motion-level.json +1 -1
  979. package/dist/lib/schemas-data/3.2/enums/notification-type.json +1 -1
  980. package/dist/lib/schemas-data/3.2/enums/offering-availability-status.json +1 -1
  981. package/dist/lib/schemas-data/3.2/enums/outcome-target-cost-strength.json +1 -1
  982. package/dist/lib/schemas-data/3.2/enums/outcome-type.json +1 -1
  983. package/dist/lib/schemas-data/3.2/enums/pacing.json +1 -1
  984. package/dist/lib/schemas-data/3.2/enums/payment-terms.json +1 -1
  985. package/dist/lib/schemas-data/3.2/enums/performance-baseline.json +1 -1
  986. package/dist/lib/schemas-data/3.2/enums/performance-standard-metric.json +1 -1
  987. package/dist/lib/schemas-data/3.2/enums/pixel-tracking-event.json +1 -1
  988. package/dist/lib/schemas-data/3.2/enums/policy-category.json +1 -1
  989. package/dist/lib/schemas-data/3.2/enums/policy-enforcement.json +1 -1
  990. package/dist/lib/schemas-data/3.2/enums/postal-system.json +1 -1
  991. package/dist/lib/schemas-data/3.2/enums/preview-output-format.json +1 -1
  992. package/dist/lib/schemas-data/3.2/enums/pricing-model.json +1 -1
  993. package/dist/lib/schemas-data/3.2/enums/pricing-structure.json +1 -1
  994. package/dist/lib/schemas-data/3.2/enums/principal-kind.json +1 -1
  995. package/dist/lib/schemas-data/3.2/enums/production-quality.json +1 -1
  996. package/dist/lib/schemas-data/3.2/enums/property-type.json +1 -1
  997. package/dist/lib/schemas-data/3.2/enums/proposal-decline-reason.json +1 -1
  998. package/dist/lib/schemas-data/3.2/enums/proposal-refinement-reason.json +1 -1
  999. package/dist/lib/schemas-data/3.2/enums/proposal-status.json +1 -1
  1000. package/dist/lib/schemas-data/3.2/enums/publisher-identifier-types.json +1 -1
  1001. package/dist/lib/schemas-data/3.2/enums/purchase-type.json +1 -1
  1002. package/dist/lib/schemas-data/3.2/enums/reach-aggregation.json +1 -1
  1003. package/dist/lib/schemas-data/3.2/enums/reach-unit.json +1 -1
  1004. package/dist/lib/schemas-data/3.2/enums/reporting-destination-setup-state.json +1 -1
  1005. package/dist/lib/schemas-data/3.2/enums/reporting-finality.json +1 -1
  1006. package/dist/lib/schemas-data/3.2/enums/reporting-frequency.json +1 -1
  1007. package/dist/lib/schemas-data/3.2/enums/reporting-health.json +1 -1
  1008. package/dist/lib/schemas-data/3.2/enums/representation-selection-strategy.json +1 -1
  1009. package/dist/lib/schemas-data/3.2/enums/request-signing-error-code.json +1 -1
  1010. package/dist/lib/schemas-data/3.2/enums/response-type.json +1 -1
  1011. package/dist/lib/schemas-data/3.2/enums/restricted-attribute.json +1 -1
  1012. package/dist/lib/schemas-data/3.2/enums/right-type.json +1 -1
  1013. package/dist/lib/schemas-data/3.2/enums/right-use.json +1 -1
  1014. package/dist/lib/schemas-data/3.2/enums/rights-billing-period.json +1 -1
  1015. package/dist/lib/schemas-data/3.2/enums/scan-type.json +1 -1
  1016. package/dist/lib/schemas-data/3.2/enums/seller-policy-decline-reason.json +1 -1
  1017. package/dist/lib/schemas-data/3.2/enums/si-session-status.json +1 -1
  1018. package/dist/lib/schemas-data/3.2/enums/signal-catalog-type.json +1 -1
  1019. package/dist/lib/schemas-data/3.2/enums/signal-source.json +1 -1
  1020. package/dist/lib/schemas-data/3.2/enums/signal-value-type.json +1 -1
  1021. package/dist/lib/schemas-data/3.2/enums/snapshot-unavailable-reason.json +1 -1
  1022. package/dist/lib/schemas-data/3.2/enums/social-placement-surface.json +1 -1
  1023. package/dist/lib/schemas-data/3.2/enums/sort-direction.json +1 -1
  1024. package/dist/lib/schemas-data/3.2/enums/sort-metric.json +1 -1
  1025. package/dist/lib/schemas-data/3.2/enums/special-category.json +1 -1
  1026. package/dist/lib/schemas-data/3.2/enums/specialism.json +1 -1
  1027. package/dist/lib/schemas-data/3.2/enums/sponsored-placement-type.json +1 -1
  1028. package/dist/lib/schemas-data/3.2/enums/talent-role.json +1 -1
  1029. package/dist/lib/schemas-data/3.2/enums/task-status.json +1 -1
  1030. package/dist/lib/schemas-data/3.2/enums/task-type.json +1 -1
  1031. package/dist/lib/schemas-data/3.2/enums/tracker-execution-actor.json +1 -1
  1032. package/dist/lib/schemas-data/3.2/enums/tracker-firing-path.json +1 -1
  1033. package/dist/lib/schemas-data/3.2/enums/transport-mode.json +1 -1
  1034. package/dist/lib/schemas-data/3.2/enums/travel-time-unit.json +1 -1
  1035. package/dist/lib/schemas-data/3.2/enums/uid-type.json +1 -1
  1036. package/dist/lib/schemas-data/3.2/enums/universal-macro.json +1 -1
  1037. package/dist/lib/schemas-data/3.2/enums/update-frequency.json +1 -1
  1038. package/dist/lib/schemas-data/3.2/enums/url-asset-type.json +1 -1
  1039. package/dist/lib/schemas-data/3.2/enums/validation-mode.json +1 -1
  1040. package/dist/lib/schemas-data/3.2/enums/vast-media-delivery-method.json +1 -1
  1041. package/dist/lib/schemas-data/3.2/enums/vast-tracking-event.json +1 -1
  1042. package/dist/lib/schemas-data/3.2/enums/vast-version.json +1 -1
  1043. package/dist/lib/schemas-data/3.2/enums/vendor-relationship.json +1 -1
  1044. package/dist/lib/schemas-data/3.2/enums/video-placement-type.json +1 -1
  1045. package/dist/lib/schemas-data/3.2/enums/view-threshold-basis.json +1 -1
  1046. package/dist/lib/schemas-data/3.2/enums/viewability-standard.json +1 -1
  1047. package/dist/lib/schemas-data/3.2/enums/warning-code.json +1 -1
  1048. package/dist/lib/schemas-data/3.2/enums/watermark-media-type.json +1 -1
  1049. package/dist/lib/schemas-data/3.2/enums/wcag-level.json +1 -1
  1050. package/dist/lib/schemas-data/3.2/enums/webhook-response-type.json +1 -1
  1051. package/dist/lib/schemas-data/3.2/enums/webhook-security-method.json +1 -1
  1052. package/dist/lib/schemas-data/3.2/error-details/accessibility-violation.json +1 -1
  1053. package/dist/lib/schemas-data/3.2/error-details/account-moved.json +2 -2
  1054. package/dist/lib/schemas-data/3.2/error-details/account-setup-required.json +1 -1
  1055. package/dist/lib/schemas-data/3.2/error-details/action-not-allowed.json +5 -5
  1056. package/dist/lib/schemas-data/3.2/error-details/agent-permission-denied.json +1 -1
  1057. package/dist/lib/schemas-data/3.2/error-details/audience-too-small.json +1 -1
  1058. package/dist/lib/schemas-data/3.2/error-details/authorization-required.json +3 -3
  1059. package/dist/lib/schemas-data/3.2/error-details/billing-not-permitted-for-agent.json +3 -3
  1060. package/dist/lib/schemas-data/3.2/error-details/billing-not-supported.json +2 -2
  1061. package/dist/lib/schemas-data/3.2/error-details/budget-too-low.json +1 -1
  1062. package/dist/lib/schemas-data/3.2/error-details/conflict.json +1 -1
  1063. package/dist/lib/schemas-data/3.2/error-details/creative-rejected.json +1 -1
  1064. package/dist/lib/schemas-data/3.2/error-details/creative-representation-unresolved.json +2 -2
  1065. package/dist/lib/schemas-data/3.2/error-details/creative-revision-content-mismatch.json +2 -2
  1066. package/dist/lib/schemas-data/3.2/error-details/execution-requirement-unmet.json +2 -2
  1067. package/dist/lib/schemas-data/3.2/error-details/governance-agent-not-accepted.json +2 -2
  1068. package/dist/lib/schemas-data/3.2/error-details/macro-resolution-failed.json +2 -2
  1069. package/dist/lib/schemas-data/3.2/error-details/policy-violation.json +1 -1
  1070. package/dist/lib/schemas-data/3.2/error-details/rate-limited.json +1 -1
  1071. package/dist/lib/schemas-data/3.2/error-details/requote-required.json +3 -3
  1072. package/dist/lib/schemas-data/3.2/error-details/stale-response.json +1 -1
  1073. package/dist/lib/schemas-data/3.2/error-details/unsupported-refinement-dimension.json +1 -1
  1074. package/dist/lib/schemas-data/3.2/error-details/vast-version-mismatch.json +6 -6
  1075. package/dist/lib/schemas-data/3.2/error-details/vendor-error-codes.json +1 -1
  1076. package/dist/lib/schemas-data/3.2/error-details/version-unsupported.json +3 -2
  1077. package/dist/lib/schemas-data/3.2/extensions/extension-meta.json +1 -1
  1078. package/dist/lib/schemas-data/3.2/extensions/index.json +2 -2
  1079. package/dist/lib/schemas-data/3.2/formats/canonical/_base.json +5 -5
  1080. package/dist/lib/schemas-data/3.2/formats/canonical/agent_placement.json +2 -2
  1081. package/dist/lib/schemas-data/3.2/formats/canonical/audio_daast.json +4 -4
  1082. package/dist/lib/schemas-data/3.2/formats/canonical/audio_hosted.json +2 -2
  1083. package/dist/lib/schemas-data/3.2/formats/canonical/audio_vast.json +5 -5
  1084. package/dist/lib/schemas-data/3.2/formats/canonical/coordinated_placements.json +18 -18
  1085. package/dist/lib/schemas-data/3.2/formats/canonical/display_tag.json +2 -2
  1086. package/dist/lib/schemas-data/3.2/formats/canonical/html5.json +2 -2
  1087. package/dist/lib/schemas-data/3.2/formats/canonical/image.json +5 -5
  1088. package/dist/lib/schemas-data/3.2/formats/canonical/image_carousel.json +2 -2
  1089. package/dist/lib/schemas-data/3.2/formats/canonical/native_in_feed.json +5 -5
  1090. package/dist/lib/schemas-data/3.2/formats/canonical/responsive_creative.json +2 -2
  1091. package/dist/lib/schemas-data/3.2/formats/canonical/seller_rendered_stateful_display.json +3 -3
  1092. package/dist/lib/schemas-data/3.2/formats/canonical/sponsored_placement.json +4 -4
  1093. package/dist/lib/schemas-data/3.2/formats/canonical/video_hosted.json +3 -3
  1094. package/dist/lib/schemas-data/3.2/formats/canonical/video_vast.json +8 -8
  1095. package/dist/lib/schemas-data/3.2/governance/accepted-governance-agents.json +1 -1
  1096. package/dist/lib/schemas-data/3.2/governance/attribute-definition.json +1 -1
  1097. package/dist/lib/schemas-data/3.2/governance/audience-constraints.json +3 -3
  1098. package/dist/lib/schemas-data/3.2/governance/check-governance-request.json +10 -10
  1099. package/dist/lib/schemas-data/3.2/governance/check-governance-response.json +8 -8
  1100. package/dist/lib/schemas-data/3.2/governance/get-plan-audit-logs-request.json +5 -5
  1101. package/dist/lib/schemas-data/3.2/governance/get-plan-audit-logs-response.json +14 -14
  1102. package/dist/lib/schemas-data/3.2/governance/policy-category-definition.json +2 -2
  1103. package/dist/lib/schemas-data/3.2/governance/policy-entry.json +7 -7
  1104. package/dist/lib/schemas-data/3.2/governance/policy-ref.json +1 -1
  1105. package/dist/lib/schemas-data/3.2/governance/report-plan-adjustment-request.json +4 -4
  1106. package/dist/lib/schemas-data/3.2/governance/report-plan-adjustment-response.json +4 -4
  1107. package/dist/lib/schemas-data/3.2/governance/report-plan-outcome-request.json +8 -8
  1108. package/dist/lib/schemas-data/3.2/governance/report-plan-outcome-response.json +5 -5
  1109. package/dist/lib/schemas-data/3.2/governance/reported-outcome-error.json +1 -1
  1110. package/dist/lib/schemas-data/3.2/governance/sync-plans-request.json +14 -14
  1111. package/dist/lib/schemas-data/3.2/governance/sync-plans-response.json +6 -6
  1112. package/dist/lib/schemas-data/3.2/index.json +639 -639
  1113. package/dist/lib/schemas-data/3.2/manifest.json +5 -3
  1114. package/dist/lib/schemas-data/3.2/manifest.schema.json +1 -1
  1115. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/account/get-account-financials-request.json +32 -30
  1116. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/account/list-account-changes-request.json +30 -29
  1117. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/account/list-accounts-request.json +32 -30
  1118. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/account/report-usage-request.json +32 -30
  1119. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/account/sync-accounts-request.json +98 -93
  1120. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/account/sync-governance-request.json +31 -29
  1121. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/brand/acquire-rights-request.json +41 -36
  1122. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/brand/get-brand-identity-request.json +6 -4
  1123. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/brand/get-rights-request.json +30 -28
  1124. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/brand/search-brands-request.json +26 -26
  1125. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/brand/update-rights-request.json +36 -32
  1126. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/brand/verify-brand-claim-request.json +5 -3
  1127. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/brand/verify-brand-claims-request.json +5 -3
  1128. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/collection/create-collection-list-request.json +48 -46
  1129. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/collection/delete-collection-list-request.json +31 -29
  1130. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/collection/get-collection-list-request.json +31 -29
  1131. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/collection/list-collection-lists-request.json +32 -30
  1132. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/collection/update-collection-list-request.json +48 -46
  1133. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/compliance/comply-test-controller-request.json +1218 -1209
  1134. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/content-standards/calibrate-content-request.json +34 -32
  1135. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/content-standards/create-content-standards-request.json +57 -55
  1136. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/content-standards/get-content-standards-request.json +6 -4
  1137. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/content-standards/get-media-buy-artifacts-request.json +31 -29
  1138. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/content-standards/list-content-standards-request.json +8 -6
  1139. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/content-standards/update-content-standards-request.json +57 -55
  1140. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/content-standards/validate-content-delivery-request.json +34 -32
  1141. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/creative/get-creative-delivery-request.json +32 -30
  1142. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/creative/get-creative-features-request.json +260 -256
  1143. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/creative/list-creatives-request.json +48 -45
  1144. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/creative/list-transformers-request.json +34 -32
  1145. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/creative/preview-creative-request.json +258 -254
  1146. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/creative/sync-creatives-request.json +273 -269
  1147. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/creative/validate-input-request.json +251 -251
  1148. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/governance/check-governance-request.json +378 -376
  1149. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/governance/get-plan-audit-logs-request.json +7 -5
  1150. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/governance/report-plan-adjustment-request.json +6 -4
  1151. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/governance/report-plan-outcome-request.json +88 -86
  1152. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/governance/sync-plans-request.json +64 -62
  1153. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/accept-proposal-request.json +25 -21
  1154. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/build-creative-request.json +450 -446
  1155. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/buy-products-request.json +282 -278
  1156. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/control-media-buy-request.json +214 -210
  1157. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/create-media-buy-request.json +516 -508
  1158. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/decline-proposals-request.json +15 -12
  1159. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/get-media-buy-delivery-request.json +49 -47
  1160. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/get-media-buys-request.json +34 -32
  1161. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/get-products-request.json +342 -336
  1162. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/get-reporting-status-request.json +59 -57
  1163. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/list-creative-formats-request.json +38 -34
  1164. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/list-products-request.json +326 -323
  1165. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/log-event-request.json +24 -22
  1166. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/provide-performance-feedback-request.json +67 -65
  1167. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/refine-proposals-request.json +327 -324
  1168. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/request-proposals-request.json +328 -325
  1169. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/sync-audiences-request.json +39 -37
  1170. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/sync-catalogs-request.json +54 -50
  1171. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/sync-event-sources-request.json +35 -33
  1172. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/sync-reporting-receipts-request.json +23 -22
  1173. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/sync-reporting-status-request.json +13 -12
  1174. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/update-media-buy-request.json +524 -518
  1175. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/account/get-account-financials-request.json +32 -30
  1176. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/account/list-accounts-request.json +32 -30
  1177. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/account/report-usage-request.json +32 -30
  1178. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/account/sync-accounts-request.json +98 -93
  1179. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/account/sync-governance-request.json +31 -29
  1180. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/creative/list-creatives-request.json +48 -45
  1181. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/creative/sync-creatives-request.json +273 -269
  1182. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/manifest.json +1 -1
  1183. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/accept-proposal-request.json +25 -21
  1184. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/buy-products-request.json +282 -278
  1185. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/control-media-buy-request.json +214 -210
  1186. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/decline-proposals-request.json +15 -12
  1187. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/get-media-buy-delivery-request.json +49 -47
  1188. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/get-media-buys-request.json +34 -32
  1189. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/get-reporting-status-request.json +59 -57
  1190. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/list-products-request.json +326 -323
  1191. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/log-event-request.json +24 -22
  1192. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/provide-performance-feedback-request.json +67 -65
  1193. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/refine-proposals-request.json +327 -324
  1194. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/request-proposals-request.json +328 -325
  1195. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/sync-audiences-request.json +39 -37
  1196. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/sync-catalogs-request.json +54 -50
  1197. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/sync-event-sources-request.json +35 -33
  1198. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/sync-reporting-receipts-request.json +23 -22
  1199. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/sync-reporting-status-request.json +13 -12
  1200. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/protocol/get-adcp-capabilities-request.json +6 -4
  1201. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/protocol/get-principal-request.json +6 -4
  1202. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/protocol/get-task-status-request.json +31 -29
  1203. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/protocol/list-tasks-request.json +36 -34
  1204. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/protocol/sync-principal-request.json +31 -27
  1205. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/property/create-property-list-request.json +48 -46
  1206. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/property/delete-property-list-request.json +31 -29
  1207. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/property/get-property-list-request.json +31 -29
  1208. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/property/list-property-lists-request.json +32 -30
  1209. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/property/update-property-list-request.json +48 -46
  1210. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/property/validate-property-delivery-request.json +37 -35
  1211. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/protocol/get-adcp-capabilities-request.json +6 -4
  1212. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/protocol/get-principal-request.json +6 -4
  1213. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/protocol/get-task-status-request.json +31 -29
  1214. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/protocol/list-tasks-request.json +36 -34
  1215. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/protocol/sync-agent-notification-configs-request.json +14 -10
  1216. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/protocol/sync-principal-request.json +31 -27
  1217. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/signals/activate-signal-request.json +32 -30
  1218. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/signals/get-signals-request.json +45 -40
  1219. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/sponsored-intelligence/si-get-offering-request.json +6 -4
  1220. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/sponsored-intelligence/si-initiate-session-request.json +38 -36
  1221. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/sponsored-intelligence/si-send-message-request.json +36 -34
  1222. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/sponsored-intelligence/si-terminate-session-request.json +6 -4
  1223. package/dist/lib/schemas-data/3.2/media-buy/accept-proposal-async-response-input-required.json +2 -2
  1224. package/dist/lib/schemas-data/3.2/media-buy/accept-proposal-async-response-submitted.json +2 -2
  1225. package/dist/lib/schemas-data/3.2/media-buy/accept-proposal-async-response-working.json +2 -2
  1226. package/dist/lib/schemas-data/3.2/media-buy/accept-proposal-request.json +10 -10
  1227. package/dist/lib/schemas-data/3.2/media-buy/accept-proposal-response.json +2 -2
  1228. package/dist/lib/schemas-data/3.2/media-buy/acceptance-context.json +3 -3
  1229. package/dist/lib/schemas-data/3.2/media-buy/acceptance-policy-catalog.json +4 -4
  1230. package/dist/lib/schemas-data/3.2/media-buy/acceptance-policy-profile-ref.json +1 -1
  1231. package/dist/lib/schemas-data/3.2/media-buy/acceptance-policy-profile.json +3 -3
  1232. package/dist/lib/schemas-data/3.2/media-buy/acceptance-policy-requirement.json +3 -3
  1233. package/dist/lib/schemas-data/3.2/media-buy/acceptance-policy-rule.json +3 -3
  1234. package/dist/lib/schemas-data/3.2/media-buy/build-creative-async-response-input-required.json +4 -4
  1235. package/dist/lib/schemas-data/3.2/media-buy/build-creative-async-response-submitted.json +4 -4
  1236. package/dist/lib/schemas-data/3.2/media-buy/build-creative-async-response-working.json +3 -3
  1237. package/dist/lib/schemas-data/3.2/media-buy/build-creative-request.json +19 -19
  1238. package/dist/lib/schemas-data/3.2/media-buy/build-creative-response.json +35 -35
  1239. package/dist/lib/schemas-data/3.2/media-buy/buy-products-async-response-input-required.json +2 -2
  1240. package/dist/lib/schemas-data/3.2/media-buy/buy-products-async-response-submitted.json +2 -2
  1241. package/dist/lib/schemas-data/3.2/media-buy/buy-products-async-response-working.json +2 -2
  1242. package/dist/lib/schemas-data/3.2/media-buy/buy-products-request.json +19 -19
  1243. package/dist/lib/schemas-data/3.2/media-buy/buy-products-response.json +2 -2
  1244. package/dist/lib/schemas-data/3.2/media-buy/change-term-constraints.json +4 -4
  1245. package/dist/lib/schemas-data/3.2/media-buy/change-term.json +6 -6
  1246. package/dist/lib/schemas-data/3.2/media-buy/commercial-terms.json +12 -12
  1247. package/dist/lib/schemas-data/3.2/media-buy/control-media-buy-async-response-input-required.json +2 -2
  1248. package/dist/lib/schemas-data/3.2/media-buy/control-media-buy-async-response-submitted.json +2 -2
  1249. package/dist/lib/schemas-data/3.2/media-buy/control-media-buy-async-response-working.json +2 -2
  1250. package/dist/lib/schemas-data/3.2/media-buy/control-media-buy-request.json +14 -14
  1251. package/dist/lib/schemas-data/3.2/media-buy/control-media-buy-response.json +12 -12
  1252. package/dist/lib/schemas-data/3.2/media-buy/create-media-buy-async-response-input-required.json +4 -4
  1253. package/dist/lib/schemas-data/3.2/media-buy/create-media-buy-async-response-submitted.json +4 -4
  1254. package/dist/lib/schemas-data/3.2/media-buy/create-media-buy-async-response-working.json +3 -3
  1255. package/dist/lib/schemas-data/3.2/media-buy/create-media-buy-request.json +21 -19
  1256. package/dist/lib/schemas-data/3.2/media-buy/create-media-buy-response.json +24 -23
  1257. package/dist/lib/schemas-data/3.2/media-buy/decline-proposals-async-response-input-required.json +2 -2
  1258. package/dist/lib/schemas-data/3.2/media-buy/decline-proposals-async-response-submitted.json +2 -2
  1259. package/dist/lib/schemas-data/3.2/media-buy/decline-proposals-async-response-working.json +2 -2
  1260. package/dist/lib/schemas-data/3.2/media-buy/decline-proposals-request.json +8 -8
  1261. package/dist/lib/schemas-data/3.2/media-buy/decline-proposals-response.json +5 -5
  1262. package/dist/lib/schemas-data/3.2/media-buy/get-media-buy-delivery-request.json +47 -47
  1263. package/dist/lib/schemas-data/3.2/media-buy/get-media-buy-delivery-response.json +83 -81
  1264. package/dist/lib/schemas-data/3.2/media-buy/get-media-buys-request.json +9 -9
  1265. package/dist/lib/schemas-data/3.2/media-buy/get-media-buys-response.json +54 -52
  1266. package/dist/lib/schemas-data/3.2/media-buy/get-products-async-response-input-required.json +4 -4
  1267. package/dist/lib/schemas-data/3.2/media-buy/get-products-async-response-submitted.json +4 -4
  1268. package/dist/lib/schemas-data/3.2/media-buy/get-products-async-response-working.json +3 -3
  1269. package/dist/lib/schemas-data/3.2/media-buy/get-products-rejected.json +5 -5
  1270. package/dist/lib/schemas-data/3.2/media-buy/get-products-request.json +19 -19
  1271. package/dist/lib/schemas-data/3.2/media-buy/get-products-response.json +13 -13
  1272. package/dist/lib/schemas-data/3.2/media-buy/get-products-targeting-resolution.json +3 -3
  1273. package/dist/lib/schemas-data/3.2/media-buy/get-reporting-status-request.json +10 -10
  1274. package/dist/lib/schemas-data/3.2/media-buy/get-reporting-status-response.json +27 -27
  1275. package/dist/lib/schemas-data/3.2/media-buy/legacy-purchase-continuation-input.json +2 -2
  1276. package/dist/lib/schemas-data/3.2/media-buy/list-creative-formats-request.json +16 -14
  1277. package/dist/lib/schemas-data/3.2/media-buy/list-creative-formats-response.json +9 -9
  1278. package/dist/lib/schemas-data/3.2/media-buy/list-products-request.json +10 -10
  1279. package/dist/lib/schemas-data/3.2/media-buy/list-products-response.json +5 -5
  1280. package/dist/lib/schemas-data/3.2/media-buy/log-event-request.json +5 -5
  1281. package/dist/lib/schemas-data/3.2/media-buy/log-event-response.json +8 -8
  1282. package/dist/lib/schemas-data/3.2/media-buy/media-buy-commitment-response.json +13 -13
  1283. package/dist/lib/schemas-data/3.2/media-buy/media-buy-delivery-webhook-result.json +12 -11
  1284. package/dist/lib/schemas-data/3.2/media-buy/outcome-target.json +4 -4
  1285. package/dist/lib/schemas-data/3.2/media-buy/package-control.json +9 -9
  1286. package/dist/lib/schemas-data/3.2/media-buy/package-request.json +32 -31
  1287. package/dist/lib/schemas-data/3.2/media-buy/package-update.json +14 -14
  1288. package/dist/lib/schemas-data/3.2/media-buy/product-discovery-criteria.json +9 -9
  1289. package/dist/lib/schemas-data/3.2/media-buy/product-fields.json +1 -1
  1290. package/dist/lib/schemas-data/3.2/media-buy/product-purchase-input.json +22 -22
  1291. package/dist/lib/schemas-data/3.2/media-buy/product-purchase.json +13 -13
  1292. package/dist/lib/schemas-data/3.2/media-buy/product-refinement.json +1 -1
  1293. package/dist/lib/schemas-data/3.2/media-buy/proposal-budget-constraint.json +1 -1
  1294. package/dist/lib/schemas-data/3.2/media-buy/proposal-decline.json +2 -2
  1295. package/dist/lib/schemas-data/3.2/media-buy/proposal-refinement.json +4 -4
  1296. package/dist/lib/schemas-data/3.2/media-buy/provide-performance-feedback-request.json +5 -5
  1297. package/dist/lib/schemas-data/3.2/media-buy/provide-performance-feedback-response.json +8 -8
  1298. package/dist/lib/schemas-data/3.2/media-buy/refine-proposals-async-response-input-required.json +2 -2
  1299. package/dist/lib/schemas-data/3.2/media-buy/refine-proposals-async-response-submitted.json +2 -2
  1300. package/dist/lib/schemas-data/3.2/media-buy/refine-proposals-async-response-working.json +2 -2
  1301. package/dist/lib/schemas-data/3.2/media-buy/refine-proposals-request.json +7 -7
  1302. package/dist/lib/schemas-data/3.2/media-buy/refine-proposals-response.json +12 -12
  1303. package/dist/lib/schemas-data/3.2/media-buy/request-proposals-async-response-input-required.json +2 -2
  1304. package/dist/lib/schemas-data/3.2/media-buy/request-proposals-async-response-submitted.json +2 -2
  1305. package/dist/lib/schemas-data/3.2/media-buy/request-proposals-async-response-working.json +2 -2
  1306. package/dist/lib/schemas-data/3.2/media-buy/request-proposals-request.json +10 -10
  1307. package/dist/lib/schemas-data/3.2/media-buy/request-proposals-response.json +10 -10
  1308. package/dist/lib/schemas-data/3.2/media-buy/sync-audiences-request.json +9 -9
  1309. package/dist/lib/schemas-data/3.2/media-buy/sync-audiences-response.json +15 -15
  1310. package/dist/lib/schemas-data/3.2/media-buy/sync-catalogs-async-response-input-required.json +3 -3
  1311. package/dist/lib/schemas-data/3.2/media-buy/sync-catalogs-async-response-submitted.json +4 -4
  1312. package/dist/lib/schemas-data/3.2/media-buy/sync-catalogs-async-response-working.json +3 -3
  1313. package/dist/lib/schemas-data/3.2/media-buy/sync-catalogs-request.json +10 -10
  1314. package/dist/lib/schemas-data/3.2/media-buy/sync-catalogs-response.json +20 -20
  1315. package/dist/lib/schemas-data/3.2/media-buy/sync-event-sources-request.json +8 -8
  1316. package/dist/lib/schemas-data/3.2/media-buy/sync-event-sources-response.json +14 -14
  1317. package/dist/lib/schemas-data/3.2/media-buy/sync-reporting-receipts-request.json +9 -9
  1318. package/dist/lib/schemas-data/3.2/media-buy/sync-reporting-receipts-response.json +10 -10
  1319. package/dist/lib/schemas-data/3.2/media-buy/sync-reporting-status-request.json +8 -8
  1320. package/dist/lib/schemas-data/3.2/media-buy/sync-reporting-status-response.json +8 -8
  1321. package/dist/lib/schemas-data/3.2/media-buy/update-media-buy-async-response-input-required.json +3 -3
  1322. package/dist/lib/schemas-data/3.2/media-buy/update-media-buy-async-response-submitted.json +4 -4
  1323. package/dist/lib/schemas-data/3.2/media-buy/update-media-buy-async-response-working.json +3 -3
  1324. package/dist/lib/schemas-data/3.2/media-buy/update-media-buy-request.json +15 -15
  1325. package/dist/lib/schemas-data/3.2/media-buy/update-media-buy-response.json +22 -21
  1326. package/dist/lib/schemas-data/3.2/pricing-options/cpa-option.json +4 -4
  1327. package/dist/lib/schemas-data/3.2/pricing-options/cpc-option.json +4 -4
  1328. package/dist/lib/schemas-data/3.2/pricing-options/cpcv-option.json +4 -4
  1329. package/dist/lib/schemas-data/3.2/pricing-options/cpm-option.json +4 -4
  1330. package/dist/lib/schemas-data/3.2/pricing-options/cpp-option.json +5 -5
  1331. package/dist/lib/schemas-data/3.2/pricing-options/cpv-option.json +4 -4
  1332. package/dist/lib/schemas-data/3.2/pricing-options/flat-rate-option.json +4 -4
  1333. package/dist/lib/schemas-data/3.2/pricing-options/price-breakdown.json +2 -2
  1334. package/dist/lib/schemas-data/3.2/pricing-options/price-guidance.json +1 -1
  1335. package/dist/lib/schemas-data/3.2/pricing-options/revenue-share-option.json +2 -2
  1336. package/dist/lib/schemas-data/3.2/pricing-options/time-option.json +4 -4
  1337. package/dist/lib/schemas-data/3.2/pricing-options/vcpm-option.json +4 -4
  1338. package/dist/lib/schemas-data/3.2/property/authorization-result.json +1 -1
  1339. package/dist/lib/schemas-data/3.2/property/base-property-source.json +4 -4
  1340. package/dist/lib/schemas-data/3.2/property/create-property-list-request.json +8 -8
  1341. package/dist/lib/schemas-data/3.2/property/create-property-list-response.json +6 -6
  1342. package/dist/lib/schemas-data/3.2/property/delete-property-list-request.json +5 -5
  1343. package/dist/lib/schemas-data/3.2/property/delete-property-list-response.json +5 -5
  1344. package/dist/lib/schemas-data/3.2/property/delivery-record.json +3 -3
  1345. package/dist/lib/schemas-data/3.2/property/get-property-list-request.json +5 -5
  1346. package/dist/lib/schemas-data/3.2/property/get-property-list-response.json +9 -9
  1347. package/dist/lib/schemas-data/3.2/property/list-property-lists-request.json +6 -6
  1348. package/dist/lib/schemas-data/3.2/property/list-property-lists-response.json +7 -7
  1349. package/dist/lib/schemas-data/3.2/property/property-error.json +2 -2
  1350. package/dist/lib/schemas-data/3.2/property/property-feature-definition.json +2 -2
  1351. package/dist/lib/schemas-data/3.2/property/property-feature-result.json +4 -4
  1352. package/dist/lib/schemas-data/3.2/property/property-feature-value.json +2 -2
  1353. package/dist/lib/schemas-data/3.2/property/property-feature.json +1 -1
  1354. package/dist/lib/schemas-data/3.2/property/property-list-changed-webhook.json +3 -2
  1355. package/dist/lib/schemas-data/3.2/property/property-list-filters.json +5 -5
  1356. package/dist/lib/schemas-data/3.2/property/property-list.json +6 -6
  1357. package/dist/lib/schemas-data/3.2/property/update-property-list-request.json +8 -8
  1358. package/dist/lib/schemas-data/3.2/property/update-property-list-response.json +6 -6
  1359. package/dist/lib/schemas-data/3.2/property/validate-property-delivery-request.json +6 -6
  1360. package/dist/lib/schemas-data/3.2/property/validate-property-delivery-response.json +6 -6
  1361. package/dist/lib/schemas-data/3.2/property/validation-result.json +5 -5
  1362. package/dist/lib/schemas-data/3.2/protocol/get-adcp-capabilities-request.json +4 -4
  1363. package/dist/lib/schemas-data/3.2/protocol/get-adcp-capabilities-response.json +55 -53
  1364. package/dist/lib/schemas-data/3.2/protocol/get-principal-request.json +4 -4
  1365. package/dist/lib/schemas-data/3.2/protocol/get-principal-response.json +9 -9
  1366. package/dist/lib/schemas-data/3.2/protocol/get-task-status-request.json +5 -5
  1367. package/dist/lib/schemas-data/3.2/protocol/get-task-status-response.json +10 -10
  1368. package/dist/lib/schemas-data/3.2/protocol/list-tasks-request.json +13 -13
  1369. package/dist/lib/schemas-data/3.2/protocol/list-tasks-response.json +8 -8
  1370. package/dist/lib/schemas-data/3.2/protocol/sync-agent-notification-configs-request.json +5 -5
  1371. package/dist/lib/schemas-data/3.2/protocol/sync-agent-notification-configs-response.json +7 -7
  1372. package/dist/lib/schemas-data/3.2/protocol/sync-principal-request.json +8 -8
  1373. package/dist/lib/schemas-data/3.2/protocol/sync-principal-response.json +10 -10
  1374. package/dist/lib/schemas-data/3.2/registries/v1-canonical-mapping.json +2 -2
  1375. package/dist/lib/schemas-data/3.2/signals/activate-signal-request.json +6 -6
  1376. package/dist/lib/schemas-data/3.2/signals/activate-signal-response.json +9 -9
  1377. package/dist/lib/schemas-data/3.2/signals/get-signals-async-response-submitted.json +4 -4
  1378. package/dist/lib/schemas-data/3.2/signals/get-signals-async-response-working.json +3 -3
  1379. package/dist/lib/schemas-data/3.2/signals/get-signals-request.json +12 -11
  1380. package/dist/lib/schemas-data/3.2/signals/get-signals-response.json +17 -17
  1381. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-capabilities.json +1 -1
  1382. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-context-use.json +1 -1
  1383. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-get-offering-request.json +4 -4
  1384. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-get-offering-response.json +9 -9
  1385. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-identity.json +1 -1
  1386. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-initiate-session-request.json +7 -7
  1387. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-initiate-session-response.json +10 -10
  1388. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-send-message-request.json +5 -5
  1389. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-send-message-response.json +10 -10
  1390. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-sponsored-context-receipt.json +4 -4
  1391. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-sponsored-context.json +4 -4
  1392. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-terminate-session-request.json +4 -4
  1393. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-terminate-session-response.json +7 -7
  1394. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-ui-element.json +1 -1
  1395. package/dist/lib/schemas-data/3.2/trusted-match/available-package.json +6 -5
  1396. package/dist/lib/schemas-data/3.2/trusted-match/context-match-request.json +6 -5
  1397. package/dist/lib/schemas-data/3.2/trusted-match/context-match-response.json +4 -4
  1398. package/dist/lib/schemas-data/3.2/trusted-match/error.json +1 -1
  1399. package/dist/lib/schemas-data/3.2/trusted-match/identity-match-request.json +5 -4
  1400. package/dist/lib/schemas-data/3.2/trusted-match/identity-match-response.json +5 -4
  1401. package/dist/lib/schemas-data/3.2/trusted-match/offer-price.json +1 -1
  1402. package/dist/lib/schemas-data/3.2/trusted-match/offer.json +5 -5
  1403. package/dist/lib/schemas-data/3.2/trusted-match/provider-context-match-response.json +4 -4
  1404. package/dist/lib/schemas-data/3.2/trusted-match/provider-identity-match-response.json +4 -4
  1405. package/dist/lib/schemas-data/3.2/trusted-match/provider-registration.json +2 -2
  1406. package/dist/lib/schemas-data/3.2/trusted-match/publisher-targeting-kv-config.json +1 -1
  1407. package/dist/lib/schemas-data/3.2/trusted-match/publisher-tmpx-config.json +1 -1
  1408. package/dist/lib/schemas-data/3.2/trusted-match/tmpx-chunk.json +1 -1
  1409. package/dist/lib/server/create-adcp-server.d.mts +21 -0
  1410. package/dist/lib/server/create-adcp-server.d.ts +21 -0
  1411. package/dist/lib/server/create-adcp-server.js +97 -15
  1412. package/dist/lib/server/create-adcp-server.mjs +83 -1
  1413. package/dist/lib/server/index.d.mts +1 -1
  1414. package/dist/lib/server/index.d.ts +1 -1
  1415. package/dist/lib/server/targeting-helpers.d.mts +1 -1
  1416. package/dist/lib/server/targeting-helpers.d.ts +1 -1
  1417. package/dist/lib/server/targeting-helpers.js +43 -3
  1418. package/dist/lib/server/targeting-helpers.mjs +43 -3
  1419. package/dist/lib/server/wire-spec-fields.generated.d.mts +32 -32
  1420. package/dist/lib/server/wire-spec-fields.generated.d.ts +32 -32
  1421. package/dist/lib/server/wire-spec-fields.generated.js +32 -32
  1422. package/dist/lib/server/wire-spec-fields.generated.mjs +32 -32
  1423. package/dist/lib/signing/agent-context.d.mts +2 -1
  1424. package/dist/lib/signing/agent-context.d.ts +2 -1
  1425. package/dist/lib/signing/agent-context.js +34 -5
  1426. package/dist/lib/signing/agent-context.mjs +34 -5
  1427. package/dist/lib/signing/agent-fetch.d.mts +4 -5
  1428. package/dist/lib/signing/agent-fetch.d.ts +4 -5
  1429. package/dist/lib/signing/agent-fetch.js +55 -24
  1430. package/dist/lib/signing/agent-fetch.mjs +60 -24
  1431. package/dist/lib/signing/body-validation.d.mts +2 -0
  1432. package/dist/lib/signing/body-validation.d.ts +2 -0
  1433. package/dist/lib/signing/body-validation.js +39 -0
  1434. package/dist/lib/signing/body-validation.mjs +15 -0
  1435. package/dist/lib/signing/errors.d.mts +1 -1
  1436. package/dist/lib/signing/errors.d.ts +1 -1
  1437. package/dist/lib/signing/nonce.d.mts +7 -0
  1438. package/dist/lib/signing/nonce.d.ts +7 -0
  1439. package/dist/lib/signing/nonce.js +30 -0
  1440. package/dist/lib/signing/nonce.mjs +6 -0
  1441. package/dist/lib/signing/protocol-methods.d.mts +12 -0
  1442. package/dist/lib/signing/protocol-methods.d.ts +12 -0
  1443. package/dist/lib/signing/protocol-methods.js +66 -0
  1444. package/dist/lib/signing/protocol-methods.mjs +37 -0
  1445. package/dist/lib/signing/provider.d.mts +2 -0
  1446. package/dist/lib/signing/provider.d.ts +2 -0
  1447. package/dist/lib/signing/provider.js +19 -0
  1448. package/dist/lib/signing/provider.mjs +11 -0
  1449. package/dist/lib/signing/types.d.mts +4 -0
  1450. package/dist/lib/signing/types.d.ts +4 -0
  1451. package/dist/lib/signing/verifier.js +21 -14
  1452. package/dist/lib/signing/verifier.mjs +22 -15
  1453. package/dist/lib/signing/webhook-verifier.d.mts +1 -1
  1454. package/dist/lib/signing/webhook-verifier.d.ts +1 -1
  1455. package/dist/lib/signing/webhook-verifier.js +20 -0
  1456. package/dist/lib/signing/webhook-verifier.mjs +20 -0
  1457. package/dist/lib/storage/interfaces.d.mts +2 -0
  1458. package/dist/lib/storage/interfaces.d.ts +2 -0
  1459. package/dist/lib/testing/client.d.mts +0 -3
  1460. package/dist/lib/testing/client.d.ts +0 -3
  1461. package/dist/lib/testing/client.js +116 -23
  1462. package/dist/lib/testing/client.mjs +118 -24
  1463. package/dist/lib/testing/compliance/comply.js +16 -8
  1464. package/dist/lib/testing/compliance/comply.mjs +19 -8
  1465. package/dist/lib/testing/compliance/index.d.mts +1 -1
  1466. package/dist/lib/testing/compliance/index.d.ts +1 -1
  1467. package/dist/lib/testing/compliance/storyboard-tracks.js +1 -1
  1468. package/dist/lib/testing/compliance/storyboard-tracks.mjs +1 -1
  1469. package/dist/lib/testing/compliance/summary.d.mts +7 -0
  1470. package/dist/lib/testing/compliance/summary.d.ts +7 -0
  1471. package/dist/lib/testing/compliance/summary.js +37 -0
  1472. package/dist/lib/testing/compliance/summary.mjs +37 -0
  1473. package/dist/lib/testing/discovery-evidence.d.mts +2 -0
  1474. package/dist/lib/testing/discovery-evidence.d.ts +2 -0
  1475. package/dist/lib/testing/discovery-evidence.js +48 -0
  1476. package/dist/lib/testing/discovery-evidence.mjs +24 -0
  1477. package/dist/lib/testing/index.d.mts +2 -2
  1478. package/dist/lib/testing/index.d.ts +2 -2
  1479. package/dist/lib/testing/storyboard/agent-routing.js +1 -1
  1480. package/dist/lib/testing/storyboard/agent-routing.mjs +2 -2
  1481. package/dist/lib/testing/storyboard/canonical-format-satisfaction.js +8 -0
  1482. package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs +8 -0
  1483. package/dist/lib/testing/storyboard/compliance.js +29 -0
  1484. package/dist/lib/testing/storyboard/compliance.mjs +29 -0
  1485. package/dist/lib/testing/storyboard/default-invariants.js +77 -54
  1486. package/dist/lib/testing/storyboard/default-invariants.mjs +77 -54
  1487. package/dist/lib/testing/storyboard/index.d.mts +2 -2
  1488. package/dist/lib/testing/storyboard/index.d.ts +2 -2
  1489. package/dist/lib/testing/storyboard/prepared-fixtures.d.mts +14 -0
  1490. package/dist/lib/testing/storyboard/prepared-fixtures.d.ts +14 -0
  1491. package/dist/lib/testing/storyboard/prepared-fixtures.js +9 -0
  1492. package/dist/lib/testing/storyboard/prepared-fixtures.mjs +8 -0
  1493. package/dist/lib/testing/storyboard/request-builder.js +11 -3
  1494. package/dist/lib/testing/storyboard/request-builder.mjs +11 -3
  1495. package/dist/lib/testing/storyboard/request-signing/functional-dispatch.js +7 -4
  1496. package/dist/lib/testing/storyboard/request-signing/functional-dispatch.mjs +7 -4
  1497. package/dist/lib/testing/storyboard/runner.d.mts +7 -4
  1498. package/dist/lib/testing/storyboard/runner.d.ts +7 -4
  1499. package/dist/lib/testing/storyboard/runner.js +378 -50
  1500. package/dist/lib/testing/storyboard/runner.mjs +381 -52
  1501. package/dist/lib/testing/storyboard/seeding.d.mts +2 -0
  1502. package/dist/lib/testing/storyboard/seeding.d.ts +2 -0
  1503. package/dist/lib/testing/storyboard/seeding.js +282 -57
  1504. package/dist/lib/testing/storyboard/seeding.mjs +282 -57
  1505. package/dist/lib/testing/storyboard/task-map.d.mts +4 -1
  1506. package/dist/lib/testing/storyboard/task-map.d.ts +4 -1
  1507. package/dist/lib/testing/storyboard/types.d.mts +32 -1
  1508. package/dist/lib/testing/storyboard/types.d.ts +32 -1
  1509. package/dist/lib/testing/storyboard/validations.d.mts +1 -1
  1510. package/dist/lib/testing/storyboard/validations.d.ts +1 -1
  1511. package/dist/lib/testing/storyboard/validations.js +7 -1
  1512. package/dist/lib/testing/storyboard/validations.mjs +7 -1
  1513. package/dist/lib/testing/storyboard/webhook-assertions.js +170 -23
  1514. package/dist/lib/testing/storyboard/webhook-assertions.mjs +170 -23
  1515. package/dist/lib/testing/storyboard/webhook-receiver.d.mts +2 -0
  1516. package/dist/lib/testing/storyboard/webhook-receiver.d.ts +2 -0
  1517. package/dist/lib/testing/storyboard/webhook-receiver.js +29 -2
  1518. package/dist/lib/testing/storyboard/webhook-receiver.mjs +27 -1
  1519. package/dist/lib/testing/types.d.mts +11 -0
  1520. package/dist/lib/testing/types.d.ts +11 -0
  1521. package/dist/lib/types/adcp.d.mts +10 -2
  1522. package/dist/lib/types/adcp.d.ts +10 -2
  1523. package/dist/lib/types/manifest.generated.d.mts +3 -3
  1524. package/dist/lib/types/manifest.generated.d.ts +3 -3
  1525. package/dist/lib/types/per-tool-index.json +1 -1
  1526. package/dist/lib/types/schemas.generated.d.ts +346 -346
  1527. package/dist/lib/types/schemas.generated.js +12797 -12787
  1528. package/dist/lib/types/schemas.generated.mjs +360 -360
  1529. package/dist/lib/types/wellknown-schemas.generated.d.mts +2 -2
  1530. package/dist/lib/types/wellknown-schemas.generated.d.ts +2 -2
  1531. package/dist/lib/version.d.mts +7 -7
  1532. package/dist/lib/version.d.ts +7 -7
  1533. package/dist/lib/version.js +8 -6
  1534. package/dist/lib/version.mjs +8 -6
  1535. package/docs/CLI.md +21 -0
  1536. package/docs/TYPE-SUMMARY.md +13 -2
  1537. package/docs/ZOD-SCHEMAS.md +3 -1
  1538. package/docs/guides/COLLECTION-FIXTURE-FOUNDATION.md +123 -2
  1539. package/docs/guides/DISCOVERY-CACHE-AND-SESSION-REUSE.md +33 -3
  1540. package/docs/guides/REPORTING-LEDGER.md +20 -9
  1541. package/docs/guides/REPORTING-SOURCE-EXECUTOR.md +22 -0
  1542. package/docs/guides/SIGNING-GUIDE.md +10 -0
  1543. package/docs/llms.txt +11 -7
  1544. package/docs/migration-14.x-rc-worksheet.md +6 -6
  1545. package/docs/migration-agent-identity-3.3.md +11 -4
  1546. package/docs/migration-reporting-storage-package.md +15 -0
  1547. package/examples/reliable-reporting-buyer/worker.mjs +3 -1
  1548. package/package.json +4 -4
  1549. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/brand/index.yaml +0 -0
  1550. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/brand/scenarios/distributed_brand_resolution.yaml +0 -0
  1551. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/brand/scenarios/signed_response_envelope_vectors.yaml +0 -0
  1552. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/brand/scenarios/single_side_trust_extension.yaml +0 -0
  1553. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/creative/index.yaml +0 -0
  1554. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/creative/scenarios/asset_type_filtering.yaml +0 -0
  1555. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/creative/scenarios/creative_features_idempotency.yaml +0 -0
  1556. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
  1557. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/creative/scenarios/creative_revision_identity.yaml +0 -0
  1558. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/creative/scenarios/list_creatives_filter_behavior.yaml +0 -0
  1559. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/creative/scenarios/native_localization.yaml +0 -0
  1560. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/creative/scenarios/policy_backed_rejections.yaml +0 -0
  1561. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/governance/index.yaml +0 -0
  1562. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/governance/scenarios/failed_outcome_audit_persistence.yaml +0 -0
  1563. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/acceptance_policy_discovery.yaml +0 -0
  1564. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/account_change_feed.yaml +0 -0
  1565. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/account_timezone_buyer_selected.yaml +0 -0
  1566. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/account_timezone_seller_assigned.yaml +0 -0
  1567. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/account_timezone_seller_fixed.yaml +0 -0
  1568. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/advanced_delivery_reporting.yaml +0 -0
  1569. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/audience_activation_discovery.yaml +0 -0
  1570. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/audience_buy_flow.yaml +0 -0
  1571. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/bidding_cost_binding.yaml +0 -0
  1572. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/bidding_policy_placement.yaml +0 -0
  1573. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
  1574. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/budget_cap_timezone_account.yaml +0 -0
  1575. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/budget_cap_timezone_fixed.yaml +0 -0
  1576. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/budget_cap_timezone_override.yaml +0 -0
  1577. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/budget_cap_timezone_override_rejected.yaml +0 -0
  1578. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/canonical_formats.yaml +0 -0
  1579. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/catalog_item_availability_updates.yaml +0 -0
  1580. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
  1581. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/collection_selection.yaml +0 -0
  1582. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/compact_direct_buy_lifecycle.yaml +0 -0
  1583. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/compact_product_lifecycle.yaml +0 -0
  1584. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
  1585. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/create_media_buy_async.yaml +0 -0
  1586. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/create_media_buy_async_lifecycle.yaml +0 -0
  1587. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/cross_path_targeting_provenance.yaml +0 -0
  1588. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/declined_proposal_execution.yaml +0 -0
  1589. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/declined_proposal_refinement.yaml +0 -0
  1590. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/delivery_reporting.yaml +0 -0
  1591. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/demographic_targeting.yaml +0 -0
  1592. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/dependency_impairment_audience.yaml +0 -0
  1593. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/event_dedup_flow.yaml +0 -0
  1594. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/expired_proposal_execution.yaml +0 -0
  1595. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/external_audience_source_binding.yaml +0 -0
  1596. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
  1597. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/geo_region_all_values_support.yaml +0 -0
  1598. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/geo_region_exclusion_support.yaml +0 -0
  1599. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/geo_region_targeting.yaml +0 -0
  1600. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/get_products_async.yaml +0 -0
  1601. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/governance_agent_binding_acceptance.yaml +0 -0
  1602. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/governance_approved.yaml +0 -0
  1603. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/governance_conditions.yaml +0 -0
  1604. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/governance_denied.yaml +0 -0
  1605. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
  1606. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/inventory_list_targeting.yaml +0 -0
  1607. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/measurement_accountability.yaml +0 -0
  1608. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/media_buy_frequency_cap_readback.yaml +0 -0
  1609. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/metric_container_subsumption.yaml +0 -0
  1610. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/outcome_target.yaml +0 -0
  1611. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/outcome_target_list_products_inert.yaml +0 -0
  1612. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/owner_sold_channel_carriage.yaml +0 -0
  1613. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/package_automatic_bidding.yaml +0 -0
  1614. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
  1615. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
  1616. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/performance_buy_flow.yaml +0 -0
  1617. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
  1618. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/portfolio_routing_scope.yaml +0 -0
  1619. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
  1620. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/product_signal_targeting.yaml +0 -0
  1621. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/proposal_finalize.yaml +0 -0
  1622. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
  1623. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
  1624. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/reach_buy_flow.yaml +0 -0
  1625. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/read_filter_behavior.yaml +0 -0
  1626. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
  1627. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/refine_products.yaml +0 -0
  1628. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/seller_optimized_budget.yaml +0 -0
  1629. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/seller_optimized_min_spend_target_exceeds_package_cap.yaml +0 -0
  1630. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/seller_optimized_proposal_package_pacing.yaml +0 -0
  1631. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/targeting_aware_discovery.yaml +0 -0
  1632. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
  1633. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
  1634. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/signals/scenarios/get_signals_async.yaml +0 -0
  1635. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/sponsored-intelligence/index.yaml +0 -0
  1636. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
  1637. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/brand/index.yaml +0 -0
  1638. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/brand/scenarios/distributed_brand_resolution.yaml +0 -0
  1639. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/brand/scenarios/signed_response_envelope_vectors.yaml +0 -0
  1640. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/brand/scenarios/single_side_trust_extension.yaml +0 -0
  1641. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/creative/index.yaml +0 -0
  1642. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/creative/scenarios/asset_type_filtering.yaml +0 -0
  1643. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/creative/scenarios/creative_features_idempotency.yaml +0 -0
  1644. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
  1645. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/creative/scenarios/creative_revision_identity.yaml +0 -0
  1646. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/creative/scenarios/list_creatives_filter_behavior.yaml +0 -0
  1647. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/creative/scenarios/native_localization.yaml +0 -0
  1648. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/creative/scenarios/policy_backed_rejections.yaml +0 -0
  1649. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/governance/index.yaml +0 -0
  1650. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/governance/scenarios/failed_outcome_audit_persistence.yaml +0 -0
  1651. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/acceptance_policy_discovery.yaml +0 -0
  1652. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/account_change_feed.yaml +0 -0
  1653. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/account_timezone_buyer_selected.yaml +0 -0
  1654. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/account_timezone_seller_assigned.yaml +0 -0
  1655. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/account_timezone_seller_fixed.yaml +0 -0
  1656. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/advanced_delivery_reporting.yaml +0 -0
  1657. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/audience_activation_discovery.yaml +0 -0
  1658. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/audience_buy_flow.yaml +0 -0
  1659. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/bidding_cost_binding.yaml +0 -0
  1660. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/bidding_policy_placement.yaml +0 -0
  1661. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
  1662. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/budget_cap_timezone_account.yaml +0 -0
  1663. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/budget_cap_timezone_fixed.yaml +0 -0
  1664. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/budget_cap_timezone_override.yaml +0 -0
  1665. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/budget_cap_timezone_override_rejected.yaml +0 -0
  1666. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/canonical_formats.yaml +0 -0
  1667. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/catalog_item_availability_updates.yaml +0 -0
  1668. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
  1669. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/collection_selection.yaml +0 -0
  1670. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/compact_direct_buy_lifecycle.yaml +0 -0
  1671. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/compact_product_lifecycle.yaml +0 -0
  1672. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
  1673. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/create_media_buy_async.yaml +0 -0
  1674. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/create_media_buy_async_lifecycle.yaml +0 -0
  1675. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/cross_path_targeting_provenance.yaml +0 -0
  1676. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/declined_proposal_execution.yaml +0 -0
  1677. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/declined_proposal_refinement.yaml +0 -0
  1678. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/delivery_reporting.yaml +0 -0
  1679. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/demographic_targeting.yaml +0 -0
  1680. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/dependency_impairment_audience.yaml +0 -0
  1681. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/event_dedup_flow.yaml +0 -0
  1682. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/expired_proposal_execution.yaml +0 -0
  1683. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/external_audience_source_binding.yaml +0 -0
  1684. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
  1685. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/geo_region_all_values_support.yaml +0 -0
  1686. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/geo_region_exclusion_support.yaml +0 -0
  1687. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/geo_region_targeting.yaml +0 -0
  1688. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/get_products_async.yaml +0 -0
  1689. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/governance_agent_binding_acceptance.yaml +0 -0
  1690. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/governance_approved.yaml +0 -0
  1691. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/governance_conditions.yaml +0 -0
  1692. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/governance_denied.yaml +0 -0
  1693. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
  1694. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/inventory_list_targeting.yaml +0 -0
  1695. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/measurement_accountability.yaml +0 -0
  1696. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/media_buy_frequency_cap_readback.yaml +0 -0
  1697. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/metric_container_subsumption.yaml +0 -0
  1698. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/outcome_target.yaml +0 -0
  1699. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/outcome_target_list_products_inert.yaml +0 -0
  1700. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/owner_sold_channel_carriage.yaml +0 -0
  1701. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/package_automatic_bidding.yaml +0 -0
  1702. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
  1703. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
  1704. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/performance_buy_flow.yaml +0 -0
  1705. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
  1706. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/portfolio_routing_scope.yaml +0 -0
  1707. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
  1708. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/product_signal_targeting.yaml +0 -0
  1709. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/proposal_finalize.yaml +0 -0
  1710. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
  1711. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
  1712. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/reach_buy_flow.yaml +0 -0
  1713. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/read_filter_behavior.yaml +0 -0
  1714. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
  1715. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/refine_products.yaml +0 -0
  1716. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/seller_optimized_budget.yaml +0 -0
  1717. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/seller_optimized_min_spend_target_exceeds_package_cap.yaml +0 -0
  1718. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/seller_optimized_proposal_package_pacing.yaml +0 -0
  1719. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/targeting_aware_discovery.yaml +0 -0
  1720. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
  1721. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
  1722. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/signals/scenarios/get_signals_async.yaml +0 -0
  1723. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/sponsored-intelligence/index.yaml +0 -0
  1724. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
  1725. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/brand-rights/scenarios/governance_approved.yaml +0 -0
  1726. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/brand-rights/scenarios/governance_denied.yaml +0 -0
  1727. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/brand-rights/scenarios/update_rights_lifecycle.yaml +0 -0
  1728. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/buyer-activation/index.yaml +0 -0
  1729. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/buyer-discovery/index.yaml +0 -0
  1730. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/buyer-negotiation/index.yaml +0 -0
  1731. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/buyer-recovery/index.yaml +0 -0
  1732. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/creative-ad-server/index.yaml +0 -0
  1733. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/creative-generative/generative-seller.yaml +0 -0
  1734. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/creative-transformers/scenarios/governance_approved.yaml +0 -0
  1735. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/creative-transformers/scenarios/governance_denied.yaml +0 -0
  1736. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/governance-aware-seller/index.yaml +0 -0
  1737. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +0 -0
  1738. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/governance-spend-authority/denied.yaml +0 -0
  1739. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/orchestrator-multi-agent/index.yaml +0 -0
  1740. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sales-broadcast-tv/index.yaml +0 -0
  1741. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sales-catalog-driven/index.yaml +0 -0
  1742. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sales-exchange/index.yaml +0 -0
  1743. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sales-guaranteed/index.yaml +0 -0
  1744. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sales-proposal-mode/index.yaml +0 -0
  1745. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sales-retail-media/index.yaml +0 -0
  1746. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sales-social/index.yaml +0 -0
  1747. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sales-streaming-tv/index.yaml +0 -0
  1748. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/signal-marketplace/scenarios/governance_approved.yaml +0 -0
  1749. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/signal-marketplace/scenarios/governance_denied.yaml +0 -0
  1750. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sponsored-intelligence/index.yaml +0 -0
  1751. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/acme-outdoor-live.yaml +0 -0
  1752. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/acme-outdoor.yaml +0 -0
  1753. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/billing-gate-runner.yaml +0 -0
  1754. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/bistro-oranje.yaml +0 -0
  1755. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/distributed-brand-runner.yaml +0 -0
  1756. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/hosted-grader.yaml +0 -0
  1757. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/nova-motors.yaml +0 -0
  1758. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/oauth-setup-runner.yaml +0 -0
  1759. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/osei-natural.yaml +0 -0
  1760. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/parallel-dispatch-runner.yaml +0 -0
  1761. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/rate-limit-trip-runner.yaml +0 -0
  1762. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/signed-requests-runner.yaml +0 -0
  1763. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/signed-responses-runner.yaml +0 -0
  1764. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/single-side-trust-runner.yaml +0 -0
  1765. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/substitution-observer-runner.yaml +0 -0
  1766. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/summit-foods.yaml +0 -0
  1767. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/trusted-match-router-runner.yaml +0 -0
  1768. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/webhook-receiver-runner.yaml +0 -0
  1769. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/attestations/README.md +0 -0
  1770. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/attestations/vectors.json +0 -0
  1771. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/audience-evidence/README.md +0 -0
  1772. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/audience-evidence/vectors.json +0 -0
  1773. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/brand-response-signing/brand-authorization-cross-check.json +0 -0
  1774. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/catalog-macro-substitution.json +0 -0
  1775. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/creative-representation-resolution.json +0 -0
  1776. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/creative-representation-resolution.schema.json +0 -0
  1777. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/error-recovery/README.md +0 -0
  1778. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/error-recovery/vectors.json +0 -0
  1779. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/governance-authorization.json +0 -0
  1780. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/governance-runtime-attestations/README.md +0 -0
  1781. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/governance-runtime-attestations/vectors.json +0 -0
  1782. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/macro-processing.json +0 -0
  1783. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/macro-processing.schema.json +0 -0
  1784. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/oauth-setup/vectors.json +0 -0
  1785. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/001-minimal-plan.json +0 -0
  1786. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/002-full-plan.json +0 -0
  1787. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/003-bookkeeping-stripped.json +0 -0
  1788. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/004a-human-review-omitted.json +0 -0
  1789. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/004b-human-review-explicit-null.json +0 -0
  1790. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/005a-policy-categories-order-1.json +0 -0
  1791. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/005b-policy-categories-order-2.json +0 -0
  1792. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/006a-ext-trace-v1.json +0 -0
  1793. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/006b-ext-trace-v2.json +0 -0
  1794. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/007-unicode-objectives.json +0 -0
  1795. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/008-numeric-canonicalization.json +0 -0
  1796. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/products-only-brief-compatibility/README.md +0 -0
  1797. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/products-only-brief-compatibility/vectors.json +0 -0
  1798. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/relationship-scoped-indicators.json +0 -0
  1799. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/README.md +0 -0
  1800. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/adjustment.json +0 -0
  1801. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/canonicalization.json +0 -0
  1802. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/coverage-aggregation.json +0 -0
  1803. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/manifest.json +0 -0
  1804. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/materialization.json +0 -0
  1805. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/obligation.json +0 -0
  1806. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/receipts/accepted-recorded-response.json +0 -0
  1807. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/receipts/accepted-request.json +0 -0
  1808. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/receipts/accepted-unchanged-response.json +0 -0
  1809. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/receipts/adjustment-accepted-recorded-response.json +0 -0
  1810. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/receipts/adjustment-accepted-request.json +0 -0
  1811. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/receipts/rejected-recorded-response.json +0 -0
  1812. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/receipts/rejected-request.json +0 -0
  1813. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/report-definition.json +0 -0
  1814. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/revision.json +0 -0
  1815. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/row-schema.json +0 -0
  1816. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/rows.jsonl +0 -0
  1817. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/scenario-index.json +0 -0
  1818. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/scenario-index.schema.json +0 -0
  1819. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-summary/complete-summary.json +0 -0
  1820. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/README.md +0 -0
  1821. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/001-unsigned-sendmessage-required.json +0 -0
  1822. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/002-unsigned-message-send-v0-3-required.json +0 -0
  1823. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/003-unsigned-sendstreamingmessage-required.json +0 -0
  1824. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/004-duplicate-invocation-datapart.json +0 -0
  1825. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/005-signed-duplicate-invocation-datapart.json +0 -0
  1826. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/006-missing-skill.json +0 -0
  1827. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/007-protocol-method-required-covers-sendmessage.json +0 -0
  1828. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/008-no-extension-header.json +0 -0
  1829. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/009-extra-non-invocation-datapart.json +0 -0
  1830. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/010-filepart-present.json +0 -0
  1831. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/011-part-with-text-and-data.json +0 -0
  1832. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/012-non-object-data.json +0 -0
  1833. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/013-v0-3-kind-mismatch.json +0 -0
  1834. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/014-duplicate-skill-key.json +0 -0
  1835. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/015-non-string-skill.json +0 -0
  1836. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/016-text-only-message.json +0 -0
  1837. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/017-unsigned-message-stream-v0-3-required.json +0 -0
  1838. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/018-unresolvable-with-lone-signature-header.json +0 -0
  1839. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/019-raw-part-present.json +0 -0
  1840. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/020-case-variant-member-name.json +0 -0
  1841. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/021-escaped-duplicate-skill-key.json +0 -0
  1842. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/022-unsigned-http-json-message-send-required.json +0 -0
  1843. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/023-batch-body.json +0 -0
  1844. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/024-duplicate-method-key.json +0 -0
  1845. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/025-missing-method.json +0 -0
  1846. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/026-empty-skill.json +0 -0
  1847. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/positive/001-signed-sendmessage-create-media-buy.json +0 -0
  1848. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/positive/002-signed-message-send-v0-3-create-media-buy.json +0 -0
  1849. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/positive/003-unsigned-sendmessage-get-products-not-required.json +0 -0
  1850. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/positive/004-unsigned-decoy-text-and-metadata.json +0 -0
  1851. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/positive/005-unsigned-alias-skill-not-in-lists.json +0 -0
  1852. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/positive/006-unsigned-message-send-v0-3-legacy-parameters.json +0 -0
  1853. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/positive/007-unsigned-method-case-variant.json +0 -0
  1854. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/body-integrity-policy.json +0 -0
  1855. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/canonicalization.json +0 -0
  1856. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/keys.json +0 -0
  1857. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/001-no-signature-header.json +0 -0
  1858. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/002-wrong-tag.json +0 -0
  1859. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/003-expired-signature.json +0 -0
  1860. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/004-window-too-long.json +0 -0
  1861. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/005-alg-not-allowed.json +0 -0
  1862. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/006-missing-covered-component.json +0 -0
  1863. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/007-missing-content-digest.json +0 -0
  1864. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/008-unknown-keyid.json +0 -0
  1865. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +0 -0
  1866. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/010-content-digest-mismatch.json +0 -0
  1867. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/011-malformed-header.json +0 -0
  1868. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/012-missing-expires-param.json +0 -0
  1869. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/013-expires-le-created.json +0 -0
  1870. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/014-missing-nonce-param.json +0 -0
  1871. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/015-signature-invalid.json +0 -0
  1872. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/016-replayed-nonce.json +0 -0
  1873. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/017-key-revoked.json +0 -0
  1874. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +0 -0
  1875. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/019-signature-without-signature-input.json +0 -0
  1876. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/020-rate-abuse.json +0 -0
  1877. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +0 -0
  1878. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/022-multi-valued-content-type.json +0 -0
  1879. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +0 -0
  1880. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/024-unquoted-string-param.json +0 -0
  1881. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +0 -0
  1882. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/026-non-ascii-host.json +0 -0
  1883. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +0 -0
  1884. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +0 -0
  1885. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/029-duplicate-signature-label.json +0 -0
  1886. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/030-content-digest-key-case.json +0 -0
  1887. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/031-malformed-host-authority.json +0 -0
  1888. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/001-basic-post.json +0 -0
  1889. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/002-post-with-content-digest.json +0 -0
  1890. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/003-es256-post.json +0 -0
  1891. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/004-multiple-signature-labels.json +0 -0
  1892. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/005-default-port-stripped.json +0 -0
  1893. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/006-dot-segment-path.json +0 -0
  1894. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/007-query-byte-preserved.json +0 -0
  1895. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/008-percent-encoded-path.json +0 -0
  1896. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +0 -0
  1897. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +0 -0
  1898. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/011-ipv6-authority.json +0 -0
  1899. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +0 -0
  1900. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/013-two-signature-labels-distinct.json +0 -0
  1901. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/014-content-digest-two-algorithms.json +0 -0
  1902. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/015-bracketed-ipv6-host-with-port.json +0 -0
  1903. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/001-base64url-sf-binary.json +0 -0
  1904. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/001-no-signature-header.json +0 -0
  1905. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/002-multiple-trailing-dots.json +0 -0
  1906. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/002-wrong-tag.json +0 -0
  1907. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/003-expired-signature.json +0 -0
  1908. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/004-window-too-long.json +0 -0
  1909. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/005-alg-not-allowed.json +0 -0
  1910. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/006-missing-covered-component.json +0 -0
  1911. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/007-missing-content-digest.json +0 -0
  1912. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/008-unknown-keyid.json +0 -0
  1913. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/009-key-ops-missing-verify.json +0 -0
  1914. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/010-content-digest-mismatch.json +0 -0
  1915. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/011-malformed-header.json +0 -0
  1916. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/012-missing-expires-param.json +0 -0
  1917. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/013-expires-le-created.json +0 -0
  1918. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/014-missing-nonce-param.json +0 -0
  1919. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/015-signature-invalid.json +0 -0
  1920. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/016-replayed-nonce.json +0 -0
  1921. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/017-key-revoked.json +0 -0
  1922. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/019-signature-without-signature-input.json +0 -0
  1923. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/020-rate-abuse.json +0 -0
  1924. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/021-duplicate-signature-input-label.json +0 -0
  1925. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/022-multi-valued-content-type.json +0 -0
  1926. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/023-multi-valued-content-digest.json +0 -0
  1927. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/024-unquoted-string-param.json +0 -0
  1928. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/025-jwk-alg-crv-mismatch.json +0 -0
  1929. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/026-non-ascii-host.json +0 -0
  1930. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/027-webhook-registration-authentication-unsigned.json +0 -0
  1931. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/028-unsigned-protocol-method-required.json +0 -0
  1932. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/029-duplicate-signature-label.json +0 -0
  1933. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/030-content-digest-key-case.json +0 -0
  1934. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/031-malformed-host-authority.json +0 -0
  1935. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/001-post-with-content-digest.json +0 -0
  1936. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/003-es256-post.json +0 -0
  1937. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/004-multiple-signature-labels.json +0 -0
  1938. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/005-default-port-stripped.json +0 -0
  1939. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/006-dot-segment-path.json +0 -0
  1940. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/007-query-byte-preserved.json +0 -0
  1941. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/008-percent-encoded-path.json +0 -0
  1942. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/009-percent-encoded-unreserved-decoded.json +0 -0
  1943. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/010-percent-encoded-slash-preserved.json +0 -0
  1944. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/011-ipv6-authority.json +0 -0
  1945. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/012-ipv6-authority-default-port-stripped.json +0 -0
  1946. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/013-two-signature-labels-distinct.json +0 -0
  1947. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/014-content-digest-two-algorithms.json +0 -0
  1948. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/015-bracketed-ipv6-host-with-port.json +0 -0
  1949. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/protocol-method-names.json +0 -0
  1950. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/rights-attestations/README.md +0 -0
  1951. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/rights-attestations/vectors.json +0 -0
  1952. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/supply-path/README.md +0 -0
  1953. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/supply-path/vectors.json +0 -0
  1954. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/tracker-execution-contracts.json +0 -0
  1955. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/tracker-execution-contracts.schema.json +0 -0
  1956. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/trusted-match-context-merge/README.md +0 -0
  1957. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/trusted-match-context-merge/vectors.json +0 -0
  1958. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/universal-macro-translation.json +0 -0
  1959. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/universal-macro-translation.schema.json +0 -0
  1960. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-receiver-envelope.json +0 -0
  1961. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/README.md +0 -0
  1962. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/keys.json +0 -0
  1963. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/001-wrong-tag.json +0 -0
  1964. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/002-expired-signature.json +0 -0
  1965. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/003-window-too-long.json +0 -0
  1966. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +0 -0
  1967. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/005-missing-authority-component.json +0 -0
  1968. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/006-missing-content-digest.json +0 -0
  1969. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/007-unknown-keyid.json +0 -0
  1970. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +0 -0
  1971. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +0 -0
  1972. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +0 -0
  1973. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/011-signature-without-input.json +0 -0
  1974. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/012-missing-expires-param.json +0 -0
  1975. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/013-expires-le-created.json +0 -0
  1976. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +0 -0
  1977. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/015-signature-invalid.json +0 -0
  1978. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/016-replayed-nonce.json +0 -0
  1979. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/017-key-revoked.json +0 -0
  1980. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/018-rate-abuse.json +0 -0
  1981. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/019-revocation-stale.json +0 -0
  1982. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +0 -0
  1983. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +0 -0
  1984. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/positive/001-basic-post.json +0 -0
  1985. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/positive/002-es256-post.json +0 -0
  1986. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +0 -0
  1987. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/positive/004-default-port-stripped.json +0 -0
  1988. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +0 -0
  1989. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +0 -0
  1990. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +0 -0
  1991. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/positive/008-request-signing-key-reuse.json +0 -0
  1992. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/account-identity-reconciliation.yaml +0 -0
  1993. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/agent-notification-configs.yaml +0 -0
  1994. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/billing-gate-dispatch.yaml +0 -0
  1995. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/buyer-fixture-publisher.yaml +0 -0
  1996. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/buyer-orchestrator-track.yaml +0 -0
  1997. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/comply-controller-mode-gate.yaml +0 -0
  1998. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/deterministic-testing.yaml +0 -0
  1999. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/fictional-entities.yaml +0 -0
  2000. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/get-products-pagination-integrity.yaml +0 -0
  2001. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/governance.yaml +0 -0
  2002. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/idempotency.yaml +0 -0
  2003. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/notification-config-event-scope.yaml +0 -0
  2004. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/notification-config-lifecycle.yaml +0 -0
  2005. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/notification-config-rejections.yaml +0 -0
  2006. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/oauth-setup.yaml +0 -0
  2007. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/pagination-integrity-creative-formats.yaml +0 -0
  2008. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/pagination-integrity-list-accounts.yaml +0 -0
  2009. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/pagination-integrity.yaml +0 -0
  2010. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/principal.yaml +0 -0
  2011. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/reliable-reporting-managed-delivery.yaml +0 -0
  2012. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/reliable-reporting-reconciled-billing.yaml +0 -0
  2013. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/reporting-consumer-status.yaml +0 -0
  2014. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/reporting-core-declaration.yaml +0 -0
  2015. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/reporting-core.yaml +0 -0
  2016. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/security.yaml +0 -0
  2017. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/signed-requests.yaml +0 -0
  2018. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/trusted-match-publisher-authentication.yaml +0 -0
  2019. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/v3-envelope-integrity.yaml +0 -0
  2020. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/webhook-receiver-envelope.yaml +0 -0
  2021. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/wholesale-feed-bulk-webhooks.yaml +0 -0
  2022. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/wholesale-feed-product-webhooks.yaml +0 -0
  2023. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/wholesale-feed-products-scope-isolation.yaml +0 -0
  2024. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/wholesale-feed-products.yaml +0 -0
  2025. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/wholesale-feed-signal-webhooks.yaml +0 -0
  2026. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/wholesale-feed-signals-scope-isolation.yaml +0 -0
  2027. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/wholesale-feed-signals.yaml +0 -0
@@ -1,4 +1,4 @@
1
- import { z } from "zod";
1
+ import * as z from "zod";
2
2
  import { fullFormats as adcpJsonSchemaFormats } from "ajv-formats/dist/formats.js";
3
3
  const adcpDateTimeFormat = /* @__PURE__ */ (() => adcpJsonSchemaFormats["date-time"])();
4
4
  const adcpUriFormat = /* @__PURE__ */ (() => adcpJsonSchemaFormats.uri)();
@@ -447,7 +447,7 @@ const AudienceForecastDimensionSchema = /* @__PURE__ */ (() => z.object({
447
447
  audience_source: AudienceSourceSchema,
448
448
  audience_name: z.string().optional()
449
449
  }).passthrough())();
450
- const SignalForecastDimensionSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
450
+ const SignalForecastDimensionSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
451
451
  kind: z.literal("signal"),
452
452
  signal_ref: SignalRefSchema.optional(),
453
453
  signal_id: z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).optional(),
@@ -709,8 +709,8 @@ const CancellationPolicySchema = /* @__PURE__ */ (() => z.object({
709
709
  const FlightChangeConstraintsSchema = /* @__PURE__ */ (() => z.object({
710
710
  kind: z.literal("flight"),
711
711
  max_change: DurationSchema.optional(),
712
- earliest_result: z.iso.datetime().optional(),
713
- latest_result: z.iso.datetime().optional(),
712
+ earliest_result: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
713
+ latest_result: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
714
714
  minimum_notice: DurationSchema.optional()
715
715
  }).passthrough().and(z.union([z.object({
716
716
  max_change: DurationSchema
@@ -720,7 +720,7 @@ const FlightChangeConstraintsSchema = /* @__PURE__ */ (() => z.object({
720
720
  latest_result: z.string()
721
721
  }).passthrough(), z.object({
722
722
  minimum_notice: DurationSchema
723
- }).passthrough()])))();
723
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
724
724
  const PackageCountConstraintsSchema = /* @__PURE__ */ (() => z.object({
725
725
  kind: z.literal("package_count"),
726
726
  max_additions: z.int().min(0).optional(),
@@ -732,19 +732,19 @@ const PackageCountConstraintsSchema = /* @__PURE__ */ (() => z.object({
732
732
  max_removals: z.number()
733
733
  }).passthrough(), z.object({
734
734
  max_result_count: z.number()
735
- }).passthrough()])))();
735
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
736
736
  const EffectiveTimingConstraintsSchema = /* @__PURE__ */ (() => z.object({
737
737
  kind: z.literal("effective_timing"),
738
738
  minimum_notice: DurationSchema.optional(),
739
- earliest_effective_at: z.iso.datetime().optional(),
740
- latest_effective_at: z.iso.datetime().optional()
739
+ earliest_effective_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
740
+ latest_effective_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
741
741
  }).passthrough().and(z.union([z.object({
742
742
  minimum_notice: DurationSchema
743
743
  }).passthrough(), z.object({
744
744
  earliest_effective_at: z.string()
745
745
  }).passthrough(), z.object({
746
746
  latest_effective_at: z.string()
747
- }).passthrough()])))();
747
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
748
748
  const MoneySchema = /* @__PURE__ */ (() => z.object({
749
749
  amount: z.number().min(0),
750
750
  currency: z.string().regex(/^[A-Z]{3}$/)
@@ -939,7 +939,7 @@ const PostalCountrySystemSchema = /* @__PURE__ */ (() => z.union([z.object({
939
939
  }).passthrough(), z.object({
940
940
  country: z.string().refine((country) => !["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"].includes(country)).optional(),
941
941
  system: z.union([z.literal("postal_code"), z.literal("custom")]).optional()
942
- }).passthrough()]).and(z.object({
942
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.").and(z.object({
943
943
  country: z.string(),
944
944
  system: PostalCodeSystemSchema
945
945
  }).passthrough()))();
@@ -2183,7 +2183,7 @@ const CanonicalFormatVASTVideoSchema = /* @__PURE__ */ (() => z.object({
2183
2183
  max_wrapper_depth: z.int().min(0).optional(),
2184
2184
  ssl_required: z.boolean().optional()
2185
2185
  }).passthrough())();
2186
- const CanonicalFormatSellerRenderedStatefulDisplaySchema = /* @__PURE__ */ (() => z.object({ "experimental": z.boolean().describe("Experimental in AdCP 3.2 while the creative working group gathers implementation evidence across premium web and mobile/app sellers.").optional(), "deprecated": z.boolean().describe("When true, this canonical (or a seller's specific narrowing of it) is going away. Existing adopters are supported through the deprecation cycle; new adoption is discouraged. Pair with `migration_target_version` to indicate when the canonical is expected to be removed. Distinct from `experimental`: an experimental canonical may stabilize and stop being experimental; a deprecated canonical is on a sunset path.").optional(), "v1_translatable": z.boolean().describe("No v1 named-format equivalent can express multiple seller-rendered states and their breakpoint bindings.").optional(), "since_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version that introduced this canonical (e.g., '3.1', '3.2'). Lets adopters reason about minimum protocol version requirements when consuming a format declaration. Patch precision is intentionally rejected \u2014 canonicals are introduced at minor-version boundaries.").optional(), "migration_target_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version by which the working group expects this canonical to stabilize, surface a breaking revision, or (when `deprecated: true`) be removed. Patch precision is intentionally rejected \u2014 canonicals shift at minor-version boundaries. Absence signals 'no specific target' (omit the field rather than use a placeholder like 'unknown').").optional(), "composition_model": z.enum(["deterministic", "algorithmic"]).describe("Whether the surface composes deterministically (buyer can predict per-slot rendering \u2014 sponsored_placement, image, video) or algorithmically (surface chooses combinations or phrasing \u2014 responsive_creative, agent_placement).").optional(), "provenance_required": z.boolean().describe("When true, the product rejects unsigned synthesized assets. Builders calling build_creative MUST attach a C2PA-compatible provenance manifest attributing synthesis to the creative agent.").optional(), "platform_extensions": z.array(z.object({ "uri": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("HTTPS URL identifying the extension. `https://` is mandatory \u2014 `http://`, `file://`, `data:`, and other schemes are rejected at the schema layer (defense-in-depth on top of the fetch-contract normative rules). The URI base is the owning agent's URL; the path identifies the extension within that agent. Example: 'https://creative.adcontextprotocol.org/translated/meta/extensions/meta_pixel'. The full fetch contract \u2014 SSRF allowlist, response-size cap, $ref sandbox, schema-compile bounds \u2014 is documented on `product-format-declaration.json#format_schema` and applies to ALL fetches of this reference shape regardless of whether the field is named `format_schema` (load-bearing for validation) or `platform_extensions` (informational); the *transport* rules are identical, only the *consumption* semantics differ."), "digest": z.string().regex(new RegExp("^sha256:[a-f0-9]{64}$")).describe("SHA-256 content digest of the extension definition (sha256:<hex>). Used to detect drift \u2014 if the agent revises the extension, the digest changes and cached definitions become invalid.") }).catchall(z.any()).describe("Reference to a platform extension definition. The agent that owns the URI is authoritative for the extension's schema. Buyers fetch the definition once per content digest and cache it. Platform extensions are typically bundled in `get_products` responses under an `extensions` map keyed by `uri@digest`, eliminating the need for a separate fetch.\n\n**Within a single response**, multiple references to the same `uri` MUST carry the same `digest` \u2014 divergent digests in one response indicate producer-side error (e.g., concurrent extension revision mid-render). Buyers encountering divergent digests for the same URI MUST fail closed: treat all references to that URI as unresolved and surface a validation error rather than picking one branch silently. **Across responses**, digest divergence is normal \u2014 extension authors revise their schemas, the new digest differs, the cache key changes, and the buyer refetches. Cache by `uri@digest`, not by `uri` alone.")).describe('Platform-specific extensions narrowing the canonical (pixel ID shapes, conversion event taxonomies, platform-specific CTAs/destinations). Each extension is a URI+digest reference resolved against the bundled `extensions` map in get_products responses or fetched directly.\n\n**Collision precedence (normative).** When two or more `platform_extensions[]` entries on the same declaration extend the same target (e.g., both extend `tracking`) with overlapping field names, **array order is authoritative \u2014 later entries override earlier ones on a per-field basis** (last-in-array-wins). SDKs MUST surface the overlap via the `errors[]` array on the `get_products` response with a structured code (`FORMAT_DECLARATION_DIVERGENT` is appropriate when the overlap appears across dual-emitted shapes; a producer-self-emitted overlap on a single declaration SHOULD use the same code with `error.details: { collision_kind: "platform_extension_field", target, overlapping_fields, winning_extension_uri }`). Producers SHOULD avoid the collision by emitting one extension per target or by partitioning fields across extensions; the deterministic precedence is for last-resort consistency across SDK implementations, not a sanctioned merging strategy.').optional(), "synthesis_nondeterministic": z.boolean().describe("When true, the format's production pipeline is genuinely nondeterministic \u2014 the platform cannot guarantee that synthesis from a given input set produces in-spec output. Veo / Sora / Runway-class generative video, and other AI-synthesis flows where output dimensions, duration, or quality vary per run. Implies a different validation contract: predictive `validate_input` is impossible; the platform's own post-synthesis QA loop applies; if the QA loop exhausts without producing a valid artifact, `build_creative` returns task_failed with a synthesis_failed reason. Distinct from `composition_model` (which describes how the surface composes per-slot rendering, not whether synthesis is deterministic). When false or absent, the format's production is predictable enough that `validate_input` can predict output properties from input properties.\n\n**Compatibility with `asset_source` / `item_production_model`**: `synthesis_nondeterministic: true` MAY pair with any of `seller_pre_rendered_from_brief`, `seller_human_designed`, or `agent_synthesized` (the QA loop is concept-level, not source-specific \u2014 'seller renders from brief but each retry differs' is just as nondeterministic as Veo). It MUST NOT pair with `buyer_uploaded` (the buyer ships pre-rendered bytes; there's no synthesis step to be nondeterministic about). It MUST NOT pair with `publisher_host_recorded` (the publisher's host produces a deterministic-from-script output even if the human voice varies). When `synthesis_nondeterministic: true` is set with an incompatible source, validators SHOULD reject with a structured error.").optional(), "slots": z.array(z.object({ "asset_group_id": z.string().describe("Canonical asset_group_id from /schemas/core/asset-group-vocabulary.json. Non-canonical IDs are valid but trigger soft warnings."), "asset_type": z.enum(["image", "video", "audio", "text", "markdown", "url", "html", "css", "javascript", "vast", "daast", "display_tag", "webhook", "brief", "catalog", "published_post", "zip", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]).describe("Discriminator selecting the asset schema this slot accepts. SDK codegen uses this to type the slot value. `display_tag` is the atomic third-party display representation (URL, inline markup, or paired redirect). `published_post` is an existing-post reference asset. `pixel_tracker` / `vast_tracker` / `daast_tracker` are renderer-fired tracker primitives. `object` is a last-resort fallback."), "required": z.boolean().describe("Whether this slot is required for a valid manifest.").optional(), "min": z.number().int().gte(0).describe("Minimum count for repeatable / pool slots.").optional(), "max": z.number().int().gte(1).describe("Maximum count for repeatable / pool slots.").optional(), "max_chars": z.number().int().gte(1).describe("Per-slot character limit. Valid only when `asset_type` is `text`, `markdown`, or `brief`. Mutually exclusive with `max_size_kb` (which applies to binary asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "max_size_kb": z.number().int().gte(1).describe("Per-slot file size limit in exact kilobytes, where 1 KB = 1,000 bytes. Valid only when `asset_type` is `image`, `video`, `audio`, or `zip`. Mutually exclusive with `max_chars` (which applies to text asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Accepted intrinsic-pixel densities for this image-bearing slot. Valid when `asset_type` is `image`, and on a `card` slot where it constrains each card's image media (video media is unaffected). This makes density available to every canonical carrying image assets (native, carousel, responsive, companion images, and image itself), not only `format_kind: image`. When the image canonical also declares top-level `params.pixel_ratios`, the effective set is the intersection; an empty intersection is invalid. One matching asset satisfies the slot unless `required_pixel_ratios` requires rendition coverage.").optional(), "required_pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Required density coverage for an image rendition set. Valid only when `asset_type` is `image` and `pixel_ratios` is also declared. Every value MUST appear in the effective accepted set after intersecting any top-level image `params.pixel_ratios`, and the manifest slot value MUST be an array containing exactly one matching image rendition for each required ratio. Other accepted ratios remain optional. For example, `pixel_ratios: [1, 1.5, 2]` with `required_pixel_ratios: [1, 2]` requires the 1x and 2x renditions while making 1.5x optional. SDKs enforce intersection, subset, coverage, and duplicate-ratio rules because JSON Schema draft-07 cannot express them generically.").optional(), "logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("When `asset_group_id` is `logo`, renderer-facing brand.json logo slots acceptable for this format slot. Producers selecting from brand.json SHOULD prefer `logos[]` entries whose `slots[]` intersects this list, then apply `visual_guidelines.logo_usage_rules[]`.").optional(), "required_logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Subset of `logo_slots` for which this format expects explicit logo coverage. A manifest or brand-derived logo pool SHOULD include at least one usable logo for each required slot; if coverage is missing, builders SHOULD surface a validation warning or approval mapping instead of guessing from prose.").optional(), "description": z.string().describe("Human-readable description of what the slot expects from the buyer.").optional(), "consumed_for_production": z.boolean().describe("Dispatch hint for `build_creative` and v1\u2194v2 wire translators: when `true`, the slot's value is consumed as INPUT to a production step (host-read script, brief copy fed to generative synthesis, catalog feed driving per-SKU rendering) and is not rendered verbatim. When `false` (default), the slot's value is rendered verbatim on the placement (image bytes, video file, display tag).\n\nMotivates the v1\u2194v2 dispatch table: pre-v2 buyers shipped production-consumed inputs separately in a `inputs` map on the build_creative request; v2 collapses inputs and rendered assets into a single `assets` map keyed by `asset_group_id`. SDK translators between v1 and v2 use this flag per canonical to know which assets in the v2 manifest map back to v1 `inputs` vs v1 `assets`. Without the per-slot flag the dispatch table lives in adopter code and every SDK gets it slightly different.\n\nProducers SHOULD set this explicitly on slots whose consumption pattern isn't obvious (host-read scripts on `audio_hosted`, briefs on generative `video_hosted`, catalog feeds on `sponsored_placement`). For canonicals where every slot is render-verbatim (`image`, `display_tag`, `video_vast`, `audio_vast`), the default `false` is sufficient and the flag MAY be omitted.").optional() }).catchall(z.any()).and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }), z.any().refine((value) => !z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }), z.any().refine((value) => !z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.union([z.any().refine((value) => !z.any().refine((value2) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema").safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.any().refine((value) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.any().refine((value) => !z.union([z.object({ "logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "required_logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]))), z.intersection(z.any(), z.intersection(z.union([z.any().refine((value) => !z.object({ "required_pixel_ratios": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "required_pixel_ratios": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "asset_type": z.literal("image").optional() }))]), z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }), z.any().refine((value) => !z.union([z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))])))))).describe("Default manifest slots; which are consumed depends on `supply_mode`. `state_canvases` images MUST carry `state_id` and `breakpoint_id`, and `state_click_urls` entries MUST carry `state_id` (semantic validators resolve the bindings). Component images SHOULD carry `focal_point` for deterministic seller cropping. `landing_page_url` is the default destination (see `clickthrough`). `font_files` MUST contain only buyer-licensed fonts; publisher-proprietary fonts never travel in manifests. Only image, video, text, url, zip, and pixel_tracker slot asset types are accepted \u2014 executable types (javascript, html, css, webhook) are rejected even via `slots` overrides.").optional(), "required_connections": z.array(z.object({ "provider": z.string().describe("Stable provider or platform namespace, preferably lowercase. Examples: `social.example`, `shortvideo.example`, or a seller-defined namespace. Omit only when the requirement is provider-agnostic, or when an `authorization_url` fully routes the human to the correct provider-specific connection flow.").optional(), "connection_type": z.enum(["advertiser_account", "publisher_identity", "post_authorization"]).describe("Kind of downstream connection required. `advertiser_account` is the platform account used to buy/manage ads. `publisher_identity` is the creator, page, channel, organization, or profile that owns source posts. `post_authorization` is a post-scoped grant when the platform authorizes individual posts instead of, or in addition to, the owning identity."), "required_for": z.array(z.string().min(1)).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Concrete AdCP protocol operation names that require this downstream connection. Sellers SHOULD include this in product declarations when the requirement is known ahead of time, and in AUTHORIZATION_REQUIRED details when it explains the failed operation. Prefer specific operation names such as `list_creatives`, `sync_creatives`, `create_media_buy`, `get_media_buy_delivery`, or `get_creative_delivery` over broad category labels such as `reporting`.").optional(), "scope": z.enum(["account", "identity", "post", "unknown"]).describe("Granularity of the downstream grant.").optional(), "status": z.enum(["connected", "missing", "pending", "expired", "revoked", "not_required", "unknown"]).describe("Current seller-observed state for this downstream connection when known. Product declarations MAY omit status or use `unknown`; AUTHORIZATION_REQUIRED details SHOULD use `missing`, `expired`, or `revoked` for the connection that blocked the call.").optional(), "connection_id": z.string().describe("Seller-defined identifier for an already-created downstream connection. Omit when no connection exists yet or when exposing it would leak platform/account state.").optional(), "resource_ref": z.object({ "platform_account_id": z.string().describe("Provider-native advertiser or business account id, when safe to disclose.").optional(), "identity_id": z.string().describe("Provider-native creator, page, channel, organization, or profile id, when safe to disclose.").optional(), "handle": z.string().describe("Provider-native public handle for the owning identity, when available.").optional(), "profile_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the owning identity, when available.").optional(), "post_id": z.string().describe("Provider-native post id, when the grant is post-scoped or the failed request referenced a specific post.").optional(), "post_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the referenced post, when available.").optional() }).catchall(z.any()).describe("Optional opaque provider-native resource hint, such as a platform account id, profile URL, handle, channel id, post id, or post URL. This is a hint for routing authorization, not proof that authorization exists.").optional(), "authorization_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Seller-hosted or provider-hosted URL where a human can complete or restore this downstream connection.").optional(), "authorization_instructions": z.string().describe("Human-readable instructions for completing or restoring this downstream connection.").optional(), "expires_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }), z.union([z.object({ "provider": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "authorization_url": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]))])).describe("A seller/platform-side connection or grant required by a product, format, or request. This is not the AdCP caller credential: the AdCP request is still authenticated once, and the seller uses these stored downstream connections to call a platform or service on the buyer's behalf. Use this shape for platforms that require more than one downstream grant, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.")).describe("Downstream platform connections or grants required to use this format declaration. These are in addition to the single AdCP caller credential. Use this when a platform product requires multiple downstream grants, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.").optional(), "reference_mutability": z.enum(["immutable_snapshot", "mutable_requires_reapproval", "mutable_auto_recheck"]).describe("Policy for formats whose `slots` accept a `published_post` reference. `immutable_snapshot`: seller snapshots the referenced post at approval and later source changes do not change the served creative. `mutable_requires_reapproval`: the source post may change and material changes require review before continued serving. `mutable_auto_recheck`: the source post may change and the seller continuously or periodically rechecks authorization/policy without requiring buyer resubmission. Omit when the format has no `published_post` slot.").optional(), "production_window_business_days": z.number().int().gte(0).describe("Typical production turnaround in business days when the format requires seller-side production (e.g., host-recording from a buyer-supplied script). 0 for synchronous (e.g., generative AI); >0 for human-produced (e.g., podcast host-read). Absent when no production is required (buyer uploads complete creative).").optional(), "supply_mode": z.enum(["components", "rendered_canvases", "layered_source"]).describe("Which end of the template contract the buyer feeds. `components`: buyer supplies component slots; seller renders states (no `state_canvases`/`layered_source` assets allowed). `rendered_canvases`: buyer supplies exactly one `state_canvases` image per declared state \xD7 breakpoint pair. `layered_source`: buyer ships design source (+ optional `font_files`); seller production derives states (`production_window_business_days` applies) \u2014 transitional for sellers without executable templates.").optional(), "states": z.array(z.object({ "state_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).describe("Stable identifier used by `state_canvases[].state_id` and `state_click_urls[].state_id`."), "anchoring": z.enum(["inline", "sticky_top", "sticky_bottom", "overlay", "fullscreen_overlay", "underlay"]).describe("`underlay` renders the canvas beneath page content, which scrolls over it (IAB New Ad Portfolio underlay class: skins, reveal units). Transitions into `overlay`/`fullscreen_overlay` states SHOULD be user-initiated; non-user-action entries emit LEAN policy warnings."), "slot_bindings": z.array(z.string().regex(new RegExp("^[a-z0-9_]+$"))).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Asset group IDs rendered in this state (components mode). Makes the template executable: given components and bindings, assembly is deterministic. Every value MUST resolve to a declared slot. Omitted means all supplied component slots may render.").optional(), "motion": z.enum(["static", "animated"]).describe("Whether the seller-rendered layout animates within this state (attract loops, load animations). Intra-state animation is seller-rendered; buyer canvases stay static images.").optional(), "max_animation_s": z.number().gt(0).describe("Upper bound on intra-state animation duration. Required when `motion` is `animated`.").optional(), "breakpoints": z.array(z.object({ "breakpoint_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).describe("Stable identifier used by `state_canvases[].breakpoint_id`."), "width": z.number().int().gte(1).optional(), "width_range": z.array(z.number().int().gte(1)).min(2).max(2).describe("Inclusive [minimum, maximum] accepted canvas width. The first value MUST be no greater than the second; semantic validators enforce ordering.").optional(), "width_mode": z.enum(["full_bleed", "gutter_residual"]).describe("Fluid width classes. `full_bleed`: edge-to-edge viewport width (IAB adhesion, topscroll). `gutter_residual`: the margin remaining beside the page content column (desktop skins). Fluid breakpoints cannot be targeted by `rendered_canvases` supply \u2014 semantic validation rejects that pairing.").optional(), "height": z.number().int().gte(1).optional(), "height_range": z.array(z.number().int().gte(1)).min(2).max(2).describe("Inclusive [minimum, maximum] accepted canvas height. The first value MUST be no greater than the second; semantic validators enforce ordering.").optional(), "viewport_height_percent": z.number().gt(0).lte(100).describe("Height as a percentage of the viewport (topscroll 80%, mobile skin panel 15%). Fluid; cannot be targeted by `rendered_canvases` supply.").optional(), "canvas_aspect_ratio": z.string().regex(new RegExp("^[0-9]+(\\.[0-9]+)?:[0-9]+(\\.[0-9]+)?$")).describe("Aspect ratio the rendered canvas maintains across the size range (IAB flexible units, ratio-bucket responsive). When both fixed `width` and `height` are declared, the ratio MUST be consistent with them.").optional() }).catchall(z.any()).and(z.intersection(z.union([z.object({ "width": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "width_range": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "width_mode": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.object({ "height": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "height_range": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "viewport_height_percent": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).min(1).superRefine((breakpoints, ctx) => {
2186
+ const CanonicalFormatSellerRenderedStatefulDisplaySchema = /* @__PURE__ */ (() => z.object({ "experimental": z.boolean().describe("Experimental in AdCP 3.2 while the creative working group gathers implementation evidence across premium web and mobile/app sellers.").optional(), "deprecated": z.boolean().describe("When true, this canonical (or a seller's specific narrowing of it) is going away. Existing adopters are supported through the deprecation cycle; new adoption is discouraged. Pair with `migration_target_version` to indicate when the canonical is expected to be removed. Distinct from `experimental`: an experimental canonical may stabilize and stop being experimental; a deprecated canonical is on a sunset path.").optional(), "v1_translatable": z.boolean().describe("No v1 named-format equivalent can express multiple seller-rendered states and their breakpoint bindings.").optional(), "since_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version that introduced this canonical (e.g., '3.1', '3.2'). Lets adopters reason about minimum protocol version requirements when consuming a format declaration. Patch precision is intentionally rejected \u2014 canonicals are introduced at minor-version boundaries.").optional(), "migration_target_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version by which the working group expects this canonical to stabilize, surface a breaking revision, or (when `deprecated: true`) be removed. Patch precision is intentionally rejected \u2014 canonicals shift at minor-version boundaries. Absence signals 'no specific target' (omit the field rather than use a placeholder like 'unknown').").optional(), "composition_model": z.enum(["deterministic", "algorithmic"]).describe("Whether the surface composes deterministically (buyer can predict per-slot rendering \u2014 sponsored_placement, image, video) or algorithmically (surface chooses combinations or phrasing \u2014 responsive_creative, agent_placement).").optional(), "provenance_required": z.boolean().describe("When true, the product rejects unsigned synthesized assets. Builders calling build_creative MUST attach a C2PA-compatible provenance manifest attributing synthesis to the creative agent.").optional(), "platform_extensions": z.array(z.object({ "uri": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("HTTPS URL identifying the extension. `https://` is mandatory \u2014 `http://`, `file://`, `data:`, and other schemes are rejected at the schema layer (defense-in-depth on top of the fetch-contract normative rules). The URI base is the owning agent's URL; the path identifies the extension within that agent. Example: 'https://creative.adcontextprotocol.org/translated/meta/extensions/meta_pixel'. The full fetch contract \u2014 SSRF allowlist, response-size cap, $ref sandbox, schema-compile bounds \u2014 is documented on `product-format-declaration.json#format_schema` and applies to ALL fetches of this reference shape regardless of whether the field is named `format_schema` (load-bearing for validation) or `platform_extensions` (informational); the *transport* rules are identical, only the *consumption* semantics differ."), "digest": z.string().regex(new RegExp("^sha256:[a-f0-9]{64}$")).describe("SHA-256 content digest of the extension definition (sha256:<hex>). Used to detect drift \u2014 if the agent revises the extension, the digest changes and cached definitions become invalid.") }).catchall(z.any()).describe("Reference to a platform extension definition. The agent that owns the URI is authoritative for the extension's schema. Buyers fetch the definition once per content digest and cache it. Platform extensions are typically bundled in `get_products` responses under an `extensions` map keyed by `uri@digest`, eliminating the need for a separate fetch.\n\n**Within a single response**, multiple references to the same `uri` MUST carry the same `digest` \u2014 divergent digests in one response indicate producer-side error (e.g., concurrent extension revision mid-render). Buyers encountering divergent digests for the same URI MUST fail closed: treat all references to that URI as unresolved and surface a validation error rather than picking one branch silently. **Across responses**, digest divergence is normal \u2014 extension authors revise their schemas, the new digest differs, the cache key changes, and the buyer refetches. Cache by `uri@digest`, not by `uri` alone.")).describe('Platform-specific extensions narrowing the canonical (pixel ID shapes, conversion event taxonomies, platform-specific CTAs/destinations). Each extension is a URI+digest reference resolved against the bundled `extensions` map in get_products responses or fetched directly.\n\n**Collision precedence (normative).** When two or more `platform_extensions[]` entries on the same declaration extend the same target (e.g., both extend `tracking`) with overlapping field names, **array order is authoritative \u2014 later entries override earlier ones on a per-field basis** (last-in-array-wins). SDKs MUST surface the overlap via the `errors[]` array on the `get_products` response with a structured code (`FORMAT_DECLARATION_DIVERGENT` is appropriate when the overlap appears across dual-emitted shapes; a producer-self-emitted overlap on a single declaration SHOULD use the same code with `error.details: { collision_kind: "platform_extension_field", target, overlapping_fields, winning_extension_uri }`). Producers SHOULD avoid the collision by emitting one extension per target or by partitioning fields across extensions; the deterministic precedence is for last-resort consistency across SDK implementations, not a sanctioned merging strategy.').optional(), "synthesis_nondeterministic": z.boolean().describe("When true, the format's production pipeline is genuinely nondeterministic \u2014 the platform cannot guarantee that synthesis from a given input set produces in-spec output. Veo / Sora / Runway-class generative video, and other AI-synthesis flows where output dimensions, duration, or quality vary per run. Implies a different validation contract: predictive `validate_input` is impossible; the platform's own post-synthesis QA loop applies; if the QA loop exhausts without producing a valid artifact, `build_creative` returns task_failed with a synthesis_failed reason. Distinct from `composition_model` (which describes how the surface composes per-slot rendering, not whether synthesis is deterministic). When false or absent, the format's production is predictable enough that `validate_input` can predict output properties from input properties.\n\n**Compatibility with `asset_source` / `item_production_model`**: `synthesis_nondeterministic: true` MAY pair with any of `seller_pre_rendered_from_brief`, `seller_human_designed`, or `agent_synthesized` (the QA loop is concept-level, not source-specific \u2014 'seller renders from brief but each retry differs' is just as nondeterministic as Veo). It MUST NOT pair with `buyer_uploaded` (the buyer ships pre-rendered bytes; there's no synthesis step to be nondeterministic about). It MUST NOT pair with `publisher_host_recorded` (the publisher's host produces a deterministic-from-script output even if the human voice varies). When `synthesis_nondeterministic: true` is set with an incompatible source, validators SHOULD reject with a structured error.").optional(), "slots": z.array(z.object({ "asset_group_id": z.string().describe("Canonical asset_group_id from /schemas/core/asset-group-vocabulary.json. Non-canonical IDs are valid but trigger soft warnings."), "asset_type": z.enum(["image", "video", "audio", "text", "markdown", "url", "html", "css", "javascript", "vast", "daast", "display_tag", "webhook", "brief", "catalog", "published_post", "zip", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]).describe("Discriminator selecting the asset schema this slot accepts. SDK codegen uses this to type the slot value. `display_tag` is the atomic third-party display representation (URL, inline markup, or paired redirect). `published_post` is an existing-post reference asset. `pixel_tracker` / `vast_tracker` / `daast_tracker` are renderer-fired tracker primitives. `object` is a last-resort fallback."), "required": z.boolean().describe("Whether this slot is required for a valid manifest.").optional(), "min": z.number().int().gte(0).describe("Minimum count for repeatable / pool slots.").optional(), "max": z.number().int().gte(1).describe("Maximum count for repeatable / pool slots.").optional(), "max_chars": z.number().int().gte(1).describe("Per-slot character limit. Valid only when `asset_type` is `text`, `markdown`, or `brief`. Mutually exclusive with `max_size_kb` (which applies to binary asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "max_size_kb": z.number().int().gte(1).describe("Per-slot file size limit in exact kilobytes, where 1 KB = 1,000 bytes. Valid only when `asset_type` is `image`, `video`, `audio`, or `zip`. Mutually exclusive with `max_chars` (which applies to text asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Accepted intrinsic-pixel densities for this image-bearing slot. Valid when `asset_type` is `image`, and on a `card` slot where it constrains each card's image media (video media is unaffected). This makes density available to every canonical carrying image assets (native, carousel, responsive, companion images, and image itself), not only `format_kind: image`. When the image canonical also declares top-level `params.pixel_ratios`, the effective set is the intersection; an empty intersection is invalid. One matching asset satisfies the slot unless `required_pixel_ratios` requires rendition coverage.").optional(), "required_pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Required density coverage for an image rendition set. Valid only when `asset_type` is `image` and `pixel_ratios` is also declared. Every value MUST appear in the effective accepted set after intersecting any top-level image `params.pixel_ratios`, and the manifest slot value MUST be an array containing exactly one matching image rendition for each required ratio. Other accepted ratios remain optional. For example, `pixel_ratios: [1, 1.5, 2]` with `required_pixel_ratios: [1, 2]` requires the 1x and 2x renditions while making 1.5x optional. SDKs enforce intersection, subset, coverage, and duplicate-ratio rules because JSON Schema draft-07 cannot express them generically.").optional(), "logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("When `asset_group_id` is `logo`, renderer-facing brand.json logo slots acceptable for this format slot. Producers selecting from brand.json SHOULD prefer `logos[]` entries whose `slots[]` intersects this list, then apply `visual_guidelines.logo_usage_rules[]`.").optional(), "required_logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Subset of `logo_slots` for which this format expects explicit logo coverage. A manifest or brand-derived logo pool SHOULD include at least one usable logo for each required slot; if coverage is missing, builders SHOULD surface a validation warning or approval mapping instead of guessing from prose.").optional(), "description": z.string().describe("Human-readable description of what the slot expects from the buyer.").optional(), "consumed_for_production": z.boolean().describe("Dispatch hint for `build_creative` and v1\u2194v2 wire translators: when `true`, the slot's value is consumed as INPUT to a production step (host-read script, brief copy fed to generative synthesis, catalog feed driving per-SKU rendering) and is not rendered verbatim. When `false` (default), the slot's value is rendered verbatim on the placement (image bytes, video file, display tag).\n\nMotivates the v1\u2194v2 dispatch table: pre-v2 buyers shipped production-consumed inputs separately in a `inputs` map on the build_creative request; v2 collapses inputs and rendered assets into a single `assets` map keyed by `asset_group_id`. SDK translators between v1 and v2 use this flag per canonical to know which assets in the v2 manifest map back to v1 `inputs` vs v1 `assets`. Without the per-slot flag the dispatch table lives in adopter code and every SDK gets it slightly different.\n\nProducers SHOULD set this explicitly on slots whose consumption pattern isn't obvious (host-read scripts on `audio_hosted`, briefs on generative `video_hosted`, catalog feeds on `sponsored_placement`). For canonicals where every slot is render-verbatim (`image`, `display_tag`, `video_vast`, `audio_vast`), the default `false` is sufficient and the flag MAY be omitted.").optional() }).catchall(z.any()).and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }), z.any().refine((value) => !z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }), z.any().refine((value) => !z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.union([z.any().refine((value) => !z.any().refine((value2) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema").safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.any().refine((value) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.any().refine((value) => !z.union([z.object({ "logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "required_logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]))), z.intersection(z.any(), z.intersection(z.union([z.any().refine((value) => !z.object({ "required_pixel_ratios": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "required_pixel_ratios": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "asset_type": z.literal("image").optional() }))]), z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }), z.any().refine((value) => !z.union([z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))])))))).describe("Default manifest slots; which are consumed depends on `supply_mode`. `state_canvases` images MUST carry `state_id` and `breakpoint_id`, and `state_click_urls` entries MUST carry `state_id` (semantic validators resolve the bindings). Component images SHOULD carry `focal_point` for deterministic seller cropping. `landing_page_url` is the default destination (see `clickthrough`). `font_files` MUST contain only buyer-licensed fonts; publisher-proprietary fonts never travel in manifests. Only image, video, text, url, zip, and pixel_tracker slot asset types are accepted \u2014 executable types (javascript, html, css, webhook) are rejected even via `slots` overrides.").optional(), "required_connections": z.array(z.object({ "provider": z.string().describe("Stable provider or platform namespace, preferably lowercase. Examples: `social.example`, `shortvideo.example`, or a seller-defined namespace. Omit only when the requirement is provider-agnostic, or when an `authorization_url` fully routes the human to the correct provider-specific connection flow.").optional(), "connection_type": z.enum(["advertiser_account", "publisher_identity", "post_authorization"]).describe("Kind of downstream connection required. `advertiser_account` is the platform account used to buy/manage ads. `publisher_identity` is the creator, page, channel, organization, or profile that owns source posts. `post_authorization` is a post-scoped grant when the platform authorizes individual posts instead of, or in addition to, the owning identity."), "required_for": z.array(z.string().min(1)).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Concrete AdCP protocol operation names that require this downstream connection. Sellers SHOULD include this in product declarations when the requirement is known ahead of time, and in AUTHORIZATION_REQUIRED details when it explains the failed operation. Prefer specific operation names such as `list_creatives`, `sync_creatives`, `create_media_buy`, `get_media_buy_delivery`, or `get_creative_delivery` over broad category labels such as `reporting`.").optional(), "scope": z.enum(["account", "identity", "post", "unknown"]).describe("Granularity of the downstream grant.").optional(), "status": z.enum(["connected", "missing", "pending", "expired", "revoked", "not_required", "unknown"]).describe("Current seller-observed state for this downstream connection when known. Product declarations MAY omit status or use `unknown`; AUTHORIZATION_REQUIRED details SHOULD use `missing`, `expired`, or `revoked` for the connection that blocked the call.").optional(), "connection_id": z.string().describe("Seller-defined identifier for an already-created downstream connection. Omit when no connection exists yet or when exposing it would leak platform/account state.").optional(), "resource_ref": z.object({ "platform_account_id": z.string().describe("Provider-native advertiser or business account id, when safe to disclose.").optional(), "identity_id": z.string().describe("Provider-native creator, page, channel, organization, or profile id, when safe to disclose.").optional(), "handle": z.string().describe("Provider-native public handle for the owning identity, when available.").optional(), "profile_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the owning identity, when available.").optional(), "post_id": z.string().describe("Provider-native post id, when the grant is post-scoped or the failed request referenced a specific post.").optional(), "post_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the referenced post, when available.").optional() }).catchall(z.any()).describe("Optional opaque provider-native resource hint, such as a platform account id, profile URL, handle, channel id, post id, or post URL. This is a hint for routing authorization, not proof that authorization exists.").optional(), "authorization_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Seller-hosted or provider-hosted URL where a human can complete or restore this downstream connection.").optional(), "authorization_instructions": z.string().describe("Human-readable instructions for completing or restoring this downstream connection.").optional(), "expires_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }), z.union([z.object({ "provider": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "authorization_url": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]))]).describe("Must also satisfy at least one of these alternatives.")).describe("A seller/platform-side connection or grant required by a product, format, or request. This is not the AdCP caller credential: the AdCP request is still authenticated once, and the seller uses these stored downstream connections to call a platform or service on the buyer's behalf. Use this shape for platforms that require more than one downstream grant, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.")).describe("Downstream platform connections or grants required to use this format declaration. These are in addition to the single AdCP caller credential. Use this when a platform product requires multiple downstream grants, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.").optional(), "reference_mutability": z.enum(["immutable_snapshot", "mutable_requires_reapproval", "mutable_auto_recheck"]).describe("Policy for formats whose `slots` accept a `published_post` reference. `immutable_snapshot`: seller snapshots the referenced post at approval and later source changes do not change the served creative. `mutable_requires_reapproval`: the source post may change and material changes require review before continued serving. `mutable_auto_recheck`: the source post may change and the seller continuously or periodically rechecks authorization/policy without requiring buyer resubmission. Omit when the format has no `published_post` slot.").optional(), "production_window_business_days": z.number().int().gte(0).describe("Typical production turnaround in business days when the format requires seller-side production (e.g., host-recording from a buyer-supplied script). 0 for synchronous (e.g., generative AI); >0 for human-produced (e.g., podcast host-read). Absent when no production is required (buyer uploads complete creative).").optional(), "supply_mode": z.enum(["components", "rendered_canvases", "layered_source"]).describe("Which end of the template contract the buyer feeds. `components`: buyer supplies component slots; seller renders states (no `state_canvases`/`layered_source` assets allowed). `rendered_canvases`: buyer supplies exactly one `state_canvases` image per declared state \xD7 breakpoint pair. `layered_source`: buyer ships design source (+ optional `font_files`); seller production derives states (`production_window_business_days` applies) \u2014 transitional for sellers without executable templates.").optional(), "states": z.array(z.object({ "state_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).describe("Stable identifier used by `state_canvases[].state_id` and `state_click_urls[].state_id`."), "anchoring": z.enum(["inline", "sticky_top", "sticky_bottom", "overlay", "fullscreen_overlay", "underlay"]).describe("`underlay` renders the canvas beneath page content, which scrolls over it (IAB New Ad Portfolio underlay class: skins, reveal units). Transitions into `overlay`/`fullscreen_overlay` states SHOULD be user-initiated; non-user-action entries emit LEAN policy warnings."), "slot_bindings": z.array(z.string().regex(new RegExp("^[a-z0-9_]+$"))).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Asset group IDs rendered in this state (components mode). Makes the template executable: given components and bindings, assembly is deterministic. Every value MUST resolve to a declared slot. Omitted means all supplied component slots may render.").optional(), "motion": z.enum(["static", "animated"]).describe("Whether the seller-rendered layout animates within this state (attract loops, load animations). Intra-state animation is seller-rendered; buyer canvases stay static images.").optional(), "max_animation_s": z.number().gt(0).describe("Upper bound on intra-state animation duration. Required when `motion` is `animated`.").optional(), "breakpoints": z.array(z.object({ "breakpoint_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).describe("Stable identifier used by `state_canvases[].breakpoint_id`."), "width": z.number().int().gte(1).optional(), "width_range": z.array(z.number().int().gte(1)).min(2).max(2).describe("Inclusive [minimum, maximum] accepted canvas width. The first value MUST be no greater than the second; semantic validators enforce ordering.").optional(), "width_mode": z.enum(["full_bleed", "gutter_residual"]).describe("Fluid width classes. `full_bleed`: edge-to-edge viewport width (IAB adhesion, topscroll). `gutter_residual`: the margin remaining beside the page content column (desktop skins). Fluid breakpoints cannot be targeted by `rendered_canvases` supply \u2014 semantic validation rejects that pairing.").optional(), "height": z.number().int().gte(1).optional(), "height_range": z.array(z.number().int().gte(1)).min(2).max(2).describe("Inclusive [minimum, maximum] accepted canvas height. The first value MUST be no greater than the second; semantic validators enforce ordering.").optional(), "viewport_height_percent": z.number().gt(0).lte(100).describe("Height as a percentage of the viewport (topscroll 80%, mobile skin panel 15%). Fluid; cannot be targeted by `rendered_canvases` supply.").optional(), "canvas_aspect_ratio": z.string().regex(new RegExp("^[0-9]+(\\.[0-9]+)?:[0-9]+(\\.[0-9]+)?$")).describe("Aspect ratio the rendered canvas maintains across the size range (IAB flexible units, ratio-bucket responsive). When both fixed `width` and `height` are declared, the ratio MUST be consistent with them.").optional() }).catchall(z.any()).and(z.intersection(z.union([z.object({ "width": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "width_range": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "width_mode": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.object({ "height": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "height_range": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "viewport_height_percent": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).min(1).superRefine((breakpoints, ctx) => {
2187
2187
  breakpoints.forEach((breakpoint, index) => {
2188
2188
  const widthKeys = ["width", "width_range", "width_mode"].filter((key) => breakpoint[key] !== void 0);
2189
2189
  const heightKeys = ["height", "height_range", "viewport_height_percent"].filter((key) => breakpoint[key] !== void 0);
@@ -2239,7 +2239,7 @@ const CanonicalFormatSellerRenderedStatefulDisplaySchema = /* @__PURE__ */ (() =
2239
2239
  ctx.addIssue({ code: "custom", path: [index, "input"], message: "scroll transitions require input=scroll" });
2240
2240
  }
2241
2241
  });
2242
- }), "clickthrough": z.enum(["required", "optional", "none"]).describe("Destination policy. `required` (default): manifest MUST supply `landing_page_url`. `optional`: click-optional units (in-feed brand units) may omit it. `none`: unit is non-clickable; manifests MUST NOT supply `landing_page_url` or `state_click_urls`. Per-state overrides via `state_click_urls` entries carrying `state_id`; `landing_page_url` is the fallback for unlisted states.").optional(), "user_controls": z.object({ "dismissible": z.boolean(), "user_collapsible": z.boolean() }).catchall(z.any()).describe("When any state anchors as `overlay` or `fullscreen_overlay`, either `dismissible` MUST be true or that state's `close_affordance` MUST be true (dismissibility floor; semantic validators enforce)."), "canvas_constraints": z.array(z.object({ "constraint": z.enum(["safe_area", "reserved_region", "decoration_only_edge", "no_text_or_logos"]), "state_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "breakpoint_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "region": z.object({ "x": z.number().gte(0), "y": z.number().gte(0), "width": z.number().gt(0), "height": z.number().gt(0), "unit": z.enum(["px", "percent"]).optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "unit": z.literal("percent") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "unit": z.literal("percent") }), z.object({ "x": z.any().optional(), "y": z.any().optional(), "width": z.any().optional(), "height": z.any().optional() }))])) }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "breakpoint_id": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "breakpoint_id": z.any().refine((value) => value !== void 0, "Required"), "state_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Rectangular rule applied to buyer artwork. State and breakpoint selectors are optional so the same shape can constrain a coordinated-placement component or a specific stateful-display canvas.")).describe("Rectangular areas constraining buyer artwork. Omitted state/breakpoint selectors apply the constraint to every canvas. For fluid or range-sized breakpoints, use percent-unit regions.").optional(), "duration_ms_range": z.array(z.union([z.number().int().gte(0), z.null()])).min(2).max(2).describe("Accepted embedded-video duration [min, max]. `duration_ms_exact` takes precedence when both are present.").optional().superRefine((range, ctx) => {
2242
+ }), "clickthrough": z.enum(["required", "optional", "none"]).describe("Destination policy. `required` (default): manifest MUST supply `landing_page_url`. `optional`: click-optional units (in-feed brand units) may omit it. `none`: unit is non-clickable; manifests MUST NOT supply `landing_page_url` or `state_click_urls`. Per-state overrides via `state_click_urls` entries carrying `state_id`; `landing_page_url` is the fallback for unlisted states.").optional(), "user_controls": z.object({ "dismissible": z.boolean(), "user_collapsible": z.boolean() }).catchall(z.any()).describe("When any state anchors as `overlay` or `fullscreen_overlay`, either `dismissible` MUST be true or that state's `close_affordance` MUST be true (dismissibility floor; semantic validators enforce)."), "canvas_constraints": z.array(z.object({ "constraint": z.enum(["safe_area", "reserved_region", "decoration_only_edge", "no_text_or_logos"]), "state_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "breakpoint_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "region": z.object({ "x": z.number().gte(0), "y": z.number().gte(0), "width": z.number().gt(0), "height": z.number().gt(0), "unit": z.enum(["px", "percent"]).optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "unit": z.literal("percent") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "unit": z.literal("percent") }), z.object({ "x": z.any().optional(), "y": z.any().optional(), "width": z.any().optional(), "height": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")) }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "breakpoint_id": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "breakpoint_id": z.any().refine((value) => value !== void 0, "Required"), "state_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Rectangular rule applied to buyer artwork. State and breakpoint selectors are optional so the same shape can constrain a coordinated-placement component or a specific stateful-display canvas.")).describe("Rectangular areas constraining buyer artwork. Omitted state/breakpoint selectors apply the constraint to every canvas. For fluid or range-sized breakpoints, use percent-unit regions.").optional(), "duration_ms_range": z.array(z.union([z.number().int().gte(0), z.null()])).min(2).max(2).describe("Accepted embedded-video duration [min, max]. `duration_ms_exact` takes precedence when both are present.").optional().superRefine((range, ctx) => {
2243
2243
  if (range !== void 0 && !range.some((value) => value !== null)) {
2244
2244
  ctx.addIssue({ code: "custom", path: [], message: "duration_ms_range requires at least one finite bound" });
2245
2245
  }
@@ -2643,7 +2643,7 @@ const CommittedMetricSchema = /* @__PURE__ */ (() => z.union([z.object({
2643
2643
  committed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
2644
2644
  }).passthrough()]))();
2645
2645
  const AudienceCharacteristicSchema = /* @__PURE__ */ (() => z.object({
2646
- dimension: z.union([z.literal("age"), z.object({}).passthrough()]).and(z.string()),
2646
+ dimension: z.union([z.literal("age"), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.").and(z.string()),
2647
2647
  value: z.union([z.string(), z.number(), z.boolean(), z.array(z.union([z.string(), z.number(), z.boolean()]))]).optional(),
2648
2648
  range: z.object({
2649
2649
  min: z.number().optional(),
@@ -2655,8 +2655,8 @@ const AudienceCharacteristicSchema = /* @__PURE__ */ (() => z.object({
2655
2655
  value_id: z.string().min(1).optional()
2656
2656
  }).passthrough().optional(),
2657
2657
  label: z.string().optional()
2658
- }).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
2659
- dimension: z.union([z.literal("age"), z.object({}).passthrough()]).and(z.string()),
2658
+ }).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
2659
+ dimension: z.union([z.literal("age"), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.").and(z.string()),
2660
2660
  value: z.union([z.string(), z.number(), z.boolean(), z.array(z.union([z.string(), z.number(), z.boolean()]))]).optional(),
2661
2661
  range: z.object({
2662
2662
  min: z.number().optional(),
@@ -2873,7 +2873,7 @@ const CoordinatedPlacementInlineParamsRuntimeSchemas = /* @__PURE__ */ (() => ({
2873
2873
  agent_placement: CanonicalFormatAgentPlacementAISurfaceSponsoredPlacementSchema,
2874
2874
  seller_rendered_stateful_display: CanonicalFormatSellerRenderedStatefulDisplaySchema
2875
2875
  }))();
2876
- const CanonicalFormatCoordinatedPlacementsSchema = /* @__PURE__ */ (() => z.object({ "experimental": z.boolean().describe("Experimental in AdCP 3.2 while the creative working group gathers implementation evidence for atomic cross-placement composition.").optional(), "deprecated": z.boolean().describe("When true, this canonical (or a seller's specific narrowing of it) is going away. Existing adopters are supported through the deprecation cycle; new adoption is discouraged. Pair with `migration_target_version` to indicate when the canonical is expected to be removed. Distinct from `experimental`: an experimental canonical may stabilize and stop being experimental; a deprecated canonical is on a sunset path.").optional(), "v1_translatable": z.boolean().describe("No v1 named-format equivalent can express a coordinated multi-placement buy.").optional(), "since_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version that introduced this canonical (e.g., '3.1', '3.2'). Lets adopters reason about minimum protocol version requirements when consuming a format declaration. Patch precision is intentionally rejected \u2014 canonicals are introduced at minor-version boundaries.").optional(), "migration_target_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version by which the working group expects this canonical to stabilize, surface a breaking revision, or (when `deprecated: true`) be removed. Patch precision is intentionally rejected \u2014 canonicals shift at minor-version boundaries. Absence signals 'no specific target' (omit the field rather than use a placeholder like 'unknown').").optional(), "composition_model": z.enum(["deterministic", "algorithmic"]).describe("Whether the surface composes deterministically (buyer can predict per-slot rendering \u2014 sponsored_placement, image, video) or algorithmically (surface chooses combinations or phrasing \u2014 responsive_creative, agent_placement).").optional(), "provenance_required": z.boolean().describe("When true, the product rejects unsigned synthesized assets. Builders calling build_creative MUST attach a C2PA-compatible provenance manifest attributing synthesis to the creative agent.").optional(), "platform_extensions": z.array(z.object({ "uri": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("HTTPS URL identifying the extension. `https://` is mandatory \u2014 `http://`, `file://`, `data:`, and other schemes are rejected at the schema layer (defense-in-depth on top of the fetch-contract normative rules). The URI base is the owning agent's URL; the path identifies the extension within that agent. Example: 'https://creative.adcontextprotocol.org/translated/meta/extensions/meta_pixel'. The full fetch contract \u2014 SSRF allowlist, response-size cap, $ref sandbox, schema-compile bounds \u2014 is documented on `product-format-declaration.json#format_schema` and applies to ALL fetches of this reference shape regardless of whether the field is named `format_schema` (load-bearing for validation) or `platform_extensions` (informational); the *transport* rules are identical, only the *consumption* semantics differ."), "digest": z.string().regex(new RegExp("^sha256:[a-f0-9]{64}$")).describe("SHA-256 content digest of the extension definition (sha256:<hex>). Used to detect drift \u2014 if the agent revises the extension, the digest changes and cached definitions become invalid.") }).catchall(z.any()).describe("Reference to a platform extension definition. The agent that owns the URI is authoritative for the extension's schema. Buyers fetch the definition once per content digest and cache it. Platform extensions are typically bundled in `get_products` responses under an `extensions` map keyed by `uri@digest`, eliminating the need for a separate fetch.\n\n**Within a single response**, multiple references to the same `uri` MUST carry the same `digest` \u2014 divergent digests in one response indicate producer-side error (e.g., concurrent extension revision mid-render). Buyers encountering divergent digests for the same URI MUST fail closed: treat all references to that URI as unresolved and surface a validation error rather than picking one branch silently. **Across responses**, digest divergence is normal \u2014 extension authors revise their schemas, the new digest differs, the cache key changes, and the buyer refetches. Cache by `uri@digest`, not by `uri` alone.")).describe('Platform-specific extensions narrowing the canonical (pixel ID shapes, conversion event taxonomies, platform-specific CTAs/destinations). Each extension is a URI+digest reference resolved against the bundled `extensions` map in get_products responses or fetched directly.\n\n**Collision precedence (normative).** When two or more `platform_extensions[]` entries on the same declaration extend the same target (e.g., both extend `tracking`) with overlapping field names, **array order is authoritative \u2014 later entries override earlier ones on a per-field basis** (last-in-array-wins). SDKs MUST surface the overlap via the `errors[]` array on the `get_products` response with a structured code (`FORMAT_DECLARATION_DIVERGENT` is appropriate when the overlap appears across dual-emitted shapes; a producer-self-emitted overlap on a single declaration SHOULD use the same code with `error.details: { collision_kind: "platform_extension_field", target, overlapping_fields, winning_extension_uri }`). Producers SHOULD avoid the collision by emitting one extension per target or by partitioning fields across extensions; the deterministic precedence is for last-resort consistency across SDK implementations, not a sanctioned merging strategy.').optional(), "synthesis_nondeterministic": z.boolean().describe("When true, the format's production pipeline is genuinely nondeterministic \u2014 the platform cannot guarantee that synthesis from a given input set produces in-spec output. Veo / Sora / Runway-class generative video, and other AI-synthesis flows where output dimensions, duration, or quality vary per run. Implies a different validation contract: predictive `validate_input` is impossible; the platform's own post-synthesis QA loop applies; if the QA loop exhausts without producing a valid artifact, `build_creative` returns task_failed with a synthesis_failed reason. Distinct from `composition_model` (which describes how the surface composes per-slot rendering, not whether synthesis is deterministic). When false or absent, the format's production is predictable enough that `validate_input` can predict output properties from input properties.\n\n**Compatibility with `asset_source` / `item_production_model`**: `synthesis_nondeterministic: true` MAY pair with any of `seller_pre_rendered_from_brief`, `seller_human_designed`, or `agent_synthesized` (the QA loop is concept-level, not source-specific \u2014 'seller renders from brief but each retry differs' is just as nondeterministic as Veo). It MUST NOT pair with `buyer_uploaded` (the buyer ships pre-rendered bytes; there's no synthesis step to be nondeterministic about). It MUST NOT pair with `publisher_host_recorded` (the publisher's host produces a deterministic-from-script output even if the human voice varies). When `synthesis_nondeterministic: true` is set with an incompatible source, validators SHOULD reject with a structured error.").optional(), "slots": z.array(z.object({ "asset_group_id": z.string().describe("Canonical asset_group_id from /schemas/core/asset-group-vocabulary.json. Non-canonical IDs are valid but trigger soft warnings."), "asset_type": z.enum(["image", "video", "audio", "text", "markdown", "url", "html", "css", "javascript", "vast", "daast", "display_tag", "webhook", "brief", "catalog", "published_post", "zip", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]).describe("Discriminator selecting the asset schema this slot accepts. SDK codegen uses this to type the slot value. `display_tag` is the atomic third-party display representation (URL, inline markup, or paired redirect). `published_post` is an existing-post reference asset. `pixel_tracker` / `vast_tracker` / `daast_tracker` are renderer-fired tracker primitives. `object` is a last-resort fallback."), "required": z.boolean().describe("Whether this slot is required for a valid manifest.").optional(), "min": z.number().int().gte(0).describe("Minimum count for repeatable / pool slots.").optional(), "max": z.number().int().gte(1).describe("Maximum count for repeatable / pool slots.").optional(), "max_chars": z.number().int().gte(1).describe("Per-slot character limit. Valid only when `asset_type` is `text`, `markdown`, or `brief`. Mutually exclusive with `max_size_kb` (which applies to binary asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "max_size_kb": z.number().int().gte(1).describe("Per-slot file size limit in exact kilobytes, where 1 KB = 1,000 bytes. Valid only when `asset_type` is `image`, `video`, `audio`, or `zip`. Mutually exclusive with `max_chars` (which applies to text asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Accepted intrinsic-pixel densities for this image-bearing slot. Valid when `asset_type` is `image`, and on a `card` slot where it constrains each card's image media (video media is unaffected). This makes density available to every canonical carrying image assets (native, carousel, responsive, companion images, and image itself), not only `format_kind: image`. When the image canonical also declares top-level `params.pixel_ratios`, the effective set is the intersection; an empty intersection is invalid. One matching asset satisfies the slot unless `required_pixel_ratios` requires rendition coverage.").optional(), "required_pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Required density coverage for an image rendition set. Valid only when `asset_type` is `image` and `pixel_ratios` is also declared. Every value MUST appear in the effective accepted set after intersecting any top-level image `params.pixel_ratios`, and the manifest slot value MUST be an array containing exactly one matching image rendition for each required ratio. Other accepted ratios remain optional. For example, `pixel_ratios: [1, 1.5, 2]` with `required_pixel_ratios: [1, 2]` requires the 1x and 2x renditions while making 1.5x optional. SDKs enforce intersection, subset, coverage, and duplicate-ratio rules because JSON Schema draft-07 cannot express them generically.").optional(), "logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("When `asset_group_id` is `logo`, renderer-facing brand.json logo slots acceptable for this format slot. Producers selecting from brand.json SHOULD prefer `logos[]` entries whose `slots[]` intersects this list, then apply `visual_guidelines.logo_usage_rules[]`.").optional(), "required_logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Subset of `logo_slots` for which this format expects explicit logo coverage. A manifest or brand-derived logo pool SHOULD include at least one usable logo for each required slot; if coverage is missing, builders SHOULD surface a validation warning or approval mapping instead of guessing from prose.").optional(), "description": z.string().describe("Human-readable description of what the slot expects from the buyer.").optional(), "consumed_for_production": z.boolean().describe("Dispatch hint for `build_creative` and v1\u2194v2 wire translators: when `true`, the slot's value is consumed as INPUT to a production step (host-read script, brief copy fed to generative synthesis, catalog feed driving per-SKU rendering) and is not rendered verbatim. When `false` (default), the slot's value is rendered verbatim on the placement (image bytes, video file, display tag).\n\nMotivates the v1\u2194v2 dispatch table: pre-v2 buyers shipped production-consumed inputs separately in a `inputs` map on the build_creative request; v2 collapses inputs and rendered assets into a single `assets` map keyed by `asset_group_id`. SDK translators between v1 and v2 use this flag per canonical to know which assets in the v2 manifest map back to v1 `inputs` vs v1 `assets`. Without the per-slot flag the dispatch table lives in adopter code and every SDK gets it slightly different.\n\nProducers SHOULD set this explicitly on slots whose consumption pattern isn't obvious (host-read scripts on `audio_hosted`, briefs on generative `video_hosted`, catalog feeds on `sponsored_placement`). For canonicals where every slot is render-verbatim (`image`, `display_tag`, `video_vast`, `audio_vast`), the default `false` is sufficient and the flag MAY be omitted.").optional() }).catchall(z.any()).and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }), z.any().refine((value) => !z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }), z.any().refine((value) => !z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.union([z.any().refine((value) => !z.any().refine((value2) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema").safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.any().refine((value) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.any().refine((value) => !z.union([z.object({ "logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "required_logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]))), z.intersection(z.any(), z.intersection(z.union([z.any().refine((value) => !z.object({ "required_pixel_ratios": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "required_pixel_ratios": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "asset_type": z.literal("image").optional() }))]), z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }), z.any().refine((value) => !z.union([z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))])))))).describe("Programmatic declaration of which canonical asset_group_id slots a manifest targeting this format must (or may) populate. Lets SDK codegen and validators enumerate expected slots without parsing the format's prose description. Each entry references an asset_group_id from the canonical vocabulary registry, paired with an `asset_type` so the validator knows which asset schema to apply. Format-level narrowing parameters that apply across all slots (e.g., flat `headline_max_chars` on responsive_creative) may also live on the format declaration; per-slot constraints (a specific slot's `max_chars` or `max_size_kb`) live on the slot entry.").optional(), "required_connections": z.array(z.object({ "provider": z.string().describe("Stable provider or platform namespace, preferably lowercase. Examples: `social.example`, `shortvideo.example`, or a seller-defined namespace. Omit only when the requirement is provider-agnostic, or when an `authorization_url` fully routes the human to the correct provider-specific connection flow.").optional(), "connection_type": z.enum(["advertiser_account", "publisher_identity", "post_authorization"]).describe("Kind of downstream connection required. `advertiser_account` is the platform account used to buy/manage ads. `publisher_identity` is the creator, page, channel, organization, or profile that owns source posts. `post_authorization` is a post-scoped grant when the platform authorizes individual posts instead of, or in addition to, the owning identity."), "required_for": z.array(z.string().min(1)).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Concrete AdCP protocol operation names that require this downstream connection. Sellers SHOULD include this in product declarations when the requirement is known ahead of time, and in AUTHORIZATION_REQUIRED details when it explains the failed operation. Prefer specific operation names such as `list_creatives`, `sync_creatives`, `create_media_buy`, `get_media_buy_delivery`, or `get_creative_delivery` over broad category labels such as `reporting`.").optional(), "scope": z.enum(["account", "identity", "post", "unknown"]).describe("Granularity of the downstream grant.").optional(), "status": z.enum(["connected", "missing", "pending", "expired", "revoked", "not_required", "unknown"]).describe("Current seller-observed state for this downstream connection when known. Product declarations MAY omit status or use `unknown`; AUTHORIZATION_REQUIRED details SHOULD use `missing`, `expired`, or `revoked` for the connection that blocked the call.").optional(), "connection_id": z.string().describe("Seller-defined identifier for an already-created downstream connection. Omit when no connection exists yet or when exposing it would leak platform/account state.").optional(), "resource_ref": z.object({ "platform_account_id": z.string().describe("Provider-native advertiser or business account id, when safe to disclose.").optional(), "identity_id": z.string().describe("Provider-native creator, page, channel, organization, or profile id, when safe to disclose.").optional(), "handle": z.string().describe("Provider-native public handle for the owning identity, when available.").optional(), "profile_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the owning identity, when available.").optional(), "post_id": z.string().describe("Provider-native post id, when the grant is post-scoped or the failed request referenced a specific post.").optional(), "post_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the referenced post, when available.").optional() }).catchall(z.any()).describe("Optional opaque provider-native resource hint, such as a platform account id, profile URL, handle, channel id, post id, or post URL. This is a hint for routing authorization, not proof that authorization exists.").optional(), "authorization_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Seller-hosted or provider-hosted URL where a human can complete or restore this downstream connection.").optional(), "authorization_instructions": z.string().describe("Human-readable instructions for completing or restoring this downstream connection.").optional(), "expires_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }), z.union([z.object({ "provider": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "authorization_url": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]))])).describe("A seller/platform-side connection or grant required by a product, format, or request. This is not the AdCP caller credential: the AdCP request is still authenticated once, and the seller uses these stored downstream connections to call a platform or service on the buyer's behalf. Use this shape for platforms that require more than one downstream grant, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.")).describe("Downstream platform connections or grants required to use this format declaration. These are in addition to the single AdCP caller credential. Use this when a platform product requires multiple downstream grants, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.").optional(), "reference_mutability": z.enum(["immutable_snapshot", "mutable_requires_reapproval", "mutable_auto_recheck"]).describe("Policy for formats whose `slots` accept a `published_post` reference. `immutable_snapshot`: seller snapshots the referenced post at approval and later source changes do not change the served creative. `mutable_requires_reapproval`: the source post may change and material changes require review before continued serving. `mutable_auto_recheck`: the source post may change and the seller continuously or periodically rechecks authorization/policy without requiring buyer resubmission. Omit when the format has no `published_post` slot.").optional(), "production_window_business_days": z.number().int().gte(0).describe("Typical production turnaround in business days when the format requires seller-side production (e.g., host-recording from a buyer-supplied script). 0 for synchronous (e.g., generative AI); >0 for human-produced (e.g., podcast host-read). Absent when no production is required (buyer uploads complete creative).").optional(), "components": z.array(z.object({ "component_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).describe("Stable coordination-local component identifier. Values MUST be unique within `components[]`."), "placement_ref": z.object({ "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring a publisher-catalog placement is hosted, or the inventory publisher associated with an inline placement. Omitted only for legacy single-publisher product-context references.").optional(), "placement_id": z.string().describe("Placement ID from the publisher's adagents.json placement catalog, or an inline seller-defined placement ID interpreted within the enclosing seller and product context.") }).catchall(z.any()).describe("Public product placement this component supplies. MUST resolve against the containing product's `placements[]`."), "required": z.boolean(), "sequence": z.number().int().gte(1).describe("Declared presentation order for sequential-messaging coordinated buys. Components sharing a sequence value present simultaneously; absent means unordered/simultaneous (default). Sequence declares seller-rendered ordering, not buyer-controlled timing.").optional(), "serving_policy": z.enum(["seller_served_only", "third_party_allowed"]).describe("Per-component serving/tracking policy. Some sellers restrict specific components (e.g., page skins) to first-party serving while allowing third-party tags on sibling components. Defaults to the product-level policy when absent.").optional(), "canvas_constraints": z.array(z.object({ "constraint": z.enum(["safe_area", "reserved_region", "decoration_only_edge", "no_text_or_logos"]), "state_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "breakpoint_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "region": z.object({ "x": z.number().gte(0), "y": z.number().gte(0), "width": z.number().gt(0), "height": z.number().gt(0), "unit": z.enum(["px", "percent"]).optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "unit": z.literal("percent") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "unit": z.literal("percent") }), z.object({ "x": z.any().optional(), "y": z.any().optional(), "width": z.any().optional(), "height": z.any().optional() }))])) }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "breakpoint_id": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "breakpoint_id": z.any().refine((value) => value !== void 0, "Required"), "state_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Rectangular rule applied to buyer artwork. State and breakpoint selectors are optional so the same shape can constrain a coordinated-placement component or a specific stateful-display canvas.")).describe("Artwork constraints applied to this component, including safe areas and seller-reserved regions.").optional(), "format_option_ref": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
2876
+ const CanonicalFormatCoordinatedPlacementsSchema = /* @__PURE__ */ (() => z.object({ "experimental": z.boolean().describe("Experimental in AdCP 3.2 while the creative working group gathers implementation evidence for atomic cross-placement composition.").optional(), "deprecated": z.boolean().describe("When true, this canonical (or a seller's specific narrowing of it) is going away. Existing adopters are supported through the deprecation cycle; new adoption is discouraged. Pair with `migration_target_version` to indicate when the canonical is expected to be removed. Distinct from `experimental`: an experimental canonical may stabilize and stop being experimental; a deprecated canonical is on a sunset path.").optional(), "v1_translatable": z.boolean().describe("No v1 named-format equivalent can express a coordinated multi-placement buy.").optional(), "since_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version that introduced this canonical (e.g., '3.1', '3.2'). Lets adopters reason about minimum protocol version requirements when consuming a format declaration. Patch precision is intentionally rejected \u2014 canonicals are introduced at minor-version boundaries.").optional(), "migration_target_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version by which the working group expects this canonical to stabilize, surface a breaking revision, or (when `deprecated: true`) be removed. Patch precision is intentionally rejected \u2014 canonicals shift at minor-version boundaries. Absence signals 'no specific target' (omit the field rather than use a placeholder like 'unknown').").optional(), "composition_model": z.enum(["deterministic", "algorithmic"]).describe("Whether the surface composes deterministically (buyer can predict per-slot rendering \u2014 sponsored_placement, image, video) or algorithmically (surface chooses combinations or phrasing \u2014 responsive_creative, agent_placement).").optional(), "provenance_required": z.boolean().describe("When true, the product rejects unsigned synthesized assets. Builders calling build_creative MUST attach a C2PA-compatible provenance manifest attributing synthesis to the creative agent.").optional(), "platform_extensions": z.array(z.object({ "uri": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("HTTPS URL identifying the extension. `https://` is mandatory \u2014 `http://`, `file://`, `data:`, and other schemes are rejected at the schema layer (defense-in-depth on top of the fetch-contract normative rules). The URI base is the owning agent's URL; the path identifies the extension within that agent. Example: 'https://creative.adcontextprotocol.org/translated/meta/extensions/meta_pixel'. The full fetch contract \u2014 SSRF allowlist, response-size cap, $ref sandbox, schema-compile bounds \u2014 is documented on `product-format-declaration.json#format_schema` and applies to ALL fetches of this reference shape regardless of whether the field is named `format_schema` (load-bearing for validation) or `platform_extensions` (informational); the *transport* rules are identical, only the *consumption* semantics differ."), "digest": z.string().regex(new RegExp("^sha256:[a-f0-9]{64}$")).describe("SHA-256 content digest of the extension definition (sha256:<hex>). Used to detect drift \u2014 if the agent revises the extension, the digest changes and cached definitions become invalid.") }).catchall(z.any()).describe("Reference to a platform extension definition. The agent that owns the URI is authoritative for the extension's schema. Buyers fetch the definition once per content digest and cache it. Platform extensions are typically bundled in `get_products` responses under an `extensions` map keyed by `uri@digest`, eliminating the need for a separate fetch.\n\n**Within a single response**, multiple references to the same `uri` MUST carry the same `digest` \u2014 divergent digests in one response indicate producer-side error (e.g., concurrent extension revision mid-render). Buyers encountering divergent digests for the same URI MUST fail closed: treat all references to that URI as unresolved and surface a validation error rather than picking one branch silently. **Across responses**, digest divergence is normal \u2014 extension authors revise their schemas, the new digest differs, the cache key changes, and the buyer refetches. Cache by `uri@digest`, not by `uri` alone.")).describe('Platform-specific extensions narrowing the canonical (pixel ID shapes, conversion event taxonomies, platform-specific CTAs/destinations). Each extension is a URI+digest reference resolved against the bundled `extensions` map in get_products responses or fetched directly.\n\n**Collision precedence (normative).** When two or more `platform_extensions[]` entries on the same declaration extend the same target (e.g., both extend `tracking`) with overlapping field names, **array order is authoritative \u2014 later entries override earlier ones on a per-field basis** (last-in-array-wins). SDKs MUST surface the overlap via the `errors[]` array on the `get_products` response with a structured code (`FORMAT_DECLARATION_DIVERGENT` is appropriate when the overlap appears across dual-emitted shapes; a producer-self-emitted overlap on a single declaration SHOULD use the same code with `error.details: { collision_kind: "platform_extension_field", target, overlapping_fields, winning_extension_uri }`). Producers SHOULD avoid the collision by emitting one extension per target or by partitioning fields across extensions; the deterministic precedence is for last-resort consistency across SDK implementations, not a sanctioned merging strategy.').optional(), "synthesis_nondeterministic": z.boolean().describe("When true, the format's production pipeline is genuinely nondeterministic \u2014 the platform cannot guarantee that synthesis from a given input set produces in-spec output. Veo / Sora / Runway-class generative video, and other AI-synthesis flows where output dimensions, duration, or quality vary per run. Implies a different validation contract: predictive `validate_input` is impossible; the platform's own post-synthesis QA loop applies; if the QA loop exhausts without producing a valid artifact, `build_creative` returns task_failed with a synthesis_failed reason. Distinct from `composition_model` (which describes how the surface composes per-slot rendering, not whether synthesis is deterministic). When false or absent, the format's production is predictable enough that `validate_input` can predict output properties from input properties.\n\n**Compatibility with `asset_source` / `item_production_model`**: `synthesis_nondeterministic: true` MAY pair with any of `seller_pre_rendered_from_brief`, `seller_human_designed`, or `agent_synthesized` (the QA loop is concept-level, not source-specific \u2014 'seller renders from brief but each retry differs' is just as nondeterministic as Veo). It MUST NOT pair with `buyer_uploaded` (the buyer ships pre-rendered bytes; there's no synthesis step to be nondeterministic about). It MUST NOT pair with `publisher_host_recorded` (the publisher's host produces a deterministic-from-script output even if the human voice varies). When `synthesis_nondeterministic: true` is set with an incompatible source, validators SHOULD reject with a structured error.").optional(), "slots": z.array(z.object({ "asset_group_id": z.string().describe("Canonical asset_group_id from /schemas/core/asset-group-vocabulary.json. Non-canonical IDs are valid but trigger soft warnings."), "asset_type": z.enum(["image", "video", "audio", "text", "markdown", "url", "html", "css", "javascript", "vast", "daast", "display_tag", "webhook", "brief", "catalog", "published_post", "zip", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]).describe("Discriminator selecting the asset schema this slot accepts. SDK codegen uses this to type the slot value. `display_tag` is the atomic third-party display representation (URL, inline markup, or paired redirect). `published_post` is an existing-post reference asset. `pixel_tracker` / `vast_tracker` / `daast_tracker` are renderer-fired tracker primitives. `object` is a last-resort fallback."), "required": z.boolean().describe("Whether this slot is required for a valid manifest.").optional(), "min": z.number().int().gte(0).describe("Minimum count for repeatable / pool slots.").optional(), "max": z.number().int().gte(1).describe("Maximum count for repeatable / pool slots.").optional(), "max_chars": z.number().int().gte(1).describe("Per-slot character limit. Valid only when `asset_type` is `text`, `markdown`, or `brief`. Mutually exclusive with `max_size_kb` (which applies to binary asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "max_size_kb": z.number().int().gte(1).describe("Per-slot file size limit in exact kilobytes, where 1 KB = 1,000 bytes. Valid only when `asset_type` is `image`, `video`, `audio`, or `zip`. Mutually exclusive with `max_chars` (which applies to text asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Accepted intrinsic-pixel densities for this image-bearing slot. Valid when `asset_type` is `image`, and on a `card` slot where it constrains each card's image media (video media is unaffected). This makes density available to every canonical carrying image assets (native, carousel, responsive, companion images, and image itself), not only `format_kind: image`. When the image canonical also declares top-level `params.pixel_ratios`, the effective set is the intersection; an empty intersection is invalid. One matching asset satisfies the slot unless `required_pixel_ratios` requires rendition coverage.").optional(), "required_pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Required density coverage for an image rendition set. Valid only when `asset_type` is `image` and `pixel_ratios` is also declared. Every value MUST appear in the effective accepted set after intersecting any top-level image `params.pixel_ratios`, and the manifest slot value MUST be an array containing exactly one matching image rendition for each required ratio. Other accepted ratios remain optional. For example, `pixel_ratios: [1, 1.5, 2]` with `required_pixel_ratios: [1, 2]` requires the 1x and 2x renditions while making 1.5x optional. SDKs enforce intersection, subset, coverage, and duplicate-ratio rules because JSON Schema draft-07 cannot express them generically.").optional(), "logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("When `asset_group_id` is `logo`, renderer-facing brand.json logo slots acceptable for this format slot. Producers selecting from brand.json SHOULD prefer `logos[]` entries whose `slots[]` intersects this list, then apply `visual_guidelines.logo_usage_rules[]`.").optional(), "required_logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Subset of `logo_slots` for which this format expects explicit logo coverage. A manifest or brand-derived logo pool SHOULD include at least one usable logo for each required slot; if coverage is missing, builders SHOULD surface a validation warning or approval mapping instead of guessing from prose.").optional(), "description": z.string().describe("Human-readable description of what the slot expects from the buyer.").optional(), "consumed_for_production": z.boolean().describe("Dispatch hint for `build_creative` and v1\u2194v2 wire translators: when `true`, the slot's value is consumed as INPUT to a production step (host-read script, brief copy fed to generative synthesis, catalog feed driving per-SKU rendering) and is not rendered verbatim. When `false` (default), the slot's value is rendered verbatim on the placement (image bytes, video file, display tag).\n\nMotivates the v1\u2194v2 dispatch table: pre-v2 buyers shipped production-consumed inputs separately in a `inputs` map on the build_creative request; v2 collapses inputs and rendered assets into a single `assets` map keyed by `asset_group_id`. SDK translators between v1 and v2 use this flag per canonical to know which assets in the v2 manifest map back to v1 `inputs` vs v1 `assets`. Without the per-slot flag the dispatch table lives in adopter code and every SDK gets it slightly different.\n\nProducers SHOULD set this explicitly on slots whose consumption pattern isn't obvious (host-read scripts on `audio_hosted`, briefs on generative `video_hosted`, catalog feeds on `sponsored_placement`). For canonicals where every slot is render-verbatim (`image`, `display_tag`, `video_vast`, `audio_vast`), the default `false` is sufficient and the flag MAY be omitted.").optional() }).catchall(z.any()).and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }), z.any().refine((value) => !z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }), z.any().refine((value) => !z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.union([z.any().refine((value) => !z.any().refine((value2) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema").safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.any().refine((value) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.any().refine((value) => !z.union([z.object({ "logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "required_logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]))), z.intersection(z.any(), z.intersection(z.union([z.any().refine((value) => !z.object({ "required_pixel_ratios": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "required_pixel_ratios": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "asset_type": z.literal("image").optional() }))]), z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }), z.any().refine((value) => !z.union([z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))])))))).describe("Programmatic declaration of which canonical asset_group_id slots a manifest targeting this format must (or may) populate. Lets SDK codegen and validators enumerate expected slots without parsing the format's prose description. Each entry references an asset_group_id from the canonical vocabulary registry, paired with an `asset_type` so the validator knows which asset schema to apply. Format-level narrowing parameters that apply across all slots (e.g., flat `headline_max_chars` on responsive_creative) may also live on the format declaration; per-slot constraints (a specific slot's `max_chars` or `max_size_kb`) live on the slot entry.").optional(), "required_connections": z.array(z.object({ "provider": z.string().describe("Stable provider or platform namespace, preferably lowercase. Examples: `social.example`, `shortvideo.example`, or a seller-defined namespace. Omit only when the requirement is provider-agnostic, or when an `authorization_url` fully routes the human to the correct provider-specific connection flow.").optional(), "connection_type": z.enum(["advertiser_account", "publisher_identity", "post_authorization"]).describe("Kind of downstream connection required. `advertiser_account` is the platform account used to buy/manage ads. `publisher_identity` is the creator, page, channel, organization, or profile that owns source posts. `post_authorization` is a post-scoped grant when the platform authorizes individual posts instead of, or in addition to, the owning identity."), "required_for": z.array(z.string().min(1)).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Concrete AdCP protocol operation names that require this downstream connection. Sellers SHOULD include this in product declarations when the requirement is known ahead of time, and in AUTHORIZATION_REQUIRED details when it explains the failed operation. Prefer specific operation names such as `list_creatives`, `sync_creatives`, `create_media_buy`, `get_media_buy_delivery`, or `get_creative_delivery` over broad category labels such as `reporting`.").optional(), "scope": z.enum(["account", "identity", "post", "unknown"]).describe("Granularity of the downstream grant.").optional(), "status": z.enum(["connected", "missing", "pending", "expired", "revoked", "not_required", "unknown"]).describe("Current seller-observed state for this downstream connection when known. Product declarations MAY omit status or use `unknown`; AUTHORIZATION_REQUIRED details SHOULD use `missing`, `expired`, or `revoked` for the connection that blocked the call.").optional(), "connection_id": z.string().describe("Seller-defined identifier for an already-created downstream connection. Omit when no connection exists yet or when exposing it would leak platform/account state.").optional(), "resource_ref": z.object({ "platform_account_id": z.string().describe("Provider-native advertiser or business account id, when safe to disclose.").optional(), "identity_id": z.string().describe("Provider-native creator, page, channel, organization, or profile id, when safe to disclose.").optional(), "handle": z.string().describe("Provider-native public handle for the owning identity, when available.").optional(), "profile_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the owning identity, when available.").optional(), "post_id": z.string().describe("Provider-native post id, when the grant is post-scoped or the failed request referenced a specific post.").optional(), "post_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the referenced post, when available.").optional() }).catchall(z.any()).describe("Optional opaque provider-native resource hint, such as a platform account id, profile URL, handle, channel id, post id, or post URL. This is a hint for routing authorization, not proof that authorization exists.").optional(), "authorization_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Seller-hosted or provider-hosted URL where a human can complete or restore this downstream connection.").optional(), "authorization_instructions": z.string().describe("Human-readable instructions for completing or restoring this downstream connection.").optional(), "expires_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }), z.union([z.object({ "provider": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "authorization_url": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]))]).describe("Must also satisfy at least one of these alternatives.")).describe("A seller/platform-side connection or grant required by a product, format, or request. This is not the AdCP caller credential: the AdCP request is still authenticated once, and the seller uses these stored downstream connections to call a platform or service on the buyer's behalf. Use this shape for platforms that require more than one downstream grant, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.")).describe("Downstream platform connections or grants required to use this format declaration. These are in addition to the single AdCP caller credential. Use this when a platform product requires multiple downstream grants, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.").optional(), "reference_mutability": z.enum(["immutable_snapshot", "mutable_requires_reapproval", "mutable_auto_recheck"]).describe("Policy for formats whose `slots` accept a `published_post` reference. `immutable_snapshot`: seller snapshots the referenced post at approval and later source changes do not change the served creative. `mutable_requires_reapproval`: the source post may change and material changes require review before continued serving. `mutable_auto_recheck`: the source post may change and the seller continuously or periodically rechecks authorization/policy without requiring buyer resubmission. Omit when the format has no `published_post` slot.").optional(), "production_window_business_days": z.number().int().gte(0).describe("Typical production turnaround in business days when the format requires seller-side production (e.g., host-recording from a buyer-supplied script). 0 for synchronous (e.g., generative AI); >0 for human-produced (e.g., podcast host-read). Absent when no production is required (buyer uploads complete creative).").optional(), "components": z.array(z.object({ "component_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).describe("Stable coordination-local component identifier. Values MUST be unique within `components[]`."), "placement_ref": z.object({ "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring a publisher-catalog placement is hosted, or the inventory publisher associated with an inline placement. Omitted only for legacy single-publisher product-context references.").optional(), "placement_id": z.string().describe("Placement ID from the publisher's adagents.json placement catalog, or an inline seller-defined placement ID interpreted within the enclosing seller and product context.") }).catchall(z.any()).describe("Public product placement this component supplies. MUST resolve against the containing product's `placements[]`."), "required": z.boolean(), "sequence": z.number().int().gte(1).describe("Declared presentation order for sequential-messaging coordinated buys. Components sharing a sequence value present simultaneously; absent means unordered/simultaneous (default). Sequence declares seller-rendered ordering, not buyer-controlled timing.").optional(), "serving_policy": z.enum(["seller_served_only", "third_party_allowed"]).describe("Per-component serving/tracking policy. Some sellers restrict specific components (e.g., page skins) to first-party serving while allowing third-party tags on sibling components. Defaults to the product-level policy when absent.").optional(), "canvas_constraints": z.array(z.object({ "constraint": z.enum(["safe_area", "reserved_region", "decoration_only_edge", "no_text_or_logos"]), "state_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "breakpoint_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "region": z.object({ "x": z.number().gte(0), "y": z.number().gte(0), "width": z.number().gt(0), "height": z.number().gt(0), "unit": z.enum(["px", "percent"]).optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "unit": z.literal("percent") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "unit": z.literal("percent") }), z.object({ "x": z.any().optional(), "y": z.any().optional(), "width": z.any().optional(), "height": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")) }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "breakpoint_id": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "breakpoint_id": z.any().refine((value) => value !== void 0, "Required"), "state_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Rectangular rule applied to buyer artwork. State and breakpoint selectors are optional so the same shape can constrain a coordinated-placement component or a specific stateful-display canvas.")).describe("Artwork constraints applied to this component, including safe areas and seller-reserved regions.").optional(), "format_option_ref": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
2877
2877
  const schemas = [z.object({ "scope": z.literal("publisher").describe("Reference resolves against the named publisher's adagents.json top-level `formats[]` catalog."), "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Publisher domain where the adagents.json declaring this format option is hosted."), "format_option_id": z.string().describe("Stable format option ID from the publisher's adagents.json top-level `formats[]`, matching a publisher-catalog-backed entry in the target product's `format_options[]`.") }).catchall(z.any()).describe("Selects a publisher-catalog-backed product format option by publisher domain and format option ID."), z.object({ "scope": z.literal("product").describe("Reference resolves only against the target product's inline `format_options[]`."), "format_option_id": z.string().describe("Stable format option ID from the target product's inline `format_options[]`."), "publisher_domain": z.never().optional() }).catchall(z.any()).describe('Selects a product-local format option by ID within the enclosing package/product context. This branch deliberately forbids `publisher_domain` (`publisher_domain: false` in the schema) because product-local references are namespaced by the enclosing product only; include `scope: "publisher"` when the selector must cross into a publisher catalog.')];
2878
2878
  const { errors, failed } = schemas.reduce(
2879
2879
  ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
@@ -2898,7 +2898,7 @@ const CanonicalFormatCoordinatedPlacementsSchema = /* @__PURE__ */ (() => z.obje
2898
2898
  message: "Invalid input: Should pass single schema. Passed " + passed
2899
2899
  });
2900
2900
  }
2901
- })).describe("Reference to a sibling `format_options[]` entry on the same product. It MUST NOT resolve to `custom` or `coordinated_placements`.").optional(), "format_kind": z.string().optional(), "params": z.record(z.string(), z.any()).optional() }).catchall(z.any()).and(z.union([z.object({ "format_option_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "format_kind": z.any().refine((value) => value !== void 0, "Required"), "params": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]))).min(2).superRefine((components, ctx) => {
2901
+ })).describe("Reference to a sibling `format_options[]` entry on the same product. It MUST NOT resolve to `custom` or `coordinated_placements`.").optional(), "format_kind": z.string().optional(), "params": z.record(z.string(), z.any()).optional() }).catchall(z.any()).and(z.union([z.object({ "format_option_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "format_kind": z.any().refine((value) => value !== void 0, "Required"), "params": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives."))).min(2).superRefine((components, ctx) => {
2902
2902
  if (!components.some((component) => component.required === true)) {
2903
2903
  ctx.addIssue({ code: "custom", path: [], message: "At least one component must be required" });
2904
2904
  }
@@ -3025,7 +3025,7 @@ const SignalIDSchema = /* @__PURE__ */ (() => z.union([z.object({
3025
3025
  agent_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"),
3026
3026
  id: z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$"))
3027
3027
  }).passthrough()]))();
3028
- const SignalListingSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
3028
+ const SignalListingSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
3029
3029
  signal_ref: SignalRefSchema.optional(),
3030
3030
  signal_id: SignalIDSchema.optional(),
3031
3031
  name: z.string().optional(),
@@ -3040,7 +3040,7 @@ const SignalListingSchema = /* @__PURE__ */ (() => z.object({}).passthrough().me
3040
3040
  }).passthrough().optional(),
3041
3041
  restricted_attributes: z.array(RestrictedAttributeSchema).optional(),
3042
3042
  demographic_predicate: DemographicPredicateSchema.optional()
3043
- }).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
3043
+ }).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
3044
3044
  signal_ref: SignalRefSchema.optional(),
3045
3045
  signal_id: SignalIDSchema.optional(),
3046
3046
  name: z.string().optional(),
@@ -3055,7 +3055,7 @@ const SignalListingSchema = /* @__PURE__ */ (() => z.object({}).passthrough().me
3055
3055
  }).passthrough().optional(),
3056
3056
  restricted_attributes: z.array(RestrictedAttributeSchema).optional(),
3057
3057
  demographic_predicate: DemographicPredicateSchema.optional()
3058
- }).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
3058
+ }).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
3059
3059
  signal_ref: SignalRefSchema.optional(),
3060
3060
  signal_id: SignalIDSchema.optional(),
3061
3061
  name: z.string().optional(),
@@ -4070,7 +4070,7 @@ const BuildCreativeEstimateSchema = /* @__PURE__ */ (() => z.object({
4070
4070
  consumption_estimate: CreativeConsumptionSchema.optional()
4071
4071
  }).passthrough()).optional()
4072
4072
  }).passthrough(),
4073
- expires_at: z.iso.datetime().optional(),
4073
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
4074
4074
  context: ContextObjectSchema.optional(),
4075
4075
  ext: ExtensionObjectSchema.optional()
4076
4076
  }).passthrough())();
@@ -4087,7 +4087,7 @@ const PreviewCreativeSingleResponseSchema = /* @__PURE__ */ (() => z.object({
4087
4087
  }).passthrough()),
4088
4088
  quality_used: CreativeQualitySchema.optional(),
4089
4089
  interactive_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
4090
- expires_at: z.iso.datetime().optional(),
4090
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
4091
4091
  context: ContextObjectSchema.optional(),
4092
4092
  ext: ExtensionObjectSchema.optional()
4093
4093
  }).passthrough())();
@@ -4180,7 +4180,7 @@ const A2UIUserActionSchema = /* @__PURE__ */ (() => z.object({
4180
4180
  name: z.string(),
4181
4181
  context: z.object({}).passthrough().optional()
4182
4182
  }).passthrough(),
4183
- timestamp: z.iso.datetime().optional()
4183
+ timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
4184
4184
  }).passthrough())();
4185
4185
  const PublisherEntrySchema = /* @__PURE__ */ (() => z.object({
4186
4186
  publisher_domain: z.string().regex(/^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/),
@@ -4191,7 +4191,7 @@ const PublisherEntrySchema = /* @__PURE__ */ (() => z.object({
4191
4191
  property_ids: z.array(z.string()).optional(),
4192
4192
  signing_keys_pinned: z.boolean().optional(),
4193
4193
  status: z.union([z.literal("authorized"), z.literal("revoked")]),
4194
- last_verified_at: z.iso.datetime()
4194
+ last_verified_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
4195
4195
  }).passthrough())();
4196
4196
  const AcquireRightsRequestSchema = /* @__PURE__ */ (() => z.object({
4197
4197
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
@@ -4282,7 +4282,7 @@ const CreativeApprovedSchema = /* @__PURE__ */ (() => z.object({
4282
4282
  rights_id: z.string(),
4283
4283
  creative_id: z.string().optional(),
4284
4284
  creative_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
4285
- approved_at: z.iso.datetime().optional(),
4285
+ approved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
4286
4286
  conditions: z.array(z.string()).optional(),
4287
4287
  context: ContextObjectSchema.optional(),
4288
4288
  ext: ExtensionObjectSchema.optional()
@@ -4461,7 +4461,7 @@ const RevocationNotificationSchema = /* @__PURE__ */ (() => z.object({
4461
4461
  rights_id: z.string(),
4462
4462
  brand_id: z.string(),
4463
4463
  reason: z.string(),
4464
- effective_at: z.iso.datetime(),
4464
+ effective_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
4465
4465
  revoked_uses: z.array(RightUseSchema).optional(),
4466
4466
  context: ContextObjectSchema.optional(),
4467
4467
  ext: ExtensionObjectSchema.optional()
@@ -4488,7 +4488,7 @@ const SearchBrandResultSchema = /* @__PURE__ */ (() => z.object({
4488
4488
  name: z.string()
4489
4489
  }).passthrough().optional(),
4490
4490
  relationship_trust: z.union([z.literal("inline"), z.literal("mutual"), z.literal("leaf_only"), z.literal("house_only"), z.literal("standalone"), z.literal("unverifiable")]).optional(),
4491
- relationship_verified_at: z.iso.datetime().optional(),
4491
+ relationship_verified_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
4492
4492
  claimed_house_domain: z.string().optional(),
4493
4493
  names: z.array(z.record(z.string(), z.string())),
4494
4494
  description: z.string().optional(),
@@ -4532,7 +4532,7 @@ const VerifySubsidiaryClaimSchema = /* @__PURE__ */ (() => z.object({
4532
4532
  claim: z.object({
4533
4533
  subsidiary_domain: z.string(),
4534
4534
  subsidiary_brand_id: z.string().regex(/^[a-z0-9_]+$/).optional(),
4535
- observed_at: z.iso.datetime().optional()
4535
+ observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
4536
4536
  }).passthrough()
4537
4537
  }).passthrough())();
4538
4538
  const VerifyParentClaimSchema = /* @__PURE__ */ (() => z.object({
@@ -4540,7 +4540,7 @@ const VerifyParentClaimSchema = /* @__PURE__ */ (() => z.object({
4540
4540
  claim: z.object({
4541
4541
  parent_domain: z.string(),
4542
4542
  claimant_says: z.string().optional(),
4543
- observed_at: z.iso.datetime().optional()
4543
+ observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
4544
4544
  }).passthrough()
4545
4545
  }).passthrough())();
4546
4546
  const VerifyPropertyClaimSchema = /* @__PURE__ */ (() => z.object({
@@ -4642,8 +4642,8 @@ const CollectionListChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
4642
4642
  collections_removed: z.int().optional(),
4643
4643
  total_collections: z.int().optional()
4644
4644
  }).passthrough().optional(),
4645
- resolved_at: z.iso.datetime(),
4646
- cache_valid_until: z.iso.datetime().optional(),
4645
+ resolved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
4646
+ cache_valid_until: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
4647
4647
  signature: z.string(),
4648
4648
  ext: ExtensionObjectSchema.optional()
4649
4649
  }).passthrough())();
@@ -4893,11 +4893,11 @@ const AccountChangeRecordedWebhookSchema = /* @__PURE__ */ (() => z.object({
4893
4893
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
4894
4894
  notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
4895
4895
  notification_type: z.literal("account.change_recorded"),
4896
- fired_at: z.iso.datetime(),
4896
+ fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
4897
4897
  subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
4898
4898
  account_id: z.string().min(1).max(255),
4899
4899
  change_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
4900
- recorded_at: z.iso.datetime(),
4900
+ recorded_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
4901
4901
  resource: z.object({
4902
4902
  type: z.string().min(1).max(100).regex(/^[a-z][a-z0-9_.-]{0,99}$/),
4903
4903
  resource_id: z.string().min(1).max(255),
@@ -4962,17 +4962,17 @@ const AccountStatusChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
4962
4962
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
4963
4963
  notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
4964
4964
  notification_type: z.literal("account.status_changed"),
4965
- fired_at: z.iso.datetime(),
4965
+ fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
4966
4966
  subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
4967
4967
  account_id: z.string(),
4968
4968
  previous_status: AccountStatusSchema,
4969
4969
  status: AccountStatusSchema,
4970
- observed_at: z.iso.datetime(),
4970
+ observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
4971
4971
  reason_code: z.union([z.literal("seller_approved"), z.literal("seller_rejected"), z.literal("payment_required"), z.literal("credit_limit_reached"), z.literal("funds_depleted"), z.literal("setup_required"), z.literal("policy_review"), z.literal("policy_violation"), z.literal("compliance_hold"), z.literal("buyer_requested"), z.literal("seller_closed"), z.literal("manual_update"), z.literal("other")]),
4972
4972
  reason_detail: z.string().max(500).optional(),
4973
4973
  setup: z.object({
4974
4974
  message: z.string(),
4975
- expires_at: z.iso.datetime().optional()
4975
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
4976
4976
  }).passthrough().optional(),
4977
4977
  ext: ExtensionObjectSchema.optional()
4978
4978
  }).passthrough())();
@@ -5043,7 +5043,7 @@ const AgentSigningKeySchema = /* @__PURE__ */ (() => z.object({
5043
5043
  y: z.string().optional(),
5044
5044
  n: z.string().optional(),
5045
5045
  e: z.string().optional(),
5046
- revoked_at: z.iso.datetime().optional()
5046
+ revoked_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
5047
5047
  }).passthrough())();
5048
5048
  const AgentWebhookChallengeSchema = /* @__PURE__ */ (() => z.object({
5049
5049
  type: z.literal("webhook.challenge"),
@@ -5088,7 +5088,7 @@ const VASTAssetSchema = /* @__PURE__ */ (() => z.object({
5088
5088
  field: z.literal("content").optional()
5089
5089
  }).passthrough().optional()
5090
5090
  }).passthrough()).optional()
5091
- }).passthrough()])))();
5091
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
5092
5092
  const AdCPAssetGroupVocabularyRegistrySchema = /* @__PURE__ */ (() => z.object({}).passthrough())();
5093
5093
  const AttestationIssuerSchema = /* @__PURE__ */ (() => z.union([AttestationBrandIssuerSchema, AttestationAgentIssuerSchema, AttestationOriginIssuerSchema]))();
5094
5094
  const AudienceEvidenceRequirementsSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({
@@ -5131,7 +5131,7 @@ const AuthorizedAgentBaseFieldsSchema = /* @__PURE__ */ (() => z.object({
5131
5131
  authorized_for: z.string().min(1).max(500),
5132
5132
  signing_keys: z.array(AgentSigningKeySchema).optional(),
5133
5133
  encryption_keys: z.array(AgentEncryptionKeySchema).optional(),
5134
- last_updated: z.iso.datetime().optional()
5134
+ last_updated: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
5135
5135
  }).passthrough())();
5136
5136
  const MaxBidWithCostPerSchema = /* @__PURE__ */ (() => z.object({
5137
5137
  kind: z.literal("max_bid_with_cost_per"),
@@ -5155,7 +5155,7 @@ const BrandResponseAuthorizationResultSchema = /* @__PURE__ */ (() => z.object({
5155
5155
  reason: z.union([z.literal("brand_json_unavailable"), z.literal("agent_not_authorized"), z.literal("agent_authorization_ambiguous"), z.literal("jwks_unavailable"), z.literal("kid_not_authorized"), z.literal("kid_authorization_ambiguous"), z.literal("key_material_mismatch"), z.literal("key_purpose_invalid")]),
5156
5156
  kid: z.string().min(1).optional(),
5157
5157
  jwks_uri: z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(/^https:\/\//).optional()
5158
- }).passthrough()])))();
5158
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
5159
5159
  const BudgetRangeSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({
5160
5160
  min: z.number().gte(0).optional(),
5161
5161
  max: z.number().gte(0).optional(),
@@ -5182,10 +5182,10 @@ const CapabilitiesChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
5182
5182
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
5183
5183
  notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
5184
5184
  notification_type: z.literal("capabilities.changed"),
5185
- fired_at: z.iso.datetime(),
5185
+ fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
5186
5186
  subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
5187
5187
  agent_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"),
5188
- changed_at: z.iso.datetime(),
5188
+ changed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
5189
5189
  reason: z.union([z.literal("configuration_changed"), z.literal("deployment_changed"), z.literal("capability_enabled"), z.literal("capability_disabled"), z.literal("protocol_versions_changed"), z.literal("manual_refresh"), z.literal("other")]),
5190
5190
  capabilities_version: z.string().min(1).max(255),
5191
5191
  changed_paths: z.array(z.string()).optional(),
@@ -5268,7 +5268,7 @@ const CatchmentSchema = /* @__PURE__ */ (() => z.object({
5268
5268
  coordinates: z.array(z.unknown())
5269
5269
  }).passthrough(),
5270
5270
  ext: ExtensionObjectSchema.optional()
5271
- }).passthrough()])))();
5271
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
5272
5272
  const CollectionDistributionSchema = /* @__PURE__ */ (() => z.object({
5273
5273
  publisher_domain: z.string(),
5274
5274
  property_ids: z.array(PropertyIDSchema).optional(),
@@ -5627,7 +5627,7 @@ const GeographicPlaceCatalogEntrySchema = /* @__PURE__ */ (() => z.object({
5627
5627
  parent_labels: z.array(z.string()),
5628
5628
  status: z.union([z.literal("active"), z.literal("removal_planned"), z.literal("deprecated")]),
5629
5629
  replaced_by_values: z.array(z.string()).optional(),
5630
- valid_until: z.iso.datetime().optional(),
5630
+ valid_until: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
5631
5631
  ext: ExtensionObjectSchema.optional()
5632
5632
  }).passthrough())();
5633
5633
  const GeographicPlaceCatalogCapabilitySchema = /* @__PURE__ */ (() => z.object({
@@ -5664,7 +5664,7 @@ const IndicatorsChangedWebhookSchema = /* @__PURE__ */ (() => z.union([z.object(
5664
5664
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
5665
5665
  notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
5666
5666
  notification_type: z.literal("indicators.changed"),
5667
- fired_at: z.iso.datetime(),
5667
+ fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
5668
5668
  subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
5669
5669
  account_id: z.string(),
5670
5670
  relationship_kind: z.literal("media_buy"),
@@ -5673,13 +5673,13 @@ const IndicatorsChangedWebhookSchema = /* @__PURE__ */ (() => z.union([z.object(
5673
5673
  creative_id: z.string().optional(),
5674
5674
  change_kind: z.union([z.literal("asserted"), z.literal("cleared"), z.literal("updated"), z.literal("invalidated"), z.literal("coverage_changed"), z.literal("assignment_removed")]),
5675
5675
  changed_indicator_types: z.array(IndicatorTypeSchema),
5676
- observed_at: z.iso.datetime(),
5676
+ observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
5677
5677
  ext: ExtensionObjectSchema.optional()
5678
5678
  }).passthrough(), z.object({
5679
5679
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
5680
5680
  notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
5681
5681
  notification_type: z.literal("indicators.changed"),
5682
- fired_at: z.iso.datetime(),
5682
+ fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
5683
5683
  subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
5684
5684
  account_id: z.string(),
5685
5685
  relationship_kind: z.literal("package"),
@@ -5688,13 +5688,13 @@ const IndicatorsChangedWebhookSchema = /* @__PURE__ */ (() => z.union([z.object(
5688
5688
  creative_id: z.string().optional(),
5689
5689
  change_kind: z.union([z.literal("asserted"), z.literal("cleared"), z.literal("updated"), z.literal("invalidated"), z.literal("coverage_changed"), z.literal("assignment_removed")]),
5690
5690
  changed_indicator_types: z.array(IndicatorTypeSchema),
5691
- observed_at: z.iso.datetime(),
5691
+ observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
5692
5692
  ext: ExtensionObjectSchema.optional()
5693
5693
  }).passthrough(), z.object({
5694
5694
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
5695
5695
  notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
5696
5696
  notification_type: z.literal("indicators.changed"),
5697
- fired_at: z.iso.datetime(),
5697
+ fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
5698
5698
  subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
5699
5699
  account_id: z.string(),
5700
5700
  relationship_kind: z.literal("creative_assignment"),
@@ -5703,7 +5703,7 @@ const IndicatorsChangedWebhookSchema = /* @__PURE__ */ (() => z.union([z.object(
5703
5703
  creative_id: z.string(),
5704
5704
  change_kind: z.union([z.literal("asserted"), z.literal("cleared"), z.literal("updated"), z.literal("invalidated"), z.literal("coverage_changed"), z.literal("assignment_removed")]),
5705
5705
  changed_indicator_types: z.array(IndicatorTypeSchema),
5706
- observed_at: z.iso.datetime(),
5706
+ observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
5707
5707
  ext: ExtensionObjectSchema.optional()
5708
5708
  }).passthrough()]))();
5709
5709
  const InstallmentReferenceSchema = /* @__PURE__ */ (() => z.object({
@@ -5825,7 +5825,7 @@ const PerformanceFeedbackAssertionSchema = /* @__PURE__ */ (() => z.object({
5825
5825
  }).passthrough().optional()
5826
5826
  }).passthrough().optional(),
5827
5827
  evidence_ref: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
5828
- as_of: z.iso.datetime().optional(),
5828
+ as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
5829
5829
  final: z.boolean().optional(),
5830
5830
  supersedes_feedback_id: z.string().min(1).optional()
5831
5831
  }).passthrough())();
@@ -5835,8 +5835,8 @@ const PerformanceFeedbackSchema = /* @__PURE__ */ (() => z.object({
5835
5835
  package_id: z.string().optional(),
5836
5836
  creative_id: z.string().optional(),
5837
5837
  measurement_period: z.object({
5838
- start: z.iso.datetime(),
5839
- end: z.iso.datetime()
5838
+ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
5839
+ end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
5840
5840
  }).passthrough(),
5841
5841
  performance_index: z.number().min(0),
5842
5842
  metric_type: MetricTypeSchema.optional(),
@@ -5865,8 +5865,8 @@ const PerformanceFeedbackSchema = /* @__PURE__ */ (() => z.object({
5865
5865
  feedback_source: FeedbackSourceSchema,
5866
5866
  vendor: BrandReferenceSchema.optional(),
5867
5867
  status: z.union([z.literal("accepted"), z.literal("queued"), z.literal("applied"), z.literal("rejected")]),
5868
- submitted_at: z.iso.datetime(),
5869
- applied_at: z.iso.datetime().optional()
5868
+ submitted_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
5869
+ applied_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
5870
5870
  }).passthrough())();
5871
5871
  const PlacementPresentationReferenceSchema = /* @__PURE__ */ (() => z.object({
5872
5872
  uri: z.string().regex(new RegExp("^https://")).refine(adcpJsonSchemaUri, "Invalid URI"),
@@ -5945,10 +5945,10 @@ const PrincipalChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
5945
5945
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
5946
5946
  notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
5947
5947
  notification_type: z.literal("principal.changed"),
5948
- fired_at: z.iso.datetime(),
5948
+ fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
5949
5949
  subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
5950
5950
  agent_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"),
5951
- changed_at: z.iso.datetime(),
5951
+ changed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
5952
5952
  reason: z.union([z.literal("destination_state_changed"), z.literal("setup_expiring"), z.literal("setup_expired"), z.literal("proof_invalidated"), z.literal("declarations_intersection_changed"), z.literal("other")]),
5953
5953
  destination_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/).optional(),
5954
5954
  ext: ExtensionObjectSchema.optional()
@@ -6093,7 +6093,7 @@ const AgentProfilePayloadSchema = /* @__PURE__ */ (() => z.object({
6093
6093
  property_count: z.int().min(0).optional(),
6094
6094
  publisher_count: z.int().min(0).optional(),
6095
6095
  has_tmp: z.boolean().optional(),
6096
- updated_at: z.iso.datetime().optional()
6096
+ updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
6097
6097
  }).passthrough())();
6098
6098
  const CompliancePayloadSchema = /* @__PURE__ */ (() => z.object({
6099
6099
  agent_url: z.string(),
@@ -6324,7 +6324,7 @@ const ReportingDeliveryReadyWebhookSchema = /* @__PURE__ */ (() => z.object({
6324
6324
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
6325
6325
  notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
6326
6326
  notification_type: z.literal("reporting.delivery_ready"),
6327
- fired_at: z.iso.datetime(),
6327
+ fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
6328
6328
  subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
6329
6329
  account_id: z.string().min(1),
6330
6330
  delivery_config_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
@@ -6333,7 +6333,7 @@ const ReportingDeliveryReadyWebhookSchema = /* @__PURE__ */ (() => z.object({
6333
6333
  reporting_materialization_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
6334
6334
  readiness: z.union([z.literal("available"), z.literal("delivered")]),
6335
6335
  finality: ReportingFinalitySchema,
6336
- data_through: z.iso.datetime().nullable(),
6336
+ data_through: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").nullable(),
6337
6337
  feed_purpose: ReportingFeedPurposeSchema
6338
6338
  }).passthrough())();
6339
6339
  const ReportingFileCompressionSchema = /* @__PURE__ */ (() => z.union([z.literal("none"), z.literal("gzip"), z.literal("zstd"), z.literal("snappy")]))();
@@ -6354,8 +6354,8 @@ const ReportingFileManifestSchema = /* @__PURE__ */ (() => z.object({
6354
6354
  reporting_obligation_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
6355
6355
  reporting_materialization_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
6356
6356
  period: z.object({
6357
- start: z.iso.datetime(),
6358
- end: z.iso.datetime(),
6357
+ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
6358
+ end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
6359
6359
  source_timezone: z.string().min(1)
6360
6360
  }).strict(),
6361
6361
  format: z.union([z.literal("jsonl"), z.literal("csv"), z.literal("parquet"), z.literal("avro"), z.literal("orc")]),
@@ -6364,13 +6364,13 @@ const ReportingFileManifestSchema = /* @__PURE__ */ (() => z.object({
6364
6364
  total_size_bytes: z.int().min(0),
6365
6365
  row_count: z.int().min(0),
6366
6366
  control_totals: z.array(ReportingControlTotalSchema),
6367
- created_at: z.iso.datetime()
6367
+ created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
6368
6368
  }).strict())();
6369
6369
  const ReportingLedgerChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
6370
6370
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
6371
6371
  notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
6372
6372
  notification_type: z.literal("reporting.ledger_changed"),
6373
- fired_at: z.iso.datetime(),
6373
+ fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
6374
6374
  subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
6375
6375
  account_id: z.string().min(1),
6376
6376
  change_kind: z.union([z.literal("revision_published"), z.literal("adjustment_published")]),
@@ -6588,7 +6588,7 @@ const ReportingStatusChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
6588
6588
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
6589
6589
  notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
6590
6590
  notification_type: z.literal("reporting.status_changed"),
6591
- fired_at: z.iso.datetime(),
6591
+ fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
6592
6592
  subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
6593
6593
  account_id: z.string().min(1),
6594
6594
  delivery_config_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
@@ -6670,7 +6670,7 @@ const AttestationReferenceSchema = /* @__PURE__ */ (() => z.object({
6670
6670
  agent_url: z.string().regex(new RegExp("^https://[^/?#@]+(?:/[^?#]*)?(?:\\?[^#]*)?$")).refine(adcpJsonSchemaUri, "Invalid URI")
6671
6671
  }).passthrough().optional(),
6672
6672
  ext: ExtensionObjectSchema.optional()
6673
- }).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
6673
+ }).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
6674
6674
  issuer: AttestationIssuerSchema,
6675
6675
  claim_type: z.string().refine(adcpJsonSchemaUri, "Invalid URI"),
6676
6676
  subject: AttestationSubjectSchema,
@@ -6768,7 +6768,7 @@ const SignalDefinitionSchema = /* @__PURE__ */ (() => z.object({
6768
6768
  response_sla_days: z.int().min(1).max(90).optional(),
6769
6769
  ccpa_opt_out_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(/^https:\/\//).optional()
6770
6770
  }).passthrough().optional(),
6771
- last_updated: z.iso.datetime().optional(),
6771
+ last_updated: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
6772
6772
  dts_compliant_version: z.string().optional()
6773
6773
  }).passthrough())();
6774
6774
  const SignalFiltersSchema = /* @__PURE__ */ (() => z.object({
@@ -6827,9 +6827,9 @@ const TasksGetResponseSchema = /* @__PURE__ */ (() => z.object({
6827
6827
  adcp_major_version: z.number().int().gte(1).lte(99).optional(),
6828
6828
  task_type: TaskTypeSchema,
6829
6829
  protocol: AdCPProtocolSchema,
6830
- created_at: z.iso.datetime(),
6831
- updated_at: z.iso.datetime(),
6832
- completed_at: z.iso.datetime().optional(),
6830
+ created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
6831
+ updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
6832
+ completed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
6833
6833
  has_webhook: z.boolean().optional(),
6834
6834
  progress: z.object({
6835
6835
  percentage: z.number().min(0).max(100).optional(),
@@ -6847,7 +6847,7 @@ const TasksGetResponseSchema = /* @__PURE__ */ (() => z.object({
6847
6847
  }).passthrough().optional()
6848
6848
  }).passthrough().optional(),
6849
6849
  history: z.array(z.object({
6850
- timestamp: z.iso.datetime(),
6850
+ timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
6851
6851
  type: z.union([z.literal("request"), z.literal("response")]),
6852
6852
  data: z.object({}).passthrough()
6853
6853
  }).passthrough()).optional(),
@@ -6865,10 +6865,10 @@ const TasksListRequestSchema = /* @__PURE__ */ (() => z.object({
6865
6865
  statuses: z.array(TaskStatusSchema).optional(),
6866
6866
  task_type: TaskTypeSchema.optional(),
6867
6867
  task_types: z.array(TaskTypeSchema).optional(),
6868
- created_after: z.iso.datetime().optional(),
6869
- created_before: z.iso.datetime().optional(),
6870
- updated_after: z.iso.datetime().optional(),
6871
- updated_before: z.iso.datetime().optional(),
6868
+ created_after: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
6869
+ created_before: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
6870
+ updated_after: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
6871
+ updated_before: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
6872
6872
  task_ids: z.array(z.string()).max(100).optional(),
6873
6873
  context_contains: z.string().optional(),
6874
6874
  has_webhook: z.boolean().optional()
@@ -6916,9 +6916,9 @@ const TasksListResponseSchema = /* @__PURE__ */ (() => z.object({
6916
6916
  task_type: TaskTypeSchema,
6917
6917
  domain: z.union([z.literal("media-buy"), z.literal("signals"), z.literal("creative")]),
6918
6918
  status: TaskStatusSchema,
6919
- created_at: z.iso.datetime(),
6920
- updated_at: z.iso.datetime(),
6921
- completed_at: z.iso.datetime().optional(),
6919
+ created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
6920
+ updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
6921
+ completed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
6922
6922
  has_webhook: z.boolean().optional()
6923
6923
  }).passthrough()),
6924
6924
  pagination: PaginationResponseSchema,
@@ -6970,7 +6970,7 @@ const AgenticAdvertisingOrgVerificationTokenClaimsSchema = /* @__PURE__ */ (() =
6970
6970
  verified_specialisms: z.array(z.string()),
6971
6971
  verification_modes: z.array(VerificationTokenModeSchema),
6972
6972
  grading_profile: z.union([z.literal("legacy"), z.literal("spec")]).optional(),
6973
- first_failing_spec_at: z.iso.datetime().optional(),
6973
+ first_failing_spec_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
6974
6974
  adcp_version: z.string().regex(/^[1-9][0-9]*\.[0-9]+$/).optional(),
6975
6975
  protocol_version: z.string().optional()
6976
6976
  }).passthrough())();
@@ -7002,26 +7002,26 @@ const CreativeAssignmentChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
7002
7002
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
7003
7003
  notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
7004
7004
  notification_type: z.literal("creative.assignment_changed"),
7005
- fired_at: z.iso.datetime(),
7005
+ fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
7006
7006
  subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
7007
7007
  account_id: z.string(),
7008
7008
  media_buy_id: z.string(),
7009
7009
  package_id: z.string(),
7010
7010
  creative_id: z.string(),
7011
7011
  change_kind: z.union([z.literal("assigned"), z.literal("unassigned"), z.literal("approval_changed")]),
7012
- observed_at: z.iso.datetime(),
7012
+ observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
7013
7013
  ext: ExtensionObjectSchema.optional()
7014
7014
  }).passthrough())();
7015
7015
  const CreativePurgedWebhookSchema = /* @__PURE__ */ (() => z.object({
7016
7016
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
7017
7017
  notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
7018
7018
  notification_type: z.literal("creative.purged"),
7019
- fired_at: z.iso.datetime(),
7019
+ fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
7020
7020
  subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
7021
7021
  account_id: z.string(),
7022
7022
  creative_id: z.string(),
7023
7023
  purge_kind: z.union([z.literal("soft"), z.literal("hard")]),
7024
- purged_at: z.iso.datetime(),
7024
+ purged_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
7025
7025
  reason_code: CreativeEventReasonCodeSchema,
7026
7026
  reason_detail: z.string().max(500).optional(),
7027
7027
  initiator: z.union([z.literal("seller"), z.literal("system")]),
@@ -7031,7 +7031,7 @@ const CreativeStatusChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
7031
7031
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
7032
7032
  notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
7033
7033
  notification_type: z.literal("creative.status_changed"),
7034
- fired_at: z.iso.datetime(),
7034
+ fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
7035
7035
  subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
7036
7036
  account_id: z.string(),
7037
7037
  creative_id: z.string(),
@@ -7039,7 +7039,7 @@ const CreativeStatusChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
7039
7039
  transition: z.object({
7040
7040
  from: z.union([z.literal("processing"), z.literal("pending_review"), z.literal("approved"), z.literal("suspended")]),
7041
7041
  to: CreativeStatusSchema,
7042
- observed_at: z.iso.datetime()
7042
+ observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
7043
7043
  }).passthrough(),
7044
7044
  reason_code: CreativeEventReasonCodeSchema,
7045
7045
  reason_detail: z.string().max(500).optional(),
@@ -7291,7 +7291,7 @@ const ToolNameSchema = /* @__PURE__ */ (() => z.string().regex(/^[a-z][a-z0-9_]*
7291
7291
  const AdCPManifestSchema = /* @__PURE__ */ (() => z.object({
7292
7292
  $schema: z.string().optional(),
7293
7293
  adcp_version: z.string().regex(/^\d+\.\d+\.\d+(-[A-Za-z0-9.-]+)?$/),
7294
- generated_at: z.iso.datetime(),
7294
+ generated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
7295
7295
  tools: z.record(z.string(), z.object({
7296
7296
  protocol: z.union([z.literal("media-buy"), z.literal("signals"), z.literal("governance"), z.literal("account"), z.literal("creative"), z.literal("brand"), z.literal("content-standards"), z.literal("property"), z.literal("collection"), z.literal("sponsored-intelligence"), z.literal("protocol"), z.literal("compliance"), z.literal("trusted-match"), z.literal("a2ui")]),
7297
7297
  mutating: z.boolean(),
@@ -7479,8 +7479,8 @@ const PropertyListChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
7479
7479
  properties_removed: z.int().optional(),
7480
7480
  total_properties: z.int().optional()
7481
7481
  }).passthrough().optional(),
7482
- resolved_at: z.iso.datetime(),
7483
- cache_valid_until: z.iso.datetime().optional(),
7482
+ resolved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
7483
+ cache_valid_until: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
7484
7484
  signature: z.string(),
7485
7485
  ext: ExtensionObjectSchema.optional()
7486
7486
  }).passthrough())();
@@ -7682,7 +7682,7 @@ const IdentityMatchRequestSchema = /* @__PURE__ */ (() => z.object({
7682
7682
  verification_level: z.union([z.literal("orb"), z.literal("device"), z.literal("document")]).optional(),
7683
7683
  signal_binding: z.string().optional(),
7684
7684
  proof: z.object({}).passthrough(),
7685
- expires_at: z.iso.datetime().optional()
7685
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
7686
7686
  }).strict().optional()
7687
7687
  }).strict()).max(3),
7688
7688
  consent: z.object({
@@ -8091,25 +8091,25 @@ const FrequencyCapIntervalConstraintsSchema = /* @__PURE__ */ (() => z.object({
8091
8091
  maximum_interval: z.number().optional(),
8092
8092
  allowed_intervals: z.array(z.number()).optional(),
8093
8093
  ext: ExtensionObjectSchema.optional()
8094
- }).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
8094
+ }).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
8095
8095
  unit: FrequencyCapDurationUnitSchema,
8096
8096
  minimum_interval: z.number().optional(),
8097
8097
  maximum_interval: z.number().optional(),
8098
8098
  allowed_intervals: z.array(z.number()).optional(),
8099
8099
  ext: ExtensionObjectSchema.optional()
8100
- }).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
8100
+ }).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
8101
8101
  unit: FrequencyCapDurationUnitSchema,
8102
8102
  minimum_interval: z.number().optional(),
8103
8103
  maximum_interval: z.number().optional(),
8104
8104
  allowed_intervals: z.array(z.number()).optional(),
8105
8105
  ext: ExtensionObjectSchema.optional()
8106
- }).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
8106
+ }).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
8107
8107
  unit: FrequencyCapDurationUnitSchema,
8108
8108
  minimum_interval: z.number().optional(),
8109
8109
  maximum_interval: z.number().optional(),
8110
8110
  allowed_intervals: z.array(z.number()).optional(),
8111
8111
  ext: ExtensionObjectSchema.optional()
8112
- }).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])))();
8112
+ }).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
8113
8113
  const FrequencyCapConstraintsSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({
8114
8114
  mutable_fields: z.array(FrequencyCapMutableFieldSchema).optional(),
8115
8115
  supported_control_modes: z.array(FrequencyCapControlModeSchema).optional(),
@@ -8314,7 +8314,7 @@ const AcceptProposalRequestSchema = /* @__PURE__ */ (() => z.object({
8314
8314
  budget_cap_timezone: z.string().min(1).optional(),
8315
8315
  io_acceptance: z.object({
8316
8316
  io_id: z.string().min(1),
8317
- accepted_at: z.iso.datetime(),
8317
+ accepted_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
8318
8318
  signatory: z.string().min(1).max(250),
8319
8319
  signature_id: z.string().min(1).optional()
8320
8320
  }).passthrough().optional(),
@@ -8333,7 +8333,7 @@ const ControlAppliedSchema = /* @__PURE__ */ (() => z.object({
8333
8333
  media_buy_id: z.string().min(1),
8334
8334
  revision: z.int().min(1),
8335
8335
  media_buy_status: MediaBuyStatusSchema.optional(),
8336
- implementation_date: z.iso.datetime().optional().nullable(),
8336
+ implementation_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
8337
8337
  affected_package_ids: z.array(z.string()).optional(),
8338
8338
  available_actions: z.array(CanonicalMediaBuyActionSchema).optional(),
8339
8339
  warnings: z.array(WarningSchema.and(z.object({
@@ -8531,7 +8531,7 @@ const GetMediaBuysRequestSchema = /* @__PURE__ */ (() => z.object({
8531
8531
  }).passthrough())();
8532
8532
  const ScopedCreativeApprovalSchema = /* @__PURE__ */ (() => z.object({
8533
8533
  scope: IndicatorScopeSchema,
8534
- approval_status: CreativeApprovalStatusSchema.and(z.union([z.literal("pending_review"), z.literal("approved"), z.literal("rejected")])),
8534
+ approval_status: CreativeApprovalStatusSchema.and(z.union([z.literal("pending_review"), z.literal("approved"), z.literal("rejected")]).describe("Must also satisfy at least one of these alternatives.")),
8535
8535
  rejection_reason: z.string().optional()
8536
8536
  }).passthrough())();
8537
8537
  const GetMediaBuyDeliveryRequestSchema = /* @__PURE__ */ (() => z.object({
@@ -8684,8 +8684,8 @@ const GetReportingStatusRequestSchema = /* @__PURE__ */ (() => z.object({
8684
8684
  delivery_config_ids: z.array(z.string()).max(16).optional(),
8685
8685
  feed_purposes: z.array(ReportingFeedPurposeSchema).optional(),
8686
8686
  period: z.object({
8687
- start: z.iso.datetime(),
8688
- end: z.iso.datetime()
8687
+ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
8688
+ end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
8689
8689
  }).passthrough().optional(),
8690
8690
  health: z.array(ReportingHealthSchema).optional(),
8691
8691
  finality: z.array(ReportingFinalitySchema).optional(),
@@ -8804,7 +8804,7 @@ const UnavailableLookupSchema = /* @__PURE__ */ (() => z.object({
8804
8804
  context_id: z.string().optional(),
8805
8805
  context: ContextObjectSchema.optional(),
8806
8806
  message: z.literal("Reporting status resource is unavailable.").optional(),
8807
- timestamp: z.iso.datetime().optional(),
8807
+ timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
8808
8808
  replayed: z.boolean().optional(),
8809
8809
  adcp_error: z.object({
8810
8810
  code: z.literal("NOT_FOUND"),
@@ -8824,7 +8824,7 @@ const OperationalFailureSchema = /* @__PURE__ */ (() => z.object({
8824
8824
  context_id: z.string().optional(),
8825
8825
  context: ContextObjectSchema.optional(),
8826
8826
  message: z.string().optional(),
8827
- timestamp: z.iso.datetime().optional(),
8827
+ timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
8828
8828
  replayed: z.boolean().optional(),
8829
8829
  adcp_error: ErrorSchema.optional(),
8830
8830
  errors: z.array(ErrorSchema)
@@ -8943,8 +8943,8 @@ const ProvidePerformanceFeedbackSuccessSchema = /* @__PURE__ */ (() => z.object(
8943
8943
  feedback_id: z.string().min(1).optional(),
8944
8944
  application_status: z.union([z.literal("accepted"), z.literal("applied"), z.literal("not_applied")]).optional(),
8945
8945
  status_reason: z.string().max(500).optional(),
8946
- received_at: z.iso.datetime().optional(),
8947
- applied_at: z.iso.datetime().optional(),
8946
+ received_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
8947
+ applied_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
8948
8948
  sandbox: z.boolean().optional(),
8949
8949
  context: ContextObjectSchema.optional(),
8950
8950
  ext: ExtensionObjectSchema.optional()
@@ -9079,7 +9079,7 @@ const SyncAudiencesSuccessSchema = /* @__PURE__ */ (() => z.object({
9079
9079
  matched: z.int().min(0),
9080
9080
  match_rate: z.number().min(0).max(1)
9081
9081
  }).passthrough()).optional(),
9082
- last_synced_at: z.iso.datetime().optional(),
9082
+ last_synced_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
9083
9083
  source: z.object({
9084
9084
  kind: z.union([z.literal("dataset"), z.literal("platform_segment")]),
9085
9085
  vendor: BrandReferenceSchema,
@@ -9141,8 +9141,8 @@ const SyncCatalogsSuccessSchema = /* @__PURE__ */ (() => z.object({
9141
9141
  status: CatalogItemStatusSchema,
9142
9142
  reasons: z.array(z.string()).optional()
9143
9143
  }).passthrough()).optional(),
9144
- last_synced_at: z.iso.datetime().optional(),
9145
- next_fetch_at: z.iso.datetime().optional(),
9144
+ last_synced_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
9145
+ next_fetch_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
9146
9146
  changes: z.array(z.string()).optional(),
9147
9147
  errors: z.array(ErrorSchema).optional(),
9148
9148
  warnings: z.array(z.string()).optional()
@@ -9182,7 +9182,7 @@ const EvaluatorSpecSchema = /* @__PURE__ */ (() => z.object({
9182
9182
  evaluator_id: z.string()
9183
9183
  }).passthrough(), z.object({
9184
9184
  agent_url: z.string().regex(new RegExp("^https://")).refine(adcpJsonSchemaUri, "Invalid URI")
9185
- }).passthrough()])))();
9185
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
9186
9186
  const RightsConstraintSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({
9187
9187
  rights_id: z.string(),
9188
9188
  rights_agent: z.object({
@@ -9712,8 +9712,8 @@ const GetPropertyListResponseSchema = /* @__PURE__ */ (() => z.object({
9712
9712
  list: PropertyListSchema,
9713
9713
  identifiers: z.array(IdentifierSchema).optional(),
9714
9714
  pagination: PaginationResponseSchema.optional(),
9715
- resolved_at: z.iso.datetime().optional(),
9716
- cache_valid_until: z.iso.datetime().optional(),
9715
+ resolved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
9716
+ cache_valid_until: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
9717
9717
  coverage_gaps: z.record(z.string(), z.array(IdentifierSchema)).optional(),
9718
9718
  ext: ExtensionObjectSchema.optional()
9719
9719
  }).passthrough())();
@@ -9873,8 +9873,8 @@ const GetCollectionListResponseSchema = /* @__PURE__ */ (() => z.object({
9873
9873
  kind: CollectionKindSchema.optional()
9874
9874
  }).passthrough()).optional(),
9875
9875
  pagination: PaginationResponseSchema.optional(),
9876
- resolved_at: z.iso.datetime().optional(),
9877
- cache_valid_until: z.iso.datetime().optional(),
9876
+ resolved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
9877
+ cache_valid_until: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
9878
9878
  coverage_gaps: z.record(z.string(), z.array(z.object({
9879
9879
  type: DistributionIdentifierTypeSchema,
9880
9880
  value: z.string()
@@ -10116,7 +10116,7 @@ const CreateContentStandardsResponseSchema = /* @__PURE__ */ (() => z.object({
10116
10116
  conflicting_standards_id: z.string().optional(),
10117
10117
  context: ContextObjectSchema.optional(),
10118
10118
  ext: ExtensionObjectSchema.optional()
10119
- }).passthrough()])))();
10119
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
10120
10120
  const UpdateContentStandardsRequestSchema = /* @__PURE__ */ (() => z.object({
10121
10121
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
10122
10122
  adcp_major_version: z.number().int().gte(1).lte(99).optional(),
@@ -10198,7 +10198,7 @@ const CalibrateContentResponseSchema = /* @__PURE__ */ (() => z.object({
10198
10198
  errors: z.array(ErrorSchema),
10199
10199
  context: ContextObjectSchema.optional(),
10200
10200
  ext: ExtensionObjectSchema.optional()
10201
- }).passthrough()])))();
10201
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
10202
10202
  const ValidateContentDeliveryRequestSchema = /* @__PURE__ */ (() => z.object({
10203
10203
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
10204
10204
  adcp_major_version: z.number().int().gte(1).lte(99).optional(),
@@ -10206,7 +10206,7 @@ const ValidateContentDeliveryRequestSchema = /* @__PURE__ */ (() => z.object({
10206
10206
  records: z.array(z.object({
10207
10207
  record_id: z.string(),
10208
10208
  media_buy_id: z.string().optional(),
10209
- timestamp: z.iso.datetime().optional(),
10209
+ timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
10210
10210
  artifact: ArtifactSchema,
10211
10211
  country: z.string().optional(),
10212
10212
  channel: z.string().optional(),
@@ -10257,7 +10257,7 @@ const ValidateContentDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
10257
10257
  errors: z.array(ErrorSchema),
10258
10258
  context: ContextObjectSchema.optional(),
10259
10259
  ext: ExtensionObjectSchema.optional()
10260
- }).passthrough()])))();
10260
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
10261
10261
  const GetMediaBuyArtifactsRequestSchema = /* @__PURE__ */ (() => z.object({
10262
10262
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
10263
10263
  adcp_major_version: z.number().int().gte(1).lte(99).optional(),
@@ -10266,8 +10266,8 @@ const GetMediaBuyArtifactsRequestSchema = /* @__PURE__ */ (() => z.object({
10266
10266
  package_ids: z.array(z.string()).optional(),
10267
10267
  failures_only: z.boolean().optional(),
10268
10268
  time_range: z.object({
10269
- start: z.iso.datetime().optional(),
10270
- end: z.iso.datetime().optional()
10269
+ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
10270
+ end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
10271
10271
  }).passthrough().optional(),
10272
10272
  pagination: z.object({
10273
10273
  max_results: z.int().min(1).max(1e4).optional(),
@@ -10294,7 +10294,7 @@ const GetMediaBuyArtifactsResponseSchema = /* @__PURE__ */ (() => z.object({
10294
10294
  media_buy_id: z.string(),
10295
10295
  artifacts: z.array(z.object({
10296
10296
  record_id: z.string(),
10297
- timestamp: z.iso.datetime().optional(),
10297
+ timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
10298
10298
  package_id: z.string().optional(),
10299
10299
  artifact: ArtifactSchema,
10300
10300
  country: z.string().optional(),
@@ -10318,7 +10318,7 @@ const GetMediaBuyArtifactsResponseSchema = /* @__PURE__ */ (() => z.object({
10318
10318
  errors: z.array(ErrorSchema),
10319
10319
  context: ContextObjectSchema.optional(),
10320
10320
  ext: ExtensionObjectSchema.optional()
10321
- }).passthrough()])))();
10321
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
10322
10322
  const GetCreativeFeaturesSuccessSchema = /* @__PURE__ */ (() => z.object({
10323
10323
  evaluation_id: z.string().min(1).optional(),
10324
10324
  results: z.array(CreativeFeatureResultSchema),
@@ -10369,8 +10369,8 @@ const SyncPlansRequestSchema = /* @__PURE__ */ (() => z.object({
10369
10369
  }).passthrough()).optional()
10370
10370
  }).passthrough().optional(),
10371
10371
  flight: z.object({
10372
- start: z.iso.datetime(),
10373
- end: z.iso.datetime()
10372
+ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
10373
+ end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
10374
10374
  }).passthrough(),
10375
10375
  countries: z.array(z.string()).optional(),
10376
10376
  regions: z.array(z.string()).optional(),
@@ -10391,7 +10391,7 @@ const SyncPlansRequestSchema = /* @__PURE__ */ (() => z.object({
10391
10391
  currency: z.string()
10392
10392
  }).passthrough().optional(),
10393
10393
  markets: z.array(z.string()).optional(),
10394
- expires_at: z.iso.datetime().optional()
10394
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
10395
10395
  }).passthrough()).optional(),
10396
10396
  portfolio: z.object({
10397
10397
  member_plan_ids: z.array(z.string()),
@@ -10486,12 +10486,12 @@ const ReportPlanAdjustmentRequestSchema = /* @__PURE__ */ (() => z.object({
10486
10486
  currency: z.string().regex(/^[A-Z]{3}$/)
10487
10487
  }).passthrough().optional(),
10488
10488
  reason: z.string().min(1).max(1e3).optional(),
10489
- effective_at: z.iso.datetime().optional(),
10489
+ effective_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
10490
10490
  evidence: z.object({
10491
10491
  evidence_id: z.string().min(1).max(255),
10492
10492
  evidence_type: z.union([z.literal("decommitment_agreement"), z.literal("refund_settlement"), z.literal("credit_note"), z.literal("makegood_agreement")]),
10493
10493
  digest: z.string().regex(/^sha256:[a-f0-9]{64}$/),
10494
- issued_at: z.iso.datetime()
10494
+ issued_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
10495
10495
  }).passthrough().optional(),
10496
10496
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
10497
10497
  context: ContextObjectSchema.optional(),
@@ -10586,7 +10586,7 @@ const GetPlanAuditLogsResponseSchema = /* @__PURE__ */ (() => z.object({
10586
10586
  check_id: z.string(),
10587
10587
  reason: z.string(),
10588
10588
  resolution: z.string().optional(),
10589
- resolved_at: z.iso.datetime().optional()
10589
+ resolved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
10590
10590
  }).passthrough()).optional(),
10591
10591
  drift_metrics: z.object({
10592
10592
  escalation_rate: z.number().min(0).max(1).optional(),
@@ -10605,7 +10605,7 @@ const GetPlanAuditLogsResponseSchema = /* @__PURE__ */ (() => z.object({
10605
10605
  entries: z.array(z.object({
10606
10606
  id: z.string(),
10607
10607
  type: z.union([z.literal("check"), z.literal("outcome"), z.literal("adjustment")]),
10608
- timestamp: z.iso.datetime(),
10608
+ timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
10609
10609
  plan_id: z.string().optional(),
10610
10610
  caller: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
10611
10611
  tool: z.string().optional(),
@@ -10630,13 +10630,13 @@ const GetPlanAuditLogsResponseSchema = /* @__PURE__ */ (() => z.object({
10630
10630
  statement_id: z.string(),
10631
10631
  statement_digest: z.string().regex(/^sha256:[a-f0-9]{64}$/),
10632
10632
  sequence: z.int().min(1),
10633
- issued_at: z.iso.datetime(),
10633
+ issued_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
10634
10634
  seller_reference: z.string(),
10635
10635
  cumulative_spend: z.number().min(0),
10636
10636
  currency: z.string().regex(/^[A-Z]{3}$/),
10637
10637
  reporting_period: z.object({
10638
- start: z.iso.datetime(),
10639
- end: z.iso.datetime()
10638
+ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
10639
+ end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
10640
10640
  }).passthrough(),
10641
10641
  canonical_payload: z.object({
10642
10642
  seller_reference: z.string(),
@@ -10654,19 +10654,19 @@ const GetPlanAuditLogsResponseSchema = /* @__PURE__ */ (() => z.object({
10654
10654
  }).passthrough().optional(),
10655
10655
  headroom_restored: z.number().min(0).optional(),
10656
10656
  reason: z.string().optional(),
10657
- effective_at: z.iso.datetime().optional(),
10657
+ effective_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
10658
10658
  committed_budget: z.number().optional(),
10659
10659
  reported_committed_budget: z.number().min(0).optional(),
10660
10660
  seller_reference: z.string().optional(),
10661
10661
  delivery: z.object({
10662
10662
  observation_id: z.string().min(1).max(255).optional(),
10663
10663
  source: z.union([z.literal("seller_statement_copy"), z.literal("buyer_measurement")]).optional(),
10664
- observed_at: z.iso.datetime().optional(),
10664
+ observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
10665
10665
  seller_statement_id: z.string().optional(),
10666
10666
  seller_statement_digest: z.string().regex(/^sha256:[a-f0-9]{64}$/).optional(),
10667
10667
  reporting_period: z.object({
10668
- start: z.iso.datetime(),
10669
- end: z.iso.datetime()
10668
+ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
10669
+ end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
10670
10670
  }).passthrough().optional(),
10671
10671
  cumulative_spend: z.number().min(0).optional(),
10672
10672
  currency: z.string().regex(/^[A-Z]{3}$/).optional(),
@@ -10690,10 +10690,10 @@ const GetPlanAuditLogsResponseSchema = /* @__PURE__ */ (() => z.object({
10690
10690
  evidence_id: z.string(),
10691
10691
  evidence_type: z.union([z.literal("decommitment_agreement"), z.literal("refund_settlement"), z.literal("credit_note"), z.literal("makegood_agreement")]),
10692
10692
  digest: z.string().regex(/^sha256:[a-f0-9]{64}$/),
10693
- issued_at: z.iso.datetime()
10693
+ issued_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
10694
10694
  }).passthrough().optional(),
10695
10695
  reviewed_by: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
10696
- reviewed_at: z.iso.datetime().optional(),
10696
+ reviewed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
10697
10697
  review_reason: z.string().optional()
10698
10698
  }).passthrough()).optional(),
10699
10699
  governed_actions: z.array(z.object({
@@ -10709,8 +10709,8 @@ const GetPlanAuditLogsResponseSchema = /* @__PURE__ */ (() => z.object({
10709
10709
  seller_reported_spend: z.number().min(0).optional(),
10710
10710
  buyer_observed_spend: z.number().min(0).optional(),
10711
10711
  delivery_reporting_period: z.object({
10712
- start: z.iso.datetime(),
10713
- end: z.iso.datetime()
10712
+ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
10713
+ end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
10714
10714
  }).passthrough().optional(),
10715
10715
  conservative_exposure: z.number().min(0).optional(),
10716
10716
  delivery_reconciliation_status: z.union([z.literal("consistent"), z.literal("measurement_variance"), z.literal("disputed"), z.literal("unmatched"), z.literal("closed_unresolved")]).optional(),
@@ -10746,17 +10746,17 @@ const CheckGovernanceResponseSchema = /* @__PURE__ */ (() => z.object({
10746
10746
  reason: z.string()
10747
10747
  }).passthrough()).optional(),
10748
10748
  consultation_context: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]+$/).optional(),
10749
- expires_at: z.iso.datetime().optional(),
10750
- next_check: z.iso.datetime().optional(),
10749
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
10750
+ next_check: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
10751
10751
  delivery_statement: z.object({
10752
10752
  statement_id: z.string(),
10753
10753
  statement_digest: z.string().regex(/^sha256:[a-f0-9]{64}$/),
10754
10754
  sequence: z.int().min(1),
10755
- issued_at: z.iso.datetime(),
10755
+ issued_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
10756
10756
  seller_reference: z.string(),
10757
10757
  reporting_period: z.object({
10758
- start: z.iso.datetime(),
10759
- end: z.iso.datetime()
10758
+ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
10759
+ end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
10760
10760
  }).passthrough(),
10761
10761
  cumulative_spend: z.number().min(0),
10762
10762
  currency: z.string().regex(/^[A-Z]{3}$/),
@@ -10805,13 +10805,13 @@ const SIGetOfferingResponseSchema = /* @__PURE__ */ (() => z.object({
10805
10805
  available: z.boolean(),
10806
10806
  offering_token: z.string().optional(),
10807
10807
  ttl_seconds: z.int().min(0).optional(),
10808
- checked_at: z.iso.datetime().optional(),
10808
+ checked_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
10809
10809
  offering: z.object({
10810
10810
  offering_id: z.string().optional(),
10811
10811
  title: z.string().optional(),
10812
10812
  summary: z.string().optional(),
10813
10813
  tagline: z.string().optional(),
10814
- expires_at: z.iso.datetime().optional(),
10814
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
10815
10815
  availability_status: OfferingAvailabilityStatusSchema.optional(),
10816
10816
  price_hint: z.string().optional(),
10817
10817
  image_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
@@ -10972,7 +10972,7 @@ const SITerminateSessionResponseSchema = /* @__PURE__ */ (() => z.object({
10972
10972
  checkout_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
10973
10973
  checkout_token: z.string().optional(),
10974
10974
  payload: z.object({}).passthrough().optional(),
10975
- expires_at: z.iso.datetime().optional()
10975
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
10976
10976
  }).passthrough().optional(),
10977
10977
  follow_up: z.object({
10978
10978
  action: z.union([z.literal("save_for_later"), z.literal("set_reminder"), z.literal("subscribe_updates"), z.literal("none")]).optional(),
@@ -11133,9 +11133,9 @@ const GetTaskStatusResponseSchema = /* @__PURE__ */ (() => z.object({
11133
11133
  adcp_major_version: z.number().int().gte(1).lte(99).optional(),
11134
11134
  task_type: TaskTypeSchema,
11135
11135
  protocol: AdCPProtocolSchema,
11136
- created_at: z.iso.datetime(),
11137
- updated_at: z.iso.datetime(),
11138
- completed_at: z.iso.datetime().optional(),
11136
+ created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
11137
+ updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
11138
+ completed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11139
11139
  has_webhook: z.boolean().optional(),
11140
11140
  progress: z.object({
11141
11141
  percentage: z.number().min(0).max(100).optional(),
@@ -11153,7 +11153,7 @@ const GetTaskStatusResponseSchema = /* @__PURE__ */ (() => z.object({
11153
11153
  }).passthrough().optional()
11154
11154
  }).passthrough().optional(),
11155
11155
  history: z.array(z.object({
11156
- timestamp: z.iso.datetime(),
11156
+ timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
11157
11157
  type: z.union([z.literal("request"), z.literal("response")]),
11158
11158
  data: z.object({}).passthrough()
11159
11159
  }).passthrough()).optional(),
@@ -11171,10 +11171,10 @@ const ListTasksRequestSchema = /* @__PURE__ */ (() => z.object({
11171
11171
  statuses: z.array(TaskStatusSchema).optional(),
11172
11172
  task_type: TaskTypeSchema.optional(),
11173
11173
  task_types: z.array(TaskTypeSchema).optional(),
11174
- created_after: z.iso.datetime().optional(),
11175
- created_before: z.iso.datetime().optional(),
11176
- updated_after: z.iso.datetime().optional(),
11177
- updated_before: z.iso.datetime().optional(),
11174
+ created_after: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11175
+ created_before: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11176
+ updated_after: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11177
+ updated_before: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11178
11178
  task_ids: z.array(z.string()).max(100).optional(),
11179
11179
  context_contains: z.string().optional(),
11180
11180
  has_webhook: z.boolean().optional()
@@ -11222,9 +11222,9 @@ const ListTasksResponseSchema = /* @__PURE__ */ (() => z.object({
11222
11222
  task_type: TaskTypeSchema,
11223
11223
  domain: z.union([z.literal("media-buy"), z.literal("signals"), z.literal("creative")]),
11224
11224
  status: TaskStatusSchema,
11225
- created_at: z.iso.datetime(),
11226
- updated_at: z.iso.datetime(),
11227
- completed_at: z.iso.datetime().optional(),
11225
+ created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
11226
+ updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
11227
+ completed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11228
11228
  has_webhook: z.boolean().optional()
11229
11229
  }).passthrough()),
11230
11230
  pagination: PaginationResponseSchema,
@@ -11368,15 +11368,15 @@ const ListAccountChangesResponseSchema = /* @__PURE__ */ (() => z.object({
11368
11368
  changes: z.array(AccountChangeSchema).max(100).optional(),
11369
11369
  cursor: z.string().min(1).max(4096).optional(),
11370
11370
  has_more: z.boolean().optional(),
11371
- available_since: z.iso.datetime().optional(),
11372
- generated_at: z.iso.datetime().optional(),
11371
+ available_since: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11372
+ generated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11373
11373
  source_coverage: z.array(z.object({
11374
11374
  source_id: z.string().max(255),
11375
11375
  kind: z.union([z.literal("seller"), z.literal("connected_platform")]),
11376
11376
  status: z.union([z.literal("current"), z.literal("delayed"), z.literal("unavailable"), z.literal("not_configured")]),
11377
- coverage_start: z.iso.datetime().optional(),
11378
- observed_through: z.iso.datetime().optional(),
11379
- last_successful_sync_at: z.iso.datetime().optional(),
11377
+ coverage_start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11378
+ observed_through: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11379
+ last_successful_sync_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11380
11380
  stale_after_seconds: z.int().min(1).max(2592e3).optional(),
11381
11381
  resource_types: z.array(z.string()).max(50)
11382
11382
  }).passthrough()).max(50).optional(),
@@ -11386,15 +11386,15 @@ const ListAccountChangesResponseSchema = /* @__PURE__ */ (() => z.object({
11386
11386
  changes: z.array(AccountChangeSchema).max(100),
11387
11387
  cursor: z.string().min(1).max(4096),
11388
11388
  has_more: z.boolean(),
11389
- available_since: z.iso.datetime(),
11390
- generated_at: z.iso.datetime(),
11389
+ available_since: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
11390
+ generated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
11391
11391
  source_coverage: z.array(z.object({
11392
11392
  source_id: z.string().max(255),
11393
11393
  kind: z.union([z.literal("seller"), z.literal("connected_platform")]),
11394
11394
  status: z.union([z.literal("current"), z.literal("delayed"), z.literal("unavailable"), z.literal("not_configured")]),
11395
- coverage_start: z.iso.datetime().optional(),
11396
- observed_through: z.iso.datetime().optional(),
11397
- last_successful_sync_at: z.iso.datetime().optional(),
11395
+ coverage_start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11396
+ observed_through: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11397
+ last_successful_sync_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11398
11398
  stale_after_seconds: z.int().min(1).max(2592e3).optional(),
11399
11399
  resource_types: z.array(z.string()).max(50)
11400
11400
  }).passthrough()).max(50).optional(),
@@ -11406,15 +11406,15 @@ const ListAccountChangesResponseSchema = /* @__PURE__ */ (() => z.object({
11406
11406
  changes: z.array(AccountChangeSchema).max(100).optional(),
11407
11407
  cursor: z.string().min(1).max(4096).optional(),
11408
11408
  has_more: z.boolean().optional(),
11409
- available_since: z.iso.datetime().optional(),
11410
- generated_at: z.iso.datetime().optional(),
11409
+ available_since: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11410
+ generated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11411
11411
  source_coverage: z.array(z.object({
11412
11412
  source_id: z.string().max(255),
11413
11413
  kind: z.union([z.literal("seller"), z.literal("connected_platform")]),
11414
11414
  status: z.union([z.literal("current"), z.literal("delayed"), z.literal("unavailable"), z.literal("not_configured")]),
11415
- coverage_start: z.iso.datetime().optional(),
11416
- observed_through: z.iso.datetime().optional(),
11417
- last_successful_sync_at: z.iso.datetime().optional(),
11415
+ coverage_start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11416
+ observed_through: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11417
+ last_successful_sync_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11418
11418
  stale_after_seconds: z.int().min(1).max(2592e3).optional(),
11419
11419
  resource_types: z.array(z.string()).max(50)
11420
11420
  }).passthrough()).max(50).optional(),
@@ -11422,7 +11422,7 @@ const ListAccountChangesResponseSchema = /* @__PURE__ */ (() => z.object({
11422
11422
  context: ContextObjectSchema.optional(),
11423
11423
  ext: ExtensionObjectSchema.optional(),
11424
11424
  status: z.literal("failed")
11425
- }).passthrough()])))();
11425
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
11426
11426
  const ListAccountsRequestSchema = /* @__PURE__ */ (() => z.object({
11427
11427
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
11428
11428
  adcp_major_version: z.number().int().gte(1).lte(99).optional(),
@@ -11503,7 +11503,7 @@ const ReportUsageRequestSchema = /* @__PURE__ */ (() => z.object({
11503
11503
  build_variant_id: z.string().optional(),
11504
11504
  property_list_id: z.string().optional(),
11505
11505
  final: z.boolean().optional(),
11506
- finalized_at: z.iso.datetime().optional(),
11506
+ finalized_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11507
11507
  measurement_window: z.string().max(50).optional()
11508
11508
  }).passthrough()),
11509
11509
  context: ContextObjectSchema.optional(),
@@ -11701,7 +11701,7 @@ const RawAttestationSchema = /* @__PURE__ */ (() => z.object({
11701
11701
  purpose: z.union([z.literal("platform_primary"), z.literal("measurement"), z.literal("attribution"), z.literal("creative_serving"), z.literal("identity"), z.literal("other")]).optional(),
11702
11702
  payload: z.object({}).passthrough(),
11703
11703
  payload_length: z.int().min(0),
11704
- timestamp: z.iso.datetime(),
11704
+ timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
11705
11705
  status_code: z.int().min(100).max(599).optional()
11706
11706
  }).passthrough())();
11707
11707
  const DigestAttestationSchema = /* @__PURE__ */ (() => z.object({
@@ -11719,7 +11719,7 @@ const DigestAttestationSchema = /* @__PURE__ */ (() => z.object({
11719
11719
  identifier_value_sha256: z.string().regex(/^[a-f0-9]{64}$/),
11720
11720
  found: z.boolean()
11721
11721
  }).passthrough()).max(64).optional(),
11722
- timestamp: z.iso.datetime(),
11722
+ timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
11723
11723
  status_code: z.int().min(100).max(599).optional()
11724
11724
  }).passthrough())();
11725
11725
  const IndividualImageAssetSchema = /* @__PURE__ */ (() => BaseIndividualAssetSchema.merge(z.object({
@@ -11768,7 +11768,7 @@ const BudgetChangeConstraintsSchema = /* @__PURE__ */ (() => z.object({
11768
11768
  min_result_amount: MoneySchema
11769
11769
  }).passthrough(), z.object({
11770
11770
  max_result_amount: MoneySchema
11771
- }).passthrough()])))();
11771
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
11772
11772
  const MediaBuyChangeTermConstraintsSchema = /* @__PURE__ */ (() => z.union([BudgetChangeConstraintsSchema, FlightChangeConstraintsSchema, PackageCountConstraintsSchema, EffectiveTimingConstraintsSchema]))();
11773
11773
  const ReportingFileTransferSchema = /* @__PURE__ */ (() => z.object({
11774
11774
  pattern: z.literal("file_transfer"),
@@ -11786,7 +11786,7 @@ const DisplayTagAssetSchema = /* @__PURE__ */ (() => z.object({
11786
11786
  asset_type: z.literal("display_tag"),
11787
11787
  macro_declarations: z.array(MacroDeclarationSchema).optional(),
11788
11788
  provenance: ProvenanceSchema.optional()
11789
- }).passthrough().and(z.union([TagURLSchema, InlineMarkupSchema, PairedRedirectSchema])))();
11789
+ }).passthrough().and(z.union([TagURLSchema, InlineMarkupSchema, PairedRedirectSchema]).describe("Must also satisfy at least one of these alternatives.")))();
11790
11790
  const DAASTAssetSchema = /* @__PURE__ */ (() => z.object({
11791
11791
  asset_type: z.literal("daast"),
11792
11792
  daast_version: DAASTVersionSchema.optional(),
@@ -11812,7 +11812,7 @@ const DAASTAssetSchema = /* @__PURE__ */ (() => z.object({
11812
11812
  field: z.literal("content").optional()
11813
11813
  }).passthrough().optional()
11814
11814
  }).passthrough()).optional()
11815
- }).passthrough()])))();
11815
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
11816
11816
  const CardAssetSchema = /* @__PURE__ */ (() => z.object({
11817
11817
  asset_type: z.literal("card"),
11818
11818
  media: z.union([ImageAssetSchema, VideoAssetSchema]),
@@ -11907,8 +11907,8 @@ const ProductFormatDeclarationSchema = /* @__PURE__ */ (() => z.object({}).passt
11907
11907
  format_shape: z.string().optional(),
11908
11908
  v1_format_ref: z.array(FormatReferenceStructuredObjectSchema).optional(),
11909
11909
  format_schema: PlatformExtensionReferenceSchema.optional()
11910
- }).passthrough()).and(z.union([ImageFormatDeclarationSchema, HTML5FormatDeclarationSchema, DisplayTagFormatDeclarationSchema, ImageCarouselFormatDeclarationSchema, HostedVideoFormatDeclarationSchema, VASTVideoFormatDeclarationSchema, HostedAudioFormatDeclarationSchema, VASTAudioFormatDeclarationSchema, DAASTAudioFormatDeclarationSchema, SponsoredPlacementFormatDeclarationSchema, NativeInFeedFormatDeclarationSchema, ResponsiveCreativeFormatDeclarationSchema, AgentPlacementFormatDeclarationSchema, SellerRenderedStatefulDisplayFormatDeclarationSchema, CoordinatedPlacementsFormatDeclarationSchema, CustomFormatDeclarationSchema])))();
11911
- const PlacementSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({}).passthrough()).merge(z.object({}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
11910
+ }).passthrough()).describe("Common constraints for every product format.").and(z.union([ImageFormatDeclarationSchema, HTML5FormatDeclarationSchema, DisplayTagFormatDeclarationSchema, ImageCarouselFormatDeclarationSchema, HostedVideoFormatDeclarationSchema, VASTVideoFormatDeclarationSchema, HostedAudioFormatDeclarationSchema, VASTAudioFormatDeclarationSchema, DAASTAudioFormatDeclarationSchema, SponsoredPlacementFormatDeclarationSchema, NativeInFeedFormatDeclarationSchema, ResponsiveCreativeFormatDeclarationSchema, AgentPlacementFormatDeclarationSchema, SellerRenderedStatefulDisplayFormatDeclarationSchema, CoordinatedPlacementsFormatDeclarationSchema, CustomFormatDeclarationSchema]).describe("Must also satisfy at least one of these alternatives.")))();
11911
+ const PlacementSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({}).passthrough()).merge(z.object({}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
11912
11912
  kind: z.union([z.literal("publisher_ref"), z.literal("seller_inline")]),
11913
11913
  placement_id: z.string(),
11914
11914
  publisher_domain: z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).optional(),
@@ -12087,7 +12087,7 @@ const GetCreativeFeaturesResponseSchema = /* @__PURE__ */ (() => z.object({
12087
12087
  payload: z.object({}).passthrough().optional(),
12088
12088
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
12089
12089
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
12090
- }).passthrough().and(z.union([GetCreativeFeaturesSuccessSchema, GetCreativeFeaturesErrorSchema, GetCreativeFeaturesSubmittedSchema])))();
12090
+ }).passthrough().and(z.union([GetCreativeFeaturesSuccessSchema, GetCreativeFeaturesErrorSchema, GetCreativeFeaturesSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
12091
12091
  const SyncCatalogsResponseSchema = /* @__PURE__ */ (() => z.object({
12092
12092
  context_id: z.string().optional(),
12093
12093
  context: ContextObjectSchema.optional(),
@@ -12102,7 +12102,7 @@ const SyncCatalogsResponseSchema = /* @__PURE__ */ (() => z.object({
12102
12102
  payload: z.object({}).passthrough().optional(),
12103
12103
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
12104
12104
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
12105
- }).passthrough().and(z.union([SyncCatalogsSuccessSchema, SyncCatalogsErrorSchema, SyncCatalogsSubmittedSchema])))();
12105
+ }).passthrough().and(z.union([SyncCatalogsSuccessSchema, SyncCatalogsErrorSchema, SyncCatalogsSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
12106
12106
  const ProductSchema = /* @__PURE__ */ (() => z.object({
12107
12107
  product_id: z.string(),
12108
12108
  name: z.string(),
@@ -12281,7 +12281,7 @@ const CanonicalProductPlacementSchema = /* @__PURE__ */ (() => z.object({
12281
12281
  kind: z.literal("publisher_ref")
12282
12282
  }).passthrough(), z.object({
12283
12283
  kind: z.literal("seller_inline")
12284
- }).passthrough()])))();
12284
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
12285
12285
  const TargetingOverlaySupport1Schema = /* @__PURE__ */ (() => TargetingOverlaySupportSchema)();
12286
12286
  const CanonicalProductActionSchema = /* @__PURE__ */ (() => z.object({
12287
12287
  action: CanonicalMediaBuyActionNameSchema,
@@ -12293,7 +12293,7 @@ const CanonicalProductActionSchema = /* @__PURE__ */ (() => z.object({
12293
12293
  }).passthrough())();
12294
12294
  const AssetVariantSchema = /* @__PURE__ */ (() => z.union([ImageAssetSchema, VideoAssetSchema, AudioAssetSchema, VASTAssetSchema, DisplayTagAssetSchema, TextAssetSchema, URLAssetSchema, HTMLAssetSchema, JavaScriptAssetSchema, ZipAssetSchema, WebhookAssetSchema, CSSAssetSchema, DAASTAssetSchema, MarkdownAssetSchema, BriefAssetSchema, CatalogAssetSchema, PublishedPostAssetSchema, CardAssetSchema, PixelTrackerAssetSchema, VASTTrackerAssetSchema, DAASTTrackerAssetSchema]))();
12295
12295
  const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
12296
- const objectSchema = z.object({ "geo_countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_countries_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Exclude specific countries from delivery. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_regions": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Restrict delivery to exact canonical ISO 3166-2 subdivisions (states, provinces, regions, departments, or other subdivision categories). Unknown identifiers are invalid. At create or update, sellers MUST reject unsupported identifiers and MUST NOT silently widen, drop, or partially apply the list. During get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome. Exact internal translation preserves accepted identifiers in package readback.").optional(), "geo_regions_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Exclude exact canonical ISO 3166-2 subdivisions. Support is independent from geo_regions inclusion support. Unknown identifiers and values also present in geo_regions are invalid. At create or update, sellers MUST reject unsupported identifiers and partial application; during get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome.").optional(), "geo_metros": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict().describe("A targeted metro area.")).min(1).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_metros_exclude": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes to exclude within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict()).min(1).describe("Exclude specific metro areas from delivery. Each entry specifies the classification system and excluded values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })])).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Restrict delivery to specific postal areas. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas_exclude": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })])).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Exclude specific postal areas from delivery. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_places": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))])).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Restrict delivery to catalog-backed named places. Values MUST be stable identifiers in the declared system, not display names. Sellers must declare supported systems, countries, and place types in get_adcp_capabilities and reject unsupported entries rather than silently dropping them.").optional(), "geo_places_exclude": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))])).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Exclude catalog-backed named places. Uses the same identifier-based shape as geo_places. Sellers MUST reject overlap with geo_places for the same country, system, place_type, and value.").optional(), "daypart_targets": z.array(z.object({ "days": z.array(z.enum(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]).describe("Days of the week for daypart targeting")).min(1).describe("Days of week this window applies to. Use multiple days for compact targeting (e.g., monday-friday in one object)."), "start_hour": z.number().int().gte(0).lte(23).describe("Start hour (inclusive), 0-23 in 24-hour format. 0 = midnight, 6 = 6:00am, 18 = 6:00pm."), "end_hour": z.number().int().gte(1).lte(24).describe("End hour (exclusive), 1-24 in 24-hour format. 10 = 10:00am, 24 = midnight. Must be greater than start_hour."), "timezone": z.union([z.literal("inventory_local"), z.any().refine((value) => !z.literal("inventory_local").safeParse(value).success, "Invalid input: Should NOT be valid against schema").describe("Concrete timezone identifier in the implementation's supported IANA Time Zone Database, such as America/New_York, CET, or UTC.")]).describe("Civil-time clock used to evaluate this window. 'inventory_local' evaluates the hours in the seller-assigned local timezone of each inventory unit that can deliver the impression, such as a screen, venue, station, or publisher property; it never means the buyer, account, or server timezone. A concrete IANA timezone identifier (for example, 'America/New_York', 'CET', or 'UTC') evaluates one shared civil-time clock across the targeted inventory. Omission defaults to 'inventory_local'. Buyers that begin with a user or account preference MUST resolve it to a concrete IANA identifier before sending the daypart; 'user_timezone' and 'account_timezone' are not wire values. For each candidate delivery instant, convert the instant into this clock and compare its resulting local day and hour with the half-open window: a skipped DST hour has no matching instants, while both occurrences of a repeated hour match. This delivery clock is independent of reporting_capabilities.timezone.").default("inventory_local"), "label": z.string().describe("Optional human-readable name for this time window (e.g., 'Morning Drive', 'Prime Time')").optional() }).strict().describe("A time window for daypart targeting. Specifies days of week, an hour range, and the civil-time clock used to evaluate it. start_hour is inclusive, end_hour is exclusive (e.g., 6-10 = 6:00am to 10:00am). Follows the Google Ads AdScheduleInfo / DV360 DayPartTargeting pattern.")).min(1).describe("Restrict delivery to specific time windows. Each entry specifies days of week, an hour range, and an optional timezone that defaults to inventory_local. A concrete IANA zone uses one shared civil-time clock, while inventory_local evaluates each inventory unit in its seller-assigned local timezone. Entries are independent and MAY use different clocks.").optional(), "axe_include_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to include for targeting.").optional(), "axe_exclude_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to exclude from targeting.").optional(), "audience_include": z.array(z.string()).min(1).describe("Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities.").optional(), "audience_exclude": z.array(z.string()).min(1).describe("Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities.").optional(), "signal_targeting_groups": z.object({ "operator": z.literal("all").describe("Groups-level operator. Required even though v1 only supports 'all': every child group must be satisfied."), "groups": z.array(z.object({ "operator": z.enum(["any", "none"]).describe("How to evaluate the signals in this group. 'any' is an OR include group. 'none' is an exclusion group equivalent to NOT (A OR B OR C)."), "signals": z.array(z.object({ "pricing_option_id": z.string().describe("Pricing option selected for this signal. Use the pricing_option_id from the product's signal_targeting_options entry when product-scoped pricing is present; otherwise use the seller get_signals pricing only when the product option does not override it. Required when the selected signal has pricing_options; omit only when the signal is bundled into the product price or has no incremental cost.").optional(), "signal_agent_segment_id": z.string().describe("Optional opaque resolved-segment or seller execution handle for this signal. Omit when signal_ref plus the value expression is sufficient for the seller to resolve the signal. Include when the product option exposes a separate runtime or activation handle, and pass it verbatim. Buyers SHOULD prefer an exposed segment handle over reconstructing condition identity from categorical values because the handle can carry provider namespace and methodology distinctions.").optional(), "activation_key": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
12296
+ const objectSchema = z.object({ "geo_countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_countries_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Exclude specific countries from delivery. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_regions": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Restrict delivery to exact canonical ISO 3166-2 subdivisions (states, provinces, regions, departments, or other subdivision categories). Unknown identifiers are invalid. At create or update, sellers MUST reject unsupported identifiers and MUST NOT silently widen, drop, or partially apply the list. During get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome. Exact internal translation preserves accepted identifiers in package readback.").optional(), "geo_regions_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Exclude exact canonical ISO 3166-2 subdivisions. Support is independent from geo_regions inclusion support. Unknown identifiers and values also present in geo_regions are invalid. At create or update, sellers MUST reject unsupported identifiers and partial application; during get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome.").optional(), "geo_metros": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict().describe("A targeted metro area.")).min(1).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_metros_exclude": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes to exclude within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict()).min(1).describe("Exclude specific metro areas from delivery. Each entry specifies the classification system and excluded values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })]).describe("Must also satisfy at least one of these alternatives.")).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Restrict delivery to specific postal areas. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas_exclude": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })]).describe("Must also satisfy at least one of these alternatives.")).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Exclude specific postal areas from delivery. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_places": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Restrict delivery to catalog-backed named places. Values MUST be stable identifiers in the declared system, not display names. Sellers must declare supported systems, countries, and place types in get_adcp_capabilities and reject unsupported entries rather than silently dropping them.").optional(), "geo_places_exclude": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Exclude catalog-backed named places. Uses the same identifier-based shape as geo_places. Sellers MUST reject overlap with geo_places for the same country, system, place_type, and value.").optional(), "daypart_targets": z.array(z.object({ "days": z.array(z.enum(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]).describe("Days of the week for daypart targeting")).min(1).describe("Days of week this window applies to. Use multiple days for compact targeting (e.g., monday-friday in one object)."), "start_hour": z.number().int().gte(0).lte(23).describe("Start hour (inclusive), 0-23 in 24-hour format. 0 = midnight, 6 = 6:00am, 18 = 6:00pm."), "end_hour": z.number().int().gte(1).lte(24).describe("End hour (exclusive), 1-24 in 24-hour format. 10 = 10:00am, 24 = midnight. Must be greater than start_hour."), "timezone": z.union([z.literal("inventory_local"), z.any().refine((value) => !z.literal("inventory_local").safeParse(value).success, "Invalid input: Should NOT be valid against schema").describe("Concrete timezone identifier in the implementation's supported IANA Time Zone Database, such as America/New_York, CET, or UTC.")]).describe("Civil-time clock used to evaluate this window. 'inventory_local' evaluates the hours in the seller-assigned local timezone of each inventory unit that can deliver the impression, such as a screen, venue, station, or publisher property; it never means the buyer, account, or server timezone. A concrete IANA timezone identifier (for example, 'America/New_York', 'CET', or 'UTC') evaluates one shared civil-time clock across the targeted inventory. Omission defaults to 'inventory_local'. Buyers that begin with a user or account preference MUST resolve it to a concrete IANA identifier before sending the daypart; 'user_timezone' and 'account_timezone' are not wire values. For each candidate delivery instant, convert the instant into this clock and compare its resulting local day and hour with the half-open window: a skipped DST hour has no matching instants, while both occurrences of a repeated hour match. This delivery clock is independent of reporting_capabilities.timezone.").default("inventory_local"), "label": z.string().describe("Optional human-readable name for this time window (e.g., 'Morning Drive', 'Prime Time')").optional() }).strict().describe("A time window for daypart targeting. Specifies days of week, an hour range, and the civil-time clock used to evaluate it. start_hour is inclusive, end_hour is exclusive (e.g., 6-10 = 6:00am to 10:00am). Follows the Google Ads AdScheduleInfo / DV360 DayPartTargeting pattern.")).min(1).describe("Restrict delivery to specific time windows. Each entry specifies days of week, an hour range, and an optional timezone that defaults to inventory_local. A concrete IANA zone uses one shared civil-time clock, while inventory_local evaluates each inventory unit in its seller-assigned local timezone. Entries are independent and MAY use different clocks.").optional(), "axe_include_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to include for targeting.").optional(), "axe_exclude_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to exclude from targeting.").optional(), "audience_include": z.array(z.string()).min(1).describe("Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities.").optional(), "audience_exclude": z.array(z.string()).min(1).describe("Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities.").optional(), "signal_targeting_groups": z.object({ "operator": z.literal("all").describe("Groups-level operator. Required even though v1 only supports 'all': every child group must be satisfied."), "groups": z.array(z.object({ "operator": z.enum(["any", "none"]).describe("How to evaluate the signals in this group. 'any' is an OR include group. 'none' is an exclusion group equivalent to NOT (A OR B OR C)."), "signals": z.array(z.object({ "pricing_option_id": z.string().describe("Pricing option selected for this signal. Use the pricing_option_id from the product's signal_targeting_options entry when product-scoped pricing is present; otherwise use the seller get_signals pricing only when the product option does not override it. Required when the selected signal has pricing_options; omit only when the signal is bundled into the product price or has no incremental cost.").optional(), "signal_agent_segment_id": z.string().describe("Optional opaque resolved-segment or seller execution handle for this signal. Omit when signal_ref plus the value expression is sufficient for the seller to resolve the signal. Include when the product option exposes a separate runtime or activation handle, and pass it verbatim. Buyers SHOULD prefer an exposed segment handle over reconstructing condition identity from categorical values because the handle can carry provider namespace and methodology distinctions.").optional(), "activation_key": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
12297
12297
  const schemas = [z.object({ "type": z.literal("segment_id").describe("Segment ID based targeting"), "segment_id": z.string().describe("The platform-specific segment identifier to use in campaign targeting") }).catchall(z.any()), z.object({ "type": z.literal("key_value").describe("Key-value pair based targeting"), "key": z.string().describe("The targeting parameter key"), "value": z.string().describe("The targeting parameter value") }).catchall(z.any())];
12298
12298
  const { errors, failed } = schemas.reduce(
12299
12299
  ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
@@ -12394,7 +12394,7 @@ const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
12394
12394
  message: "Invalid input: Should pass single schema. Passed " + passed2
12395
12395
  });
12396
12396
  }
12397
- }).describe("Named signal being targeted."), "value_type": z.literal("numeric").describe("Discriminator for numeric signals."), "min_value": z.number().describe("Minimum value, inclusive. Omit for no minimum. Should be within the signal definition's range when declared.").optional(), "max_value": z.number().describe("Maximum value, inclusive. Omit for no maximum. Should be within the signal definition's range when declared.").optional() }).catchall(z.any()).and(z.union([z.object({ "min_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Numeric signal expression - target users within a value range. At least one of min_value or max_value is required. If both min_value and max_value are provided, min_value MUST be <= max_value.")];
12397
+ }).describe("Named signal being targeted."), "value_type": z.literal("numeric").describe("Discriminator for numeric signals."), "min_value": z.number().describe("Minimum value, inclusive. Omit for no minimum. Should be within the signal definition's range when declared.").optional(), "max_value": z.number().describe("Maximum value, inclusive. Omit for no maximum. Should be within the signal definition's range when declared.").optional() }).catchall(z.any()).and(z.union([z.object({ "min_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Numeric signal expression - target users within a value range. At least one of min_value or max_value is required. If both min_value and max_value are provided, min_value MUST be <= max_value.")];
12398
12398
  const { errors, failed } = schemas.reduce(
12399
12399
  ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
12400
12400
  errors: [...errors2, ...result.error.issues],
@@ -12469,7 +12469,7 @@ const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
12469
12469
  message: "Invalid input: Should pass single schema. Passed " + passed2
12470
12470
  });
12471
12471
  }
12472
- }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("binary").describe("Discriminator for binary signals"), "value": z.boolean().describe("Whether to include (true) or exclude (false) users matching this signal") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Binary signal targeting - user either matches or doesn't"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
12472
+ }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("binary").describe("Discriminator for binary signals"), "value": z.boolean().describe("Whether to include (true) or exclude (false) users matching this signal") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Binary signal targeting - user either matches or doesn't"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
12473
12473
  const schemas2 = [z.object({ "scope": z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Product-local signal identifier. For local signals exposed on both get_signals and get_products, this MUST match get_signals.signals[].signal_ref.signal_id for the same signal.") }).catchall(z.any()).describe("Product-scoped signal. The signal_id is meaningful only within the selected product/package context and MUST match a Product.included_signals[].signal_ref.signal_id or Product.signal_targeting_options[].signal_ref.signal_id for that product, depending on whether the signal is descriptive or selectable."), z.object({ "scope": z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that publishes the signal definition in its adagents.json signals[]."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(z.any()).describe("Data-provider-scoped signal. The signal_id resolves through the data provider's published adagents.json signals[] and can be authorization-verified there."), z.object({ "scope": z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(z.any()).describe("Signal-source-scoped signal. Use this for source-native signals that are not published in upstream adagents.json signals[]. The buyer trusts the issuing signal source for this identity; use scope 'data_provider' instead when the signal is published in adagents.json signals[], even if the publisher is also the seller or signal source.")];
12474
12474
  const { errors: errors2, failed: failed2 } = schemas2.reduce(
12475
12475
  ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
@@ -12519,7 +12519,7 @@ const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
12519
12519
  message: "Invalid input: Should pass single schema. Passed " + passed2
12520
12520
  });
12521
12521
  }
12522
- }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("categorical").describe("Discriminator for categorical signals"), "values": z.array(z.string()).min(1).describe("Values to target. Users with any of these values will be included.") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Categorical signal targeting - target users with specific values"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
12522
+ }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("categorical").describe("Discriminator for categorical signals"), "values": z.array(z.string()).min(1).describe("Values to target. Users with any of these values will be included.") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Categorical signal targeting - target users with specific values"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
12523
12523
  const schemas2 = [z.object({ "scope": z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Product-local signal identifier. For local signals exposed on both get_signals and get_products, this MUST match get_signals.signals[].signal_ref.signal_id for the same signal.") }).catchall(z.any()).describe("Product-scoped signal. The signal_id is meaningful only within the selected product/package context and MUST match a Product.included_signals[].signal_ref.signal_id or Product.signal_targeting_options[].signal_ref.signal_id for that product, depending on whether the signal is descriptive or selectable."), z.object({ "scope": z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that publishes the signal definition in its adagents.json signals[]."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(z.any()).describe("Data-provider-scoped signal. The signal_id resolves through the data provider's published adagents.json signals[] and can be authorization-verified there."), z.object({ "scope": z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(z.any()).describe("Signal-source-scoped signal. Use this for source-native signals that are not published in upstream adagents.json signals[]. The buyer trusts the issuing signal source for this identity; use scope 'data_provider' instead when the signal is published in adagents.json signals[], even if the publisher is also the seller or signal source.")];
12524
12524
  const { errors: errors2, failed: failed2 } = schemas2.reduce(
12525
12525
  ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
@@ -12569,7 +12569,7 @@ const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
12569
12569
  message: "Invalid input: Should pass single schema. Passed " + passed2
12570
12570
  });
12571
12571
  }
12572
- }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("numeric").describe("Discriminator for numeric signals"), "min_value": z.number().describe("Minimum value (inclusive). Omit for no minimum. Must be <= max_value when both are provided. Should be >= signal's range.min if defined.").optional(), "max_value": z.number().describe("Maximum value (inclusive). Omit for no maximum. Must be >= min_value when both are provided. Should be <= signal's range.max if defined.").optional() }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Numeric signal targeting - target users within a value range. If min_value is provided, it must be <= max_value. Values should be within the signal's defined range (see signal definition).")];
12572
+ }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("numeric").describe("Discriminator for numeric signals"), "min_value": z.number().describe("Minimum value (inclusive). Omit for no minimum. Must be <= max_value when both are provided. Should be >= signal's range.min if defined.").optional(), "max_value": z.number().describe("Maximum value (inclusive). Omit for no maximum. Must be >= min_value when both are provided. Should be <= signal's range.max if defined.").optional() }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Numeric signal targeting - target users within a value range. If min_value is provided, it must be <= max_value. Values should be within the signal's defined range (see signal definition).")];
12573
12573
  const { errors, failed } = schemas.reduce(
12574
12574
  ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
12575
12575
  errors: [...errors2, ...result.error.issues],
@@ -12593,7 +12593,7 @@ const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
12593
12593
  message: "Invalid input: Should pass single schema. Passed " + passed
12594
12594
  });
12595
12595
  }
12596
- }).describe("Targeting constraint for a specific signal. Uses value_type as discriminator to determine the targeting expression format.")).min(1).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.").optional(), "demographics": z.object({ "age": z.intersection(z.object({ "min": z.number().int().gte(0).lte(150).describe("Inclusive minimum age in completed years. Omit for an open lower bound.").optional(), "max": z.number().int().gte(0).lte(150).describe("Inclusive maximum age in completed years. Omit for an open upper bound.").optional(), "include_unknown": z.boolean().describe("Whether delivery to people whose age is unavailable is part of this predicate. This field has no default and MUST be supplied.") }).catchall(z.any()).and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A canonical audience-age predicate in completed integer years. min and max are inclusive; omitting one bound means no restriction in that direction. At least one bound is required. include_unknown is always explicit because people whose age is unavailable are not members of any numeric interval. Implementations MUST reject min greater than max; JSON Schema draft-07 cannot compare sibling numeric values."), z.object({ "accepted_bases": z.array(z.enum(["verified", "declared", "inferred"]).describe("User-level bases that may resolve age for demographic targeting execution. Population estimates are deliberately absent because aggregate composition cannot establish an individual impression's age.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("User-level age determination bases the buyer permits for this predicate. Sellers MUST use only these bases or reject the request; they MUST NOT silently fall back to another basis. When omitted, the buyer imposes no determination-basis constraint beyond product capability and any age_restriction. population_estimate is structurally unavailable because aggregate evidence cannot identify an eligible user.").optional(), "accepted_verification_methods": z.array(z.enum(["facial_age_estimation", "id_document", "digital_id", "credit_card", "world_id"]).describe("Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Verification methods acceptable when verified is an accepted basis. This field narrows verified demographic execution; age_restriction.accepted_methods independently governs legal eligibility and the two sets are intersected when both are present.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "accepted_verification_methods": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "accepted_verification_methods": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "accepted_bases": z.any().refine((value) => !z.array(z.any().refine((value2) => !z.literal("verified").safeParse(value2).success, "Invalid input: Should NOT be valid against schema")).safeParse(value).success, "Invalid input: Should NOT be valid against schema") }))]))) }).catchall(z.any()).describe("Canonical demographic audience targeting intent with optional constraints on how age may be determined. This is distinct from age_restriction: demographics selects an audience, while age_restriction expresses a legal eligibility or verification floor. Fresh create/update targeting MUST compile exactly or be rejected. During get_products, a seller may offer a different configured predicate only through sparse targeting_resolution modifications on a distinguishable product_id; selecting that product accepts the alternative. Sellers never silently broaden, narrow, default, drop, or substitute the basis.").optional(), "frequency_cap": z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2.").optional(), "property_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list for targeting specific properties within this product. The package runs on the intersection of the product's publisher_properties and this list. Sellers SHOULD return a validation error if the product has property_targeting_allowed: false.").optional(), "property_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list whose properties must not carry the buyer's ads. Matched properties are removed from delivery. Use for brand-safety do-not-run lists (apps, sites). Exclude wins on overlap with property_list, and applies regardless of the product's property_targeting_allowed flag. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for including specific collections (programs, publications, channels) within this product. The package runs on the intersection of matched collections and this list. Use for inclusion-based collection targeting. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for excluding specific collections (programs, publications, channels) from this product. Matched collections must not carry the buyer's ads. Use for brand safety do-not-air lists. Seller must declare support in get_adcp_capabilities.").optional(), "placement_selection": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
12596
+ }).describe("Targeting constraint for a specific signal. Uses value_type as discriminator to determine the targeting expression format.")).min(1).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.").optional(), "demographics": z.object({ "age": z.intersection(z.object({ "min": z.number().int().gte(0).lte(150).describe("Inclusive minimum age in completed years. Omit for an open lower bound.").optional(), "max": z.number().int().gte(0).lte(150).describe("Inclusive maximum age in completed years. Omit for an open upper bound.").optional(), "include_unknown": z.boolean().describe("Whether delivery to people whose age is unavailable is part of this predicate. This field has no default and MUST be supplied.") }).catchall(z.any()).and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A canonical audience-age predicate in completed integer years. min and max are inclusive; omitting one bound means no restriction in that direction. At least one bound is required. include_unknown is always explicit because people whose age is unavailable are not members of any numeric interval. Implementations MUST reject min greater than max; JSON Schema draft-07 cannot compare sibling numeric values."), z.object({ "accepted_bases": z.array(z.enum(["verified", "declared", "inferred"]).describe("User-level bases that may resolve age for demographic targeting execution. Population estimates are deliberately absent because aggregate composition cannot establish an individual impression's age.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("User-level age determination bases the buyer permits for this predicate. Sellers MUST use only these bases or reject the request; they MUST NOT silently fall back to another basis. When omitted, the buyer imposes no determination-basis constraint beyond product capability and any age_restriction. population_estimate is structurally unavailable because aggregate evidence cannot identify an eligible user.").optional(), "accepted_verification_methods": z.array(z.enum(["facial_age_estimation", "id_document", "digital_id", "credit_card", "world_id"]).describe("Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Verification methods acceptable when verified is an accepted basis. This field narrows verified demographic execution; age_restriction.accepted_methods independently governs legal eligibility and the two sets are intersected when both are present.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "accepted_verification_methods": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "accepted_verification_methods": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "accepted_bases": z.any().refine((value) => !z.array(z.any().refine((value2) => !z.literal("verified").safeParse(value2).success, "Invalid input: Should NOT be valid against schema")).safeParse(value).success, "Invalid input: Should NOT be valid against schema") }))]).describe("Must also satisfy at least one of these alternatives."))) }).catchall(z.any()).describe("Canonical demographic audience targeting intent with optional constraints on how age may be determined. This is distinct from age_restriction: demographics selects an audience, while age_restriction expresses a legal eligibility or verification floor. Fresh create/update targeting MUST compile exactly or be rejected. During get_products, a seller may offer a different configured predicate only through sparse targeting_resolution modifications on a distinguishable product_id; selecting that product accepts the alternative. Sellers never silently broaden, narrow, default, drop, or substitute the basis.").optional(), "frequency_cap": z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2.").optional(), "property_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list for targeting specific properties within this product. The package runs on the intersection of the product's publisher_properties and this list. Sellers SHOULD return a validation error if the product has property_targeting_allowed: false.").optional(), "property_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list whose properties must not carry the buyer's ads. Matched properties are removed from delivery. Use for brand-safety do-not-run lists (apps, sites). Exclude wins on overlap with property_list, and applies regardless of the product's property_targeting_allowed flag. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for including specific collections (programs, publications, channels) within this product. The package runs on the intersection of matched collections and this list. Use for inclusion-based collection targeting. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for excluding specific collections (programs, publications, channels) from this product. Matched collections must not carry the buyer's ads. Use for brand safety do-not-air lists. Seller must declare support in get_adcp_capabilities.").optional(), "placement_selection": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
12597
12597
  const schemas = [z.object({ "mode": z.literal("selected"), "placement_refs": z.array(z.union([z.intersection(z.object({ "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring a publisher-catalog placement is hosted, or the inventory publisher associated with an inline placement. Omitted only for legacy single-publisher product-context references.").optional(), "placement_id": z.string().describe("Placement ID from the publisher's adagents.json placement catalog, or an inline seller-defined placement ID interpreted within the enclosing seller and product context.") }).catchall(z.any()).describe("Legacy-compatible product-context reference to a placement. For publisher-catalog placements, publisher_domain plus placement_id resolves the declaration in that publisher's adagents.json. For seller-inline placements, the enclosing seller and product supply scope. When publisher_domain is omitted on legacy inputs, receivers MAY interpret the ID relative to the enclosing single-publisher product. Use placement-identity.json when a self-contained cross-document identity is required."), z.object({ "publisher_domain": z.any().refine((value) => value !== void 0, "Required") }).passthrough()), z.any().superRefine((x2, ctx2) => {
12598
12598
  const schemas2 = [z.object({ "kind": z.literal("publisher_ref"), "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain whose adagents.json declares placement_id."), "placement_id": z.string().min(1) }).strict(), z.object({ "kind": z.literal("seller_inline"), "seller_agent": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("The seller agent's API endpoint URL as declared in the property publisher's adagents.json `authorized_agents[].url`. MUST use the `https://` scheme. Receivers compare this URL against the `authorized_agents` list using the AdCP URL canonicalization rules \u2014 not byte-equality \u2014 and reject mismatches with `seller_not_authorized`. See docs/reference/url-canonicalization."), "id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).min(1).describe("Reserved for a future registry-assigned stable seller identifier. Not used today \u2014 senders MUST NOT populate this field until a registry is defined. When a future release populates both `agent_url` and `id`, `agent_url` remains authoritative and `id` is advisory.").optional() }).strict().describe("Sales agent that defines and maintains the inline placement namespace."), "placement_id": z.string().min(1).describe("Stable placement ID within the defining sales agent's namespace. The agent MUST NOT reuse it for a different semantic placement.") }).strict()];
12599
12599
  const { errors: errors2, failed: failed2 } = schemas2.reduce(
@@ -12817,7 +12817,7 @@ const CreativeManifestSchema = /* @__PURE__ */ (() => z.object({}).passthrough()
12817
12817
  const BuildCreativeMultiSuccessSchema = /* @__PURE__ */ (() => z.object({
12818
12818
  creative_manifests: z.array(CreativeManifestSchema),
12819
12819
  sandbox: z.boolean().optional(),
12820
- expires_at: z.iso.datetime().optional(),
12820
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
12821
12821
  preview: z.object({
12822
12822
  previews: z.array(z.object({
12823
12823
  preview_id: z.string(),
@@ -12831,7 +12831,7 @@ const BuildCreativeMultiSuccessSchema = /* @__PURE__ */ (() => z.object({
12831
12831
  }).passthrough()
12832
12832
  }).passthrough()),
12833
12833
  interactive_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
12834
- expires_at: z.iso.datetime()
12834
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
12835
12835
  }).passthrough().optional(),
12836
12836
  preview_error: ErrorSchema.optional(),
12837
12837
  pricing_option_id: z.string().optional(),
@@ -12882,7 +12882,7 @@ const BuildCreativeVariantSuccessSchema = /* @__PURE__ */ (() => z.object({
12882
12882
  budget_status: z.union([z.literal("complete"), z.literal("capped")]).optional(),
12883
12883
  errors: z.array(ErrorSchema).optional(),
12884
12884
  sandbox: z.boolean().optional(),
12885
- expires_at: z.iso.datetime().optional(),
12885
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
12886
12886
  context: ContextObjectSchema.optional(),
12887
12887
  ext: ExtensionObjectSchema.optional()
12888
12888
  }).passthrough())();
@@ -12895,13 +12895,13 @@ const PreviewCreativeVariantResponseSchema = /* @__PURE__ */ (() => z.object({
12895
12895
  renders: z.array(PreviewRenderSchema)
12896
12896
  }).passthrough()),
12897
12897
  manifest: CreativeManifestSchema.optional(),
12898
- expires_at: z.iso.datetime().optional(),
12898
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
12899
12899
  context: ContextObjectSchema.optional(),
12900
12900
  ext: ExtensionObjectSchema.optional()
12901
12901
  }).passthrough())();
12902
12902
  const AAODirectoryAgentPublishersInverseLookupResponseSchema = /* @__PURE__ */ (() => z.object({
12903
12903
  agent_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"),
12904
- directory_indexed_at: z.iso.datetime().nullable(),
12904
+ directory_indexed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").nullable(),
12905
12905
  publishers: z.array(PublisherEntrySchema),
12906
12906
  next_cursor: z.string().optional().nullable()
12907
12907
  }).passthrough())();
@@ -12936,7 +12936,7 @@ const CreativeApprovalResponseSchema = /* @__PURE__ */ (() => z.object({
12936
12936
  payload: z.object({}).passthrough().optional(),
12937
12937
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
12938
12938
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
12939
- }).passthrough().and(z.union([CreativeApprovedSchema, CreativeRejectedSchema, CreativePendingReviewSchema, CreativeApprovalErrorSchema])))();
12939
+ }).passthrough().and(z.union([CreativeApprovedSchema, CreativeRejectedSchema, CreativePendingReviewSchema, CreativeApprovalErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
12940
12940
  const GetBrandIdentityResponseSchema = /* @__PURE__ */ (() => z.object({
12941
12941
  context_id: z.string().optional(),
12942
12942
  context: ContextObjectSchema.optional(),
@@ -12951,7 +12951,7 @@ const GetBrandIdentityResponseSchema = /* @__PURE__ */ (() => z.object({
12951
12951
  payload: z.object({}).passthrough().optional(),
12952
12952
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
12953
12953
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
12954
- }).passthrough().and(z.union([GetBrandIdentitySuccessSchema, GetBrandIdentityErrorSchema])))();
12954
+ }).passthrough().and(z.union([GetBrandIdentitySuccessSchema, GetBrandIdentityErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
12955
12955
  const GetRightsSuccessSchema = /* @__PURE__ */ (() => z.object({
12956
12956
  rights: z.array(z.object({
12957
12957
  rights_id: z.string(),
@@ -12996,7 +12996,7 @@ const UpdateRightsSuccessSchema = /* @__PURE__ */ (() => z.object({
12996
12996
  generation_credentials: z.array(GenerationCredentialSchema),
12997
12997
  rights_constraint: RightsConstraintSchema.and(z.object({}).passthrough()),
12998
12998
  paused: z.boolean().optional(),
12999
- implementation_date: z.iso.datetime().optional().nullable(),
12999
+ implementation_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
13000
13000
  context: ContextObjectSchema.optional(),
13001
13001
  ext: ExtensionObjectSchema.optional()
13002
13002
  }).passthrough())();
@@ -13055,10 +13055,10 @@ const ArtifactWebhookPayloadSchema = /* @__PURE__ */ (() => z.object({
13055
13055
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
13056
13056
  media_buy_id: z.string(),
13057
13057
  batch_id: z.string(),
13058
- timestamp: z.iso.datetime(),
13058
+ timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
13059
13059
  artifacts: z.array(z.object({
13060
13060
  artifact: ArtifactSchema,
13061
- delivered_at: z.iso.datetime(),
13061
+ delivered_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
13062
13062
  impression_id: z.string().optional(),
13063
13063
  package_id: z.string().optional()
13064
13064
  }).passthrough()),
@@ -13236,8 +13236,8 @@ const FlightItemSchema = /* @__PURE__ */ (() => z.object({
13236
13236
  airline: z.string().optional(),
13237
13237
  price: PriceSchema.optional(),
13238
13238
  description: z.string().optional(),
13239
- departure_time: z.iso.datetime().optional(),
13240
- arrival_time: z.iso.datetime().optional(),
13239
+ departure_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
13240
+ arrival_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
13241
13241
  image_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
13242
13242
  url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
13243
13243
  tags: z.array(z.string()).optional(),
@@ -13336,7 +13336,7 @@ const HotelItemSchema = /* @__PURE__ */ (() => z.object({
13336
13336
  const IndicatorBearingResourceStateSchema = /* @__PURE__ */ (() => z.object({
13337
13337
  indicators: z.array(IndicatorSchema).optional(),
13338
13338
  indicator_types_evaluated: z.array(IndicatorTypeSchema).optional(),
13339
- indicators_as_of: z.iso.datetime().optional(),
13339
+ indicators_as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
13340
13340
  indicators_evaluated_scope: z.array(IndicatorScopeSchema).optional()
13341
13341
  }).passthrough())();
13342
13342
  const InstallmentDeliveryMetricsSchema = /* @__PURE__ */ (() => DeliveryMetricsSchema.merge(z.object({
@@ -13385,8 +13385,8 @@ const OfferingSchema = /* @__PURE__ */ (() => z.object({
13385
13385
  name: z.string(),
13386
13386
  description: z.string().optional(),
13387
13387
  tagline: z.string().optional(),
13388
- valid_from: z.iso.datetime().optional(),
13389
- valid_to: z.iso.datetime().optional(),
13388
+ valid_from: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
13389
+ valid_to: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
13390
13390
  checkout_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
13391
13391
  landing_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
13392
13392
  assets: z.array(OfferingAssetGroupSchema).optional(),
@@ -13423,7 +13423,7 @@ const InlineDeclarationSchema = /* @__PURE__ */ (() => z.object({}).passthrough(
13423
13423
  format_shape: z.string().optional(),
13424
13424
  v1_format_ref: z.array(FormatReferenceStructuredObjectSchema).optional(),
13425
13425
  format_schema: PlatformExtensionReferenceSchema.optional()
13426
- }).passthrough()).and(z.union([ImageFormatDeclarationSchema, HTML5FormatDeclarationSchema, DisplayTagFormatDeclarationSchema, ImageCarouselFormatDeclarationSchema, HostedVideoFormatDeclarationSchema, VASTVideoFormatDeclarationSchema, HostedAudioFormatDeclarationSchema, VASTAudioFormatDeclarationSchema, DAASTAudioFormatDeclarationSchema, SponsoredPlacementFormatDeclarationSchema, NativeInFeedFormatDeclarationSchema, ResponsiveCreativeFormatDeclarationSchema, AgentPlacementFormatDeclarationSchema, SellerRenderedStatefulDisplayFormatDeclarationSchema, CoordinatedPlacementsFormatDeclarationSchema, CustomFormatDeclarationSchema])))();
13426
+ }).passthrough()).and(z.union([ImageFormatDeclarationSchema, HTML5FormatDeclarationSchema, DisplayTagFormatDeclarationSchema, ImageCarouselFormatDeclarationSchema, HostedVideoFormatDeclarationSchema, VASTVideoFormatDeclarationSchema, HostedAudioFormatDeclarationSchema, VASTAudioFormatDeclarationSchema, DAASTAudioFormatDeclarationSchema, SponsoredPlacementFormatDeclarationSchema, NativeInFeedFormatDeclarationSchema, ResponsiveCreativeFormatDeclarationSchema, AgentPlacementFormatDeclarationSchema, SellerRenderedStatefulDisplayFormatDeclarationSchema, CoordinatedPlacementsFormatDeclarationSchema, CustomFormatDeclarationSchema]).describe("Must also satisfy at least one of these alternatives.")))();
13427
13427
  const PublisherDOOHPlacementAttributesSchema = /* @__PURE__ */ (() => z.object({
13428
13428
  slot_duration_seconds: z.int().min(1).optional(),
13429
13429
  loop_duration_seconds: z.int().min(1).optional(),
@@ -13647,14 +13647,14 @@ const AuthorizationPayloadSchema = /* @__PURE__ */ (() => z.object({
13647
13647
  delegation_type: z.union([z.literal("direct"), z.literal("delegated"), z.literal("ad_network")]).optional(),
13648
13648
  exclusive: z.boolean().optional(),
13649
13649
  signing_keys: z.array(AgentSigningKeySchema).optional(),
13650
- effective_from: z.iso.datetime().optional(),
13651
- effective_until: z.iso.datetime().optional(),
13650
+ effective_from: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
13651
+ effective_until: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
13652
13652
  evidence: z.union([z.literal("adagents_json"), z.literal("agent_claim"), z.literal("community"), z.literal("override")]).optional(),
13653
13653
  disputed: z.boolean().optional(),
13654
13654
  created_by: z.string().optional().nullable(),
13655
- expires_at: z.iso.datetime().optional().nullable(),
13656
- created_at: z.iso.datetime().optional().nullable(),
13657
- updated_at: z.iso.datetime().optional().nullable(),
13655
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
13656
+ created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
13657
+ updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
13658
13658
  override_applied: z.boolean().optional(),
13659
13659
  override_reason: z.string().optional().nullable()
13660
13660
  }).passthrough())();
@@ -13665,7 +13665,7 @@ const RegistryEventSchema = /* @__PURE__ */ (() => z.object({
13665
13665
  entity_id: z.string(),
13666
13666
  payload: z.object({}).passthrough(),
13667
13667
  actor: z.string(),
13668
- created_at: z.iso.datetime()
13668
+ created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
13669
13669
  }).passthrough().and(z.union([z.object({
13670
13670
  event_type: z.literal("property.created"),
13671
13671
  entity_type: z.literal("property").optional(),
@@ -13687,14 +13687,14 @@ const RegistryEventSchema = /* @__PURE__ */ (() => z.object({
13687
13687
  entity_type: z.literal("property").optional(),
13688
13688
  payload: z.object({
13689
13689
  property_rid: z.uuid(),
13690
- last_resolved_at: z.iso.datetime().optional(),
13690
+ last_resolved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
13691
13691
  reason: z.string().optional()
13692
13692
  }).passthrough().optional()
13693
13693
  }).passthrough(), z.object({
13694
13694
  event_type: z.literal("property.reactivated"),
13695
13695
  entity_type: z.literal("property").optional(),
13696
13696
  payload: PropertyPayloadSchema.merge(z.object({
13697
- reactivated_at: z.iso.datetime().optional()
13697
+ reactivated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
13698
13698
  }).passthrough()).optional()
13699
13699
  }).passthrough(), z.object({
13700
13700
  event_type: z.literal("collection.created"),
@@ -13785,7 +13785,7 @@ const RegistryEventSchema = /* @__PURE__ */ (() => z.object({
13785
13785
  event_type: z.literal("authorization.modified"),
13786
13786
  entity_type: z.literal("authorization").optional(),
13787
13787
  payload: AuthorizationPayloadSchema.optional()
13788
- }).passthrough()])))();
13788
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
13789
13789
  const ReportingCanonicalizationContractSchema = /* @__PURE__ */ (() => z.object({
13790
13790
  contract_version: z.literal("1.0"),
13791
13791
  media_type: z.literal("application/vnd.adcp.reporting-canonicalization+json"),
@@ -13908,7 +13908,7 @@ const GovernanceAgentNotAcceptedDetailsSchema = /* @__PURE__ */ (() => z.union([
13908
13908
  disclosure: z.literal("opaque"),
13909
13909
  rejection_ref: z.string().max(128).regex(/^[A-Za-z0-9_.:-]+$/).optional()
13910
13910
  }).passthrough()]))();
13911
- const VASTVersionMismatchDetailsSchema = /* @__PURE__ */ (() => z.union([AssetOutsideAcceptedVersionIntersectionSchema, InspectedDocumentVersionMismatchSchema, SupportedVersionsCompatibilityDetailsSchema]).and(z.object({
13911
+ const VASTVersionMismatchDetailsSchema = /* @__PURE__ */ (() => z.union([AssetOutsideAcceptedVersionIntersectionSchema, InspectedDocumentVersionMismatchSchema, SupportedVersionsCompatibilityDetailsSchema]).describe("Must also satisfy at least one of these alternatives.").and(z.object({
13912
13912
  mismatch_reason: z.union([z.literal("asset_outside_acceptance"), z.literal("document_version_mismatch")]).optional(),
13913
13913
  asset_vast_version: VASTVersionSchema.optional(),
13914
13914
  observed_document_vast_version: z.string().optional().nullable(),
@@ -13922,13 +13922,13 @@ const BoundedValueLevel_2Schema = /* @__PURE__ */ (() => z.union([BoundedScalarS
13922
13922
  const BoundedValueSchema = /* @__PURE__ */ (() => z.union([BoundedScalarSchema, z.array(BoundedValueLevel_2Schema), z.record(z.string(), BoundedValueLevel_2Schema)]))();
13923
13923
  const AcceptancePolicyCatalogSchema = /* @__PURE__ */ (() => z.object({
13924
13924
  catalog_version: z.string().min(1),
13925
- generated_at: z.iso.datetime().optional(),
13925
+ generated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
13926
13926
  profiles: z.array(AcceptancePolicyProfileSchema).optional(),
13927
13927
  registry_profiles: z.array(RegistryAcceptancePolicyProfileReferenceSchema).optional(),
13928
13928
  ext: ExtensionObjectSchema.optional()
13929
13929
  }).passthrough())();
13930
13930
  const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
13931
- const objectSchema = z.object({ "geo_countries": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE')."), z.null()]).optional(), "geo_countries_exclude": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Exclude specific countries from delivery. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE')."), z.null()]).optional(), "geo_regions": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Restrict delivery to exact canonical ISO 3166-2 subdivisions (states, provinces, regions, departments, or other subdivision categories). Unknown identifiers are invalid. At create or update, sellers MUST reject unsupported identifiers and MUST NOT silently widen, drop, or partially apply the list. During get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome. Exact internal translation preserves accepted identifiers in package readback."), z.null()]).optional(), "geo_regions_exclude": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Exclude exact canonical ISO 3166-2 subdivisions. Support is independent from geo_regions inclusion support. Unknown identifiers and values also present in geo_regions are invalid. At create or update, sellers MUST reject unsupported identifiers and partial application; during get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome."), z.null()]).optional(), "geo_metros": z.union([z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict().describe("A targeted metro area.")).min(1).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities."), z.null().describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.")]).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_metros_exclude": z.union([z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes to exclude within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict()).min(1).describe("Exclude specific metro areas from delivery. Each entry specifies the classification system and excluded values. Seller must declare supported systems in get_adcp_capabilities."), z.null()]).optional(), "geo_postal_areas": z.union([z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })])).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Restrict delivery to specific postal areas. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities."), z.null()]).optional(), "geo_postal_areas_exclude": z.union([z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })])).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Exclude specific postal areas from delivery. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities."), z.null()]).optional(), "geo_places": z.union([z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))])).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Restrict delivery to catalog-backed named places. Values MUST be stable identifiers in the declared system, not display names. Sellers must declare supported systems, countries, and place types in get_adcp_capabilities and reject unsupported entries rather than silently dropping them."), z.null()]).optional(), "geo_places_exclude": z.union([z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))])).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Exclude catalog-backed named places. Uses the same identifier-based shape as geo_places. Sellers MUST reject overlap with geo_places for the same country, system, place_type, and value."), z.null()]).optional(), "daypart_targets": z.union([z.array(z.object({ "days": z.array(z.enum(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]).describe("Days of the week for daypart targeting")).min(1).describe("Days of week this window applies to. Use multiple days for compact targeting (e.g., monday-friday in one object)."), "start_hour": z.number().int().gte(0).lte(23).describe("Start hour (inclusive), 0-23 in 24-hour format. 0 = midnight, 6 = 6:00am, 18 = 6:00pm."), "end_hour": z.number().int().gte(1).lte(24).describe("End hour (exclusive), 1-24 in 24-hour format. 10 = 10:00am, 24 = midnight. Must be greater than start_hour."), "timezone": z.union([z.literal("inventory_local"), z.any().refine((value) => !z.literal("inventory_local").safeParse(value).success, "Invalid input: Should NOT be valid against schema").describe("Concrete timezone identifier in the implementation's supported IANA Time Zone Database, such as America/New_York, CET, or UTC.")]).describe("Civil-time clock used to evaluate this window. 'inventory_local' evaluates the hours in the seller-assigned local timezone of each inventory unit that can deliver the impression, such as a screen, venue, station, or publisher property; it never means the buyer, account, or server timezone. A concrete IANA timezone identifier (for example, 'America/New_York', 'CET', or 'UTC') evaluates one shared civil-time clock across the targeted inventory. Omission defaults to 'inventory_local'. Buyers that begin with a user or account preference MUST resolve it to a concrete IANA identifier before sending the daypart; 'user_timezone' and 'account_timezone' are not wire values. For each candidate delivery instant, convert the instant into this clock and compare its resulting local day and hour with the half-open window: a skipped DST hour has no matching instants, while both occurrences of a repeated hour match. This delivery clock is independent of reporting_capabilities.timezone.").default("inventory_local"), "label": z.string().describe("Optional human-readable name for this time window (e.g., 'Morning Drive', 'Prime Time')").optional() }).strict().describe("A time window for daypart targeting. Specifies days of week, an hour range, and the civil-time clock used to evaluate it. start_hour is inclusive, end_hour is exclusive (e.g., 6-10 = 6:00am to 10:00am). Follows the Google Ads AdScheduleInfo / DV360 DayPartTargeting pattern.")).min(1).describe("Restrict delivery to specific time windows. Each entry specifies days of week, an hour range, and an optional timezone that defaults to inventory_local. A concrete IANA zone uses one shared civil-time clock, while inventory_local evaluates each inventory unit in its seller-assigned local timezone. Entries are independent and MAY use different clocks."), z.null()]).optional(), "axe_include_segment": z.union([z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to include for targeting."), z.null()]).optional(), "axe_exclude_segment": z.union([z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to exclude from targeting."), z.null()]).optional(), "audience_include": z.union([z.array(z.string()).min(1).describe("Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "audience_exclude": z.union([z.array(z.string()).min(1).describe("Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "signal_targeting_groups": z.union([z.object({ "operator": z.literal("all").describe("Groups-level operator. Required even though v1 only supports 'all': every child group must be satisfied."), "groups": z.array(z.object({ "operator": z.enum(["any", "none"]).describe("How to evaluate the signals in this group. 'any' is an OR include group. 'none' is an exclusion group equivalent to NOT (A OR B OR C)."), "signals": z.array(z.object({ "pricing_option_id": z.string().describe("Pricing option selected for this signal. Use the pricing_option_id from the product's signal_targeting_options entry when product-scoped pricing is present; otherwise use the seller get_signals pricing only when the product option does not override it. Required when the selected signal has pricing_options; omit only when the signal is bundled into the product price or has no incremental cost.").optional(), "signal_agent_segment_id": z.string().describe("Optional opaque resolved-segment or seller execution handle for this signal. Omit when signal_ref plus the value expression is sufficient for the seller to resolve the signal. Include when the product option exposes a separate runtime or activation handle, and pass it verbatim. Buyers SHOULD prefer an exposed segment handle over reconstructing condition identity from categorical values because the handle can carry provider namespace and methodology distinctions.").optional(), "activation_key": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
13931
+ const objectSchema = z.object({ "geo_countries": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE')."), z.null()]).optional(), "geo_countries_exclude": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Exclude specific countries from delivery. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE')."), z.null()]).optional(), "geo_regions": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Restrict delivery to exact canonical ISO 3166-2 subdivisions (states, provinces, regions, departments, or other subdivision categories). Unknown identifiers are invalid. At create or update, sellers MUST reject unsupported identifiers and MUST NOT silently widen, drop, or partially apply the list. During get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome. Exact internal translation preserves accepted identifiers in package readback."), z.null()]).optional(), "geo_regions_exclude": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Exclude exact canonical ISO 3166-2 subdivisions. Support is independent from geo_regions inclusion support. Unknown identifiers and values also present in geo_regions are invalid. At create or update, sellers MUST reject unsupported identifiers and partial application; during get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome."), z.null()]).optional(), "geo_metros": z.union([z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict().describe("A targeted metro area.")).min(1).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities."), z.null().describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.")]).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_metros_exclude": z.union([z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes to exclude within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict()).min(1).describe("Exclude specific metro areas from delivery. Each entry specifies the classification system and excluded values. Seller must declare supported systems in get_adcp_capabilities."), z.null()]).optional(), "geo_postal_areas": z.union([z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })]).describe("Must also satisfy at least one of these alternatives.")).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Restrict delivery to specific postal areas. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities."), z.null()]).optional(), "geo_postal_areas_exclude": z.union([z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })]).describe("Must also satisfy at least one of these alternatives.")).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Exclude specific postal areas from delivery. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities."), z.null()]).optional(), "geo_places": z.union([z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Restrict delivery to catalog-backed named places. Values MUST be stable identifiers in the declared system, not display names. Sellers must declare supported systems, countries, and place types in get_adcp_capabilities and reject unsupported entries rather than silently dropping them."), z.null()]).optional(), "geo_places_exclude": z.union([z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Exclude catalog-backed named places. Uses the same identifier-based shape as geo_places. Sellers MUST reject overlap with geo_places for the same country, system, place_type, and value."), z.null()]).optional(), "daypart_targets": z.union([z.array(z.object({ "days": z.array(z.enum(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]).describe("Days of the week for daypart targeting")).min(1).describe("Days of week this window applies to. Use multiple days for compact targeting (e.g., monday-friday in one object)."), "start_hour": z.number().int().gte(0).lte(23).describe("Start hour (inclusive), 0-23 in 24-hour format. 0 = midnight, 6 = 6:00am, 18 = 6:00pm."), "end_hour": z.number().int().gte(1).lte(24).describe("End hour (exclusive), 1-24 in 24-hour format. 10 = 10:00am, 24 = midnight. Must be greater than start_hour."), "timezone": z.union([z.literal("inventory_local"), z.any().refine((value) => !z.literal("inventory_local").safeParse(value).success, "Invalid input: Should NOT be valid against schema").describe("Concrete timezone identifier in the implementation's supported IANA Time Zone Database, such as America/New_York, CET, or UTC.")]).describe("Civil-time clock used to evaluate this window. 'inventory_local' evaluates the hours in the seller-assigned local timezone of each inventory unit that can deliver the impression, such as a screen, venue, station, or publisher property; it never means the buyer, account, or server timezone. A concrete IANA timezone identifier (for example, 'America/New_York', 'CET', or 'UTC') evaluates one shared civil-time clock across the targeted inventory. Omission defaults to 'inventory_local'. Buyers that begin with a user or account preference MUST resolve it to a concrete IANA identifier before sending the daypart; 'user_timezone' and 'account_timezone' are not wire values. For each candidate delivery instant, convert the instant into this clock and compare its resulting local day and hour with the half-open window: a skipped DST hour has no matching instants, while both occurrences of a repeated hour match. This delivery clock is independent of reporting_capabilities.timezone.").default("inventory_local"), "label": z.string().describe("Optional human-readable name for this time window (e.g., 'Morning Drive', 'Prime Time')").optional() }).strict().describe("A time window for daypart targeting. Specifies days of week, an hour range, and the civil-time clock used to evaluate it. start_hour is inclusive, end_hour is exclusive (e.g., 6-10 = 6:00am to 10:00am). Follows the Google Ads AdScheduleInfo / DV360 DayPartTargeting pattern.")).min(1).describe("Restrict delivery to specific time windows. Each entry specifies days of week, an hour range, and an optional timezone that defaults to inventory_local. A concrete IANA zone uses one shared civil-time clock, while inventory_local evaluates each inventory unit in its seller-assigned local timezone. Entries are independent and MAY use different clocks."), z.null()]).optional(), "axe_include_segment": z.union([z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to include for targeting."), z.null()]).optional(), "axe_exclude_segment": z.union([z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to exclude from targeting."), z.null()]).optional(), "audience_include": z.union([z.array(z.string()).min(1).describe("Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "audience_exclude": z.union([z.array(z.string()).min(1).describe("Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "signal_targeting_groups": z.union([z.object({ "operator": z.literal("all").describe("Groups-level operator. Required even though v1 only supports 'all': every child group must be satisfied."), "groups": z.array(z.object({ "operator": z.enum(["any", "none"]).describe("How to evaluate the signals in this group. 'any' is an OR include group. 'none' is an exclusion group equivalent to NOT (A OR B OR C)."), "signals": z.array(z.object({ "pricing_option_id": z.string().describe("Pricing option selected for this signal. Use the pricing_option_id from the product's signal_targeting_options entry when product-scoped pricing is present; otherwise use the seller get_signals pricing only when the product option does not override it. Required when the selected signal has pricing_options; omit only when the signal is bundled into the product price or has no incremental cost.").optional(), "signal_agent_segment_id": z.string().describe("Optional opaque resolved-segment or seller execution handle for this signal. Omit when signal_ref plus the value expression is sufficient for the seller to resolve the signal. Include when the product option exposes a separate runtime or activation handle, and pass it verbatim. Buyers SHOULD prefer an exposed segment handle over reconstructing condition identity from categorical values because the handle can carry provider namespace and methodology distinctions.").optional(), "activation_key": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
13932
13932
  const schemas = [z.object({ "type": z.literal("segment_id").describe("Segment ID based targeting"), "segment_id": z.string().describe("The platform-specific segment identifier to use in campaign targeting") }).catchall(z.any()), z.object({ "type": z.literal("key_value").describe("Key-value pair based targeting"), "key": z.string().describe("The targeting parameter key"), "value": z.string().describe("The targeting parameter value") }).catchall(z.any())];
13933
13933
  const { errors, failed } = schemas.reduce(
13934
13934
  ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
@@ -14029,7 +14029,7 @@ const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
14029
14029
  message: "Invalid input: Should pass single schema. Passed " + passed2
14030
14030
  });
14031
14031
  }
14032
- }).describe("Named signal being targeted."), "value_type": z.literal("numeric").describe("Discriminator for numeric signals."), "min_value": z.number().describe("Minimum value, inclusive. Omit for no minimum. Should be within the signal definition's range when declared.").optional(), "max_value": z.number().describe("Maximum value, inclusive. Omit for no maximum. Should be within the signal definition's range when declared.").optional() }).catchall(z.any()).and(z.union([z.object({ "min_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Numeric signal expression - target users within a value range. At least one of min_value or max_value is required. If both min_value and max_value are provided, min_value MUST be <= max_value.")];
14032
+ }).describe("Named signal being targeted."), "value_type": z.literal("numeric").describe("Discriminator for numeric signals."), "min_value": z.number().describe("Minimum value, inclusive. Omit for no minimum. Should be within the signal definition's range when declared.").optional(), "max_value": z.number().describe("Maximum value, inclusive. Omit for no maximum. Should be within the signal definition's range when declared.").optional() }).catchall(z.any()).and(z.union([z.object({ "min_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Numeric signal expression - target users within a value range. At least one of min_value or max_value is required. If both min_value and max_value are provided, min_value MUST be <= max_value.")];
14033
14033
  const { errors, failed } = schemas.reduce(
14034
14034
  ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
14035
14035
  errors: [...errors2, ...result.error.issues],
@@ -14104,7 +14104,7 @@ const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
14104
14104
  message: "Invalid input: Should pass single schema. Passed " + passed2
14105
14105
  });
14106
14106
  }
14107
- }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("binary").describe("Discriminator for binary signals"), "value": z.boolean().describe("Whether to include (true) or exclude (false) users matching this signal") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Binary signal targeting - user either matches or doesn't"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
14107
+ }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("binary").describe("Discriminator for binary signals"), "value": z.boolean().describe("Whether to include (true) or exclude (false) users matching this signal") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Binary signal targeting - user either matches or doesn't"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
14108
14108
  const schemas2 = [z.object({ "scope": z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Product-local signal identifier. For local signals exposed on both get_signals and get_products, this MUST match get_signals.signals[].signal_ref.signal_id for the same signal.") }).catchall(z.any()).describe("Product-scoped signal. The signal_id is meaningful only within the selected product/package context and MUST match a Product.included_signals[].signal_ref.signal_id or Product.signal_targeting_options[].signal_ref.signal_id for that product, depending on whether the signal is descriptive or selectable."), z.object({ "scope": z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that publishes the signal definition in its adagents.json signals[]."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(z.any()).describe("Data-provider-scoped signal. The signal_id resolves through the data provider's published adagents.json signals[] and can be authorization-verified there."), z.object({ "scope": z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(z.any()).describe("Signal-source-scoped signal. Use this for source-native signals that are not published in upstream adagents.json signals[]. The buyer trusts the issuing signal source for this identity; use scope 'data_provider' instead when the signal is published in adagents.json signals[], even if the publisher is also the seller or signal source.")];
14109
14109
  const { errors: errors2, failed: failed2 } = schemas2.reduce(
14110
14110
  ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
@@ -14154,7 +14154,7 @@ const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
14154
14154
  message: "Invalid input: Should pass single schema. Passed " + passed2
14155
14155
  });
14156
14156
  }
14157
- }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("categorical").describe("Discriminator for categorical signals"), "values": z.array(z.string()).min(1).describe("Values to target. Users with any of these values will be included.") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Categorical signal targeting - target users with specific values"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
14157
+ }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("categorical").describe("Discriminator for categorical signals"), "values": z.array(z.string()).min(1).describe("Values to target. Users with any of these values will be included.") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Categorical signal targeting - target users with specific values"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
14158
14158
  const schemas2 = [z.object({ "scope": z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Product-local signal identifier. For local signals exposed on both get_signals and get_products, this MUST match get_signals.signals[].signal_ref.signal_id for the same signal.") }).catchall(z.any()).describe("Product-scoped signal. The signal_id is meaningful only within the selected product/package context and MUST match a Product.included_signals[].signal_ref.signal_id or Product.signal_targeting_options[].signal_ref.signal_id for that product, depending on whether the signal is descriptive or selectable."), z.object({ "scope": z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that publishes the signal definition in its adagents.json signals[]."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(z.any()).describe("Data-provider-scoped signal. The signal_id resolves through the data provider's published adagents.json signals[] and can be authorization-verified there."), z.object({ "scope": z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(z.any()).describe("Signal-source-scoped signal. Use this for source-native signals that are not published in upstream adagents.json signals[]. The buyer trusts the issuing signal source for this identity; use scope 'data_provider' instead when the signal is published in adagents.json signals[], even if the publisher is also the seller or signal source.")];
14159
14159
  const { errors: errors2, failed: failed2 } = schemas2.reduce(
14160
14160
  ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
@@ -14204,7 +14204,7 @@ const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
14204
14204
  message: "Invalid input: Should pass single schema. Passed " + passed2
14205
14205
  });
14206
14206
  }
14207
- }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("numeric").describe("Discriminator for numeric signals"), "min_value": z.number().describe("Minimum value (inclusive). Omit for no minimum. Must be <= max_value when both are provided. Should be >= signal's range.min if defined.").optional(), "max_value": z.number().describe("Maximum value (inclusive). Omit for no maximum. Must be >= min_value when both are provided. Should be <= signal's range.max if defined.").optional() }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Numeric signal targeting - target users within a value range. If min_value is provided, it must be <= max_value. Values should be within the signal's defined range (see signal definition).")];
14207
+ }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("numeric").describe("Discriminator for numeric signals"), "min_value": z.number().describe("Minimum value (inclusive). Omit for no minimum. Must be <= max_value when both are provided. Should be >= signal's range.min if defined.").optional(), "max_value": z.number().describe("Maximum value (inclusive). Omit for no maximum. Must be >= min_value when both are provided. Should be <= signal's range.max if defined.").optional() }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Numeric signal targeting - target users within a value range. If min_value is provided, it must be <= max_value. Values should be within the signal's defined range (see signal definition).")];
14208
14208
  const { errors, failed } = schemas.reduce(
14209
14209
  ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
14210
14210
  errors: [...errors2, ...result.error.issues],
@@ -14228,7 +14228,7 @@ const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
14228
14228
  message: "Invalid input: Should pass single schema. Passed " + passed
14229
14229
  });
14230
14230
  }
14231
- }).describe("Targeting constraint for a specific signal. Uses value_type as discriminator to determine the targeting expression format.")).min(1).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing."), z.null().describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.")]).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.").optional(), "demographics": z.union([z.object({ "age": z.intersection(z.object({ "min": z.number().int().gte(0).lte(150).describe("Inclusive minimum age in completed years. Omit for an open lower bound.").optional(), "max": z.number().int().gte(0).lte(150).describe("Inclusive maximum age in completed years. Omit for an open upper bound.").optional(), "include_unknown": z.boolean().describe("Whether delivery to people whose age is unavailable is part of this predicate. This field has no default and MUST be supplied.") }).catchall(z.any()).and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A canonical audience-age predicate in completed integer years. min and max are inclusive; omitting one bound means no restriction in that direction. At least one bound is required. include_unknown is always explicit because people whose age is unavailable are not members of any numeric interval. Implementations MUST reject min greater than max; JSON Schema draft-07 cannot compare sibling numeric values."), z.object({ "accepted_bases": z.array(z.enum(["verified", "declared", "inferred"]).describe("User-level bases that may resolve age for demographic targeting execution. Population estimates are deliberately absent because aggregate composition cannot establish an individual impression's age.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("User-level age determination bases the buyer permits for this predicate. Sellers MUST use only these bases or reject the request; they MUST NOT silently fall back to another basis. When omitted, the buyer imposes no determination-basis constraint beyond product capability and any age_restriction. population_estimate is structurally unavailable because aggregate evidence cannot identify an eligible user.").optional(), "accepted_verification_methods": z.array(z.enum(["facial_age_estimation", "id_document", "digital_id", "credit_card", "world_id"]).describe("Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Verification methods acceptable when verified is an accepted basis. This field narrows verified demographic execution; age_restriction.accepted_methods independently governs legal eligibility and the two sets are intersected when both are present.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "accepted_verification_methods": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "accepted_verification_methods": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "accepted_bases": z.any().refine((value) => !z.array(z.any().refine((value2) => !z.literal("verified").safeParse(value2).success, "Invalid input: Should NOT be valid against schema")).safeParse(value).success, "Invalid input: Should NOT be valid against schema") }))]))) }).catchall(z.any()).describe("Canonical demographic audience targeting intent with optional constraints on how age may be determined. This is distinct from age_restriction: demographics selects an audience, while age_restriction expresses a legal eligibility or verification floor. Fresh create/update targeting MUST compile exactly or be rejected. During get_products, a seller may offer a different configured predicate only through sparse targeting_resolution modifications on a distinguishable product_id; selecting that product accepts the alternative. Sellers never silently broaden, narrow, default, drop, or substitute the basis."), z.null()]).optional(), "frequency_cap": z.union([z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2."), z.null()]).optional(), "property_list": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list for targeting specific properties within this product. The package runs on the intersection of the product's publisher_properties and this list. Sellers SHOULD return a validation error if the product has property_targeting_allowed: false."), z.null()]).optional(), "property_list_exclude": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list whose properties must not carry the buyer's ads. Matched properties are removed from delivery. Use for brand-safety do-not-run lists (apps, sites). Exclude wins on overlap with property_list, and applies regardless of the product's property_targeting_allowed flag. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "collection_list": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for including specific collections (programs, publications, channels) within this product. The package runs on the intersection of matched collections and this list. Use for inclusion-based collection targeting. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "collection_list_exclude": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for excluding specific collections (programs, publications, channels) from this product. Matched collections must not carry the buyer's ads. Use for brand safety do-not-air lists. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "placement_selection": z.union([z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
14231
+ }).describe("Targeting constraint for a specific signal. Uses value_type as discriminator to determine the targeting expression format.")).min(1).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing."), z.null().describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.")]).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.").optional(), "demographics": z.union([z.object({ "age": z.intersection(z.object({ "min": z.number().int().gte(0).lte(150).describe("Inclusive minimum age in completed years. Omit for an open lower bound.").optional(), "max": z.number().int().gte(0).lte(150).describe("Inclusive maximum age in completed years. Omit for an open upper bound.").optional(), "include_unknown": z.boolean().describe("Whether delivery to people whose age is unavailable is part of this predicate. This field has no default and MUST be supplied.") }).catchall(z.any()).and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A canonical audience-age predicate in completed integer years. min and max are inclusive; omitting one bound means no restriction in that direction. At least one bound is required. include_unknown is always explicit because people whose age is unavailable are not members of any numeric interval. Implementations MUST reject min greater than max; JSON Schema draft-07 cannot compare sibling numeric values."), z.object({ "accepted_bases": z.array(z.enum(["verified", "declared", "inferred"]).describe("User-level bases that may resolve age for demographic targeting execution. Population estimates are deliberately absent because aggregate composition cannot establish an individual impression's age.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("User-level age determination bases the buyer permits for this predicate. Sellers MUST use only these bases or reject the request; they MUST NOT silently fall back to another basis. When omitted, the buyer imposes no determination-basis constraint beyond product capability and any age_restriction. population_estimate is structurally unavailable because aggregate evidence cannot identify an eligible user.").optional(), "accepted_verification_methods": z.array(z.enum(["facial_age_estimation", "id_document", "digital_id", "credit_card", "world_id"]).describe("Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Verification methods acceptable when verified is an accepted basis. This field narrows verified demographic execution; age_restriction.accepted_methods independently governs legal eligibility and the two sets are intersected when both are present.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "accepted_verification_methods": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "accepted_verification_methods": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "accepted_bases": z.any().refine((value) => !z.array(z.any().refine((value2) => !z.literal("verified").safeParse(value2).success, "Invalid input: Should NOT be valid against schema")).safeParse(value).success, "Invalid input: Should NOT be valid against schema") }))]).describe("Must also satisfy at least one of these alternatives."))) }).catchall(z.any()).describe("Canonical demographic audience targeting intent with optional constraints on how age may be determined. This is distinct from age_restriction: demographics selects an audience, while age_restriction expresses a legal eligibility or verification floor. Fresh create/update targeting MUST compile exactly or be rejected. During get_products, a seller may offer a different configured predicate only through sparse targeting_resolution modifications on a distinguishable product_id; selecting that product accepts the alternative. Sellers never silently broaden, narrow, default, drop, or substitute the basis."), z.null()]).optional(), "frequency_cap": z.union([z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2."), z.null()]).optional(), "property_list": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list for targeting specific properties within this product. The package runs on the intersection of the product's publisher_properties and this list. Sellers SHOULD return a validation error if the product has property_targeting_allowed: false."), z.null()]).optional(), "property_list_exclude": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list whose properties must not carry the buyer's ads. Matched properties are removed from delivery. Use for brand-safety do-not-run lists (apps, sites). Exclude wins on overlap with property_list, and applies regardless of the product's property_targeting_allowed flag. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "collection_list": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for including specific collections (programs, publications, channels) within this product. The package runs on the intersection of matched collections and this list. Use for inclusion-based collection targeting. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "collection_list_exclude": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for excluding specific collections (programs, publications, channels) from this product. Matched collections must not carry the buyer's ads. Use for brand safety do-not-air lists. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "placement_selection": z.union([z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
14232
14232
  const schemas = [z.object({ "mode": z.literal("selected"), "placement_refs": z.array(z.union([z.intersection(z.object({ "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring a publisher-catalog placement is hosted, or the inventory publisher associated with an inline placement. Omitted only for legacy single-publisher product-context references.").optional(), "placement_id": z.string().describe("Placement ID from the publisher's adagents.json placement catalog, or an inline seller-defined placement ID interpreted within the enclosing seller and product context.") }).catchall(z.any()).describe("Legacy-compatible product-context reference to a placement. For publisher-catalog placements, publisher_domain plus placement_id resolves the declaration in that publisher's adagents.json. For seller-inline placements, the enclosing seller and product supply scope. When publisher_domain is omitted on legacy inputs, receivers MAY interpret the ID relative to the enclosing single-publisher product. Use placement-identity.json when a self-contained cross-document identity is required."), z.object({ "publisher_domain": z.any().refine((value) => value !== void 0, "Required") }).passthrough()), z.any().superRefine((x2, ctx2) => {
14233
14233
  const schemas2 = [z.object({ "kind": z.literal("publisher_ref"), "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain whose adagents.json declares placement_id."), "placement_id": z.string().min(1) }).strict(), z.object({ "kind": z.literal("seller_inline"), "seller_agent": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("The seller agent's API endpoint URL as declared in the property publisher's adagents.json `authorized_agents[].url`. MUST use the `https://` scheme. Receivers compare this URL against the `authorized_agents` list using the AdCP URL canonicalization rules \u2014 not byte-equality \u2014 and reject mismatches with `seller_not_authorized`. See docs/reference/url-canonicalization."), "id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).min(1).describe("Reserved for a future registry-assigned stable seller identifier. Not used today \u2014 senders MUST NOT populate this field until a registry is defined. When a future release populates both `agent_url` and `id`, `agent_url` remains authoritative and `id` is advisory.").optional() }).strict().describe("Sales agent that defines and maintains the inline placement namespace."), "placement_id": z.string().min(1).describe("Stable placement ID within the defining sales agent's namespace. The agent MUST NOT reuse it for a different semantic placement.") }).strict()];
14234
14234
  const { errors: errors2, failed: failed2 } = schemas2.reduce(
@@ -14406,12 +14406,12 @@ const ProposalRefinementSchema = /* @__PURE__ */ (() => z.object({
14406
14406
  action: z.literal("finalize")
14407
14407
  }).passthrough(), z.union([z.object({}).passthrough(), z.object({
14408
14408
  change_kind: z.literal("cancellation")
14409
- }).passthrough()])])))();
14409
+ }).passthrough()])]).describe("Must also satisfy at least one of these alternatives.")))();
14410
14410
  const PropertyFeatureResultSchema = /* @__PURE__ */ (() => z.object({
14411
14411
  property: PropertyIDSchema,
14412
14412
  features: z.record(z.string(), PropertyFeatureValueSchema).optional(),
14413
14413
  coverage_status: z.union([z.literal("covered"), z.literal("not_covered"), z.literal("pending")]),
14414
- last_evaluated: z.iso.datetime().optional(),
14414
+ last_evaluated: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
14415
14415
  ext: ExtensionObjectSchema.optional()
14416
14416
  }).passthrough())();
14417
14417
  const PackageFormatSnapshotSchema = /* @__PURE__ */ (() => ProductFormatDeclarationSchema.and(z.object({}).passthrough()).and(z.object({
@@ -14728,7 +14728,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
14728
14728
  message: "Invalid input: Should pass single schema. Passed " + passed
14729
14729
  });
14730
14730
  }
14731
- })).describe('Discriminated reference to a product format option. The global canonical shape is still named by `format_kind`; this reference selects one concrete product `format_options[]` entry. `scope: "publisher"` identifies a publisher-declared catalog option by `{ publisher_domain, format_option_id }`. `scope: "product"` identifies a product-local option by `format_option_id`; the enclosing package/product context supplies the namespace.')).min(1).describe("Canonical format options selected from the published product offer. Legacy named-format identifiers are not accepted.").optional(), "catalog_ids": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Previously synchronized account catalog IDs promoted by this selection. Callers manage catalog bodies through sync_catalogs rather than inlining them here.").optional(), "budget": z.number().gte(0).describe("Hard spend cap for this selection in the media-buy currency. In seller-optimized allocation it is an optional ceiling, not a reserved allocation, and requires advertised media_buy.features.seller_optimized_package_budgets; otherwise rejected with UNSUPPORTED_FEATURE before any over-subscription validation.").optional(), "daily_budget_cap": z.number().gte(0).describe("Optional hard daily spend ceiling for this purchase. It is subordinate to the media-buy aggregate daily cap and is not a reserved daily allocation. Its day boundary is the media buy's budget_cap_timezone.").optional(), "min_spend_target": z.number().gte(0).describe("Soft lifetime spend target for seller-optimized allocation. Requires advertised media_buy.features.seller_optimized_min_spend_targets; otherwise rejected with UNSUPPORTED_FEATURE before any over-subscription validation.").optional(), "impressions": z.number().gte(0).optional(), "start_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "end_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "pacing": z.enum(["even", "asap", "front_loaded"]).describe("Purchase pacing, subordinate to media-buy pacing. In seller-optimized allocation, pacing that differs from the media-buy pacing requires advertised media_buy.features.seller_optimized_package_pacing; otherwise rejected with UNSUPPORTED_FEATURE.").optional(), "bidding": z.object({ "automatic": z.literal(true).describe("Explicitly use seller/provider automatic bidding at this authored scope. At package scope this is a complete override of a media-buy policy, not inheritance. It MUST be the only field in the block and MUST be preserved on readback.").optional(), "bid_amount": z.number().gt(0).describe("Manual auction bid denominated in the media-buy currency and expressed per the selected pricing option's auction unit. For example, a CPM option interprets the amount per thousand impressions. This is the amount submitted to the auction, not a promise that the clearing price equals it. Requires an auction-priced pricing option whose currency equals the media-buy currency.").optional(), "max_bid": z.number().gt(0).describe("Hard per-auction ceiling denominated in the media-buy currency and expressed per the selected pricing option's auction unit. This is the only canonical hard auction ceiling and MUST NOT be translated into an average outcome-cost control. Requires an auction-priced pricing option whose currency equals the media-buy currency. May stand alone or supplement cost_per/roas only when the relevant scope capability advertises that combination.").optional(), "cost_per": z.object({ "amount": z.number().gt(0).describe("Average cost amount per scope-bound primary-goal result, denominated in the media-buy currency."), "strength": z.enum(["cap", "target"]).describe("`cap` optimizes for an average at or below the amount and accepts underdelivery when necessary; `target` optimizes around the amount while balancing volume and spend. Neither is a per-result or per-auction guarantee.") }).passthrough().describe("Average cost control per result of the scope-bound primary optimization goal. At seller-optimized media-buy scope it binds to budget_allocation.optimization_goals; at package scope it binds to that package's optimization_goals; at fixed media-buy scope it binds independently to each inheriting package and is valid only when their primary-goal result units are compatible. Metric goals are compatible only when metric and every result-defining qualifier match; vendor_metric goals only when vendor and metric_id match; event goals only when the event_type/custom_event_name set and resolved attribution_window match. Primary is the earliest array entry among goals tied for the lowest explicit numeric priority; unprioritized goals follow explicitly prioritized goals; when all priorities are absent, the first entry is primary.").optional(), "roas": z.object({ "value": z.number().gt(0).describe("Return per unit of ad spend; 4 means 4 units of value per 1 unit spent."), "strength": z.enum(["floor", "target"]).describe("`floor` prefers underdelivery to knowingly optimizing below the requested return; `target` optimizes around the requested return. Neither guarantees realized return.") }).passthrough().describe("Dimensionless return-on-ad-spend control bound to the same scope-specific primary goal rules as cost_per. The bound goal must be value-bearing; a fixed media-buy default requires a value-bearing primary goal on every inheriting package. Every referenced value-bearing event source MUST declare value_currencies containing the media-buy currency. The seller validates this at buy creation; each buy consumes only exact-currency records, while other declared currencies remain available to other buys. Sellers MUST NOT perform currency conversion.").optional() }).passthrough().and(z.any().refine((value) => !z.union([z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "max_bid": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "cost_per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "roas": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required"), "max_bid": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required"), "cost_per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required"), "roas": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "cost_per": z.any().refine((value2) => value2 !== void 0, "Required"), "roas": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema")).describe("Buyer-authored execution policy for automatic delivery, auction bidding, average outcome cost, or return on ad spend. The containing object determines authored scope: media-buy `bidding` is a complete inherited default and package `bidding` is a complete package override. Sellers MUST preserve authored scope on readback and MUST NOT copy an inherited media-buy policy into package `bidding`. Every monetary field in this block is denominated in the media-buy currency; the selected pricing option supplies the auction unit, never another denomination. Auction-unit identity is the pricing_model plus every canonical billing-event qualifier after defaults are applied: for example CPV view threshold, CPP demographic system/demographic, CPA event tuple, time time_unit, and flat-rate/DOOH parameters. An extension qualifier participates only when its registered extension specification explicitly defines how it contributes to auction-unit identity. A media-buy bid_amount or max_bid is valid only when every inheriting package resolves the same auction-unit identity. Every affected pricing option MUST use the media-buy currency; split currency-mismatched packages into separate buys. Seller-optimized media-buy cost_per/roas bind to the primary budget_allocation.optimization_goals goal. Package-authored cost_per/roas bind to the package primary optimization goal. The primary goal is the earliest array entry among goals with the lowest explicit numeric priority; unprioritized goals follow explicitly prioritized goals; when all priorities are absent, the first entry is primary. In fixed allocation, an inherited media-buy cost_per is valid only when all inheriting packages have compatible primary-goal result units; inherited roas requires value-bearing primary goals on every inheriting package. Canonical ROAS requires each value-bearing event source to declare the media-buy currency in value_currencies; each buy consumes only exact-currency records and sellers MUST NOT convert them. Absence invokes inheritance or provider automatic delivery; `{automatic:true}` is an explicit authored policy that overrides inheritance. Sellers MUST reject unsupported modes, combinations, units, currency, goal bindings, or native placements before any provider mutation and MUST NOT silently translate semantics.").refine((value) => Object.keys(value).length >= 1, "Object must contain at least 1 property").optional(), "targeting_overlay": z.object({ "geo_countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_countries_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Exclude specific countries from delivery. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_regions": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Restrict delivery to exact canonical ISO 3166-2 subdivisions (states, provinces, regions, departments, or other subdivision categories). Unknown identifiers are invalid. At create or update, sellers MUST reject unsupported identifiers and MUST NOT silently widen, drop, or partially apply the list. During get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome. Exact internal translation preserves accepted identifiers in package readback.").optional(), "geo_regions_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Exclude exact canonical ISO 3166-2 subdivisions. Support is independent from geo_regions inclusion support. Unknown identifiers and values also present in geo_regions are invalid. At create or update, sellers MUST reject unsupported identifiers and partial application; during get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome.").optional(), "geo_metros": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).passthrough().describe("A targeted metro area.")).min(1).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_metros_exclude": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes to exclude within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).passthrough()).min(1).describe("Exclude specific metro areas from delivery. Each entry specifies the classification system and excluded values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).passthrough().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })])).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).passthrough()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Restrict delivery to specific postal areas. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas_exclude": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).passthrough().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })])).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).passthrough()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Exclude specific postal areas from delivery. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_places": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))])).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Restrict delivery to catalog-backed named places. Values MUST be stable identifiers in the declared system, not display names. Sellers must declare supported systems, countries, and place types in get_adcp_capabilities and reject unsupported entries rather than silently dropping them.").optional(), "geo_places_exclude": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))])).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Exclude catalog-backed named places. Uses the same identifier-based shape as geo_places. Sellers MUST reject overlap with geo_places for the same country, system, place_type, and value.").optional(), "daypart_targets": z.array(z.object({ "days": z.array(z.enum(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]).describe("Days of the week for daypart targeting")).min(1).describe("Days of week this window applies to. Use multiple days for compact targeting (e.g., monday-friday in one object)."), "start_hour": z.number().int().gte(0).lte(23).describe("Start hour (inclusive), 0-23 in 24-hour format. 0 = midnight, 6 = 6:00am, 18 = 6:00pm."), "end_hour": z.number().int().gte(1).lte(24).describe("End hour (exclusive), 1-24 in 24-hour format. 10 = 10:00am, 24 = midnight. Must be greater than start_hour."), "timezone": z.union([z.literal("inventory_local"), z.any().refine((value) => !z.literal("inventory_local").safeParse(value).success, "Invalid input: Should NOT be valid against schema").describe("Concrete timezone identifier in the implementation's supported IANA Time Zone Database, such as America/New_York, CET, or UTC.")]).describe("Civil-time clock used to evaluate this window. 'inventory_local' evaluates the hours in the seller-assigned local timezone of each inventory unit that can deliver the impression, such as a screen, venue, station, or publisher property; it never means the buyer, account, or server timezone. A concrete IANA timezone identifier (for example, 'America/New_York', 'CET', or 'UTC') evaluates one shared civil-time clock across the targeted inventory. Omission defaults to 'inventory_local'. Buyers that begin with a user or account preference MUST resolve it to a concrete IANA identifier before sending the daypart; 'user_timezone' and 'account_timezone' are not wire values. For each candidate delivery instant, convert the instant into this clock and compare its resulting local day and hour with the half-open window: a skipped DST hour has no matching instants, while both occurrences of a repeated hour match. This delivery clock is independent of reporting_capabilities.timezone.").default("inventory_local"), "label": z.string().describe("Optional human-readable name for this time window (e.g., 'Morning Drive', 'Prime Time')").optional() }).passthrough().describe("A time window for daypart targeting. Specifies days of week, an hour range, and the civil-time clock used to evaluate it. start_hour is inclusive, end_hour is exclusive (e.g., 6-10 = 6:00am to 10:00am). Follows the Google Ads AdScheduleInfo / DV360 DayPartTargeting pattern.")).min(1).describe("Restrict delivery to specific time windows. Each entry specifies days of week, an hour range, and an optional timezone that defaults to inventory_local. A concrete IANA zone uses one shared civil-time clock, while inventory_local evaluates each inventory unit in its seller-assigned local timezone. Entries are independent and MAY use different clocks.").optional(), "axe_include_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to include for targeting.").optional(), "axe_exclude_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to exclude from targeting.").optional(), "audience_include": z.array(z.string()).min(1).describe("Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities.").optional(), "audience_exclude": z.array(z.string()).min(1).describe("Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities.").optional(), "signal_targeting_groups": z.object({ "operator": z.literal("all").describe("Groups-level operator. Required even though v1 only supports 'all': every child group must be satisfied."), "groups": z.array(z.object({ "operator": z.enum(["any", "none"]).describe("How to evaluate the signals in this group. 'any' is an OR include group. 'none' is an exclusion group equivalent to NOT (A OR B OR C)."), "signals": z.array(z.object({ "pricing_option_id": z.string().describe("Pricing option selected for this signal. Use the pricing_option_id from the product's signal_targeting_options entry when product-scoped pricing is present; otherwise use the seller get_signals pricing only when the product option does not override it. Required when the selected signal has pricing_options; omit only when the signal is bundled into the product price or has no incremental cost.").optional(), "signal_agent_segment_id": z.string().describe("Optional opaque resolved-segment or seller execution handle for this signal. Omit when signal_ref plus the value expression is sufficient for the seller to resolve the signal. Include when the product option exposes a separate runtime or activation handle, and pass it verbatim. Buyers SHOULD prefer an exposed segment handle over reconstructing condition identity from categorical values because the handle can carry provider namespace and methodology distinctions.").optional(), "activation_key": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
14731
+ })).describe('Discriminated reference to a product format option. The global canonical shape is still named by `format_kind`; this reference selects one concrete product `format_options[]` entry. `scope: "publisher"` identifies a publisher-declared catalog option by `{ publisher_domain, format_option_id }`. `scope: "product"` identifies a product-local option by `format_option_id`; the enclosing package/product context supplies the namespace.')).min(1).describe("Canonical format options selected from the published product offer. Legacy named-format identifiers are not accepted.").optional(), "catalog_ids": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Previously synchronized account catalog IDs promoted by this selection. Callers manage catalog bodies through sync_catalogs rather than inlining them here.").optional(), "budget": z.number().gte(0).describe("Hard spend cap for this selection in the media-buy currency. In seller-optimized allocation it is an optional ceiling, not a reserved allocation, and requires advertised media_buy.features.seller_optimized_package_budgets; otherwise rejected with UNSUPPORTED_FEATURE before any over-subscription validation.").optional(), "daily_budget_cap": z.number().gte(0).describe("Optional hard daily spend ceiling for this purchase. It is subordinate to the media-buy aggregate daily cap and is not a reserved daily allocation. Its day boundary is the media buy's budget_cap_timezone.").optional(), "min_spend_target": z.number().gte(0).describe("Soft lifetime spend target for seller-optimized allocation. Requires advertised media_buy.features.seller_optimized_min_spend_targets; otherwise rejected with UNSUPPORTED_FEATURE before any over-subscription validation.").optional(), "impressions": z.number().gte(0).optional(), "start_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "end_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "pacing": z.enum(["even", "asap", "front_loaded"]).describe("Purchase pacing, subordinate to media-buy pacing. In seller-optimized allocation, pacing that differs from the media-buy pacing requires advertised media_buy.features.seller_optimized_package_pacing; otherwise rejected with UNSUPPORTED_FEATURE.").optional(), "bidding": z.object({ "automatic": z.literal(true).describe("Explicitly use seller/provider automatic bidding at this authored scope. At package scope this is a complete override of a media-buy policy, not inheritance. It MUST be the only field in the block and MUST be preserved on readback.").optional(), "bid_amount": z.number().gt(0).describe("Manual auction bid denominated in the media-buy currency and expressed per the selected pricing option's auction unit. For example, a CPM option interprets the amount per thousand impressions. This is the amount submitted to the auction, not a promise that the clearing price equals it. Requires an auction-priced pricing option whose currency equals the media-buy currency.").optional(), "max_bid": z.number().gt(0).describe("Hard per-auction ceiling denominated in the media-buy currency and expressed per the selected pricing option's auction unit. This is the only canonical hard auction ceiling and MUST NOT be translated into an average outcome-cost control. Requires an auction-priced pricing option whose currency equals the media-buy currency. May stand alone or supplement cost_per/roas only when the relevant scope capability advertises that combination.").optional(), "cost_per": z.object({ "amount": z.number().gt(0).describe("Average cost amount per scope-bound primary-goal result, denominated in the media-buy currency."), "strength": z.enum(["cap", "target"]).describe("`cap` optimizes for an average at or below the amount and accepts underdelivery when necessary; `target` optimizes around the amount while balancing volume and spend. Neither is a per-result or per-auction guarantee.") }).passthrough().describe("Average cost control per result of the scope-bound primary optimization goal. At seller-optimized media-buy scope it binds to budget_allocation.optimization_goals; at package scope it binds to that package's optimization_goals; at fixed media-buy scope it binds independently to each inheriting package and is valid only when their primary-goal result units are compatible. Metric goals are compatible only when metric and every result-defining qualifier match; vendor_metric goals only when vendor and metric_id match; event goals only when the event_type/custom_event_name set and resolved attribution_window match. Primary is the earliest array entry among goals tied for the lowest explicit numeric priority; unprioritized goals follow explicitly prioritized goals; when all priorities are absent, the first entry is primary.").optional(), "roas": z.object({ "value": z.number().gt(0).describe("Return per unit of ad spend; 4 means 4 units of value per 1 unit spent."), "strength": z.enum(["floor", "target"]).describe("`floor` prefers underdelivery to knowingly optimizing below the requested return; `target` optimizes around the requested return. Neither guarantees realized return.") }).passthrough().describe("Dimensionless return-on-ad-spend control bound to the same scope-specific primary goal rules as cost_per. The bound goal must be value-bearing; a fixed media-buy default requires a value-bearing primary goal on every inheriting package. Every referenced value-bearing event source MUST declare value_currencies containing the media-buy currency. The seller validates this at buy creation; each buy consumes only exact-currency records, while other declared currencies remain available to other buys. Sellers MUST NOT perform currency conversion.").optional() }).passthrough().and(z.any().refine((value) => !z.union([z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "max_bid": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "cost_per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "roas": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required"), "max_bid": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required"), "cost_per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required"), "roas": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "cost_per": z.any().refine((value2) => value2 !== void 0, "Required"), "roas": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema")).describe("Buyer-authored execution policy for automatic delivery, auction bidding, average outcome cost, or return on ad spend. The containing object determines authored scope: media-buy `bidding` is a complete inherited default and package `bidding` is a complete package override. Sellers MUST preserve authored scope on readback and MUST NOT copy an inherited media-buy policy into package `bidding`. Every monetary field in this block is denominated in the media-buy currency; the selected pricing option supplies the auction unit, never another denomination. Auction-unit identity is the pricing_model plus every canonical billing-event qualifier after defaults are applied: for example CPV view threshold, CPP demographic system/demographic, CPA event tuple, time time_unit, and flat-rate/DOOH parameters. An extension qualifier participates only when its registered extension specification explicitly defines how it contributes to auction-unit identity. A media-buy bid_amount or max_bid is valid only when every inheriting package resolves the same auction-unit identity. Every affected pricing option MUST use the media-buy currency; split currency-mismatched packages into separate buys. Seller-optimized media-buy cost_per/roas bind to the primary budget_allocation.optimization_goals goal. Package-authored cost_per/roas bind to the package primary optimization goal. The primary goal is the earliest array entry among goals with the lowest explicit numeric priority; unprioritized goals follow explicitly prioritized goals; when all priorities are absent, the first entry is primary. In fixed allocation, an inherited media-buy cost_per is valid only when all inheriting packages have compatible primary-goal result units; inherited roas requires value-bearing primary goals on every inheriting package. Canonical ROAS requires each value-bearing event source to declare the media-buy currency in value_currencies; each buy consumes only exact-currency records and sellers MUST NOT convert them. Absence invokes inheritance or provider automatic delivery; `{automatic:true}` is an explicit authored policy that overrides inheritance. Sellers MUST reject unsupported modes, combinations, units, currency, goal bindings, or native placements before any provider mutation and MUST NOT silently translate semantics.").refine((value) => Object.keys(value).length >= 1, "Object must contain at least 1 property").optional(), "targeting_overlay": z.object({ "geo_countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_countries_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Exclude specific countries from delivery. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_regions": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Restrict delivery to exact canonical ISO 3166-2 subdivisions (states, provinces, regions, departments, or other subdivision categories). Unknown identifiers are invalid. At create or update, sellers MUST reject unsupported identifiers and MUST NOT silently widen, drop, or partially apply the list. During get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome. Exact internal translation preserves accepted identifiers in package readback.").optional(), "geo_regions_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Exclude exact canonical ISO 3166-2 subdivisions. Support is independent from geo_regions inclusion support. Unknown identifiers and values also present in geo_regions are invalid. At create or update, sellers MUST reject unsupported identifiers and partial application; during get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome.").optional(), "geo_metros": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).passthrough().describe("A targeted metro area.")).min(1).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_metros_exclude": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes to exclude within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).passthrough()).min(1).describe("Exclude specific metro areas from delivery. Each entry specifies the classification system and excluded values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).passthrough().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })]).describe("Must also satisfy at least one of these alternatives.")).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).passthrough()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Restrict delivery to specific postal areas. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas_exclude": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).passthrough().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })]).describe("Must also satisfy at least one of these alternatives.")).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).passthrough()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Exclude specific postal areas from delivery. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_places": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Restrict delivery to catalog-backed named places. Values MUST be stable identifiers in the declared system, not display names. Sellers must declare supported systems, countries, and place types in get_adcp_capabilities and reject unsupported entries rather than silently dropping them.").optional(), "geo_places_exclude": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Exclude catalog-backed named places. Uses the same identifier-based shape as geo_places. Sellers MUST reject overlap with geo_places for the same country, system, place_type, and value.").optional(), "daypart_targets": z.array(z.object({ "days": z.array(z.enum(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]).describe("Days of the week for daypart targeting")).min(1).describe("Days of week this window applies to. Use multiple days for compact targeting (e.g., monday-friday in one object)."), "start_hour": z.number().int().gte(0).lte(23).describe("Start hour (inclusive), 0-23 in 24-hour format. 0 = midnight, 6 = 6:00am, 18 = 6:00pm."), "end_hour": z.number().int().gte(1).lte(24).describe("End hour (exclusive), 1-24 in 24-hour format. 10 = 10:00am, 24 = midnight. Must be greater than start_hour."), "timezone": z.union([z.literal("inventory_local"), z.any().refine((value) => !z.literal("inventory_local").safeParse(value).success, "Invalid input: Should NOT be valid against schema").describe("Concrete timezone identifier in the implementation's supported IANA Time Zone Database, such as America/New_York, CET, or UTC.")]).describe("Civil-time clock used to evaluate this window. 'inventory_local' evaluates the hours in the seller-assigned local timezone of each inventory unit that can deliver the impression, such as a screen, venue, station, or publisher property; it never means the buyer, account, or server timezone. A concrete IANA timezone identifier (for example, 'America/New_York', 'CET', or 'UTC') evaluates one shared civil-time clock across the targeted inventory. Omission defaults to 'inventory_local'. Buyers that begin with a user or account preference MUST resolve it to a concrete IANA identifier before sending the daypart; 'user_timezone' and 'account_timezone' are not wire values. For each candidate delivery instant, convert the instant into this clock and compare its resulting local day and hour with the half-open window: a skipped DST hour has no matching instants, while both occurrences of a repeated hour match. This delivery clock is independent of reporting_capabilities.timezone.").default("inventory_local"), "label": z.string().describe("Optional human-readable name for this time window (e.g., 'Morning Drive', 'Prime Time')").optional() }).passthrough().describe("A time window for daypart targeting. Specifies days of week, an hour range, and the civil-time clock used to evaluate it. start_hour is inclusive, end_hour is exclusive (e.g., 6-10 = 6:00am to 10:00am). Follows the Google Ads AdScheduleInfo / DV360 DayPartTargeting pattern.")).min(1).describe("Restrict delivery to specific time windows. Each entry specifies days of week, an hour range, and an optional timezone that defaults to inventory_local. A concrete IANA zone uses one shared civil-time clock, while inventory_local evaluates each inventory unit in its seller-assigned local timezone. Entries are independent and MAY use different clocks.").optional(), "axe_include_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to include for targeting.").optional(), "axe_exclude_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to exclude from targeting.").optional(), "audience_include": z.array(z.string()).min(1).describe("Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities.").optional(), "audience_exclude": z.array(z.string()).min(1).describe("Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities.").optional(), "signal_targeting_groups": z.object({ "operator": z.literal("all").describe("Groups-level operator. Required even though v1 only supports 'all': every child group must be satisfied."), "groups": z.array(z.object({ "operator": z.enum(["any", "none"]).describe("How to evaluate the signals in this group. 'any' is an OR include group. 'none' is an exclusion group equivalent to NOT (A OR B OR C)."), "signals": z.array(z.object({ "pricing_option_id": z.string().describe("Pricing option selected for this signal. Use the pricing_option_id from the product's signal_targeting_options entry when product-scoped pricing is present; otherwise use the seller get_signals pricing only when the product option does not override it. Required when the selected signal has pricing_options; omit only when the signal is bundled into the product price or has no incremental cost.").optional(), "signal_agent_segment_id": z.string().describe("Optional opaque resolved-segment or seller execution handle for this signal. Omit when signal_ref plus the value expression is sufficient for the seller to resolve the signal. Include when the product option exposes a separate runtime or activation handle, and pass it verbatim. Buyers SHOULD prefer an exposed segment handle over reconstructing condition identity from categorical values because the handle can carry provider namespace and methodology distinctions.").optional(), "activation_key": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
14732
14732
  const schemas = [z.object({ "type": z.literal("segment_id").describe("Segment ID based targeting"), "segment_id": z.string().describe("The platform-specific segment identifier to use in campaign targeting") }).catchall(z.any()), z.object({ "type": z.literal("key_value").describe("Key-value pair based targeting"), "key": z.string().describe("The targeting parameter key"), "value": z.string().describe("The targeting parameter value") }).catchall(z.any())];
14733
14733
  const { errors, failed } = schemas.reduce(
14734
14734
  ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
@@ -14829,7 +14829,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
14829
14829
  message: "Invalid input: Should pass single schema. Passed " + passed2
14830
14830
  });
14831
14831
  }
14832
- }).describe("Named signal being targeted."), "value_type": z.literal("numeric").describe("Discriminator for numeric signals."), "min_value": z.number().describe("Minimum value, inclusive. Omit for no minimum. Should be within the signal definition's range when declared.").optional(), "max_value": z.number().describe("Maximum value, inclusive. Omit for no maximum. Should be within the signal definition's range when declared.").optional() }).catchall(z.any()).and(z.union([z.object({ "min_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Numeric signal expression - target users within a value range. At least one of min_value or max_value is required. If both min_value and max_value are provided, min_value MUST be <= max_value.")];
14832
+ }).describe("Named signal being targeted."), "value_type": z.literal("numeric").describe("Discriminator for numeric signals."), "min_value": z.number().describe("Minimum value, inclusive. Omit for no minimum. Should be within the signal definition's range when declared.").optional(), "max_value": z.number().describe("Maximum value, inclusive. Omit for no maximum. Should be within the signal definition's range when declared.").optional() }).catchall(z.any()).and(z.union([z.object({ "min_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Numeric signal expression - target users within a value range. At least one of min_value or max_value is required. If both min_value and max_value are provided, min_value MUST be <= max_value.")];
14833
14833
  const { errors, failed } = schemas.reduce(
14834
14834
  ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
14835
14835
  errors: [...errors2, ...result.error.issues],
@@ -14904,7 +14904,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
14904
14904
  message: "Invalid input: Should pass single schema. Passed " + passed2
14905
14905
  });
14906
14906
  }
14907
- }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("binary").describe("Discriminator for binary signals"), "value": z.boolean().describe("Whether to include (true) or exclude (false) users matching this signal") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Binary signal targeting - user either matches or doesn't"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
14907
+ }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("binary").describe("Discriminator for binary signals"), "value": z.boolean().describe("Whether to include (true) or exclude (false) users matching this signal") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Binary signal targeting - user either matches or doesn't"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
14908
14908
  const schemas2 = [z.object({ "scope": z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Product-local signal identifier. For local signals exposed on both get_signals and get_products, this MUST match get_signals.signals[].signal_ref.signal_id for the same signal.") }).catchall(z.any()).describe("Product-scoped signal. The signal_id is meaningful only within the selected product/package context and MUST match a Product.included_signals[].signal_ref.signal_id or Product.signal_targeting_options[].signal_ref.signal_id for that product, depending on whether the signal is descriptive or selectable."), z.object({ "scope": z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that publishes the signal definition in its adagents.json signals[]."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(z.any()).describe("Data-provider-scoped signal. The signal_id resolves through the data provider's published adagents.json signals[] and can be authorization-verified there."), z.object({ "scope": z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(z.any()).describe("Signal-source-scoped signal. Use this for source-native signals that are not published in upstream adagents.json signals[]. The buyer trusts the issuing signal source for this identity; use scope 'data_provider' instead when the signal is published in adagents.json signals[], even if the publisher is also the seller or signal source.")];
14909
14909
  const { errors: errors2, failed: failed2 } = schemas2.reduce(
14910
14910
  ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
@@ -14954,7 +14954,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
14954
14954
  message: "Invalid input: Should pass single schema. Passed " + passed2
14955
14955
  });
14956
14956
  }
14957
- }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("categorical").describe("Discriminator for categorical signals"), "values": z.array(z.string()).min(1).describe("Values to target. Users with any of these values will be included.") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Categorical signal targeting - target users with specific values"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
14957
+ }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("categorical").describe("Discriminator for categorical signals"), "values": z.array(z.string()).min(1).describe("Values to target. Users with any of these values will be included.") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Categorical signal targeting - target users with specific values"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
14958
14958
  const schemas2 = [z.object({ "scope": z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Product-local signal identifier. For local signals exposed on both get_signals and get_products, this MUST match get_signals.signals[].signal_ref.signal_id for the same signal.") }).catchall(z.any()).describe("Product-scoped signal. The signal_id is meaningful only within the selected product/package context and MUST match a Product.included_signals[].signal_ref.signal_id or Product.signal_targeting_options[].signal_ref.signal_id for that product, depending on whether the signal is descriptive or selectable."), z.object({ "scope": z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that publishes the signal definition in its adagents.json signals[]."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(z.any()).describe("Data-provider-scoped signal. The signal_id resolves through the data provider's published adagents.json signals[] and can be authorization-verified there."), z.object({ "scope": z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(z.any()).describe("Signal-source-scoped signal. Use this for source-native signals that are not published in upstream adagents.json signals[]. The buyer trusts the issuing signal source for this identity; use scope 'data_provider' instead when the signal is published in adagents.json signals[], even if the publisher is also the seller or signal source.")];
14959
14959
  const { errors: errors2, failed: failed2 } = schemas2.reduce(
14960
14960
  ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
@@ -15004,7 +15004,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
15004
15004
  message: "Invalid input: Should pass single schema. Passed " + passed2
15005
15005
  });
15006
15006
  }
15007
- }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("numeric").describe("Discriminator for numeric signals"), "min_value": z.number().describe("Minimum value (inclusive). Omit for no minimum. Must be <= max_value when both are provided. Should be >= signal's range.min if defined.").optional(), "max_value": z.number().describe("Maximum value (inclusive). Omit for no maximum. Must be >= min_value when both are provided. Should be <= signal's range.max if defined.").optional() }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Numeric signal targeting - target users within a value range. If min_value is provided, it must be <= max_value. Values should be within the signal's defined range (see signal definition).")];
15007
+ }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("numeric").describe("Discriminator for numeric signals"), "min_value": z.number().describe("Minimum value (inclusive). Omit for no minimum. Must be <= max_value when both are provided. Should be >= signal's range.min if defined.").optional(), "max_value": z.number().describe("Maximum value (inclusive). Omit for no maximum. Must be >= min_value when both are provided. Should be <= signal's range.max if defined.").optional() }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Numeric signal targeting - target users within a value range. If min_value is provided, it must be <= max_value. Values should be within the signal's defined range (see signal definition).")];
15008
15008
  const { errors, failed } = schemas.reduce(
15009
15009
  ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
15010
15010
  errors: [...errors2, ...result.error.issues],
@@ -15028,7 +15028,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
15028
15028
  message: "Invalid input: Should pass single schema. Passed " + passed
15029
15029
  });
15030
15030
  }
15031
- }).describe("Targeting constraint for a specific signal. Uses value_type as discriminator to determine the targeting expression format.")).min(1).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.").optional(), "demographics": z.object({ "age": z.intersection(z.object({ "min": z.number().int().gte(0).lte(150).describe("Inclusive minimum age in completed years. Omit for an open lower bound.").optional(), "max": z.number().int().gte(0).lte(150).describe("Inclusive maximum age in completed years. Omit for an open upper bound.").optional(), "include_unknown": z.boolean().describe("Whether delivery to people whose age is unavailable is part of this predicate. This field has no default and MUST be supplied.") }).catchall(z.any()).and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A canonical audience-age predicate in completed integer years. min and max are inclusive; omitting one bound means no restriction in that direction. At least one bound is required. include_unknown is always explicit because people whose age is unavailable are not members of any numeric interval. Implementations MUST reject min greater than max; JSON Schema draft-07 cannot compare sibling numeric values."), z.object({ "accepted_bases": z.array(z.enum(["verified", "declared", "inferred"]).describe("User-level bases that may resolve age for demographic targeting execution. Population estimates are deliberately absent because aggregate composition cannot establish an individual impression's age.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("User-level age determination bases the buyer permits for this predicate. Sellers MUST use only these bases or reject the request; they MUST NOT silently fall back to another basis. When omitted, the buyer imposes no determination-basis constraint beyond product capability and any age_restriction. population_estimate is structurally unavailable because aggregate evidence cannot identify an eligible user.").optional(), "accepted_verification_methods": z.array(z.enum(["facial_age_estimation", "id_document", "digital_id", "credit_card", "world_id"]).describe("Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Verification methods acceptable when verified is an accepted basis. This field narrows verified demographic execution; age_restriction.accepted_methods independently governs legal eligibility and the two sets are intersected when both are present.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "accepted_verification_methods": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "accepted_verification_methods": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "accepted_bases": z.any().refine((value) => !z.array(z.any().refine((value2) => !z.literal("verified").safeParse(value2).success, "Invalid input: Should NOT be valid against schema")).safeParse(value).success, "Invalid input: Should NOT be valid against schema") }))]))) }).catchall(z.any()).describe("Canonical demographic audience targeting intent with optional constraints on how age may be determined. This is distinct from age_restriction: demographics selects an audience, while age_restriction expresses a legal eligibility or verification floor. Fresh create/update targeting MUST compile exactly or be rejected. During get_products, a seller may offer a different configured predicate only through sparse targeting_resolution modifications on a distinguishable product_id; selecting that product accepts the alternative. Sellers never silently broaden, narrow, default, drop, or substitute the basis.").optional(), "frequency_cap": z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2.").optional(), "property_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a property list for targeting specific properties within this product. The package runs on the intersection of the product's publisher_properties and this list. Sellers SHOULD return a validation error if the product has property_targeting_allowed: false.").optional(), "property_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a property list whose properties must not carry the buyer's ads. Matched properties are removed from delivery. Use for brand-safety do-not-run lists (apps, sites). Exclude wins on overlap with property_list, and applies regardless of the product's property_targeting_allowed flag. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a collection list for including specific collections (programs, publications, channels) within this product. The package runs on the intersection of matched collections and this list. Use for inclusion-based collection targeting. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a collection list for excluding specific collections (programs, publications, channels) from this product. Matched collections must not carry the buyer's ads. Use for brand safety do-not-air lists. Seller must declare support in get_adcp_capabilities.").optional(), "placement_selection": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
15031
+ }).describe("Targeting constraint for a specific signal. Uses value_type as discriminator to determine the targeting expression format.")).min(1).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.").optional(), "demographics": z.object({ "age": z.intersection(z.object({ "min": z.number().int().gte(0).lte(150).describe("Inclusive minimum age in completed years. Omit for an open lower bound.").optional(), "max": z.number().int().gte(0).lte(150).describe("Inclusive maximum age in completed years. Omit for an open upper bound.").optional(), "include_unknown": z.boolean().describe("Whether delivery to people whose age is unavailable is part of this predicate. This field has no default and MUST be supplied.") }).catchall(z.any()).and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A canonical audience-age predicate in completed integer years. min and max are inclusive; omitting one bound means no restriction in that direction. At least one bound is required. include_unknown is always explicit because people whose age is unavailable are not members of any numeric interval. Implementations MUST reject min greater than max; JSON Schema draft-07 cannot compare sibling numeric values."), z.object({ "accepted_bases": z.array(z.enum(["verified", "declared", "inferred"]).describe("User-level bases that may resolve age for demographic targeting execution. Population estimates are deliberately absent because aggregate composition cannot establish an individual impression's age.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("User-level age determination bases the buyer permits for this predicate. Sellers MUST use only these bases or reject the request; they MUST NOT silently fall back to another basis. When omitted, the buyer imposes no determination-basis constraint beyond product capability and any age_restriction. population_estimate is structurally unavailable because aggregate evidence cannot identify an eligible user.").optional(), "accepted_verification_methods": z.array(z.enum(["facial_age_estimation", "id_document", "digital_id", "credit_card", "world_id"]).describe("Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Verification methods acceptable when verified is an accepted basis. This field narrows verified demographic execution; age_restriction.accepted_methods independently governs legal eligibility and the two sets are intersected when both are present.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "accepted_verification_methods": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "accepted_verification_methods": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "accepted_bases": z.any().refine((value) => !z.array(z.any().refine((value2) => !z.literal("verified").safeParse(value2).success, "Invalid input: Should NOT be valid against schema")).safeParse(value).success, "Invalid input: Should NOT be valid against schema") }))]).describe("Must also satisfy at least one of these alternatives."))) }).catchall(z.any()).describe("Canonical demographic audience targeting intent with optional constraints on how age may be determined. This is distinct from age_restriction: demographics selects an audience, while age_restriction expresses a legal eligibility or verification floor. Fresh create/update targeting MUST compile exactly or be rejected. During get_products, a seller may offer a different configured predicate only through sparse targeting_resolution modifications on a distinguishable product_id; selecting that product accepts the alternative. Sellers never silently broaden, narrow, default, drop, or substitute the basis.").optional(), "frequency_cap": z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2.").optional(), "property_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a property list for targeting specific properties within this product. The package runs on the intersection of the product's publisher_properties and this list. Sellers SHOULD return a validation error if the product has property_targeting_allowed: false.").optional(), "property_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a property list whose properties must not carry the buyer's ads. Matched properties are removed from delivery. Use for brand-safety do-not-run lists (apps, sites). Exclude wins on overlap with property_list, and applies regardless of the product's property_targeting_allowed flag. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a collection list for including specific collections (programs, publications, channels) within this product. The package runs on the intersection of matched collections and this list. Use for inclusion-based collection targeting. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a collection list for excluding specific collections (programs, publications, channels) from this product. Matched collections must not carry the buyer's ads. Use for brand safety do-not-air lists. Seller must declare support in get_adcp_capabilities.").optional(), "placement_selection": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
15032
15032
  const schemas = [z.object({ "mode": z.literal("selected"), "placement_refs": z.array(z.union([z.intersection(z.object({ "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring a publisher-catalog placement is hosted, or the inventory publisher associated with an inline placement. Omitted only for legacy single-publisher product-context references.").optional(), "placement_id": z.string().describe("Placement ID from the publisher's adagents.json placement catalog, or an inline seller-defined placement ID interpreted within the enclosing seller and product context.") }).catchall(z.any()).describe("Legacy-compatible product-context reference to a placement. For publisher-catalog placements, publisher_domain plus placement_id resolves the declaration in that publisher's adagents.json. For seller-inline placements, the enclosing seller and product supply scope. When publisher_domain is omitted on legacy inputs, receivers MAY interpret the ID relative to the enclosing single-publisher product. Use placement-identity.json when a self-contained cross-document identity is required."), z.object({ "publisher_domain": z.any().refine((value) => value !== void 0, "Required") }).passthrough()), z.any().superRefine((x2, ctx2) => {
15033
15033
  const schemas2 = [z.object({ "kind": z.literal("publisher_ref"), "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain whose adagents.json declares placement_id."), "placement_id": z.string().min(1) }).passthrough(), z.object({ "kind": z.literal("seller_inline"), "seller_agent": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("The seller agent's API endpoint URL as declared in the property publisher's adagents.json `authorized_agents[].url`. MUST use the `https://` scheme. Receivers compare this URL against the `authorized_agents` list using the AdCP URL canonicalization rules \u2014 not byte-equality \u2014 and reject mismatches with `seller_not_authorized`. See docs/reference/url-canonicalization."), "id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).min(1).describe("Reserved for a future registry-assigned stable seller identifier. Not used today \u2014 senders MUST NOT populate this field until a registry is defined. When a future release populates both `agent_url` and `id`, `agent_url` remains authoritative and `id` is advisory.").optional() }).passthrough().describe("Sales agent that defines and maintains the inline placement namespace."), "placement_id": z.string().min(1).describe("Stable placement ID within the defining sales agent's namespace. The agent MUST NOT reuse it for a different semantic placement.") }).passthrough()];
15034
15034
  const { errors: errors2, failed: failed2 } = schemas2.reduce(
@@ -15129,7 +15129,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
15129
15129
  });
15130
15130
  }
15131
15131
  }))).min(1).describe("Target users within travel time, distance, or a custom boundary around arbitrary geographic points. Multiple entries use OR semantics \u2014 a user within range of any listed point is eligible. For campaigns targeting 10+ locations, consider using store_catchments with a location catalog instead. Seller must declare support in get_adcp_capabilities.").optional(), "language": z.array(z.string().regex(new RegExp("^(?:[a-z]{2,8}(?:-[A-Z][a-z]{3})?(?:-(?:[A-Z]{2}|[0-9]{3}))?(?:-(?:[a-z0-9]{5,8}|[0-9][a-z0-9]{3}))*(?:-[0-9a-wy-z](?:-[a-z0-9]{2,8})+)*(?:-x(?:-[a-z0-9]{1,8})+)?|x(?:-[a-z0-9]{1,8})+)$")).min(2).max(63).describe("A well-formed BCP 47 language tag used by AdCP only as language identity. Script and region may refine that identity; other valid BCP 47 subtags remain part of tag matching but do not make this a general locale-settings object. It does not determine currency, time zone, number/date formatting, market, or legal jurisdiction. The AdCP canonical wire profile requires lower-case language and variants, title-case script, and upper-case region (for example `en-US`, `zh-Hant-TW`, or `x-private`). RFC 5646 comparisons are case-insensitive and its case regularization is optional; AdCP intentionally requires this stricter single wire spelling and receivers MUST reject differently cased tags rather than silently normalizing them. The schema pattern enforces the AdCP casing profile and extension structure for commonly used tags; conforming receivers additionally validate the complete RFC 5646 grammar and registry rules. Every new AdCP field carrying BCP 47 language identity or a concrete language range MUST reference this schema instead of declaring independent string constraints.")).min(1).describe("Restrict to users with specific language preferences using canonical BCP 47 language ranges. Each buyer range is evaluated against a user's language-preference tag with RFC 4647 section 3.3.1 Basic Filtering: 'fr' matches 'fr', 'fr-CA', and 'fr-FR', while 'fr-CA' matches 'fr-CA' and more-specific descendants but not 'fr' or 'fr-FR'. Values use OR logic.").optional(), "keyword_targets": z.array(z.object({ "keyword": z.string().min(1).describe("The keyword to target"), "match_type": z.enum(["broad", "phrase", "exact"]).describe("Keyword targeting match type. broad: ads may serve on queries semantically related to the keyword. phrase: ads serve when the query contains the keyword phrase. exact: ads serve only when the query matches the keyword exactly."), "bid_price": z.number().gte(0).describe("Per-keyword bid price, denominated in the same currency as the package's pricing option. Overrides the package-level bid_price for this keyword. Inherits the max_bid interpretation from the pricing option: when max_bid is true, this is the keyword's bid ceiling; when false, this is the exact bid. If omitted, the package bid_price applies.").optional() }).passthrough()).min(1).describe("Keyword targeting for search and retail media platforms. Restricts delivery to queries matching the specified keywords. Each keyword is identified by the tuple (keyword, match_type) \u2014 the same keyword string with different match types are distinct targets. Sellers SHOULD reject duplicate (keyword, match_type) pairs within a single request. Seller must declare support in get_adcp_capabilities.").optional(), "negative_keywords": z.array(z.object({ "keyword": z.string().min(1).describe("The keyword to exclude"), "match_type": z.enum(["broad", "phrase", "exact"]).describe("Keyword targeting match type. broad: ads may serve on queries semantically related to the keyword. phrase: ads serve when the query contains the keyword phrase. exact: ads serve only when the query matches the keyword exactly.") }).passthrough().describe("An excluded keyword.")).min(1).describe("Keywords to exclude from delivery. Queries matching these keywords will not trigger the ad. Each negative keyword is identified by the tuple (keyword, match_type). Seller must declare support in get_adcp_capabilities.").optional() }).catchall(z.any()).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "demographics": z.any().refine((value2) => value2 !== void 0, "Required"), "age_restriction": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "demographics": z.any().refine((value) => value !== void 0, "Required"), "age_restriction": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "demographics": z.object({ "age": z.object({ "include_unknown": z.literal(false).optional() }).optional() }).optional() }))]).describe("Unknown-age delivery cannot satisfy a minimum-age eligibility policy. When demographic audience targeting and age_restriction are both present, include_unknown must be false."), z.union([z.any().refine((value) => !z.object({ "age_restriction": z.object({ "verification_required": z.literal(true) }), "demographics": z.object({ "age": z.object({ "accepted_bases": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough() }) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "age_restriction": z.object({ "verification_required": z.literal(true) }), "demographics": z.object({ "age": z.object({ "accepted_bases": z.any().refine((value) => value !== void 0, "Required") }).passthrough() }) }), z.object({ "demographics": z.object({ "age": z.object({ "accepted_bases": z.any().refine((value) => !z.array(z.any().refine((value2) => !z.literal("verified").safeParse(value2).success, "Invalid input: Should NOT be valid against schema")).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional() }).optional() }).optional() }))]).describe("A legal verification requirement always narrows demographic targeting. When the buyer supplies accepted_bases and age_restriction requires verification, verified must be accepted; otherwise the constraints have an empty intersection and the request is invalid."))).describe("Resolved effective buyer-selected targeting, including compatible wholesale signal selections, applied within the product's published targeting contract. Cleared dimensions are omitted; null is invalid in an accepted snapshot.").optional(), "optimization_goals": z.array(z.any().superRefine((x, ctx) => {
15132
- const schemas = [z.object({ "kind": z.literal("metric"), "metric": z.enum(["clicks", "views", "completed_views", "viewed_seconds", "viewable_rate", "engagements", "follows", "saves", "profile_visits", "reach"]), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional(), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.").optional(), "reach_unit": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").optional(), "target_frequency": z.object({ "min": z.number().int().gte(1).optional(), "max": z.number().int().gte(1).optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.") }).passthrough().and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).optional(), "view_duration_seconds": z.number().gt(0).optional(), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough().and(z.intersection(z.union([z.any().refine((value) => !z.object({ "metric": z.literal("viewable_rate") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "metric": z.literal("viewable_rate") }), z.object({ "target": z.object({ "value": z.any().optional() }).optional() }))]), z.any())), z.object({ "kind": z.literal("event"), "event_sources": z.array(z.object({ "event_source_id": z.string().min(1), "event_type": z.enum(["page_view", "view_content", "select_content", "select_item", "search", "share", "add_to_cart", "remove_from_cart", "viewed_cart", "add_to_wishlist", "initiate_checkout", "add_payment_info", "purchase", "refund", "lead", "qualify_lead", "close_convert_lead", "disqualify_lead", "complete_registration", "subscribe", "follow", "content_view", "watch_milestone", "start_trial", "app_install", "app_launch", "contact", "schedule", "donate", "submit_application", "custom"]).describe("Standard marketing event types for event logging, aligned with IAB ECAPI"), "custom_event_name": z.string().min(1).optional(), "value_field": z.string().min(1).optional(), "value_factor": z.number().default(1) }).passthrough()).min(1), "target": z.object({ "kind": z.literal("maximize_value") }).passthrough().optional(), "attribution_window": z.object({ "post_click": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-click attribution window. Conversions occurring within this duration after a click are attributed to the ad.").optional(), "post_view": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-view attribution window. Conversions occurring within this duration after an ad impression (without click) are attributed to the ad.").optional(), "model": z.enum(["last_touch", "first_touch", "linear", "time_decay", "data_driven"]).describe("Attribution model used to assign credit when multiple touchpoints exist. SHOULD be populated when committing to a specific model; when absent, the seller's default applies.").optional() }).catchall(z.any()).describe("Describes the attribution methodology and lookback windows used for conversion measurement. Enables cross-platform comparison by making attribution methodology transparent. Used as a `$ref` from `optimization-goal.json` (buyer's optimization-time attribution choice), `get-media-buy-delivery-response.json` (seller-declared attribution methodology in delivery reports), and similar surfaces. All fields are optional individually but at least one of `post_click`, `post_view`, or `model` SHOULD be populated; absence of `model` means the seller's default attribution model applies (typically `last_touch` per industry convention) \u2014 sellers SHOULD populate `model` explicitly when committing to a specific methodology.").optional(), "priority": z.number().int().gte(1).optional() }).passthrough(), z.object({ "kind": z.literal("vendor_metric"), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "metric_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).min(1).max(64).describe("Identifier for a vendor-defined metric within the vendor's vocabulary. Stable lookup key; the vendor publishes the canonical list (with category, methodology, and standard alignment) in `brand.json` `agents[type='measurement']`. Lowercase with underscores so a future enum promotion into `available-metric.json` is a literal string lift. Identifier is namespaced by the vendor \u2014 the same `metric_id` may mean different things in different vendors' vocabularies."), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough()];
15132
+ const schemas = [z.object({ "kind": z.literal("metric"), "metric": z.enum(["clicks", "views", "completed_views", "viewed_seconds", "viewable_rate", "engagements", "follows", "saves", "profile_visits", "reach"]), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional(), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.").optional(), "reach_unit": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").optional(), "target_frequency": z.object({ "min": z.number().int().gte(1).optional(), "max": z.number().int().gte(1).optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.") }).passthrough().and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).optional(), "view_duration_seconds": z.number().gt(0).optional(), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough().and(z.intersection(z.union([z.any().refine((value) => !z.object({ "metric": z.literal("viewable_rate") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "metric": z.literal("viewable_rate") }), z.object({ "target": z.object({ "value": z.any().optional() }).optional() }))]), z.any())), z.object({ "kind": z.literal("event"), "event_sources": z.array(z.object({ "event_source_id": z.string().min(1), "event_type": z.enum(["page_view", "view_content", "select_content", "select_item", "search", "share", "add_to_cart", "remove_from_cart", "viewed_cart", "add_to_wishlist", "initiate_checkout", "add_payment_info", "purchase", "refund", "lead", "qualify_lead", "close_convert_lead", "disqualify_lead", "complete_registration", "subscribe", "follow", "content_view", "watch_milestone", "start_trial", "app_install", "app_launch", "contact", "schedule", "donate", "submit_application", "custom"]).describe("Standard marketing event types for event logging, aligned with IAB ECAPI"), "custom_event_name": z.string().min(1).optional(), "value_field": z.string().min(1).optional(), "value_factor": z.number().default(1) }).passthrough()).min(1), "target": z.object({ "kind": z.literal("maximize_value") }).passthrough().optional(), "attribution_window": z.object({ "post_click": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-click attribution window. Conversions occurring within this duration after a click are attributed to the ad.").optional(), "post_view": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-view attribution window. Conversions occurring within this duration after an ad impression (without click) are attributed to the ad.").optional(), "model": z.enum(["last_touch", "first_touch", "linear", "time_decay", "data_driven"]).describe("Attribution model used to assign credit when multiple touchpoints exist. SHOULD be populated when committing to a specific model; when absent, the seller's default applies.").optional() }).catchall(z.any()).describe("Describes the attribution methodology and lookback windows used for conversion measurement. Enables cross-platform comparison by making attribution methodology transparent. Used as a `$ref` from `optimization-goal.json` (buyer's optimization-time attribution choice), `get-media-buy-delivery-response.json` (seller-declared attribution methodology in delivery reports), and similar surfaces. All fields are optional individually but at least one of `post_click`, `post_view`, or `model` SHOULD be populated; absence of `model` means the seller's default attribution model applies (typically `last_touch` per industry convention) \u2014 sellers SHOULD populate `model` explicitly when committing to a specific methodology.").optional(), "priority": z.number().int().gte(1).optional() }).passthrough(), z.object({ "kind": z.literal("vendor_metric"), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "metric_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).min(1).max(64).describe("Identifier for a vendor-defined metric within the vendor's vocabulary. Stable lookup key; the vendor publishes the canonical list (with category, methodology, and standard alignment) in `brand.json` `agents[type='measurement']`. Lowercase with underscores so a future enum promotion into `available-metric.json` is a literal string lift. Identifier is namespaced by the vendor \u2014 the same `metric_id` may mean different things in different vendors' vocabularies."), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough()];
15133
15133
  const { errors, failed } = schemas.reduce(
15134
15134
  ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
15135
15135
  errors: [...errors2, ...result.error.issues],
@@ -15178,7 +15178,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
15178
15178
  message: "Invalid input: Should pass single schema. Passed " + passed
15179
15179
  });
15180
15180
  }
15181
- })).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").optional(), "accepted_attestation_claim_types": z.array(z.string().refine(adcpJsonSchemaUri, "Invalid URI")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.object({ "independent_attestation_required": z.literal(true) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "independent_attestation_required": z.literal(true) }), z.object({ "accepted_attestation_issuers": z.any().refine((value) => value !== void 0, "Required") }).passthrough())])).describe("Buyer evidence-admissibility policy carried into the accepted purchase snapshot.").optional(), "audience_evidence_pins": z.array(z.object({ "evidence_id": z.string().min(1), "snapshot_id": z.string().min(1), "version": z.string().min(1), "content_digest": z.string().regex(new RegExp("^sha256:[a-f0-9]{64}$")), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().describe("Buyer-authored pin to one exact immutable audience-evidence snapshot selected during discovery. Sellers MUST match all four fields against a single published snapshot; they MUST reject the package rather than substitute a newer version or reuse snapshot_id with changed content. A confirmed package MUST return the same identity in audience_evidence_selections with decision_use package_construction.")).min(1).describe("Exact immutable audience-evidence snapshots selected for package construction.").optional(), "agency_estimate_number": z.string().max(100).describe("Package-level agency estimate or authorization reference.").optional(), "context": z.record(z.string(), z.any()).describe("Opaque buyer package correlation preserved in the accepted snapshot and readback.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional(), "measurement_terms": z.object({ "billing_measurement": z.object({ "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "max_variance_percent": z.number().gte(0).lt(100).optional(), "measurement_window": z.string().min(1).optional(), "finalization_deadline_hours": z.number().int().gte(0).optional() }).passthrough().optional(), "makegood_policy": z.object({ "available_remedies": z.array(z.enum(["additional_delivery", "credit", "invoice_adjustment"]).describe("Remedy types available when a performance standard or billing measurement threshold is breached.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!") }).passthrough().optional() }).passthrough().describe("Published or negotiated billing-measurement and makegood terms for this purchase. Direct buyers may omit this to inherit the product default; accepted proposal snapshots preserve the resolved terms.").optional(), "performance_standards": z.array(z.object({ "metric": z.enum(["viewability", "ivt", "completion_rate", "brand_safety", "attention_score"]).describe("Performance metrics that support rate thresholds on media buys \u2014 the verification subset of the broader metric vocabulary. Each metric specifies whether its threshold is a floor (must exceed) or ceiling (must not exceed). Shared values with `available-metric.json` mirror the delivery vocabulary (`viewability` \u2192 `viewable_rate` family, `completion_rate` \u2192 same name); verification-only values (`ivt`, `brand_safety`, `attention_score`) are typically vendor-attested and do not appear in `available-metric.json` because they're not seller-reportable scalars \u2014 they flow through `vendor_metric_values` or vendor-scope `committed_metrics` entries with the matching `performance_standard.vendor` BrandRef anchoring identity."), "threshold": z.number().gte(0).lte(1), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional(), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.") }).passthrough().describe("Compact committed metric threshold with resolvable vendor identity and no creative or brand-asset graph.")).min(1).describe("Published or negotiated metric thresholds and measurement vendors. Direct buyers may omit this to inherit the product defaults; accepted proposal snapshots preserve every applicable standard.").optional() }).passthrough().describe("One resolved canonical product selection in a compact proposal or accepted commercial snapshot. Request-side buy_products selections use product-purchase-input.json. This strict snapshot shape contains effective non-null targeting and resolved inherited terms. Creative content and creative assignments are intentionally absent."), z.object({ "product_id": z.any().refine((value) => value !== void 0, "Required"), "pricing_option_id": z.any().refine((value) => value !== void 0, "Required"), "pricing": z.any().refine((value) => value !== void 0, "Required"), "start_time": z.any().refine((value) => value !== void 0, "Required"), "end_time": z.any().refine((value) => value !== void 0, "Required") }).passthrough())).min(1).describe("Exact canonical product, pricing, format, catalog, budget, targeting, bidding, optimization, resolved flight, measurement, and performance terms in the commercial envelope."), "start_time": z.any().superRefine((x, ctx) => {
15181
+ })).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").optional(), "accepted_attestation_claim_types": z.array(z.string().refine(adcpJsonSchemaUri, "Invalid URI")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.object({ "independent_attestation_required": z.literal(true) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "independent_attestation_required": z.literal(true) }), z.object({ "accepted_attestation_issuers": z.any().refine((value) => value !== void 0, "Required") }).passthrough())]).describe("Must also satisfy at least one of these alternatives.")).describe("Buyer evidence-admissibility policy carried into the accepted purchase snapshot.").optional(), "audience_evidence_pins": z.array(z.object({ "evidence_id": z.string().min(1), "snapshot_id": z.string().min(1), "version": z.string().min(1), "content_digest": z.string().regex(new RegExp("^sha256:[a-f0-9]{64}$")), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().describe("Buyer-authored pin to one exact immutable audience-evidence snapshot selected during discovery. Sellers MUST match all four fields against a single published snapshot; they MUST reject the package rather than substitute a newer version or reuse snapshot_id with changed content. A confirmed package MUST return the same identity in audience_evidence_selections with decision_use package_construction.")).min(1).describe("Exact immutable audience-evidence snapshots selected for package construction.").optional(), "agency_estimate_number": z.string().max(100).describe("Package-level agency estimate or authorization reference.").optional(), "context": z.record(z.string(), z.any()).describe("Opaque buyer package correlation preserved in the accepted snapshot and readback.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional(), "measurement_terms": z.object({ "billing_measurement": z.object({ "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "max_variance_percent": z.number().gte(0).lt(100).optional(), "measurement_window": z.string().min(1).optional(), "finalization_deadline_hours": z.number().int().gte(0).optional() }).passthrough().optional(), "makegood_policy": z.object({ "available_remedies": z.array(z.enum(["additional_delivery", "credit", "invoice_adjustment"]).describe("Remedy types available when a performance standard or billing measurement threshold is breached.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!") }).passthrough().optional() }).passthrough().describe("Published or negotiated billing-measurement and makegood terms for this purchase. Direct buyers may omit this to inherit the product default; accepted proposal snapshots preserve the resolved terms.").optional(), "performance_standards": z.array(z.object({ "metric": z.enum(["viewability", "ivt", "completion_rate", "brand_safety", "attention_score"]).describe("Performance metrics that support rate thresholds on media buys \u2014 the verification subset of the broader metric vocabulary. Each metric specifies whether its threshold is a floor (must exceed) or ceiling (must not exceed). Shared values with `available-metric.json` mirror the delivery vocabulary (`viewability` \u2192 `viewable_rate` family, `completion_rate` \u2192 same name); verification-only values (`ivt`, `brand_safety`, `attention_score`) are typically vendor-attested and do not appear in `available-metric.json` because they're not seller-reportable scalars \u2014 they flow through `vendor_metric_values` or vendor-scope `committed_metrics` entries with the matching `performance_standard.vendor` BrandRef anchoring identity."), "threshold": z.number().gte(0).lte(1), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional(), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.") }).passthrough().describe("Compact committed metric threshold with resolvable vendor identity and no creative or brand-asset graph.")).min(1).describe("Published or negotiated metric thresholds and measurement vendors. Direct buyers may omit this to inherit the product defaults; accepted proposal snapshots preserve every applicable standard.").optional() }).passthrough().describe("One resolved canonical product selection in a compact proposal or accepted commercial snapshot. Request-side buy_products selections use product-purchase-input.json. This strict snapshot shape contains effective non-null targeting and resolved inherited terms. Creative content and creative assignments are intentionally absent."), z.object({ "product_id": z.any().refine((value) => value !== void 0, "Required"), "pricing_option_id": z.any().refine((value) => value !== void 0, "Required"), "pricing": z.any().refine((value) => value !== void 0, "Required"), "start_time": z.any().refine((value) => value !== void 0, "Required"), "end_time": z.any().refine((value) => value !== void 0, "Required") }).passthrough())).min(1).describe("Exact canonical product, pricing, format, catalog, budget, targeting, bidding, optimization, resolved flight, measurement, and performance terms in the commercial envelope."), "start_time": z.any().superRefine((x, ctx) => {
15182
15182
  const schemas = [z.literal("asap").describe("Start campaign as soon as possible"), z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")];
15183
15183
  const { errors, failed } = schemas.reduce(
15184
15184
  ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
@@ -15203,9 +15203,9 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
15203
15203
  message: "Invalid input: Should pass single schema. Passed " + passed
15204
15204
  });
15205
15205
  }
15206
- }).describe("Campaign start timing: 'asap' or ISO 8601 date-time"), "end_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), "total_budget": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().optional(), "daily_budget_cap": z.number().gte(0).describe("Hard aggregate daily spend ceiling accepted as part of these terms. It bounds total spend without creating purchase allocations.").optional(), "frequency_cap": z.intersection(z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2."), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()).describe("Hard MediaBuy-level cap accepted as part of these terms. One counter aggregates exposures across every purchase; purchase targeting caps remain independently binding.").optional(), "budget_cap_timezone": z.string().min(1).describe("Shared IANA calendar-day boundary for aggregate and purchase daily caps in these terms.").optional(), "budget_allocation": z.any().superRefine((x, ctx) => {
15206
+ }).describe("Campaign start timing: 'asap' or ISO 8601 date-time"), "end_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), "total_budget": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().optional(), "daily_budget_cap": z.number().gte(0).describe("Hard aggregate daily spend ceiling accepted as part of these terms. It bounds total spend without creating purchase allocations.").optional(), "frequency_cap": z.intersection(z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2."), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()).describe("Hard MediaBuy-level cap accepted as part of these terms. One counter aggregates exposures across every purchase; purchase targeting caps remain independently binding.").optional(), "budget_cap_timezone": z.string().min(1).describe("Shared IANA calendar-day boundary for aggregate and purchase daily caps in these terms.").optional(), "budget_allocation": z.any().superRefine((x, ctx) => {
15207
15207
  const schemas = [z.object({ "mode": z.literal("fixed") }).passthrough(), z.object({ "mode": z.literal("seller_optimized"), "optimization_goals": z.array(z.any().superRefine((x2, ctx2) => {
15208
- const schemas2 = [z.object({ "kind": z.literal("metric"), "metric": z.enum(["clicks", "views", "completed_views", "viewed_seconds", "viewable_rate", "engagements", "follows", "saves", "profile_visits", "reach"]), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional(), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.").optional(), "reach_unit": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").optional(), "target_frequency": z.object({ "min": z.number().int().gte(1).optional(), "max": z.number().int().gte(1).optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.") }).passthrough().and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).optional(), "view_duration_seconds": z.number().gt(0).optional(), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough().and(z.intersection(z.union([z.any().refine((value) => !z.object({ "metric": z.literal("viewable_rate") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "metric": z.literal("viewable_rate") }), z.object({ "target": z.object({ "value": z.any().optional() }).optional() }))]), z.any())), z.object({ "kind": z.literal("event"), "event_sources": z.array(z.object({ "event_source_id": z.string().min(1), "event_type": z.enum(["page_view", "view_content", "select_content", "select_item", "search", "share", "add_to_cart", "remove_from_cart", "viewed_cart", "add_to_wishlist", "initiate_checkout", "add_payment_info", "purchase", "refund", "lead", "qualify_lead", "close_convert_lead", "disqualify_lead", "complete_registration", "subscribe", "follow", "content_view", "watch_milestone", "start_trial", "app_install", "app_launch", "contact", "schedule", "donate", "submit_application", "custom"]).describe("Standard marketing event types for event logging, aligned with IAB ECAPI"), "custom_event_name": z.string().min(1).optional(), "value_field": z.string().min(1).optional(), "value_factor": z.number().default(1) }).passthrough()).min(1), "target": z.object({ "kind": z.literal("maximize_value") }).passthrough().optional(), "attribution_window": z.object({ "post_click": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-click attribution window. Conversions occurring within this duration after a click are attributed to the ad.").optional(), "post_view": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-view attribution window. Conversions occurring within this duration after an ad impression (without click) are attributed to the ad.").optional(), "model": z.enum(["last_touch", "first_touch", "linear", "time_decay", "data_driven"]).describe("Attribution model used to assign credit when multiple touchpoints exist. SHOULD be populated when committing to a specific model; when absent, the seller's default applies.").optional() }).catchall(z.any()).describe("Describes the attribution methodology and lookback windows used for conversion measurement. Enables cross-platform comparison by making attribution methodology transparent. Used as a `$ref` from `optimization-goal.json` (buyer's optimization-time attribution choice), `get-media-buy-delivery-response.json` (seller-declared attribution methodology in delivery reports), and similar surfaces. All fields are optional individually but at least one of `post_click`, `post_view`, or `model` SHOULD be populated; absence of `model` means the seller's default attribution model applies (typically `last_touch` per industry convention) \u2014 sellers SHOULD populate `model` explicitly when committing to a specific methodology.").optional(), "priority": z.number().int().gte(1).optional() }).passthrough(), z.object({ "kind": z.literal("vendor_metric"), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "metric_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).min(1).max(64).describe("Identifier for a vendor-defined metric within the vendor's vocabulary. Stable lookup key; the vendor publishes the canonical list (with category, methodology, and standard alignment) in `brand.json` `agents[type='measurement']`. Lowercase with underscores so a future enum promotion into `available-metric.json` is a literal string lift. Identifier is namespaced by the vendor \u2014 the same `metric_id` may mean different things in different vendors' vocabularies."), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough()];
15208
+ const schemas2 = [z.object({ "kind": z.literal("metric"), "metric": z.enum(["clicks", "views", "completed_views", "viewed_seconds", "viewable_rate", "engagements", "follows", "saves", "profile_visits", "reach"]), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional(), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.").optional(), "reach_unit": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").optional(), "target_frequency": z.object({ "min": z.number().int().gte(1).optional(), "max": z.number().int().gte(1).optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.") }).passthrough().and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).optional(), "view_duration_seconds": z.number().gt(0).optional(), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough().and(z.intersection(z.union([z.any().refine((value) => !z.object({ "metric": z.literal("viewable_rate") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "metric": z.literal("viewable_rate") }), z.object({ "target": z.object({ "value": z.any().optional() }).optional() }))]), z.any())), z.object({ "kind": z.literal("event"), "event_sources": z.array(z.object({ "event_source_id": z.string().min(1), "event_type": z.enum(["page_view", "view_content", "select_content", "select_item", "search", "share", "add_to_cart", "remove_from_cart", "viewed_cart", "add_to_wishlist", "initiate_checkout", "add_payment_info", "purchase", "refund", "lead", "qualify_lead", "close_convert_lead", "disqualify_lead", "complete_registration", "subscribe", "follow", "content_view", "watch_milestone", "start_trial", "app_install", "app_launch", "contact", "schedule", "donate", "submit_application", "custom"]).describe("Standard marketing event types for event logging, aligned with IAB ECAPI"), "custom_event_name": z.string().min(1).optional(), "value_field": z.string().min(1).optional(), "value_factor": z.number().default(1) }).passthrough()).min(1), "target": z.object({ "kind": z.literal("maximize_value") }).passthrough().optional(), "attribution_window": z.object({ "post_click": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-click attribution window. Conversions occurring within this duration after a click are attributed to the ad.").optional(), "post_view": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-view attribution window. Conversions occurring within this duration after an ad impression (without click) are attributed to the ad.").optional(), "model": z.enum(["last_touch", "first_touch", "linear", "time_decay", "data_driven"]).describe("Attribution model used to assign credit when multiple touchpoints exist. SHOULD be populated when committing to a specific model; when absent, the seller's default applies.").optional() }).catchall(z.any()).describe("Describes the attribution methodology and lookback windows used for conversion measurement. Enables cross-platform comparison by making attribution methodology transparent. Used as a `$ref` from `optimization-goal.json` (buyer's optimization-time attribution choice), `get-media-buy-delivery-response.json` (seller-declared attribution methodology in delivery reports), and similar surfaces. All fields are optional individually but at least one of `post_click`, `post_view`, or `model` SHOULD be populated; absence of `model` means the seller's default attribution model applies (typically `last_touch` per industry convention) \u2014 sellers SHOULD populate `model` explicitly when committing to a specific methodology.").optional(), "priority": z.number().int().gte(1).optional() }).passthrough(), z.object({ "kind": z.literal("vendor_metric"), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "metric_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).min(1).max(64).describe("Identifier for a vendor-defined metric within the vendor's vocabulary. Stable lookup key; the vendor publishes the canonical list (with category, methodology, and standard alignment) in `brand.json` `agents[type='measurement']`. Lowercase with underscores so a future enum promotion into `available-metric.json` is a literal string lift. Identifier is namespaced by the vendor \u2014 the same `metric_id` may mean different things in different vendors' vocabularies."), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough()];
15209
15209
  const { errors: errors2, failed: failed2 } = schemas2.reduce(
15210
15210
  ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
15211
15211
  errors: [...errors3, ...result.error.issues],
@@ -15279,7 +15279,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
15279
15279
  });
15280
15280
  }
15281
15281
  })).describe("One metric the seller commits to report for a commercial product term. Vendor identity uses BrandKey so the compact lifecycle does not inline brand or provenance documents.")).min(1) }).passthrough()).min(1).describe("Binding reporting contract keyed by position in purchases. Amendments preserve prior entries and add metrics with effective_at; seller-assigned package IDs live in the execution binding, outside this digest.").optional(), "cancellation_terms": z.object({ "effective_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), "fee": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().optional(), "reason": z.string().min(1).max(500).optional() }).passthrough().optional(), "change_terms": z.array(z.object({ "term_id": z.string().regex(new RegExp("^[A-Za-z0-9_.:-]+$")), "action": z.enum(["pause", "resume", "cancel", "extend_flight", "shorten_flight", "update_flight_dates", "increase_budget", "decrease_budget", "reallocate_budget", "update_budget_allocation", "update_targeting", "update_pacing", "update_bidding", "update_frequency_caps", "update_media_buy_frequency_cap", "update_catalog_assignments", "update_keywords", "update_optimization_goals", "update_impression_goal", "update_spend_target", "update_reporting_webhook", "replace_creative", "update_creative_assignments", "remove_creative", "add_packages", "remove_packages"]).describe("Fine-grained MediaBuy action vocabulary for compact product and lifecycle surfaces. Deprecated coarse 3.x actions are absent."), "service_mode": z.enum(["self_serve", "conditional_self_serve", "seller_managed", "requires_approval"]).describe("How a seller honors a routed compact-lifecycle action."), "allowed_statuses": z.array(z.enum(["pending_creatives", "pending_start", "active", "paused"])).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Non-terminal MediaBuy statuses in which this negotiated right may be exercised. When absent, the right applies in every non-terminal status where the canonical action itself is meaningful. This field describes contractual lifecycle scope; available_actions[] remains authoritative for the current instant.").optional(), "processing_sla": z.object({ "response_max": z.string().regex(new RegExp("^P(?!$)(\\d+Y)?(\\d+M)?(\\d+D)?(T(\\d+H)?(\\d+M)?(\\d+S)?)?$")).describe("Maximum elapsed time from when the buyer issues the action to when the seller acknowledges receipt (mode-appropriate: synchronous response for self_serve, tolerance decision for conditional_self_serve, or queue acknowledgement for seller_managed and legacy requires_approval). Sellers include weekends and non-working periods in the maximum. ISO 8601 duration.").optional(), "completion_max": z.string().regex(new RegExp("^P(?!$)(\\d+Y)?(\\d+M)?(\\d+D)?(T(\\d+H)?(\\d+M)?(\\d+S)?)?$")).describe("Maximum elapsed time from buyer issuing the action to the seller completing it (mutation applied, proposal finalized, or seller-managed decision resolved). Sellers include weekends and non-working periods in the maximum. ISO 8601 duration.").optional() }).passthrough().describe("Binding elapsed-time acknowledgement and completion commitment. Sellers account for weekends and non-working periods when declaring the maximum.").optional(), "conditions": z.array(z.string().regex(new RegExp("^[A-Za-z0-9][A-Za-z0-9_.:-]{0,199}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Opaque stable condition identifiers defined by terms_ref or bilateral commercial documentation. Implementations compare identifiers; they MUST NOT execute or interpret them as instructions.").optional(), "constraints": z.any().superRefine((x, ctx) => {
15282
- const schemas = [z.object({ "kind": z.literal("budget"), "max_delta_amount": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().describe("Maximum absolute amount by which the affected budget may change in the direction named by the action.").optional(), "max_delta_percent": z.number().gte(0).describe("Maximum percentage change relative to the current committed value. Values above 100 are valid for increases greater than the current value.").optional(), "min_result_amount": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().describe("Minimum resulting committed value after the change.").optional(), "max_result_amount": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().describe("Maximum resulting committed value after the change.").optional() }).passthrough().and(z.union([z.object({ "max_delta_amount": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_delta_percent": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "min_result_amount": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_result_amount": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])), z.object({ "kind": z.literal("flight"), "max_change": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("Maximum extension, shortening, or shift in the direction named by the action.").optional(), "earliest_result": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "latest_result": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "minimum_notice": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("Minimum elapsed notice before the requested flight change may take effect.").optional() }).passthrough().and(z.union([z.object({ "max_change": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "earliest_result": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "latest_result": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "minimum_notice": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])), z.object({ "kind": z.literal("package_count"), "max_additions": z.number().int().gte(0).describe("Maximum packages that may be added by one exercise of the right.").optional(), "max_removals": z.number().int().gte(0).describe("Maximum packages that may be removed by one exercise of the right.").optional(), "max_result_count": z.number().int().gte(0).describe("Maximum active package count after the change.").optional() }).passthrough().and(z.union([z.object({ "max_additions": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_removals": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_result_count": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])), z.object({ "kind": z.literal("effective_timing"), "minimum_notice": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("Minimum elapsed notice before pause, resume, cancellation, or another operational action may take effect.").optional(), "earliest_effective_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "latest_effective_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() }).passthrough().and(z.union([z.object({ "minimum_notice": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "earliest_effective_at": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "latest_effective_at": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]))];
15282
+ const schemas = [z.object({ "kind": z.literal("budget"), "max_delta_amount": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().describe("Maximum absolute amount by which the affected budget may change in the direction named by the action.").optional(), "max_delta_percent": z.number().gte(0).describe("Maximum percentage change relative to the current committed value. Values above 100 are valid for increases greater than the current value.").optional(), "min_result_amount": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().describe("Minimum resulting committed value after the change.").optional(), "max_result_amount": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().describe("Maximum resulting committed value after the change.").optional() }).passthrough().and(z.union([z.object({ "max_delta_amount": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_delta_percent": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "min_result_amount": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_result_amount": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")), z.object({ "kind": z.literal("flight"), "max_change": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("Maximum extension, shortening, or shift in the direction named by the action.").optional(), "earliest_result": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "latest_result": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "minimum_notice": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("Minimum elapsed notice before the requested flight change may take effect.").optional() }).passthrough().and(z.union([z.object({ "max_change": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "earliest_result": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "latest_result": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "minimum_notice": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")), z.object({ "kind": z.literal("package_count"), "max_additions": z.number().int().gte(0).describe("Maximum packages that may be added by one exercise of the right.").optional(), "max_removals": z.number().int().gte(0).describe("Maximum packages that may be removed by one exercise of the right.").optional(), "max_result_count": z.number().int().gte(0).describe("Maximum active package count after the change.").optional() }).passthrough().and(z.union([z.object({ "max_additions": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_removals": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_result_count": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")), z.object({ "kind": z.literal("effective_timing"), "minimum_notice": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("Minimum elapsed notice before pause, resume, cancellation, or another operational action may take effect.").optional(), "earliest_effective_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "latest_effective_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() }).passthrough().and(z.union([z.object({ "minimum_notice": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "earliest_effective_at": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "latest_effective_at": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives."))];
15283
15283
  const { errors, failed } = schemas.reduce(
15284
15284
  ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
15285
15285
  errors: [...errors2, ...result.error.issues],
@@ -15303,8 +15303,8 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
15303
15303
  message: "Invalid input: Should pass single schema. Passed " + passed
15304
15304
  });
15305
15305
  }
15306
- }).describe("Portable bounds that buyer and seller SDKs can preflight. Omission means no machine-readable bound was promised; opaque conditions remain unevaluated.").optional(), "terms_ref": z.string().min(1).max(1e3).describe("Stable contract reference. Resolving it cannot expand the typed right and MUST use the caller's normal authenticated contract-document path, never ambient seller credentials.").optional(), "description": z.string().min(1).max(1e3).describe("Display-only summary; it cannot grant authority, add an action, or override typed fields.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().describe("A proposal-bound buyer change right. It binds to the resulting media buy and account, not personally to the caller, and may be exercised by any caller admitted by both seller account authorization and applicable signed governance delegation.")).min(1).describe("Binding buyer change rights included in the commercial envelope and therefore covered by terms_digest. Entries are uniquely keyed by action. When this field is present, an omitted action is not a negotiated change right. Omission of the entire field means legacy-unspecified rights, not a prohibition.").optional() }).passthrough().describe("Complete typed commercial envelope for a compact-lifecycle proposal. This is the authoritative audit and refinement snapshot; allocations and narrative fields are explanatory views rather than substitutes for these terms."), "terms_digest": z.string().regex(new RegExp("^sha256:[A-Za-z0-9_-]{43}$")).describe("Base64url SHA-256 digest of the RFC 8785 JCS serialization of commercial_terms, prefixed with sha256:."), "insertion_order": z.object({ "io_id": z.string().max(255).describe("Unique identifier for this insertion order. Referenced by io_acceptance on create_media_buy."), "terms": z.object({ "advertiser": z.string().max(500).describe("Advertiser name or identifier").optional(), "publisher": z.string().max(500).describe("Publisher name or identifier").optional(), "total_budget": z.object({ "amount": z.number().gte(0), "currency": z.string().min(3).max(3).describe("ISO 4217 currency code") }).describe("Total committed budget").optional(), "flight_start": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "flight_end": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "payment_terms": z.enum(["net_30", "net_60", "net_90", "prepaid", "due_on_receipt"]).describe("Payment terms").optional() }).catchall(z.any()).describe("Summary fields echoed from the committed proposal for agent verification. Buyer agents use these to confirm the IO matches what was negotiated before a human signs. These are read-only summaries, not negotiation surfaces \u2014 deal terms live on products and packages.").optional(), "terms_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to a human-readable document containing the full insertion order terms").optional(), "signing_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to an electronic signing service (e.g., DocuSign) for human signature workflows. When present, a human must sign before the buyer agent can proceed with create_media_buy.").optional(), "requires_signature": z.boolean().describe("Whether the buyer must accept this IO before creating a media buy. When true, create_media_buy requires an io_acceptance referencing this io_id.") }).catchall(z.any()).describe("A signing wrapper attached to a committed proposal. The IO does not introduce new deal terms \u2014 all negotiated terms (performance standards, measurement terms, cancellation policy, pricing) live on the product and package. The IO exists for human signature workflows and provides summary fields so buyer agents can verify the IO matches the committed proposal before a human signs.").optional(), "total_budget_guidance": z.object({ "min": z.number().gte(0).optional(), "recommended": z.number().gte(0).optional(), "max": z.number().gte(0).optional(), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().and(z.union([z.object({ "recommended": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Optional budget guidance for this proposal \u2014 the planning answer to criteria.outcome_target and to open-budget briefs. commercial_terms.total_budget remains the concrete figure the plan is priced at; this band expresses the seller's recommended range around it. When criteria.outcome_target carries cost_per, the cost answer is commercial_terms.bidding.cost_per and this band's currency equals cost_per.currency.").optional(), "forecast": z.object({ "points": z.array(z.object({ "label": z.string().max(128).optional(), "budget": z.number().gte(0).optional(), "product_id": z.string().optional(), "dimensions": z.array(z.any().superRefine((x, ctx) => {
15307
- const schemas = [z.object({ "kind": z.literal("geo").describe("Dimension family discriminator."), "geo_level": z.enum(["country", "region", "metro", "postal_area"]).describe("Geographic level for this forecast point."), "system": z.string().describe("Classification system for metro or postal_area levels. Required when geo_level is 'metro' or 'postal_area'. Metro rows use metro-system enum values such as 'nielsen_dma'; native postal rows use country-local postal-system enum values such as 'zip' with country 'US'; deprecated legacy postal rows may use legacy-postal-system enum values such as 'us_zip'. Omit for country and region rows.").optional(), "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code. Required for native postal_area rows and omitted for legacy postal rows, metro rows, country rows, and region rows.").optional(), "geo_code": z.string().describe("Geographic code within the level and system. Country: ISO 3166-1 alpha-2 ('US'). Region: ISO 3166-2 with country prefix ('US-CA'). Metro/postal: system-specific code ('501', '10001')."), "geo_name": z.string().describe("Human-readable geographic name (e.g., 'United States', 'California', 'New York DMA').").optional() }).passthrough().and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("country") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("country") }), z.object({ "geo_code": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code.").optional() }))]), z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("region") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("region") }), z.object({ "geo_code": z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$")).describe("ISO 3166-2 subdivision code.").optional() }))])), z.intersection(z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("metro") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("metro") }), z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')") }))]), z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("postal_area") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("postal_area") }), z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })])).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom."), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system.") })]))])))).describe("A geographic dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("placement").describe("Dimension family discriminator."), "placement_ref": z.object({ "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring a publisher-catalog placement is hosted, or the inventory publisher associated with an inline placement. Omitted only for legacy single-publisher product-context references.").optional(), "placement_id": z.string().describe("Placement ID from the publisher's adagents.json placement catalog, or an inline seller-defined placement ID interpreted within the enclosing seller and product context.") }).catchall(z.any()).describe("Structured placement reference for this forecast row. References an entry from the product's placements array."), "placement_name": z.string().describe("Human-readable placement name, useful when the buyer has not resolved the placement catalog.").optional() }).passthrough().describe("A placement dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("device_type").describe("Dimension family discriminator."), "device_type": z.enum(["desktop", "mobile", "tablet", "ctv", "dooh", "unknown"]).describe("Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) \u2192 mobile, 2 (PC) \u2192 desktop, 4 (Phone) \u2192 mobile, 5 (Tablet) \u2192 tablet, 6 (Connected Device) \u2192 ctv, 7 (Set Top Box) \u2192 ctv. DOOH inventory uses dooh.") }).passthrough().describe("A device form-factor dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("device_platform").describe("Dimension family discriminator."), "device_platform": z.enum(["ios", "android", "windows", "macos", "linux", "chromeos", "tvos", "tizen", "webos", "fire_os", "roku_os", "unknown"]).describe("Operating system platforms for device targeting. Browser values from Sec-CH-UA-Platform standard, extended for CTV.") }).passthrough().describe("An operating-system or platform dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("audience").describe("Dimension family discriminator."), "audience_id": z.string().describe("Audience segment identifier for this forecast row."), "audience_source": z.enum(["synced", "platform", "third_party", "lookalike", "retargeting", "unknown"]).describe("Origin of the audience segment."), "audience_name": z.string().describe("Human-readable audience segment name.").optional() }).passthrough().describe("An audience segment dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("signal").describe("Dimension family discriminator."), "signal_ref": z.any().superRefine((x2, ctx2) => {
15306
+ }).describe("Portable bounds that buyer and seller SDKs can preflight. Omission means no machine-readable bound was promised; opaque conditions remain unevaluated.").optional(), "terms_ref": z.string().min(1).max(1e3).describe("Stable contract reference. Resolving it cannot expand the typed right and MUST use the caller's normal authenticated contract-document path, never ambient seller credentials.").optional(), "description": z.string().min(1).max(1e3).describe("Display-only summary; it cannot grant authority, add an action, or override typed fields.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().describe("A proposal-bound buyer change right. It binds to the resulting media buy and account, not personally to the caller, and may be exercised by any caller admitted by both seller account authorization and applicable signed governance delegation.")).min(1).describe("Binding buyer change rights included in the commercial envelope and therefore covered by terms_digest. Entries are uniquely keyed by action. When this field is present, an omitted action is not a negotiated change right. Omission of the entire field means legacy-unspecified rights, not a prohibition.").optional() }).passthrough().describe("Complete typed commercial envelope for a compact-lifecycle proposal. This is the authoritative audit and refinement snapshot; allocations and narrative fields are explanatory views rather than substitutes for these terms."), "terms_digest": z.string().regex(new RegExp("^sha256:[A-Za-z0-9_-]{43}$")).describe("Base64url SHA-256 digest of the RFC 8785 JCS serialization of commercial_terms, prefixed with sha256:."), "insertion_order": z.object({ "io_id": z.string().max(255).describe("Unique identifier for this insertion order. Referenced by io_acceptance on create_media_buy."), "terms": z.object({ "advertiser": z.string().max(500).describe("Advertiser name or identifier").optional(), "publisher": z.string().max(500).describe("Publisher name or identifier").optional(), "total_budget": z.object({ "amount": z.number().gte(0), "currency": z.string().min(3).max(3).describe("ISO 4217 currency code") }).describe("Total committed budget").optional(), "flight_start": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "flight_end": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "payment_terms": z.enum(["net_30", "net_60", "net_90", "prepaid", "due_on_receipt"]).describe("Payment terms").optional() }).catchall(z.any()).describe("Summary fields echoed from the committed proposal for agent verification. Buyer agents use these to confirm the IO matches what was negotiated before a human signs. These are read-only summaries, not negotiation surfaces \u2014 deal terms live on products and packages.").optional(), "terms_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to a human-readable document containing the full insertion order terms").optional(), "signing_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to an electronic signing service (e.g., DocuSign) for human signature workflows. When present, a human must sign before the buyer agent can proceed with create_media_buy.").optional(), "requires_signature": z.boolean().describe("Whether the buyer must accept this IO before creating a media buy. When true, create_media_buy requires an io_acceptance referencing this io_id.") }).catchall(z.any()).describe("A signing wrapper attached to a committed proposal. The IO does not introduce new deal terms \u2014 all negotiated terms (performance standards, measurement terms, cancellation policy, pricing) live on the product and package. The IO exists for human signature workflows and provides summary fields so buyer agents can verify the IO matches the committed proposal before a human signs.").optional(), "total_budget_guidance": z.object({ "min": z.number().gte(0).optional(), "recommended": z.number().gte(0).optional(), "max": z.number().gte(0).optional(), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().and(z.union([z.object({ "recommended": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Optional budget guidance for this proposal \u2014 the planning answer to criteria.outcome_target and to open-budget briefs. commercial_terms.total_budget remains the concrete figure the plan is priced at; this band expresses the seller's recommended range around it. When criteria.outcome_target carries cost_per, the cost answer is commercial_terms.bidding.cost_per and this band's currency equals cost_per.currency.").optional(), "forecast": z.object({ "points": z.array(z.object({ "label": z.string().max(128).optional(), "budget": z.number().gte(0).optional(), "product_id": z.string().optional(), "dimensions": z.array(z.any().superRefine((x, ctx) => {
15307
+ const schemas = [z.object({ "kind": z.literal("geo").describe("Dimension family discriminator."), "geo_level": z.enum(["country", "region", "metro", "postal_area"]).describe("Geographic level for this forecast point."), "system": z.string().describe("Classification system for metro or postal_area levels. Required when geo_level is 'metro' or 'postal_area'. Metro rows use metro-system enum values such as 'nielsen_dma'; native postal rows use country-local postal-system enum values such as 'zip' with country 'US'; deprecated legacy postal rows may use legacy-postal-system enum values such as 'us_zip'. Omit for country and region rows.").optional(), "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code. Required for native postal_area rows and omitted for legacy postal rows, metro rows, country rows, and region rows.").optional(), "geo_code": z.string().describe("Geographic code within the level and system. Country: ISO 3166-1 alpha-2 ('US'). Region: ISO 3166-2 with country prefix ('US-CA'). Metro/postal: system-specific code ('501', '10001')."), "geo_name": z.string().describe("Human-readable geographic name (e.g., 'United States', 'California', 'New York DMA').").optional() }).passthrough().and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("country") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("country") }), z.object({ "geo_code": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code.").optional() }))]), z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("region") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("region") }), z.object({ "geo_code": z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$")).describe("ISO 3166-2 subdivision code.").optional() }))])), z.intersection(z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("metro") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("metro") }), z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')") }))]), z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("postal_area") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("postal_area") }), z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })]).describe("Must also satisfy at least one of these alternatives.")).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom."), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system.") })]))])))).describe("A geographic dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("placement").describe("Dimension family discriminator."), "placement_ref": z.object({ "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring a publisher-catalog placement is hosted, or the inventory publisher associated with an inline placement. Omitted only for legacy single-publisher product-context references.").optional(), "placement_id": z.string().describe("Placement ID from the publisher's adagents.json placement catalog, or an inline seller-defined placement ID interpreted within the enclosing seller and product context.") }).catchall(z.any()).describe("Structured placement reference for this forecast row. References an entry from the product's placements array."), "placement_name": z.string().describe("Human-readable placement name, useful when the buyer has not resolved the placement catalog.").optional() }).passthrough().describe("A placement dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("device_type").describe("Dimension family discriminator."), "device_type": z.enum(["desktop", "mobile", "tablet", "ctv", "dooh", "unknown"]).describe("Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) \u2192 mobile, 2 (PC) \u2192 desktop, 4 (Phone) \u2192 mobile, 5 (Tablet) \u2192 tablet, 6 (Connected Device) \u2192 ctv, 7 (Set Top Box) \u2192 ctv. DOOH inventory uses dooh.") }).passthrough().describe("A device form-factor dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("device_platform").describe("Dimension family discriminator."), "device_platform": z.enum(["ios", "android", "windows", "macos", "linux", "chromeos", "tvos", "tizen", "webos", "fire_os", "roku_os", "unknown"]).describe("Operating system platforms for device targeting. Browser values from Sec-CH-UA-Platform standard, extended for CTV.") }).passthrough().describe("An operating-system or platform dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("audience").describe("Dimension family discriminator."), "audience_id": z.string().describe("Audience segment identifier for this forecast row."), "audience_source": z.enum(["synced", "platform", "third_party", "lookalike", "retargeting", "unknown"]).describe("Origin of the audience segment."), "audience_name": z.string().describe("Human-readable audience segment name.").optional() }).passthrough().describe("An audience segment dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("signal").describe("Dimension family discriminator."), "signal_ref": z.any().superRefine((x2, ctx2) => {
15308
15308
  const schemas2 = [z.object({ "scope": z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Product-local signal identifier. For local signals exposed on both get_signals and get_products, this MUST match get_signals.signals[].signal_ref.signal_id for the same signal.") }).catchall(z.any()).describe("Product-scoped signal. The signal_id is meaningful only within the selected product/package context and MUST match a Product.included_signals[].signal_ref.signal_id or Product.signal_targeting_options[].signal_ref.signal_id for that product, depending on whether the signal is descriptive or selectable."), z.object({ "scope": z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that publishes the signal definition in its adagents.json signals[]."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(z.any()).describe("Data-provider-scoped signal. The signal_id resolves through the data provider's published adagents.json signals[] and can be authorization-verified there."), z.object({ "scope": z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(z.any()).describe("Signal-source-scoped signal. Use this for source-native signals that are not published in upstream adagents.json signals[]. The buyer trusts the issuing signal source for this identity; use scope 'data_provider' instead when the signal is published in adagents.json signals[], even if the publisher is also the seller or signal source.")];
15309
15309
  const { errors: errors2, failed: failed2 } = schemas2.reduce(
15310
15310
  ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
@@ -15329,7 +15329,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
15329
15329
  message: "Invalid input: Should pass single schema. Passed " + passed2
15330
15330
  });
15331
15331
  }
15332
- }).describe("Canonical signal reference for this forecast row. Required when the row needs to disambiguate product-local, data-provider, or signal-source identity. Product-relative forecasts SHOULD use signal_ref.").optional(), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier shorthand for this forecast row. Use only when the enclosing context already identifies the signal unambiguously, such as a coverage_forecast nested directly under one get_signals signal item. Otherwise use signal_ref.").optional(), "signal_value": z.union([z.string().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value."), z.number().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value."), z.boolean().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value."), z.null().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value.")]).describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value.").optional(), "presence": z.enum(["present", "absent"]).describe("Whether the signal is present for this point. Use 'absent' for the explicit not-present bucket."), "signal_name": z.string().describe("Human-readable signal name, useful when the buyer has not resolved the signal definition.").optional(), "signal_value_name": z.string().describe("Human-readable label for the signal value bucket.").optional() }).passthrough().and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "presence": z.literal("absent") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "presence": z.literal("absent") }), z.object({ "signal_value": z.null() }))]), z.union([z.any().refine((value) => !z.object({ "presence": z.literal("present") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "presence": z.literal("present") }), z.object({ "signal_value": z.union([z.string(), z.number(), z.boolean()]).optional() }))]))).describe("A signal value or signal-presence dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("time").describe("Dimension family discriminator."), "start_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), "end_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time") }).passthrough().describe("A calendar-window dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules. Windows are half-open intervals [start_time, end_time): the row covers instants at or after start_time and strictly before end_time, so adjacent windows share a boundary without overlapping. end_time MUST be after start_time; JSON Schema draft-07 cannot compare sibling values, so conformance tooling enforces the ordering. Within one forecast, sellers MUST emit non-overlapping windows and SHOULD coalesce adjacent windows whose availability_status and metrics do not materially differ. When the request scoped the forecast with offer_filters.availability_horizon, a complete forecast partitions the requested horizon; a seller that cannot cover the full horizon signals the gap through the response's incomplete[] mechanism rather than silently omitting windows.")];
15332
+ }).describe("Canonical signal reference for this forecast row. Required when the row needs to disambiguate product-local, data-provider, or signal-source identity. Product-relative forecasts SHOULD use signal_ref.").optional(), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier shorthand for this forecast row. Use only when the enclosing context already identifies the signal unambiguously, such as a coverage_forecast nested directly under one get_signals signal item. Otherwise use signal_ref.").optional(), "signal_value": z.union([z.string().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value."), z.number().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value."), z.boolean().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value."), z.null().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value.")]).describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value.").optional(), "presence": z.enum(["present", "absent"]).describe("Whether the signal is present for this point. Use 'absent' for the explicit not-present bucket."), "signal_name": z.string().describe("Human-readable signal name, useful when the buyer has not resolved the signal definition.").optional(), "signal_value_name": z.string().describe("Human-readable label for the signal value bucket.").optional() }).passthrough().and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "presence": z.literal("absent") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "presence": z.literal("absent") }), z.object({ "signal_value": z.null() }))]), z.union([z.any().refine((value) => !z.object({ "presence": z.literal("present") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "presence": z.literal("present") }), z.object({ "signal_value": z.union([z.string(), z.number(), z.boolean()]).optional() }))]))).describe("A signal value or signal-presence dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("time").describe("Dimension family discriminator."), "start_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), "end_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time") }).passthrough().describe("A calendar-window dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules. Windows are half-open intervals [start_time, end_time): the row covers instants at or after start_time and strictly before end_time, so adjacent windows share a boundary without overlapping. end_time MUST be after start_time; JSON Schema draft-07 cannot compare sibling values, so conformance tooling enforces the ordering. Within one forecast, sellers MUST emit non-overlapping windows and SHOULD coalesce adjacent windows whose availability_status and metrics do not materially differ. When the request scoped the forecast with offer_filters.availability_horizon, a complete forecast partitions the requested horizon; a seller that cannot cover the full horizon signals the gap through the response's incomplete[] mechanism rather than silently omitting windows.")];
15333
15333
  const { errors, failed } = schemas.reduce(
15334
15334
  ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
15335
15335
  errors: [...errors2, ...result.error.issues],
@@ -15353,7 +15353,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
15353
15353
  message: "Invalid input: Should pass single schema. Passed " + passed
15354
15354
  });
15355
15355
  }
15356
- })).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Dimension constraints represented by a ForecastPoint. Use this when one product, proposal, or signal coverage forecast needs to expose availability or forecasted delivery by country, region, placement, device, audience, signal value, time window, or intersections such as placement x country without creating separate products solely for each slice. Each item declares one dimension family via `kind`; when multiple items are present, the point represents their intersection. Sellers MUST NOT emit more than one item for each `kind` in a point. Consumers MUST NOT treat repeated kinds as OR semantics; repeated peer values such as two countries are a seller conformance issue. Dimension values are descriptors of the forecast row and are independent of pricing_options.").optional(), "availability_status": z.enum(["available", "unavailable"]).describe("Bookability of the inventory a forecast row describes, as of the forecast's generated_at. A snapshot, never a hold: valid_until bounds freshness, and proposal finalization or purchase remains the commitment boundary.").optional(), "metrics": z.object({ "coverage_rate": z.intersection(z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together."), z.object({ "low": z.any().optional(), "mid": z.any().optional(), "high": z.any().optional() })).describe("A forecast range whose low, midpoint, and high values are rates in the inclusive interval from 0 to 1.").optional() }).catchall(z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.")), "viewability": z.object({ "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.").optional(), "measurable_impressions": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "viewable_impressions": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "viewable_rate": z.intersection(z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together."), z.object({ "low": z.any().optional(), "mid": z.any().optional(), "high": z.any().optional() })).describe("A forecast range whose low, midpoint, and high values are rates in the inclusive interval from 0 to 1.").optional(), "viewed_seconds": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.union([z.object({ "measurable_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "viewable_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "viewable_rate": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "viewed_seconds": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "standard": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).optional(), "vendor_metric_values": z.array(z.object({ "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "metric_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).min(1).max(64).describe("Identifier for a vendor-defined metric within the vendor's vocabulary. Stable lookup key; the vendor publishes the canonical list (with category, methodology, and standard alignment) in `brand.json` `agents[type='measurement']`. Lowercase with underscores so a future enum promotion into `available-metric.json` is a literal string lift. Identifier is namespaced by the vendor \u2014 the same `metric_id` may mean different things in different vendors' vocabularies."), "value": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together."), "unit": z.string().optional(), "measurable_impressions": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "breakdown": z.record(z.string(), z.any()).optional() }).passthrough().describe("Compact forecasted vendor metric with a BrandKey vendor pointer and no embedded brand assets.")).optional() }).passthrough().describe("Compact forecast row with numeric ranges and identity-only measurement-vendor references.")).min(1), "forecast_range_unit": z.enum(["spend", "availability", "reach_freq", "weekly", "daily", "clicks", "conversions", "package"]).describe("Describes how to interpret the points array in a DeliveryForecast \u2014 what axis the curve represents").optional(), "method": z.enum(["estimate", "modeled", "guaranteed"]).describe("Method used to produce a delivery forecast"), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")), "demographic_system": z.enum(["nielsen", "nielsen_audio", "barb", "agf", "oztam", "mediametrie", "custom"]).describe("Audience measurement systems for demographic notation in GRP forecasts and pricing, across video and audio channels. Specifies how demographics are written, not whose panel produced the numbers \u2014 provider identity is measurement_source.").optional(), "demographic": z.string().optional(), "measurement_source": z.string().regex(new RegExp("^[a-z0-9_]+$")).max(64).optional(), "reach_unit": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").optional(), "generated_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "valid_until": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().describe("Compact product forecast without legacy BrandRef or creative dependencies.").describe("Aggregate forecasted delivery for the proposal. For outcome_target requests, points carry the goal's metric or event key in metrics; with cost_per, that is the goal volume planned under the commercial_terms.bidding policy, and currency equals cost_per.currency.").optional() }).passthrough().describe("Compact immutable proposal for the AdCP 3.2 lifecycle. commercial_terms is the sole authoritative commercial envelope; narrative fields do not duplicate legacy allocation or creative graphs.");
15356
+ })).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Dimension constraints represented by a ForecastPoint. Use this when one product, proposal, or signal coverage forecast needs to expose availability or forecasted delivery by country, region, placement, device, audience, signal value, time window, or intersections such as placement x country without creating separate products solely for each slice. Each item declares one dimension family via `kind`; when multiple items are present, the point represents their intersection. Sellers MUST NOT emit more than one item for each `kind` in a point. Consumers MUST NOT treat repeated kinds as OR semantics; repeated peer values such as two countries are a seller conformance issue. Dimension values are descriptors of the forecast row and are independent of pricing_options.").optional(), "availability_status": z.enum(["available", "unavailable"]).describe("Bookability of the inventory a forecast row describes, as of the forecast's generated_at. A snapshot, never a hold: valid_until bounds freshness, and proposal finalization or purchase remains the commitment boundary.").optional(), "metrics": z.object({ "coverage_rate": z.intersection(z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together."), z.object({ "low": z.any().optional(), "mid": z.any().optional(), "high": z.any().optional() })).describe("A forecast range whose low, midpoint, and high values are rates in the inclusive interval from 0 to 1.").optional() }).catchall(z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.")), "viewability": z.object({ "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.").optional(), "measurable_impressions": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "viewable_impressions": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "viewable_rate": z.intersection(z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together."), z.object({ "low": z.any().optional(), "mid": z.any().optional(), "high": z.any().optional() })).describe("A forecast range whose low, midpoint, and high values are rates in the inclusive interval from 0 to 1.").optional(), "viewed_seconds": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.union([z.object({ "measurable_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "viewable_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "viewable_rate": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "viewed_seconds": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "standard": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).optional(), "vendor_metric_values": z.array(z.object({ "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "metric_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).min(1).max(64).describe("Identifier for a vendor-defined metric within the vendor's vocabulary. Stable lookup key; the vendor publishes the canonical list (with category, methodology, and standard alignment) in `brand.json` `agents[type='measurement']`. Lowercase with underscores so a future enum promotion into `available-metric.json` is a literal string lift. Identifier is namespaced by the vendor \u2014 the same `metric_id` may mean different things in different vendors' vocabularies."), "value": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together."), "unit": z.string().optional(), "measurable_impressions": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "breakdown": z.record(z.string(), z.any()).optional() }).passthrough().describe("Compact forecasted vendor metric with a BrandKey vendor pointer and no embedded brand assets.")).optional() }).passthrough().describe("Compact forecast row with numeric ranges and identity-only measurement-vendor references.")).min(1), "forecast_range_unit": z.enum(["spend", "availability", "reach_freq", "weekly", "daily", "clicks", "conversions", "package"]).describe("Describes how to interpret the points array in a DeliveryForecast \u2014 what axis the curve represents").optional(), "method": z.enum(["estimate", "modeled", "guaranteed"]).describe("Method used to produce a delivery forecast"), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")), "demographic_system": z.enum(["nielsen", "nielsen_audio", "barb", "agf", "oztam", "mediametrie", "custom"]).describe("Audience measurement systems for demographic notation in GRP forecasts and pricing, across video and audio channels. Specifies how demographics are written, not whose panel produced the numbers \u2014 provider identity is measurement_source.").optional(), "demographic": z.string().optional(), "measurement_source": z.string().regex(new RegExp("^[a-z0-9_]+$")).max(64).optional(), "reach_unit": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").optional(), "generated_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "valid_until": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().describe("Compact product forecast without legacy BrandRef or creative dependencies.").describe("Aggregate forecasted delivery for the proposal. For outcome_target requests, points carry the goal's metric or event key in metrics; with cost_per, that is the goal volume planned under the commercial_terms.bidding policy, and currency equals cost_per.currency.").optional() }).passthrough().describe("Compact immutable proposal for the AdCP 3.2 lifecycle. commercial_terms is the sole authoritative commercial envelope; narrative fields do not duplicate legacy allocation or creative graphs.");
15357
15357
  const exactSchema = objectSchema.superRefine((value, ctx) => {
15358
15358
  const checked = z.intersection(z.intersection(z.union([z.any().refine((value2) => !z.object({ "proposal_kind": z.enum(["media_buy_update", "media_buy_cancellation"]) }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "proposal_kind": z.enum(["media_buy_update", "media_buy_cancellation"]) }), z.object({ "parent_proposal_id": z.any().refine((value2) => value2 !== void 0, "Required"), "media_buy_id": z.any().refine((value2) => value2 !== void 0, "Required"), "base_media_buy_revision": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough())]), z.union([z.any().refine((value2) => !z.object({ "proposal_status": z.literal("accepted") }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "proposal_status": z.literal("accepted") }), z.object({ "media_buy_id": z.any().refine((value2) => value2 !== void 0, "Required"), "accepted_at": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough())])), z.intersection(z.union([z.any().refine((value2) => !z.object({ "proposal_status": z.literal("committed") }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "proposal_status": z.literal("committed") }), z.object({ "expires_at": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough())]), z.union([z.any().refine((value2) => !z.object({ "proposal_kind": z.literal("media_buy_cancellation") }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "proposal_kind": z.literal("media_buy_cancellation") }), z.object({ "commercial_terms": z.object({ "cancellation_terms": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().optional() }))]))).safeParse(value);
15359
15359
  if (!checked.success) {
@@ -15434,7 +15434,7 @@ const BuyProductsRequestSchema = /* @__PURE__ */ (() => z.object({
15434
15434
  budget_cap_timezone: z.string().min(1).optional(),
15435
15435
  budget_allocation: CanonicalBudgetAllocationSchema.optional(),
15436
15436
  start_time: StartTimingSchema,
15437
- end_time: z.iso.datetime(),
15437
+ end_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
15438
15438
  pacing: PacingSchema.optional(),
15439
15439
  bidding: BiddingPolicySchema.optional(),
15440
15440
  paused: z.boolean().optional(),
@@ -15456,7 +15456,7 @@ const CommittedMediaBuySchema = /* @__PURE__ */ (() => z.object({
15456
15456
  name: z.string().min(1).max(255).regex(/\S/).optional(),
15457
15457
  revision: z.int().min(1),
15458
15458
  media_buy_status: MediaBuyStatusSchema.optional(),
15459
- confirmed_at: z.iso.datetime().optional().nullable(),
15459
+ confirmed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
15460
15460
  accepted_proposal: CanonicalProposalSchema.and(z.object({
15461
15461
  proposal_status: z.literal("accepted"),
15462
15462
  media_buy_id: z.string().min(1)
@@ -15987,8 +15987,8 @@ const PackageUpdateSchema = /* @__PURE__ */ (() => z.object({
15987
15987
  bidding: BiddingPolicySchema.optional().nullable(),
15988
15988
  impressions: z.number().min(0).optional(),
15989
15989
  daily_budget_cap: z.number().min(0).optional().nullable(),
15990
- start_time: z.iso.datetime().optional(),
15991
- end_time: z.iso.datetime().optional(),
15990
+ start_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
15991
+ end_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
15992
15992
  paused: z.boolean().optional(),
15993
15993
  canceled: z.literal(true).optional(),
15994
15994
  cancellation_reason: z.string().max(500).optional(),
@@ -16030,7 +16030,7 @@ const UpdateMediaBuySuccessSchema = /* @__PURE__ */ (() => z.object({
16030
16030
  budget_allocation: BudgetAllocationSchema.optional(),
16031
16031
  pacing: PacingSchema.optional(),
16032
16032
  bidding: BiddingPolicySchema.optional(),
16033
- implementation_date: z.iso.datetime().optional().nullable(),
16033
+ implementation_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
16034
16034
  invoice_recipient: BusinessEntitySchema.optional(),
16035
16035
  affected_packages: z.array(PackageSchema).optional(),
16036
16036
  valid_actions: z.array(MediaBuyValidActionSchema).optional(),
@@ -16105,16 +16105,16 @@ const PackageStatusSchema = /* @__PURE__ */ (() => z.object({
16105
16105
  pacing: PacingSchema.optional(),
16106
16106
  targeting_overlay: TargetingOverlaySchema.optional(),
16107
16107
  targeting_resolution: PackageTargetingResolutionSchema.optional(),
16108
- start_time: z.iso.datetime().optional(),
16109
- end_time: z.iso.datetime().optional(),
16108
+ start_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
16109
+ end_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
16110
16110
  paused: z.boolean().optional(),
16111
16111
  canceled: z.boolean().optional(),
16112
16112
  cancellation: z.object({
16113
- canceled_at: z.iso.datetime(),
16113
+ canceled_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
16114
16114
  canceled_by: CanceledBySchema,
16115
16115
  reason: z.string().max(500).optional()
16116
16116
  }).passthrough().optional(),
16117
- creative_deadline: z.iso.datetime().optional(),
16117
+ creative_deadline: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
16118
16118
  context: ContextObjectSchema.optional(),
16119
16119
  creative_approvals: z.array(z.object({
16120
16120
  creative_id: z.string(),
@@ -16124,8 +16124,8 @@ const PackageStatusSchema = /* @__PURE__ */ (() => z.object({
16124
16124
  indicators: z.array(IndicatorSchema.and(z.object({
16125
16125
  type: z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]).optional()
16126
16126
  }).passthrough())).optional(),
16127
- indicator_types_evaluated: z.array(IndicatorTypeSchema.and(z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]))).optional(),
16128
- indicators_as_of: z.iso.datetime().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
+ indicators_as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
16129
16129
  indicators_evaluated_scope: z.array(IndicatorScopeSchema).optional()
16130
16130
  }).passthrough()).optional(),
16131
16131
  formats_to_provide: z.array(PackageFormatSnapshotSchema).optional(),
@@ -16134,7 +16134,7 @@ const PackageStatusSchema = /* @__PURE__ */ (() => z.object({
16134
16134
  format_ids_pending: z.array(FormatReferenceStructuredObjectSchema).optional(),
16135
16135
  snapshot_unavailable_reason: SnapshotUnavailableReasonSchema.optional(),
16136
16136
  snapshot: z.object({
16137
- as_of: z.iso.datetime(),
16137
+ as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
16138
16138
  staleness_seconds: z.int().min(0),
16139
16139
  impressions: z.number().min(0),
16140
16140
  spend: z.number().min(0),
@@ -16200,10 +16200,10 @@ const GetMediaBuyDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
16200
16200
  partial_data: z.boolean().optional(),
16201
16201
  unavailable_count: z.int().min(0).optional(),
16202
16202
  sequence_number: z.int().min(1).optional(),
16203
- next_expected_at: z.iso.datetime().optional(),
16203
+ next_expected_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
16204
16204
  reporting_period: z.object({
16205
- start: z.iso.datetime(),
16206
- end: z.iso.datetime(),
16205
+ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
16206
+ end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
16207
16207
  timezone: z.string().min(1).optional()
16208
16208
  }).passthrough(),
16209
16209
  reporting_revision_binding: z.object({
@@ -16241,10 +16241,10 @@ const GetMediaBuyDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
16241
16241
  media_buy_id: z.string(),
16242
16242
  currency: z.string().regex(/^[A-Z]{3}$/).optional(),
16243
16243
  status: z.union([z.literal("pending_creatives"), z.literal("pending_start"), z.literal("pending"), z.literal("active"), z.literal("paused"), z.literal("completed"), z.literal("rejected"), z.literal("canceled"), z.literal("failed"), z.literal("reporting_delayed")]),
16244
- expected_availability: z.iso.datetime().optional(),
16244
+ expected_availability: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
16245
16245
  is_adjusted: z.boolean().optional(),
16246
16246
  is_final: z.boolean().optional(),
16247
- finalized_at: z.iso.datetime().optional(),
16247
+ finalized_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
16248
16248
  pricing_model: PricingModelSchema.optional(),
16249
16249
  pacing_index: z.number().min(0).optional(),
16250
16250
  totals: DeliveryMetricsSchema.merge(z.object({
@@ -16259,7 +16259,7 @@ const GetMediaBuyDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
16259
16259
  delivery_status: DeliveryStatusSchema.optional(),
16260
16260
  paused: z.boolean().optional(),
16261
16261
  is_final: z.boolean().optional(),
16262
- finalized_at: z.iso.datetime().optional(),
16262
+ finalized_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
16263
16263
  measurement_window: z.string().max(50).optional(),
16264
16264
  supersedes_window: z.string().max(50).optional(),
16265
16265
  missing_metrics: z.array(MissingMetricSchema).optional(),
@@ -16346,7 +16346,7 @@ const GetMediaBuyDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
16346
16346
  by_spot: z.array(DeliveryMetricsSchema.merge(z.object({
16347
16347
  spot_id: z.string().min(1),
16348
16348
  creative_id: z.string().min(1).optional(),
16349
- aired_at: z.iso.datetime(),
16349
+ aired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
16350
16350
  network: z.string().min(1).optional(),
16351
16351
  station: z.string().min(1).optional(),
16352
16352
  daypart: z.string().min(1).optional()
@@ -16364,8 +16364,8 @@ const GetMediaBuyDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
16364
16364
  }).passthrough()).optional()
16365
16365
  }).passthrough())),
16366
16366
  windows: z.array(z.object({
16367
- window_start: z.iso.datetime(),
16368
- window_end: z.iso.datetime(),
16367
+ window_start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
16368
+ window_end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
16369
16369
  totals: DeliveryMetricsSchema,
16370
16370
  by_package: z.array(DeliveryMetricsSchema.merge(z.object({
16371
16371
  package_id: z.string(),
@@ -16454,7 +16454,7 @@ const ProvidePerformanceFeedbackResponseSchema = /* @__PURE__ */ (() => z.object
16454
16454
  payload: z.object({}).passthrough().optional(),
16455
16455
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
16456
16456
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
16457
- }).passthrough().and(z.union([ProvidePerformanceFeedbackSuccessSchema, ProvidePerformanceFeedbackErrorSchema])))();
16457
+ }).passthrough().and(z.union([ProvidePerformanceFeedbackSuccessSchema, ProvidePerformanceFeedbackErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
16458
16458
  const SyncEventSourcesResponseSchema = /* @__PURE__ */ (() => z.object({
16459
16459
  context_id: z.string().optional(),
16460
16460
  context: ContextObjectSchema.optional(),
@@ -16469,7 +16469,7 @@ const SyncEventSourcesResponseSchema = /* @__PURE__ */ (() => z.object({
16469
16469
  payload: z.object({}).passthrough().optional(),
16470
16470
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
16471
16471
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
16472
- }).passthrough().and(z.union([SyncEventSourcesSuccessSchema, SyncEventSourcesErrorSchema])))();
16472
+ }).passthrough().and(z.union([SyncEventSourcesSuccessSchema, SyncEventSourcesErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
16473
16473
  const LogEventResponseSchema = /* @__PURE__ */ (() => z.object({
16474
16474
  context_id: z.string().optional(),
16475
16475
  context: ContextObjectSchema.optional(),
@@ -16484,7 +16484,7 @@ const LogEventResponseSchema = /* @__PURE__ */ (() => z.object({
16484
16484
  payload: z.object({}).passthrough().optional(),
16485
16485
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
16486
16486
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
16487
- }).passthrough().and(z.union([LogEventSuccessSchema, LogEventErrorSchema])))();
16487
+ }).passthrough().and(z.union([LogEventSuccessSchema, LogEventErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
16488
16488
  const SyncAudiencesResponseSchema = /* @__PURE__ */ (() => z.object({
16489
16489
  context_id: z.string().optional(),
16490
16490
  context: ContextObjectSchema.optional(),
@@ -16499,7 +16499,7 @@ const SyncAudiencesResponseSchema = /* @__PURE__ */ (() => z.object({
16499
16499
  payload: z.object({}).passthrough().optional(),
16500
16500
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
16501
16501
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
16502
- }).passthrough().and(z.union([SyncAudiencesSuccessSchema, SyncAudiencesErrorSchema, SyncAudiencesSubmittedSchema])))();
16502
+ }).passthrough().and(z.union([SyncAudiencesSuccessSchema, SyncAudiencesErrorSchema, SyncAudiencesSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
16503
16503
  const BuildCreativeRequestSchema = /* @__PURE__ */ (() => z.object({
16504
16504
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
16505
16505
  adcp_major_version: z.number().int().gte(1).lte(99).optional(),
@@ -16562,7 +16562,7 @@ const BuildCreativeSuccessSchema = /* @__PURE__ */ (() => z.object({
16562
16562
  build_variant_id: z.string().optional(),
16563
16563
  recipe_hash: z.string().optional(),
16564
16564
  sandbox: z.boolean().optional(),
16565
- expires_at: z.iso.datetime().optional(),
16565
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
16566
16566
  preview: z.object({
16567
16567
  previews: z.array(z.object({
16568
16568
  preview_id: z.string(),
@@ -16574,7 +16574,7 @@ const BuildCreativeSuccessSchema = /* @__PURE__ */ (() => z.object({
16574
16574
  }).passthrough()
16575
16575
  }).passthrough()),
16576
16576
  interactive_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
16577
- expires_at: z.iso.datetime()
16577
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
16578
16578
  }).passthrough().optional(),
16579
16579
  preview_error: ErrorSchema.optional(),
16580
16580
  pricing_option_id: z.string().optional(),
@@ -16675,7 +16675,7 @@ const PreviewCreativeResponseSchema = /* @__PURE__ */ (() => z.object({
16675
16675
  payload: z.object({}).passthrough().optional(),
16676
16676
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
16677
16677
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
16678
- }).passthrough().and(z.union([PreviewCreativeSingleResponseSchema, PreviewCreativeBatchResponseSchema, PreviewCreativeVariantResponseSchema, PreviewCreativeSubmittedSchema])))();
16678
+ }).passthrough().and(z.union([PreviewCreativeSingleResponseSchema, PreviewCreativeBatchResponseSchema, PreviewCreativeVariantResponseSchema, PreviewCreativeSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
16679
16679
  const ListTransformersResponseCreativeAgentSchema = /* @__PURE__ */ (() => z.object({
16680
16680
  context_id: z.string().optional(),
16681
16681
  context: ContextObjectSchema.optional(),
@@ -16713,8 +16713,8 @@ const GetCreativeDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
16713
16713
  media_buy_id: z.string().optional(),
16714
16714
  currency: z.string().regex(/^[A-Z]{3}$/),
16715
16715
  reporting_period: z.object({
16716
- start: z.iso.datetime(),
16717
- end: z.iso.datetime(),
16716
+ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
16717
+ end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
16718
16718
  timezone: z.string().optional()
16719
16719
  }).passthrough(),
16720
16720
  creatives: z.array(z.object({
@@ -16792,7 +16792,7 @@ const SyncCreativesSuccessSchema = /* @__PURE__ */ (() => z.object({
16792
16792
  warnings: z.array(z.string()).optional(),
16793
16793
  macro_resolution_results: z.array(MacroResolutionResultSchema).optional(),
16794
16794
  preview_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
16795
- expires_at: z.iso.datetime().optional(),
16795
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
16796
16796
  assigned_to: z.array(z.string()).optional(),
16797
16797
  assignment_errors: z.record(z.string(), z.string()).optional()
16798
16798
  }).passthrough()),
@@ -16820,7 +16820,7 @@ const ActivateSignalResponseSchema = /* @__PURE__ */ (() => z.object({
16820
16820
  payload: z.object({}).passthrough().optional(),
16821
16821
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
16822
16822
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
16823
- }).passthrough().and(z.union([ActivateSignalSuccessSchema, ActivateSignalErrorSchema])))();
16823
+ }).passthrough().and(z.union([ActivateSignalSuccessSchema, ActivateSignalErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
16824
16824
  const CreatePropertyListResponseSchema = /* @__PURE__ */ (() => z.object({
16825
16825
  context_id: z.string().optional(),
16826
16826
  context: ContextObjectSchema.optional(),
@@ -16880,7 +16880,7 @@ const ListContentStandardsResponseSchema = /* @__PURE__ */ (() => z.object({
16880
16880
  errors: z.array(ErrorSchema),
16881
16881
  context: ContextObjectSchema.optional(),
16882
16882
  ext: ExtensionObjectSchema.optional()
16883
- }).passthrough()])))();
16883
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
16884
16884
  const GetContentStandardsResponseSchema = /* @__PURE__ */ (() => z.object({
16885
16885
  context_id: z.string().optional(),
16886
16886
  context: ContextObjectSchema.optional(),
@@ -16913,7 +16913,7 @@ const GetContentStandardsResponseSchema = /* @__PURE__ */ (() => z.object({
16913
16913
  errors: z.array(ErrorSchema),
16914
16914
  context: ContextObjectSchema.optional(),
16915
16915
  ext: ExtensionObjectSchema.optional()
16916
- }).passthrough()])))();
16916
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
16917
16917
  const CreateContentStandardsRequestSchema = /* @__PURE__ */ (() => z.object({
16918
16918
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
16919
16919
  adcp_major_version: z.number().int().gte(1).lte(99).optional(),
@@ -16955,7 +16955,7 @@ const UpdateContentStandardsResponseSchema = /* @__PURE__ */ (() => z.object({
16955
16955
  payload: z.object({}).passthrough().optional(),
16956
16956
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
16957
16957
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
16958
- }).passthrough().and(z.union([UpdateContentStandardsSuccessSchema, UpdateContentStandardsErrorSchema])))();
16958
+ }).passthrough().and(z.union([UpdateContentStandardsSuccessSchema, UpdateContentStandardsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
16959
16959
  const GetCreativeFeaturesRequestSchema = /* @__PURE__ */ (() => z.object({
16960
16960
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
16961
16961
  adcp_major_version: z.number().int().gte(1).lte(99).optional(),
@@ -16982,17 +16982,17 @@ const ReportPlanOutcomeRequestSchema = /* @__PURE__ */ (() => z.object({
16982
16982
  budget: z.number().min(0).optional()
16983
16983
  }).passthrough()).optional(),
16984
16984
  planned_delivery: PlannedDeliverySchema.optional(),
16985
- creative_deadline: z.iso.datetime().optional()
16985
+ creative_deadline: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
16986
16986
  }).passthrough().optional(),
16987
16987
  delivery: z.union([z.object({
16988
16988
  observation_id: z.string().min(1).max(255),
16989
16989
  source: z.literal("seller_statement_copy"),
16990
- observed_at: z.iso.datetime(),
16990
+ observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
16991
16991
  seller_statement_id: z.string(),
16992
16992
  seller_statement_digest: z.string().regex(/^sha256:[a-f0-9]{64}$/),
16993
16993
  reporting_period: z.object({
16994
- start: z.iso.datetime(),
16995
- end: z.iso.datetime()
16994
+ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
16995
+ end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
16996
16996
  }).passthrough(),
16997
16997
  cumulative_spend: z.number().min(0),
16998
16998
  currency: z.string().regex(/^[A-Z]{3}$/),
@@ -17001,12 +17001,12 @@ const ReportPlanOutcomeRequestSchema = /* @__PURE__ */ (() => z.object({
17001
17001
  }).passthrough(), z.object({
17002
17002
  observation_id: z.string().min(1).max(255),
17003
17003
  source: z.literal("buyer_measurement"),
17004
- observed_at: z.iso.datetime(),
17004
+ observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
17005
17005
  seller_statement_id: z.string().optional(),
17006
17006
  seller_statement_digest: z.string().regex(/^sha256:[a-f0-9]{64}$/).optional(),
17007
17007
  reporting_period: z.object({
17008
- start: z.iso.datetime(),
17009
- end: z.iso.datetime()
17008
+ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
17009
+ end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
17010
17010
  }).passthrough(),
17011
17011
  cumulative_spend: z.number().min(0),
17012
17012
  currency: z.string().regex(/^[A-Z]{3}$/),
@@ -17044,10 +17044,10 @@ const CheckGovernanceRequestSchema = /* @__PURE__ */ (() => z.object({}).passthr
17044
17044
  statement_id: z.string().min(1).max(255).optional(),
17045
17045
  statement_digest: z.string().regex(/^sha256:[a-f0-9]{64}$/).optional(),
17046
17046
  sequence: z.int().min(1).optional(),
17047
- issued_at: z.iso.datetime().optional(),
17047
+ issued_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
17048
17048
  reporting_period: z.object({
17049
- start: z.iso.datetime(),
17050
- end: z.iso.datetime()
17049
+ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
17050
+ end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
17051
17051
  }).passthrough(),
17052
17052
  spend: z.number().min(0).optional(),
17053
17053
  cumulative_spend: z.number().min(0).optional(),
@@ -17113,7 +17113,7 @@ const GetAdCPCapabilitiesResponseSchema = /* @__PURE__ */ (() => z.object({
17113
17113
  }).passthrough().optional(),
17114
17114
  capability_changes: z.object({
17115
17115
  capabilities_version: z.string().min(1).max(255).optional(),
17116
- last_modified: z.iso.datetime().optional(),
17116
+ last_modified: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
17117
17117
  cache_ttl_seconds: z.int().min(60).max(604800).optional(),
17118
17118
  notifications: z.union([CapabilityChangeNotificationsSupportedSchema, CapabilityChangeNotificationsUnsupportedSchema]).optional()
17119
17119
  }).passthrough().optional(),
@@ -17485,7 +17485,7 @@ const GetAdCPCapabilitiesResponseSchema = /* @__PURE__ */ (() => z.object({
17485
17485
  pricing_version_separate: z.boolean().optional(),
17486
17486
  cache_scope_account: z.boolean().optional()
17487
17487
  }).passthrough().optional(),
17488
- last_updated: z.iso.datetime().optional(),
17488
+ last_updated: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
17489
17489
  errors: z.array(ErrorSchema).optional(),
17490
17490
  ext: ExtensionObjectSchema.optional(),
17491
17491
  wholesale_feed_webhooks: z.object({
@@ -17606,7 +17606,7 @@ const SyncAccountsSuccessSchema = /* @__PURE__ */ (() => z.object({
17606
17606
  setup: z.object({
17607
17607
  url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
17608
17608
  message: z.string(),
17609
- expires_at: z.iso.datetime().optional()
17609
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
17610
17610
  }).passthrough().optional(),
17611
17611
  rate_card: z.string().optional(),
17612
17612
  payment_terms: PaymentTermsSchema.optional(),
@@ -17638,7 +17638,7 @@ const SyncGovernanceResponseSchema = /* @__PURE__ */ (() => z.object({
17638
17638
  payload: z.object({}).passthrough().optional(),
17639
17639
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
17640
17640
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
17641
- }).passthrough().and(z.union([SyncGovernanceSuccessSchema, SyncGovernanceErrorSchema])))();
17641
+ }).passthrough().and(z.union([SyncGovernanceSuccessSchema, SyncGovernanceErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
17642
17642
  const GetAccountFinancialsResponseSchema = /* @__PURE__ */ (() => z.object({
17643
17643
  context_id: z.string().optional(),
17644
17644
  context: ContextObjectSchema.optional(),
@@ -17653,7 +17653,7 @@ const GetAccountFinancialsResponseSchema = /* @__PURE__ */ (() => z.object({
17653
17653
  payload: z.object({}).passthrough().optional(),
17654
17654
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
17655
17655
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
17656
- }).passthrough().and(z.union([GetAccountFinancialsSuccessSchema, GetAccountFinancialsErrorSchema])))();
17656
+ }).passthrough().and(z.union([GetAccountFinancialsSuccessSchema, GetAccountFinancialsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
17657
17657
  const GetProductsCompletionSchema = /* @__PURE__ */ (() => AdCPVersionEnvelopeSchema.merge(ProtocolEnvelopeSchema).merge(z.object({}).passthrough()).merge(z.object({
17658
17658
  products: z.array(ProductSchema).optional(),
17659
17659
  targeting_resolution: ProductDiscoveryTargetingResolutionSchema.optional(),
@@ -17708,7 +17708,7 @@ const UpstreamTrafficSuccessSchema = /* @__PURE__ */ (() => z.object({
17708
17708
  recorded_calls: z.array(z.union([RawAttestationSchema, DigestAttestationSchema])),
17709
17709
  total_count: z.int().min(0),
17710
17710
  truncated: z.boolean().optional(),
17711
- since_timestamp: z.iso.datetime(),
17711
+ since_timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
17712
17712
  context: ContextObjectSchema.optional(),
17713
17713
  ext: ExtensionObjectSchema.optional()
17714
17714
  }).passthrough())();
@@ -17768,8 +17768,8 @@ const ValidatePropertyDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
17768
17768
  unknown_impressions: z.int()
17769
17769
  }).passthrough().optional(),
17770
17770
  results: z.array(ValidationResultSchema),
17771
- validated_at: z.iso.datetime(),
17772
- list_resolved_at: z.iso.datetime().optional(),
17771
+ validated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
17772
+ list_resolved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
17773
17773
  ext: ExtensionObjectSchema.optional()
17774
17774
  }).passthrough())();
17775
17775
  const RequestProposalsResponseSchema = /* @__PURE__ */ (() => z.union([z.object({
@@ -17779,7 +17779,7 @@ const RequestProposalsResponseSchema = /* @__PURE__ */ (() => z.union([z.object(
17779
17779
  suggestions: z.never().optional(),
17780
17780
  proposals: z.array(CanonicalProposalSchema.and(z.object({
17781
17781
  proposal_status: z.literal("draft"),
17782
- expires_at: z.iso.datetime()
17782
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
17783
17783
  }).passthrough())),
17784
17784
  products: z.array(CanonicalProductSchema),
17785
17785
  incomplete: z.array(z.object({
@@ -17817,7 +17817,7 @@ const RequestProposalsResponseSchema = /* @__PURE__ */ (() => z.union([z.object(
17817
17817
  }).passthrough(), z.object({
17818
17818
  kind: z.literal("legacy_create"),
17819
17819
  continuation_token: z.string().min(16),
17820
- continuation_expires_at: z.iso.datetime(),
17820
+ continuation_expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
17821
17821
  source_adcp_version: z.union([z.literal("2.5"), z.literal("3.0"), z.literal("3.1")]),
17822
17822
  product_ids: z.array(z.string()),
17823
17823
  losses: z.array(z.union([z.literal("feed_version_not_atomic"), z.literal("pricing_version_not_atomic"), z.literal("mutation_idempotency_not_guaranteed")])),
@@ -17879,7 +17879,7 @@ const RequestProposalsResponseSchema = /* @__PURE__ */ (() => z.union([z.object(
17879
17879
  suggestions: z.array(z.string()).optional(),
17880
17880
  proposals: z.array(CanonicalProposalSchema.and(z.object({
17881
17881
  proposal_status: z.literal("draft"),
17882
- expires_at: z.iso.datetime()
17882
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
17883
17883
  }).passthrough())).optional(),
17884
17884
  products: z.array(CanonicalProductSchema).optional(),
17885
17885
  incomplete: z.array(z.object({
@@ -17896,7 +17896,7 @@ const RequestProposalsResponseSchema = /* @__PURE__ */ (() => z.union([z.object(
17896
17896
  }).passthrough(), z.object({
17897
17897
  kind: z.literal("legacy_create"),
17898
17898
  continuation_token: z.string().min(16),
17899
- continuation_expires_at: z.iso.datetime(),
17899
+ continuation_expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
17900
17900
  source_adcp_version: z.union([z.literal("2.5"), z.literal("3.0"), z.literal("3.1")]),
17901
17901
  product_ids: z.array(z.string()),
17902
17902
  losses: z.array(z.union([z.literal("feed_version_not_atomic"), z.literal("pricing_version_not_atomic"), z.literal("mutation_idempotency_not_guaranteed")])),
@@ -18002,9 +18002,9 @@ const MediaBuySchema = /* @__PURE__ */ (() => z.object({
18002
18002
  health: MediaBuyHealthSchema.and(z.string()).optional(),
18003
18003
  impairments: z.array(ImpairmentSchema).optional(),
18004
18004
  rejection_reason: z.string().optional(),
18005
- confirmed_at: z.iso.datetime().nullable(),
18005
+ confirmed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").nullable(),
18006
18006
  cancellation: z.object({
18007
- canceled_at: z.iso.datetime(),
18007
+ canceled_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18008
18008
  canceled_by: CanceledBySchema,
18009
18009
  reason: z.string().max(500).optional()
18010
18010
  }).passthrough().optional(),
@@ -18019,10 +18019,10 @@ const MediaBuySchema = /* @__PURE__ */ (() => z.object({
18019
18019
  packages: z.array(PackageSchema),
18020
18020
  context: ContextObjectSchema.optional(),
18021
18021
  invoice_recipient: BusinessEntity1Schema.optional(),
18022
- creative_deadline: z.iso.datetime().optional(),
18022
+ creative_deadline: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18023
18023
  revision: z.int().min(1),
18024
- created_at: z.iso.datetime().optional(),
18025
- updated_at: z.iso.datetime().optional(),
18024
+ created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18025
+ updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18026
18026
  ext: ExtensionObjectSchema.optional()
18027
18027
  }).passthrough())();
18028
18028
  const RefineProposalsResponseSchema = /* @__PURE__ */ (() => z.union([z.object({
@@ -18228,7 +18228,7 @@ const UpdateMediaBuyResponseSchema = /* @__PURE__ */ (() => z.object({
18228
18228
  payload: z.object({}).passthrough().optional(),
18229
18229
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
18230
18230
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
18231
- }).passthrough().and(z.union([UpdateMediaBuySuccessSchema, UpdateMediaBuyErrorSchema, UpdateMediaBuySubmittedSchema])))();
18231
+ }).passthrough().and(z.union([UpdateMediaBuySuccessSchema, UpdateMediaBuyErrorSchema, UpdateMediaBuySubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
18232
18232
  const BuildCreativeResponseSchema = /* @__PURE__ */ (() => z.object({
18233
18233
  context_id: z.string().optional(),
18234
18234
  context: ContextObjectSchema.optional(),
@@ -18243,7 +18243,7 @@ const BuildCreativeResponseSchema = /* @__PURE__ */ (() => z.object({
18243
18243
  payload: z.object({}).passthrough().optional(),
18244
18244
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
18245
18245
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
18246
- }).passthrough().and(z.union([BuildCreativeSuccessSchema, BuildCreativeMultiSuccessSchema, BuildCreativeVariantSuccessSchema, BuildCreativeEstimateSchema, BuildCreativeErrorSchema, BuildCreativeSubmittedSchema])))();
18246
+ }).passthrough().and(z.union([BuildCreativeSuccessSchema, BuildCreativeMultiSuccessSchema, BuildCreativeVariantSuccessSchema, BuildCreativeEstimateSchema, BuildCreativeErrorSchema, BuildCreativeSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
18247
18247
  const SyncCreativesResponseSchema = /* @__PURE__ */ (() => z.object({
18248
18248
  context_id: z.string().optional(),
18249
18249
  context: ContextObjectSchema.optional(),
@@ -18258,7 +18258,7 @@ const SyncCreativesResponseSchema = /* @__PURE__ */ (() => z.object({
18258
18258
  payload: z.object({}).passthrough().optional(),
18259
18259
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
18260
18260
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
18261
- }).passthrough().and(z.union([SyncCreativesSuccessSchema, SyncCreativesErrorSchema, SyncCreativesSubmittedSchema])))();
18261
+ }).passthrough().and(z.union([SyncCreativesSuccessSchema, SyncCreativesErrorSchema, SyncCreativesSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
18262
18262
  const CreateMediaBuySuccessSchema = /* @__PURE__ */ (() => z.object({
18263
18263
  proposal_id: z.string().min(1).optional(),
18264
18264
  media_buy_id: z.string(),
@@ -18266,8 +18266,8 @@ const CreateMediaBuySuccessSchema = /* @__PURE__ */ (() => z.object({
18266
18266
  account: AccountSchema.optional(),
18267
18267
  invoice_recipient: BusinessEntitySchema.optional(),
18268
18268
  media_buy_status: MediaBuyStatusSchema.optional(),
18269
- confirmed_at: z.iso.datetime().optional().nullable(),
18270
- creative_deadline: z.iso.datetime().optional(),
18269
+ confirmed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
18270
+ creative_deadline: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18271
18271
  revision: z.int().min(1).optional(),
18272
18272
  currency: z.string().regex(/^[A-Z]{3}$/).optional(),
18273
18273
  total_budget: z.number().min(0).optional(),
@@ -18300,7 +18300,7 @@ const AcquireRightsResponseSchema = /* @__PURE__ */ (() => z.object({
18300
18300
  payload: z.object({}).passthrough().optional(),
18301
18301
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
18302
18302
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
18303
- }).passthrough().and(z.union([AcquireRightsAcquiredSchema, AcquireRightsPendingApprovalSchema, AcquireRightsRejectedSchema, AcquireRightsErrorSchema])))();
18303
+ }).passthrough().and(z.union([AcquireRightsAcquiredSchema, AcquireRightsPendingApprovalSchema, AcquireRightsRejectedSchema, AcquireRightsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
18304
18304
  const GetRightsResponseSchema = /* @__PURE__ */ (() => z.object({
18305
18305
  context_id: z.string().optional(),
18306
18306
  context: ContextObjectSchema.optional(),
@@ -18315,8 +18315,8 @@ const GetRightsResponseSchema = /* @__PURE__ */ (() => z.object({
18315
18315
  payload: z.object({}).passthrough().optional(),
18316
18316
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
18317
18317
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
18318
- }).passthrough().and(z.union([GetRightsSuccessSchema, GetRightsErrorSchema])))();
18319
- const SearchBrandsResponseSchema = /* @__PURE__ */ (() => AdCPVersionEnvelopeSchema.merge(ProtocolEnvelopeSchema).and(z.union([SearchBrandsSuccessSchema, SearchBrandsErrorSchema])))();
18318
+ }).passthrough().and(z.union([GetRightsSuccessSchema, GetRightsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
18319
+ const SearchBrandsResponseSchema = /* @__PURE__ */ (() => AdCPVersionEnvelopeSchema.merge(ProtocolEnvelopeSchema).and(z.union([SearchBrandsSuccessSchema, SearchBrandsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
18320
18320
  const UpdateRightsResponseSchema = /* @__PURE__ */ (() => z.object({
18321
18321
  context_id: z.string().optional(),
18322
18322
  context: ContextObjectSchema.optional(),
@@ -18331,7 +18331,7 @@ const UpdateRightsResponseSchema = /* @__PURE__ */ (() => z.object({
18331
18331
  payload: z.object({}).passthrough().optional(),
18332
18332
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
18333
18333
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
18334
- }).passthrough().and(z.union([UpdateRightsSuccessSchema, UpdateRightsErrorSchema])))();
18334
+ }).passthrough().and(z.union([UpdateRightsSuccessSchema, UpdateRightsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
18335
18335
  const VerifyBrandClaimResponseSchema = /* @__PURE__ */ (() => z.object({
18336
18336
  context_id: z.string().optional(),
18337
18337
  context: ContextObjectSchema.optional(),
@@ -18346,7 +18346,7 @@ const VerifyBrandClaimResponseSchema = /* @__PURE__ */ (() => z.object({
18346
18346
  payload: z.object({}).passthrough().optional(),
18347
18347
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
18348
18348
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
18349
- }).passthrough().and(z.union([VerifyBrandClaimSuccessSchema, VerifyBrandClaimErrorSchema])))();
18349
+ }).passthrough().and(z.union([VerifyBrandClaimSuccessSchema, VerifyBrandClaimErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
18350
18350
  const VerifyBrandClaimsResponseBulkSchema = /* @__PURE__ */ (() => z.object({
18351
18351
  context_id: z.string().optional(),
18352
18352
  context: ContextObjectSchema.optional(),
@@ -18361,7 +18361,7 @@ const VerifyBrandClaimsResponseBulkSchema = /* @__PURE__ */ (() => z.object({
18361
18361
  payload: z.object({}).passthrough().optional(),
18362
18362
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
18363
18363
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
18364
- }).passthrough().and(z.union([VerifyBrandClaimsSuccessSchema, VerifyBrandClaimsErrorSchema])))();
18364
+ }).passthrough().and(z.union([VerifyBrandClaimsSuccessSchema, VerifyBrandClaimsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
18365
18365
  const AppItemSchema = /* @__PURE__ */ (() => z.object({
18366
18366
  app_id: z.string(),
18367
18367
  name: z.string(),
@@ -18439,8 +18439,8 @@ const RegistryFeedResponseSchema = /* @__PURE__ */ (() => z.object({
18439
18439
  cursor: z.uuid().nullable(),
18440
18440
  has_more: z.boolean(),
18441
18441
  freshness: z.object({
18442
- generated_at: z.iso.datetime(),
18443
- latest_event_created_at: z.iso.datetime().nullable(),
18442
+ generated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18443
+ latest_event_created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").nullable(),
18444
18444
  lag_seconds: z.int().min(0).nullable(),
18445
18445
  retention_days: z.int().min(1)
18446
18446
  }).passthrough()
@@ -18450,7 +18450,7 @@ const WholesaleFeedEventSchema = /* @__PURE__ */ (() => z.object({
18450
18450
  event_type: z.union([z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change")]),
18451
18451
  entity_type: z.union([z.literal("product"), z.literal("signal"), z.literal("feed")]),
18452
18452
  entity_id: z.string(),
18453
- created_at: z.iso.datetime(),
18453
+ created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18454
18454
  payload: z.object({}).passthrough()
18455
18455
  }).passthrough().and(z.union([z.object({
18456
18456
  event_type: z.literal("product.created"),
@@ -18479,7 +18479,7 @@ const WholesaleFeedEventSchema = /* @__PURE__ */ (() => z.object({
18479
18479
  pricing_options: z.array(PricingOptionSchema).optional(),
18480
18480
  canonical_pricing_options: z.array(CanonicalPricingOptionSchema).optional(),
18481
18481
  previous_pricing_option_ids: z.array(z.string()).optional(),
18482
- effective_at: z.iso.datetime().optional(),
18482
+ effective_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18483
18483
  retracts_event_id: z.uuid().optional(),
18484
18484
  applies_to: CacheLayerScopeSchema
18485
18485
  }).passthrough().optional()
@@ -18518,7 +18518,7 @@ const WholesaleFeedEventSchema = /* @__PURE__ */ (() => z.object({
18518
18518
  signal_ref: SignalRefSchema.optional(),
18519
18519
  pricing_options: z.array(VendorPricingOptionSchema),
18520
18520
  previous_pricing_option_ids: z.array(z.string()).optional(),
18521
- effective_at: z.iso.datetime().optional(),
18521
+ effective_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18522
18522
  retracts_event_id: z.uuid().optional(),
18523
18523
  applies_to: CacheLayerScopeSchema
18524
18524
  }).passthrough().optional()
@@ -18541,12 +18541,12 @@ const WholesaleFeedEventSchema = /* @__PURE__ */ (() => z.object({
18541
18541
  applies_to: CacheLayerScopeSchema,
18542
18542
  affected_entity_type: z.union([z.literal("product"), z.literal("signal")])
18543
18543
  }).passthrough().optional()
18544
- }).passthrough()])))();
18544
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
18545
18545
  const WholesaleFeedWebhookSchema = /* @__PURE__ */ (() => z.object({
18546
18546
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
18547
18547
  notification_id: z.uuid(),
18548
18548
  notification_type: z.union([z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change")]),
18549
- fired_at: z.iso.datetime(),
18549
+ fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18550
18550
  subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
18551
18551
  account_id: z.string(),
18552
18552
  wholesale_feed_version: z.string(),
@@ -18609,7 +18609,7 @@ const ListProductsResponseSchema = /* @__PURE__ */ (() => z.object({
18609
18609
  replayed: z.literal(true).optional(),
18610
18610
  context: ContextObjectSchema.optional(),
18611
18611
  ext: ExtensionObjectSchema.optional()
18612
- }).passthrough()])))();
18612
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
18613
18613
  const BuyProductsResponseSchema = /* @__PURE__ */ (() => MediaBuyCommitmentResponseSchema)();
18614
18614
  const AcceptProposalResponseSchema = /* @__PURE__ */ (() => MediaBuyCommitmentResponseSchema)();
18615
18615
  const ExplicitPackagesWithFixedAllocationSchema = /* @__PURE__ */ (() => z.object({
@@ -18632,7 +18632,7 @@ const CreateMediaBuyResponseSchema = /* @__PURE__ */ (() => z.object({
18632
18632
  payload: z.object({}).passthrough().optional(),
18633
18633
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
18634
18634
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
18635
- }).passthrough().and(z.union([CreateMediaBuySuccessSchema, CreateMediaBuyErrorSchema, CreateMediaBuySubmittedSchema])))();
18635
+ }).passthrough().and(z.union([CreateMediaBuySuccessSchema, CreateMediaBuyErrorSchema, CreateMediaBuySubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
18636
18636
  const UpdateMediaBuyRequestSchema = /* @__PURE__ */ (() => z.object({
18637
18637
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
18638
18638
  adcp_major_version: z.number().int().gte(1).lte(99).optional(),
@@ -18645,7 +18645,7 @@ const UpdateMediaBuyRequestSchema = /* @__PURE__ */ (() => z.object({
18645
18645
  canceled: z.literal(true).optional(),
18646
18646
  cancellation_reason: z.string().max(500).optional(),
18647
18647
  start_time: StartTimingSchema.optional(),
18648
- end_time: z.iso.datetime().optional(),
18648
+ end_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18649
18649
  total_budget: z.object({
18650
18650
  amount: z.number().min(0),
18651
18651
  currency: z.string().regex(/^[A-Z]{3}$/)
@@ -18677,7 +18677,7 @@ const GetMediaBuysResponseMediaBuySchema = /* @__PURE__ */ (() => z.object({
18677
18677
  account: AccountSchema.optional(),
18678
18678
  invoice_recipient: BusinessEntitySchema.optional(),
18679
18679
  status: MediaBuyStatusSchema,
18680
- status_as_of: z.iso.datetime().optional().nullable(),
18680
+ status_as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
18681
18681
  health: MediaBuyHealthSchema.and(z.string()).optional(),
18682
18682
  impairments: z.array(ImpairmentSchema).optional(),
18683
18683
  rejection_reason: z.string().optional(),
@@ -18689,25 +18689,25 @@ const GetMediaBuysResponseMediaBuySchema = /* @__PURE__ */ (() => z.object({
18689
18689
  budget_allocation: BudgetAllocationSchema.optional(),
18690
18690
  pacing: PacingSchema.optional(),
18691
18691
  bidding: BiddingPolicySchema.optional(),
18692
- start_time: z.iso.datetime().optional(),
18693
- end_time: z.iso.datetime().optional(),
18694
- creative_deadline: z.iso.datetime().optional(),
18695
- confirmed_at: z.iso.datetime().optional().nullable(),
18692
+ start_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18693
+ end_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18694
+ creative_deadline: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18695
+ confirmed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
18696
18696
  cancellation: z.object({
18697
- canceled_at: z.iso.datetime(),
18697
+ canceled_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18698
18698
  canceled_by: CanceledBySchema,
18699
18699
  reason: z.string().max(500).optional()
18700
18700
  }).passthrough().optional(),
18701
18701
  revision: z.int().min(1).optional(),
18702
- created_at: z.iso.datetime().optional(),
18703
- updated_at: z.iso.datetime().optional(),
18702
+ created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18703
+ updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18704
18704
  context: ContextObjectSchema.optional(),
18705
18705
  valid_actions: z.array(MediaBuyValidActionSchema).optional(),
18706
18706
  available_actions: z.array(z.union([CanonicalMediaBuyActionSchema, MediaBuyAvailableActionSchema])).optional(),
18707
18707
  webhook_activity: z.array(WebhookActivityRecordSchema).max(200).optional(),
18708
18708
  history: z.array(z.object({
18709
18709
  revision: z.int().min(1),
18710
- timestamp: z.iso.datetime(),
18710
+ timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18711
18711
  actor: z.string().optional(),
18712
18712
  action: z.string(),
18713
18713
  summary: z.string().max(500).optional(),
@@ -18737,12 +18737,12 @@ const GetReportingStatusResponseSchema = /* @__PURE__ */ (() => z.object({
18737
18737
  adcp_major_version: z.number().gte(1).lte(99).int().optional(),
18738
18738
  view: ReportingStatusViewSchema.optional(),
18739
18739
  ledger_snapshot_id: z.string().min(1).max(255).optional(),
18740
- ledger_as_of: z.iso.datetime().optional(),
18740
+ ledger_as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18741
18741
  changes_checkpoint: z.string().min(1).max(2048).optional(),
18742
18742
  account_id: z.string().min(1).optional(),
18743
18743
  scope: z.object({
18744
- period_start: z.iso.datetime(),
18745
- period_end: z.iso.datetime(),
18744
+ period_start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18745
+ period_end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18746
18746
  scope_closed: z.boolean(),
18747
18747
  media_buy_ids: z.array(ReportingMediaBuyIDSchema).optional(),
18748
18748
  all_accessible_media_buys: z.boolean(),
@@ -18753,13 +18753,13 @@ const GetReportingStatusResponseSchema = /* @__PURE__ */ (() => z.object({
18753
18753
  }).passthrough()),
18754
18754
  feed_purposes: z.array(ReportingFeedPurposeSchema),
18755
18755
  finality: z.array(ReportingFinalitySchema),
18756
- ledger_retained_from: z.iso.datetime(),
18756
+ ledger_retained_from: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18757
18757
  coverage_complete: z.boolean()
18758
18758
  }).passthrough().optional(),
18759
18759
  health: ReportingHealthSchema.optional(),
18760
18760
  coverage: ReportingCoverageSchema.optional(),
18761
- data_through: z.iso.datetime().optional().nullable(),
18762
- next_expected_at: z.iso.datetime().optional(),
18761
+ data_through: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
18762
+ next_expected_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18763
18763
  obligation_counts: z.object({
18764
18764
  total: z.int().min(0),
18765
18765
  waiting: z.int().min(0),
@@ -18781,7 +18781,7 @@ const GetReportingStatusResponseSchema = /* @__PURE__ */ (() => z.object({
18781
18781
  receipts: z.array(ReportingReceiptSchema).optional(),
18782
18782
  errors: z.array(ErrorSchema).optional(),
18783
18783
  ext: ExtensionObjectSchema.optional()
18784
- }).passthrough().and(z.union([SuccessfulLookupSchema, FailedLookupSchema])).superRefine((value, ctx) => {
18784
+ }).passthrough().and(z.union([SuccessfulLookupSchema, FailedLookupSchema]).describe("Must also satisfy at least one of these alternatives.")).superRefine((value, ctx) => {
18785
18785
  const closedStructures = { "scope": { "allowedFields": ["period_start", "period_end", "scope_closed", "media_buy_ids", "all_accessible_media_buys", "delivery_config_generations", "feed_purposes", "finality", "ledger_retained_from", "coverage_complete"], "requiredFields": ["period_start", "period_end", "scope_closed", "all_accessible_media_buys", "delivery_config_generations", "feed_purposes", "finality", "ledger_retained_from", "coverage_complete"] }, "deliveryConfigGeneration": { "allowedFields": ["delivery_config_id", "delivery_config_version", "feed_purpose"], "requiredFields": ["delivery_config_id", "delivery_config_version", "feed_purpose"] }, "obligationCounts": { "allowedFields": ["total", "waiting", "healthy", "delayed", "action_required", "complete", "consumer_status_pending"], "requiredFields": ["total", "waiting", "healthy", "delayed", "action_required", "complete"] }, "pagination": { "allowedFields": ["has_more", "cursor", "total_count"], "requiredFields": ["has_more"] }, "paginationRequiredByView": { "periods": ["has_more", "total_count"], "revision": ["has_more", "total_count"] } };
18786
18786
  const addIssues = (schema, candidate, path) => {
18787
18787
  const parsed = schema.safeParse(candidate);
@@ -18870,8 +18870,8 @@ const ListedCreativeNamedFormatReferenceSchema = /* @__PURE__ */ (() => z.object
18870
18870
  format_id: FormatReferenceStructuredObjectSchema,
18871
18871
  format_option_ref: FormatOptionReferenceSchema.optional(),
18872
18872
  status: CreativeStatusSchema,
18873
- created_date: z.iso.datetime(),
18874
- updated_date: z.iso.datetime(),
18873
+ created_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18874
+ updated_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18875
18875
  assets: z.record(z.string(), z.union([AssetVariantSchema, z.array(AssetVariantSchema)])).optional(),
18876
18876
  component_assets: z.record(z.string(), CreativeAssetsSchema).optional(),
18877
18877
  localization: CreativeLocalizationReadbackSchema.optional(),
@@ -18893,30 +18893,30 @@ const ListedCreativeNamedFormatReferenceSchema = /* @__PURE__ */ (() => z.object
18893
18893
  assigned_packages: z.array(z.object({
18894
18894
  package_id: z.string(),
18895
18895
  media_buy_id: z.string().optional(),
18896
- assigned_date: z.iso.datetime(),
18896
+ assigned_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18897
18897
  approval_status: CreativeApprovalStatusSchema.optional(),
18898
18898
  rejection_reason: z.string().optional(),
18899
18899
  approval_scopes: z.array(ScopedCreativeApprovalSchema).optional(),
18900
18900
  indicators: z.array(IndicatorSchema.and(z.object({
18901
18901
  type: z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]).optional()
18902
18902
  }).passthrough())).optional(),
18903
- indicator_types_evaluated: z.array(IndicatorTypeSchema.and(z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]))).optional(),
18904
- indicators_as_of: z.iso.datetime().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
+ indicators_as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18905
18905
  indicators_evaluated_scope: z.array(IndicatorScopeSchema).optional()
18906
18906
  }).passthrough()).optional()
18907
18907
  }).passthrough().optional(),
18908
18908
  snapshot: z.object({
18909
- as_of: z.iso.datetime(),
18909
+ as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18910
18910
  staleness_seconds: z.int().min(0),
18911
18911
  impressions: z.int().min(0),
18912
- last_served: z.iso.datetime().optional()
18912
+ last_served: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
18913
18913
  }).passthrough().optional(),
18914
18914
  snapshot_unavailable_reason: SnapshotUnavailableReasonSchema.optional(),
18915
18915
  items: z.array(CreativeItemSchema).optional(),
18916
18916
  pricing_options: z.array(VendorPricingOptionSchema).optional(),
18917
18917
  purge: z.object({
18918
18918
  kind: z.literal("soft"),
18919
- at: z.iso.datetime(),
18919
+ at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18920
18920
  reason_code: CreativeEventReasonCodeSchema
18921
18921
  }).passthrough().optional(),
18922
18922
  webhook_activity: z.array(WebhookActivityRecordSchema).max(200).optional()
@@ -18930,8 +18930,8 @@ const ListedCreativeCanonicalFormatKindSchema = /* @__PURE__ */ (() => z.object(
18930
18930
  format_kind: CanonicalFormatKindSchema,
18931
18931
  format_option_ref: FormatOptionReferenceSchema.optional(),
18932
18932
  status: CreativeStatusSchema,
18933
- created_date: z.iso.datetime(),
18934
- updated_date: z.iso.datetime(),
18933
+ created_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18934
+ updated_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18935
18935
  assets: z.record(z.string(), z.union([AssetVariantSchema, z.array(AssetVariantSchema)])).optional(),
18936
18936
  component_assets: z.record(z.string(), CreativeAssetsSchema).optional(),
18937
18937
  localization: CreativeLocalizationReadbackSchema.optional(),
@@ -18953,30 +18953,30 @@ const ListedCreativeCanonicalFormatKindSchema = /* @__PURE__ */ (() => z.object(
18953
18953
  assigned_packages: z.array(z.object({
18954
18954
  package_id: z.string(),
18955
18955
  media_buy_id: z.string().optional(),
18956
- assigned_date: z.iso.datetime(),
18956
+ assigned_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18957
18957
  approval_status: CreativeApprovalStatusSchema.optional(),
18958
18958
  rejection_reason: z.string().optional(),
18959
18959
  approval_scopes: z.array(ScopedCreativeApprovalSchema).optional(),
18960
18960
  indicators: z.array(IndicatorSchema.and(z.object({
18961
18961
  type: z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]).optional()
18962
18962
  }).passthrough())).optional(),
18963
- indicator_types_evaluated: z.array(IndicatorTypeSchema.and(z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]))).optional(),
18964
- indicators_as_of: z.iso.datetime().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
+ indicators_as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18965
18965
  indicators_evaluated_scope: z.array(IndicatorScopeSchema).optional()
18966
18966
  }).passthrough()).optional()
18967
18967
  }).passthrough().optional(),
18968
18968
  snapshot: z.object({
18969
- as_of: z.iso.datetime(),
18969
+ as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18970
18970
  staleness_seconds: z.int().min(0),
18971
18971
  impressions: z.int().min(0),
18972
- last_served: z.iso.datetime().optional()
18972
+ last_served: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
18973
18973
  }).passthrough().optional(),
18974
18974
  snapshot_unavailable_reason: SnapshotUnavailableReasonSchema.optional(),
18975
18975
  items: z.array(CreativeItemSchema).optional(),
18976
18976
  pricing_options: z.array(VendorPricingOptionSchema).optional(),
18977
18977
  purge: z.object({
18978
18978
  kind: z.literal("soft"),
18979
- at: z.iso.datetime(),
18979
+ at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18980
18980
  reason_code: CreativeEventReasonCodeSchema
18981
18981
  }).passthrough().optional(),
18982
18982
  webhook_activity: z.array(WebhookActivityRecordSchema).max(200).optional()
@@ -19023,7 +19023,7 @@ const SyncAccountsResponseSchema = /* @__PURE__ */ (() => z.object({
19023
19023
  payload: z.object({}).passthrough().optional(),
19024
19024
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
19025
19025
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
19026
- }).passthrough().and(z.union([SyncAccountsSuccessSchema, SyncAccountsErrorSchema])))();
19026
+ }).passthrough().and(z.union([SyncAccountsSuccessSchema, SyncAccountsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
19027
19027
  const ComplyTestControllerRequestSchema = /* @__PURE__ */ (() => z.object({
19028
19028
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
19029
19029
  adcp_major_version: z.number().int().gte(1).lte(99).optional(),
@@ -19046,7 +19046,7 @@ const ComplyTestControllerRequestSchema = /* @__PURE__ */ (() => z.object({
19046
19046
  catalog_id: z.string().min(1).max(255).optional(),
19047
19047
  catalog_generation: z.string().min(1).max(255).optional(),
19048
19048
  item_id: z.string().min(1).max(255).optional(),
19049
- target_time: z.iso.datetime().optional(),
19049
+ target_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
19050
19050
  status: z.string().optional(),
19051
19051
  rejection_reason: z.string().optional(),
19052
19052
  purge_kind: z.union([z.literal("soft"), z.literal("hard")]).optional(),
@@ -19101,7 +19101,7 @@ const ComplyTestControllerRequestSchema = /* @__PURE__ */ (() => z.object({
19101
19101
  upstream_name: z.string().optional(),
19102
19102
  cache_age_seconds: z.int().min(0).optional(),
19103
19103
  result: ComplianceTaskCompletionDataSchema.optional(),
19104
- since_timestamp: z.iso.datetime().optional(),
19104
+ since_timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
19105
19105
  endpoint_pattern: z.string().optional(),
19106
19106
  limit: z.int().min(1).max(1e3).optional(),
19107
19107
  attestation_mode: z.union([z.literal("raw"), z.literal("digest")]).optional(),
@@ -19127,7 +19127,7 @@ const ComplyTestControllerResponseSchema = /* @__PURE__ */ (() => z.object({
19127
19127
  payload: z.object({}).passthrough().optional(),
19128
19128
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
19129
19129
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
19130
- }).passthrough().and(z.union([ListScenariosSuccessSchema, StateTransitionSuccessSchema, SimulationSuccessSchema, ForcedDirectiveSuccessSchema, SeedSuccessSchema, ProvenanceAuditObservationsSuccessSchema, UpstreamTrafficSuccessSchema, ControllerErrorSchema])))();
19130
+ }).passthrough().and(z.union([ListScenariosSuccessSchema, StateTransitionSuccessSchema, SimulationSuccessSchema, ForcedDirectiveSuccessSchema, SeedSuccessSchema, ProvenanceAuditObservationsSuccessSchema, UpstreamTrafficSuccessSchema, ControllerErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
19131
19131
  const AdCPAsyncResponseDataSchema = /* @__PURE__ */ (() => z.union([GetProductsResponseSchema, GetProductsRejectedSchema, GetProductsAsyncWorkingSchema, GetProductsAsyncInputRequiredSchema, GetProductsAsyncSubmittedSchema, RequestProposalsResponseSchema, RequestProposalsAsyncSubmittedSchema, RefineProposalsResponseSchema, RefineProposalsAsyncSubmittedSchema, DeclineProposalsResponseSchema, MediaBuyCommitmentResponseSchema, ControlMediaBuyResponseSchema, CompactTaskSubmittedSchema, CompactTaskWorkingSchema, CompactTaskInputRequiredSchema, GetSignalsResponseSchema, GetSignalsAsyncWorkingSchema, GetSignalsAsyncSubmittedSchema, CreateMediaBuyResponseSchema, CreateMediaBuyAsyncWorkingSchema, CreateMediaBuyAsyncInputRequiredSchema, CreateMediaBuyAsyncSubmittedSchema, UpdateMediaBuyResponseSchema, UpdateMediaBuyAsyncWorkingSchema, UpdateMediaBuyAsyncInputRequiredSchema, UpdateMediaBuyAsyncSubmittedSchema, MediaBuyDeliveryWebhookResultSchema, BuildCreativeResponseSchema, PreviewCreativeResponseSchema, BuildCreativeAsyncWorkingSchema, BuildCreativeAsyncInputRequiredSchema, BuildCreativeAsyncSubmittedSchema, GetCreativeFeaturesResponseSchema, GetCreativeFeaturesAsyncSubmittedSchema, SyncCreativesResponseSchema, SyncCreativesAsyncWorkingSchema, SyncCreativesAsyncInputRequiredSchema, SyncCreativesAsyncSubmittedSchema, SyncCatalogsResponseSchema, SyncCatalogsAsyncWorkingSchema, SyncCatalogsAsyncInputRequiredSchema, SyncCatalogsAsyncSubmittedSchema]))();
19132
19132
  const MCPWebhookPayloadSchema = /* @__PURE__ */ (() => z.object({
19133
19133
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
@@ -19137,7 +19137,7 @@ const MCPWebhookPayloadSchema = /* @__PURE__ */ (() => z.object({
19137
19137
  task_type: TaskTypeSchema,
19138
19138
  protocol: AdCPProtocolSchema.optional(),
19139
19139
  status: TaskStatusSchema,
19140
- timestamp: z.iso.datetime(),
19140
+ timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
19141
19141
  message: z.string().optional(),
19142
19142
  context_id: z.string().optional(),
19143
19143
  token: z.string().min(16).max(4096).optional(),
@@ -19168,7 +19168,7 @@ const CreateMediaBuyRequestSchema = /* @__PURE__ */ (() => z.object({
19168
19168
  invoice_recipient: BusinessEntitySchema.optional(),
19169
19169
  io_acceptance: z.object({
19170
19170
  io_id: z.string(),
19171
- accepted_at: z.iso.datetime(),
19171
+ accepted_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
19172
19172
  signatory: z.string().min(1).max(250),
19173
19173
  signature_id: z.string().optional()
19174
19174
  }).passthrough().optional(),
@@ -19176,7 +19176,7 @@ const CreateMediaBuyRequestSchema = /* @__PURE__ */ (() => z.object({
19176
19176
  name: z.string().min(1).max(255).regex(/\S/).optional(),
19177
19177
  agency_estimate_number: z.string().max(100).optional(),
19178
19178
  start_time: StartTimingSchema,
19179
- end_time: z.iso.datetime(),
19179
+ end_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
19180
19180
  pacing: PacingSchema.optional(),
19181
19181
  bidding: BiddingPolicySchema.optional(),
19182
19182
  paused: z.boolean().optional(),