@adcp/sdk 16.4.0 → 16.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2151) 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.0/brand-fields.d.mts +7 -1
  111. package/dist/lib/adapters/version/3.0/brand-fields.d.ts +7 -1
  112. package/dist/lib/adapters/version/3.0/brand-fields.js +139 -3
  113. package/dist/lib/adapters/version/3.0/brand-fields.mjs +136 -2
  114. package/dist/lib/adapters/version/3.0/index.js +6 -0
  115. package/dist/lib/adapters/version/3.0/index.mjs +7 -1
  116. package/dist/lib/adapters/version/3.1/bidding.js +1 -1
  117. package/dist/lib/adapters/version/3.1/bidding.mjs +1 -1
  118. package/dist/lib/adapters/version/types.d.mts +5 -0
  119. package/dist/lib/adapters/version/types.d.ts +5 -0
  120. package/dist/lib/canonical-references/index.js +2 -0
  121. package/dist/lib/canonical-references/index.mjs +2 -0
  122. package/dist/lib/client/account-changes.d.mts +3 -1
  123. package/dist/lib/client/account-changes.d.ts +3 -1
  124. package/dist/lib/client/account-changes.js +22 -2
  125. package/dist/lib/client/account-changes.mjs +22 -2
  126. package/dist/lib/compliance-fixtures/canonical-storyboards-provenance.json +4 -4
  127. package/dist/lib/compliance-fixtures/canonical-storyboards.d.mts +2 -2
  128. package/dist/lib/compliance-fixtures/canonical-storyboards.d.ts +2 -2
  129. package/dist/lib/conformance/oracle.js +7 -9
  130. package/dist/lib/conformance/oracle.mjs +7 -9
  131. package/dist/lib/conformance/schemaLoader.js +35 -1
  132. package/dist/lib/conformance/schemaLoader.mjs +35 -1
  133. package/dist/lib/core/AgentClient.d.mts +165 -1
  134. package/dist/lib/core/AgentClient.d.ts +165 -1
  135. package/dist/lib/core/AgentClient.js +446 -8
  136. package/dist/lib/core/AgentClient.mjs +446 -8
  137. package/dist/lib/core/ConversationTypes.d.mts +10 -1
  138. package/dist/lib/core/ConversationTypes.d.ts +10 -1
  139. package/dist/lib/core/ProtocolResponseParser.d.mts +1 -1
  140. package/dist/lib/core/ProtocolResponseParser.d.ts +1 -1
  141. package/dist/lib/core/ProtocolResponseParser.js +28 -18
  142. package/dist/lib/core/ProtocolResponseParser.mjs +11 -1
  143. package/dist/lib/core/ResponseValidator.js +1 -1
  144. package/dist/lib/core/ResponseValidator.mjs +1 -1
  145. package/dist/lib/core/SingleAgentClient.d.mts +120 -6
  146. package/dist/lib/core/SingleAgentClient.d.ts +120 -6
  147. package/dist/lib/core/SingleAgentClient.js +582 -79
  148. package/dist/lib/core/SingleAgentClient.mjs +570 -66
  149. package/dist/lib/core/TaskExecutor.d.mts +7 -0
  150. package/dist/lib/core/TaskExecutor.d.ts +7 -0
  151. package/dist/lib/core/TaskExecutor.js +108 -25
  152. package/dist/lib/core/TaskExecutor.mjs +116 -25
  153. package/dist/lib/core/agent-discovery-cache.d.mts +2 -0
  154. package/dist/lib/core/agent-discovery-cache.d.ts +2 -0
  155. package/dist/lib/core/agent-discovery-cache.js +1 -0
  156. package/dist/lib/core/agent-discovery-cache.mjs +1 -0
  157. package/dist/lib/core/task-status.d.mts +2 -0
  158. package/dist/lib/core/task-status.d.ts +2 -0
  159. package/dist/lib/core/task-status.js +11 -2
  160. package/dist/lib/core/task-status.mjs +9 -1
  161. package/dist/lib/errors/index.d.mts +22 -0
  162. package/dist/lib/errors/index.d.ts +22 -0
  163. package/dist/lib/errors/index.js +44 -1
  164. package/dist/lib/errors/index.mjs +43 -1
  165. package/dist/lib/identity-3.3/trust.d.mts +17 -3
  166. package/dist/lib/identity-3.3/trust.d.ts +17 -3
  167. package/dist/lib/identity-3.3/trust.js +42 -20
  168. package/dist/lib/identity-3.3/trust.mjs +42 -20
  169. package/dist/lib/identity-3.3/types.d.mts +1 -1
  170. package/dist/lib/identity-3.3/types.d.ts +1 -1
  171. package/dist/lib/identity-3.3/validation.js +5 -3
  172. package/dist/lib/identity-3.3/validation.mjs +6 -4
  173. package/dist/lib/index.d.mts +8 -54
  174. package/dist/lib/index.d.ts +8 -54
  175. package/dist/lib/index.js +15 -0
  176. package/dist/lib/index.mjs +11 -0
  177. package/dist/lib/media-buy/action-assessment.js +29 -3
  178. package/dist/lib/media-buy/action-assessment.mjs +32 -4
  179. package/dist/lib/media-buy/action-contracts.d.mts +3 -0
  180. package/dist/lib/media-buy/action-contracts.d.ts +3 -0
  181. package/dist/lib/media-buy/action-contracts.js +24 -1
  182. package/dist/lib/media-buy/action-contracts.mjs +22 -1
  183. package/dist/lib/media-buy/compatibility.js +6 -1
  184. package/dist/lib/media-buy/compatibility.mjs +6 -1
  185. package/dist/lib/media-buy/preflight.js +1 -1
  186. package/dist/lib/media-buy/preflight.mjs +3 -2
  187. package/dist/lib/media-buy/types.d.mts +6 -1
  188. package/dist/lib/media-buy/types.d.ts +6 -1
  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.d.mts +2 -0
  206. package/dist/lib/protocols/mcp-modern.d.ts +2 -0
  207. package/dist/lib/protocols/mcp-modern.js +40 -11
  208. package/dist/lib/protocols/mcp-modern.mjs +40 -11
  209. package/dist/lib/protocols/mcp-scope.d.mts +6 -1
  210. package/dist/lib/protocols/mcp-scope.d.ts +6 -1
  211. package/dist/lib/protocols/mcp-scope.js +25 -3
  212. package/dist/lib/protocols/mcp-scope.mjs +24 -3
  213. package/dist/lib/protocols/mcp-tasks.d.mts +17 -8
  214. package/dist/lib/protocols/mcp-tasks.d.ts +17 -8
  215. package/dist/lib/protocols/mcp-tasks.js +89 -40
  216. package/dist/lib/protocols/mcp-tasks.mjs +85 -40
  217. package/dist/lib/protocols/mcp.d.mts +3 -2
  218. package/dist/lib/protocols/mcp.d.ts +3 -2
  219. package/dist/lib/protocols/mcp.js +70 -20
  220. package/dist/lib/protocols/mcp.mjs +73 -20
  221. package/dist/lib/protocols/rawResponseCapture.js +20 -5
  222. package/dist/lib/protocols/rawResponseCapture.mjs +20 -5
  223. package/dist/lib/registry/types.generated.d.mts +8 -2
  224. package/dist/lib/registry/types.generated.d.ts +8 -2
  225. package/dist/lib/reporting/inspection.js +1 -0
  226. package/dist/lib/reporting/inspection.mjs +1 -0
  227. package/dist/lib/reporting/ledger/producer.js +4 -2
  228. package/dist/lib/reporting/ledger/producer.mjs +4 -2
  229. package/dist/lib/reporting/service/index.js +13 -1
  230. package/dist/lib/reporting/service/index.mjs +13 -1
  231. package/dist/lib/reporting/source/applicability.d.mts +23 -0
  232. package/dist/lib/reporting/source/applicability.d.ts +23 -0
  233. package/dist/lib/reporting/source/applicability.js +46 -0
  234. package/dist/lib/reporting/source/applicability.mjs +21 -0
  235. package/dist/lib/reporting/source/conformance.d.mts +1 -1
  236. package/dist/lib/reporting/source/conformance.d.ts +1 -1
  237. package/dist/lib/reporting/source/conformance.js +4 -1
  238. package/dist/lib/reporting/source/conformance.mjs +4 -1
  239. package/dist/lib/reporting/source/fixtures.d.mts +14 -0
  240. package/dist/lib/reporting/source/fixtures.d.ts +14 -0
  241. package/dist/lib/reporting/source/index.d.mts +1 -0
  242. package/dist/lib/reporting/source/index.d.ts +1 -0
  243. package/dist/lib/reporting/source/index.js +2 -0
  244. package/dist/lib/reporting/source/index.mjs +1 -0
  245. package/dist/lib/reporting/source/schemas/reporting-source-capabilities-v1.json +167 -59
  246. package/dist/lib/reporting/source/schemas/reporting-source-error-v1.json +1 -1
  247. package/dist/lib/reporting/source/schemas/reporting-source-offering-v1.json +167 -59
  248. package/dist/lib/reporting/source/schemas/reporting-source-slice-request-v1.json +4 -4
  249. package/dist/lib/reporting/source/schemas/source-batch-manifest-basic-v1.json +20 -20
  250. package/dist/lib/reporting/source/schemas/source-batch-manifest-v1.json +27 -27
  251. package/dist/lib/reporting/source/source.d.mts +106 -18
  252. package/dist/lib/reporting/source/source.d.ts +106 -18
  253. package/dist/lib/reporting/source/source.js +4 -5
  254. package/dist/lib/reporting/source/source.mjs +4 -5
  255. package/dist/lib/schemas/browser.d.mts +2 -0
  256. package/dist/lib/schemas/browser.d.ts +2 -0
  257. package/dist/lib/schemas/browser.js +3 -0
  258. package/dist/lib/schemas/browser.mjs +2 -0
  259. package/dist/lib/schemas/index.d.mts +5 -2
  260. package/dist/lib/schemas/index.d.ts +5 -2
  261. package/dist/lib/schemas/index.js +5 -0
  262. package/dist/lib/schemas/index.mjs +4 -0
  263. package/dist/lib/schemas-data/3.2/a2ui/bound-value.json +1 -1
  264. package/dist/lib/schemas-data/3.2/a2ui/component.json +1 -1
  265. package/dist/lib/schemas-data/3.2/a2ui/si-catalog.json +25 -25
  266. package/dist/lib/schemas-data/3.2/a2ui/surface.json +2 -2
  267. package/dist/lib/schemas-data/3.2/a2ui/user-action.json +1 -1
  268. package/dist/lib/schemas-data/3.2/aao/agent-publishers.json +1 -1
  269. package/dist/lib/schemas-data/3.2/account/get-account-financials-request.json +6 -6
  270. package/dist/lib/schemas-data/3.2/account/get-account-financials-response.json +12 -12
  271. package/dist/lib/schemas-data/3.2/account/list-account-changes-request.json +7 -7
  272. package/dist/lib/schemas-data/3.2/account/list-account-changes-response.json +7 -7
  273. package/dist/lib/schemas-data/3.2/account/list-accounts-request.json +6 -6
  274. package/dist/lib/schemas-data/3.2/account/list-accounts-response.json +8 -8
  275. package/dist/lib/schemas-data/3.2/account/report-usage-request.json +6 -6
  276. package/dist/lib/schemas-data/3.2/account/report-usage-response.json +6 -6
  277. package/dist/lib/schemas-data/3.2/account/sync-accounts-request.json +16 -16
  278. package/dist/lib/schemas-data/3.2/account/sync-accounts-response.json +21 -21
  279. package/dist/lib/schemas-data/3.2/account/sync-governance-request.json +5 -5
  280. package/dist/lib/schemas-data/3.2/account/sync-governance-response.json +10 -10
  281. package/dist/lib/schemas-data/3.2/adagents.json +30 -30
  282. package/dist/lib/schemas-data/3.2/brand/acquire-rights-request.json +13 -12
  283. package/dist/lib/schemas-data/3.2/brand/acquire-rights-response.json +16 -16
  284. package/dist/lib/schemas-data/3.2/brand/creative-approval-request.json +5 -5
  285. package/dist/lib/schemas-data/3.2/brand/creative-approval-response.json +12 -12
  286. package/dist/lib/schemas-data/3.2/brand/get-brand-identity-request.json +4 -4
  287. package/dist/lib/schemas-data/3.2/brand/get-brand-identity-response.json +10 -10
  288. package/dist/lib/schemas-data/3.2/brand/get-rights-request.json +8 -8
  289. package/dist/lib/schemas-data/3.2/brand/get-rights-response.json +11 -11
  290. package/dist/lib/schemas-data/3.2/brand/revocation-notification.json +4 -4
  291. package/dist/lib/schemas-data/3.2/brand/rights-pricing-option.json +5 -5
  292. package/dist/lib/schemas-data/3.2/brand/rights-terms.json +3 -3
  293. package/dist/lib/schemas-data/3.2/brand/search-brands-request.json +6 -6
  294. package/dist/lib/schemas-data/3.2/brand/search-brands-response.json +11 -11
  295. package/dist/lib/schemas-data/3.2/brand/update-rights-request.json +6 -6
  296. package/dist/lib/schemas-data/3.2/brand/update-rights-response.json +11 -11
  297. package/dist/lib/schemas-data/3.2/brand/verification-status.json +1 -1
  298. package/dist/lib/schemas-data/3.2/brand/verify-brand-claim-request.json +3 -3
  299. package/dist/lib/schemas-data/3.2/brand/verify-brand-claim-response.json +13 -13
  300. package/dist/lib/schemas-data/3.2/brand/verify-brand-claims-request.json +3 -3
  301. package/dist/lib/schemas-data/3.2/brand/verify-brand-claims-response.json +13 -13
  302. package/dist/lib/schemas-data/3.2/brand.json +23 -23
  303. package/dist/lib/schemas-data/3.2/bundled.schemas.br +0 -0
  304. package/dist/lib/schemas-data/3.2/collection/base-collection-source.json +3 -3
  305. package/dist/lib/schemas-data/3.2/collection/collection-list-changed-webhook.json +2 -2
  306. package/dist/lib/schemas-data/3.2/collection/collection-list-filters.json +7 -7
  307. package/dist/lib/schemas-data/3.2/collection/collection-list.json +5 -5
  308. package/dist/lib/schemas-data/3.2/collection/create-collection-list-request.json +8 -8
  309. package/dist/lib/schemas-data/3.2/collection/create-collection-list-response.json +6 -6
  310. package/dist/lib/schemas-data/3.2/collection/delete-collection-list-request.json +5 -5
  311. package/dist/lib/schemas-data/3.2/collection/delete-collection-list-response.json +5 -5
  312. package/dist/lib/schemas-data/3.2/collection/get-collection-list-request.json +5 -5
  313. package/dist/lib/schemas-data/3.2/collection/get-collection-list-response.json +12 -12
  314. package/dist/lib/schemas-data/3.2/collection/list-collection-lists-request.json +6 -6
  315. package/dist/lib/schemas-data/3.2/collection/list-collection-lists-response.json +7 -7
  316. package/dist/lib/schemas-data/3.2/collection/update-collection-list-request.json +8 -8
  317. package/dist/lib/schemas-data/3.2/collection/update-collection-list-response.json +6 -6
  318. package/dist/lib/schemas-data/3.2/content-standards/artifact-webhook-payload.json +3 -3
  319. package/dist/lib/schemas-data/3.2/content-standards/artifact.json +8 -8
  320. package/dist/lib/schemas-data/3.2/content-standards/calibrate-content-request.json +5 -5
  321. package/dist/lib/schemas-data/3.2/content-standards/calibrate-content-response.json +10 -10
  322. package/dist/lib/schemas-data/3.2/content-standards/content-standards.json +7 -7
  323. package/dist/lib/schemas-data/3.2/content-standards/create-content-standards-request.json +8 -8
  324. package/dist/lib/schemas-data/3.2/content-standards/create-content-standards-response.json +8 -8
  325. package/dist/lib/schemas-data/3.2/content-standards/get-content-standards-request.json +4 -4
  326. package/dist/lib/schemas-data/3.2/content-standards/get-content-standards-response.json +9 -9
  327. package/dist/lib/schemas-data/3.2/content-standards/get-media-buy-artifacts-request.json +5 -5
  328. package/dist/lib/schemas-data/3.2/content-standards/get-media-buy-artifacts-response.json +10 -10
  329. package/dist/lib/schemas-data/3.2/content-standards/list-content-standards-request.json +6 -6
  330. package/dist/lib/schemas-data/3.2/content-standards/list-content-standards-response.json +10 -10
  331. package/dist/lib/schemas-data/3.2/content-standards/update-content-standards-request.json +8 -8
  332. package/dist/lib/schemas-data/3.2/content-standards/update-content-standards-response.json +8 -8
  333. package/dist/lib/schemas-data/3.2/content-standards/validate-content-delivery-request.json +5 -5
  334. package/dist/lib/schemas-data/3.2/content-standards/validate-content-delivery-response.json +10 -10
  335. package/dist/lib/schemas-data/3.2/core/acceptance-policy-profile-ids.json +1 -1
  336. package/dist/lib/schemas-data/3.2/core/account-authorization.json +1 -1
  337. package/dist/lib/schemas-data/3.2/core/account-change-recorded-webhook.json +2 -2
  338. package/dist/lib/schemas-data/3.2/core/account-change.json +2 -2
  339. package/dist/lib/schemas-data/3.2/core/account-identity-change-preview.json +4 -4
  340. package/dist/lib/schemas-data/3.2/core/account-identity-change.json +3 -3
  341. package/dist/lib/schemas-data/3.2/core/account-ref.json +3 -3
  342. package/dist/lib/schemas-data/3.2/core/account-status-changed-webhook.json +4 -4
  343. package/dist/lib/schemas-data/3.2/core/account-timezone-capability.json +1 -1
  344. package/dist/lib/schemas-data/3.2/core/account-with-authorization.json +3 -3
  345. package/dist/lib/schemas-data/3.2/core/account.json +14 -14
  346. package/dist/lib/schemas-data/3.2/core/activation-key.json +1 -1
  347. package/dist/lib/schemas-data/3.2/core/ad-inventory-config.json +1 -1
  348. package/dist/lib/schemas-data/3.2/core/agent-encryption-key.json +1 -1
  349. package/dist/lib/schemas-data/3.2/core/agent-notification-config-state.json +4 -4
  350. package/dist/lib/schemas-data/3.2/core/agent-notification-config.json +5 -4
  351. package/dist/lib/schemas-data/3.2/core/agent-reporting-destination-state.json +4 -4
  352. package/dist/lib/schemas-data/3.2/core/agent-reporting-destination.json +8 -8
  353. package/dist/lib/schemas-data/3.2/core/agent-signing-key.json +1 -1
  354. package/dist/lib/schemas-data/3.2/core/agent-webhook-challenge.json +1 -1
  355. package/dist/lib/schemas-data/3.2/core/app-item.json +4 -4
  356. package/dist/lib/schemas-data/3.2/core/applicable-package-id.json +1 -1
  357. package/dist/lib/schemas-data/3.2/core/asset-group-vocabulary.json +1 -1
  358. package/dist/lib/schemas-data/3.2/core/assets/asset-union.json +22 -22
  359. package/dist/lib/schemas-data/3.2/core/assets/audio-asset.json +3 -3
  360. package/dist/lib/schemas-data/3.2/core/assets/brief-asset.json +2 -2
  361. package/dist/lib/schemas-data/3.2/core/assets/card-asset.json +6 -6
  362. package/dist/lib/schemas-data/3.2/core/assets/catalog-asset.json +2 -2
  363. package/dist/lib/schemas-data/3.2/core/assets/css-asset.json +2 -2
  364. package/dist/lib/schemas-data/3.2/core/assets/daast-asset.json +6 -6
  365. package/dist/lib/schemas-data/3.2/core/assets/daast-tracker-asset.json +5 -5
  366. package/dist/lib/schemas-data/3.2/core/assets/display-tag-asset.json +12 -12
  367. package/dist/lib/schemas-data/3.2/core/assets/html-asset.json +2 -2
  368. package/dist/lib/schemas-data/3.2/core/assets/image-asset.json +2 -2
  369. package/dist/lib/schemas-data/3.2/core/assets/javascript-asset.json +3 -3
  370. package/dist/lib/schemas-data/3.2/core/assets/markdown-asset.json +2 -2
  371. package/dist/lib/schemas-data/3.2/core/assets/pixel-tracker-asset.json +5 -5
  372. package/dist/lib/schemas-data/3.2/core/assets/published-post-asset.json +2 -2
  373. package/dist/lib/schemas-data/3.2/core/assets/text-asset.json +2 -2
  374. package/dist/lib/schemas-data/3.2/core/assets/url-asset.json +5 -5
  375. package/dist/lib/schemas-data/3.2/core/assets/vast-asset.json +6 -6
  376. package/dist/lib/schemas-data/3.2/core/assets/vast-tracker-asset.json +5 -5
  377. package/dist/lib/schemas-data/3.2/core/assets/video-asset.json +7 -7
  378. package/dist/lib/schemas-data/3.2/core/assets/webhook-asset.json +7 -7
  379. package/dist/lib/schemas-data/3.2/core/assets/zip-asset.json +2 -2
  380. package/dist/lib/schemas-data/3.2/core/async-response-data.json +43 -43
  381. package/dist/lib/schemas-data/3.2/core/async-response-refs/creative/get-creative-features-async-response-submitted.json +3 -3
  382. package/dist/lib/schemas-data/3.2/core/async-response-refs/creative/sync-creatives-async-response-input-required.json +3 -3
  383. package/dist/lib/schemas-data/3.2/core/async-response-refs/creative/sync-creatives-async-response-submitted.json +4 -4
  384. package/dist/lib/schemas-data/3.2/core/async-response-refs/creative/sync-creatives-async-response-working.json +3 -3
  385. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/accept-proposal-async-response-input-required.json +2 -2
  386. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/accept-proposal-async-response-submitted.json +2 -2
  387. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/accept-proposal-async-response-working.json +2 -2
  388. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/build-creative-async-response-input-required.json +4 -4
  389. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/build-creative-async-response-submitted.json +4 -4
  390. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/build-creative-async-response-working.json +3 -3
  391. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/buy-products-async-response-input-required.json +2 -2
  392. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/buy-products-async-response-submitted.json +2 -2
  393. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/buy-products-async-response-working.json +2 -2
  394. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/control-media-buy-async-response-input-required.json +2 -2
  395. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/control-media-buy-async-response-submitted.json +2 -2
  396. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/control-media-buy-async-response-working.json +2 -2
  397. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/create-media-buy-async-response-input-required.json +4 -4
  398. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/create-media-buy-async-response-submitted.json +4 -4
  399. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/create-media-buy-async-response-working.json +3 -3
  400. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/decline-proposals-async-response-input-required.json +2 -2
  401. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/decline-proposals-async-response-submitted.json +2 -2
  402. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/decline-proposals-async-response-working.json +2 -2
  403. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/get-products-async-response-input-required.json +4 -4
  404. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/get-products-async-response-submitted.json +4 -4
  405. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/get-products-async-response-working.json +3 -3
  406. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/refine-proposals-async-response-input-required.json +2 -2
  407. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/refine-proposals-async-response-submitted.json +2 -2
  408. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/refine-proposals-async-response-working.json +2 -2
  409. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/request-proposals-async-response-input-required.json +2 -2
  410. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/request-proposals-async-response-submitted.json +2 -2
  411. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/request-proposals-async-response-working.json +2 -2
  412. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/sync-catalogs-async-response-input-required.json +3 -3
  413. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/sync-catalogs-async-response-submitted.json +4 -4
  414. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/sync-catalogs-async-response-working.json +3 -3
  415. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/update-media-buy-async-response-input-required.json +3 -3
  416. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/update-media-buy-async-response-submitted.json +4 -4
  417. package/dist/lib/schemas-data/3.2/core/async-response-refs/media-buy/update-media-buy-async-response-working.json +3 -3
  418. package/dist/lib/schemas-data/3.2/core/async-response-refs/signals/get-signals-async-response-submitted.json +4 -4
  419. package/dist/lib/schemas-data/3.2/core/async-response-refs/signals/get-signals-async-response-working.json +3 -3
  420. package/dist/lib/schemas-data/3.2/core/attestation-capabilities.json +5 -5
  421. package/dist/lib/schemas-data/3.2/core/attestation-evaluation.json +2 -2
  422. package/dist/lib/schemas-data/3.2/core/attestation-issuer.json +5 -5
  423. package/dist/lib/schemas-data/3.2/core/attestation-reference.json +7 -7
  424. package/dist/lib/schemas-data/3.2/core/attestation-subject.json +5 -5
  425. package/dist/lib/schemas-data/3.2/core/attribution-window.json +4 -4
  426. package/dist/lib/schemas-data/3.2/core/audience-activation-method.json +6 -6
  427. package/dist/lib/schemas-data/3.2/core/audience-characteristic.json +1 -1
  428. package/dist/lib/schemas-data/3.2/core/audience-evidence-pin.json +2 -2
  429. package/dist/lib/schemas-data/3.2/core/audience-evidence-requirements.json +10 -10
  430. package/dist/lib/schemas-data/3.2/core/audience-evidence-selection.json +5 -5
  431. package/dist/lib/schemas-data/3.2/core/audience-evidence.json +10 -10
  432. package/dist/lib/schemas-data/3.2/core/audience-member.json +3 -3
  433. package/dist/lib/schemas-data/3.2/core/audience-selector.json +7 -7
  434. package/dist/lib/schemas-data/3.2/core/audience-source.json +3 -3
  435. package/dist/lib/schemas-data/3.2/core/authorized-agent-base.json +3 -3
  436. package/dist/lib/schemas-data/3.2/core/bidding-policy-capability.json +1 -1
  437. package/dist/lib/schemas-data/3.2/core/bidding-policy.json +1 -1
  438. package/dist/lib/schemas-data/3.2/core/brand-id.json +1 -1
  439. package/dist/lib/schemas-data/3.2/core/brand-key.json +2 -2
  440. package/dist/lib/schemas-data/3.2/core/brand-ref.json +3 -3
  441. package/dist/lib/schemas-data/3.2/core/brand-response-authorization-result.json +1 -1
  442. package/dist/lib/schemas-data/3.2/core/budget-allocation.json +2 -2
  443. package/dist/lib/schemas-data/3.2/core/budget-range.json +1 -1
  444. package/dist/lib/schemas-data/3.2/core/business-entity.json +2 -2
  445. package/dist/lib/schemas-data/3.2/core/cancellation-policy.json +2 -2
  446. package/dist/lib/schemas-data/3.2/core/canonical-account-ref.json +3 -3
  447. package/dist/lib/schemas-data/3.2/core/canonical-audience-evidence-selection.json +3 -3
  448. package/dist/lib/schemas-data/3.2/core/canonical-audience-evidence.json +8 -8
  449. package/dist/lib/schemas-data/3.2/core/canonical-budget-allocation.json +2 -2
  450. package/dist/lib/schemas-data/3.2/core/canonical-delivery-forecast.json +7 -7
  451. package/dist/lib/schemas-data/3.2/core/canonical-forecast-point.json +12 -12
  452. package/dist/lib/schemas-data/3.2/core/canonical-forecast-vendor-metric-value.json +5 -5
  453. package/dist/lib/schemas-data/3.2/core/canonical-format-kind.json +1 -1
  454. package/dist/lib/schemas-data/3.2/core/canonical-format-option.json +6 -6
  455. package/dist/lib/schemas-data/3.2/core/canonical-measurement-terms.json +3 -3
  456. package/dist/lib/schemas-data/3.2/core/canonical-media-buy-action-fields.json +6 -6
  457. package/dist/lib/schemas-data/3.2/core/canonical-media-buy-action.json +4 -4
  458. package/dist/lib/schemas-data/3.2/core/canonical-media-buy-features.json +2 -2
  459. package/dist/lib/schemas-data/3.2/core/canonical-metric-qualifier.json +6 -6
  460. package/dist/lib/schemas-data/3.2/core/canonical-optimization-goal.json +9 -9
  461. package/dist/lib/schemas-data/3.2/core/canonical-performance-standard.json +4 -4
  462. package/dist/lib/schemas-data/3.2/core/canonical-placement.json +9 -9
  463. package/dist/lib/schemas-data/3.2/core/canonical-pricing-option.json +5 -5
  464. package/dist/lib/schemas-data/3.2/core/canonical-product-action.json +6 -6
  465. package/dist/lib/schemas-data/3.2/core/canonical-product.json +31 -31
  466. package/dist/lib/schemas-data/3.2/core/canonical-projection-ref.json +3 -3
  467. package/dist/lib/schemas-data/3.2/core/canonical-projection-slot-override.json +1 -1
  468. package/dist/lib/schemas-data/3.2/core/canonical-proposal.json +5 -5
  469. package/dist/lib/schemas-data/3.2/core/canonical-reporting-capabilities.json +11 -11
  470. package/dist/lib/schemas-data/3.2/core/canonical-reporting-commitment.json +6 -6
  471. package/dist/lib/schemas-data/3.2/core/canvas-constraint.json +1 -1
  472. package/dist/lib/schemas-data/3.2/core/capabilities-changed-webhook.json +2 -2
  473. package/dist/lib/schemas-data/3.2/core/catalog-field-mapping.json +2 -2
  474. package/dist/lib/schemas-data/3.2/core/catalog-item-availability-error.json +3 -3
  475. package/dist/lib/schemas-data/3.2/core/catalog-item-availability-ref.json +1 -1
  476. package/dist/lib/schemas-data/3.2/core/catalog-item-availability-state.json +4 -4
  477. package/dist/lib/schemas-data/3.2/core/catalog-item-availability-update-result.json +4 -4
  478. package/dist/lib/schemas-data/3.2/core/catalog-item-availability-update.json +2 -2
  479. package/dist/lib/schemas-data/3.2/core/catalog-item-delivery-metrics.json +3 -3
  480. package/dist/lib/schemas-data/3.2/core/catalog-item-reference-not-found-error.json +1 -1
  481. package/dist/lib/schemas-data/3.2/core/catalog-selection.json +7 -7
  482. package/dist/lib/schemas-data/3.2/core/catalog.json +7 -7
  483. package/dist/lib/schemas-data/3.2/core/catchment.json +5 -5
  484. package/dist/lib/schemas-data/3.2/core/collection-delivery-metrics.json +3 -3
  485. package/dist/lib/schemas-data/3.2/core/collection-distribution.json +3 -3
  486. package/dist/lib/schemas-data/3.2/core/collection-list-ref.json +1 -1
  487. package/dist/lib/schemas-data/3.2/core/collection-property-delivery-metrics.json +5 -5
  488. package/dist/lib/schemas-data/3.2/core/collection-ref.json +1 -1
  489. package/dist/lib/schemas-data/3.2/core/collection-selection.json +4 -4
  490. package/dist/lib/schemas-data/3.2/core/collection-selector.json +1 -1
  491. package/dist/lib/schemas-data/3.2/core/collection.json +13 -13
  492. package/dist/lib/schemas-data/3.2/core/committed-metric.json +14 -14
  493. package/dist/lib/schemas-data/3.2/core/compact-task-input-required.json +4 -4
  494. package/dist/lib/schemas-data/3.2/core/compact-task-submitted.json +6 -6
  495. package/dist/lib/schemas-data/3.2/core/compact-task-working.json +3 -3
  496. package/dist/lib/schemas-data/3.2/core/content-rating.json +2 -2
  497. package/dist/lib/schemas-data/3.2/core/context.json +1 -1
  498. package/dist/lib/schemas-data/3.2/core/creative-approval-scope.json +3 -3
  499. package/dist/lib/schemas-data/3.2/core/creative-asset.json +13 -13
  500. package/dist/lib/schemas-data/3.2/core/creative-assets.json +3 -3
  501. package/dist/lib/schemas-data/3.2/core/creative-assignment.json +2 -2
  502. package/dist/lib/schemas-data/3.2/core/creative-brief.json +4 -4
  503. package/dist/lib/schemas-data/3.2/core/creative-consumption.json +1 -1
  504. package/dist/lib/schemas-data/3.2/core/creative-delivery-metrics.json +2 -2
  505. package/dist/lib/schemas-data/3.2/core/creative-filters.json +9 -8
  506. package/dist/lib/schemas-data/3.2/core/creative-item.json +1 -1
  507. package/dist/lib/schemas-data/3.2/core/creative-locale-policy.json +2 -2
  508. package/dist/lib/schemas-data/3.2/core/creative-localization-readback.json +6 -6
  509. package/dist/lib/schemas-data/3.2/core/creative-localization.json +6 -6
  510. package/dist/lib/schemas-data/3.2/core/creative-manifest.json +13 -13
  511. package/dist/lib/schemas-data/3.2/core/creative-operation-format-declaration.json +7 -7
  512. package/dist/lib/schemas-data/3.2/core/creative-policy.json +3 -3
  513. package/dist/lib/schemas-data/3.2/core/creative-representation-set.json +4 -4
  514. package/dist/lib/schemas-data/3.2/core/creative-representation.json +2 -2
  515. package/dist/lib/schemas-data/3.2/core/creative-revision-id.json +1 -1
  516. package/dist/lib/schemas-data/3.2/core/creative-variable.json +1 -1
  517. package/dist/lib/schemas-data/3.2/core/creative-variant.json +6 -6
  518. package/dist/lib/schemas-data/3.2/core/daast-tracker-constraints.json +2 -2
  519. package/dist/lib/schemas-data/3.2/core/data-provider-signal-selector.json +1 -1
  520. package/dist/lib/schemas-data/3.2/core/date-range.json +1 -1
  521. package/dist/lib/schemas-data/3.2/core/datetime-range.json +1 -1
  522. package/dist/lib/schemas-data/3.2/core/daypart-target.json +3 -3
  523. package/dist/lib/schemas-data/3.2/core/deadline-policy.json +1 -1
  524. package/dist/lib/schemas-data/3.2/core/delivery-breakdown-controls.json +3 -3
  525. package/dist/lib/schemas-data/3.2/core/delivery-forecast.json +7 -7
  526. package/dist/lib/schemas-data/3.2/core/delivery-metric-aggregate.json +14 -14
  527. package/dist/lib/schemas-data/3.2/core/delivery-metrics.json +11 -11
  528. package/dist/lib/schemas-data/3.2/core/delivery-provider.json +1 -1
  529. package/dist/lib/schemas-data/3.2/core/delivery-recipient.json +2 -2
  530. package/dist/lib/schemas-data/3.2/core/demographic-age-range.json +1 -1
  531. package/dist/lib/schemas-data/3.2/core/demographic-predicate.json +2 -2
  532. package/dist/lib/schemas-data/3.2/core/demographic-reporting-capability.json +4 -4
  533. package/dist/lib/schemas-data/3.2/core/demographic-targeting-capability.json +4 -4
  534. package/dist/lib/schemas-data/3.2/core/demographic-targeting-intent.json +4 -4
  535. package/dist/lib/schemas-data/3.2/core/demographic-targeting-resolution.json +10 -10
  536. package/dist/lib/schemas-data/3.2/core/deployment.json +3 -3
  537. package/dist/lib/schemas-data/3.2/core/destination-item.json +4 -4
  538. package/dist/lib/schemas-data/3.2/core/destination.json +1 -1
  539. package/dist/lib/schemas-data/3.2/core/diagnostic-issue.json +1 -1
  540. package/dist/lib/schemas-data/3.2/core/downstream-connection-requirement.json +1 -1
  541. package/dist/lib/schemas-data/3.2/core/duration.json +1 -1
  542. package/dist/lib/schemas-data/3.2/core/education-item.json +4 -4
  543. package/dist/lib/schemas-data/3.2/core/error.json +1 -1
  544. package/dist/lib/schemas-data/3.2/core/evaluator-spec.json +5 -5
  545. package/dist/lib/schemas-data/3.2/core/event-custom-data.json +2 -2
  546. package/dist/lib/schemas-data/3.2/core/event-source-health.json +3 -3
  547. package/dist/lib/schemas-data/3.2/core/event-surface.json +2 -2
  548. package/dist/lib/schemas-data/3.2/core/event.json +8 -8
  549. package/dist/lib/schemas-data/3.2/core/experimental-feature-id.json +1 -1
  550. package/dist/lib/schemas-data/3.2/core/ext.json +1 -1
  551. package/dist/lib/schemas-data/3.2/core/feature-requirement.json +1 -1
  552. package/dist/lib/schemas-data/3.2/core/flight-item.json +4 -4
  553. package/dist/lib/schemas-data/3.2/core/forecast-dimension-audience.json +2 -2
  554. package/dist/lib/schemas-data/3.2/core/forecast-dimension-device-platform.json +2 -2
  555. package/dist/lib/schemas-data/3.2/core/forecast-dimension-device-type.json +2 -2
  556. package/dist/lib/schemas-data/3.2/core/forecast-dimension-geo.json +5 -5
  557. package/dist/lib/schemas-data/3.2/core/forecast-dimension-placement.json +2 -2
  558. package/dist/lib/schemas-data/3.2/core/forecast-dimension-signal.json +2 -2
  559. package/dist/lib/schemas-data/3.2/core/forecast-dimension-time.json +1 -1
  560. package/dist/lib/schemas-data/3.2/core/forecast-point-dimensions.json +8 -8
  561. package/dist/lib/schemas-data/3.2/core/forecast-point.json +28 -28
  562. package/dist/lib/schemas-data/3.2/core/forecast-range.json +1 -1
  563. package/dist/lib/schemas-data/3.2/core/forecast-rate-range.json +2 -2
  564. package/dist/lib/schemas-data/3.2/core/forecast-vendor-metric-value.json +7 -7
  565. package/dist/lib/schemas-data/3.2/core/format-id.json +1 -1
  566. package/dist/lib/schemas-data/3.2/core/format-option-ref.json +1 -1
  567. package/dist/lib/schemas-data/3.2/core/format-shape-vocabulary.json +1 -1
  568. package/dist/lib/schemas-data/3.2/core/format.json +49 -45
  569. package/dist/lib/schemas-data/3.2/core/frequency-cap-constraints.json +8 -8
  570. package/dist/lib/schemas-data/3.2/core/frequency-cap-duration-unit.json +1 -1
  571. package/dist/lib/schemas-data/3.2/core/frequency-cap-impression-constraints.json +2 -2
  572. package/dist/lib/schemas-data/3.2/core/frequency-cap-interval-constraints.json +3 -3
  573. package/dist/lib/schemas-data/3.2/core/frequency-cap-requirements.json +6 -6
  574. package/dist/lib/schemas-data/3.2/core/frequency-cap.json +4 -4
  575. package/dist/lib/schemas-data/3.2/core/generation-credential.json +3 -3
  576. package/dist/lib/schemas-data/3.2/core/geo-breakdown-support.json +3 -3
  577. package/dist/lib/schemas-data/3.2/core/geo-delivery-metrics.json +6 -6
  578. package/dist/lib/schemas-data/3.2/core/geo-metro.json +2 -2
  579. package/dist/lib/schemas-data/3.2/core/geo-place-area.json +4 -4
  580. package/dist/lib/schemas-data/3.2/core/geo-place-catalog-capability.json +2 -2
  581. package/dist/lib/schemas-data/3.2/core/geo-place-catalog-entry.json +3 -3
  582. package/dist/lib/schemas-data/3.2/core/geo-place-requirement.json +3 -3
  583. package/dist/lib/schemas-data/3.2/core/geo-place-resolver.json +1 -1
  584. package/dist/lib/schemas-data/3.2/core/geo-place-support.json +3 -3
  585. package/dist/lib/schemas-data/3.2/core/geo-place-system.json +1 -1
  586. package/dist/lib/schemas-data/3.2/core/geo-place-type.json +1 -1
  587. package/dist/lib/schemas-data/3.2/core/geo-region-requirement.json +1 -1
  588. package/dist/lib/schemas-data/3.2/core/geo-region-support.json +2 -2
  589. package/dist/lib/schemas-data/3.2/core/get-geo-place-resolution-request.json +3 -3
  590. package/dist/lib/schemas-data/3.2/core/get-geo-place-resolution-response.json +4 -4
  591. package/dist/lib/schemas-data/3.2/core/hotel-item.json +4 -4
  592. package/dist/lib/schemas-data/3.2/core/iana-timezone.json +1 -1
  593. package/dist/lib/schemas-data/3.2/core/identifier.json +2 -2
  594. package/dist/lib/schemas-data/3.2/core/impairment.json +3 -3
  595. package/dist/lib/schemas-data/3.2/core/indicator-bearing.json +4 -4
  596. package/dist/lib/schemas-data/3.2/core/indicator-scope.json +1 -1
  597. package/dist/lib/schemas-data/3.2/core/indicator.json +4 -4
  598. package/dist/lib/schemas-data/3.2/core/indicators-changed-webhook.json +3 -3
  599. package/dist/lib/schemas-data/3.2/core/industry-identifier.json +2 -2
  600. package/dist/lib/schemas-data/3.2/core/insertion-order.json +1 -1
  601. package/dist/lib/schemas-data/3.2/core/installment-deadlines.json +2 -2
  602. package/dist/lib/schemas-data/3.2/core/installment-delivery-metrics.json +3 -3
  603. package/dist/lib/schemas-data/3.2/core/installment-property-delivery-metrics.json +5 -5
  604. package/dist/lib/schemas-data/3.2/core/installment-ref.json +2 -2
  605. package/dist/lib/schemas-data/3.2/core/installment.json +10 -10
  606. package/dist/lib/schemas-data/3.2/core/inventory-list-application.json +1 -1
  607. package/dist/lib/schemas-data/3.2/core/job-item.json +3 -3
  608. package/dist/lib/schemas-data/3.2/core/keyword-delivery-metrics.json +3 -3
  609. package/dist/lib/schemas-data/3.2/core/keyword-target.json +2 -2
  610. package/dist/lib/schemas-data/3.2/core/limited-series.json +1 -1
  611. package/dist/lib/schemas-data/3.2/core/locale-tag.json +1 -1
  612. package/dist/lib/schemas-data/3.2/core/localized-creative-asset.json +3 -3
  613. package/dist/lib/schemas-data/3.2/core/macro-bearing-url.json +1 -1
  614. package/dist/lib/schemas-data/3.2/core/macro-declaration.json +10 -10
  615. package/dist/lib/schemas-data/3.2/core/macro-encoding.json +1 -1
  616. package/dist/lib/schemas-data/3.2/core/macro-resolution-capability.json +8 -8
  617. package/dist/lib/schemas-data/3.2/core/macro-resolution-result.json +10 -10
  618. package/dist/lib/schemas-data/3.2/core/macro-translation-target.json +7 -7
  619. package/dist/lib/schemas-data/3.2/core/material-deadline.json +1 -1
  620. package/dist/lib/schemas-data/3.2/core/mcp-webhook-payload.json +6 -6
  621. package/dist/lib/schemas-data/3.2/core/measurement-readiness.json +5 -5
  622. package/dist/lib/schemas-data/3.2/core/measurement-terms.json +3 -3
  623. package/dist/lib/schemas-data/3.2/core/measurement-window.json +1 -1
  624. package/dist/lib/schemas-data/3.2/core/media-buy-available-action-id.json +2 -2
  625. package/dist/lib/schemas-data/3.2/core/media-buy-available-action.json +7 -7
  626. package/dist/lib/schemas-data/3.2/core/media-buy-change-term-id.json +1 -1
  627. package/dist/lib/schemas-data/3.2/core/media-buy-features.json +3 -2
  628. package/dist/lib/schemas-data/3.2/core/media-buy-frequency-cap-capability.json +3 -3
  629. package/dist/lib/schemas-data/3.2/core/media-buy-frequency-cap-requirement.json +3 -3
  630. package/dist/lib/schemas-data/3.2/core/media-buy-frequency-cap-support.json +3 -3
  631. package/dist/lib/schemas-data/3.2/core/media-buy-frequency-cap.json +2 -2
  632. package/dist/lib/schemas-data/3.2/core/media-buy-legacy-terms-ref.json +1 -1
  633. package/dist/lib/schemas-data/3.2/core/media-buy-support-requirements.json +2 -2
  634. package/dist/lib/schemas-data/3.2/core/media-buy-support.json +3 -3
  635. package/dist/lib/schemas-data/3.2/core/media-buy.json +14 -14
  636. package/dist/lib/schemas-data/3.2/core/missing-metric.json +14 -14
  637. package/dist/lib/schemas-data/3.2/core/negative-keyword.json +2 -2
  638. package/dist/lib/schemas-data/3.2/core/notification-config.json +4 -3
  639. package/dist/lib/schemas-data/3.2/core/offering-asset-group.json +16 -16
  640. package/dist/lib/schemas-data/3.2/core/offering.json +5 -5
  641. package/dist/lib/schemas-data/3.2/core/operator-identity.json +2 -2
  642. package/dist/lib/schemas-data/3.2/core/operator-unit.json +1 -1
  643. package/dist/lib/schemas-data/3.2/core/opportunity-context.json +2 -2
  644. package/dist/lib/schemas-data/3.2/core/optimization-goal.json +9 -9
  645. package/dist/lib/schemas-data/3.2/core/outcome-measurement.json +2 -2
  646. package/dist/lib/schemas-data/3.2/core/outcome-target-cost-per.json +2 -2
  647. package/dist/lib/schemas-data/3.2/core/overlay.json +1 -1
  648. package/dist/lib/schemas-data/3.2/core/package-delivery-metric-value.json +2 -2
  649. package/dist/lib/schemas-data/3.2/core/package-format-snapshot.json +5 -5
  650. package/dist/lib/schemas-data/3.2/core/package-signal-targeting-group.json +2 -2
  651. package/dist/lib/schemas-data/3.2/core/package-signal-targeting-groups.json +2 -2
  652. package/dist/lib/schemas-data/3.2/core/package-signal-targeting.json +3 -3
  653. package/dist/lib/schemas-data/3.2/core/package-targeting-resolution.json +3 -3
  654. package/dist/lib/schemas-data/3.2/core/package.json +24 -23
  655. package/dist/lib/schemas-data/3.2/core/pagination-request.json +1 -1
  656. package/dist/lib/schemas-data/3.2/core/pagination-response.json +1 -1
  657. package/dist/lib/schemas-data/3.2/core/performance-feedback-assertion.json +8 -8
  658. package/dist/lib/schemas-data/3.2/core/performance-feedback-metric.json +14 -14
  659. package/dist/lib/schemas-data/3.2/core/performance-feedback.json +17 -17
  660. package/dist/lib/schemas-data/3.2/core/performance-standard.json +4 -4
  661. package/dist/lib/schemas-data/3.2/core/placement-definition.json +15 -15
  662. package/dist/lib/schemas-data/3.2/core/placement-delivery-metrics.json +3 -3
  663. package/dist/lib/schemas-data/3.2/core/placement-evidence.json +1 -1
  664. package/dist/lib/schemas-data/3.2/core/placement-identity.json +2 -2
  665. package/dist/lib/schemas-data/3.2/core/placement-presentation.json +1 -1
  666. package/dist/lib/schemas-data/3.2/core/placement-property-delivery-metrics.json +5 -5
  667. package/dist/lib/schemas-data/3.2/core/placement-ref.json +1 -1
  668. package/dist/lib/schemas-data/3.2/core/placement-selection.json +5 -5
  669. package/dist/lib/schemas-data/3.2/core/placement.json +11 -10
  670. package/dist/lib/schemas-data/3.2/core/planned-delivery.json +8 -8
  671. package/dist/lib/schemas-data/3.2/core/platform-extension-ref.json +1 -1
  672. package/dist/lib/schemas-data/3.2/core/positive-postal-area-support.json +2 -2
  673. package/dist/lib/schemas-data/3.2/core/postal-area-support.json +2 -2
  674. package/dist/lib/schemas-data/3.2/core/postal-area.json +4 -4
  675. package/dist/lib/schemas-data/3.2/core/postal-country-system.json +2 -2
  676. package/dist/lib/schemas-data/3.2/core/presentation-ref.json +1 -1
  677. package/dist/lib/schemas-data/3.2/core/preview-provider.json +1 -1
  678. package/dist/lib/schemas-data/3.2/core/preview-renderer-metadata.json +1 -1
  679. package/dist/lib/schemas-data/3.2/core/price.json +1 -1
  680. package/dist/lib/schemas-data/3.2/core/pricing-option.json +11 -11
  681. package/dist/lib/schemas-data/3.2/core/principal-changed-webhook.json +2 -2
  682. package/dist/lib/schemas-data/3.2/core/principal-declarations-state.json +3 -3
  683. package/dist/lib/schemas-data/3.2/core/principal-declarations.json +2 -2
  684. package/dist/lib/schemas-data/3.2/core/principal-state.json +4 -4
  685. package/dist/lib/schemas-data/3.2/core/product-allocation.json +5 -5
  686. package/dist/lib/schemas-data/3.2/core/product-allowed-action.json +6 -6
  687. package/dist/lib/schemas-data/3.2/core/product-audience-evidence-requirements.json +13 -13
  688. package/dist/lib/schemas-data/3.2/core/product-card-reference-asset.json +5 -5
  689. package/dist/lib/schemas-data/3.2/core/product-change-map.json +1 -1
  690. package/dist/lib/schemas-data/3.2/core/product-execution-requirement.json +7 -7
  691. package/dist/lib/schemas-data/3.2/core/product-filters.json +37 -36
  692. package/dist/lib/schemas-data/3.2/core/product-format-declaration.json +22 -22
  693. package/dist/lib/schemas-data/3.2/core/product-identity.json +1 -1
  694. package/dist/lib/schemas-data/3.2/core/product-offer-filters.json +26 -26
  695. package/dist/lib/schemas-data/3.2/core/product-signal-targeting-option.json +3 -3
  696. package/dist/lib/schemas-data/3.2/core/product-targeting-resolution.json +3 -3
  697. package/dist/lib/schemas-data/3.2/core/product.json +55 -54
  698. package/dist/lib/schemas-data/3.2/core/property-delivery-metrics.json +4 -4
  699. package/dist/lib/schemas-data/3.2/core/property-id.json +1 -1
  700. package/dist/lib/schemas-data/3.2/core/property-list-ref.json +1 -1
  701. package/dist/lib/schemas-data/3.2/core/property-ref.json +2 -2
  702. package/dist/lib/schemas-data/3.2/core/property-tag.json +1 -1
  703. package/dist/lib/schemas-data/3.2/core/property.json +6 -6
  704. package/dist/lib/schemas-data/3.2/core/proposal.json +9 -9
  705. package/dist/lib/schemas-data/3.2/core/protocol-envelope.json +5 -5
  706. package/dist/lib/schemas-data/3.2/core/provenance.json +9 -9
  707. package/dist/lib/schemas-data/3.2/core/publisher-property-selector.json +3 -3
  708. package/dist/lib/schemas-data/3.2/core/push-notification-config.json +3 -2
  709. package/dist/lib/schemas-data/3.2/core/real-estate-item.json +4 -4
  710. package/dist/lib/schemas-data/3.2/core/reference-asset.json +1 -1
  711. package/dist/lib/schemas-data/3.2/core/reference-renderer.json +1 -1
  712. package/dist/lib/schemas-data/3.2/core/registry-event.json +16 -15
  713. package/dist/lib/schemas-data/3.2/core/registry-feed-response.json +2 -2
  714. package/dist/lib/schemas-data/3.2/core/reporting-adjustment-receipt.json +1 -1
  715. package/dist/lib/schemas-data/3.2/core/reporting-adjustment.json +2 -2
  716. package/dist/lib/schemas-data/3.2/core/reporting-canonical-content-digest.json +1 -1
  717. package/dist/lib/schemas-data/3.2/core/reporting-canonicalization-contract.json +1 -1
  718. package/dist/lib/schemas-data/3.2/core/reporting-capabilities.json +12 -12
  719. package/dist/lib/schemas-data/3.2/core/reporting-consumer-status.json +1 -1
  720. package/dist/lib/schemas-data/3.2/core/reporting-control-total.json +1 -1
  721. package/dist/lib/schemas-data/3.2/core/reporting-coverage.json +1 -1
  722. package/dist/lib/schemas-data/3.2/core/reporting-dataset-share-destination.json +1 -1
  723. package/dist/lib/schemas-data/3.2/core/reporting-delivery-capabilities.json +3 -3
  724. package/dist/lib/schemas-data/3.2/core/reporting-delivery-config-state.json +4 -4
  725. package/dist/lib/schemas-data/3.2/core/reporting-delivery-config.json +7 -7
  726. package/dist/lib/schemas-data/3.2/core/reporting-delivery-method.json +4 -4
  727. package/dist/lib/schemas-data/3.2/core/reporting-delivery-offering-id.json +1 -1
  728. package/dist/lib/schemas-data/3.2/core/reporting-delivery-offering.json +8 -8
  729. package/dist/lib/schemas-data/3.2/core/reporting-delivery-ready-webhook.json +3 -3
  730. package/dist/lib/schemas-data/3.2/core/reporting-file-compression.json +1 -1
  731. package/dist/lib/schemas-data/3.2/core/reporting-file-entry.json +3 -3
  732. package/dist/lib/schemas-data/3.2/core/reporting-file-manifest.json +4 -4
  733. package/dist/lib/schemas-data/3.2/core/reporting-file-object-ref.json +1 -1
  734. package/dist/lib/schemas-data/3.2/core/reporting-ledger-changed-webhook.json +3 -3
  735. package/dist/lib/schemas-data/3.2/core/reporting-materialization.json +4 -4
  736. package/dist/lib/schemas-data/3.2/core/reporting-native-version-ref.json +1 -1
  737. package/dist/lib/schemas-data/3.2/core/reporting-obligation.json +9 -9
  738. package/dist/lib/schemas-data/3.2/core/reporting-receipt.json +5 -5
  739. package/dist/lib/schemas-data/3.2/core/reporting-reconciliation-mode.json +1 -1
  740. package/dist/lib/schemas-data/3.2/core/reporting-reliability-statistics.json +1 -1
  741. package/dist/lib/schemas-data/3.2/core/reporting-report-definition.json +1 -1
  742. package/dist/lib/schemas-data/3.2/core/reporting-resource.json +2 -2
  743. package/dist/lib/schemas-data/3.2/core/reporting-revision.json +6 -6
  744. package/dist/lib/schemas-data/3.2/core/reporting-schedule-offering.json +2 -2
  745. package/dist/lib/schemas-data/3.2/core/reporting-schedule.json +1 -1
  746. package/dist/lib/schemas-data/3.2/core/reporting-status-changed-webhook.json +5 -5
  747. package/dist/lib/schemas-data/3.2/core/reporting-status-issue.json +4 -4
  748. package/dist/lib/schemas-data/3.2/core/reporting-verification-profile-set.json +1 -1
  749. package/dist/lib/schemas-data/3.2/core/reporting-verification-profile.json +1 -1
  750. package/dist/lib/schemas-data/3.2/core/reporting-verification.json +7 -7
  751. package/dist/lib/schemas-data/3.2/core/reporting-webhook.json +4 -3
  752. package/dist/lib/schemas-data/3.2/core/reporting-write-destination.json +1 -1
  753. package/dist/lib/schemas-data/3.2/core/representation-destination.json +5 -5
  754. package/dist/lib/schemas-data/3.2/core/representation-rejection.json +1 -1
  755. package/dist/lib/schemas-data/3.2/core/representation-selection.json +5 -5
  756. package/dist/lib/schemas-data/3.2/core/requirements/asset-requirements.json +13 -13
  757. package/dist/lib/schemas-data/3.2/core/requirements/audio-asset-requirements.json +1 -1
  758. package/dist/lib/schemas-data/3.2/core/requirements/catalog-field-binding.json +4 -4
  759. package/dist/lib/schemas-data/3.2/core/requirements/catalog-requirements.json +5 -5
  760. package/dist/lib/schemas-data/3.2/core/requirements/css-asset-requirements.json +1 -1
  761. package/dist/lib/schemas-data/3.2/core/requirements/daast-asset-requirements.json +3 -3
  762. package/dist/lib/schemas-data/3.2/core/requirements/html-asset-requirements.json +1 -1
  763. package/dist/lib/schemas-data/3.2/core/requirements/image-asset-requirements.json +2 -2
  764. package/dist/lib/schemas-data/3.2/core/requirements/javascript-asset-requirements.json +1 -1
  765. package/dist/lib/schemas-data/3.2/core/requirements/markdown-asset-requirements.json +1 -1
  766. package/dist/lib/schemas-data/3.2/core/requirements/offering-asset-constraint.json +4 -4
  767. package/dist/lib/schemas-data/3.2/core/requirements/text-asset-requirements.json +1 -1
  768. package/dist/lib/schemas-data/3.2/core/requirements/url-asset-requirements.json +1 -1
  769. package/dist/lib/schemas-data/3.2/core/requirements/vast-asset-requirements.json +4 -4
  770. package/dist/lib/schemas-data/3.2/core/requirements/video-asset-requirements.json +6 -6
  771. package/dist/lib/schemas-data/3.2/core/requirements/webhook-asset-requirements.json +1 -1
  772. package/dist/lib/schemas-data/3.2/core/response-payload-jws-envelope.json +1 -1
  773. package/dist/lib/schemas-data/3.2/core/response.json +1 -1
  774. package/dist/lib/schemas-data/3.2/core/rights-attestation-evaluation.json +5 -5
  775. package/dist/lib/schemas-data/3.2/core/rights-constraint.json +7 -7
  776. package/dist/lib/schemas-data/3.2/core/seller-agent-ref.json +1 -1
  777. package/dist/lib/schemas-data/3.2/core/signal-coverage-forecast.json +5 -5
  778. package/dist/lib/schemas-data/3.2/core/signal-definition-enrichment.json +5 -5
  779. package/dist/lib/schemas-data/3.2/core/signal-definition.json +8 -8
  780. package/dist/lib/schemas-data/3.2/core/signal-filters.json +3 -3
  781. package/dist/lib/schemas-data/3.2/core/signal-id.json +1 -1
  782. package/dist/lib/schemas-data/3.2/core/signal-listing.json +6 -6
  783. package/dist/lib/schemas-data/3.2/core/signal-modeling-disclosure.json +1 -1
  784. package/dist/lib/schemas-data/3.2/core/signal-pricing-option.json +2 -2
  785. package/dist/lib/schemas-data/3.2/core/signal-pricing.json +6 -6
  786. package/dist/lib/schemas-data/3.2/core/signal-ref.json +1 -1
  787. package/dist/lib/schemas-data/3.2/core/signal-selection-group-rule.json +1 -1
  788. package/dist/lib/schemas-data/3.2/core/signal-targeting-expression.json +4 -4
  789. package/dist/lib/schemas-data/3.2/core/signal-targeting-rules.json +2 -2
  790. package/dist/lib/schemas-data/3.2/core/signal-targeting.json +7 -7
  791. package/dist/lib/schemas-data/3.2/core/sla-window.json +1 -1
  792. package/dist/lib/schemas-data/3.2/core/special.json +2 -2
  793. package/dist/lib/schemas-data/3.2/core/spot-reporting-capability.json +2 -2
  794. package/dist/lib/schemas-data/3.2/core/start-timing.json +1 -1
  795. package/dist/lib/schemas-data/3.2/core/store-item.json +3 -3
  796. package/dist/lib/schemas-data/3.2/core/talent.json +2 -2
  797. package/dist/lib/schemas-data/3.2/core/targeting-input.json +40 -40
  798. package/dist/lib/schemas-data/3.2/core/targeting-modification.json +3 -3
  799. package/dist/lib/schemas-data/3.2/core/targeting-overlay-requirements.json +15 -15
  800. package/dist/lib/schemas-data/3.2/core/targeting-overlay-support.json +25 -25
  801. package/dist/lib/schemas-data/3.2/core/targeting-unknown-age-eligibility-constraint.json +1 -1
  802. package/dist/lib/schemas-data/3.2/core/targeting-verified-age-basis-constraint.json +1 -1
  803. package/dist/lib/schemas-data/3.2/core/targeting.json +34 -34
  804. package/dist/lib/schemas-data/3.2/core/tasks-get-request.json +5 -5
  805. package/dist/lib/schemas-data/3.2/core/tasks-get-response.json +10 -10
  806. package/dist/lib/schemas-data/3.2/core/tasks-list-request.json +13 -13
  807. package/dist/lib/schemas-data/3.2/core/tasks-list-response.json +8 -8
  808. package/dist/lib/schemas-data/3.2/core/tracker-execution-contract.json +2 -2
  809. package/dist/lib/schemas-data/3.2/core/tracker-execution-selector.json +18 -18
  810. package/dist/lib/schemas-data/3.2/core/transformer-param.json +1 -1
  811. package/dist/lib/schemas-data/3.2/core/transformer.json +6 -6
  812. package/dist/lib/schemas-data/3.2/core/truncation-sentinel.json +1 -1
  813. package/dist/lib/schemas-data/3.2/core/user-match.json +3 -3
  814. package/dist/lib/schemas-data/3.2/core/vast-media-file-requirements.json +2 -2
  815. package/dist/lib/schemas-data/3.2/core/vast-tracker-constraints.json +2 -2
  816. package/dist/lib/schemas-data/3.2/core/vehicle-item.json +4 -4
  817. package/dist/lib/schemas-data/3.2/core/vendor-metric-id.json +1 -1
  818. package/dist/lib/schemas-data/3.2/core/vendor-metric-optimization-supported-metric.json +3 -3
  819. package/dist/lib/schemas-data/3.2/core/vendor-metric-optimization.json +2 -2
  820. package/dist/lib/schemas-data/3.2/core/vendor-metric-value.json +9 -9
  821. package/dist/lib/schemas-data/3.2/core/vendor-pricing-option.json +3 -3
  822. package/dist/lib/schemas-data/3.2/core/verification-token-claims.json +1 -1
  823. package/dist/lib/schemas-data/3.2/core/version-envelope.json +2 -1
  824. package/dist/lib/schemas-data/3.2/core/warning-resource.json +1 -1
  825. package/dist/lib/schemas-data/3.2/core/warning.json +4 -4
  826. package/dist/lib/schemas-data/3.2/core/webhook-activity-record.json +3 -3
  827. package/dist/lib/schemas-data/3.2/core/webhook-challenge-response.json +1 -1
  828. package/dist/lib/schemas-data/3.2/core/webhook-challenge.json +2 -2
  829. package/dist/lib/schemas-data/3.2/core/wholesale-feed-event.json +20 -20
  830. package/dist/lib/schemas-data/3.2/core/wholesale-feed-webhook.json +3 -3
  831. package/dist/lib/schemas-data/3.2/core/x-entity-types.json +1 -1
  832. package/dist/lib/schemas-data/3.2/creative/asset-types/index.json +6 -6
  833. package/dist/lib/schemas-data/3.2/creative/audit-observation.json +2 -2
  834. package/dist/lib/schemas-data/3.2/creative/creative-assignment-changed-webhook.json +2 -2
  835. package/dist/lib/schemas-data/3.2/creative/creative-feature-result.json +2 -2
  836. package/dist/lib/schemas-data/3.2/creative/creative-purged-webhook.json +3 -3
  837. package/dist/lib/schemas-data/3.2/creative/creative-status-changed-webhook.json +5 -5
  838. package/dist/lib/schemas-data/3.2/creative/get-creative-delivery-request.json +6 -6
  839. package/dist/lib/schemas-data/3.2/creative/get-creative-delivery-response.json +13 -12
  840. package/dist/lib/schemas-data/3.2/creative/get-creative-features-async-response-submitted.json +3 -3
  841. package/dist/lib/schemas-data/3.2/creative/get-creative-features-request.json +7 -7
  842. package/dist/lib/schemas-data/3.2/creative/get-creative-features-response.json +9 -9
  843. package/dist/lib/schemas-data/3.2/creative/get-creative-features-terminal-success.json +6 -6
  844. package/dist/lib/schemas-data/3.2/creative/list-creative-formats-request.json +16 -13
  845. package/dist/lib/schemas-data/3.2/creative/list-creative-formats-response.json +9 -9
  846. package/dist/lib/schemas-data/3.2/creative/list-creatives-request.json +9 -9
  847. package/dist/lib/schemas-data/3.2/creative/list-creatives-response.json +34 -34
  848. package/dist/lib/schemas-data/3.2/creative/list-transformers-request.json +9 -9
  849. package/dist/lib/schemas-data/3.2/creative/list-transformers-response.json +8 -8
  850. package/dist/lib/schemas-data/3.2/creative/preview-creative-request.json +13 -13
  851. package/dist/lib/schemas-data/3.2/creative/preview-creative-response.json +18 -18
  852. package/dist/lib/schemas-data/3.2/creative/preview-render.json +4 -4
  853. package/dist/lib/schemas-data/3.2/creative/sync-creatives-async-response-input-required.json +3 -3
  854. package/dist/lib/schemas-data/3.2/creative/sync-creatives-async-response-submitted.json +4 -4
  855. package/dist/lib/schemas-data/3.2/creative/sync-creatives-async-response-working.json +3 -3
  856. package/dist/lib/schemas-data/3.2/creative/sync-creatives-request.json +10 -10
  857. package/dist/lib/schemas-data/3.2/creative/sync-creatives-response.json +18 -18
  858. package/dist/lib/schemas-data/3.2/creative/validate-input-request.json +4 -4
  859. package/dist/lib/schemas-data/3.2/creative/validate-input-response.json +4 -4
  860. package/dist/lib/schemas-data/3.2/creative/validate-input-result.json +2 -2
  861. package/dist/lib/schemas-data/3.2/creative/video-brief.json +1 -1
  862. package/dist/lib/schemas-data/3.2/enums/account-currency-mode.json +1 -1
  863. package/dist/lib/schemas-data/3.2/enums/account-scope.json +1 -1
  864. package/dist/lib/schemas-data/3.2/enums/account-status.json +1 -1
  865. package/dist/lib/schemas-data/3.2/enums/action-not-allowed-reason.json +1 -1
  866. package/dist/lib/schemas-data/3.2/enums/action-source.json +1 -1
  867. package/dist/lib/schemas-data/3.2/enums/activation-method.json +1 -1
  868. package/dist/lib/schemas-data/3.2/enums/adcp-protocol.json +1 -1
  869. package/dist/lib/schemas-data/3.2/enums/adjustment-kind.json +1 -1
  870. package/dist/lib/schemas-data/3.2/enums/advertiser-industry.json +1 -1
  871. package/dist/lib/schemas-data/3.2/enums/age-determination-basis.json +1 -1
  872. package/dist/lib/schemas-data/3.2/enums/age-verification-method.json +1 -1
  873. package/dist/lib/schemas-data/3.2/enums/assessment-status.json +1 -1
  874. package/dist/lib/schemas-data/3.2/enums/asset-content-type.json +1 -1
  875. package/dist/lib/schemas-data/3.2/enums/attestation-claim.json +1 -1
  876. package/dist/lib/schemas-data/3.2/enums/attribution-methodology.json +1 -1
  877. package/dist/lib/schemas-data/3.2/enums/attribution-model.json +1 -1
  878. package/dist/lib/schemas-data/3.2/enums/audience-evidence-methodology.json +1 -1
  879. package/dist/lib/schemas-data/3.2/enums/audience-resolution-method.json +1 -1
  880. package/dist/lib/schemas-data/3.2/enums/audience-source.json +1 -1
  881. package/dist/lib/schemas-data/3.2/enums/audience-status.json +1 -1
  882. package/dist/lib/schemas-data/3.2/enums/audience-subject-type.json +1 -1
  883. package/dist/lib/schemas-data/3.2/enums/audio-channel-layout.json +1 -1
  884. package/dist/lib/schemas-data/3.2/enums/audio-distribution-type.json +1 -1
  885. package/dist/lib/schemas-data/3.2/enums/auth-scheme.json +2 -1
  886. package/dist/lib/schemas-data/3.2/enums/availability-status.json +1 -1
  887. package/dist/lib/schemas-data/3.2/enums/available-metric.json +1 -1
  888. package/dist/lib/schemas-data/3.2/enums/billing-party.json +1 -1
  889. package/dist/lib/schemas-data/3.2/enums/binary-verdict.json +1 -1
  890. package/dist/lib/schemas-data/3.2/enums/brand-agent-type.json +1 -1
  891. package/dist/lib/schemas-data/3.2/enums/browser-family.json +1 -1
  892. package/dist/lib/schemas-data/3.2/enums/c2pa-watermark-action.json +1 -1
  893. package/dist/lib/schemas-data/3.2/enums/canceled-by.json +1 -1
  894. package/dist/lib/schemas-data/3.2/enums/canonical-media-buy-action-mode.json +1 -1
  895. package/dist/lib/schemas-data/3.2/enums/canonical-media-buy-action.json +1 -1
  896. package/dist/lib/schemas-data/3.2/enums/catalog-action.json +1 -1
  897. package/dist/lib/schemas-data/3.2/enums/catalog-item-status.json +1 -1
  898. package/dist/lib/schemas-data/3.2/enums/catalog-type.json +1 -1
  899. package/dist/lib/schemas-data/3.2/enums/channels.json +1 -1
  900. package/dist/lib/schemas-data/3.2/enums/cloud-storage-protocol.json +1 -1
  901. package/dist/lib/schemas-data/3.2/enums/co-branding-requirement.json +1 -1
  902. package/dist/lib/schemas-data/3.2/enums/collection-cadence.json +1 -1
  903. package/dist/lib/schemas-data/3.2/enums/collection-kind.json +1 -1
  904. package/dist/lib/schemas-data/3.2/enums/collection-relationship.json +1 -1
  905. package/dist/lib/schemas-data/3.2/enums/collection-status.json +1 -1
  906. package/dist/lib/schemas-data/3.2/enums/completion-source.json +1 -1
  907. package/dist/lib/schemas-data/3.2/enums/consent-basis.json +1 -1
  908. package/dist/lib/schemas-data/3.2/enums/content-id-type.json +1 -1
  909. package/dist/lib/schemas-data/3.2/enums/content-rating-system.json +1 -1
  910. package/dist/lib/schemas-data/3.2/enums/creative-action.json +1 -1
  911. package/dist/lib/schemas-data/3.2/enums/creative-agent-capability.json +1 -1
  912. package/dist/lib/schemas-data/3.2/enums/creative-approval-status.json +1 -1
  913. package/dist/lib/schemas-data/3.2/enums/creative-event-reason-code.json +1 -1
  914. package/dist/lib/schemas-data/3.2/enums/creative-identifier-type.json +1 -1
  915. package/dist/lib/schemas-data/3.2/enums/creative-quality.json +1 -1
  916. package/dist/lib/schemas-data/3.2/enums/creative-selection-strategy.json +1 -1
  917. package/dist/lib/schemas-data/3.2/enums/creative-sort-field.json +1 -1
  918. package/dist/lib/schemas-data/3.2/enums/creative-status.json +1 -1
  919. package/dist/lib/schemas-data/3.2/enums/ctv-ad-experience.json +1 -1
  920. package/dist/lib/schemas-data/3.2/enums/daast-tracking-event.json +1 -1
  921. package/dist/lib/schemas-data/3.2/enums/daast-version.json +1 -1
  922. package/dist/lib/schemas-data/3.2/enums/day-of-week.json +1 -1
  923. package/dist/lib/schemas-data/3.2/enums/daypart-timezone-mode.json +1 -1
  924. package/dist/lib/schemas-data/3.2/enums/delegation-authority.json +1 -1
  925. package/dist/lib/schemas-data/3.2/enums/delivery-recipient-cloud.json +1 -1
  926. package/dist/lib/schemas-data/3.2/enums/delivery-status.json +1 -1
  927. package/dist/lib/schemas-data/3.2/enums/delivery-type.json +1 -1
  928. package/dist/lib/schemas-data/3.2/enums/demographic-system.json +1 -1
  929. package/dist/lib/schemas-data/3.2/enums/derivative-type.json +1 -1
  930. package/dist/lib/schemas-data/3.2/enums/device-platform.json +1 -1
  931. package/dist/lib/schemas-data/3.2/enums/device-type.json +1 -1
  932. package/dist/lib/schemas-data/3.2/enums/digital-source-type.json +1 -1
  933. package/dist/lib/schemas-data/3.2/enums/dimension-unit.json +1 -1
  934. package/dist/lib/schemas-data/3.2/enums/disclosure-persistence.json +1 -1
  935. package/dist/lib/schemas-data/3.2/enums/disclosure-position.json +1 -1
  936. package/dist/lib/schemas-data/3.2/enums/distance-unit.json +1 -1
  937. package/dist/lib/schemas-data/3.2/enums/distribution-identifier-type.json +1 -1
  938. package/dist/lib/schemas-data/3.2/enums/dooh-motion-type.json +1 -1
  939. package/dist/lib/schemas-data/3.2/enums/embedded-provenance-method.json +1 -1
  940. package/dist/lib/schemas-data/3.2/enums/error-code.json +1 -1
  941. package/dist/lib/schemas-data/3.2/enums/error-scope.json +1 -1
  942. package/dist/lib/schemas-data/3.2/enums/escalation-severity.json +1 -1
  943. package/dist/lib/schemas-data/3.2/enums/event-type.json +1 -1
  944. package/dist/lib/schemas-data/3.2/enums/exclusivity.json +1 -1
  945. package/dist/lib/schemas-data/3.2/enums/feature-check-status.json +1 -1
  946. package/dist/lib/schemas-data/3.2/enums/feed-format.json +1 -1
  947. package/dist/lib/schemas-data/3.2/enums/feedback-source.json +1 -1
  948. package/dist/lib/schemas-data/3.2/enums/forecast-method.json +1 -1
  949. package/dist/lib/schemas-data/3.2/enums/forecast-range-unit.json +1 -1
  950. package/dist/lib/schemas-data/3.2/enums/forecastable-metric.json +1 -1
  951. package/dist/lib/schemas-data/3.2/enums/format-id-parameter.json +1 -1
  952. package/dist/lib/schemas-data/3.2/enums/frame-rate-type.json +1 -1
  953. package/dist/lib/schemas-data/3.2/enums/frequency-cap-control-mode.json +1 -1
  954. package/dist/lib/schemas-data/3.2/enums/frequency-cap-mutable-field.json +1 -1
  955. package/dist/lib/schemas-data/3.2/enums/frequency-cap-scope.json +1 -1
  956. package/dist/lib/schemas-data/3.2/enums/genre-taxonomy.json +1 -1
  957. package/dist/lib/schemas-data/3.2/enums/geo-level.json +1 -1
  958. package/dist/lib/schemas-data/3.2/enums/gop-type.json +1 -1
  959. package/dist/lib/schemas-data/3.2/enums/governance-decision.json +1 -1
  960. package/dist/lib/schemas-data/3.2/enums/governance-domain.json +1 -1
  961. package/dist/lib/schemas-data/3.2/enums/governance-mode.json +1 -1
  962. package/dist/lib/schemas-data/3.2/enums/governance-phase.json +1 -1
  963. package/dist/lib/schemas-data/3.2/enums/history-entry-type.json +1 -1
  964. package/dist/lib/schemas-data/3.2/enums/http-method.json +1 -1
  965. package/dist/lib/schemas-data/3.2/enums/identifier-types.json +1 -1
  966. package/dist/lib/schemas-data/3.2/enums/impairment-offline-state.json +1 -1
  967. package/dist/lib/schemas-data/3.2/enums/impairment-reason-code.json +1 -1
  968. package/dist/lib/schemas-data/3.2/enums/indicator-type.json +1 -1
  969. package/dist/lib/schemas-data/3.2/enums/installment-status.json +1 -1
  970. package/dist/lib/schemas-data/3.2/enums/javascript-module-type.json +1 -1
  971. package/dist/lib/schemas-data/3.2/enums/landing-page-requirement.json +1 -1
  972. package/dist/lib/schemas-data/3.2/enums/legacy-postal-system.json +1 -1
  973. package/dist/lib/schemas-data/3.2/enums/lift-dimension.json +1 -1
  974. package/dist/lib/schemas-data/3.2/enums/logo-slot.json +1 -1
  975. package/dist/lib/schemas-data/3.2/enums/macro-dialect.json +1 -1
  976. package/dist/lib/schemas-data/3.2/enums/macro-mapping-status.json +1 -1
  977. package/dist/lib/schemas-data/3.2/enums/macro-processing-operation.json +1 -1
  978. package/dist/lib/schemas-data/3.2/enums/macro-resolution-reason.json +1 -1
  979. package/dist/lib/schemas-data/3.2/enums/macro-resolver.json +1 -1
  980. package/dist/lib/schemas-data/3.2/enums/macro-value-context.json +1 -1
  981. package/dist/lib/schemas-data/3.2/enums/makegood-remedy.json +1 -1
  982. package/dist/lib/schemas-data/3.2/enums/markdown-flavor.json +1 -1
  983. package/dist/lib/schemas-data/3.2/enums/match-id-type.json +1 -1
  984. package/dist/lib/schemas-data/3.2/enums/match-type.json +1 -1
  985. package/dist/lib/schemas-data/3.2/enums/media-buy-action-mode.json +1 -1
  986. package/dist/lib/schemas-data/3.2/enums/media-buy-frequency-cap-control-mode.json +1 -1
  987. package/dist/lib/schemas-data/3.2/enums/media-buy-health.json +1 -1
  988. package/dist/lib/schemas-data/3.2/enums/media-buy-status.json +1 -1
  989. package/dist/lib/schemas-data/3.2/enums/media-buy-valid-action.json +1 -1
  990. package/dist/lib/schemas-data/3.2/enums/metric-scope.json +1 -1
  991. package/dist/lib/schemas-data/3.2/enums/metric-type.json +1 -1
  992. package/dist/lib/schemas-data/3.2/enums/metro-system.json +1 -1
  993. package/dist/lib/schemas-data/3.2/enums/moov-atom-position.json +1 -1
  994. package/dist/lib/schemas-data/3.2/enums/motion-level.json +1 -1
  995. package/dist/lib/schemas-data/3.2/enums/notification-type.json +1 -1
  996. package/dist/lib/schemas-data/3.2/enums/offering-availability-status.json +1 -1
  997. package/dist/lib/schemas-data/3.2/enums/outcome-target-cost-strength.json +1 -1
  998. package/dist/lib/schemas-data/3.2/enums/outcome-type.json +1 -1
  999. package/dist/lib/schemas-data/3.2/enums/pacing.json +1 -1
  1000. package/dist/lib/schemas-data/3.2/enums/payment-terms.json +1 -1
  1001. package/dist/lib/schemas-data/3.2/enums/performance-baseline.json +1 -1
  1002. package/dist/lib/schemas-data/3.2/enums/performance-standard-metric.json +1 -1
  1003. package/dist/lib/schemas-data/3.2/enums/pixel-tracking-event.json +1 -1
  1004. package/dist/lib/schemas-data/3.2/enums/policy-category.json +1 -1
  1005. package/dist/lib/schemas-data/3.2/enums/policy-enforcement.json +1 -1
  1006. package/dist/lib/schemas-data/3.2/enums/postal-system.json +1 -1
  1007. package/dist/lib/schemas-data/3.2/enums/preview-output-format.json +1 -1
  1008. package/dist/lib/schemas-data/3.2/enums/pricing-model.json +1 -1
  1009. package/dist/lib/schemas-data/3.2/enums/pricing-structure.json +1 -1
  1010. package/dist/lib/schemas-data/3.2/enums/principal-kind.json +1 -1
  1011. package/dist/lib/schemas-data/3.2/enums/production-quality.json +1 -1
  1012. package/dist/lib/schemas-data/3.2/enums/property-type.json +1 -1
  1013. package/dist/lib/schemas-data/3.2/enums/proposal-decline-reason.json +1 -1
  1014. package/dist/lib/schemas-data/3.2/enums/proposal-refinement-reason.json +1 -1
  1015. package/dist/lib/schemas-data/3.2/enums/proposal-status.json +1 -1
  1016. package/dist/lib/schemas-data/3.2/enums/publisher-identifier-types.json +1 -1
  1017. package/dist/lib/schemas-data/3.2/enums/purchase-type.json +1 -1
  1018. package/dist/lib/schemas-data/3.2/enums/reach-aggregation.json +1 -1
  1019. package/dist/lib/schemas-data/3.2/enums/reach-unit.json +1 -1
  1020. package/dist/lib/schemas-data/3.2/enums/reporting-destination-setup-state.json +1 -1
  1021. package/dist/lib/schemas-data/3.2/enums/reporting-finality.json +1 -1
  1022. package/dist/lib/schemas-data/3.2/enums/reporting-frequency.json +1 -1
  1023. package/dist/lib/schemas-data/3.2/enums/reporting-health.json +1 -1
  1024. package/dist/lib/schemas-data/3.2/enums/representation-selection-strategy.json +1 -1
  1025. package/dist/lib/schemas-data/3.2/enums/request-signing-error-code.json +1 -1
  1026. package/dist/lib/schemas-data/3.2/enums/response-type.json +1 -1
  1027. package/dist/lib/schemas-data/3.2/enums/restricted-attribute.json +1 -1
  1028. package/dist/lib/schemas-data/3.2/enums/right-type.json +1 -1
  1029. package/dist/lib/schemas-data/3.2/enums/right-use.json +1 -1
  1030. package/dist/lib/schemas-data/3.2/enums/rights-billing-period.json +1 -1
  1031. package/dist/lib/schemas-data/3.2/enums/scan-type.json +1 -1
  1032. package/dist/lib/schemas-data/3.2/enums/seller-policy-decline-reason.json +1 -1
  1033. package/dist/lib/schemas-data/3.2/enums/si-session-status.json +1 -1
  1034. package/dist/lib/schemas-data/3.2/enums/signal-catalog-type.json +1 -1
  1035. package/dist/lib/schemas-data/3.2/enums/signal-source.json +1 -1
  1036. package/dist/lib/schemas-data/3.2/enums/signal-value-type.json +1 -1
  1037. package/dist/lib/schemas-data/3.2/enums/snapshot-unavailable-reason.json +1 -1
  1038. package/dist/lib/schemas-data/3.2/enums/social-placement-surface.json +1 -1
  1039. package/dist/lib/schemas-data/3.2/enums/sort-direction.json +1 -1
  1040. package/dist/lib/schemas-data/3.2/enums/sort-metric.json +1 -1
  1041. package/dist/lib/schemas-data/3.2/enums/special-category.json +1 -1
  1042. package/dist/lib/schemas-data/3.2/enums/specialism.json +1 -1
  1043. package/dist/lib/schemas-data/3.2/enums/sponsored-placement-type.json +1 -1
  1044. package/dist/lib/schemas-data/3.2/enums/talent-role.json +1 -1
  1045. package/dist/lib/schemas-data/3.2/enums/task-status.json +1 -1
  1046. package/dist/lib/schemas-data/3.2/enums/task-type.json +1 -1
  1047. package/dist/lib/schemas-data/3.2/enums/tracker-execution-actor.json +1 -1
  1048. package/dist/lib/schemas-data/3.2/enums/tracker-firing-path.json +1 -1
  1049. package/dist/lib/schemas-data/3.2/enums/transport-mode.json +1 -1
  1050. package/dist/lib/schemas-data/3.2/enums/travel-time-unit.json +1 -1
  1051. package/dist/lib/schemas-data/3.2/enums/uid-type.json +1 -1
  1052. package/dist/lib/schemas-data/3.2/enums/universal-macro.json +1 -1
  1053. package/dist/lib/schemas-data/3.2/enums/update-frequency.json +1 -1
  1054. package/dist/lib/schemas-data/3.2/enums/url-asset-type.json +1 -1
  1055. package/dist/lib/schemas-data/3.2/enums/validation-mode.json +1 -1
  1056. package/dist/lib/schemas-data/3.2/enums/vast-media-delivery-method.json +1 -1
  1057. package/dist/lib/schemas-data/3.2/enums/vast-tracking-event.json +1 -1
  1058. package/dist/lib/schemas-data/3.2/enums/vast-version.json +1 -1
  1059. package/dist/lib/schemas-data/3.2/enums/vendor-relationship.json +1 -1
  1060. package/dist/lib/schemas-data/3.2/enums/video-placement-type.json +1 -1
  1061. package/dist/lib/schemas-data/3.2/enums/view-threshold-basis.json +1 -1
  1062. package/dist/lib/schemas-data/3.2/enums/viewability-standard.json +1 -1
  1063. package/dist/lib/schemas-data/3.2/enums/warning-code.json +1 -1
  1064. package/dist/lib/schemas-data/3.2/enums/watermark-media-type.json +1 -1
  1065. package/dist/lib/schemas-data/3.2/enums/wcag-level.json +1 -1
  1066. package/dist/lib/schemas-data/3.2/enums/webhook-response-type.json +1 -1
  1067. package/dist/lib/schemas-data/3.2/enums/webhook-security-method.json +1 -1
  1068. package/dist/lib/schemas-data/3.2/error-details/accessibility-violation.json +1 -1
  1069. package/dist/lib/schemas-data/3.2/error-details/account-moved.json +2 -2
  1070. package/dist/lib/schemas-data/3.2/error-details/account-setup-required.json +1 -1
  1071. package/dist/lib/schemas-data/3.2/error-details/action-not-allowed.json +5 -5
  1072. package/dist/lib/schemas-data/3.2/error-details/agent-permission-denied.json +1 -1
  1073. package/dist/lib/schemas-data/3.2/error-details/audience-too-small.json +1 -1
  1074. package/dist/lib/schemas-data/3.2/error-details/authorization-required.json +3 -3
  1075. package/dist/lib/schemas-data/3.2/error-details/billing-not-permitted-for-agent.json +3 -3
  1076. package/dist/lib/schemas-data/3.2/error-details/billing-not-supported.json +2 -2
  1077. package/dist/lib/schemas-data/3.2/error-details/budget-too-low.json +1 -1
  1078. package/dist/lib/schemas-data/3.2/error-details/conflict.json +1 -1
  1079. package/dist/lib/schemas-data/3.2/error-details/creative-rejected.json +1 -1
  1080. package/dist/lib/schemas-data/3.2/error-details/creative-representation-unresolved.json +2 -2
  1081. package/dist/lib/schemas-data/3.2/error-details/creative-revision-content-mismatch.json +2 -2
  1082. package/dist/lib/schemas-data/3.2/error-details/execution-requirement-unmet.json +2 -2
  1083. package/dist/lib/schemas-data/3.2/error-details/governance-agent-not-accepted.json +2 -2
  1084. package/dist/lib/schemas-data/3.2/error-details/macro-resolution-failed.json +2 -2
  1085. package/dist/lib/schemas-data/3.2/error-details/policy-violation.json +1 -1
  1086. package/dist/lib/schemas-data/3.2/error-details/rate-limited.json +1 -1
  1087. package/dist/lib/schemas-data/3.2/error-details/requote-required.json +3 -3
  1088. package/dist/lib/schemas-data/3.2/error-details/stale-response.json +1 -1
  1089. package/dist/lib/schemas-data/3.2/error-details/unsupported-refinement-dimension.json +1 -1
  1090. package/dist/lib/schemas-data/3.2/error-details/vast-version-mismatch.json +6 -6
  1091. package/dist/lib/schemas-data/3.2/error-details/vendor-error-codes.json +1 -1
  1092. package/dist/lib/schemas-data/3.2/error-details/version-unsupported.json +3 -2
  1093. package/dist/lib/schemas-data/3.2/extensions/extension-meta.json +1 -1
  1094. package/dist/lib/schemas-data/3.2/extensions/index.json +2 -2
  1095. package/dist/lib/schemas-data/3.2/formats/canonical/_base.json +5 -5
  1096. package/dist/lib/schemas-data/3.2/formats/canonical/agent_placement.json +2 -2
  1097. package/dist/lib/schemas-data/3.2/formats/canonical/audio_daast.json +4 -4
  1098. package/dist/lib/schemas-data/3.2/formats/canonical/audio_hosted.json +2 -2
  1099. package/dist/lib/schemas-data/3.2/formats/canonical/audio_vast.json +5 -5
  1100. package/dist/lib/schemas-data/3.2/formats/canonical/coordinated_placements.json +18 -18
  1101. package/dist/lib/schemas-data/3.2/formats/canonical/display_tag.json +2 -2
  1102. package/dist/lib/schemas-data/3.2/formats/canonical/html5.json +2 -2
  1103. package/dist/lib/schemas-data/3.2/formats/canonical/image.json +5 -5
  1104. package/dist/lib/schemas-data/3.2/formats/canonical/image_carousel.json +2 -2
  1105. package/dist/lib/schemas-data/3.2/formats/canonical/native_in_feed.json +5 -5
  1106. package/dist/lib/schemas-data/3.2/formats/canonical/responsive_creative.json +2 -2
  1107. package/dist/lib/schemas-data/3.2/formats/canonical/seller_rendered_stateful_display.json +3 -3
  1108. package/dist/lib/schemas-data/3.2/formats/canonical/sponsored_placement.json +4 -4
  1109. package/dist/lib/schemas-data/3.2/formats/canonical/video_hosted.json +3 -3
  1110. package/dist/lib/schemas-data/3.2/formats/canonical/video_vast.json +8 -8
  1111. package/dist/lib/schemas-data/3.2/governance/accepted-governance-agents.json +1 -1
  1112. package/dist/lib/schemas-data/3.2/governance/attribute-definition.json +1 -1
  1113. package/dist/lib/schemas-data/3.2/governance/audience-constraints.json +3 -3
  1114. package/dist/lib/schemas-data/3.2/governance/check-governance-request.json +10 -10
  1115. package/dist/lib/schemas-data/3.2/governance/check-governance-response.json +8 -8
  1116. package/dist/lib/schemas-data/3.2/governance/get-plan-audit-logs-request.json +5 -5
  1117. package/dist/lib/schemas-data/3.2/governance/get-plan-audit-logs-response.json +14 -14
  1118. package/dist/lib/schemas-data/3.2/governance/policy-category-definition.json +2 -2
  1119. package/dist/lib/schemas-data/3.2/governance/policy-entry.json +7 -7
  1120. package/dist/lib/schemas-data/3.2/governance/policy-ref.json +1 -1
  1121. package/dist/lib/schemas-data/3.2/governance/report-plan-adjustment-request.json +4 -4
  1122. package/dist/lib/schemas-data/3.2/governance/report-plan-adjustment-response.json +4 -4
  1123. package/dist/lib/schemas-data/3.2/governance/report-plan-outcome-request.json +8 -8
  1124. package/dist/lib/schemas-data/3.2/governance/report-plan-outcome-response.json +5 -5
  1125. package/dist/lib/schemas-data/3.2/governance/reported-outcome-error.json +1 -1
  1126. package/dist/lib/schemas-data/3.2/governance/sync-plans-request.json +14 -14
  1127. package/dist/lib/schemas-data/3.2/governance/sync-plans-response.json +6 -6
  1128. package/dist/lib/schemas-data/3.2/index.json +639 -639
  1129. package/dist/lib/schemas-data/3.2/manifest.json +5 -3
  1130. package/dist/lib/schemas-data/3.2/manifest.schema.json +1 -1
  1131. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/account/get-account-financials-request.json +32 -30
  1132. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/account/list-account-changes-request.json +30 -29
  1133. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/account/list-accounts-request.json +32 -30
  1134. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/account/report-usage-request.json +32 -30
  1135. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/account/sync-accounts-request.json +98 -93
  1136. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/account/sync-governance-request.json +31 -29
  1137. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/brand/acquire-rights-request.json +41 -36
  1138. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/brand/get-brand-identity-request.json +6 -4
  1139. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/brand/get-rights-request.json +30 -28
  1140. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/brand/search-brands-request.json +26 -26
  1141. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/brand/update-rights-request.json +36 -32
  1142. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/brand/verify-brand-claim-request.json +5 -3
  1143. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/brand/verify-brand-claims-request.json +5 -3
  1144. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/collection/create-collection-list-request.json +48 -46
  1145. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/collection/delete-collection-list-request.json +31 -29
  1146. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/collection/get-collection-list-request.json +31 -29
  1147. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/collection/list-collection-lists-request.json +32 -30
  1148. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/collection/update-collection-list-request.json +48 -46
  1149. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/compliance/comply-test-controller-request.json +1218 -1209
  1150. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/content-standards/calibrate-content-request.json +34 -32
  1151. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/content-standards/create-content-standards-request.json +57 -55
  1152. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/content-standards/get-content-standards-request.json +6 -4
  1153. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/content-standards/get-media-buy-artifacts-request.json +31 -29
  1154. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/content-standards/list-content-standards-request.json +8 -6
  1155. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/content-standards/update-content-standards-request.json +57 -55
  1156. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/content-standards/validate-content-delivery-request.json +34 -32
  1157. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/creative/get-creative-delivery-request.json +32 -30
  1158. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/creative/get-creative-features-request.json +260 -256
  1159. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/creative/list-creatives-request.json +48 -45
  1160. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/creative/list-transformers-request.json +34 -32
  1161. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/creative/preview-creative-request.json +258 -254
  1162. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/creative/sync-creatives-request.json +273 -269
  1163. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/creative/validate-input-request.json +251 -251
  1164. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/governance/check-governance-request.json +378 -376
  1165. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/governance/get-plan-audit-logs-request.json +7 -5
  1166. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/governance/report-plan-adjustment-request.json +6 -4
  1167. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/governance/report-plan-outcome-request.json +88 -86
  1168. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/governance/sync-plans-request.json +64 -62
  1169. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/accept-proposal-request.json +25 -21
  1170. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/build-creative-request.json +450 -446
  1171. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/buy-products-request.json +282 -278
  1172. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/control-media-buy-request.json +214 -210
  1173. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/create-media-buy-request.json +516 -508
  1174. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/decline-proposals-request.json +15 -12
  1175. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/get-media-buy-delivery-request.json +49 -47
  1176. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/get-media-buys-request.json +34 -32
  1177. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/get-products-request.json +342 -336
  1178. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/get-reporting-status-request.json +59 -57
  1179. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/list-creative-formats-request.json +38 -34
  1180. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/list-products-request.json +326 -323
  1181. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/log-event-request.json +24 -22
  1182. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/provide-performance-feedback-request.json +67 -65
  1183. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/refine-proposals-request.json +327 -324
  1184. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/request-proposals-request.json +328 -325
  1185. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/sync-audiences-request.json +39 -37
  1186. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/sync-catalogs-request.json +54 -50
  1187. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/sync-event-sources-request.json +35 -33
  1188. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/sync-reporting-receipts-request.json +23 -22
  1189. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/sync-reporting-status-request.json +13 -12
  1190. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/media-buy/update-media-buy-request.json +524 -518
  1191. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/account/get-account-financials-request.json +32 -30
  1192. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/account/list-accounts-request.json +32 -30
  1193. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/account/report-usage-request.json +32 -30
  1194. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/account/sync-accounts-request.json +98 -93
  1195. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/account/sync-governance-request.json +31 -29
  1196. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/creative/list-creatives-request.json +48 -45
  1197. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/creative/sync-creatives-request.json +273 -269
  1198. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/manifest.json +1 -1
  1199. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/accept-proposal-request.json +25 -21
  1200. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/buy-products-request.json +282 -278
  1201. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/control-media-buy-request.json +214 -210
  1202. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/decline-proposals-request.json +15 -12
  1203. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/get-media-buy-delivery-request.json +49 -47
  1204. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/get-media-buys-request.json +34 -32
  1205. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/get-reporting-status-request.json +59 -57
  1206. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/list-products-request.json +326 -323
  1207. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/log-event-request.json +24 -22
  1208. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/provide-performance-feedback-request.json +67 -65
  1209. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/refine-proposals-request.json +327 -324
  1210. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/request-proposals-request.json +328 -325
  1211. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/sync-audiences-request.json +39 -37
  1212. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/sync-catalogs-request.json +54 -50
  1213. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/sync-event-sources-request.json +35 -33
  1214. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/sync-reporting-receipts-request.json +23 -22
  1215. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/media-buy/sync-reporting-status-request.json +13 -12
  1216. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/protocol/get-adcp-capabilities-request.json +6 -4
  1217. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/protocol/get-principal-request.json +6 -4
  1218. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/protocol/get-task-status-request.json +31 -29
  1219. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/protocol/list-tasks-request.json +36 -34
  1220. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/profiles/media-buy/protocol/sync-principal-request.json +31 -27
  1221. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/property/create-property-list-request.json +48 -46
  1222. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/property/delete-property-list-request.json +31 -29
  1223. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/property/get-property-list-request.json +31 -29
  1224. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/property/list-property-lists-request.json +32 -30
  1225. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/property/update-property-list-request.json +48 -46
  1226. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/property/validate-property-delivery-request.json +37 -35
  1227. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/protocol/get-adcp-capabilities-request.json +6 -4
  1228. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/protocol/get-principal-request.json +6 -4
  1229. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/protocol/get-task-status-request.json +31 -29
  1230. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/protocol/list-tasks-request.json +36 -34
  1231. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/protocol/sync-agent-notification-configs-request.json +14 -10
  1232. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/protocol/sync-principal-request.json +31 -27
  1233. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/signals/activate-signal-request.json +32 -30
  1234. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/signals/get-signals-request.json +45 -40
  1235. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/sponsored-intelligence/si-get-offering-request.json +6 -4
  1236. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/sponsored-intelligence/si-initiate-session-request.json +38 -36
  1237. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/sponsored-intelligence/si-send-message-request.json +36 -34
  1238. package/dist/lib/schemas-data/3.2/mcp/2026-07-28/sponsored-intelligence/si-terminate-session-request.json +6 -4
  1239. package/dist/lib/schemas-data/3.2/media-buy/accept-proposal-async-response-input-required.json +2 -2
  1240. package/dist/lib/schemas-data/3.2/media-buy/accept-proposal-async-response-submitted.json +2 -2
  1241. package/dist/lib/schemas-data/3.2/media-buy/accept-proposal-async-response-working.json +2 -2
  1242. package/dist/lib/schemas-data/3.2/media-buy/accept-proposal-request.json +10 -10
  1243. package/dist/lib/schemas-data/3.2/media-buy/accept-proposal-response.json +2 -2
  1244. package/dist/lib/schemas-data/3.2/media-buy/acceptance-context.json +3 -3
  1245. package/dist/lib/schemas-data/3.2/media-buy/acceptance-policy-catalog.json +4 -4
  1246. package/dist/lib/schemas-data/3.2/media-buy/acceptance-policy-profile-ref.json +1 -1
  1247. package/dist/lib/schemas-data/3.2/media-buy/acceptance-policy-profile.json +3 -3
  1248. package/dist/lib/schemas-data/3.2/media-buy/acceptance-policy-requirement.json +3 -3
  1249. package/dist/lib/schemas-data/3.2/media-buy/acceptance-policy-rule.json +3 -3
  1250. package/dist/lib/schemas-data/3.2/media-buy/build-creative-async-response-input-required.json +4 -4
  1251. package/dist/lib/schemas-data/3.2/media-buy/build-creative-async-response-submitted.json +4 -4
  1252. package/dist/lib/schemas-data/3.2/media-buy/build-creative-async-response-working.json +3 -3
  1253. package/dist/lib/schemas-data/3.2/media-buy/build-creative-request.json +19 -19
  1254. package/dist/lib/schemas-data/3.2/media-buy/build-creative-response.json +35 -35
  1255. package/dist/lib/schemas-data/3.2/media-buy/buy-products-async-response-input-required.json +2 -2
  1256. package/dist/lib/schemas-data/3.2/media-buy/buy-products-async-response-submitted.json +2 -2
  1257. package/dist/lib/schemas-data/3.2/media-buy/buy-products-async-response-working.json +2 -2
  1258. package/dist/lib/schemas-data/3.2/media-buy/buy-products-request.json +19 -19
  1259. package/dist/lib/schemas-data/3.2/media-buy/buy-products-response.json +2 -2
  1260. package/dist/lib/schemas-data/3.2/media-buy/change-term-constraints.json +4 -4
  1261. package/dist/lib/schemas-data/3.2/media-buy/change-term.json +6 -6
  1262. package/dist/lib/schemas-data/3.2/media-buy/commercial-terms.json +12 -12
  1263. package/dist/lib/schemas-data/3.2/media-buy/control-media-buy-async-response-input-required.json +2 -2
  1264. package/dist/lib/schemas-data/3.2/media-buy/control-media-buy-async-response-submitted.json +2 -2
  1265. package/dist/lib/schemas-data/3.2/media-buy/control-media-buy-async-response-working.json +2 -2
  1266. package/dist/lib/schemas-data/3.2/media-buy/control-media-buy-request.json +14 -14
  1267. package/dist/lib/schemas-data/3.2/media-buy/control-media-buy-response.json +12 -12
  1268. package/dist/lib/schemas-data/3.2/media-buy/create-media-buy-async-response-input-required.json +4 -4
  1269. package/dist/lib/schemas-data/3.2/media-buy/create-media-buy-async-response-submitted.json +4 -4
  1270. package/dist/lib/schemas-data/3.2/media-buy/create-media-buy-async-response-working.json +3 -3
  1271. package/dist/lib/schemas-data/3.2/media-buy/create-media-buy-request.json +21 -19
  1272. package/dist/lib/schemas-data/3.2/media-buy/create-media-buy-response.json +24 -23
  1273. package/dist/lib/schemas-data/3.2/media-buy/decline-proposals-async-response-input-required.json +2 -2
  1274. package/dist/lib/schemas-data/3.2/media-buy/decline-proposals-async-response-submitted.json +2 -2
  1275. package/dist/lib/schemas-data/3.2/media-buy/decline-proposals-async-response-working.json +2 -2
  1276. package/dist/lib/schemas-data/3.2/media-buy/decline-proposals-request.json +8 -8
  1277. package/dist/lib/schemas-data/3.2/media-buy/decline-proposals-response.json +5 -5
  1278. package/dist/lib/schemas-data/3.2/media-buy/get-media-buy-delivery-request.json +47 -47
  1279. package/dist/lib/schemas-data/3.2/media-buy/get-media-buy-delivery-response.json +83 -81
  1280. package/dist/lib/schemas-data/3.2/media-buy/get-media-buys-request.json +9 -9
  1281. package/dist/lib/schemas-data/3.2/media-buy/get-media-buys-response.json +54 -52
  1282. package/dist/lib/schemas-data/3.2/media-buy/get-products-async-response-input-required.json +4 -4
  1283. package/dist/lib/schemas-data/3.2/media-buy/get-products-async-response-submitted.json +4 -4
  1284. package/dist/lib/schemas-data/3.2/media-buy/get-products-async-response-working.json +3 -3
  1285. package/dist/lib/schemas-data/3.2/media-buy/get-products-rejected.json +5 -5
  1286. package/dist/lib/schemas-data/3.2/media-buy/get-products-request.json +19 -19
  1287. package/dist/lib/schemas-data/3.2/media-buy/get-products-response.json +13 -13
  1288. package/dist/lib/schemas-data/3.2/media-buy/get-products-targeting-resolution.json +3 -3
  1289. package/dist/lib/schemas-data/3.2/media-buy/get-reporting-status-request.json +10 -10
  1290. package/dist/lib/schemas-data/3.2/media-buy/get-reporting-status-response.json +27 -27
  1291. package/dist/lib/schemas-data/3.2/media-buy/legacy-purchase-continuation-input.json +2 -2
  1292. package/dist/lib/schemas-data/3.2/media-buy/list-creative-formats-request.json +16 -14
  1293. package/dist/lib/schemas-data/3.2/media-buy/list-creative-formats-response.json +9 -9
  1294. package/dist/lib/schemas-data/3.2/media-buy/list-products-request.json +10 -10
  1295. package/dist/lib/schemas-data/3.2/media-buy/list-products-response.json +5 -5
  1296. package/dist/lib/schemas-data/3.2/media-buy/log-event-request.json +5 -5
  1297. package/dist/lib/schemas-data/3.2/media-buy/log-event-response.json +8 -8
  1298. package/dist/lib/schemas-data/3.2/media-buy/media-buy-commitment-response.json +13 -13
  1299. package/dist/lib/schemas-data/3.2/media-buy/media-buy-delivery-webhook-result.json +12 -11
  1300. package/dist/lib/schemas-data/3.2/media-buy/outcome-target.json +4 -4
  1301. package/dist/lib/schemas-data/3.2/media-buy/package-control.json +9 -9
  1302. package/dist/lib/schemas-data/3.2/media-buy/package-request.json +32 -31
  1303. package/dist/lib/schemas-data/3.2/media-buy/package-update.json +14 -14
  1304. package/dist/lib/schemas-data/3.2/media-buy/product-discovery-criteria.json +9 -9
  1305. package/dist/lib/schemas-data/3.2/media-buy/product-fields.json +1 -1
  1306. package/dist/lib/schemas-data/3.2/media-buy/product-purchase-input.json +22 -22
  1307. package/dist/lib/schemas-data/3.2/media-buy/product-purchase.json +13 -13
  1308. package/dist/lib/schemas-data/3.2/media-buy/product-refinement.json +1 -1
  1309. package/dist/lib/schemas-data/3.2/media-buy/proposal-budget-constraint.json +1 -1
  1310. package/dist/lib/schemas-data/3.2/media-buy/proposal-decline.json +2 -2
  1311. package/dist/lib/schemas-data/3.2/media-buy/proposal-refinement.json +4 -4
  1312. package/dist/lib/schemas-data/3.2/media-buy/provide-performance-feedback-request.json +5 -5
  1313. package/dist/lib/schemas-data/3.2/media-buy/provide-performance-feedback-response.json +8 -8
  1314. package/dist/lib/schemas-data/3.2/media-buy/refine-proposals-async-response-input-required.json +2 -2
  1315. package/dist/lib/schemas-data/3.2/media-buy/refine-proposals-async-response-submitted.json +2 -2
  1316. package/dist/lib/schemas-data/3.2/media-buy/refine-proposals-async-response-working.json +2 -2
  1317. package/dist/lib/schemas-data/3.2/media-buy/refine-proposals-request.json +7 -7
  1318. package/dist/lib/schemas-data/3.2/media-buy/refine-proposals-response.json +12 -12
  1319. package/dist/lib/schemas-data/3.2/media-buy/request-proposals-async-response-input-required.json +2 -2
  1320. package/dist/lib/schemas-data/3.2/media-buy/request-proposals-async-response-submitted.json +2 -2
  1321. package/dist/lib/schemas-data/3.2/media-buy/request-proposals-async-response-working.json +2 -2
  1322. package/dist/lib/schemas-data/3.2/media-buy/request-proposals-request.json +10 -10
  1323. package/dist/lib/schemas-data/3.2/media-buy/request-proposals-response.json +10 -10
  1324. package/dist/lib/schemas-data/3.2/media-buy/sync-audiences-request.json +9 -9
  1325. package/dist/lib/schemas-data/3.2/media-buy/sync-audiences-response.json +15 -15
  1326. package/dist/lib/schemas-data/3.2/media-buy/sync-catalogs-async-response-input-required.json +3 -3
  1327. package/dist/lib/schemas-data/3.2/media-buy/sync-catalogs-async-response-submitted.json +4 -4
  1328. package/dist/lib/schemas-data/3.2/media-buy/sync-catalogs-async-response-working.json +3 -3
  1329. package/dist/lib/schemas-data/3.2/media-buy/sync-catalogs-request.json +10 -10
  1330. package/dist/lib/schemas-data/3.2/media-buy/sync-catalogs-response.json +20 -20
  1331. package/dist/lib/schemas-data/3.2/media-buy/sync-event-sources-request.json +8 -8
  1332. package/dist/lib/schemas-data/3.2/media-buy/sync-event-sources-response.json +14 -14
  1333. package/dist/lib/schemas-data/3.2/media-buy/sync-reporting-receipts-request.json +9 -9
  1334. package/dist/lib/schemas-data/3.2/media-buy/sync-reporting-receipts-response.json +10 -10
  1335. package/dist/lib/schemas-data/3.2/media-buy/sync-reporting-status-request.json +8 -8
  1336. package/dist/lib/schemas-data/3.2/media-buy/sync-reporting-status-response.json +8 -8
  1337. package/dist/lib/schemas-data/3.2/media-buy/update-media-buy-async-response-input-required.json +3 -3
  1338. package/dist/lib/schemas-data/3.2/media-buy/update-media-buy-async-response-submitted.json +4 -4
  1339. package/dist/lib/schemas-data/3.2/media-buy/update-media-buy-async-response-working.json +3 -3
  1340. package/dist/lib/schemas-data/3.2/media-buy/update-media-buy-request.json +15 -15
  1341. package/dist/lib/schemas-data/3.2/media-buy/update-media-buy-response.json +22 -21
  1342. package/dist/lib/schemas-data/3.2/pricing-options/cpa-option.json +4 -4
  1343. package/dist/lib/schemas-data/3.2/pricing-options/cpc-option.json +4 -4
  1344. package/dist/lib/schemas-data/3.2/pricing-options/cpcv-option.json +4 -4
  1345. package/dist/lib/schemas-data/3.2/pricing-options/cpm-option.json +4 -4
  1346. package/dist/lib/schemas-data/3.2/pricing-options/cpp-option.json +5 -5
  1347. package/dist/lib/schemas-data/3.2/pricing-options/cpv-option.json +4 -4
  1348. package/dist/lib/schemas-data/3.2/pricing-options/flat-rate-option.json +4 -4
  1349. package/dist/lib/schemas-data/3.2/pricing-options/price-breakdown.json +2 -2
  1350. package/dist/lib/schemas-data/3.2/pricing-options/price-guidance.json +1 -1
  1351. package/dist/lib/schemas-data/3.2/pricing-options/revenue-share-option.json +2 -2
  1352. package/dist/lib/schemas-data/3.2/pricing-options/time-option.json +4 -4
  1353. package/dist/lib/schemas-data/3.2/pricing-options/vcpm-option.json +4 -4
  1354. package/dist/lib/schemas-data/3.2/property/authorization-result.json +1 -1
  1355. package/dist/lib/schemas-data/3.2/property/base-property-source.json +4 -4
  1356. package/dist/lib/schemas-data/3.2/property/create-property-list-request.json +8 -8
  1357. package/dist/lib/schemas-data/3.2/property/create-property-list-response.json +6 -6
  1358. package/dist/lib/schemas-data/3.2/property/delete-property-list-request.json +5 -5
  1359. package/dist/lib/schemas-data/3.2/property/delete-property-list-response.json +5 -5
  1360. package/dist/lib/schemas-data/3.2/property/delivery-record.json +3 -3
  1361. package/dist/lib/schemas-data/3.2/property/get-property-list-request.json +5 -5
  1362. package/dist/lib/schemas-data/3.2/property/get-property-list-response.json +9 -9
  1363. package/dist/lib/schemas-data/3.2/property/list-property-lists-request.json +6 -6
  1364. package/dist/lib/schemas-data/3.2/property/list-property-lists-response.json +7 -7
  1365. package/dist/lib/schemas-data/3.2/property/property-error.json +2 -2
  1366. package/dist/lib/schemas-data/3.2/property/property-feature-definition.json +2 -2
  1367. package/dist/lib/schemas-data/3.2/property/property-feature-result.json +4 -4
  1368. package/dist/lib/schemas-data/3.2/property/property-feature-value.json +2 -2
  1369. package/dist/lib/schemas-data/3.2/property/property-feature.json +1 -1
  1370. package/dist/lib/schemas-data/3.2/property/property-list-changed-webhook.json +3 -2
  1371. package/dist/lib/schemas-data/3.2/property/property-list-filters.json +5 -5
  1372. package/dist/lib/schemas-data/3.2/property/property-list.json +6 -6
  1373. package/dist/lib/schemas-data/3.2/property/update-property-list-request.json +8 -8
  1374. package/dist/lib/schemas-data/3.2/property/update-property-list-response.json +6 -6
  1375. package/dist/lib/schemas-data/3.2/property/validate-property-delivery-request.json +6 -6
  1376. package/dist/lib/schemas-data/3.2/property/validate-property-delivery-response.json +6 -6
  1377. package/dist/lib/schemas-data/3.2/property/validation-result.json +5 -5
  1378. package/dist/lib/schemas-data/3.2/protocol/get-adcp-capabilities-request.json +4 -4
  1379. package/dist/lib/schemas-data/3.2/protocol/get-adcp-capabilities-response.json +55 -53
  1380. package/dist/lib/schemas-data/3.2/protocol/get-principal-request.json +4 -4
  1381. package/dist/lib/schemas-data/3.2/protocol/get-principal-response.json +9 -9
  1382. package/dist/lib/schemas-data/3.2/protocol/get-task-status-request.json +5 -5
  1383. package/dist/lib/schemas-data/3.2/protocol/get-task-status-response.json +10 -10
  1384. package/dist/lib/schemas-data/3.2/protocol/list-tasks-request.json +13 -13
  1385. package/dist/lib/schemas-data/3.2/protocol/list-tasks-response.json +8 -8
  1386. package/dist/lib/schemas-data/3.2/protocol/sync-agent-notification-configs-request.json +5 -5
  1387. package/dist/lib/schemas-data/3.2/protocol/sync-agent-notification-configs-response.json +7 -7
  1388. package/dist/lib/schemas-data/3.2/protocol/sync-principal-request.json +8 -8
  1389. package/dist/lib/schemas-data/3.2/protocol/sync-principal-response.json +10 -10
  1390. package/dist/lib/schemas-data/3.2/registries/v1-canonical-mapping.json +2 -2
  1391. package/dist/lib/schemas-data/3.2/signals/activate-signal-request.json +6 -6
  1392. package/dist/lib/schemas-data/3.2/signals/activate-signal-response.json +9 -9
  1393. package/dist/lib/schemas-data/3.2/signals/get-signals-async-response-submitted.json +4 -4
  1394. package/dist/lib/schemas-data/3.2/signals/get-signals-async-response-working.json +3 -3
  1395. package/dist/lib/schemas-data/3.2/signals/get-signals-request.json +12 -11
  1396. package/dist/lib/schemas-data/3.2/signals/get-signals-response.json +17 -17
  1397. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-capabilities.json +1 -1
  1398. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-context-use.json +1 -1
  1399. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-get-offering-request.json +4 -4
  1400. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-get-offering-response.json +9 -9
  1401. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-identity.json +1 -1
  1402. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-initiate-session-request.json +7 -7
  1403. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-initiate-session-response.json +10 -10
  1404. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-send-message-request.json +5 -5
  1405. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-send-message-response.json +10 -10
  1406. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-sponsored-context-receipt.json +4 -4
  1407. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-sponsored-context.json +4 -4
  1408. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-terminate-session-request.json +4 -4
  1409. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-terminate-session-response.json +7 -7
  1410. package/dist/lib/schemas-data/3.2/sponsored-intelligence/si-ui-element.json +1 -1
  1411. package/dist/lib/schemas-data/3.2/trusted-match/available-package.json +6 -5
  1412. package/dist/lib/schemas-data/3.2/trusted-match/context-match-request.json +6 -5
  1413. package/dist/lib/schemas-data/3.2/trusted-match/context-match-response.json +4 -4
  1414. package/dist/lib/schemas-data/3.2/trusted-match/error.json +1 -1
  1415. package/dist/lib/schemas-data/3.2/trusted-match/identity-match-request.json +5 -4
  1416. package/dist/lib/schemas-data/3.2/trusted-match/identity-match-response.json +5 -4
  1417. package/dist/lib/schemas-data/3.2/trusted-match/offer-price.json +1 -1
  1418. package/dist/lib/schemas-data/3.2/trusted-match/offer.json +5 -5
  1419. package/dist/lib/schemas-data/3.2/trusted-match/provider-context-match-response.json +4 -4
  1420. package/dist/lib/schemas-data/3.2/trusted-match/provider-identity-match-response.json +4 -4
  1421. package/dist/lib/schemas-data/3.2/trusted-match/provider-registration.json +2 -2
  1422. package/dist/lib/schemas-data/3.2/trusted-match/publisher-targeting-kv-config.json +1 -1
  1423. package/dist/lib/schemas-data/3.2/trusted-match/publisher-tmpx-config.json +1 -1
  1424. package/dist/lib/schemas-data/3.2/trusted-match/tmpx-chunk.json +1 -1
  1425. package/dist/lib/server/account-response-identity.d.mts +17 -0
  1426. package/dist/lib/server/account-response-identity.d.ts +17 -0
  1427. package/dist/lib/server/account-response-identity.js +52 -0
  1428. package/dist/lib/server/account-response-identity.mjs +28 -0
  1429. package/dist/lib/server/account-sync-contract.js +1 -0
  1430. package/dist/lib/server/account-sync-contract.mjs +1 -0
  1431. package/dist/lib/server/create-adcp-server.js +32 -19
  1432. package/dist/lib/server/create-adcp-server.mjs +36 -12
  1433. package/dist/lib/server/decisioning/account.d.mts +13 -6
  1434. package/dist/lib/server/decisioning/account.d.ts +13 -6
  1435. package/dist/lib/server/decisioning/account.js +37 -15
  1436. package/dist/lib/server/decisioning/account.mjs +37 -15
  1437. package/dist/lib/server/decisioning/runtime/from-platform.d.mts +5 -5
  1438. package/dist/lib/server/decisioning/runtime/from-platform.d.ts +5 -5
  1439. package/dist/lib/server/decisioning/runtime/from-platform.js +6 -6
  1440. package/dist/lib/server/decisioning/runtime/from-platform.mjs +6 -6
  1441. package/dist/lib/server/index.d.mts +1 -1
  1442. package/dist/lib/server/index.d.ts +1 -1
  1443. package/dist/lib/server/index.js +2 -0
  1444. package/dist/lib/server/index.mjs +2 -0
  1445. package/dist/lib/server/media-buy-action-resolver.d.mts +3 -0
  1446. package/dist/lib/server/media-buy-action-resolver.d.ts +3 -0
  1447. package/dist/lib/server/media-buy-action-resolver.js +32 -0
  1448. package/dist/lib/server/media-buy-action-resolver.mjs +32 -0
  1449. package/dist/lib/server/media-buy-store.d.mts +26 -12
  1450. package/dist/lib/server/media-buy-store.d.ts +26 -12
  1451. package/dist/lib/server/media-buy-store.js +69 -21
  1452. package/dist/lib/server/media-buy-store.mjs +69 -21
  1453. package/dist/lib/server/responses.js +9 -1
  1454. package/dist/lib/server/responses.mjs +9 -1
  1455. package/dist/lib/server/state-machine.d.mts +10 -11
  1456. package/dist/lib/server/state-machine.d.ts +10 -11
  1457. package/dist/lib/server/state-machine.js +20 -5
  1458. package/dist/lib/server/state-machine.mjs +19 -5
  1459. package/dist/lib/server/targeting-helpers.d.mts +1 -1
  1460. package/dist/lib/server/targeting-helpers.d.ts +1 -1
  1461. package/dist/lib/server/targeting-helpers.js +43 -3
  1462. package/dist/lib/server/targeting-helpers.mjs +43 -3
  1463. package/dist/lib/server/wire-spec-fields.generated.d.mts +32 -32
  1464. package/dist/lib/server/wire-spec-fields.generated.d.ts +32 -32
  1465. package/dist/lib/server/wire-spec-fields.generated.js +32 -32
  1466. package/dist/lib/server/wire-spec-fields.generated.mjs +32 -32
  1467. package/dist/lib/signing/agent-context.d.mts +2 -1
  1468. package/dist/lib/signing/agent-context.d.ts +2 -1
  1469. package/dist/lib/signing/agent-context.js +34 -5
  1470. package/dist/lib/signing/agent-context.mjs +34 -5
  1471. package/dist/lib/signing/agent-fetch.d.mts +4 -5
  1472. package/dist/lib/signing/agent-fetch.d.ts +4 -5
  1473. package/dist/lib/signing/agent-fetch.js +55 -24
  1474. package/dist/lib/signing/agent-fetch.mjs +60 -24
  1475. package/dist/lib/signing/body-validation.d.mts +2 -0
  1476. package/dist/lib/signing/body-validation.d.ts +2 -0
  1477. package/dist/lib/signing/body-validation.js +39 -0
  1478. package/dist/lib/signing/body-validation.mjs +15 -0
  1479. package/dist/lib/signing/errors.d.mts +1 -1
  1480. package/dist/lib/signing/errors.d.ts +1 -1
  1481. package/dist/lib/signing/nonce.d.mts +7 -0
  1482. package/dist/lib/signing/nonce.d.ts +7 -0
  1483. package/dist/lib/signing/nonce.js +30 -0
  1484. package/dist/lib/signing/nonce.mjs +6 -0
  1485. package/dist/lib/signing/protocol-methods.d.mts +12 -0
  1486. package/dist/lib/signing/protocol-methods.d.ts +12 -0
  1487. package/dist/lib/signing/protocol-methods.js +66 -0
  1488. package/dist/lib/signing/protocol-methods.mjs +37 -0
  1489. package/dist/lib/signing/provider.d.mts +2 -0
  1490. package/dist/lib/signing/provider.d.ts +2 -0
  1491. package/dist/lib/signing/provider.js +19 -0
  1492. package/dist/lib/signing/provider.mjs +11 -0
  1493. package/dist/lib/signing/types.d.mts +4 -0
  1494. package/dist/lib/signing/types.d.ts +4 -0
  1495. package/dist/lib/signing/verifier.js +21 -14
  1496. package/dist/lib/signing/verifier.mjs +22 -15
  1497. package/dist/lib/signing/webhook-verifier.d.mts +1 -1
  1498. package/dist/lib/signing/webhook-verifier.d.ts +1 -1
  1499. package/dist/lib/signing/webhook-verifier.js +20 -0
  1500. package/dist/lib/signing/webhook-verifier.mjs +20 -0
  1501. package/dist/lib/testing/client.d.mts +1 -3
  1502. package/dist/lib/testing/client.d.ts +1 -3
  1503. package/dist/lib/testing/client.js +119 -25
  1504. package/dist/lib/testing/client.mjs +121 -26
  1505. package/dist/lib/testing/compliance/comply.js +16 -8
  1506. package/dist/lib/testing/compliance/comply.mjs +19 -8
  1507. package/dist/lib/testing/compliance/index.d.mts +1 -1
  1508. package/dist/lib/testing/compliance/index.d.ts +1 -1
  1509. package/dist/lib/testing/compliance/storyboard-tracks.js +1 -1
  1510. package/dist/lib/testing/compliance/storyboard-tracks.mjs +1 -1
  1511. package/dist/lib/testing/compliance/summary.d.mts +7 -0
  1512. package/dist/lib/testing/compliance/summary.d.ts +7 -0
  1513. package/dist/lib/testing/compliance/summary.js +37 -0
  1514. package/dist/lib/testing/compliance/summary.mjs +37 -0
  1515. package/dist/lib/testing/discovery-evidence.d.mts +2 -0
  1516. package/dist/lib/testing/discovery-evidence.d.ts +2 -0
  1517. package/dist/lib/testing/discovery-evidence.js +48 -0
  1518. package/dist/lib/testing/discovery-evidence.mjs +24 -0
  1519. package/dist/lib/testing/index.d.mts +2 -2
  1520. package/dist/lib/testing/index.d.ts +2 -2
  1521. package/dist/lib/testing/storyboard/agent-routing.js +1 -1
  1522. package/dist/lib/testing/storyboard/agent-routing.mjs +2 -2
  1523. package/dist/lib/testing/storyboard/canonical-format-satisfaction.js +68 -14
  1524. package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs +68 -14
  1525. package/dist/lib/testing/storyboard/compliance.d.mts +2 -5
  1526. package/dist/lib/testing/storyboard/compliance.d.ts +2 -5
  1527. package/dist/lib/testing/storyboard/compliance.js +91 -13
  1528. package/dist/lib/testing/storyboard/compliance.mjs +92 -14
  1529. package/dist/lib/testing/storyboard/context.d.mts +13 -3
  1530. package/dist/lib/testing/storyboard/context.d.ts +13 -3
  1531. package/dist/lib/testing/storyboard/context.js +15 -10
  1532. package/dist/lib/testing/storyboard/context.mjs +15 -10
  1533. package/dist/lib/testing/storyboard/default-invariants.js +84 -59
  1534. package/dist/lib/testing/storyboard/default-invariants.mjs +85 -60
  1535. package/dist/lib/testing/storyboard/index.d.mts +2 -2
  1536. package/dist/lib/testing/storyboard/index.d.ts +2 -2
  1537. package/dist/lib/testing/storyboard/prepared-fixtures.d.mts +14 -0
  1538. package/dist/lib/testing/storyboard/prepared-fixtures.d.ts +14 -0
  1539. package/dist/lib/testing/storyboard/prepared-fixtures.js +9 -0
  1540. package/dist/lib/testing/storyboard/prepared-fixtures.mjs +8 -0
  1541. package/dist/lib/testing/storyboard/request-builder.js +11 -3
  1542. package/dist/lib/testing/storyboard/request-builder.mjs +11 -3
  1543. package/dist/lib/testing/storyboard/request-signing/functional-dispatch.js +7 -4
  1544. package/dist/lib/testing/storyboard/request-signing/functional-dispatch.mjs +7 -4
  1545. package/dist/lib/testing/storyboard/request-signing/vector-loader.d.mts +2 -0
  1546. package/dist/lib/testing/storyboard/request-signing/vector-loader.d.ts +2 -0
  1547. package/dist/lib/testing/storyboard/request-signing/vector-loader.js +11 -0
  1548. package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs +10 -0
  1549. package/dist/lib/testing/storyboard/runner.d.mts +7 -4
  1550. package/dist/lib/testing/storyboard/runner.d.ts +7 -4
  1551. package/dist/lib/testing/storyboard/runner.js +401 -60
  1552. package/dist/lib/testing/storyboard/runner.mjs +404 -62
  1553. package/dist/lib/testing/storyboard/seeding.d.mts +2 -0
  1554. package/dist/lib/testing/storyboard/seeding.d.ts +2 -0
  1555. package/dist/lib/testing/storyboard/seeding.js +282 -57
  1556. package/dist/lib/testing/storyboard/seeding.mjs +282 -57
  1557. package/dist/lib/testing/storyboard/task-map.d.mts +4 -1
  1558. package/dist/lib/testing/storyboard/task-map.d.ts +4 -1
  1559. package/dist/lib/testing/storyboard/types.d.mts +32 -1
  1560. package/dist/lib/testing/storyboard/types.d.ts +32 -1
  1561. package/dist/lib/testing/storyboard/validations.d.mts +1 -1
  1562. package/dist/lib/testing/storyboard/validations.d.ts +1 -1
  1563. package/dist/lib/testing/storyboard/validations.js +11 -2
  1564. package/dist/lib/testing/storyboard/validations.mjs +11 -2
  1565. package/dist/lib/testing/storyboard/webhook-assertions.js +170 -23
  1566. package/dist/lib/testing/storyboard/webhook-assertions.mjs +170 -23
  1567. package/dist/lib/testing/storyboard/webhook-receiver.d.mts +2 -0
  1568. package/dist/lib/testing/storyboard/webhook-receiver.d.ts +2 -0
  1569. package/dist/lib/testing/storyboard/webhook-receiver.js +29 -2
  1570. package/dist/lib/testing/storyboard/webhook-receiver.mjs +27 -1
  1571. package/dist/lib/testing/test-controller.js +3 -0
  1572. package/dist/lib/testing/test-controller.mjs +3 -0
  1573. package/dist/lib/testing/types.d.mts +11 -0
  1574. package/dist/lib/testing/types.d.ts +11 -0
  1575. package/dist/lib/types/adcp.d.mts +10 -2
  1576. package/dist/lib/types/adcp.d.ts +10 -2
  1577. package/dist/lib/types/asset-instances.d.mts +1 -1
  1578. package/dist/lib/types/asset-instances.d.ts +1 -1
  1579. package/dist/lib/types/index.d.mts +5 -0
  1580. package/dist/lib/types/index.d.ts +5 -0
  1581. package/dist/lib/types/index.js +6 -1
  1582. package/dist/lib/types/index.mjs +4 -1
  1583. package/dist/lib/types/inline-enums.generated.d.mts +30 -4
  1584. package/dist/lib/types/inline-enums.generated.d.ts +30 -4
  1585. package/dist/lib/types/inline-enums.generated.js +41 -2
  1586. package/dist/lib/types/inline-enums.generated.mjs +28 -2
  1587. package/dist/lib/types/manifest.generated.d.mts +3 -3
  1588. package/dist/lib/types/manifest.generated.d.ts +3 -3
  1589. package/dist/lib/types/media-buy-delivery-report.d.mts +4 -0
  1590. package/dist/lib/types/media-buy-delivery-report.d.ts +4 -0
  1591. package/dist/lib/types/media-buy-delivery-report.js +16 -0
  1592. package/dist/lib/types/media-buy-delivery-report.mjs +0 -0
  1593. package/dist/lib/types/per-tool-index.json +1 -1
  1594. package/dist/lib/types/schemas.generated.d.ts +366 -415
  1595. package/dist/lib/types/schemas.generated.js +12802 -12809
  1596. package/dist/lib/types/schemas.generated.mjs +389 -406
  1597. package/dist/lib/types/targeting-keys.generated.d.mts +4 -0
  1598. package/dist/lib/types/targeting-keys.generated.d.ts +4 -0
  1599. package/dist/lib/types/targeting-keys.generated.js +105 -0
  1600. package/dist/lib/types/targeting-keys.generated.mjs +80 -0
  1601. package/dist/lib/types/wellknown-schemas.generated.d.mts +2 -2
  1602. package/dist/lib/types/wellknown-schemas.generated.d.ts +2 -2
  1603. package/dist/lib/utils/adcp-version-config.js +5 -2
  1604. package/dist/lib/utils/adcp-version-config.mjs +5 -2
  1605. package/dist/lib/utils/envelope-status-compat.d.mts +18 -1
  1606. package/dist/lib/utils/envelope-status-compat.d.ts +18 -1
  1607. package/dist/lib/utils/envelope-status-compat.js +11 -5
  1608. package/dist/lib/utils/envelope-status-compat.mjs +11 -5
  1609. package/dist/lib/utils/response-unwrapper.js +18 -10
  1610. package/dist/lib/utils/response-unwrapper.mjs +18 -10
  1611. package/dist/lib/v2/format-schema/resolver.js +1 -1
  1612. package/dist/lib/v2/format-schema/resolver.mjs +1 -1
  1613. package/dist/lib/v2/projection/creative-delivery.js +123 -30
  1614. package/dist/lib/v2/projection/creative-delivery.mjs +127 -30
  1615. package/dist/lib/v2/projection/index.d.mts +1 -0
  1616. package/dist/lib/v2/projection/index.d.ts +1 -0
  1617. package/dist/lib/v2/projection/index.js +3 -0
  1618. package/dist/lib/v2/projection/index.mjs +2 -0
  1619. package/dist/lib/v2/projection/legacy-metadata.d.mts +19 -0
  1620. package/dist/lib/v2/projection/legacy-metadata.d.ts +19 -0
  1621. package/dist/lib/v2/projection/legacy-metadata.js +91 -0
  1622. package/dist/lib/v2/projection/legacy-metadata.mjs +86 -0
  1623. package/dist/lib/validation/compact-schema.d.mts +27 -0
  1624. package/dist/lib/validation/compact-schema.d.ts +27 -0
  1625. package/dist/lib/validation/compact-schema.js +276 -0
  1626. package/dist/lib/validation/compact-schema.mjs +250 -0
  1627. package/dist/lib/validation/media-buy-delivery-report.d.mts +8 -0
  1628. package/dist/lib/validation/media-buy-delivery-report.d.ts +8 -0
  1629. package/dist/lib/validation/media-buy-delivery-report.js +31 -0
  1630. package/dist/lib/validation/media-buy-delivery-report.mjs +7 -0
  1631. package/dist/lib/validation/schema-diagnostic-origins.d.mts +21 -0
  1632. package/dist/lib/validation/schema-diagnostic-origins.d.ts +21 -0
  1633. package/dist/lib/validation/schema-diagnostic-origins.js +193 -0
  1634. package/dist/lib/validation/schema-diagnostic-origins.mjs +169 -0
  1635. package/dist/lib/validation/schema-loader.js +86 -16
  1636. package/dist/lib/validation/schema-loader.mjs +82 -16
  1637. package/dist/lib/validation/schema-validator.d.mts +10 -19
  1638. package/dist/lib/validation/schema-validator.d.ts +10 -19
  1639. package/dist/lib/validation/schema-validator.js +136 -43
  1640. package/dist/lib/validation/schema-validator.mjs +140 -44
  1641. package/dist/lib/version.d.mts +7 -7
  1642. package/dist/lib/version.d.ts +7 -7
  1643. package/dist/lib/version.js +8 -6
  1644. package/dist/lib/version.mjs +8 -6
  1645. package/dist/lib/webhooks/index.d.mts +3 -0
  1646. package/dist/lib/webhooks/index.d.ts +3 -0
  1647. package/dist/lib/webhooks/index.js +3 -0
  1648. package/dist/lib/webhooks/index.mjs +2 -0
  1649. package/dist/lib/webhooks/media-buy-delivery.d.mts +43 -0
  1650. package/dist/lib/webhooks/media-buy-delivery.d.ts +43 -0
  1651. package/dist/lib/webhooks/media-buy-delivery.js +119 -0
  1652. package/dist/lib/webhooks/media-buy-delivery.mjs +94 -0
  1653. package/docs/CLI.md +21 -0
  1654. package/docs/TYPE-SUMMARY.md +13 -2
  1655. package/docs/ZOD-SCHEMAS.md +3 -1
  1656. package/docs/guides/BUILD-AN-AGENT.md +9 -1
  1657. package/docs/guides/COLLECTION-FIXTURE-FOUNDATION.md +123 -2
  1658. package/docs/guides/DELIVERY-WEBHOOK-PARSING.md +135 -0
  1659. package/docs/guides/DISCOVERY-CACHE-AND-SESSION-REUSE.md +48 -3
  1660. package/docs/guides/REPORTING-LEDGER.md +20 -9
  1661. package/docs/guides/REPORTING-SOURCE-EXECUTOR.md +22 -0
  1662. package/docs/guides/SIGNING-GUIDE.md +10 -0
  1663. package/docs/guides/TYPED-CLIENT-TOOLS.md +49 -0
  1664. package/docs/llms.txt +11 -7
  1665. package/docs/migration-14.x-rc-worksheet.md +6 -6
  1666. package/docs/migration-6.6-to-6.7.md +14 -0
  1667. package/docs/migration-account-change-feed.md +19 -0
  1668. package/docs/migration-agent-identity-3.3.md +11 -4
  1669. package/docs/migration-reporting-storage-package.md +15 -0
  1670. package/docs/releases/sdk-16.6-adoption-fixes.md +33 -0
  1671. package/examples/reliable-reporting-buyer/worker.mjs +3 -1
  1672. package/package.json +5 -5
  1673. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/brand/index.yaml +0 -0
  1674. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/brand/scenarios/distributed_brand_resolution.yaml +0 -0
  1675. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/brand/scenarios/signed_response_envelope_vectors.yaml +0 -0
  1676. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/brand/scenarios/single_side_trust_extension.yaml +0 -0
  1677. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/creative/index.yaml +0 -0
  1678. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/creative/scenarios/asset_type_filtering.yaml +0 -0
  1679. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/creative/scenarios/creative_features_idempotency.yaml +0 -0
  1680. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
  1681. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/creative/scenarios/creative_revision_identity.yaml +0 -0
  1682. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/creative/scenarios/list_creatives_filter_behavior.yaml +0 -0
  1683. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/creative/scenarios/native_localization.yaml +0 -0
  1684. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/creative/scenarios/policy_backed_rejections.yaml +0 -0
  1685. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/governance/index.yaml +0 -0
  1686. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/governance/scenarios/failed_outcome_audit_persistence.yaml +0 -0
  1687. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/acceptance_policy_discovery.yaml +0 -0
  1688. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/account_change_feed.yaml +0 -0
  1689. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/account_timezone_buyer_selected.yaml +0 -0
  1690. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/account_timezone_seller_assigned.yaml +0 -0
  1691. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/account_timezone_seller_fixed.yaml +0 -0
  1692. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/advanced_delivery_reporting.yaml +0 -0
  1693. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/audience_activation_discovery.yaml +0 -0
  1694. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/audience_buy_flow.yaml +0 -0
  1695. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/bidding_cost_binding.yaml +0 -0
  1696. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/bidding_policy_placement.yaml +0 -0
  1697. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
  1698. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/budget_cap_timezone_account.yaml +0 -0
  1699. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/budget_cap_timezone_fixed.yaml +0 -0
  1700. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/budget_cap_timezone_override.yaml +0 -0
  1701. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/budget_cap_timezone_override_rejected.yaml +0 -0
  1702. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/canonical_formats.yaml +0 -0
  1703. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/catalog_item_availability_updates.yaml +0 -0
  1704. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
  1705. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/collection_selection.yaml +0 -0
  1706. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/compact_direct_buy_lifecycle.yaml +0 -0
  1707. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/compact_product_lifecycle.yaml +0 -0
  1708. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
  1709. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/create_media_buy_async.yaml +0 -0
  1710. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/create_media_buy_async_lifecycle.yaml +0 -0
  1711. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/cross_path_targeting_provenance.yaml +0 -0
  1712. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/declined_proposal_execution.yaml +0 -0
  1713. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/declined_proposal_refinement.yaml +0 -0
  1714. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/delivery_reporting.yaml +0 -0
  1715. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/demographic_targeting.yaml +0 -0
  1716. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/dependency_impairment_audience.yaml +0 -0
  1717. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/event_dedup_flow.yaml +0 -0
  1718. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/expired_proposal_execution.yaml +0 -0
  1719. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/external_audience_source_binding.yaml +0 -0
  1720. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
  1721. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/geo_region_all_values_support.yaml +0 -0
  1722. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/geo_region_exclusion_support.yaml +0 -0
  1723. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/geo_region_targeting.yaml +0 -0
  1724. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/get_products_async.yaml +0 -0
  1725. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/governance_agent_binding_acceptance.yaml +0 -0
  1726. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/governance_approved.yaml +0 -0
  1727. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/governance_conditions.yaml +0 -0
  1728. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/governance_denied.yaml +0 -0
  1729. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
  1730. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/inventory_list_targeting.yaml +0 -0
  1731. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/measurement_accountability.yaml +0 -0
  1732. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/media_buy_frequency_cap_readback.yaml +0 -0
  1733. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/metric_container_subsumption.yaml +0 -0
  1734. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/outcome_target.yaml +0 -0
  1735. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/outcome_target_list_products_inert.yaml +0 -0
  1736. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/owner_sold_channel_carriage.yaml +0 -0
  1737. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/package_automatic_bidding.yaml +0 -0
  1738. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
  1739. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
  1740. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/performance_buy_flow.yaml +0 -0
  1741. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
  1742. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/portfolio_routing_scope.yaml +0 -0
  1743. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
  1744. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/product_signal_targeting.yaml +0 -0
  1745. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/proposal_finalize.yaml +0 -0
  1746. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
  1747. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
  1748. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/reach_buy_flow.yaml +0 -0
  1749. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/read_filter_behavior.yaml +0 -0
  1750. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
  1751. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/refine_products.yaml +0 -0
  1752. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/seller_optimized_budget.yaml +0 -0
  1753. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/seller_optimized_min_spend_target_exceeds_package_cap.yaml +0 -0
  1754. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/seller_optimized_proposal_package_pacing.yaml +0 -0
  1755. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/targeting_aware_discovery.yaml +0 -0
  1756. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
  1757. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
  1758. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/signals/scenarios/get_signals_async.yaml +0 -0
  1759. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/sponsored-intelligence/index.yaml +0 -0
  1760. /package/compliance/cache/{3.2.5 → 3.2.7}/domains/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
  1761. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/brand/index.yaml +0 -0
  1762. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/brand/scenarios/distributed_brand_resolution.yaml +0 -0
  1763. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/brand/scenarios/signed_response_envelope_vectors.yaml +0 -0
  1764. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/brand/scenarios/single_side_trust_extension.yaml +0 -0
  1765. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/creative/index.yaml +0 -0
  1766. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/creative/scenarios/asset_type_filtering.yaml +0 -0
  1767. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/creative/scenarios/creative_features_idempotency.yaml +0 -0
  1768. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -0
  1769. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/creative/scenarios/creative_revision_identity.yaml +0 -0
  1770. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/creative/scenarios/list_creatives_filter_behavior.yaml +0 -0
  1771. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/creative/scenarios/native_localization.yaml +0 -0
  1772. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/creative/scenarios/policy_backed_rejections.yaml +0 -0
  1773. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/governance/index.yaml +0 -0
  1774. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/governance/scenarios/failed_outcome_audit_persistence.yaml +0 -0
  1775. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/acceptance_policy_discovery.yaml +0 -0
  1776. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/account_change_feed.yaml +0 -0
  1777. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/account_timezone_buyer_selected.yaml +0 -0
  1778. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/account_timezone_seller_assigned.yaml +0 -0
  1779. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/account_timezone_seller_fixed.yaml +0 -0
  1780. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/advanced_delivery_reporting.yaml +0 -0
  1781. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/audience_activation_discovery.yaml +0 -0
  1782. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/audience_buy_flow.yaml +0 -0
  1783. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/bidding_cost_binding.yaml +0 -0
  1784. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/bidding_policy_placement.yaml +0 -0
  1785. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/billing_finality_delivery.yaml +0 -0
  1786. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/budget_cap_timezone_account.yaml +0 -0
  1787. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/budget_cap_timezone_fixed.yaml +0 -0
  1788. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/budget_cap_timezone_override.yaml +0 -0
  1789. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/budget_cap_timezone_override_rejected.yaml +0 -0
  1790. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/canonical_formats.yaml +0 -0
  1791. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/catalog_item_availability_updates.yaml +0 -0
  1792. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/clicks_buy_flow.yaml +0 -0
  1793. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/collection_selection.yaml +0 -0
  1794. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/compact_direct_buy_lifecycle.yaml +0 -0
  1795. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/compact_product_lifecycle.yaml +0 -0
  1796. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +0 -0
  1797. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/create_media_buy_async.yaml +0 -0
  1798. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/create_media_buy_async_lifecycle.yaml +0 -0
  1799. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/cross_path_targeting_provenance.yaml +0 -0
  1800. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/declined_proposal_execution.yaml +0 -0
  1801. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/declined_proposal_refinement.yaml +0 -0
  1802. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/delivery_reporting.yaml +0 -0
  1803. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/demographic_targeting.yaml +0 -0
  1804. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/dependency_impairment_audience.yaml +0 -0
  1805. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/event_dedup_flow.yaml +0 -0
  1806. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/expired_proposal_execution.yaml +0 -0
  1807. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/external_audience_source_binding.yaml +0 -0
  1808. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -0
  1809. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/geo_region_all_values_support.yaml +0 -0
  1810. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/geo_region_exclusion_support.yaml +0 -0
  1811. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/geo_region_targeting.yaml +0 -0
  1812. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/get_products_async.yaml +0 -0
  1813. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/governance_agent_binding_acceptance.yaml +0 -0
  1814. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/governance_approved.yaml +0 -0
  1815. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/governance_conditions.yaml +0 -0
  1816. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/governance_denied.yaml +0 -0
  1817. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
  1818. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/inventory_list_targeting.yaml +0 -0
  1819. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/measurement_accountability.yaml +0 -0
  1820. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/media_buy_frequency_cap_readback.yaml +0 -0
  1821. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/metric_container_subsumption.yaml +0 -0
  1822. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/outcome_target.yaml +0 -0
  1823. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/outcome_target_list_products_inert.yaml +0 -0
  1824. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/owner_sold_channel_carriage.yaml +0 -0
  1825. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/package_automatic_bidding.yaml +0 -0
  1826. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +0 -0
  1827. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -0
  1828. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/performance_buy_flow.yaml +0 -0
  1829. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -0
  1830. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/portfolio_routing_scope.yaml +0 -0
  1831. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/pricing_currency_filter.yaml +0 -0
  1832. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/product_signal_targeting.yaml +0 -0
  1833. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/proposal_finalize.yaml +0 -0
  1834. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -0
  1835. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +0 -0
  1836. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/reach_buy_flow.yaml +0 -0
  1837. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/read_filter_behavior.yaml +0 -0
  1838. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -0
  1839. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/refine_products.yaml +0 -0
  1840. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/seller_optimized_budget.yaml +0 -0
  1841. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/seller_optimized_min_spend_target_exceeds_package_cap.yaml +0 -0
  1842. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/seller_optimized_proposal_package_pacing.yaml +0 -0
  1843. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/targeting_aware_discovery.yaml +0 -0
  1844. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -0
  1845. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -0
  1846. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/signals/scenarios/get_signals_async.yaml +0 -0
  1847. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/sponsored-intelligence/index.yaml +0 -0
  1848. /package/compliance/cache/{3.2.5 → 3.2.7}/protocols/sponsored-intelligence/sponsored-context-accountability.yaml +0 -0
  1849. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/brand-rights/scenarios/governance_approved.yaml +0 -0
  1850. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/brand-rights/scenarios/governance_denied.yaml +0 -0
  1851. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/brand-rights/scenarios/update_rights_lifecycle.yaml +0 -0
  1852. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/buyer-activation/index.yaml +0 -0
  1853. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/buyer-discovery/index.yaml +0 -0
  1854. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/buyer-negotiation/index.yaml +0 -0
  1855. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/buyer-recovery/index.yaml +0 -0
  1856. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/creative-ad-server/index.yaml +0 -0
  1857. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/creative-generative/generative-seller.yaml +0 -0
  1858. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/creative-transformers/scenarios/governance_approved.yaml +0 -0
  1859. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/creative-transformers/scenarios/governance_denied.yaml +0 -0
  1860. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/governance-aware-seller/index.yaml +0 -0
  1861. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +0 -0
  1862. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/governance-spend-authority/denied.yaml +0 -0
  1863. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/orchestrator-multi-agent/index.yaml +0 -0
  1864. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sales-broadcast-tv/index.yaml +0 -0
  1865. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sales-catalog-driven/index.yaml +0 -0
  1866. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sales-exchange/index.yaml +0 -0
  1867. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sales-guaranteed/index.yaml +0 -0
  1868. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sales-proposal-mode/index.yaml +0 -0
  1869. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sales-retail-media/index.yaml +0 -0
  1870. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sales-social/index.yaml +0 -0
  1871. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sales-streaming-tv/index.yaml +0 -0
  1872. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/signal-marketplace/scenarios/governance_approved.yaml +0 -0
  1873. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/signal-marketplace/scenarios/governance_denied.yaml +0 -0
  1874. /package/compliance/cache/{3.2.5 → 3.2.7}/specialisms/sponsored-intelligence/index.yaml +0 -0
  1875. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/acme-outdoor-live.yaml +0 -0
  1876. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/acme-outdoor.yaml +0 -0
  1877. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/billing-gate-runner.yaml +0 -0
  1878. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/bistro-oranje.yaml +0 -0
  1879. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/distributed-brand-runner.yaml +0 -0
  1880. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/hosted-grader.yaml +0 -0
  1881. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/nova-motors.yaml +0 -0
  1882. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/oauth-setup-runner.yaml +0 -0
  1883. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/osei-natural.yaml +0 -0
  1884. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/parallel-dispatch-runner.yaml +0 -0
  1885. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/rate-limit-trip-runner.yaml +0 -0
  1886. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/signed-requests-runner.yaml +0 -0
  1887. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/signed-responses-runner.yaml +0 -0
  1888. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/single-side-trust-runner.yaml +0 -0
  1889. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/substitution-observer-runner.yaml +0 -0
  1890. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/summit-foods.yaml +0 -0
  1891. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/trusted-match-router-runner.yaml +0 -0
  1892. /package/compliance/cache/{3.2.5 → 3.2.7}/test-kits/webhook-receiver-runner.yaml +0 -0
  1893. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/attestations/README.md +0 -0
  1894. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/attestations/vectors.json +0 -0
  1895. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/audience-evidence/README.md +0 -0
  1896. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/audience-evidence/vectors.json +0 -0
  1897. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/brand-response-signing/brand-authorization-cross-check.json +0 -0
  1898. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/catalog-macro-substitution.json +0 -0
  1899. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/creative-representation-resolution.json +0 -0
  1900. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/creative-representation-resolution.schema.json +0 -0
  1901. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/error-recovery/README.md +0 -0
  1902. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/error-recovery/vectors.json +0 -0
  1903. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/governance-authorization.json +0 -0
  1904. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/governance-runtime-attestations/README.md +0 -0
  1905. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/governance-runtime-attestations/vectors.json +0 -0
  1906. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/macro-processing.json +0 -0
  1907. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/macro-processing.schema.json +0 -0
  1908. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/oauth-setup/vectors.json +0 -0
  1909. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/001-minimal-plan.json +0 -0
  1910. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/002-full-plan.json +0 -0
  1911. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/003-bookkeeping-stripped.json +0 -0
  1912. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/004a-human-review-omitted.json +0 -0
  1913. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/004b-human-review-explicit-null.json +0 -0
  1914. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/005a-policy-categories-order-1.json +0 -0
  1915. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/005b-policy-categories-order-2.json +0 -0
  1916. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/006a-ext-trace-v1.json +0 -0
  1917. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/006b-ext-trace-v2.json +0 -0
  1918. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/007-unicode-objectives.json +0 -0
  1919. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/plan-hash/008-numeric-canonicalization.json +0 -0
  1920. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/products-only-brief-compatibility/README.md +0 -0
  1921. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/products-only-brief-compatibility/vectors.json +0 -0
  1922. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/relationship-scoped-indicators.json +0 -0
  1923. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/README.md +0 -0
  1924. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/adjustment.json +0 -0
  1925. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/canonicalization.json +0 -0
  1926. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/coverage-aggregation.json +0 -0
  1927. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/manifest.json +0 -0
  1928. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/materialization.json +0 -0
  1929. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/obligation.json +0 -0
  1930. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/receipts/accepted-recorded-response.json +0 -0
  1931. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/receipts/accepted-request.json +0 -0
  1932. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/receipts/accepted-unchanged-response.json +0 -0
  1933. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/receipts/adjustment-accepted-recorded-response.json +0 -0
  1934. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/receipts/adjustment-accepted-request.json +0 -0
  1935. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/receipts/rejected-recorded-response.json +0 -0
  1936. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/receipts/rejected-request.json +0 -0
  1937. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/report-definition.json +0 -0
  1938. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/revision.json +0 -0
  1939. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/row-schema.json +0 -0
  1940. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/rows.jsonl +0 -0
  1941. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/scenario-index.json +0 -0
  1942. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-reconciliation/scenario-index.schema.json +0 -0
  1943. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/reporting-summary/complete-summary.json +0 -0
  1944. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/README.md +0 -0
  1945. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/001-unsigned-sendmessage-required.json +0 -0
  1946. /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
  1947. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/003-unsigned-sendstreamingmessage-required.json +0 -0
  1948. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/004-duplicate-invocation-datapart.json +0 -0
  1949. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/005-signed-duplicate-invocation-datapart.json +0 -0
  1950. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/006-missing-skill.json +0 -0
  1951. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/007-protocol-method-required-covers-sendmessage.json +0 -0
  1952. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/008-no-extension-header.json +0 -0
  1953. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/009-extra-non-invocation-datapart.json +0 -0
  1954. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/010-filepart-present.json +0 -0
  1955. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/011-part-with-text-and-data.json +0 -0
  1956. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/012-non-object-data.json +0 -0
  1957. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/013-v0-3-kind-mismatch.json +0 -0
  1958. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/014-duplicate-skill-key.json +0 -0
  1959. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/015-non-string-skill.json +0 -0
  1960. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/016-text-only-message.json +0 -0
  1961. /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
  1962. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/018-unresolvable-with-lone-signature-header.json +0 -0
  1963. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/019-raw-part-present.json +0 -0
  1964. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/020-case-variant-member-name.json +0 -0
  1965. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/021-escaped-duplicate-skill-key.json +0 -0
  1966. /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
  1967. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/023-batch-body.json +0 -0
  1968. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/024-duplicate-method-key.json +0 -0
  1969. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/025-missing-method.json +0 -0
  1970. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/negative/026-empty-skill.json +0 -0
  1971. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/positive/001-signed-sendmessage-create-media-buy.json +0 -0
  1972. /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
  1973. /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
  1974. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/positive/004-unsigned-decoy-text-and-metadata.json +0 -0
  1975. /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
  1976. /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
  1977. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/a2a/positive/007-unsigned-method-case-variant.json +0 -0
  1978. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/body-integrity-policy.json +0 -0
  1979. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/canonicalization.json +0 -0
  1980. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/keys.json +0 -0
  1981. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/001-no-signature-header.json +0 -0
  1982. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/002-wrong-tag.json +0 -0
  1983. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/003-expired-signature.json +0 -0
  1984. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/004-window-too-long.json +0 -0
  1985. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/005-alg-not-allowed.json +0 -0
  1986. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/006-missing-covered-component.json +0 -0
  1987. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/007-missing-content-digest.json +0 -0
  1988. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/008-unknown-keyid.json +0 -0
  1989. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +0 -0
  1990. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/010-content-digest-mismatch.json +0 -0
  1991. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/011-malformed-header.json +0 -0
  1992. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/012-missing-expires-param.json +0 -0
  1993. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/013-expires-le-created.json +0 -0
  1994. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/014-missing-nonce-param.json +0 -0
  1995. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/015-signature-invalid.json +0 -0
  1996. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/016-replayed-nonce.json +0 -0
  1997. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/017-key-revoked.json +0 -0
  1998. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +0 -0
  1999. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/019-signature-without-signature-input.json +0 -0
  2000. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/020-rate-abuse.json +0 -0
  2001. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +0 -0
  2002. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/022-multi-valued-content-type.json +0 -0
  2003. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +0 -0
  2004. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/024-unquoted-string-param.json +0 -0
  2005. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +0 -0
  2006. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/026-non-ascii-host.json +0 -0
  2007. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +0 -0
  2008. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +0 -0
  2009. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/029-duplicate-signature-label.json +0 -0
  2010. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/030-content-digest-key-case.json +0 -0
  2011. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/negative/031-malformed-host-authority.json +0 -0
  2012. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/001-basic-post.json +0 -0
  2013. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/002-post-with-content-digest.json +0 -0
  2014. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/003-es256-post.json +0 -0
  2015. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/004-multiple-signature-labels.json +0 -0
  2016. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/005-default-port-stripped.json +0 -0
  2017. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/006-dot-segment-path.json +0 -0
  2018. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/007-query-byte-preserved.json +0 -0
  2019. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/008-percent-encoded-path.json +0 -0
  2020. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +0 -0
  2021. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +0 -0
  2022. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/011-ipv6-authority.json +0 -0
  2023. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +0 -0
  2024. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/013-two-signature-labels-distinct.json +0 -0
  2025. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/014-content-digest-two-algorithms.json +0 -0
  2026. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/positive/015-bracketed-ipv6-host-with-port.json +0 -0
  2027. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/001-base64url-sf-binary.json +0 -0
  2028. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/001-no-signature-header.json +0 -0
  2029. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/002-multiple-trailing-dots.json +0 -0
  2030. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/002-wrong-tag.json +0 -0
  2031. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/003-expired-signature.json +0 -0
  2032. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/004-window-too-long.json +0 -0
  2033. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/005-alg-not-allowed.json +0 -0
  2034. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/006-missing-covered-component.json +0 -0
  2035. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/007-missing-content-digest.json +0 -0
  2036. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/008-unknown-keyid.json +0 -0
  2037. /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
  2038. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/010-content-digest-mismatch.json +0 -0
  2039. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/011-malformed-header.json +0 -0
  2040. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/012-missing-expires-param.json +0 -0
  2041. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/013-expires-le-created.json +0 -0
  2042. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/014-missing-nonce-param.json +0 -0
  2043. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/015-signature-invalid.json +0 -0
  2044. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/016-replayed-nonce.json +0 -0
  2045. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/017-key-revoked.json +0 -0
  2046. /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
  2047. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/020-rate-abuse.json +0 -0
  2048. /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
  2049. /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
  2050. /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
  2051. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/024-unquoted-string-param.json +0 -0
  2052. /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
  2053. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/026-non-ascii-host.json +0 -0
  2054. /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
  2055. /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
  2056. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/029-duplicate-signature-label.json +0 -0
  2057. /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
  2058. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/negative/031-malformed-host-authority.json +0 -0
  2059. /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
  2060. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/003-es256-post.json +0 -0
  2061. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/004-multiple-signature-labels.json +0 -0
  2062. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/005-default-port-stripped.json +0 -0
  2063. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/006-dot-segment-path.json +0 -0
  2064. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/007-query-byte-preserved.json +0 -0
  2065. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/008-percent-encoded-path.json +0 -0
  2066. /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
  2067. /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
  2068. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/profile-3.2/positive/011-ipv6-authority.json +0 -0
  2069. /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
  2070. /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
  2071. /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
  2072. /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
  2073. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/request-signing/protocol-method-names.json +0 -0
  2074. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/rights-attestations/README.md +0 -0
  2075. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/rights-attestations/vectors.json +0 -0
  2076. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/supply-path/README.md +0 -0
  2077. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/supply-path/vectors.json +0 -0
  2078. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/tracker-execution-contracts.json +0 -0
  2079. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/tracker-execution-contracts.schema.json +0 -0
  2080. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/trusted-match-context-merge/README.md +0 -0
  2081. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/trusted-match-context-merge/vectors.json +0 -0
  2082. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/universal-macro-translation.json +0 -0
  2083. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/universal-macro-translation.schema.json +0 -0
  2084. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-receiver-envelope.json +0 -0
  2085. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/README.md +0 -0
  2086. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/keys.json +0 -0
  2087. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/001-wrong-tag.json +0 -0
  2088. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/002-expired-signature.json +0 -0
  2089. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/003-window-too-long.json +0 -0
  2090. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +0 -0
  2091. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/005-missing-authority-component.json +0 -0
  2092. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/006-missing-content-digest.json +0 -0
  2093. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/007-unknown-keyid.json +0 -0
  2094. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +0 -0
  2095. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +0 -0
  2096. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +0 -0
  2097. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/011-signature-without-input.json +0 -0
  2098. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/012-missing-expires-param.json +0 -0
  2099. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/013-expires-le-created.json +0 -0
  2100. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +0 -0
  2101. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/015-signature-invalid.json +0 -0
  2102. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/016-replayed-nonce.json +0 -0
  2103. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/017-key-revoked.json +0 -0
  2104. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/018-rate-abuse.json +0 -0
  2105. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/019-revocation-stale.json +0 -0
  2106. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +0 -0
  2107. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +0 -0
  2108. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/positive/001-basic-post.json +0 -0
  2109. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/positive/002-es256-post.json +0 -0
  2110. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +0 -0
  2111. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/positive/004-default-port-stripped.json +0 -0
  2112. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +0 -0
  2113. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +0 -0
  2114. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +0 -0
  2115. /package/compliance/cache/{3.2.5 → 3.2.7}/test-vectors/webhook-signing/positive/008-request-signing-key-reuse.json +0 -0
  2116. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/account-identity-reconciliation.yaml +0 -0
  2117. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/agent-notification-configs.yaml +0 -0
  2118. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/billing-gate-dispatch.yaml +0 -0
  2119. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/buyer-fixture-publisher.yaml +0 -0
  2120. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/buyer-orchestrator-track.yaml +0 -0
  2121. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/comply-controller-mode-gate.yaml +0 -0
  2122. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/deterministic-testing.yaml +0 -0
  2123. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/fictional-entities.yaml +0 -0
  2124. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/get-products-pagination-integrity.yaml +0 -0
  2125. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/governance.yaml +0 -0
  2126. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/idempotency.yaml +0 -0
  2127. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/notification-config-event-scope.yaml +0 -0
  2128. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/notification-config-lifecycle.yaml +0 -0
  2129. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/notification-config-rejections.yaml +0 -0
  2130. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/oauth-setup.yaml +0 -0
  2131. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/pagination-integrity-creative-formats.yaml +0 -0
  2132. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/pagination-integrity-list-accounts.yaml +0 -0
  2133. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/pagination-integrity.yaml +0 -0
  2134. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/principal.yaml +0 -0
  2135. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/reliable-reporting-managed-delivery.yaml +0 -0
  2136. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/reliable-reporting-reconciled-billing.yaml +0 -0
  2137. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/reporting-consumer-status.yaml +0 -0
  2138. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/reporting-core-declaration.yaml +0 -0
  2139. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/reporting-core.yaml +0 -0
  2140. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/security.yaml +0 -0
  2141. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/signed-requests.yaml +0 -0
  2142. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/trusted-match-publisher-authentication.yaml +0 -0
  2143. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/v3-envelope-integrity.yaml +0 -0
  2144. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/webhook-receiver-envelope.yaml +0 -0
  2145. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/wholesale-feed-bulk-webhooks.yaml +0 -0
  2146. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/wholesale-feed-product-webhooks.yaml +0 -0
  2147. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/wholesale-feed-products-scope-isolation.yaml +0 -0
  2148. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/wholesale-feed-products.yaml +0 -0
  2149. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/wholesale-feed-signal-webhooks.yaml +0 -0
  2150. /package/compliance/cache/{3.2.5 → 3.2.7}/universal/wholesale-feed-signals-scope-isolation.yaml +0 -0
  2151. /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)();
@@ -259,7 +259,7 @@ const ProvenanceSchema = /* @__PURE__ */ (() => z.object({
259
259
  feature_id: z.string().optional()
260
260
  }).passthrough().optional(),
261
261
  embedded_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
262
- }).passthrough()).optional(),
262
+ }).passthrough()).min(1).optional(),
263
263
  watermarks: z.array(z.object({
264
264
  media_type: WatermarkMediaTypeSchema,
265
265
  provider: z.string(),
@@ -269,7 +269,7 @@ const ProvenanceSchema = /* @__PURE__ */ (() => z.object({
269
269
  }).passthrough().optional(),
270
270
  c2pa_action: C2PAWatermarkActionSchema.optional(),
271
271
  embedded_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
272
- }).passthrough()).optional(),
272
+ }).passthrough()).min(1).optional(),
273
273
  disclosure: z.object({
274
274
  required: z.boolean(),
275
275
  jurisdictions: z.array(z.object({
@@ -280,10 +280,10 @@ const ProvenanceSchema = /* @__PURE__ */ (() => z.object({
280
280
  render_guidance: z.object({
281
281
  persistence: DisclosurePersistenceSchema.optional(),
282
282
  min_duration_ms: z.number().int().gte(1).optional(),
283
- positions: z.array(DisclosurePositionSchema).optional(),
283
+ positions: z.array(DisclosurePositionSchema).min(1).optional(),
284
284
  ext: ExtensionObjectSchema.optional()
285
285
  }).passthrough().optional()
286
- }).passthrough()).optional()
286
+ }).passthrough()).min(1).optional()
287
287
  }).passthrough().optional(),
288
288
  verification: z.array(z.object({
289
289
  verified_by: z.string(),
@@ -291,7 +291,7 @@ const ProvenanceSchema = /* @__PURE__ */ (() => z.object({
291
291
  result: z.union([z.literal("authentic"), z.literal("ai_generated"), z.literal("ai_modified"), z.literal("inconclusive")]),
292
292
  confidence: z.number().gte(0).lte(1).optional(),
293
293
  details_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional()
294
- }).passthrough()).optional(),
294
+ }).passthrough()).min(1).optional(),
295
295
  ext: ExtensionObjectSchema.optional()
296
296
  }).passthrough())();
297
297
  const CanonicalOptimizationGoalSchema = /* @__PURE__ */ (() => z.union([z.object({
@@ -447,7 +447,7 @@ const AudienceForecastDimensionSchema = /* @__PURE__ */ (() => z.object({
447
447
  audience_source: AudienceSourceSchema,
448
448
  audience_name: z.string().optional()
449
449
  }).passthrough())();
450
- const SignalForecastDimensionSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
450
+ const SignalForecastDimensionSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
451
451
  kind: z.literal("signal"),
452
452
  signal_ref: SignalRefSchema.optional(),
453
453
  signal_id: z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).optional(),
@@ -709,8 +709,8 @@ const CancellationPolicySchema = /* @__PURE__ */ (() => z.object({
709
709
  const FlightChangeConstraintsSchema = /* @__PURE__ */ (() => z.object({
710
710
  kind: z.literal("flight"),
711
711
  max_change: DurationSchema.optional(),
712
- earliest_result: z.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()))();
@@ -1230,7 +1230,7 @@ const InlineMarkupSchema = /* @__PURE__ */ (() => z.object({
1230
1230
  location: z.object({
1231
1231
  field: z.literal("markup").optional()
1232
1232
  }).passthrough().optional()
1233
- }).passthrough())).optional(),
1233
+ }).passthrough())).min(1).optional(),
1234
1234
  provenance: ProvenanceSchema.optional(),
1235
1235
  delivery_type: z.literal("inline_markup"),
1236
1236
  markup_type: z.union([z.literal("iframe_javascript"), z.literal("javascript"), z.literal("standard")]),
@@ -1269,15 +1269,15 @@ const CatalogSchema = /* @__PURE__ */ (() => z.object({
1269
1269
  url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
1270
1270
  feed_format: FeedFormatSchema.optional(),
1271
1271
  update_frequency: UpdateFrequencySchema.optional(),
1272
- items: z.array(z.object({}).passthrough()).optional(),
1273
- ids: z.array(z.string()).optional(),
1274
- gtins: z.array(z.string()).optional(),
1275
- tags: z.array(z.string()).optional(),
1272
+ items: z.array(z.object({}).passthrough()).min(1).optional(),
1273
+ ids: z.array(z.string()).min(1).optional(),
1274
+ gtins: z.array(z.string()).min(1).optional(),
1275
+ tags: z.array(z.string()).min(1).optional(),
1276
1276
  category: z.string().optional(),
1277
1277
  query: z.string().optional(),
1278
- conversion_events: z.array(EventTypeSchema).optional(),
1278
+ conversion_events: z.array(EventTypeSchema).min(1).optional(),
1279
1279
  content_id_type: ContentIDTypeSchema.optional(),
1280
- feed_field_mappings: z.array(CatalogFieldMappingSchema).optional()
1280
+ feed_field_mappings: z.array(CatalogFieldMappingSchema).min(1).optional()
1281
1281
  }).passthrough())();
1282
1282
  const BrandReferenceSchema = /* @__PURE__ */ (() => z.object({
1283
1283
  domain: z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")),
@@ -1448,7 +1448,7 @@ const URLAssetSchema = /* @__PURE__ */ (() => z.object({
1448
1448
  location: z.object({
1449
1449
  field: z.literal("url").optional()
1450
1450
  }).passthrough().optional()
1451
- }).passthrough())).optional(),
1451
+ }).passthrough())).min(1).optional(),
1452
1452
  description: z.string().optional(),
1453
1453
  state_id: z.string().optional(),
1454
1454
  provenance: ProvenanceSchema.optional()
@@ -2183,7 +2183,7 @@ const CanonicalFormatVASTVideoSchema = /* @__PURE__ */ (() => z.object({
2183
2183
  max_wrapper_depth: z.int().min(0).optional(),
2184
2184
  ssl_required: z.boolean().optional()
2185
2185
  }).passthrough())();
2186
- const CanonicalFormatSellerRenderedStatefulDisplaySchema = /* @__PURE__ */ (() => z.object({ "experimental": z.boolean().describe("Experimental in AdCP 3.2 while the creative working group gathers implementation evidence across premium web and mobile/app sellers.").optional(), "deprecated": z.boolean().describe("When true, this canonical (or a seller's specific narrowing of it) is going away. Existing adopters are supported through the deprecation cycle; new adoption is discouraged. Pair with `migration_target_version` to indicate when the canonical is expected to be removed. Distinct from `experimental`: an experimental canonical may stabilize and stop being experimental; a deprecated canonical is on a sunset path.").optional(), "v1_translatable": z.boolean().describe("No v1 named-format equivalent can express multiple seller-rendered states and their breakpoint bindings.").optional(), "since_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version that introduced this canonical (e.g., '3.1', '3.2'). Lets adopters reason about minimum protocol version requirements when consuming a format declaration. Patch precision is intentionally rejected \u2014 canonicals are introduced at minor-version boundaries.").optional(), "migration_target_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version by which the working group expects this canonical to stabilize, surface a breaking revision, or (when `deprecated: true`) be removed. Patch precision is intentionally rejected \u2014 canonicals shift at minor-version boundaries. Absence signals 'no specific target' (omit the field rather than use a placeholder like 'unknown').").optional(), "composition_model": z.enum(["deterministic", "algorithmic"]).describe("Whether the surface composes deterministically (buyer can predict per-slot rendering \u2014 sponsored_placement, image, video) or algorithmically (surface chooses combinations or phrasing \u2014 responsive_creative, agent_placement).").optional(), "provenance_required": z.boolean().describe("When true, the product rejects unsigned synthesized assets. Builders calling build_creative MUST attach a C2PA-compatible provenance manifest attributing synthesis to the creative agent.").optional(), "platform_extensions": z.array(z.object({ "uri": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("HTTPS URL identifying the extension. `https://` is mandatory \u2014 `http://`, `file://`, `data:`, and other schemes are rejected at the schema layer (defense-in-depth on top of the fetch-contract normative rules). The URI base is the owning agent's URL; the path identifies the extension within that agent. Example: 'https://creative.adcontextprotocol.org/translated/meta/extensions/meta_pixel'. The full fetch contract \u2014 SSRF allowlist, response-size cap, $ref sandbox, schema-compile bounds \u2014 is documented on `product-format-declaration.json#format_schema` and applies to ALL fetches of this reference shape regardless of whether the field is named `format_schema` (load-bearing for validation) or `platform_extensions` (informational); the *transport* rules are identical, only the *consumption* semantics differ."), "digest": z.string().regex(new RegExp("^sha256:[a-f0-9]{64}$")).describe("SHA-256 content digest of the extension definition (sha256:<hex>). Used to detect drift \u2014 if the agent revises the extension, the digest changes and cached definitions become invalid.") }).catchall(z.any()).describe("Reference to a platform extension definition. The agent that owns the URI is authoritative for the extension's schema. Buyers fetch the definition once per content digest and cache it. Platform extensions are typically bundled in `get_products` responses under an `extensions` map keyed by `uri@digest`, eliminating the need for a separate fetch.\n\n**Within a single response**, multiple references to the same `uri` MUST carry the same `digest` \u2014 divergent digests in one response indicate producer-side error (e.g., concurrent extension revision mid-render). Buyers encountering divergent digests for the same URI MUST fail closed: treat all references to that URI as unresolved and surface a validation error rather than picking one branch silently. **Across responses**, digest divergence is normal \u2014 extension authors revise their schemas, the new digest differs, the cache key changes, and the buyer refetches. Cache by `uri@digest`, not by `uri` alone.")).describe('Platform-specific extensions narrowing the canonical (pixel ID shapes, conversion event taxonomies, platform-specific CTAs/destinations). Each extension is a URI+digest reference resolved against the bundled `extensions` map in get_products responses or fetched directly.\n\n**Collision precedence (normative).** When two or more `platform_extensions[]` entries on the same declaration extend the same target (e.g., both extend `tracking`) with overlapping field names, **array order is authoritative \u2014 later entries override earlier ones on a per-field basis** (last-in-array-wins). SDKs MUST surface the overlap via the `errors[]` array on the `get_products` response with a structured code (`FORMAT_DECLARATION_DIVERGENT` is appropriate when the overlap appears across dual-emitted shapes; a producer-self-emitted overlap on a single declaration SHOULD use the same code with `error.details: { collision_kind: "platform_extension_field", target, overlapping_fields, winning_extension_uri }`). Producers SHOULD avoid the collision by emitting one extension per target or by partitioning fields across extensions; the deterministic precedence is for last-resort consistency across SDK implementations, not a sanctioned merging strategy.').optional(), "synthesis_nondeterministic": z.boolean().describe("When true, the format's production pipeline is genuinely nondeterministic \u2014 the platform cannot guarantee that synthesis from a given input set produces in-spec output. Veo / Sora / Runway-class generative video, and other AI-synthesis flows where output dimensions, duration, or quality vary per run. Implies a different validation contract: predictive `validate_input` is impossible; the platform's own post-synthesis QA loop applies; if the QA loop exhausts without producing a valid artifact, `build_creative` returns task_failed with a synthesis_failed reason. Distinct from `composition_model` (which describes how the surface composes per-slot rendering, not whether synthesis is deterministic). When false or absent, the format's production is predictable enough that `validate_input` can predict output properties from input properties.\n\n**Compatibility with `asset_source` / `item_production_model`**: `synthesis_nondeterministic: true` MAY pair with any of `seller_pre_rendered_from_brief`, `seller_human_designed`, or `agent_synthesized` (the QA loop is concept-level, not source-specific \u2014 'seller renders from brief but each retry differs' is just as nondeterministic as Veo). It MUST NOT pair with `buyer_uploaded` (the buyer ships pre-rendered bytes; there's no synthesis step to be nondeterministic about). It MUST NOT pair with `publisher_host_recorded` (the publisher's host produces a deterministic-from-script output even if the human voice varies). When `synthesis_nondeterministic: true` is set with an incompatible source, validators SHOULD reject with a structured error.").optional(), "slots": z.array(z.object({ "asset_group_id": z.string().describe("Canonical asset_group_id from /schemas/core/asset-group-vocabulary.json. Non-canonical IDs are valid but trigger soft warnings."), "asset_type": z.enum(["image", "video", "audio", "text", "markdown", "url", "html", "css", "javascript", "vast", "daast", "display_tag", "webhook", "brief", "catalog", "published_post", "zip", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]).describe("Discriminator selecting the asset schema this slot accepts. SDK codegen uses this to type the slot value. `display_tag` is the atomic third-party display representation (URL, inline markup, or paired redirect). `published_post` is an existing-post reference asset. `pixel_tracker` / `vast_tracker` / `daast_tracker` are renderer-fired tracker primitives. `object` is a last-resort fallback."), "required": z.boolean().describe("Whether this slot is required for a valid manifest.").optional(), "min": z.number().int().gte(0).describe("Minimum count for repeatable / pool slots.").optional(), "max": z.number().int().gte(1).describe("Maximum count for repeatable / pool slots.").optional(), "max_chars": z.number().int().gte(1).describe("Per-slot character limit. Valid only when `asset_type` is `text`, `markdown`, or `brief`. Mutually exclusive with `max_size_kb` (which applies to binary asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "max_size_kb": z.number().int().gte(1).describe("Per-slot file size limit in exact kilobytes, where 1 KB = 1,000 bytes. Valid only when `asset_type` is `image`, `video`, `audio`, or `zip`. Mutually exclusive with `max_chars` (which applies to text asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Accepted intrinsic-pixel densities for this image-bearing slot. Valid when `asset_type` is `image`, and on a `card` slot where it constrains each card's image media (video media is unaffected). This makes density available to every canonical carrying image assets (native, carousel, responsive, companion images, and image itself), not only `format_kind: image`. When the image canonical also declares top-level `params.pixel_ratios`, the effective set is the intersection; an empty intersection is invalid. One matching asset satisfies the slot unless `required_pixel_ratios` requires rendition coverage.").optional(), "required_pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Required density coverage for an image rendition set. Valid only when `asset_type` is `image` and `pixel_ratios` is also declared. Every value MUST appear in the effective accepted set after intersecting any top-level image `params.pixel_ratios`, and the manifest slot value MUST be an array containing exactly one matching image rendition for each required ratio. Other accepted ratios remain optional. For example, `pixel_ratios: [1, 1.5, 2]` with `required_pixel_ratios: [1, 2]` requires the 1x and 2x renditions while making 1.5x optional. SDKs enforce intersection, subset, coverage, and duplicate-ratio rules because JSON Schema draft-07 cannot express them generically.").optional(), "logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("When `asset_group_id` is `logo`, renderer-facing brand.json logo slots acceptable for this format slot. Producers selecting from brand.json SHOULD prefer `logos[]` entries whose `slots[]` intersects this list, then apply `visual_guidelines.logo_usage_rules[]`.").optional(), "required_logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Subset of `logo_slots` for which this format expects explicit logo coverage. A manifest or brand-derived logo pool SHOULD include at least one usable logo for each required slot; if coverage is missing, builders SHOULD surface a validation warning or approval mapping instead of guessing from prose.").optional(), "description": z.string().describe("Human-readable description of what the slot expects from the buyer.").optional(), "consumed_for_production": z.boolean().describe("Dispatch hint for `build_creative` and v1\u2194v2 wire translators: when `true`, the slot's value is consumed as INPUT to a production step (host-read script, brief copy fed to generative synthesis, catalog feed driving per-SKU rendering) and is not rendered verbatim. When `false` (default), the slot's value is rendered verbatim on the placement (image bytes, video file, display tag).\n\nMotivates the v1\u2194v2 dispatch table: pre-v2 buyers shipped production-consumed inputs separately in a `inputs` map on the build_creative request; v2 collapses inputs and rendered assets into a single `assets` map keyed by `asset_group_id`. SDK translators between v1 and v2 use this flag per canonical to know which assets in the v2 manifest map back to v1 `inputs` vs v1 `assets`. Without the per-slot flag the dispatch table lives in adopter code and every SDK gets it slightly different.\n\nProducers SHOULD set this explicitly on slots whose consumption pattern isn't obvious (host-read scripts on `audio_hosted`, briefs on generative `video_hosted`, catalog feeds on `sponsored_placement`). For canonicals where every slot is render-verbatim (`image`, `display_tag`, `video_vast`, `audio_vast`), the default `false` is sufficient and the flag MAY be omitted.").optional() }).catchall(z.any()).and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }), z.any().refine((value) => !z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }), z.any().refine((value) => !z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.union([z.any().refine((value) => !z.any().refine((value2) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema").safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.any().refine((value) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.any().refine((value) => !z.union([z.object({ "logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "required_logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]))), z.intersection(z.any(), z.intersection(z.union([z.any().refine((value) => !z.object({ "required_pixel_ratios": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "required_pixel_ratios": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "asset_type": z.literal("image").optional() }))]), z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }), z.any().refine((value) => !z.union([z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))])))))).describe("Default manifest slots; which are consumed depends on `supply_mode`. `state_canvases` images MUST carry `state_id` and `breakpoint_id`, and `state_click_urls` entries MUST carry `state_id` (semantic validators resolve the bindings). Component images SHOULD carry `focal_point` for deterministic seller cropping. `landing_page_url` is the default destination (see `clickthrough`). `font_files` MUST contain only buyer-licensed fonts; publisher-proprietary fonts never travel in manifests. Only image, video, text, url, zip, and pixel_tracker slot asset types are accepted \u2014 executable types (javascript, html, css, webhook) are rejected even via `slots` overrides.").optional(), "required_connections": z.array(z.object({ "provider": z.string().describe("Stable provider or platform namespace, preferably lowercase. Examples: `social.example`, `shortvideo.example`, or a seller-defined namespace. Omit only when the requirement is provider-agnostic, or when an `authorization_url` fully routes the human to the correct provider-specific connection flow.").optional(), "connection_type": z.enum(["advertiser_account", "publisher_identity", "post_authorization"]).describe("Kind of downstream connection required. `advertiser_account` is the platform account used to buy/manage ads. `publisher_identity` is the creator, page, channel, organization, or profile that owns source posts. `post_authorization` is a post-scoped grant when the platform authorizes individual posts instead of, or in addition to, the owning identity."), "required_for": z.array(z.string().min(1)).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Concrete AdCP protocol operation names that require this downstream connection. Sellers SHOULD include this in product declarations when the requirement is known ahead of time, and in AUTHORIZATION_REQUIRED details when it explains the failed operation. Prefer specific operation names such as `list_creatives`, `sync_creatives`, `create_media_buy`, `get_media_buy_delivery`, or `get_creative_delivery` over broad category labels such as `reporting`.").optional(), "scope": z.enum(["account", "identity", "post", "unknown"]).describe("Granularity of the downstream grant.").optional(), "status": z.enum(["connected", "missing", "pending", "expired", "revoked", "not_required", "unknown"]).describe("Current seller-observed state for this downstream connection when known. Product declarations MAY omit status or use `unknown`; AUTHORIZATION_REQUIRED details SHOULD use `missing`, `expired`, or `revoked` for the connection that blocked the call.").optional(), "connection_id": z.string().describe("Seller-defined identifier for an already-created downstream connection. Omit when no connection exists yet or when exposing it would leak platform/account state.").optional(), "resource_ref": z.object({ "platform_account_id": z.string().describe("Provider-native advertiser or business account id, when safe to disclose.").optional(), "identity_id": z.string().describe("Provider-native creator, page, channel, organization, or profile id, when safe to disclose.").optional(), "handle": z.string().describe("Provider-native public handle for the owning identity, when available.").optional(), "profile_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the owning identity, when available.").optional(), "post_id": z.string().describe("Provider-native post id, when the grant is post-scoped or the failed request referenced a specific post.").optional(), "post_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the referenced post, when available.").optional() }).catchall(z.any()).describe("Optional opaque provider-native resource hint, such as a platform account id, profile URL, handle, channel id, post id, or post URL. This is a hint for routing authorization, not proof that authorization exists.").optional(), "authorization_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Seller-hosted or provider-hosted URL where a human can complete or restore this downstream connection.").optional(), "authorization_instructions": z.string().describe("Human-readable instructions for completing or restoring this downstream connection.").optional(), "expires_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }), z.union([z.object({ "provider": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "authorization_url": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]))])).describe("A seller/platform-side connection or grant required by a product, format, or request. This is not the AdCP caller credential: the AdCP request is still authenticated once, and the seller uses these stored downstream connections to call a platform or service on the buyer's behalf. Use this shape for platforms that require more than one downstream grant, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.")).describe("Downstream platform connections or grants required to use this format declaration. These are in addition to the single AdCP caller credential. Use this when a platform product requires multiple downstream grants, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.").optional(), "reference_mutability": z.enum(["immutable_snapshot", "mutable_requires_reapproval", "mutable_auto_recheck"]).describe("Policy for formats whose `slots` accept a `published_post` reference. `immutable_snapshot`: seller snapshots the referenced post at approval and later source changes do not change the served creative. `mutable_requires_reapproval`: the source post may change and material changes require review before continued serving. `mutable_auto_recheck`: the source post may change and the seller continuously or periodically rechecks authorization/policy without requiring buyer resubmission. Omit when the format has no `published_post` slot.").optional(), "production_window_business_days": z.number().int().gte(0).describe("Typical production turnaround in business days when the format requires seller-side production (e.g., host-recording from a buyer-supplied script). 0 for synchronous (e.g., generative AI); >0 for human-produced (e.g., podcast host-read). Absent when no production is required (buyer uploads complete creative).").optional(), "supply_mode": z.enum(["components", "rendered_canvases", "layered_source"]).describe("Which end of the template contract the buyer feeds. `components`: buyer supplies component slots; seller renders states (no `state_canvases`/`layered_source` assets allowed). `rendered_canvases`: buyer supplies exactly one `state_canvases` image per declared state \xD7 breakpoint pair. `layered_source`: buyer ships design source (+ optional `font_files`); seller production derives states (`production_window_business_days` applies) \u2014 transitional for sellers without executable templates.").optional(), "states": z.array(z.object({ "state_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).describe("Stable identifier used by `state_canvases[].state_id` and `state_click_urls[].state_id`."), "anchoring": z.enum(["inline", "sticky_top", "sticky_bottom", "overlay", "fullscreen_overlay", "underlay"]).describe("`underlay` renders the canvas beneath page content, which scrolls over it (IAB New Ad Portfolio underlay class: skins, reveal units). Transitions into `overlay`/`fullscreen_overlay` states SHOULD be user-initiated; non-user-action entries emit LEAN policy warnings."), "slot_bindings": z.array(z.string().regex(new RegExp("^[a-z0-9_]+$"))).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Asset group IDs rendered in this state (components mode). Makes the template executable: given components and bindings, assembly is deterministic. Every value MUST resolve to a declared slot. Omitted means all supplied component slots may render.").optional(), "motion": z.enum(["static", "animated"]).describe("Whether the seller-rendered layout animates within this state (attract loops, load animations). Intra-state animation is seller-rendered; buyer canvases stay static images.").optional(), "max_animation_s": z.number().gt(0).describe("Upper bound on intra-state animation duration. Required when `motion` is `animated`.").optional(), "breakpoints": z.array(z.object({ "breakpoint_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).describe("Stable identifier used by `state_canvases[].breakpoint_id`."), "width": z.number().int().gte(1).optional(), "width_range": z.array(z.number().int().gte(1)).min(2).max(2).describe("Inclusive [minimum, maximum] accepted canvas width. The first value MUST be no greater than the second; semantic validators enforce ordering.").optional(), "width_mode": z.enum(["full_bleed", "gutter_residual"]).describe("Fluid width classes. `full_bleed`: edge-to-edge viewport width (IAB adhesion, topscroll). `gutter_residual`: the margin remaining beside the page content column (desktop skins). Fluid breakpoints cannot be targeted by `rendered_canvases` supply \u2014 semantic validation rejects that pairing.").optional(), "height": z.number().int().gte(1).optional(), "height_range": z.array(z.number().int().gte(1)).min(2).max(2).describe("Inclusive [minimum, maximum] accepted canvas height. The first value MUST be no greater than the second; semantic validators enforce ordering.").optional(), "viewport_height_percent": z.number().gt(0).lte(100).describe("Height as a percentage of the viewport (topscroll 80%, mobile skin panel 15%). Fluid; cannot be targeted by `rendered_canvases` supply.").optional(), "canvas_aspect_ratio": z.string().regex(new RegExp("^[0-9]+(\\.[0-9]+)?:[0-9]+(\\.[0-9]+)?$")).describe("Aspect ratio the rendered canvas maintains across the size range (IAB flexible units, ratio-bucket responsive). When both fixed `width` and `height` are declared, the ratio MUST be consistent with them.").optional() }).catchall(z.any()).and(z.intersection(z.union([z.object({ "width": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "width_range": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "width_mode": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.object({ "height": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "height_range": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "viewport_height_percent": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).min(1).superRefine((breakpoints, ctx) => {
2186
+ const CanonicalFormatSellerRenderedStatefulDisplaySchema = /* @__PURE__ */ (() => z.object({ "experimental": z.boolean().describe("Experimental in AdCP 3.2 while the creative working group gathers implementation evidence across premium web and mobile/app sellers.").optional(), "deprecated": z.boolean().describe("When true, this canonical (or a seller's specific narrowing of it) is going away. Existing adopters are supported through the deprecation cycle; new adoption is discouraged. Pair with `migration_target_version` to indicate when the canonical is expected to be removed. Distinct from `experimental`: an experimental canonical may stabilize and stop being experimental; a deprecated canonical is on a sunset path.").optional(), "v1_translatable": z.boolean().describe("No v1 named-format equivalent can express multiple seller-rendered states and their breakpoint bindings.").optional(), "since_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version that introduced this canonical (e.g., '3.1', '3.2'). Lets adopters reason about minimum protocol version requirements when consuming a format declaration. Patch precision is intentionally rejected \u2014 canonicals are introduced at minor-version boundaries.").optional(), "migration_target_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version by which the working group expects this canonical to stabilize, surface a breaking revision, or (when `deprecated: true`) be removed. Patch precision is intentionally rejected \u2014 canonicals shift at minor-version boundaries. Absence signals 'no specific target' (omit the field rather than use a placeholder like 'unknown').").optional(), "composition_model": z.enum(["deterministic", "algorithmic"]).describe("Whether the surface composes deterministically (buyer can predict per-slot rendering \u2014 sponsored_placement, image, video) or algorithmically (surface chooses combinations or phrasing \u2014 responsive_creative, agent_placement).").optional(), "provenance_required": z.boolean().describe("When true, the product rejects unsigned synthesized assets. Builders calling build_creative MUST attach a C2PA-compatible provenance manifest attributing synthesis to the creative agent.").optional(), "platform_extensions": z.array(z.object({ "uri": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("HTTPS URL identifying the extension. `https://` is mandatory \u2014 `http://`, `file://`, `data:`, and other schemes are rejected at the schema layer (defense-in-depth on top of the fetch-contract normative rules). The URI base is the owning agent's URL; the path identifies the extension within that agent. Example: 'https://creative.adcontextprotocol.org/translated/meta/extensions/meta_pixel'. The full fetch contract \u2014 SSRF allowlist, response-size cap, $ref sandbox, schema-compile bounds \u2014 is documented on `product-format-declaration.json#format_schema` and applies to ALL fetches of this reference shape regardless of whether the field is named `format_schema` (load-bearing for validation) or `platform_extensions` (informational); the *transport* rules are identical, only the *consumption* semantics differ."), "digest": z.string().regex(new RegExp("^sha256:[a-f0-9]{64}$")).describe("SHA-256 content digest of the extension definition (sha256:<hex>). Used to detect drift \u2014 if the agent revises the extension, the digest changes and cached definitions become invalid.") }).catchall(z.any()).describe("Reference to a platform extension definition. The agent that owns the URI is authoritative for the extension's schema. Buyers fetch the definition once per content digest and cache it. Platform extensions are typically bundled in `get_products` responses under an `extensions` map keyed by `uri@digest`, eliminating the need for a separate fetch.\n\n**Within a single response**, multiple references to the same `uri` MUST carry the same `digest` \u2014 divergent digests in one response indicate producer-side error (e.g., concurrent extension revision mid-render). Buyers encountering divergent digests for the same URI MUST fail closed: treat all references to that URI as unresolved and surface a validation error rather than picking one branch silently. **Across responses**, digest divergence is normal \u2014 extension authors revise their schemas, the new digest differs, the cache key changes, and the buyer refetches. Cache by `uri@digest`, not by `uri` alone.")).describe('Platform-specific extensions narrowing the canonical (pixel ID shapes, conversion event taxonomies, platform-specific CTAs/destinations). Each extension is a URI+digest reference resolved against the bundled `extensions` map in get_products responses or fetched directly.\n\n**Collision precedence (normative).** When two or more `platform_extensions[]` entries on the same declaration extend the same target (e.g., both extend `tracking`) with overlapping field names, **array order is authoritative \u2014 later entries override earlier ones on a per-field basis** (last-in-array-wins). SDKs MUST surface the overlap via the `errors[]` array on the `get_products` response with a structured code (`FORMAT_DECLARATION_DIVERGENT` is appropriate when the overlap appears across dual-emitted shapes; a producer-self-emitted overlap on a single declaration SHOULD use the same code with `error.details: { collision_kind: "platform_extension_field", target, overlapping_fields, winning_extension_uri }`). Producers SHOULD avoid the collision by emitting one extension per target or by partitioning fields across extensions; the deterministic precedence is for last-resort consistency across SDK implementations, not a sanctioned merging strategy.').optional(), "synthesis_nondeterministic": z.boolean().describe("When true, the format's production pipeline is genuinely nondeterministic \u2014 the platform cannot guarantee that synthesis from a given input set produces in-spec output. Veo / Sora / Runway-class generative video, and other AI-synthesis flows where output dimensions, duration, or quality vary per run. Implies a different validation contract: predictive `validate_input` is impossible; the platform's own post-synthesis QA loop applies; if the QA loop exhausts without producing a valid artifact, `build_creative` returns task_failed with a synthesis_failed reason. Distinct from `composition_model` (which describes how the surface composes per-slot rendering, not whether synthesis is deterministic). When false or absent, the format's production is predictable enough that `validate_input` can predict output properties from input properties.\n\n**Compatibility with `asset_source` / `item_production_model`**: `synthesis_nondeterministic: true` MAY pair with any of `seller_pre_rendered_from_brief`, `seller_human_designed`, or `agent_synthesized` (the QA loop is concept-level, not source-specific \u2014 'seller renders from brief but each retry differs' is just as nondeterministic as Veo). It MUST NOT pair with `buyer_uploaded` (the buyer ships pre-rendered bytes; there's no synthesis step to be nondeterministic about). It MUST NOT pair with `publisher_host_recorded` (the publisher's host produces a deterministic-from-script output even if the human voice varies). When `synthesis_nondeterministic: true` is set with an incompatible source, validators SHOULD reject with a structured error.").optional(), "slots": z.array(z.object({ "asset_group_id": z.string().describe("Canonical asset_group_id from /schemas/core/asset-group-vocabulary.json. Non-canonical IDs are valid but trigger soft warnings."), "asset_type": z.enum(["image", "video", "audio", "text", "markdown", "url", "html", "css", "javascript", "vast", "daast", "display_tag", "webhook", "brief", "catalog", "published_post", "zip", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]).describe("Discriminator selecting the asset schema this slot accepts. SDK codegen uses this to type the slot value. `display_tag` is the atomic third-party display representation (URL, inline markup, or paired redirect). `published_post` is an existing-post reference asset. `pixel_tracker` / `vast_tracker` / `daast_tracker` are renderer-fired tracker primitives. `object` is a last-resort fallback."), "required": z.boolean().describe("Whether this slot is required for a valid manifest.").optional(), "min": z.number().int().gte(0).describe("Minimum count for repeatable / pool slots.").optional(), "max": z.number().int().gte(1).describe("Maximum count for repeatable / pool slots.").optional(), "max_chars": z.number().int().gte(1).describe("Per-slot character limit. Valid only when `asset_type` is `text`, `markdown`, or `brief`. Mutually exclusive with `max_size_kb` (which applies to binary asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "max_size_kb": z.number().int().gte(1).describe("Per-slot file size limit in exact kilobytes, where 1 KB = 1,000 bytes. Valid only when `asset_type` is `image`, `video`, `audio`, or `zip`. Mutually exclusive with `max_chars` (which applies to text asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Accepted intrinsic-pixel densities for this image-bearing slot. Valid when `asset_type` is `image`, and on a `card` slot where it constrains each card's image media (video media is unaffected). This makes density available to every canonical carrying image assets (native, carousel, responsive, companion images, and image itself), not only `format_kind: image`. When the image canonical also declares top-level `params.pixel_ratios`, the effective set is the intersection; an empty intersection is invalid. One matching asset satisfies the slot unless `required_pixel_ratios` requires rendition coverage.").optional(), "required_pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Required density coverage for an image rendition set. Valid only when `asset_type` is `image` and `pixel_ratios` is also declared. Every value MUST appear in the effective accepted set after intersecting any top-level image `params.pixel_ratios`, and the manifest slot value MUST be an array containing exactly one matching image rendition for each required ratio. Other accepted ratios remain optional. For example, `pixel_ratios: [1, 1.5, 2]` with `required_pixel_ratios: [1, 2]` requires the 1x and 2x renditions while making 1.5x optional. SDKs enforce intersection, subset, coverage, and duplicate-ratio rules because JSON Schema draft-07 cannot express them generically.").optional(), "logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("When `asset_group_id` is `logo`, renderer-facing brand.json logo slots acceptable for this format slot. Producers selecting from brand.json SHOULD prefer `logos[]` entries whose `slots[]` intersects this list, then apply `visual_guidelines.logo_usage_rules[]`.").optional(), "required_logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Subset of `logo_slots` for which this format expects explicit logo coverage. A manifest or brand-derived logo pool SHOULD include at least one usable logo for each required slot; if coverage is missing, builders SHOULD surface a validation warning or approval mapping instead of guessing from prose.").optional(), "description": z.string().describe("Human-readable description of what the slot expects from the buyer.").optional(), "consumed_for_production": z.boolean().describe("Dispatch hint for `build_creative` and v1\u2194v2 wire translators: when `true`, the slot's value is consumed as INPUT to a production step (host-read script, brief copy fed to generative synthesis, catalog feed driving per-SKU rendering) and is not rendered verbatim. When `false` (default), the slot's value is rendered verbatim on the placement (image bytes, video file, display tag).\n\nMotivates the v1\u2194v2 dispatch table: pre-v2 buyers shipped production-consumed inputs separately in a `inputs` map on the build_creative request; v2 collapses inputs and rendered assets into a single `assets` map keyed by `asset_group_id`. SDK translators between v1 and v2 use this flag per canonical to know which assets in the v2 manifest map back to v1 `inputs` vs v1 `assets`. Without the per-slot flag the dispatch table lives in adopter code and every SDK gets it slightly different.\n\nProducers SHOULD set this explicitly on slots whose consumption pattern isn't obvious (host-read scripts on `audio_hosted`, briefs on generative `video_hosted`, catalog feeds on `sponsored_placement`). For canonicals where every slot is render-verbatim (`image`, `display_tag`, `video_vast`, `audio_vast`), the default `false` is sufficient and the flag MAY be omitted.").optional() }).catchall(z.any()).and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }), z.any().refine((value) => !z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }), z.any().refine((value) => !z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.union([z.any().refine((value) => !z.any().refine((value2) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema").safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.any().refine((value) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.any().refine((value) => !z.union([z.object({ "logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "required_logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]))), z.intersection(z.any(), z.intersection(z.union([z.any().refine((value) => !z.object({ "required_pixel_ratios": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "required_pixel_ratios": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "asset_type": z.literal("image").optional() }))]), z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }), z.any().refine((value) => !z.union([z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))])))))).describe("Default manifest slots; which are consumed depends on `supply_mode`. `state_canvases` images MUST carry `state_id` and `breakpoint_id`, and `state_click_urls` entries MUST carry `state_id` (semantic validators resolve the bindings). Component images SHOULD carry `focal_point` for deterministic seller cropping. `landing_page_url` is the default destination (see `clickthrough`). `font_files` MUST contain only buyer-licensed fonts; publisher-proprietary fonts never travel in manifests. Only image, video, text, url, zip, and pixel_tracker slot asset types are accepted \u2014 executable types (javascript, html, css, webhook) are rejected even via `slots` overrides.").optional(), "required_connections": z.array(z.object({ "provider": z.string().describe("Stable provider or platform namespace, preferably lowercase. Examples: `social.example`, `shortvideo.example`, or a seller-defined namespace. Omit only when the requirement is provider-agnostic, or when an `authorization_url` fully routes the human to the correct provider-specific connection flow.").optional(), "connection_type": z.enum(["advertiser_account", "publisher_identity", "post_authorization"]).describe("Kind of downstream connection required. `advertiser_account` is the platform account used to buy/manage ads. `publisher_identity` is the creator, page, channel, organization, or profile that owns source posts. `post_authorization` is a post-scoped grant when the platform authorizes individual posts instead of, or in addition to, the owning identity."), "required_for": z.array(z.string().min(1)).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Concrete AdCP protocol operation names that require this downstream connection. Sellers SHOULD include this in product declarations when the requirement is known ahead of time, and in AUTHORIZATION_REQUIRED details when it explains the failed operation. Prefer specific operation names such as `list_creatives`, `sync_creatives`, `create_media_buy`, `get_media_buy_delivery`, or `get_creative_delivery` over broad category labels such as `reporting`.").optional(), "scope": z.enum(["account", "identity", "post", "unknown"]).describe("Granularity of the downstream grant.").optional(), "status": z.enum(["connected", "missing", "pending", "expired", "revoked", "not_required", "unknown"]).describe("Current seller-observed state for this downstream connection when known. Product declarations MAY omit status or use `unknown`; AUTHORIZATION_REQUIRED details SHOULD use `missing`, `expired`, or `revoked` for the connection that blocked the call.").optional(), "connection_id": z.string().describe("Seller-defined identifier for an already-created downstream connection. Omit when no connection exists yet or when exposing it would leak platform/account state.").optional(), "resource_ref": z.object({ "platform_account_id": z.string().describe("Provider-native advertiser or business account id, when safe to disclose.").optional(), "identity_id": z.string().describe("Provider-native creator, page, channel, organization, or profile id, when safe to disclose.").optional(), "handle": z.string().describe("Provider-native public handle for the owning identity, when available.").optional(), "profile_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the owning identity, when available.").optional(), "post_id": z.string().describe("Provider-native post id, when the grant is post-scoped or the failed request referenced a specific post.").optional(), "post_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the referenced post, when available.").optional() }).catchall(z.any()).describe("Optional opaque provider-native resource hint, such as a platform account id, profile URL, handle, channel id, post id, or post URL. This is a hint for routing authorization, not proof that authorization exists.").optional(), "authorization_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Seller-hosted or provider-hosted URL where a human can complete or restore this downstream connection.").optional(), "authorization_instructions": z.string().describe("Human-readable instructions for completing or restoring this downstream connection.").optional(), "expires_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }), z.union([z.object({ "provider": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "authorization_url": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]))]).describe("Must also satisfy at least one of these alternatives.")).describe("A seller/platform-side connection or grant required by a product, format, or request. This is not the AdCP caller credential: the AdCP request is still authenticated once, and the seller uses these stored downstream connections to call a platform or service on the buyer's behalf. Use this shape for platforms that require more than one downstream grant, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.")).describe("Downstream platform connections or grants required to use this format declaration. These are in addition to the single AdCP caller credential. Use this when a platform product requires multiple downstream grants, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.").optional(), "reference_mutability": z.enum(["immutable_snapshot", "mutable_requires_reapproval", "mutable_auto_recheck"]).describe("Policy for formats whose `slots` accept a `published_post` reference. `immutable_snapshot`: seller snapshots the referenced post at approval and later source changes do not change the served creative. `mutable_requires_reapproval`: the source post may change and material changes require review before continued serving. `mutable_auto_recheck`: the source post may change and the seller continuously or periodically rechecks authorization/policy without requiring buyer resubmission. Omit when the format has no `published_post` slot.").optional(), "production_window_business_days": z.number().int().gte(0).describe("Typical production turnaround in business days when the format requires seller-side production (e.g., host-recording from a buyer-supplied script). 0 for synchronous (e.g., generative AI); >0 for human-produced (e.g., podcast host-read). Absent when no production is required (buyer uploads complete creative).").optional(), "supply_mode": z.enum(["components", "rendered_canvases", "layered_source"]).describe("Which end of the template contract the buyer feeds. `components`: buyer supplies component slots; seller renders states (no `state_canvases`/`layered_source` assets allowed). `rendered_canvases`: buyer supplies exactly one `state_canvases` image per declared state \xD7 breakpoint pair. `layered_source`: buyer ships design source (+ optional `font_files`); seller production derives states (`production_window_business_days` applies) \u2014 transitional for sellers without executable templates.").optional(), "states": z.array(z.object({ "state_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).describe("Stable identifier used by `state_canvases[].state_id` and `state_click_urls[].state_id`."), "anchoring": z.enum(["inline", "sticky_top", "sticky_bottom", "overlay", "fullscreen_overlay", "underlay"]).describe("`underlay` renders the canvas beneath page content, which scrolls over it (IAB New Ad Portfolio underlay class: skins, reveal units). Transitions into `overlay`/`fullscreen_overlay` states SHOULD be user-initiated; non-user-action entries emit LEAN policy warnings."), "slot_bindings": z.array(z.string().regex(new RegExp("^[a-z0-9_]+$"))).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Asset group IDs rendered in this state (components mode). Makes the template executable: given components and bindings, assembly is deterministic. Every value MUST resolve to a declared slot. Omitted means all supplied component slots may render.").optional(), "motion": z.enum(["static", "animated"]).describe("Whether the seller-rendered layout animates within this state (attract loops, load animations). Intra-state animation is seller-rendered; buyer canvases stay static images.").optional(), "max_animation_s": z.number().gt(0).describe("Upper bound on intra-state animation duration. Required when `motion` is `animated`.").optional(), "breakpoints": z.array(z.object({ "breakpoint_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).describe("Stable identifier used by `state_canvases[].breakpoint_id`."), "width": z.number().int().gte(1).optional(), "width_range": z.array(z.number().int().gte(1)).min(2).max(2).describe("Inclusive [minimum, maximum] accepted canvas width. The first value MUST be no greater than the second; semantic validators enforce ordering.").optional(), "width_mode": z.enum(["full_bleed", "gutter_residual"]).describe("Fluid width classes. `full_bleed`: edge-to-edge viewport width (IAB adhesion, topscroll). `gutter_residual`: the margin remaining beside the page content column (desktop skins). Fluid breakpoints cannot be targeted by `rendered_canvases` supply \u2014 semantic validation rejects that pairing.").optional(), "height": z.number().int().gte(1).optional(), "height_range": z.array(z.number().int().gte(1)).min(2).max(2).describe("Inclusive [minimum, maximum] accepted canvas height. The first value MUST be no greater than the second; semantic validators enforce ordering.").optional(), "viewport_height_percent": z.number().gt(0).lte(100).describe("Height as a percentage of the viewport (topscroll 80%, mobile skin panel 15%). Fluid; cannot be targeted by `rendered_canvases` supply.").optional(), "canvas_aspect_ratio": z.string().regex(new RegExp("^[0-9]+(\\.[0-9]+)?:[0-9]+(\\.[0-9]+)?$")).describe("Aspect ratio the rendered canvas maintains across the size range (IAB flexible units, ratio-bucket responsive). When both fixed `width` and `height` are declared, the ratio MUST be consistent with them.").optional() }).catchall(z.any()).and(z.intersection(z.union([z.object({ "width": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "width_range": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "width_mode": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.object({ "height": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "height_range": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "viewport_height_percent": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).min(1).superRefine((breakpoints, ctx) => {
2187
2187
  breakpoints.forEach((breakpoint, index) => {
2188
2188
  const widthKeys = ["width", "width_range", "width_mode"].filter((key) => breakpoint[key] !== void 0);
2189
2189
  const heightKeys = ["height", "height_range", "viewport_height_percent"].filter((key) => breakpoint[key] !== void 0);
@@ -2239,7 +2239,7 @@ const CanonicalFormatSellerRenderedStatefulDisplaySchema = /* @__PURE__ */ (() =
2239
2239
  ctx.addIssue({ code: "custom", path: [index, "input"], message: "scroll transitions require input=scroll" });
2240
2240
  }
2241
2241
  });
2242
- }), "clickthrough": z.enum(["required", "optional", "none"]).describe("Destination policy. `required` (default): manifest MUST supply `landing_page_url`. `optional`: click-optional units (in-feed brand units) may omit it. `none`: unit is non-clickable; manifests MUST NOT supply `landing_page_url` or `state_click_urls`. Per-state overrides via `state_click_urls` entries carrying `state_id`; `landing_page_url` is the fallback for unlisted states.").optional(), "user_controls": z.object({ "dismissible": z.boolean(), "user_collapsible": z.boolean() }).catchall(z.any()).describe("When any state anchors as `overlay` or `fullscreen_overlay`, either `dismissible` MUST be true or that state's `close_affordance` MUST be true (dismissibility floor; semantic validators enforce)."), "canvas_constraints": z.array(z.object({ "constraint": z.enum(["safe_area", "reserved_region", "decoration_only_edge", "no_text_or_logos"]), "state_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "breakpoint_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "region": z.object({ "x": z.number().gte(0), "y": z.number().gte(0), "width": z.number().gt(0), "height": z.number().gt(0), "unit": z.enum(["px", "percent"]).optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "unit": z.literal("percent") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "unit": z.literal("percent") }), z.object({ "x": z.any().optional(), "y": z.any().optional(), "width": z.any().optional(), "height": z.any().optional() }))])) }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "breakpoint_id": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "breakpoint_id": z.any().refine((value) => value !== void 0, "Required"), "state_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Rectangular rule applied to buyer artwork. State and breakpoint selectors are optional so the same shape can constrain a coordinated-placement component or a specific stateful-display canvas.")).describe("Rectangular areas constraining buyer artwork. Omitted state/breakpoint selectors apply the constraint to every canvas. For fluid or range-sized breakpoints, use percent-unit regions.").optional(), "duration_ms_range": z.array(z.union([z.number().int().gte(0), z.null()])).min(2).max(2).describe("Accepted embedded-video duration [min, max]. `duration_ms_exact` takes precedence when both are present.").optional().superRefine((range, ctx) => {
2242
+ }), "clickthrough": z.enum(["required", "optional", "none"]).describe("Destination policy. `required` (default): manifest MUST supply `landing_page_url`. `optional`: click-optional units (in-feed brand units) may omit it. `none`: unit is non-clickable; manifests MUST NOT supply `landing_page_url` or `state_click_urls`. Per-state overrides via `state_click_urls` entries carrying `state_id`; `landing_page_url` is the fallback for unlisted states.").optional(), "user_controls": z.object({ "dismissible": z.boolean(), "user_collapsible": z.boolean() }).catchall(z.any()).describe("When any state anchors as `overlay` or `fullscreen_overlay`, either `dismissible` MUST be true or that state's `close_affordance` MUST be true (dismissibility floor; semantic validators enforce)."), "canvas_constraints": z.array(z.object({ "constraint": z.enum(["safe_area", "reserved_region", "decoration_only_edge", "no_text_or_logos"]), "state_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "breakpoint_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "region": z.object({ "x": z.number().gte(0), "y": z.number().gte(0), "width": z.number().gt(0), "height": z.number().gt(0), "unit": z.enum(["px", "percent"]).optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "unit": z.literal("percent") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "unit": z.literal("percent") }), z.object({ "x": z.any().optional(), "y": z.any().optional(), "width": z.any().optional(), "height": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")) }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "breakpoint_id": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "breakpoint_id": z.any().refine((value) => value !== void 0, "Required"), "state_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Rectangular rule applied to buyer artwork. State and breakpoint selectors are optional so the same shape can constrain a coordinated-placement component or a specific stateful-display canvas.")).describe("Rectangular areas constraining buyer artwork. Omitted state/breakpoint selectors apply the constraint to every canvas. For fluid or range-sized breakpoints, use percent-unit regions.").optional(), "duration_ms_range": z.array(z.union([z.number().int().gte(0), z.null()])).min(2).max(2).describe("Accepted embedded-video duration [min, max]. `duration_ms_exact` takes precedence when both are present.").optional().superRefine((range, ctx) => {
2243
2243
  if (range !== void 0 && !range.some((value) => value !== null)) {
2244
2244
  ctx.addIssue({ code: "custom", path: [], message: "duration_ms_range requires at least one finite bound" });
2245
2245
  }
@@ -2643,7 +2643,7 @@ const CommittedMetricSchema = /* @__PURE__ */ (() => z.union([z.object({
2643
2643
  committed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
2644
2644
  }).passthrough()]))();
2645
2645
  const AudienceCharacteristicSchema = /* @__PURE__ */ (() => z.object({
2646
- dimension: z.union([z.literal("age"), z.object({}).passthrough()]).and(z.string()),
2646
+ dimension: z.union([z.literal("age"), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.").and(z.string()),
2647
2647
  value: z.union([z.string(), z.number(), z.boolean(), z.array(z.union([z.string(), z.number(), z.boolean()]))]).optional(),
2648
2648
  range: z.object({
2649
2649
  min: z.number().optional(),
@@ -2655,8 +2655,8 @@ const AudienceCharacteristicSchema = /* @__PURE__ */ (() => z.object({
2655
2655
  value_id: z.string().min(1).optional()
2656
2656
  }).passthrough().optional(),
2657
2657
  label: z.string().optional()
2658
- }).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
2659
- dimension: z.union([z.literal("age"), z.object({}).passthrough()]).and(z.string()),
2658
+ }).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
2659
+ dimension: z.union([z.literal("age"), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.").and(z.string()),
2660
2660
  value: z.union([z.string(), z.number(), z.boolean(), z.array(z.union([z.string(), z.number(), z.boolean()]))]).optional(),
2661
2661
  range: z.object({
2662
2662
  min: z.number().optional(),
@@ -2873,7 +2873,7 @@ const CoordinatedPlacementInlineParamsRuntimeSchemas = /* @__PURE__ */ (() => ({
2873
2873
  agent_placement: CanonicalFormatAgentPlacementAISurfaceSponsoredPlacementSchema,
2874
2874
  seller_rendered_stateful_display: CanonicalFormatSellerRenderedStatefulDisplaySchema
2875
2875
  }))();
2876
- const CanonicalFormatCoordinatedPlacementsSchema = /* @__PURE__ */ (() => z.object({ "experimental": z.boolean().describe("Experimental in AdCP 3.2 while the creative working group gathers implementation evidence for atomic cross-placement composition.").optional(), "deprecated": z.boolean().describe("When true, this canonical (or a seller's specific narrowing of it) is going away. Existing adopters are supported through the deprecation cycle; new adoption is discouraged. Pair with `migration_target_version` to indicate when the canonical is expected to be removed. Distinct from `experimental`: an experimental canonical may stabilize and stop being experimental; a deprecated canonical is on a sunset path.").optional(), "v1_translatable": z.boolean().describe("No v1 named-format equivalent can express a coordinated multi-placement buy.").optional(), "since_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version that introduced this canonical (e.g., '3.1', '3.2'). Lets adopters reason about minimum protocol version requirements when consuming a format declaration. Patch precision is intentionally rejected \u2014 canonicals are introduced at minor-version boundaries.").optional(), "migration_target_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version by which the working group expects this canonical to stabilize, surface a breaking revision, or (when `deprecated: true`) be removed. Patch precision is intentionally rejected \u2014 canonicals shift at minor-version boundaries. Absence signals 'no specific target' (omit the field rather than use a placeholder like 'unknown').").optional(), "composition_model": z.enum(["deterministic", "algorithmic"]).describe("Whether the surface composes deterministically (buyer can predict per-slot rendering \u2014 sponsored_placement, image, video) or algorithmically (surface chooses combinations or phrasing \u2014 responsive_creative, agent_placement).").optional(), "provenance_required": z.boolean().describe("When true, the product rejects unsigned synthesized assets. Builders calling build_creative MUST attach a C2PA-compatible provenance manifest attributing synthesis to the creative agent.").optional(), "platform_extensions": z.array(z.object({ "uri": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("HTTPS URL identifying the extension. `https://` is mandatory \u2014 `http://`, `file://`, `data:`, and other schemes are rejected at the schema layer (defense-in-depth on top of the fetch-contract normative rules). The URI base is the owning agent's URL; the path identifies the extension within that agent. Example: 'https://creative.adcontextprotocol.org/translated/meta/extensions/meta_pixel'. The full fetch contract \u2014 SSRF allowlist, response-size cap, $ref sandbox, schema-compile bounds \u2014 is documented on `product-format-declaration.json#format_schema` and applies to ALL fetches of this reference shape regardless of whether the field is named `format_schema` (load-bearing for validation) or `platform_extensions` (informational); the *transport* rules are identical, only the *consumption* semantics differ."), "digest": z.string().regex(new RegExp("^sha256:[a-f0-9]{64}$")).describe("SHA-256 content digest of the extension definition (sha256:<hex>). Used to detect drift \u2014 if the agent revises the extension, the digest changes and cached definitions become invalid.") }).catchall(z.any()).describe("Reference to a platform extension definition. The agent that owns the URI is authoritative for the extension's schema. Buyers fetch the definition once per content digest and cache it. Platform extensions are typically bundled in `get_products` responses under an `extensions` map keyed by `uri@digest`, eliminating the need for a separate fetch.\n\n**Within a single response**, multiple references to the same `uri` MUST carry the same `digest` \u2014 divergent digests in one response indicate producer-side error (e.g., concurrent extension revision mid-render). Buyers encountering divergent digests for the same URI MUST fail closed: treat all references to that URI as unresolved and surface a validation error rather than picking one branch silently. **Across responses**, digest divergence is normal \u2014 extension authors revise their schemas, the new digest differs, the cache key changes, and the buyer refetches. Cache by `uri@digest`, not by `uri` alone.")).describe('Platform-specific extensions narrowing the canonical (pixel ID shapes, conversion event taxonomies, platform-specific CTAs/destinations). Each extension is a URI+digest reference resolved against the bundled `extensions` map in get_products responses or fetched directly.\n\n**Collision precedence (normative).** When two or more `platform_extensions[]` entries on the same declaration extend the same target (e.g., both extend `tracking`) with overlapping field names, **array order is authoritative \u2014 later entries override earlier ones on a per-field basis** (last-in-array-wins). SDKs MUST surface the overlap via the `errors[]` array on the `get_products` response with a structured code (`FORMAT_DECLARATION_DIVERGENT` is appropriate when the overlap appears across dual-emitted shapes; a producer-self-emitted overlap on a single declaration SHOULD use the same code with `error.details: { collision_kind: "platform_extension_field", target, overlapping_fields, winning_extension_uri }`). Producers SHOULD avoid the collision by emitting one extension per target or by partitioning fields across extensions; the deterministic precedence is for last-resort consistency across SDK implementations, not a sanctioned merging strategy.').optional(), "synthesis_nondeterministic": z.boolean().describe("When true, the format's production pipeline is genuinely nondeterministic \u2014 the platform cannot guarantee that synthesis from a given input set produces in-spec output. Veo / Sora / Runway-class generative video, and other AI-synthesis flows where output dimensions, duration, or quality vary per run. Implies a different validation contract: predictive `validate_input` is impossible; the platform's own post-synthesis QA loop applies; if the QA loop exhausts without producing a valid artifact, `build_creative` returns task_failed with a synthesis_failed reason. Distinct from `composition_model` (which describes how the surface composes per-slot rendering, not whether synthesis is deterministic). When false or absent, the format's production is predictable enough that `validate_input` can predict output properties from input properties.\n\n**Compatibility with `asset_source` / `item_production_model`**: `synthesis_nondeterministic: true` MAY pair with any of `seller_pre_rendered_from_brief`, `seller_human_designed`, or `agent_synthesized` (the QA loop is concept-level, not source-specific \u2014 'seller renders from brief but each retry differs' is just as nondeterministic as Veo). It MUST NOT pair with `buyer_uploaded` (the buyer ships pre-rendered bytes; there's no synthesis step to be nondeterministic about). It MUST NOT pair with `publisher_host_recorded` (the publisher's host produces a deterministic-from-script output even if the human voice varies). When `synthesis_nondeterministic: true` is set with an incompatible source, validators SHOULD reject with a structured error.").optional(), "slots": z.array(z.object({ "asset_group_id": z.string().describe("Canonical asset_group_id from /schemas/core/asset-group-vocabulary.json. Non-canonical IDs are valid but trigger soft warnings."), "asset_type": z.enum(["image", "video", "audio", "text", "markdown", "url", "html", "css", "javascript", "vast", "daast", "display_tag", "webhook", "brief", "catalog", "published_post", "zip", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]).describe("Discriminator selecting the asset schema this slot accepts. SDK codegen uses this to type the slot value. `display_tag` is the atomic third-party display representation (URL, inline markup, or paired redirect). `published_post` is an existing-post reference asset. `pixel_tracker` / `vast_tracker` / `daast_tracker` are renderer-fired tracker primitives. `object` is a last-resort fallback."), "required": z.boolean().describe("Whether this slot is required for a valid manifest.").optional(), "min": z.number().int().gte(0).describe("Minimum count for repeatable / pool slots.").optional(), "max": z.number().int().gte(1).describe("Maximum count for repeatable / pool slots.").optional(), "max_chars": z.number().int().gte(1).describe("Per-slot character limit. Valid only when `asset_type` is `text`, `markdown`, or `brief`. Mutually exclusive with `max_size_kb` (which applies to binary asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "max_size_kb": z.number().int().gte(1).describe("Per-slot file size limit in exact kilobytes, where 1 KB = 1,000 bytes. Valid only when `asset_type` is `image`, `video`, `audio`, or `zip`. Mutually exclusive with `max_chars` (which applies to text asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Accepted intrinsic-pixel densities for this image-bearing slot. Valid when `asset_type` is `image`, and on a `card` slot where it constrains each card's image media (video media is unaffected). This makes density available to every canonical carrying image assets (native, carousel, responsive, companion images, and image itself), not only `format_kind: image`. When the image canonical also declares top-level `params.pixel_ratios`, the effective set is the intersection; an empty intersection is invalid. One matching asset satisfies the slot unless `required_pixel_ratios` requires rendition coverage.").optional(), "required_pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Required density coverage for an image rendition set. Valid only when `asset_type` is `image` and `pixel_ratios` is also declared. Every value MUST appear in the effective accepted set after intersecting any top-level image `params.pixel_ratios`, and the manifest slot value MUST be an array containing exactly one matching image rendition for each required ratio. Other accepted ratios remain optional. For example, `pixel_ratios: [1, 1.5, 2]` with `required_pixel_ratios: [1, 2]` requires the 1x and 2x renditions while making 1.5x optional. SDKs enforce intersection, subset, coverage, and duplicate-ratio rules because JSON Schema draft-07 cannot express them generically.").optional(), "logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("When `asset_group_id` is `logo`, renderer-facing brand.json logo slots acceptable for this format slot. Producers selecting from brand.json SHOULD prefer `logos[]` entries whose `slots[]` intersects this list, then apply `visual_guidelines.logo_usage_rules[]`.").optional(), "required_logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Subset of `logo_slots` for which this format expects explicit logo coverage. A manifest or brand-derived logo pool SHOULD include at least one usable logo for each required slot; if coverage is missing, builders SHOULD surface a validation warning or approval mapping instead of guessing from prose.").optional(), "description": z.string().describe("Human-readable description of what the slot expects from the buyer.").optional(), "consumed_for_production": z.boolean().describe("Dispatch hint for `build_creative` and v1\u2194v2 wire translators: when `true`, the slot's value is consumed as INPUT to a production step (host-read script, brief copy fed to generative synthesis, catalog feed driving per-SKU rendering) and is not rendered verbatim. When `false` (default), the slot's value is rendered verbatim on the placement (image bytes, video file, display tag).\n\nMotivates the v1\u2194v2 dispatch table: pre-v2 buyers shipped production-consumed inputs separately in a `inputs` map on the build_creative request; v2 collapses inputs and rendered assets into a single `assets` map keyed by `asset_group_id`. SDK translators between v1 and v2 use this flag per canonical to know which assets in the v2 manifest map back to v1 `inputs` vs v1 `assets`. Without the per-slot flag the dispatch table lives in adopter code and every SDK gets it slightly different.\n\nProducers SHOULD set this explicitly on slots whose consumption pattern isn't obvious (host-read scripts on `audio_hosted`, briefs on generative `video_hosted`, catalog feeds on `sponsored_placement`). For canonicals where every slot is render-verbatim (`image`, `display_tag`, `video_vast`, `audio_vast`), the default `false` is sufficient and the flag MAY be omitted.").optional() }).catchall(z.any()).and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }), z.any().refine((value) => !z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }), z.any().refine((value) => !z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.union([z.any().refine((value) => !z.any().refine((value2) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema").safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.any().refine((value) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.any().refine((value) => !z.union([z.object({ "logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "required_logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]))), z.intersection(z.any(), z.intersection(z.union([z.any().refine((value) => !z.object({ "required_pixel_ratios": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "required_pixel_ratios": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "asset_type": z.literal("image").optional() }))]), z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }), z.any().refine((value) => !z.union([z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))])))))).describe("Programmatic declaration of which canonical asset_group_id slots a manifest targeting this format must (or may) populate. Lets SDK codegen and validators enumerate expected slots without parsing the format's prose description. Each entry references an asset_group_id from the canonical vocabulary registry, paired with an `asset_type` so the validator knows which asset schema to apply. Format-level narrowing parameters that apply across all slots (e.g., flat `headline_max_chars` on responsive_creative) may also live on the format declaration; per-slot constraints (a specific slot's `max_chars` or `max_size_kb`) live on the slot entry.").optional(), "required_connections": z.array(z.object({ "provider": z.string().describe("Stable provider or platform namespace, preferably lowercase. Examples: `social.example`, `shortvideo.example`, or a seller-defined namespace. Omit only when the requirement is provider-agnostic, or when an `authorization_url` fully routes the human to the correct provider-specific connection flow.").optional(), "connection_type": z.enum(["advertiser_account", "publisher_identity", "post_authorization"]).describe("Kind of downstream connection required. `advertiser_account` is the platform account used to buy/manage ads. `publisher_identity` is the creator, page, channel, organization, or profile that owns source posts. `post_authorization` is a post-scoped grant when the platform authorizes individual posts instead of, or in addition to, the owning identity."), "required_for": z.array(z.string().min(1)).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Concrete AdCP protocol operation names that require this downstream connection. Sellers SHOULD include this in product declarations when the requirement is known ahead of time, and in AUTHORIZATION_REQUIRED details when it explains the failed operation. Prefer specific operation names such as `list_creatives`, `sync_creatives`, `create_media_buy`, `get_media_buy_delivery`, or `get_creative_delivery` over broad category labels such as `reporting`.").optional(), "scope": z.enum(["account", "identity", "post", "unknown"]).describe("Granularity of the downstream grant.").optional(), "status": z.enum(["connected", "missing", "pending", "expired", "revoked", "not_required", "unknown"]).describe("Current seller-observed state for this downstream connection when known. Product declarations MAY omit status or use `unknown`; AUTHORIZATION_REQUIRED details SHOULD use `missing`, `expired`, or `revoked` for the connection that blocked the call.").optional(), "connection_id": z.string().describe("Seller-defined identifier for an already-created downstream connection. Omit when no connection exists yet or when exposing it would leak platform/account state.").optional(), "resource_ref": z.object({ "platform_account_id": z.string().describe("Provider-native advertiser or business account id, when safe to disclose.").optional(), "identity_id": z.string().describe("Provider-native creator, page, channel, organization, or profile id, when safe to disclose.").optional(), "handle": z.string().describe("Provider-native public handle for the owning identity, when available.").optional(), "profile_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the owning identity, when available.").optional(), "post_id": z.string().describe("Provider-native post id, when the grant is post-scoped or the failed request referenced a specific post.").optional(), "post_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the referenced post, when available.").optional() }).catchall(z.any()).describe("Optional opaque provider-native resource hint, such as a platform account id, profile URL, handle, channel id, post id, or post URL. This is a hint for routing authorization, not proof that authorization exists.").optional(), "authorization_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Seller-hosted or provider-hosted URL where a human can complete or restore this downstream connection.").optional(), "authorization_instructions": z.string().describe("Human-readable instructions for completing or restoring this downstream connection.").optional(), "expires_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }), z.union([z.object({ "provider": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "authorization_url": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]))])).describe("A seller/platform-side connection or grant required by a product, format, or request. This is not the AdCP caller credential: the AdCP request is still authenticated once, and the seller uses these stored downstream connections to call a platform or service on the buyer's behalf. Use this shape for platforms that require more than one downstream grant, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.")).describe("Downstream platform connections or grants required to use this format declaration. These are in addition to the single AdCP caller credential. Use this when a platform product requires multiple downstream grants, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.").optional(), "reference_mutability": z.enum(["immutable_snapshot", "mutable_requires_reapproval", "mutable_auto_recheck"]).describe("Policy for formats whose `slots` accept a `published_post` reference. `immutable_snapshot`: seller snapshots the referenced post at approval and later source changes do not change the served creative. `mutable_requires_reapproval`: the source post may change and material changes require review before continued serving. `mutable_auto_recheck`: the source post may change and the seller continuously or periodically rechecks authorization/policy without requiring buyer resubmission. Omit when the format has no `published_post` slot.").optional(), "production_window_business_days": z.number().int().gte(0).describe("Typical production turnaround in business days when the format requires seller-side production (e.g., host-recording from a buyer-supplied script). 0 for synchronous (e.g., generative AI); >0 for human-produced (e.g., podcast host-read). Absent when no production is required (buyer uploads complete creative).").optional(), "components": z.array(z.object({ "component_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).describe("Stable coordination-local component identifier. Values MUST be unique within `components[]`."), "placement_ref": z.object({ "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring a publisher-catalog placement is hosted, or the inventory publisher associated with an inline placement. Omitted only for legacy single-publisher product-context references.").optional(), "placement_id": z.string().describe("Placement ID from the publisher's adagents.json placement catalog, or an inline seller-defined placement ID interpreted within the enclosing seller and product context.") }).catchall(z.any()).describe("Public product placement this component supplies. MUST resolve against the containing product's `placements[]`."), "required": z.boolean(), "sequence": z.number().int().gte(1).describe("Declared presentation order for sequential-messaging coordinated buys. Components sharing a sequence value present simultaneously; absent means unordered/simultaneous (default). Sequence declares seller-rendered ordering, not buyer-controlled timing.").optional(), "serving_policy": z.enum(["seller_served_only", "third_party_allowed"]).describe("Per-component serving/tracking policy. Some sellers restrict specific components (e.g., page skins) to first-party serving while allowing third-party tags on sibling components. Defaults to the product-level policy when absent.").optional(), "canvas_constraints": z.array(z.object({ "constraint": z.enum(["safe_area", "reserved_region", "decoration_only_edge", "no_text_or_logos"]), "state_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "breakpoint_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "region": z.object({ "x": z.number().gte(0), "y": z.number().gte(0), "width": z.number().gt(0), "height": z.number().gt(0), "unit": z.enum(["px", "percent"]).optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "unit": z.literal("percent") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "unit": z.literal("percent") }), z.object({ "x": z.any().optional(), "y": z.any().optional(), "width": z.any().optional(), "height": z.any().optional() }))])) }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "breakpoint_id": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "breakpoint_id": z.any().refine((value) => value !== void 0, "Required"), "state_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Rectangular rule applied to buyer artwork. State and breakpoint selectors are optional so the same shape can constrain a coordinated-placement component or a specific stateful-display canvas.")).describe("Artwork constraints applied to this component, including safe areas and seller-reserved regions.").optional(), "format_option_ref": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
2876
+ const CanonicalFormatCoordinatedPlacementsSchema = /* @__PURE__ */ (() => z.object({ "experimental": z.boolean().describe("Experimental in AdCP 3.2 while the creative working group gathers implementation evidence for atomic cross-placement composition.").optional(), "deprecated": z.boolean().describe("When true, this canonical (or a seller's specific narrowing of it) is going away. Existing adopters are supported through the deprecation cycle; new adoption is discouraged. Pair with `migration_target_version` to indicate when the canonical is expected to be removed. Distinct from `experimental`: an experimental canonical may stabilize and stop being experimental; a deprecated canonical is on a sunset path.").optional(), "v1_translatable": z.boolean().describe("No v1 named-format equivalent can express a coordinated multi-placement buy.").optional(), "since_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version that introduced this canonical (e.g., '3.1', '3.2'). Lets adopters reason about minimum protocol version requirements when consuming a format declaration. Patch precision is intentionally rejected \u2014 canonicals are introduced at minor-version boundaries.").optional(), "migration_target_version": z.string().regex(new RegExp("^[1-9]\\d*\\.(0|[1-9]\\d*)$")).describe("AdCP MAJOR.MINOR version by which the working group expects this canonical to stabilize, surface a breaking revision, or (when `deprecated: true`) be removed. Patch precision is intentionally rejected \u2014 canonicals shift at minor-version boundaries. Absence signals 'no specific target' (omit the field rather than use a placeholder like 'unknown').").optional(), "composition_model": z.enum(["deterministic", "algorithmic"]).describe("Whether the surface composes deterministically (buyer can predict per-slot rendering \u2014 sponsored_placement, image, video) or algorithmically (surface chooses combinations or phrasing \u2014 responsive_creative, agent_placement).").optional(), "provenance_required": z.boolean().describe("When true, the product rejects unsigned synthesized assets. Builders calling build_creative MUST attach a C2PA-compatible provenance manifest attributing synthesis to the creative agent.").optional(), "platform_extensions": z.array(z.object({ "uri": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("HTTPS URL identifying the extension. `https://` is mandatory \u2014 `http://`, `file://`, `data:`, and other schemes are rejected at the schema layer (defense-in-depth on top of the fetch-contract normative rules). The URI base is the owning agent's URL; the path identifies the extension within that agent. Example: 'https://creative.adcontextprotocol.org/translated/meta/extensions/meta_pixel'. The full fetch contract \u2014 SSRF allowlist, response-size cap, $ref sandbox, schema-compile bounds \u2014 is documented on `product-format-declaration.json#format_schema` and applies to ALL fetches of this reference shape regardless of whether the field is named `format_schema` (load-bearing for validation) or `platform_extensions` (informational); the *transport* rules are identical, only the *consumption* semantics differ."), "digest": z.string().regex(new RegExp("^sha256:[a-f0-9]{64}$")).describe("SHA-256 content digest of the extension definition (sha256:<hex>). Used to detect drift \u2014 if the agent revises the extension, the digest changes and cached definitions become invalid.") }).catchall(z.any()).describe("Reference to a platform extension definition. The agent that owns the URI is authoritative for the extension's schema. Buyers fetch the definition once per content digest and cache it. Platform extensions are typically bundled in `get_products` responses under an `extensions` map keyed by `uri@digest`, eliminating the need for a separate fetch.\n\n**Within a single response**, multiple references to the same `uri` MUST carry the same `digest` \u2014 divergent digests in one response indicate producer-side error (e.g., concurrent extension revision mid-render). Buyers encountering divergent digests for the same URI MUST fail closed: treat all references to that URI as unresolved and surface a validation error rather than picking one branch silently. **Across responses**, digest divergence is normal \u2014 extension authors revise their schemas, the new digest differs, the cache key changes, and the buyer refetches. Cache by `uri@digest`, not by `uri` alone.")).describe('Platform-specific extensions narrowing the canonical (pixel ID shapes, conversion event taxonomies, platform-specific CTAs/destinations). Each extension is a URI+digest reference resolved against the bundled `extensions` map in get_products responses or fetched directly.\n\n**Collision precedence (normative).** When two or more `platform_extensions[]` entries on the same declaration extend the same target (e.g., both extend `tracking`) with overlapping field names, **array order is authoritative \u2014 later entries override earlier ones on a per-field basis** (last-in-array-wins). SDKs MUST surface the overlap via the `errors[]` array on the `get_products` response with a structured code (`FORMAT_DECLARATION_DIVERGENT` is appropriate when the overlap appears across dual-emitted shapes; a producer-self-emitted overlap on a single declaration SHOULD use the same code with `error.details: { collision_kind: "platform_extension_field", target, overlapping_fields, winning_extension_uri }`). Producers SHOULD avoid the collision by emitting one extension per target or by partitioning fields across extensions; the deterministic precedence is for last-resort consistency across SDK implementations, not a sanctioned merging strategy.').optional(), "synthesis_nondeterministic": z.boolean().describe("When true, the format's production pipeline is genuinely nondeterministic \u2014 the platform cannot guarantee that synthesis from a given input set produces in-spec output. Veo / Sora / Runway-class generative video, and other AI-synthesis flows where output dimensions, duration, or quality vary per run. Implies a different validation contract: predictive `validate_input` is impossible; the platform's own post-synthesis QA loop applies; if the QA loop exhausts without producing a valid artifact, `build_creative` returns task_failed with a synthesis_failed reason. Distinct from `composition_model` (which describes how the surface composes per-slot rendering, not whether synthesis is deterministic). When false or absent, the format's production is predictable enough that `validate_input` can predict output properties from input properties.\n\n**Compatibility with `asset_source` / `item_production_model`**: `synthesis_nondeterministic: true` MAY pair with any of `seller_pre_rendered_from_brief`, `seller_human_designed`, or `agent_synthesized` (the QA loop is concept-level, not source-specific \u2014 'seller renders from brief but each retry differs' is just as nondeterministic as Veo). It MUST NOT pair with `buyer_uploaded` (the buyer ships pre-rendered bytes; there's no synthesis step to be nondeterministic about). It MUST NOT pair with `publisher_host_recorded` (the publisher's host produces a deterministic-from-script output even if the human voice varies). When `synthesis_nondeterministic: true` is set with an incompatible source, validators SHOULD reject with a structured error.").optional(), "slots": z.array(z.object({ "asset_group_id": z.string().describe("Canonical asset_group_id from /schemas/core/asset-group-vocabulary.json. Non-canonical IDs are valid but trigger soft warnings."), "asset_type": z.enum(["image", "video", "audio", "text", "markdown", "url", "html", "css", "javascript", "vast", "daast", "display_tag", "webhook", "brief", "catalog", "published_post", "zip", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]).describe("Discriminator selecting the asset schema this slot accepts. SDK codegen uses this to type the slot value. `display_tag` is the atomic third-party display representation (URL, inline markup, or paired redirect). `published_post` is an existing-post reference asset. `pixel_tracker` / `vast_tracker` / `daast_tracker` are renderer-fired tracker primitives. `object` is a last-resort fallback."), "required": z.boolean().describe("Whether this slot is required for a valid manifest.").optional(), "min": z.number().int().gte(0).describe("Minimum count for repeatable / pool slots.").optional(), "max": z.number().int().gte(1).describe("Maximum count for repeatable / pool slots.").optional(), "max_chars": z.number().int().gte(1).describe("Per-slot character limit. Valid only when `asset_type` is `text`, `markdown`, or `brief`. Mutually exclusive with `max_size_kb` (which applies to binary asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "max_size_kb": z.number().int().gte(1).describe("Per-slot file size limit in exact kilobytes, where 1 KB = 1,000 bytes. Valid only when `asset_type` is `image`, `video`, `audio`, or `zip`. Mutually exclusive with `max_chars` (which applies to text asset types). Schema enforces via if/then so a producer can't set both on the same slot.").optional(), "pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Accepted intrinsic-pixel densities for this image-bearing slot. Valid when `asset_type` is `image`, and on a `card` slot where it constrains each card's image media (video media is unaffected). This makes density available to every canonical carrying image assets (native, carousel, responsive, companion images, and image itself), not only `format_kind: image`. When the image canonical also declares top-level `params.pixel_ratios`, the effective set is the intersection; an empty intersection is invalid. One matching asset satisfies the slot unless `required_pixel_ratios` requires rendition coverage.").optional(), "required_pixel_ratios": z.array(z.number().gt(0)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Required density coverage for an image rendition set. Valid only when `asset_type` is `image` and `pixel_ratios` is also declared. Every value MUST appear in the effective accepted set after intersecting any top-level image `params.pixel_ratios`, and the manifest slot value MUST be an array containing exactly one matching image rendition for each required ratio. Other accepted ratios remain optional. For example, `pixel_ratios: [1, 1.5, 2]` with `required_pixel_ratios: [1, 2]` requires the 1x and 2x renditions while making 1.5x optional. SDKs enforce intersection, subset, coverage, and duplicate-ratio rules because JSON Schema draft-07 cannot express them generically.").optional(), "logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("When `asset_group_id` is `logo`, renderer-facing brand.json logo slots acceptable for this format slot. Producers selecting from brand.json SHOULD prefer `logos[]` entries whose `slots[]` intersects this list, then apply `visual_guidelines.logo_usage_rules[]`.").optional(), "required_logo_slots": z.array(z.enum(["logo_card_light", "logo_card_dark", "profile_mark", "favicon", "app_icon", "social_profile_mark", "nav_header", "footer", "email_header", "watermark", "ad_end_card", "co_brand_lockup", "marketplace_listing"]).describe("Canonical renderer-facing logo slot. Use when selecting a logo variant from brand.json for a specific UI or creative placement.")).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Subset of `logo_slots` for which this format expects explicit logo coverage. A manifest or brand-derived logo pool SHOULD include at least one usable logo for each required slot; if coverage is missing, builders SHOULD surface a validation warning or approval mapping instead of guessing from prose.").optional(), "description": z.string().describe("Human-readable description of what the slot expects from the buyer.").optional(), "consumed_for_production": z.boolean().describe("Dispatch hint for `build_creative` and v1\u2194v2 wire translators: when `true`, the slot's value is consumed as INPUT to a production step (host-read script, brief copy fed to generative synthesis, catalog feed driving per-SKU rendering) and is not rendered verbatim. When `false` (default), the slot's value is rendered verbatim on the placement (image bytes, video file, display tag).\n\nMotivates the v1\u2194v2 dispatch table: pre-v2 buyers shipped production-consumed inputs separately in a `inputs` map on the build_creative request; v2 collapses inputs and rendered assets into a single `assets` map keyed by `asset_group_id`. SDK translators between v1 and v2 use this flag per canonical to know which assets in the v2 manifest map back to v1 `inputs` vs v1 `assets`. Without the per-slot flag the dispatch table lives in adopter code and every SDK gets it slightly different.\n\nProducers SHOULD set this explicitly on slots whose consumption pattern isn't obvious (host-read scripts on `audio_hosted`, briefs on generative `video_hosted`, catalog feeds on `sponsored_placement`). For canonicals where every slot is render-verbatim (`image`, `display_tag`, `video_vast`, `audio_vast`), the default `false` is sufficient and the flag MAY be omitted.").optional() }).catchall(z.any()).and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["text", "markdown", "brief"]) }), z.any().refine((value) => !z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.intersection(z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["image", "video", "audio", "zip"]) }), z.any().refine((value) => !z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]), z.union([z.any().refine((value) => !z.any().refine((value2) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema").safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.any().refine((value) => !z.object({ "asset_group_id": z.literal("logo") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.any().refine((value) => !z.union([z.object({ "logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "required_logo_slots": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))]))), z.intersection(z.any(), z.intersection(z.union([z.any().refine((value) => !z.object({ "required_pixel_ratios": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "required_pixel_ratios": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "asset_type": z.literal("image").optional() }))]), z.union([z.any().refine((value) => !z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "asset_type": z.enum(["url", "catalog", "published_post", "html", "css", "javascript", "webhook", "daast", "vast", "display_tag", "card", "object", "pixel_tracker", "vast_tracker", "daast_tracker"]) }), z.any().refine((value) => !z.union([z.object({ "max_chars": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "max_size_kb": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"))])))))).describe("Programmatic declaration of which canonical asset_group_id slots a manifest targeting this format must (or may) populate. Lets SDK codegen and validators enumerate expected slots without parsing the format's prose description. Each entry references an asset_group_id from the canonical vocabulary registry, paired with an `asset_type` so the validator knows which asset schema to apply. Format-level narrowing parameters that apply across all slots (e.g., flat `headline_max_chars` on responsive_creative) may also live on the format declaration; per-slot constraints (a specific slot's `max_chars` or `max_size_kb`) live on the slot entry.").optional(), "required_connections": z.array(z.object({ "provider": z.string().describe("Stable provider or platform namespace, preferably lowercase. Examples: `social.example`, `shortvideo.example`, or a seller-defined namespace. Omit only when the requirement is provider-agnostic, or when an `authorization_url` fully routes the human to the correct provider-specific connection flow.").optional(), "connection_type": z.enum(["advertiser_account", "publisher_identity", "post_authorization"]).describe("Kind of downstream connection required. `advertiser_account` is the platform account used to buy/manage ads. `publisher_identity` is the creator, page, channel, organization, or profile that owns source posts. `post_authorization` is a post-scoped grant when the platform authorizes individual posts instead of, or in addition to, the owning identity."), "required_for": z.array(z.string().min(1)).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Concrete AdCP protocol operation names that require this downstream connection. Sellers SHOULD include this in product declarations when the requirement is known ahead of time, and in AUTHORIZATION_REQUIRED details when it explains the failed operation. Prefer specific operation names such as `list_creatives`, `sync_creatives`, `create_media_buy`, `get_media_buy_delivery`, or `get_creative_delivery` over broad category labels such as `reporting`.").optional(), "scope": z.enum(["account", "identity", "post", "unknown"]).describe("Granularity of the downstream grant.").optional(), "status": z.enum(["connected", "missing", "pending", "expired", "revoked", "not_required", "unknown"]).describe("Current seller-observed state for this downstream connection when known. Product declarations MAY omit status or use `unknown`; AUTHORIZATION_REQUIRED details SHOULD use `missing`, `expired`, or `revoked` for the connection that blocked the call.").optional(), "connection_id": z.string().describe("Seller-defined identifier for an already-created downstream connection. Omit when no connection exists yet or when exposing it would leak platform/account state.").optional(), "resource_ref": z.object({ "platform_account_id": z.string().describe("Provider-native advertiser or business account id, when safe to disclose.").optional(), "identity_id": z.string().describe("Provider-native creator, page, channel, organization, or profile id, when safe to disclose.").optional(), "handle": z.string().describe("Provider-native public handle for the owning identity, when available.").optional(), "profile_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the owning identity, when available.").optional(), "post_id": z.string().describe("Provider-native post id, when the grant is post-scoped or the failed request referenced a specific post.").optional(), "post_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Public URL for the referenced post, when available.").optional() }).catchall(z.any()).describe("Optional opaque provider-native resource hint, such as a platform account id, profile URL, handle, channel id, post id, or post URL. This is a hint for routing authorization, not proof that authorization exists.").optional(), "authorization_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("Seller-hosted or provider-hosted URL where a human can complete or restore this downstream connection.").optional(), "authorization_instructions": z.string().describe("Human-readable instructions for completing or restoring this downstream connection.").optional(), "expires_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "status": z.enum(["missing", "pending", "expired", "revoked"]) }), z.union([z.object({ "provider": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "authorization_url": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]))]).describe("Must also satisfy at least one of these alternatives.")).describe("A seller/platform-side connection or grant required by a product, format, or request. This is not the AdCP caller credential: the AdCP request is still authenticated once, and the seller uses these stored downstream connections to call a platform or service on the buyer's behalf. Use this shape for platforms that require more than one downstream grant, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.")).describe("Downstream platform connections or grants required to use this format declaration. These are in addition to the single AdCP caller credential. Use this when a platform product requires multiple downstream grants, such as an advertiser account connection plus a publisher identity or post authorization for published-post references.").optional(), "reference_mutability": z.enum(["immutable_snapshot", "mutable_requires_reapproval", "mutable_auto_recheck"]).describe("Policy for formats whose `slots` accept a `published_post` reference. `immutable_snapshot`: seller snapshots the referenced post at approval and later source changes do not change the served creative. `mutable_requires_reapproval`: the source post may change and material changes require review before continued serving. `mutable_auto_recheck`: the source post may change and the seller continuously or periodically rechecks authorization/policy without requiring buyer resubmission. Omit when the format has no `published_post` slot.").optional(), "production_window_business_days": z.number().int().gte(0).describe("Typical production turnaround in business days when the format requires seller-side production (e.g., host-recording from a buyer-supplied script). 0 for synchronous (e.g., generative AI); >0 for human-produced (e.g., podcast host-read). Absent when no production is required (buyer uploads complete creative).").optional(), "components": z.array(z.object({ "component_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).describe("Stable coordination-local component identifier. Values MUST be unique within `components[]`."), "placement_ref": z.object({ "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring a publisher-catalog placement is hosted, or the inventory publisher associated with an inline placement. Omitted only for legacy single-publisher product-context references.").optional(), "placement_id": z.string().describe("Placement ID from the publisher's adagents.json placement catalog, or an inline seller-defined placement ID interpreted within the enclosing seller and product context.") }).catchall(z.any()).describe("Public product placement this component supplies. MUST resolve against the containing product's `placements[]`."), "required": z.boolean(), "sequence": z.number().int().gte(1).describe("Declared presentation order for sequential-messaging coordinated buys. Components sharing a sequence value present simultaneously; absent means unordered/simultaneous (default). Sequence declares seller-rendered ordering, not buyer-controlled timing.").optional(), "serving_policy": z.enum(["seller_served_only", "third_party_allowed"]).describe("Per-component serving/tracking policy. Some sellers restrict specific components (e.g., page skins) to first-party serving while allowing third-party tags on sibling components. Defaults to the product-level policy when absent.").optional(), "canvas_constraints": z.array(z.object({ "constraint": z.enum(["safe_area", "reserved_region", "decoration_only_edge", "no_text_or_logos"]), "state_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "breakpoint_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).optional(), "region": z.object({ "x": z.number().gte(0), "y": z.number().gte(0), "width": z.number().gt(0), "height": z.number().gt(0), "unit": z.enum(["px", "percent"]).optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "unit": z.literal("percent") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "unit": z.literal("percent") }), z.object({ "x": z.any().optional(), "y": z.any().optional(), "width": z.any().optional(), "height": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")) }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "breakpoint_id": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "breakpoint_id": z.any().refine((value) => value !== void 0, "Required"), "state_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Rectangular rule applied to buyer artwork. State and breakpoint selectors are optional so the same shape can constrain a coordinated-placement component or a specific stateful-display canvas.")).describe("Artwork constraints applied to this component, including safe areas and seller-reserved regions.").optional(), "format_option_ref": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
2877
2877
  const schemas = [z.object({ "scope": z.literal("publisher").describe("Reference resolves against the named publisher's adagents.json top-level `formats[]` catalog."), "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Publisher domain where the adagents.json declaring this format option is hosted."), "format_option_id": z.string().describe("Stable format option ID from the publisher's adagents.json top-level `formats[]`, matching a publisher-catalog-backed entry in the target product's `format_options[]`.") }).catchall(z.any()).describe("Selects a publisher-catalog-backed product format option by publisher domain and format option ID."), z.object({ "scope": z.literal("product").describe("Reference resolves only against the target product's inline `format_options[]`."), "format_option_id": z.string().describe("Stable format option ID from the target product's inline `format_options[]`."), "publisher_domain": z.never().optional() }).catchall(z.any()).describe('Selects a product-local format option by ID within the enclosing package/product context. This branch deliberately forbids `publisher_domain` (`publisher_domain: false` in the schema) because product-local references are namespaced by the enclosing product only; include `scope: "publisher"` when the selector must cross into a publisher catalog.')];
2878
2878
  const { errors, failed } = schemas.reduce(
2879
2879
  ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
@@ -2898,7 +2898,7 @@ const CanonicalFormatCoordinatedPlacementsSchema = /* @__PURE__ */ (() => z.obje
2898
2898
  message: "Invalid input: Should pass single schema. Passed " + passed
2899
2899
  });
2900
2900
  }
2901
- })).describe("Reference to a sibling `format_options[]` entry on the same product. It MUST NOT resolve to `custom` or `coordinated_placements`.").optional(), "format_kind": z.string().optional(), "params": z.record(z.string(), z.any()).optional() }).catchall(z.any()).and(z.union([z.object({ "format_option_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "format_kind": z.any().refine((value) => value !== void 0, "Required"), "params": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]))).min(2).superRefine((components, ctx) => {
2901
+ })).describe("Reference to a sibling `format_options[]` entry on the same product. It MUST NOT resolve to `custom` or `coordinated_placements`.").optional(), "format_kind": z.string().optional(), "params": z.record(z.string(), z.any()).optional() }).catchall(z.any()).and(z.union([z.object({ "format_option_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "format_kind": z.any().refine((value) => value !== void 0, "Required"), "params": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives."))).min(2).superRefine((components, ctx) => {
2902
2902
  if (!components.some((component) => component.required === true)) {
2903
2903
  ctx.addIssue({ code: "custom", path: [], message: "At least one component must be required" });
2904
2904
  }
@@ -3025,7 +3025,7 @@ const SignalIDSchema = /* @__PURE__ */ (() => z.union([z.object({
3025
3025
  agent_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"),
3026
3026
  id: z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$"))
3027
3027
  }).passthrough()]))();
3028
- const SignalListingSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
3028
+ const SignalListingSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
3029
3029
  signal_ref: SignalRefSchema.optional(),
3030
3030
  signal_id: SignalIDSchema.optional(),
3031
3031
  name: z.string().optional(),
@@ -3040,7 +3040,7 @@ const SignalListingSchema = /* @__PURE__ */ (() => z.object({}).passthrough().me
3040
3040
  }).passthrough().optional(),
3041
3041
  restricted_attributes: z.array(RestrictedAttributeSchema).optional(),
3042
3042
  demographic_predicate: DemographicPredicateSchema.optional()
3043
- }).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
3043
+ }).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
3044
3044
  signal_ref: SignalRefSchema.optional(),
3045
3045
  signal_id: SignalIDSchema.optional(),
3046
3046
  name: z.string().optional(),
@@ -3055,7 +3055,7 @@ const SignalListingSchema = /* @__PURE__ */ (() => z.object({}).passthrough().me
3055
3055
  }).passthrough().optional(),
3056
3056
  restricted_attributes: z.array(RestrictedAttributeSchema).optional(),
3057
3057
  demographic_predicate: DemographicPredicateSchema.optional()
3058
- }).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
3058
+ }).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
3059
3059
  signal_ref: SignalRefSchema.optional(),
3060
3060
  signal_id: SignalIDSchema.optional(),
3061
3061
  name: z.string().optional(),
@@ -3418,25 +3418,7 @@ const UpdateMediaBuyAsyncInputRequiredSchema = /* @__PURE__ */ (() => z.object({
3418
3418
  context: ContextObjectSchema.optional(),
3419
3419
  ext: ExtensionObjectSchema.optional()
3420
3420
  }).passthrough())();
3421
- const MediaBuyDeliveryWebhookResultSchema = /* @__PURE__ */ (() => z.object({
3422
- notification_type: z.union([z.literal("scheduled"), z.literal("final"), z.literal("delayed"), z.literal("adjusted"), z.literal("window_update")]),
3423
- partial_data: z.boolean().optional(),
3424
- unavailable_count: z.number().int().gte(0).optional(),
3425
- sequence_number: z.number().int().gte(1).optional(),
3426
- next_expected_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
3427
- reporting_period: z.object({
3428
- start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
3429
- end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
3430
- timezone: z.string().min(1).optional()
3431
- }).passthrough(),
3432
- currency: z.string().regex(new RegExp("^[A-Z]{3}$")).optional(),
3433
- attribution_window: AttributionWindowSchema.optional(),
3434
- media_buy_deliveries: z.array(z.object({}).passthrough()),
3435
- errors: z.array(ErrorSchema).optional(),
3436
- sandbox: z.boolean().optional(),
3437
- context: ContextObjectSchema.optional(),
3438
- ext: ExtensionObjectSchema.optional()
3439
- }).passthrough())();
3421
+ const MediaBuyDeliveryWebhookResultSchema = /* @__PURE__ */ (() => z.object({ "notification_type": z.enum(["scheduled", "final", "delayed", "adjusted", "window_update"]).describe("Type of delivery-report notification: scheduled = regular periodic update, final = campaign completed, delayed = data not yet available, adjusted = corrected data for the same window, window_update = a wider measurement window supersedes a prior window."), "partial_data": z.boolean().describe("Indicates if any media buys in this webhook have missing or delayed data.").optional(), "unavailable_count": z.number().int().gte(0).describe("Number of media buys with reporting_delayed or failed status when partial_data is true.").optional(), "sequence_number": z.number().int().gte(1).describe("Sequential notification number for this reporting webhook stream.").optional(), "next_expected_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "reporting_period": z.object({ "start": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), "end": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), "timezone": z.string().min(1).describe("Reporting timezone applied to this report, as 'UTC' or an IANA timezone identifier. Same meaning as get_media_buy_delivery reporting_period.timezone. Sellers SHOULD return it whenever every reported media buy shares one reporting timezone.").optional() }).catchall(z.any()).describe("Period covered by the delivery report. start and end are instants on the reporting timezone's period boundaries (the products' reporting_capabilities.timezone, echoed in timezone). They fall on UTC midnight only when that timezone is UTC."), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")).describe("Deprecated in AdCP 3.2 and removed in AdCP 4.0. Optional legacy report-wide ISO 4217 currency code. It may be used only when every monetary value in the report has that denomination. A report can contain media buys with different currencies, so buyers MUST NOT interpret this field as an aggregation currency or evidence of currency conversion. Prefer media_buy_deliveries[].currency when present and package-level currency otherwise.").optional(), "attribution_window": z.object({ "post_click": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-click attribution window. Conversions occurring within this duration after a click are attributed to the ad.").optional(), "post_view": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-view attribution window. Conversions occurring within this duration after an ad impression (without click) are attributed to the ad.").optional(), "model": z.enum(["last_touch", "first_touch", "linear", "time_decay", "data_driven"]).describe("Attribution model used to assign credit when multiple touchpoints exist. SHOULD be populated when committing to a specific model; when absent, the seller's default applies.").optional() }).catchall(z.any()).describe("Attribution methodology and lookback windows used for conversion metrics in this report.").optional(), "media_buy_deliveries": z.array(z.object({ "media_buy_id": z.string().describe("Seller's media buy identifier."), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")).describe("ISO 4217 denomination for monetary values in this media-buy delivery row, including totals, package spend, and currency-denominated package rates. Sellers SHOULD populate this field whenever all monetary values in the row share one currency. For AdCP-authored buys it MUST equal the media-buy currency, and every by_package[].currency MUST equal it. For a legacy or externally created mixed-currency buy, omit this field and all monetary or money-derived values from row totals; report those values only at package level with each package's own currency. AdCP does not perform currency conversion.").optional(), "status": z.enum(["pending_creatives", "pending_start", "pending", "active", "paused", "completed", "rejected", "canceled", "failed", "reporting_delayed"]).describe("Current media buy lifecycle or reporting status. This is distinct from the webhook envelope's top-level task status."), "expected_availability": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "is_adjusted": z.boolean().describe("Indicates this row contains updated data for a previously reported period.").optional(), "is_final": z.boolean().describe("Whether this row's delivery data is final for the reporting period.").optional(), "finalized_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "pricing_model": z.enum(["cpm", "vcpm", "cpc", "cpcv", "cpv", "cpp", "cpa", "revenue_share", "flat_rate", "time"]).describe("Supported pricing models for advertising products").optional(), "pacing_index": z.number().gte(0).describe("Aggregate media-buy delivery pace relative to the media-buy pacing plan. Authoritative for seller-optimized buys.").optional(), "totals": z.intersection(z.object({ "impressions": z.number().gte(0).describe("Impressions delivered").optional(), "spend": z.number().gte(0).describe("Amount spent").optional(), "clicks": z.number().gte(0).describe("Total clicks").optional(), "ctr": z.number().gte(0).lte(1).describe("Click-through rate (clicks/impressions)").optional(), "views": z.number().gte(0).describe("Content engagements counted toward the billable view threshold. For video this is a platform-defined view event (e.g., 30 seconds or video midpoint); for audio/podcast it is a stream start; for other formats it follows the pricing model's view definition. When the package uses CPV pricing, spend = views \xD7 rate.").optional(), "completed_views": z.number().gte(0).describe("Video/audio completions. When the package has a completed_views optimization goal with view_duration_seconds, completions are counted at that threshold rather than 100% completion.").optional(), "completion_rate": z.union([z.number().gte(0).lte(1).describe("Completion rate (completed_views/impressions). Null indicates the metric is not applicable to this package/buy (e.g. completion rate on a non-video buy)."), z.null().describe("Completion rate (completed_views/impressions). Null indicates the metric is not applicable to this package/buy (e.g. completion rate on a non-video buy).")]).describe("Completion rate (completed_views/impressions). Null indicates the metric is not applicable to this package/buy (e.g. completion rate on a non-video buy).").optional(), "conversions": z.number().gte(0).describe("Total conversions attributed to this delivery. When by_event_type is present, this equals the sum of all by_event_type[].count entries.").optional(), "conversion_value": z.number().gte(0).describe("Total monetary value of attributed conversions (in the reporting currency)").optional(), "commissionable_value": z.number().gte(0).describe("Settled portion of attributed conversion value eligible for revenue-share commission, in the reporting currency. For revenue_share pricing, spend = round_currency(commissionable_value \xD7 commission_rate). This is distinct from conversion_value because taxes, shipping, discounts, returns, cancellations, or ineligible items may be excluded under the agreed commission basis.").optional(), "roas": z.number().gte(0).describe("Return on ad spend (conversion_value / spend)").optional(), "cost_per_acquisition": z.number().gte(0).describe("Cost per conversion (spend / conversions)").optional(), "new_to_brand_rate": z.number().gte(0).lte(1).describe("Fraction of `conversions` (transactions) from first-time brand buyers, 0 = none, 1 = all. For retail-media unit-volume tracking of first-time buyers, see `new_to_brand_units` (count, not rate).").optional(), "leads": z.number().gte(0).describe("Leads generated (convenience alias for by_event_type where event_type='lead')").optional(), "incremental_sales_lift": z.number().gte(0).describe("Incremental sales lift attributed to the campaign \u2014 sales above the control/holdout baseline. Reported as a fraction (0.15 = 15% lift) or as an absolute value depending on seller convention. The seller's `attribution_methodology` qualifier (typically `deterministic_purchase` or `modeled`) and `attribution_window` qualifier on the matching `committed_metrics` entry disambiguate the methodology and window.").optional(), "brand_lift": z.number().gte(0).describe("Brand lift \u2014 measured change in a brand metric (awareness, consideration, favorability, purchase intent, or ad recall) attributed to the campaign. Typically panel-based or survey-based. Reported as a fraction (0.05 = 5% lift). **Multidimensional in production** \u2014 Kantar, Upwave, Cint, DV all report each dimension separately with its own sample size and confidence interval. The dimension flows through `qualifier.lift_dimension` on `committed_metrics` / `by_package[].metric_values` (`awareness` | `consideration` | `favorability` | `purchase_intent` | `ad_recall`); rows under different dimensions are different surveyed outcomes and must not be combined. Use `attribution_methodology: 'panel_based'` qualifier when the underlying methodology is a panel.").optional(), "foot_traffic": z.number().gte(0).describe("Store visits attributed to ad exposure. Count of incremental visits over baseline. Typically uses location-data panel methodology (`attribution_methodology: 'panel_based'`) or deterministic loyalty-card match (`attribution_methodology: 'deterministic_purchase'`).").optional(), "conversion_lift": z.number().gte(0).describe("Incremental conversions attributed to the campaign \u2014 conversions above the control/holdout baseline. Reported as a fraction (0.10 = 10% lift) or as an absolute count depending on seller convention. Distinct from `conversions` (raw count of attributed conversions); conversion_lift requires a control group and an incrementality methodology.").optional(), "brand_search_lift": z.number().gte(0).describe("Lift in brand search query volume attributed to the campaign \u2014 measured via search-data partnerships (Google, Microsoft) or survey methodology. Reported as a fraction (0.20 = 20% lift in branded search).").optional(), "plays": z.number().gte(0).describe("Number of times the ad creative was displayed or played on DOOH or broadcast inventory. Raw play count before any impression multiplier is applied. Mirrors `forecastable-metric.json`'s `plays` token for forecast\u2194delivery reconciliation. Distinct from `dooh_metrics.loop_plays` (scheduled-rotation count) and from `impressions` (multiplied audience figure).").optional(), "measurement_source": z.string().regex(new RegExp("^[a-z0-9_]+$")).max(64).describe("Third-party measurement provider whose data produced this row's audience numbers. Mirrors delivery-forecast.json's measurement_source so forecast and delivery reconcile on the same declaration \u2014 distinct from demographic_system, which specifies demographic notation. Makes measured-channel rows (radio, broadcast, OOH) self-describing: a reconciliation join can tie delivered numbers to the system that measured them without consulting out-of-band context. Lowercase slug format.").optional(), "by_event_type": z.array(z.object({ "event_type": z.enum(["page_view", "view_content", "select_content", "select_item", "search", "share", "add_to_cart", "remove_from_cart", "viewed_cart", "add_to_wishlist", "initiate_checkout", "add_payment_info", "purchase", "refund", "lead", "qualify_lead", "close_convert_lead", "disqualify_lead", "complete_registration", "subscribe", "follow", "content_view", "watch_milestone", "start_trial", "app_install", "app_launch", "contact", "schedule", "donate", "submit_application", "custom"]).describe("The event type"), "event_source_id": z.string().describe("Event source that produced these conversions (for disambiguation when multiple event sources are configured)").optional(), "count": z.number().gte(0).describe("Number of events of this type"), "value": z.number().gte(0).describe("Total monetary value of events of this type").optional() }).catchall(z.any())).describe("Conversion metrics broken down by event type. Spend-derived metrics (ROAS, CPA) are only available at the package/totals level since spend cannot be attributed to individual event types.").optional(), "grps": z.number().gte(0).describe("Gross Rating Points delivered (for CPP)").optional(), "reach": z.number().gte(0).describe("Unique reach in the units specified by reach_unit. When reach_unit is omitted, units are unspecified \u2014 do not compare reach values across packages or media buys without a common reach_unit. The measurement window for this value is declared in `reach_window`; when `reach_window` is omitted, the window is unspecified and buyers MUST NOT sum reach across reports (the value MAY be a daily snapshot, a cumulative total, or something else).").optional(), "reach_unit": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Unit of measurement for the reach field. Aligns with the reach_unit declared on optimization goals and delivery forecasts. Required when reach is present to enable cross-platform comparison.").optional(), "reach_window": z.object({ "kind": z.enum(["cumulative", "period", "rolling"]).describe("Window semantics. `cumulative` \u2014 uniques since campaign start; the value is the total unique count to date and MUST NOT be summed across rows (each later row supersedes the earlier value). `period` \u2014 uniques within a single non-overlapping reporting period (e.g., a daily snapshot for a specific calendar day). Adjacent `period` rows do not share audiences by construction, but the same person MAY appear across multiple periods, so MUST NOT be summed across rows to compute campaign reach. `rolling` \u2014 uniques within a trailing window ending at the row's reporting timestamp (e.g., trailing-7-day reach). Adjacent rolling rows overlap and MUST NOT be summed; each row's value stands alone."), "period": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Duration of the measurement window. REQUIRED when `kind` is `period` or `rolling` \u2014 declares the snapshot length (e.g., `{"interval": 1, "unit": "days"}` for a daily snapshot) or the trailing-window length (e.g., `{"interval": 7, "unit": "days"}` for trailing-7-day rolling reach). When `kind` is `cumulative`, this field is implicit (campaign-to-date) and SHOULD be omitted.').optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "kind": z.enum(["period", "rolling"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "kind": z.enum(["period", "rolling"]) }), z.object({ "period": z.any().refine((value) => value !== void 0, "Required") }).passthrough())]).describe("Must also satisfy at least one of these alternatives.")).describe("Measurement window for the reported `reach` and `frequency` values in this row. Declares whether the values are a per-period snapshot, a trailing rolling window, or cumulative-to-date \u2014 without this declaration, buyers summing `reach` across rows (e.g., daily delivery reports) can silently double-count audiences. Sellers SHOULD populate this whenever `reach` is present.").optional(), "frequency": z.number().gte(0).describe("Average frequency per reach unit, measured over the window declared in `reach_window`. When `reach_unit` is 'households', this is average exposures per household; when 'accounts', per logged-in account; etc. When `reach_window` is omitted, the window is unspecified \u2014 buyers MUST NOT compare or average frequency values across rows.").optional(), "quartile_data": z.union([z.object({ "q1_views": z.number().gte(0).describe("25% completion views").optional(), "q2_views": z.number().gte(0).describe("50% completion views").optional(), "q3_views": z.number().gte(0).describe("75% completion views").optional(), "q4_views": z.number().gte(0).describe("100% completion views").optional() }).describe("Audio/video quartile completion data. Null indicates the metric is not applicable to this package/buy (e.g. quartile data on a non-video buy). Individual quartiles are addressable via the leaf metric identities `quartile_25` (q1_views), `quartile_50` (q2_views), `quartile_75` (q3_views), and `quartile_100` (q4_views) for declaration, commitments, aggregates, and breakdown sorting; this object remains the canonical carrier of the values. Quartiles are player-fired events (VAST firstQuartile/midpoint/thirdQuartile/complete). `quartile_100` counts 100%-of-duration completions and is distinct from `completed_views`, which counts completions at the seller's billable view threshold (`view_duration_seconds`) when one is set."), z.null().describe("Audio/video quartile completion data. Null indicates the metric is not applicable to this package/buy (e.g. quartile data on a non-video buy). Individual quartiles are addressable via the leaf metric identities `quartile_25` (q1_views), `quartile_50` (q2_views), `quartile_75` (q3_views), and `quartile_100` (q4_views) for declaration, commitments, aggregates, and breakdown sorting; this object remains the canonical carrier of the values. Quartiles are player-fired events (VAST firstQuartile/midpoint/thirdQuartile/complete). `quartile_100` counts 100%-of-duration completions and is distinct from `completed_views`, which counts completions at the seller's billable view threshold (`view_duration_seconds`) when one is set.")]).describe("Audio/video quartile completion data. Null indicates the metric is not applicable to this package/buy (e.g. quartile data on a non-video buy). Individual quartiles are addressable via the leaf metric identities `quartile_25` (q1_views), `quartile_50` (q2_views), `quartile_75` (q3_views), and `quartile_100` (q4_views) for declaration, commitments, aggregates, and breakdown sorting; this object remains the canonical carrier of the values. Quartiles are player-fired events (VAST firstQuartile/midpoint/thirdQuartile/complete). `quartile_100` counts 100%-of-duration completions and is distinct from `completed_views`, which counts completions at the seller's billable view threshold (`view_duration_seconds`) when one is set.").optional(), "time_based_views": z.array(z.object({ "threshold_seconds": z.number().gt(0).describe("Continuous duration threshold in seconds an impression must meet to count as a view in this entry."), "basis": z.enum(["play_time", "in_view"]).describe("Whether the threshold clock runs on playback time or in-view time. Required because play-time and in-view counts at the same threshold are materially different numbers."), "views": z.number().gte(0).describe("Count of views meeting this entry's threshold and basis."), "standard": z.enum(["mrc", "groupm"]).describe("Viewability standard governing the in-view clock for this entry. RECOMMENDED when basis is 'in_view' (MRC and GroupM thresholds differ); not applicable to play_time entries.").optional() }).catchall(z.any())).describe("Time-threshold video view counts. Each entry reports views that met a continuous duration threshold under a stated basis, rather than a completion percentage (percentage-based completion is quartile_data). Thresholds of 2 and 6 seconds are RECOMMENDED cross-platform reporting points; any seller-defined threshold is permitted. One entry per (threshold_seconds, basis) pair per reporting period \u2014 sellers MUST de-duplicate before emission and MUST NOT emit the same pair twice; buyers MAY treat duplicate pairs as a seller-side conformance bug. Entries under different bases are different metrics and MUST NOT be summed (see view-threshold-basis). Primarily an autoplay/skippable-video metric (social, olv, in-feed video); completion metrics remain the currency for lean-back CTV/cinema inventory. Distinct from `views` (the single billable-threshold scalar) and from `viewability.viewed_seconds` (average in-view duration, not a threshold count). Array entries are not individually sortable in breakdown sort_by. Disclosure-grade surface: (threshold_seconds, basis) is not part of the committed-metric qualifier vocabulary, so a `committed_metrics` entry for `time_based_views` contracts the array's presence, not specific thresholds.").optional(), "dooh_metrics": z.object({ "loop_plays": z.number().int().gte(0).describe("Number of times ad played in rotation").optional(), "screens_used": z.number().int().gte(0).describe("Number of unique screens displaying the ad").optional(), "screen_time_seconds": z.number().int().gte(0).describe("Total display time in seconds").optional(), "sov_achieved": z.number().gte(0).lte(1).describe("Actual share of voice delivered on a 0.0-1.0 scale. To compare this achieved value with the selected flat-rate DOOH parameters.sov_percentage, multiply sov_achieved by 100. Share is time-weighted: the sum of the delivered segment durations divided by the full loop duration. On equal-duration loops this equals the slot-count ratio. See also ooh_metrics.share_of_voice_contracted, which uses the same 0.0-1.0 scale.").optional(), "calculation_notes": z.string().describe("Per-row supplementary methodology notes for DOOH impression calculation (e.g., 'rotation-based; 6-second slot weighted by 70% audience overlap'). Free-form prose for context that doesn't fit the structured measurement-vendor surface. Canonical methodology declarations belong on the measurement vendor's `get_adcp_capabilities.measurement.metrics[]` block where they're discoverable once and inherited across delivery rows; this field is for row-specific context (a particular daypart's calculation, a venue-mix exception) rather than the seller's general methodology.").optional(), "venue_breakdown": z.array(z.object({ "venue_id": z.string().describe("Venue identifier"), "venue_name": z.string().describe("Human-readable venue name").optional(), "venue_type": z.string().describe("Venue type (e.g., 'airport', 'transit', 'retail', 'billboard')").optional(), "impressions": z.number().int().gte(0).describe("Impressions delivered at this venue"), "loop_plays": z.number().int().gte(0).describe("Loop plays at this venue").optional(), "screens_used": z.number().int().gte(0).describe("Number of screens used at this venue").optional() }).catchall(z.any())).describe("Per-venue performance breakdown").optional() }).catchall(z.any()).describe("DOOH-specific metrics (only included for DOOH campaigns)").optional(), "ooh_metrics": z.object({ "panels": z.array(z.object({ "identifiers": z.array(z.object({ "id": z.string().describe("Panel/face identifier within the id_type namespace"), "id_type": z.enum(["geopath", "route_frame", "plant_face", "other"]).describe("Identifier scheme: geopath (US Geopath Spot ID), route_frame (UK Route frame ID), plant_face (the operator's own panel number \u2014 the identifier both sides of a direct contract know), other (markets without a listed scheme). New schemes ship as enum additions in minors.") }).catchall(z.any())).min(1).describe("All identifiers for this panel, one entry per scheme"), "name": z.string().describe("Human-readable location description (e.g., 'I-95 N of Exit 12, right-hand read')").optional() }).catchall(z.any())).describe("Panels (faces) covered by this row. A panel commonly carries multiple identifiers at once \u2014 OOH contracts key line items on the measurement-currency panel number AND the operator's own panel number together.").optional(), "posting_period_start": z.string().date().describe("First in-charge date of the posting period this row covers").optional(), "posting_period_end": z.string().date().describe("Last date of the posting period this row covers").optional(), "average_posted_date": z.string().date().describe("Average actual posting date across the row's units \u2014 the date the display term runs from under OAAA Bulletin \xA72.2 / Poster \xA73.2(a) when materials were timely. Read with materials_timely to know whether that rule was in force.").optional(), "materials_timely": z.boolean().describe("Seller's assertion that the buyer delivered acceptable materials by the contractual deadline, which determines whether the \xA72.2 posting-completion rule (term runs from average posting date) applied. An assertion about the buyer's delivery, not a derived value \u2014 it is not recomputable from postings[] evidence, and is the one field in this block that isn't checkable against it.").optional(), "share_of_voice_contracted": z.number().gte(0).lte(1).describe("Contracted share of voice where the buy is rotation-based (e.g., rotary bulletin programs) rather than an exclusive face, on a 0.0-1.0 scale. Share is time-weighted: the sum of contracted display durations divided by the full rotation duration. On equal-duration rotations this equals the slot-count ratio.").optional(), "illuminated_hours": z.number().gte(0).lte(24).describe("Contracted daily illumination hours for the panels in this row. Determines the measured day-part basis (12/18/24-hour impressions) and the illumination-credit remedy when unmet.").optional(), "estimated_impressions": z.number().int().gte(0).describe("Modeled audience impressions for the panels and period in this row. This is the channel's delivery number \u2014 there is no event-counted alternative. The methodology tier MUST be declared in estimation_basis; provider identity is declared in the row-level measurement_source; the billing vendor is declared in measurement_terms.billing_measurement. The row's top-level impressions SHOULD carry the same value so cross-channel aggregation works without channel-specific logic.").optional(), "estimation_basis": z.enum(["currency_measured", "seller_modeled"]).describe("Methodology tier of estimated_impressions: currency_measured (an audience measurement currency's estimate for the panel and period \u2014 Geopath, Route, MOVE, COMMB \u2014 with the provider named in the row-level measurement_source) or seller_modeled (the seller's own model \u2014 the honest fallback for markets without a measurement currency). Tier, not provider: currencies change over time, so provider identity is data on measurement_source, not values in this enum.").optional(), "postings": z.array(z.object({ "panel_id": z.string().describe("Panel reference matching one of panels[].identifiers[].id"), "event_type": z.enum(["posted", "rotated", "repaired", "removed"]).describe("What the record attests: initial posting, rotary rotation to a new face, repair/reposting after damage, or removal at flight end").default("posted"), "occurred_at": z.string().date().describe("Date the attested event happened. For posted events this is the posting date \u2014 display terms customarily run from the average posting date across units."), "evidence": z.object({ "url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("The evidence artifact \u2014 photograph, scanned tearsheet, or evidence package"), "captured_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "latitude": z.number().gte(-90).lte(90).describe("Capture location latitude").optional(), "longitude": z.number().gte(-180).lte(180).describe("Capture location longitude").optional(), "notes": z.string().describe("Context that doesn't fit the structured fields (e.g., 'shot from the eastbound approach at 40mph equivalent')").optional() }).catchall(z.any()).describe("Evidence artifact for this event (completion photograph); capture time and location ride the artifact").optional() }).catchall(z.any())).describe("Posting records \u2014 the seller-attested settlement artifact proving each panel was posted for the period. Industry convention (OAAA model contracts, Proof of Performance \xA73.5): photo evidence per bulletin within five calendar days of posting and again after each rotary rotation; one representative close-up photograph per creative design variation for poster showings (no deadline attached). Distinct from the \xA72.2 posting-completion obligation (posting within five business days of the scheduled date), which governs average_posted_date, not evidence.").optional(), "calculation_notes": z.string().describe("Row-specific methodology context that doesn't fit the structured fields (e.g., a partial-period proration or a market-specific estimate adjustment). Same role as dooh_metrics.calculation_notes \u2014 canonical methodology declarations belong on the measurement vendor's discoverable surfaces, not here.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "estimated_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "estimated_impressions": z.any().refine((value) => value !== void 0, "Required"), "estimation_basis": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Classic (static) OOH metrics \u2014 printed bulletins, posters, transit, and street furniture (only included for ooh campaigns). Experimental in AdCP 3.2. Static units have no play event: the delivery number is a period-level modeled audience estimate whose methodology tier is declared in estimation_basis (provider identity rides the row-level measurement_source), and the settlement artifact is the posting record \u2014 it proves the posting period, not an airing.").optional(), "viewability": z.object({ "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where /.well-known/brand.json is hosted, or the brand's operating domain"), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand identifier within the house portfolio. Optional for single-brand domains.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit for a global/default identity. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account identity and is not delivery targeting.").optional(), "industries": z.array(z.string()).describe("Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json.").optional(), "data_subject_contestation": z.object({ "url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).optional(), "email": z.string().email().optional(), "languages": z.array(z.string()).optional() }).strict().and(z.union([z.object({ "url": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "email": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand \u2192 house \u2192 missing.").optional(), "brand_kit_override": z.object({ "logo": z.object({ "asset_type": z.literal("image").describe("Discriminator identifying this as an image asset. See /schemas/creative/asset-types for the registry."), "url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to the image asset"), "width": z.number().int().gte(1).describe("Width in pixels"), "height": z.number().int().gte(1).describe("Height in pixels"), "file_size_bytes": z.number().int().gte(1).describe("Image file size in bytes. Required by agents that advertise a max_file_size_kb constraint.").optional(), "pixel_ratio": z.number().gt(0).describe("Intrinsic pixels per logical render pixel (for example `2` for a 600\xD7500 image intended to render at 300\xD7250). Optional because a validator can infer the ratio when the target format declares logical dimensions. When supplied, it MUST agree with both `width / logical_width` and `height / logical_height`; it is never a substitute for the intrinsic `width` and `height` fields.").optional(), "state_id": z.string().describe("Binding used only when this image populates a `seller_rendered_stateful_display` `state_canvases` slot. It MUST match one declared `states[].state_id` (semantic validators resolve it). Omit for ordinary image slots.").optional(), "breakpoint_id": z.string().describe("Binding used only when this image populates a `seller_rendered_stateful_display` `state_canvases` slot. It MUST match one breakpoint declared on the selected state (semantic validators resolve it). Omit for ordinary image slots.").optional(), "focal_point": z.array(z.number().gte(0).lte(1)).min(2).max(2).describe("Normalized `[x, y]` coordinates (0\u20131 from top-left) of the image's visual anchor. Seller-side renderers crop toward the focal point when deriving renditions across breakpoints and aspect ratios; absent, cropping falls back to center-weighted defaults.").optional(), "format": z.string().describe("Image file format (jpg, png, gif, webp, etc.)").optional(), "alt_text": z.string().describe("Alternative text for accessibility").optional(), "provenance": z.object({ "digital_source_type": z.enum(["digital_capture", "digital_creation", "trained_algorithmic_media", "composite_with_trained_algorithmic_media", "algorithmic_media", "composite_capture", "composite_synthetic", "human_edits", "data_driven_media"]).describe("IPTC-aligned classification of AI involvement in producing this content").optional(), "synthetic_depiction": z.boolean().describe("Assessed declaration of whether the content synthetically depicts a real or fictional person performing or appearing in a way that was generated or materially manipulated rather than captured as depicted. `true` covers both a fully synthetic performer and material manipulation of a real performer; `false` is an assessed declaration that the content does not contain such a depiction. Absence means the content has not been assessed for synthetic depiction. This field does not claim consent, legality, or independent verification, and receivers MUST NOT derive it solely from `digital_source_type`.").optional(), "ai_tool": z.object({ "name": z.string().describe("Name of the AI tool or model (e.g., 'DALL-E 3', 'Stable Diffusion XL', 'Gemini')"), "version": z.string().describe("Version identifier for the AI tool or model (e.g., '25.1', '0125', '2.1'). For generative models, use the model version rather than the API version.").optional(), "provider": z.string().describe("Organization that provides the AI tool (e.g., 'OpenAI', 'Stability AI', 'Google')").optional() }).describe("AI system used to generate or modify this content. Aligns with IPTC 2025.1 AI metadata fields and C2PA claim_generator.").optional(), "human_oversight": z.enum(["none", "prompt_only", "selected", "edited", "directed"]).describe("Level of human involvement in the AI-assisted creation process. Independent of `disclosure.required` \u2014 the protocol does not derive disclosure obligations from oversight level. Some regulations include carve-outs for human-edited or human-directed AI output, but those carve-outs have factual prerequisites the schema cannot evaluate. Asserting `edited` or `directed` does not by itself justify `disclosure.required: false`.").optional(), "declared_by": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent or service that declared this provenance").optional(), "role": z.enum(["creator", "advertiser", "agency", "platform", "tool"]).describe("Role of the declaring party in the supply chain") }).describe("Party declaring this provenance. Identifies who attached the provenance claim, enabling receiving parties to assess trust.").optional(), "declared_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "created_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "c2pa": z.object({ "manifest_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to the C2PA manifest store for this content") }).describe("C2PA sidecar manifest reference. Links to a detached cryptographic provenance manifest for this content. Note: file-level C2PA bindings break when ad servers transcode, resize, or re-encode assets. For pipelines with intermediaries, consider embedded_provenance as the primary provenance mechanism.").optional(), "embedded_provenance": z.array(z.object({ "method": z.enum(["manifest_wrapper", "provenance_markers"]).describe("How provenance data is carried within the content"), "standard": z.string().describe("Standard the embedding conforms to, if any (e.g., 'c2pa' for C2PA Section A.7 text manifest embedding)").optional(), "provider": z.string().describe("Organization that performed the embedding (e.g., 'Encypher', 'Digimarc'). Display label and audit context \u2014 not a wire identifier."), "verify_agent": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("URL of the governance agent the buyer represents was used to embed/verify this layer. MUST use the `https://` scheme and MUST appear in the seller's `creative_policy.accepted_verifiers[].agent_url` list (canonicalized per /docs/reference/url-canonicalization: lowercase scheme and host, strip default port, normalize path dot-segments). Sellers MUST NOT call this URL until the canonicalized match is confirmed."), "feature_id": z.string().describe("Optional `feature_id` the buyer represents the seller should request via `get_creative_features` (e.g., `encypher.markers_present_v2`). SHOULD match the `feature_id` declared on the matching `accepted_verifiers[]` entry, or be omitted to defer the selector to the seller. When the seller's entry pins a `feature_id`, that value wins; when neither side pins, the seller selects from the agent's `governance.creative_features` catalog.").optional() }).strict().describe("Buyer's representation that this embedding can be verified by a governance agent on the seller's `creative_policy.accepted_verifiers` list. The `agent_url` MUST match (canonicalized) one of the seller's published `accepted_verifiers[].agent_url` entries; sellers reject `sync_creatives` submissions whose `verify_agent.agent_url` is off-list with `PROVENANCE_VERIFIER_NOT_ACCEPTED`. This is buyer-supplied evidence, not buyer-driven routing \u2014 the seller is the verifier-of-record and the seller controls which agent it actually calls (the seller MAY use a different on-list agent if it determines this is more appropriate; the seller does not call buyer-asserted endpoints outside its allowlist). MAY be omitted for self-verifiable embeddings (e.g., a C2PA text manifest with a public key the seller already trusts).").optional(), "embedded_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() })).min(1).describe("Provenance metadata embedded within the content stream. Each entry declares one embedding layer: structured provenance data carried inside the content itself, as distinct from sidecar references (c2pa.manifest_url). Embedded provenance survives operations that break sidecar and file-level bindings: ad-server transcoding, CMS ingestion, copy-paste, reformatting, and CDN re-encoding. For ad-tech pipelines where content passes through multiple intermediaries, embedded provenance is the reliable path for provenance that persists from declaration through delivery. This is a declaration by the embedding party. The receiving party (the seller) is the verifier-of-record: it confirms the claim by calling a governance agent it trusts (typically one published in `creative_policy.accepted_verifiers`).").optional(), "watermarks": z.array(z.object({ "media_type": z.enum(["audio", "image", "video", "text"]).describe("Media category of the watermarked content"), "provider": z.string().describe("Organization that applied the watermark (e.g., 'Imatag', 'Steg.AI', 'Encypher'). Display label and audit context \u2014 not a wire identifier."), "verify_agent": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("URL of the governance agent the buyer represents was used to apply/detect this watermark. MUST use the `https://` scheme and MUST appear in the seller's `creative_policy.accepted_verifiers[].agent_url` list (canonicalized per /docs/reference/url-canonicalization: lowercase scheme and host, strip default port, normalize path dot-segments). Sellers MUST NOT call this URL until the canonicalized match is confirmed."), "feature_id": z.string().describe("Optional `feature_id` the buyer represents the seller should request via `get_creative_features` (e.g., `imatag.watermark_detected`). SHOULD match the `feature_id` declared on the matching `accepted_verifiers[]` entry, or be omitted to defer the selector to the seller. When the seller's entry pins a `feature_id`, that value wins; when neither side pins, the seller selects from the agent's `governance.creative_features` catalog.").optional() }).strict().describe("Buyer's representation that this watermark can be detected by a governance agent on the seller's `creative_policy.accepted_verifiers` list. The `agent_url` MUST match (canonicalized) one of the seller's published `accepted_verifiers[].agent_url` entries; sellers reject `sync_creatives` submissions whose `verify_agent.agent_url` is off-list with `PROVENANCE_VERIFIER_NOT_ACCEPTED`. This is buyer-supplied evidence, not buyer-driven routing \u2014 the seller is the verifier-of-record and the seller controls which agent it actually calls (the seller MAY use a different on-list agent if it determines this is more appropriate; the seller does not call buyer-asserted endpoints outside its allowlist).").optional(), "c2pa_action": z.enum(["c2pa.watermarked.bound", "c2pa.watermarked.unbound"]).describe("C2PA action classification for this watermark").optional(), "embedded_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() })).min(1).describe("Content watermarks applied to this asset. Each entry declares one watermarking layer: a content modification that encodes an identifier or fingerprint within the asset. Watermarks differ from embedded provenance: a watermark encodes an identifier (who generated it, who owns it), while embedded provenance carries or references a structured provenance record (the full chain of custody). A single asset may carry both. Aligns with C2PA action taxonomy: c2pa.watermarked.bound (watermark linked to a C2PA manifest) and c2pa.watermarked.unbound (watermark independent of any manifest). This is a declaration by the watermarking party. The receiving party (the seller) is the verifier-of-record: it confirms the claim by calling a governance agent it trusts (typically one published in `creative_policy.accepted_verifiers`).").optional(), "disclosure": z.object({ "required": z.boolean().describe("The declaring party's claim that AI disclosure is required for this content under applicable regulations. This is a declared signal carried through the supply chain \u2014 useful as a routing and audit input \u2014 not a regulatory determination made by the protocol. Receiving parties remain responsible for their own jurisdictional analysis and should not treat `required: false` as compliance cover."), "jurisdictions": z.array(z.object({ "country": z.string().describe("ISO 3166-1 alpha-2 country code (e.g., 'US', 'DE', 'CN')"), "region": z.string().describe("Sub-national region code (e.g., 'CA' for California, 'BY' for Bavaria)").optional(), "regulation": z.string().describe("Regulation identifier (e.g., 'eu_ai_act_article_50', 'ca_sb_942', 'cn_deep_synthesis')"), "label_text": z.string().describe("Required disclosure label text for this jurisdiction, in the local language").optional(), "render_guidance": z.object({ "persistence": z.enum(["continuous", "initial", "flexible"]).describe("How long the disclosure must persist during content playback or display").optional(), "min_duration_ms": z.number().int().gte(1).describe("Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available.").optional(), "positions": z.array(z.enum(["prominent", "footer", "audio", "subtitle", "overlay", "end_card", "pre_roll", "companion"]).describe("Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Preferred disclosure positions in priority order. The first position a format supports should be used.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).describe("How the disclosure should be rendered for this jurisdiction. Expresses the declaring party's intent for persistence and position based on regulatory requirements. Publishers control actual rendering but governance agents can audit whether guidance was followed.").refine((value) => Object.keys(value).length >= 1, "Object must contain at least 1 property").optional() })).min(1).describe("Jurisdictions where disclosure obligations apply").optional() }).describe("Regulatory disclosure requirements for this content. Indicates whether AI disclosure is required and under which jurisdictions.").optional(), "verification": z.array(z.object({ "verified_by": z.string().describe("Name of the verification service (e.g., 'DoubleVerify', 'Hive Moderation', 'Reality Defender')"), "verified_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "result": z.enum(["authentic", "ai_generated", "ai_modified", "inconclusive"]).describe("Verification outcome"), "confidence": z.number().gte(0).lte(1).describe("Confidence score of the verification result (0.0 to 1.0)").optional(), "details_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to the full verification report").optional() })).min(1).describe("Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).describe("Provenance metadata for this asset, overrides manifest-level provenance").optional() }).catchall(z.any()).describe("Override logo asset.").optional(), "colors": z.object({ "primary": z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional(), "secondary": z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional(), "accent": z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional() }).catchall(z.any()).describe("Override brand colors (hex strings).").optional(), "voice": z.string().describe("Override brand-voice description for surface-composed text/audio output.").optional(), "tagline": z.string().describe("Override tagline.").optional() }).catchall(z.any()).describe("Inline override for brand-kit fields normally resolved from `/.well-known/brand.json` on `domain` (logo, colors, voice, tagline). Use when brand.json is missing, stale, or inappropriate for this specific call \u2014 e.g., a campaign-scoped tagline, a co-branded creative, a freshly-rebranded color palette the brand.json hasn't shipped yet. Same inline-override pattern as `industries` and `data_subject_contestation` above: brand.json is canonical, the override is per-call. Adopters needing to override fields outside this subset (`voice_attributes`, `prohibited_terms`, etc.) MUST publish a different brand.json and reference it via a different `domain` \u2014 the inline override is intentionally narrow to a small high-traffic subset.\n\n**Merge semantics (normative).** The merge is **field-level**, not whole-object replacement. Each field within `brand_kit_override` (`logo`, `colors`, `voice`, `tagline`) is evaluated independently \u2014 when a field is present on the override the override value applies; when a field is absent the brand.json value applies (or is absent if brand.json doesn't carry one either). For composite fields (`colors.primary`, `colors.secondary`, `colors.accent`), the merge is one level deeper: each color slot is evaluated independently \u2014 a producer can override `colors.primary` while still inheriting `colors.secondary` from brand.json. SDKs MUST NOT treat a present `brand_kit_override.colors` as wiping the brand.json `colors` block entirely; only the per-slot fields present in the override take precedence. Without this rule, a partial-override semantics would diverge across SDKs and produce inconsistent rendering for the same payload.").optional() }).strict().describe("Vendor that produced these viewability values. Optional but RECOMMENDED so the row is self-describing \u2014 buyer agents reading delivery in isolation can attribute the numbers without joining back to `package.committed_metrics` or `package.performance_standards`. The vendor's `brand.json` `agents[type='measurement']` is the discovery anchor; the metric definitions live on the agent's `get_adcp_capabilities.measurement.metrics[]` block. Same shape as `vendor_metric_value.vendor` for symmetry across vendor-attested surfaces.").optional(), "measurable_impressions": z.number().gte(0).describe("Impressions where viewability could be measured. Excludes environments without measurement capability (e.g., non-Intersection Observer browsers, certain app environments). Coverage denominator for `viewable_rate`, `viewed_seconds`, and both viewed-seconds distributions \u2014 every duration statistic is computed over this same measurable population.").optional(), "viewable_impressions": z.number().gte(0).describe("Impressions that met the viewability threshold defined by the measurement standard.").optional(), "viewable_rate": z.number().gte(0).lte(1).describe("Viewable impression rate (viewable_impressions / measurable_impressions). Range 0.0 to 1.0.").optional(), "viewed_seconds": z.number().gte(0).describe("Average in-view duration per measurable impression, in seconds. Reporting-side counterpart to the `viewed_seconds` optimization metric in `optimization-goal.json`. Computed over `measurable_impressions`, not total impressions \u2014 the same denominator as `viewable_rate`. The viewability `standard` governs the threshold (e.g., MRC's 50% pixels for 1s display / 2s video) that defines when an impression is in view and therefore when the clock is running. Sellers reporting against a `viewed_seconds` optimization goal MUST populate this field.").optional(), "viewed_seconds_percentiles": z.object({ "p25": z.number().gte(0).describe("25th-percentile in-view duration in seconds."), "p50": z.number().gte(0).describe("Median (50th-percentile) in-view duration in seconds."), "p75": z.number().gte(0).describe("75th-percentile in-view duration in seconds."), "p90": z.number().gte(0).describe("90th-percentile in-view duration in seconds."), "p95": z.number().gte(0).describe("95th-percentile in-view duration in seconds.") }).strict().describe("Percentile summary of the per-impression in-view durations whose arithmetic mean is reported in `viewed_seconds`. This object MUST use the same reporting row, measurement vendor, viewability `standard`, and `measurable_impressions` population as `viewed_seconds`; sellers MUST omit it when `measurable_impressions` is zero. Percentiles use the nearest-rank definition: sort the N observed durations in ascending order and select rank `ceil(p \xD7 N)` (one-based) for percentile p. Values MUST be non-decreasing from p25 through p95. The structured metric identity `viewed_seconds_percentiles` makes this optional surface discoverable and requestable; it is not sortable and the nested object remains the canonical carrier.").optional(), "viewed_seconds_histogram": z.array(z.object({ "lower_bound_seconds": z.number().gte(0).describe("Inclusive lower bound of this duration bucket, in seconds."), "upper_bound_seconds": z.number().gte(0).describe("Exclusive upper bound of this duration bucket, in seconds. MUST be greater than `lower_bound_seconds`. Omit only on the final bucket to represent an unbounded upper range.").optional(), "impressions": z.number().int().gte(0).describe("Number of measurable impressions whose in-view duration falls in this bucket.") }).strict()).min(1).describe("Bucketed counts of the per-impression in-view durations whose arithmetic mean is reported in `viewed_seconds`. Buckets MUST be ordered by ascending lower bound, MUST NOT overlap, and MUST partition every impression in the same `measurable_impressions` population exactly once; therefore the sum of `impressions` MUST equal `measurable_impressions`. Buckets need not be contiguous: a gap between consecutive bucket boundaries is permitted when no impressions fall within that range \u2014 the sum constraint enforces this implicitly, and validators MUST NOT independently require contiguity. Each bucket is half-open `[lower_bound_seconds, upper_bound_seconds)`; only the final bucket MAY omit `upper_bound_seconds`, representing an unbounded upper range. Sellers choose boundaries, but buyers MUST combine histograms only when the complete boundary sequence, measurement vendor, and viewability `standard` match. The structured metric identity `viewed_seconds_histogram` makes this optional surface discoverable and requestable; it is not sortable and this nested array remains the canonical carrier.").optional(), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to these metrics. Governs the in-view threshold for `viewable_rate`, `viewed_seconds`, and both viewed-seconds distributions.").optional() }).catchall(z.any()).and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "viewed_seconds_percentiles": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "viewed_seconds_percentiles": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "measurable_impressions": z.number().int().gte(1).optional() }))]), z.union([z.any().refine((value) => !z.object({ "viewed_seconds_histogram": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "viewed_seconds_histogram": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "measurable_impressions": z.number().int().optional() }))])), z.intersection(z.union([z.any().refine((value) => !z.object({ "viewed_seconds_percentiles": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "viewed_seconds_percentiles": z.any().refine((value) => value !== void 0, "Required"), "viewed_seconds": z.any().refine((value) => value !== void 0, "Required"), "measurable_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "viewed_seconds_histogram": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "viewed_seconds_histogram": z.any().refine((value) => value !== void 0, "Required"), "viewed_seconds": z.any().refine((value) => value !== void 0, "Required"), "measurable_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Viewability metrics. Viewable rate should be calculated as viewable_impressions / measurable_impressions (not total impressions), since some environments cannot measure viewability. Includes `viewed_seconds` \u2014 average in-view duration \u2014 plus optional percentile and histogram distributions over that duration; all three use the same `measurable_impressions` population and are governed by the same viewability threshold (`standard`). Sellers SHOULD include `standard` whenever measured viewability values are reported because MRC and GroupM rows are not interchangeable. The numeric leaves are addressable via the leaf metric identities `viewable_rate`, `viewable_impressions`, `measurable_impressions`, and `viewed_seconds` for declaration, commitments, aggregates, and breakdown sorting. The structured distribution carriers require explicit `viewed_seconds_percentiles` and `viewed_seconds_histogram` identities for declaration, commitment, and selection; they are not numeric aggregate rows or sort keys. This object remains the canonical carrier of every value. When a buy reports under more than one standard, contract a specific standard via the `viewability_standard` qualifier on `committed_metrics`; when the package's `committed_metrics` carry a `viewability_standard` qualifier, sellers MUST populate `standard` on reported viewability objects so reconciliation can match the qualifier.").optional(), "engagements": z.number().gte(0).describe("Total engagements \u2014 direct interactions with the ad beyond viewing. Includes social reactions/comments/shares, story/unit opens, interactive overlay taps on CTV, companion banner interactions on audio. Platform-specific; corresponds to the 'engagements' optimization metric. Maps to DBCFM KPI_INTERACTIONS (Interaktionen) in the Reporting/Performance block.").optional(), "follows": z.number().gte(0).describe("New followers, page likes, artist/podcast/channel follows, or free channel/feed subscribes attributed to this delivery. Paid subscriptions are conversion events with `event_type: subscribe`, not `follows`.").optional(), "saves": z.number().gte(0).describe("Saves, bookmarks, playlist adds, pins attributed to this delivery.").optional(), "profile_visits": z.number().gte(0).describe("Visits to the brand's in-platform page (profile, artist page, channel, or storefront) attributed to this delivery. Does not include external website clicks.").optional(), "engagement_rate": z.number().gte(0).lte(1).describe("Platform-specific engagement rate (0.0 to 1.0). Typically engagements/impressions, but definition varies by platform.").optional(), "cost_per_click": z.number().gte(0).describe("Cost per click (spend / clicks)").optional(), "cost_per_completed_view": z.number().gte(0).describe("Cost per completed view (spend / completed_views). Primary CPCV pricing scalar for video/audio inventory; the package's `pricing_model` is `cpcv` when this field is the billing basis.").optional(), "cpm": z.number().gte(0).describe("Cost per thousand impressions, computed as (spend / impressions) \xD7 1000. Universal pricing scalar across CTV, display, mobile/web video, native, audio, and DOOH inventory; the package's `pricing_model` is `cpm` when this field is the billing basis. Field name aligns with the canonical `cpm` token in `enums/pricing-model.json` and `pricing-options/cpm-option.json` so buyers cross-walk pricing model \u2192 reported scalar without a translation table.").optional(), "downloads": z.number().gte(0).describe("Audio/podcast downloads (IAB Podcast Measurement Technical Guidelines 2.x methodology). Distinct from `views` \u2014 for podcast inventory this is the count of podcast episode downloads; for streaming audio it is the count of stream starts that meet the platform's download threshold. Prefer this over `views` for audio inventory.").optional(), "units_sold": z.number().gte(0).describe("Items sold attributed to this delivery. Retail-media scalar distinct from `conversions` \u2014 a single conversion (transaction) may carry multiple `units_sold`. Used by retail media platforms where the buyer optimizes against unit movement, not transaction count. Attribution lookback windows are platform-specific (commonly 7/14/30 days, view-through and click-through variants); sellers SHOULD declare the window via `reporting_capabilities.measurement_windows` or `measurement_terms` rather than encoding it in this scalar.").optional(), "new_to_brand_units": z.number().gte(0).describe("Units sold to first-time brand buyers (count, not rate). Retail-media scalar \u2014 the unit-volume parallel to the conversion-fraction `new_to_brand_rate`. Used by retail media platforms where new-customer acquisition unit volume is a primary KPI. Same attribution-window note as `units_sold` applies.").optional(), "by_action_source": z.array(z.object({ "action_source": z.enum(["website", "app", "offline", "phone_call", "chat", "email", "in_store", "system_generated", "other"]).describe("Where the conversion occurred"), "event_source_id": z.string().describe("Event source that produced these conversions (for disambiguation when multiple event sources are configured)").optional(), "count": z.number().gte(0).describe("Number of conversions from this action source"), "value": z.number().gte(0).describe("Total monetary value of conversions from this action source").optional() }).catchall(z.any())).describe("Conversion metrics broken down by action source (website, app, in_store, etc.). Useful for omnichannel sellers where conversions occur across digital and physical channels.").optional(), "vendor_metric_values": z.array(z.object({ "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where /.well-known/brand.json is hosted, or the brand's operating domain"), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand identifier within the house portfolio. Optional for single-brand domains.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit for a global/default identity. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account identity and is not delivery targeting.").optional(), "industries": z.array(z.string()).describe("Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json.").optional(), "data_subject_contestation": z.object({ "url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).optional(), "email": z.string().email().optional(), "languages": z.array(z.string()).optional() }).strict().and(z.union([z.object({ "url": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "email": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand \u2192 house \u2192 missing.").optional(), "brand_kit_override": z.object({ "logo": z.object({ "asset_type": z.literal("image").describe("Discriminator identifying this as an image asset. See /schemas/creative/asset-types for the registry."), "url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to the image asset"), "width": z.number().int().gte(1).describe("Width in pixels"), "height": z.number().int().gte(1).describe("Height in pixels"), "file_size_bytes": z.number().int().gte(1).describe("Image file size in bytes. Required by agents that advertise a max_file_size_kb constraint.").optional(), "pixel_ratio": z.number().gt(0).describe("Intrinsic pixels per logical render pixel (for example `2` for a 600\xD7500 image intended to render at 300\xD7250). Optional because a validator can infer the ratio when the target format declares logical dimensions. When supplied, it MUST agree with both `width / logical_width` and `height / logical_height`; it is never a substitute for the intrinsic `width` and `height` fields.").optional(), "state_id": z.string().describe("Binding used only when this image populates a `seller_rendered_stateful_display` `state_canvases` slot. It MUST match one declared `states[].state_id` (semantic validators resolve it). Omit for ordinary image slots.").optional(), "breakpoint_id": z.string().describe("Binding used only when this image populates a `seller_rendered_stateful_display` `state_canvases` slot. It MUST match one breakpoint declared on the selected state (semantic validators resolve it). Omit for ordinary image slots.").optional(), "focal_point": z.array(z.number().gte(0).lte(1)).min(2).max(2).describe("Normalized `[x, y]` coordinates (0\u20131 from top-left) of the image's visual anchor. Seller-side renderers crop toward the focal point when deriving renditions across breakpoints and aspect ratios; absent, cropping falls back to center-weighted defaults.").optional(), "format": z.string().describe("Image file format (jpg, png, gif, webp, etc.)").optional(), "alt_text": z.string().describe("Alternative text for accessibility").optional(), "provenance": z.object({ "digital_source_type": z.enum(["digital_capture", "digital_creation", "trained_algorithmic_media", "composite_with_trained_algorithmic_media", "algorithmic_media", "composite_capture", "composite_synthetic", "human_edits", "data_driven_media"]).describe("IPTC-aligned classification of AI involvement in producing this content").optional(), "synthetic_depiction": z.boolean().describe("Assessed declaration of whether the content synthetically depicts a real or fictional person performing or appearing in a way that was generated or materially manipulated rather than captured as depicted. `true` covers both a fully synthetic performer and material manipulation of a real performer; `false` is an assessed declaration that the content does not contain such a depiction. Absence means the content has not been assessed for synthetic depiction. This field does not claim consent, legality, or independent verification, and receivers MUST NOT derive it solely from `digital_source_type`.").optional(), "ai_tool": z.object({ "name": z.string().describe("Name of the AI tool or model (e.g., 'DALL-E 3', 'Stable Diffusion XL', 'Gemini')"), "version": z.string().describe("Version identifier for the AI tool or model (e.g., '25.1', '0125', '2.1'). For generative models, use the model version rather than the API version.").optional(), "provider": z.string().describe("Organization that provides the AI tool (e.g., 'OpenAI', 'Stability AI', 'Google')").optional() }).describe("AI system used to generate or modify this content. Aligns with IPTC 2025.1 AI metadata fields and C2PA claim_generator.").optional(), "human_oversight": z.enum(["none", "prompt_only", "selected", "edited", "directed"]).describe("Level of human involvement in the AI-assisted creation process. Independent of `disclosure.required` \u2014 the protocol does not derive disclosure obligations from oversight level. Some regulations include carve-outs for human-edited or human-directed AI output, but those carve-outs have factual prerequisites the schema cannot evaluate. Asserting `edited` or `directed` does not by itself justify `disclosure.required: false`.").optional(), "declared_by": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent or service that declared this provenance").optional(), "role": z.enum(["creator", "advertiser", "agency", "platform", "tool"]).describe("Role of the declaring party in the supply chain") }).describe("Party declaring this provenance. Identifies who attached the provenance claim, enabling receiving parties to assess trust.").optional(), "declared_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "created_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "c2pa": z.object({ "manifest_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to the C2PA manifest store for this content") }).describe("C2PA sidecar manifest reference. Links to a detached cryptographic provenance manifest for this content. Note: file-level C2PA bindings break when ad servers transcode, resize, or re-encode assets. For pipelines with intermediaries, consider embedded_provenance as the primary provenance mechanism.").optional(), "embedded_provenance": z.array(z.object({ "method": z.enum(["manifest_wrapper", "provenance_markers"]).describe("How provenance data is carried within the content"), "standard": z.string().describe("Standard the embedding conforms to, if any (e.g., 'c2pa' for C2PA Section A.7 text manifest embedding)").optional(), "provider": z.string().describe("Organization that performed the embedding (e.g., 'Encypher', 'Digimarc'). Display label and audit context \u2014 not a wire identifier."), "verify_agent": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("URL of the governance agent the buyer represents was used to embed/verify this layer. MUST use the `https://` scheme and MUST appear in the seller's `creative_policy.accepted_verifiers[].agent_url` list (canonicalized per /docs/reference/url-canonicalization: lowercase scheme and host, strip default port, normalize path dot-segments). Sellers MUST NOT call this URL until the canonicalized match is confirmed."), "feature_id": z.string().describe("Optional `feature_id` the buyer represents the seller should request via `get_creative_features` (e.g., `encypher.markers_present_v2`). SHOULD match the `feature_id` declared on the matching `accepted_verifiers[]` entry, or be omitted to defer the selector to the seller. When the seller's entry pins a `feature_id`, that value wins; when neither side pins, the seller selects from the agent's `governance.creative_features` catalog.").optional() }).strict().describe("Buyer's representation that this embedding can be verified by a governance agent on the seller's `creative_policy.accepted_verifiers` list. The `agent_url` MUST match (canonicalized) one of the seller's published `accepted_verifiers[].agent_url` entries; sellers reject `sync_creatives` submissions whose `verify_agent.agent_url` is off-list with `PROVENANCE_VERIFIER_NOT_ACCEPTED`. This is buyer-supplied evidence, not buyer-driven routing \u2014 the seller is the verifier-of-record and the seller controls which agent it actually calls (the seller MAY use a different on-list agent if it determines this is more appropriate; the seller does not call buyer-asserted endpoints outside its allowlist). MAY be omitted for self-verifiable embeddings (e.g., a C2PA text manifest with a public key the seller already trusts).").optional(), "embedded_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() })).min(1).describe("Provenance metadata embedded within the content stream. Each entry declares one embedding layer: structured provenance data carried inside the content itself, as distinct from sidecar references (c2pa.manifest_url). Embedded provenance survives operations that break sidecar and file-level bindings: ad-server transcoding, CMS ingestion, copy-paste, reformatting, and CDN re-encoding. For ad-tech pipelines where content passes through multiple intermediaries, embedded provenance is the reliable path for provenance that persists from declaration through delivery. This is a declaration by the embedding party. The receiving party (the seller) is the verifier-of-record: it confirms the claim by calling a governance agent it trusts (typically one published in `creative_policy.accepted_verifiers`).").optional(), "watermarks": z.array(z.object({ "media_type": z.enum(["audio", "image", "video", "text"]).describe("Media category of the watermarked content"), "provider": z.string().describe("Organization that applied the watermark (e.g., 'Imatag', 'Steg.AI', 'Encypher'). Display label and audit context \u2014 not a wire identifier."), "verify_agent": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("URL of the governance agent the buyer represents was used to apply/detect this watermark. MUST use the `https://` scheme and MUST appear in the seller's `creative_policy.accepted_verifiers[].agent_url` list (canonicalized per /docs/reference/url-canonicalization: lowercase scheme and host, strip default port, normalize path dot-segments). Sellers MUST NOT call this URL until the canonicalized match is confirmed."), "feature_id": z.string().describe("Optional `feature_id` the buyer represents the seller should request via `get_creative_features` (e.g., `imatag.watermark_detected`). SHOULD match the `feature_id` declared on the matching `accepted_verifiers[]` entry, or be omitted to defer the selector to the seller. When the seller's entry pins a `feature_id`, that value wins; when neither side pins, the seller selects from the agent's `governance.creative_features` catalog.").optional() }).strict().describe("Buyer's representation that this watermark can be detected by a governance agent on the seller's `creative_policy.accepted_verifiers` list. The `agent_url` MUST match (canonicalized) one of the seller's published `accepted_verifiers[].agent_url` entries; sellers reject `sync_creatives` submissions whose `verify_agent.agent_url` is off-list with `PROVENANCE_VERIFIER_NOT_ACCEPTED`. This is buyer-supplied evidence, not buyer-driven routing \u2014 the seller is the verifier-of-record and the seller controls which agent it actually calls (the seller MAY use a different on-list agent if it determines this is more appropriate; the seller does not call buyer-asserted endpoints outside its allowlist).").optional(), "c2pa_action": z.enum(["c2pa.watermarked.bound", "c2pa.watermarked.unbound"]).describe("C2PA action classification for this watermark").optional(), "embedded_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() })).min(1).describe("Content watermarks applied to this asset. Each entry declares one watermarking layer: a content modification that encodes an identifier or fingerprint within the asset. Watermarks differ from embedded provenance: a watermark encodes an identifier (who generated it, who owns it), while embedded provenance carries or references a structured provenance record (the full chain of custody). A single asset may carry both. Aligns with C2PA action taxonomy: c2pa.watermarked.bound (watermark linked to a C2PA manifest) and c2pa.watermarked.unbound (watermark independent of any manifest). This is a declaration by the watermarking party. The receiving party (the seller) is the verifier-of-record: it confirms the claim by calling a governance agent it trusts (typically one published in `creative_policy.accepted_verifiers`).").optional(), "disclosure": z.object({ "required": z.boolean().describe("The declaring party's claim that AI disclosure is required for this content under applicable regulations. This is a declared signal carried through the supply chain \u2014 useful as a routing and audit input \u2014 not a regulatory determination made by the protocol. Receiving parties remain responsible for their own jurisdictional analysis and should not treat `required: false` as compliance cover."), "jurisdictions": z.array(z.object({ "country": z.string().describe("ISO 3166-1 alpha-2 country code (e.g., 'US', 'DE', 'CN')"), "region": z.string().describe("Sub-national region code (e.g., 'CA' for California, 'BY' for Bavaria)").optional(), "regulation": z.string().describe("Regulation identifier (e.g., 'eu_ai_act_article_50', 'ca_sb_942', 'cn_deep_synthesis')"), "label_text": z.string().describe("Required disclosure label text for this jurisdiction, in the local language").optional(), "render_guidance": z.object({ "persistence": z.enum(["continuous", "initial", "flexible"]).describe("How long the disclosure must persist during content playback or display").optional(), "min_duration_ms": z.number().int().gte(1).describe("Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available.").optional(), "positions": z.array(z.enum(["prominent", "footer", "audio", "subtitle", "overlay", "end_card", "pre_roll", "companion"]).describe("Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Preferred disclosure positions in priority order. The first position a format supports should be used.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).describe("How the disclosure should be rendered for this jurisdiction. Expresses the declaring party's intent for persistence and position based on regulatory requirements. Publishers control actual rendering but governance agents can audit whether guidance was followed.").refine((value) => Object.keys(value).length >= 1, "Object must contain at least 1 property").optional() })).min(1).describe("Jurisdictions where disclosure obligations apply").optional() }).describe("Regulatory disclosure requirements for this content. Indicates whether AI disclosure is required and under which jurisdictions.").optional(), "verification": z.array(z.object({ "verified_by": z.string().describe("Name of the verification service (e.g., 'DoubleVerify', 'Hive Moderation', 'Reality Defender')"), "verified_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "result": z.enum(["authentic", "ai_generated", "ai_modified", "inconclusive"]).describe("Verification outcome"), "confidence": z.number().gte(0).lte(1).describe("Confidence score of the verification result (0.0 to 1.0)").optional(), "details_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to the full verification report").optional() })).min(1).describe("Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).describe("Provenance metadata for this asset, overrides manifest-level provenance").optional() }).catchall(z.any()).describe("Override logo asset.").optional(), "colors": z.object({ "primary": z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional(), "secondary": z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional(), "accent": z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional() }).catchall(z.any()).describe("Override brand colors (hex strings).").optional(), "voice": z.string().describe("Override brand-voice description for surface-composed text/audio output.").optional(), "tagline": z.string().describe("Override tagline.").optional() }).catchall(z.any()).describe("Inline override for brand-kit fields normally resolved from `/.well-known/brand.json` on `domain` (logo, colors, voice, tagline). Use when brand.json is missing, stale, or inappropriate for this specific call \u2014 e.g., a campaign-scoped tagline, a co-branded creative, a freshly-rebranded color palette the brand.json hasn't shipped yet. Same inline-override pattern as `industries` and `data_subject_contestation` above: brand.json is canonical, the override is per-call. Adopters needing to override fields outside this subset (`voice_attributes`, `prohibited_terms`, etc.) MUST publish a different brand.json and reference it via a different `domain` \u2014 the inline override is intentionally narrow to a small high-traffic subset.\n\n**Merge semantics (normative).** The merge is **field-level**, not whole-object replacement. Each field within `brand_kit_override` (`logo`, `colors`, `voice`, `tagline`) is evaluated independently \u2014 when a field is present on the override the override value applies; when a field is absent the brand.json value applies (or is absent if brand.json doesn't carry one either). For composite fields (`colors.primary`, `colors.secondary`, `colors.accent`), the merge is one level deeper: each color slot is evaluated independently \u2014 a producer can override `colors.primary` while still inheriting `colors.secondary` from brand.json. SDKs MUST NOT treat a present `brand_kit_override.colors` as wiping the brand.json `colors` block entirely; only the per-slot fields present in the override take precedence. Without this rule, a partial-override semantics would diverge across SDKs and produce inconsistent rendering for the same payload.").optional() }).strict().describe("Vendor that produced this value. Matches a `vendor_metrics[].vendor` declaration on the product."), "metric_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).min(1).max(64).describe("Identifier for the metric within the vendor's vocabulary. Matches a `vendor_metrics[].metric_id` declaration on the product."), "value": z.number().describe("The reported value. Unit semantics are vendor-defined \u2014 see `unit` field below and the vendor's `brand.json` measurement-agent documentation."), "unit": z.string().describe("Unit of the value. Free-form to accommodate the heterogeneity of vendor metrics (e.g., `score`, `seconds`, `persons`, `gCO2e`, `USD`, `lift_percent`). When the value is monetary, use the ISO 4217 code (e.g., `USD`, `EUR`); for non-monetary, use whatever the vendor publishes. Optional on every row \u2014 the canonical unit lives at the vendor's measurement-agent metric definition (`brand.json` `agents[type='measurement']`). When sellers populate it inline they SHOULD match the vendor's published unit; buyers MAY resolve from the vendor's measurement agent when this field is absent.").optional(), "measurable_impressions": z.number().gte(0).describe("Number of impressions in this reporting period that the vendor was able to measure. Coverage denominator \u2014 buyers compute coverage rate as `measurable_impressions / impressions`. When absent, coverage is unspecified \u2014 buyers MUST NOT compute a coverage rate or assume full coverage. When the vendor measured zero impressions but is integrated, set to 0 explicitly. When the entry is omitted from `vendor_metric_values` entirely, the buyer infers no measurement happened (no integration). This pattern parallels `viewability.measurable_impressions` (`delivery-metrics.json#/properties/viewability`), which has handled vendor coverage in the IAS/DV/MRC ecosystem for over a decade \u2014 same convention: absence is unknown, not full. For channels where the atomic observation unit is a play or screen-second rather than an impression (DOOH, cinema, place-based), report `measurable_plays` or `measurable_play_seconds` instead \u2014 `impressions` there is itself a modelled figure (`plays \xD7 audience multiplier`), so `measurable_impressions / impressions` divides a measured count by a model output and has no interpretation.").optional(), "measurable_plays": z.number().gte(0).describe("Number of plays (loop plays / spots aired) in this reporting period that the vendor was able to measure. Coverage denominator for channels where a play, not an impression, is the atomic observation unit \u2014 DOOH, cinema, place-based audio. Buyers compute coverage as `measurable_plays / plays` (top-level `plays` on `delivery-metrics.json`). Same absence semantics as `measurable_impressions`: absent means coverage is unspecified and buyers MUST NOT compute a rate; 0 means the vendor is integrated but measured nothing. A row SHOULD carry exactly one coverage denominator \u2014 the one matching the unit the vendor actually observes.").optional(), "measurable_play_seconds": z.number().gte(0).describe("Play-seconds \u2014 seconds of creative playout summed across endpoints (screens, speakers, players) \u2014 in this reporting period that the vendor was able to measure. Medium-neutral on purpose: place-based audio has plays and duration but no screen. Coverage denominator when the vendor meters exposure duration rather than discrete plays. On screen networks buyers compute coverage as `measurable_play_seconds / dooh_metrics.screen_time_seconds`; on other place-based media, against the seller's reported playout seconds for the period. Same absence semantics as `measurable_impressions`.").optional(), "vendor_relationship": z.enum(["first_party", "affiliated", "third_party"]).describe("Optional echo of the product's `reporting_capabilities.vendor_metrics[].vendor_relationship` for this `(vendor, metric_id)`, so the delivery row is self-describing without joining back to the product (same reasoning as `viewability.vendor`). When present it MUST equal the declared value; buyers MAY resolve from the product declaration when absent. Absence on the row is *undeclared*, never `third_party`. A relationship disposition, not a trust ranking. Deliberately not a `qualifier` key: the relationship is constant across every row for a (seller, vendor) pair and does not partition rows, so it stays out of the `(vendor, metric_id, qualifier)` reconciliation join.").optional(), "qualifier": z.object({ "viewability_standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional(), "completion_source": z.enum(["seller_attested", "vendor_attested"]).describe("Trust-source disambiguator for `completion_rate` \u2014 *who* attested to the completion event, not *how* (methodology granularity is a separate dimension; future qualifier keys may add it if buyer demand surfaces). The two paths can yield materially different rates, particularly in SSAI environments where the player's view of completion may differ from a vendor's. Used as a `qualifier.completion_source` key on `committed_metrics`, `missing_metrics`, and package-level delivery values (`metric_values` or `vendor_metric_values`) to disambiguate which trust source the row represents. Edge cases: walled gardens where the seller is also the measurement vendor (YouTube, Spotify) collapse to `seller_attested` by trust-model logic \u2014 the same party served and counted. IAB-certified first-party podcast measurement (Podtrac, Triton on their own platforms; Art19 on its own platform) likewise collapses to `seller_attested`. The same vendor's offering on a third-party platform (Podtrac on a publisher who isn't Podtrac) is `vendor_attested`. The trust axis is *not* who runs the SDK \u2014 it's who is independent of the seller's revenue interest.").optional(), "attribution_methodology": z.enum(["deterministic_purchase", "probabilistic", "panel_based", "modeled"]).describe("How attribution between ad exposure and outcome events was computed. Used as a `qualifier.attribution_methodology` key on `committed_metrics`, `missing_metrics`, package-level delivery values (`metric_values` or `vendor_metric_values`), and `performance-feedback.metric` to disambiguate the same outcome metric reported under different methodologies \u2014 `conversion_value` measured deterministically (matched purchase IDs) is not the same number as `conversion_value` measured probabilistically (modeled match) and should never be summed across methodologies. The retail-media closed-loop pattern typically reports under `deterministic_purchase`; MMM and clean-room outputs typically report under `modeled` or `probabilistic`; panel-based measurement (Nielsen, comScore, Edison) reports under `panel_based`.").optional(), "attribution_window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").optional(), "lift_dimension": z.enum(["awareness", "consideration", "favorability", "purchase_intent", "ad_recall"]).describe("Brand-lift dimension disambiguator. Brand lift is multidimensional in production \u2014 Kantar, Upwave, Cint, DoubleVerify, and similar vendors report awareness, consideration, favorability, purchase intent, and ad recall as separate measurements with their own sample sizes and confidence intervals. Used as a `qualifier.lift_dimension` key on `committed_metrics`, `missing_metrics`, package-level delivery values (`metric_values` or `vendor_metric_values`), and `performance-feedback.metric` to disambiguate which dimension of `brand_lift` a row represents. Two `brand_lift` rows under different lift dimensions represent different surveyed outcomes and must not be combined into a single number.").optional() }).strict().describe("Optional qualifier disambiguating this row from sibling rows for the same (vendor, metric_id) \u2014 e.g., the same vendor outcome metric reported under 7-day and 30-day attribution windows. Same closed key set as `committed-metric`. When the matching `committed_metrics` entry carries a qualifier, this row MUST carry the identical qualifier so reconciliation joins on `(vendor, metric_id, qualifier)`.").optional(), "breakdown": z.record(z.string(), z.any()).describe("Optional structured payload for vendor metrics that don't fit a single scalar \u2014 panel demographic breakouts, co-view audience composition, incremental reach + frequency + lift decompositions. Free-form; the keys and value semantics are defined by the vendor (see the vendor's `brand.json` measurement-agent docs). Buyers MUST treat this object as opaque without consulting the vendor's documentation. Vendors place any fields beyond the standard envelope (e.g., confidence intervals, panel sizes) inside this object rather than at the top level.").optional() }).strict().describe("A reported value for a vendor-defined metric, emitted in `delivery-metrics.json` `vendor_metric_values` parallel to standard scalars. Identifies the vendor (BrandRef), the metric name within that vendor's vocabulary, the value, and the coverage denominator (`measurable_impressions`) \u2014 vendor measurement is rarely 100% coverage. Channels whose atomic observation unit is a play or screen-second rather than an impression (DOOH, cinema, place-based) use the sibling denominators `measurable_plays` / `measurable_play_seconds`. `vendor_relationship` optionally echoes the seller's declared relationship to the vendor (`first_party` / `affiliated` / `third_party`) so a row is self-describing without a discovery hop. The `breakdown` slot accommodates vendors that emit structured payloads beyond a single scalar (panel demographic breakouts, co-view ratios, incremental decompositions). To add fields beyond what this schema defines, vendors place them inside `breakdown` rather than alongside the standard envelope.")).describe("Reported values for vendor-defined metrics that the product's `reporting_capabilities.vendor_metrics` declared. Each entry carries the vendor (BrandRef), the metric identifier within the vendor's vocabulary, the value, optional unit, and `measurable_impressions` as the coverage denominator \u2014 vendor measurement is rarely 100% of delivered impressions, since vendors only score impressions where their SDK fires or their panel matches. When a declared vendor metric is omitted from this array, buyers infer no measurement happened (no integration). One row per `(vendor.domain, vendor.brand_id, metric_id, qualifier)` per reporting period \u2014 the same vendor metric MAY appear in multiple rows only when each carries a distinct qualifier (e.g., 7-day and 30-day attribution windows); sellers MUST de-duplicate before emission and MUST NOT emit two rows with the same tuple; buyers MAY treat duplicate rows as a seller-side conformance bug. The structured `vendor_metric_values` array is the recommended path for vendor metrics; `additionalProperties: true` on this parent object is preserved so existing free-form vendor emissions remain conformant during migration.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "reach": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "reach": z.any().refine((value) => value !== void 0, "Required"), "reach_unit": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Standard delivery metrics that can be reported at media buy, package, or creative level"), z.object({ "effective_rate": z.number().gte(0).optional() }).catchall(z.any()).describe("Aggregate metrics for this media buy across all packages.")), "by_package": z.array(z.intersection(z.object({ "impressions": z.number().gte(0).describe("Impressions delivered").optional(), "spend": z.number().gte(0).describe("Amount spent").optional(), "clicks": z.number().gte(0).describe("Total clicks").optional(), "ctr": z.number().gte(0).lte(1).describe("Click-through rate (clicks/impressions)").optional(), "views": z.number().gte(0).describe("Content engagements counted toward the billable view threshold. For video this is a platform-defined view event (e.g., 30 seconds or video midpoint); for audio/podcast it is a stream start; for other formats it follows the pricing model's view definition. When the package uses CPV pricing, spend = views \xD7 rate.").optional(), "completed_views": z.number().gte(0).describe("Video/audio completions. When the package has a completed_views optimization goal with view_duration_seconds, completions are counted at that threshold rather than 100% completion.").optional(), "completion_rate": z.union([z.number().gte(0).lte(1).describe("Completion rate (completed_views/impressions). Null indicates the metric is not applicable to this package/buy (e.g. completion rate on a non-video buy)."), z.null().describe("Completion rate (completed_views/impressions). Null indicates the metric is not applicable to this package/buy (e.g. completion rate on a non-video buy).")]).describe("Completion rate (completed_views/impressions). Null indicates the metric is not applicable to this package/buy (e.g. completion rate on a non-video buy).").optional(), "conversions": z.number().gte(0).describe("Total conversions attributed to this delivery. When by_event_type is present, this equals the sum of all by_event_type[].count entries.").optional(), "conversion_value": z.number().gte(0).describe("Total monetary value of attributed conversions (in the reporting currency)").optional(), "commissionable_value": z.number().gte(0).describe("Settled portion of attributed conversion value eligible for revenue-share commission, in the reporting currency. For revenue_share pricing, spend = round_currency(commissionable_value \xD7 commission_rate). This is distinct from conversion_value because taxes, shipping, discounts, returns, cancellations, or ineligible items may be excluded under the agreed commission basis.").optional(), "roas": z.number().gte(0).describe("Return on ad spend (conversion_value / spend)").optional(), "cost_per_acquisition": z.number().gte(0).describe("Cost per conversion (spend / conversions)").optional(), "new_to_brand_rate": z.number().gte(0).lte(1).describe("Fraction of `conversions` (transactions) from first-time brand buyers, 0 = none, 1 = all. For retail-media unit-volume tracking of first-time buyers, see `new_to_brand_units` (count, not rate).").optional(), "leads": z.number().gte(0).describe("Leads generated (convenience alias for by_event_type where event_type='lead')").optional(), "incremental_sales_lift": z.number().gte(0).describe("Incremental sales lift attributed to the campaign \u2014 sales above the control/holdout baseline. Reported as a fraction (0.15 = 15% lift) or as an absolute value depending on seller convention. The seller's `attribution_methodology` qualifier (typically `deterministic_purchase` or `modeled`) and `attribution_window` qualifier on the matching `committed_metrics` entry disambiguate the methodology and window.").optional(), "brand_lift": z.number().gte(0).describe("Brand lift \u2014 measured change in a brand metric (awareness, consideration, favorability, purchase intent, or ad recall) attributed to the campaign. Typically panel-based or survey-based. Reported as a fraction (0.05 = 5% lift). **Multidimensional in production** \u2014 Kantar, Upwave, Cint, DV all report each dimension separately with its own sample size and confidence interval. The dimension flows through `qualifier.lift_dimension` on `committed_metrics` / `by_package[].metric_values` (`awareness` | `consideration` | `favorability` | `purchase_intent` | `ad_recall`); rows under different dimensions are different surveyed outcomes and must not be combined. Use `attribution_methodology: 'panel_based'` qualifier when the underlying methodology is a panel.").optional(), "foot_traffic": z.number().gte(0).describe("Store visits attributed to ad exposure. Count of incremental visits over baseline. Typically uses location-data panel methodology (`attribution_methodology: 'panel_based'`) or deterministic loyalty-card match (`attribution_methodology: 'deterministic_purchase'`).").optional(), "conversion_lift": z.number().gte(0).describe("Incremental conversions attributed to the campaign \u2014 conversions above the control/holdout baseline. Reported as a fraction (0.10 = 10% lift) or as an absolute count depending on seller convention. Distinct from `conversions` (raw count of attributed conversions); conversion_lift requires a control group and an incrementality methodology.").optional(), "brand_search_lift": z.number().gte(0).describe("Lift in brand search query volume attributed to the campaign \u2014 measured via search-data partnerships (Google, Microsoft) or survey methodology. Reported as a fraction (0.20 = 20% lift in branded search).").optional(), "plays": z.number().gte(0).describe("Number of times the ad creative was displayed or played on DOOH or broadcast inventory. Raw play count before any impression multiplier is applied. Mirrors `forecastable-metric.json`'s `plays` token for forecast\u2194delivery reconciliation. Distinct from `dooh_metrics.loop_plays` (scheduled-rotation count) and from `impressions` (multiplied audience figure).").optional(), "measurement_source": z.string().regex(new RegExp("^[a-z0-9_]+$")).max(64).describe("Third-party measurement provider whose data produced this row's audience numbers. Mirrors delivery-forecast.json's measurement_source so forecast and delivery reconcile on the same declaration \u2014 distinct from demographic_system, which specifies demographic notation. Makes measured-channel rows (radio, broadcast, OOH) self-describing: a reconciliation join can tie delivered numbers to the system that measured them without consulting out-of-band context. Lowercase slug format.").optional(), "by_event_type": z.array(z.object({ "event_type": z.enum(["page_view", "view_content", "select_content", "select_item", "search", "share", "add_to_cart", "remove_from_cart", "viewed_cart", "add_to_wishlist", "initiate_checkout", "add_payment_info", "purchase", "refund", "lead", "qualify_lead", "close_convert_lead", "disqualify_lead", "complete_registration", "subscribe", "follow", "content_view", "watch_milestone", "start_trial", "app_install", "app_launch", "contact", "schedule", "donate", "submit_application", "custom"]).describe("The event type"), "event_source_id": z.string().describe("Event source that produced these conversions (for disambiguation when multiple event sources are configured)").optional(), "count": z.number().gte(0).describe("Number of events of this type"), "value": z.number().gte(0).describe("Total monetary value of events of this type").optional() }).catchall(z.any())).describe("Conversion metrics broken down by event type. Spend-derived metrics (ROAS, CPA) are only available at the package/totals level since spend cannot be attributed to individual event types.").optional(), "grps": z.number().gte(0).describe("Gross Rating Points delivered (for CPP)").optional(), "reach": z.number().gte(0).describe("Unique reach in the units specified by reach_unit. When reach_unit is omitted, units are unspecified \u2014 do not compare reach values across packages or media buys without a common reach_unit. The measurement window for this value is declared in `reach_window`; when `reach_window` is omitted, the window is unspecified and buyers MUST NOT sum reach across reports (the value MAY be a daily snapshot, a cumulative total, or something else).").optional(), "reach_unit": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Unit of measurement for the reach field. Aligns with the reach_unit declared on optimization goals and delivery forecasts. Required when reach is present to enable cross-platform comparison.").optional(), "reach_window": z.object({ "kind": z.enum(["cumulative", "period", "rolling"]).describe("Window semantics. `cumulative` \u2014 uniques since campaign start; the value is the total unique count to date and MUST NOT be summed across rows (each later row supersedes the earlier value). `period` \u2014 uniques within a single non-overlapping reporting period (e.g., a daily snapshot for a specific calendar day). Adjacent `period` rows do not share audiences by construction, but the same person MAY appear across multiple periods, so MUST NOT be summed across rows to compute campaign reach. `rolling` \u2014 uniques within a trailing window ending at the row's reporting timestamp (e.g., trailing-7-day reach). Adjacent rolling rows overlap and MUST NOT be summed; each row's value stands alone."), "period": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Duration of the measurement window. REQUIRED when `kind` is `period` or `rolling` \u2014 declares the snapshot length (e.g., `{"interval": 1, "unit": "days"}` for a daily snapshot) or the trailing-window length (e.g., `{"interval": 7, "unit": "days"}` for trailing-7-day rolling reach). When `kind` is `cumulative`, this field is implicit (campaign-to-date) and SHOULD be omitted.').optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "kind": z.enum(["period", "rolling"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "kind": z.enum(["period", "rolling"]) }), z.object({ "period": z.any().refine((value) => value !== void 0, "Required") }).passthrough())]).describe("Must also satisfy at least one of these alternatives.")).describe("Measurement window for the reported `reach` and `frequency` values in this row. Declares whether the values are a per-period snapshot, a trailing rolling window, or cumulative-to-date \u2014 without this declaration, buyers summing `reach` across rows (e.g., daily delivery reports) can silently double-count audiences. Sellers SHOULD populate this whenever `reach` is present.").optional(), "frequency": z.number().gte(0).describe("Average frequency per reach unit, measured over the window declared in `reach_window`. When `reach_unit` is 'households', this is average exposures per household; when 'accounts', per logged-in account; etc. When `reach_window` is omitted, the window is unspecified \u2014 buyers MUST NOT compare or average frequency values across rows.").optional(), "quartile_data": z.union([z.object({ "q1_views": z.number().gte(0).describe("25% completion views").optional(), "q2_views": z.number().gte(0).describe("50% completion views").optional(), "q3_views": z.number().gte(0).describe("75% completion views").optional(), "q4_views": z.number().gte(0).describe("100% completion views").optional() }).describe("Audio/video quartile completion data. Null indicates the metric is not applicable to this package/buy (e.g. quartile data on a non-video buy). Individual quartiles are addressable via the leaf metric identities `quartile_25` (q1_views), `quartile_50` (q2_views), `quartile_75` (q3_views), and `quartile_100` (q4_views) for declaration, commitments, aggregates, and breakdown sorting; this object remains the canonical carrier of the values. Quartiles are player-fired events (VAST firstQuartile/midpoint/thirdQuartile/complete). `quartile_100` counts 100%-of-duration completions and is distinct from `completed_views`, which counts completions at the seller's billable view threshold (`view_duration_seconds`) when one is set."), z.null().describe("Audio/video quartile completion data. Null indicates the metric is not applicable to this package/buy (e.g. quartile data on a non-video buy). Individual quartiles are addressable via the leaf metric identities `quartile_25` (q1_views), `quartile_50` (q2_views), `quartile_75` (q3_views), and `quartile_100` (q4_views) for declaration, commitments, aggregates, and breakdown sorting; this object remains the canonical carrier of the values. Quartiles are player-fired events (VAST firstQuartile/midpoint/thirdQuartile/complete). `quartile_100` counts 100%-of-duration completions and is distinct from `completed_views`, which counts completions at the seller's billable view threshold (`view_duration_seconds`) when one is set.")]).describe("Audio/video quartile completion data. Null indicates the metric is not applicable to this package/buy (e.g. quartile data on a non-video buy). Individual quartiles are addressable via the leaf metric identities `quartile_25` (q1_views), `quartile_50` (q2_views), `quartile_75` (q3_views), and `quartile_100` (q4_views) for declaration, commitments, aggregates, and breakdown sorting; this object remains the canonical carrier of the values. Quartiles are player-fired events (VAST firstQuartile/midpoint/thirdQuartile/complete). `quartile_100` counts 100%-of-duration completions and is distinct from `completed_views`, which counts completions at the seller's billable view threshold (`view_duration_seconds`) when one is set.").optional(), "time_based_views": z.array(z.object({ "threshold_seconds": z.number().gt(0).describe("Continuous duration threshold in seconds an impression must meet to count as a view in this entry."), "basis": z.enum(["play_time", "in_view"]).describe("Whether the threshold clock runs on playback time or in-view time. Required because play-time and in-view counts at the same threshold are materially different numbers."), "views": z.number().gte(0).describe("Count of views meeting this entry's threshold and basis."), "standard": z.enum(["mrc", "groupm"]).describe("Viewability standard governing the in-view clock for this entry. RECOMMENDED when basis is 'in_view' (MRC and GroupM thresholds differ); not applicable to play_time entries.").optional() }).catchall(z.any())).describe("Time-threshold video view counts. Each entry reports views that met a continuous duration threshold under a stated basis, rather than a completion percentage (percentage-based completion is quartile_data). Thresholds of 2 and 6 seconds are RECOMMENDED cross-platform reporting points; any seller-defined threshold is permitted. One entry per (threshold_seconds, basis) pair per reporting period \u2014 sellers MUST de-duplicate before emission and MUST NOT emit the same pair twice; buyers MAY treat duplicate pairs as a seller-side conformance bug. Entries under different bases are different metrics and MUST NOT be summed (see view-threshold-basis). Primarily an autoplay/skippable-video metric (social, olv, in-feed video); completion metrics remain the currency for lean-back CTV/cinema inventory. Distinct from `views` (the single billable-threshold scalar) and from `viewability.viewed_seconds` (average in-view duration, not a threshold count). Array entries are not individually sortable in breakdown sort_by. Disclosure-grade surface: (threshold_seconds, basis) is not part of the committed-metric qualifier vocabulary, so a `committed_metrics` entry for `time_based_views` contracts the array's presence, not specific thresholds.").optional(), "dooh_metrics": z.object({ "loop_plays": z.number().int().gte(0).describe("Number of times ad played in rotation").optional(), "screens_used": z.number().int().gte(0).describe("Number of unique screens displaying the ad").optional(), "screen_time_seconds": z.number().int().gte(0).describe("Total display time in seconds").optional(), "sov_achieved": z.number().gte(0).lte(1).describe("Actual share of voice delivered on a 0.0-1.0 scale. To compare this achieved value with the selected flat-rate DOOH parameters.sov_percentage, multiply sov_achieved by 100. Share is time-weighted: the sum of the delivered segment durations divided by the full loop duration. On equal-duration loops this equals the slot-count ratio. See also ooh_metrics.share_of_voice_contracted, which uses the same 0.0-1.0 scale.").optional(), "calculation_notes": z.string().describe("Per-row supplementary methodology notes for DOOH impression calculation (e.g., 'rotation-based; 6-second slot weighted by 70% audience overlap'). Free-form prose for context that doesn't fit the structured measurement-vendor surface. Canonical methodology declarations belong on the measurement vendor's `get_adcp_capabilities.measurement.metrics[]` block where they're discoverable once and inherited across delivery rows; this field is for row-specific context (a particular daypart's calculation, a venue-mix exception) rather than the seller's general methodology.").optional(), "venue_breakdown": z.array(z.object({ "venue_id": z.string().describe("Venue identifier"), "venue_name": z.string().describe("Human-readable venue name").optional(), "venue_type": z.string().describe("Venue type (e.g., 'airport', 'transit', 'retail', 'billboard')").optional(), "impressions": z.number().int().gte(0).describe("Impressions delivered at this venue"), "loop_plays": z.number().int().gte(0).describe("Loop plays at this venue").optional(), "screens_used": z.number().int().gte(0).describe("Number of screens used at this venue").optional() }).catchall(z.any())).describe("Per-venue performance breakdown").optional() }).catchall(z.any()).describe("DOOH-specific metrics (only included for DOOH campaigns)").optional(), "ooh_metrics": z.object({ "panels": z.array(z.object({ "identifiers": z.array(z.object({ "id": z.string().describe("Panel/face identifier within the id_type namespace"), "id_type": z.enum(["geopath", "route_frame", "plant_face", "other"]).describe("Identifier scheme: geopath (US Geopath Spot ID), route_frame (UK Route frame ID), plant_face (the operator's own panel number \u2014 the identifier both sides of a direct contract know), other (markets without a listed scheme). New schemes ship as enum additions in minors.") }).catchall(z.any())).min(1).describe("All identifiers for this panel, one entry per scheme"), "name": z.string().describe("Human-readable location description (e.g., 'I-95 N of Exit 12, right-hand read')").optional() }).catchall(z.any())).describe("Panels (faces) covered by this row. A panel commonly carries multiple identifiers at once \u2014 OOH contracts key line items on the measurement-currency panel number AND the operator's own panel number together.").optional(), "posting_period_start": z.string().date().describe("First in-charge date of the posting period this row covers").optional(), "posting_period_end": z.string().date().describe("Last date of the posting period this row covers").optional(), "average_posted_date": z.string().date().describe("Average actual posting date across the row's units \u2014 the date the display term runs from under OAAA Bulletin \xA72.2 / Poster \xA73.2(a) when materials were timely. Read with materials_timely to know whether that rule was in force.").optional(), "materials_timely": z.boolean().describe("Seller's assertion that the buyer delivered acceptable materials by the contractual deadline, which determines whether the \xA72.2 posting-completion rule (term runs from average posting date) applied. An assertion about the buyer's delivery, not a derived value \u2014 it is not recomputable from postings[] evidence, and is the one field in this block that isn't checkable against it.").optional(), "share_of_voice_contracted": z.number().gte(0).lte(1).describe("Contracted share of voice where the buy is rotation-based (e.g., rotary bulletin programs) rather than an exclusive face, on a 0.0-1.0 scale. Share is time-weighted: the sum of contracted display durations divided by the full rotation duration. On equal-duration rotations this equals the slot-count ratio.").optional(), "illuminated_hours": z.number().gte(0).lte(24).describe("Contracted daily illumination hours for the panels in this row. Determines the measured day-part basis (12/18/24-hour impressions) and the illumination-credit remedy when unmet.").optional(), "estimated_impressions": z.number().int().gte(0).describe("Modeled audience impressions for the panels and period in this row. This is the channel's delivery number \u2014 there is no event-counted alternative. The methodology tier MUST be declared in estimation_basis; provider identity is declared in the row-level measurement_source; the billing vendor is declared in measurement_terms.billing_measurement. The row's top-level impressions SHOULD carry the same value so cross-channel aggregation works without channel-specific logic.").optional(), "estimation_basis": z.enum(["currency_measured", "seller_modeled"]).describe("Methodology tier of estimated_impressions: currency_measured (an audience measurement currency's estimate for the panel and period \u2014 Geopath, Route, MOVE, COMMB \u2014 with the provider named in the row-level measurement_source) or seller_modeled (the seller's own model \u2014 the honest fallback for markets without a measurement currency). Tier, not provider: currencies change over time, so provider identity is data on measurement_source, not values in this enum.").optional(), "postings": z.array(z.object({ "panel_id": z.string().describe("Panel reference matching one of panels[].identifiers[].id"), "event_type": z.enum(["posted", "rotated", "repaired", "removed"]).describe("What the record attests: initial posting, rotary rotation to a new face, repair/reposting after damage, or removal at flight end").default("posted"), "occurred_at": z.string().date().describe("Date the attested event happened. For posted events this is the posting date \u2014 display terms customarily run from the average posting date across units."), "evidence": z.object({ "url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("The evidence artifact \u2014 photograph, scanned tearsheet, or evidence package"), "captured_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "latitude": z.number().gte(-90).lte(90).describe("Capture location latitude").optional(), "longitude": z.number().gte(-180).lte(180).describe("Capture location longitude").optional(), "notes": z.string().describe("Context that doesn't fit the structured fields (e.g., 'shot from the eastbound approach at 40mph equivalent')").optional() }).catchall(z.any()).describe("Evidence artifact for this event (completion photograph); capture time and location ride the artifact").optional() }).catchall(z.any())).describe("Posting records \u2014 the seller-attested settlement artifact proving each panel was posted for the period. Industry convention (OAAA model contracts, Proof of Performance \xA73.5): photo evidence per bulletin within five calendar days of posting and again after each rotary rotation; one representative close-up photograph per creative design variation for poster showings (no deadline attached). Distinct from the \xA72.2 posting-completion obligation (posting within five business days of the scheduled date), which governs average_posted_date, not evidence.").optional(), "calculation_notes": z.string().describe("Row-specific methodology context that doesn't fit the structured fields (e.g., a partial-period proration or a market-specific estimate adjustment). Same role as dooh_metrics.calculation_notes \u2014 canonical methodology declarations belong on the measurement vendor's discoverable surfaces, not here.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "estimated_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "estimated_impressions": z.any().refine((value) => value !== void 0, "Required"), "estimation_basis": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Classic (static) OOH metrics \u2014 printed bulletins, posters, transit, and street furniture (only included for ooh campaigns). Experimental in AdCP 3.2. Static units have no play event: the delivery number is a period-level modeled audience estimate whose methodology tier is declared in estimation_basis (provider identity rides the row-level measurement_source), and the settlement artifact is the posting record \u2014 it proves the posting period, not an airing.").optional(), "viewability": z.object({ "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where /.well-known/brand.json is hosted, or the brand's operating domain"), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand identifier within the house portfolio. Optional for single-brand domains.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit for a global/default identity. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account identity and is not delivery targeting.").optional(), "industries": z.array(z.string()).describe("Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json.").optional(), "data_subject_contestation": z.object({ "url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).optional(), "email": z.string().email().optional(), "languages": z.array(z.string()).optional() }).strict().and(z.union([z.object({ "url": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "email": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand \u2192 house \u2192 missing.").optional(), "brand_kit_override": z.object({ "logo": z.object({ "asset_type": z.literal("image").describe("Discriminator identifying this as an image asset. See /schemas/creative/asset-types for the registry."), "url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to the image asset"), "width": z.number().int().gte(1).describe("Width in pixels"), "height": z.number().int().gte(1).describe("Height in pixels"), "file_size_bytes": z.number().int().gte(1).describe("Image file size in bytes. Required by agents that advertise a max_file_size_kb constraint.").optional(), "pixel_ratio": z.number().gt(0).describe("Intrinsic pixels per logical render pixel (for example `2` for a 600\xD7500 image intended to render at 300\xD7250). Optional because a validator can infer the ratio when the target format declares logical dimensions. When supplied, it MUST agree with both `width / logical_width` and `height / logical_height`; it is never a substitute for the intrinsic `width` and `height` fields.").optional(), "state_id": z.string().describe("Binding used only when this image populates a `seller_rendered_stateful_display` `state_canvases` slot. It MUST match one declared `states[].state_id` (semantic validators resolve it). Omit for ordinary image slots.").optional(), "breakpoint_id": z.string().describe("Binding used only when this image populates a `seller_rendered_stateful_display` `state_canvases` slot. It MUST match one breakpoint declared on the selected state (semantic validators resolve it). Omit for ordinary image slots.").optional(), "focal_point": z.array(z.number().gte(0).lte(1)).min(2).max(2).describe("Normalized `[x, y]` coordinates (0\u20131 from top-left) of the image's visual anchor. Seller-side renderers crop toward the focal point when deriving renditions across breakpoints and aspect ratios; absent, cropping falls back to center-weighted defaults.").optional(), "format": z.string().describe("Image file format (jpg, png, gif, webp, etc.)").optional(), "alt_text": z.string().describe("Alternative text for accessibility").optional(), "provenance": z.object({ "digital_source_type": z.enum(["digital_capture", "digital_creation", "trained_algorithmic_media", "composite_with_trained_algorithmic_media", "algorithmic_media", "composite_capture", "composite_synthetic", "human_edits", "data_driven_media"]).describe("IPTC-aligned classification of AI involvement in producing this content").optional(), "synthetic_depiction": z.boolean().describe("Assessed declaration of whether the content synthetically depicts a real or fictional person performing or appearing in a way that was generated or materially manipulated rather than captured as depicted. `true` covers both a fully synthetic performer and material manipulation of a real performer; `false` is an assessed declaration that the content does not contain such a depiction. Absence means the content has not been assessed for synthetic depiction. This field does not claim consent, legality, or independent verification, and receivers MUST NOT derive it solely from `digital_source_type`.").optional(), "ai_tool": z.object({ "name": z.string().describe("Name of the AI tool or model (e.g., 'DALL-E 3', 'Stable Diffusion XL', 'Gemini')"), "version": z.string().describe("Version identifier for the AI tool or model (e.g., '25.1', '0125', '2.1'). For generative models, use the model version rather than the API version.").optional(), "provider": z.string().describe("Organization that provides the AI tool (e.g., 'OpenAI', 'Stability AI', 'Google')").optional() }).describe("AI system used to generate or modify this content. Aligns with IPTC 2025.1 AI metadata fields and C2PA claim_generator.").optional(), "human_oversight": z.enum(["none", "prompt_only", "selected", "edited", "directed"]).describe("Level of human involvement in the AI-assisted creation process. Independent of `disclosure.required` \u2014 the protocol does not derive disclosure obligations from oversight level. Some regulations include carve-outs for human-edited or human-directed AI output, but those carve-outs have factual prerequisites the schema cannot evaluate. Asserting `edited` or `directed` does not by itself justify `disclosure.required: false`.").optional(), "declared_by": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent or service that declared this provenance").optional(), "role": z.enum(["creator", "advertiser", "agency", "platform", "tool"]).describe("Role of the declaring party in the supply chain") }).describe("Party declaring this provenance. Identifies who attached the provenance claim, enabling receiving parties to assess trust.").optional(), "declared_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "created_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "c2pa": z.object({ "manifest_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to the C2PA manifest store for this content") }).describe("C2PA sidecar manifest reference. Links to a detached cryptographic provenance manifest for this content. Note: file-level C2PA bindings break when ad servers transcode, resize, or re-encode assets. For pipelines with intermediaries, consider embedded_provenance as the primary provenance mechanism.").optional(), "embedded_provenance": z.array(z.object({ "method": z.enum(["manifest_wrapper", "provenance_markers"]).describe("How provenance data is carried within the content"), "standard": z.string().describe("Standard the embedding conforms to, if any (e.g., 'c2pa' for C2PA Section A.7 text manifest embedding)").optional(), "provider": z.string().describe("Organization that performed the embedding (e.g., 'Encypher', 'Digimarc'). Display label and audit context \u2014 not a wire identifier."), "verify_agent": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("URL of the governance agent the buyer represents was used to embed/verify this layer. MUST use the `https://` scheme and MUST appear in the seller's `creative_policy.accepted_verifiers[].agent_url` list (canonicalized per /docs/reference/url-canonicalization: lowercase scheme and host, strip default port, normalize path dot-segments). Sellers MUST NOT call this URL until the canonicalized match is confirmed."), "feature_id": z.string().describe("Optional `feature_id` the buyer represents the seller should request via `get_creative_features` (e.g., `encypher.markers_present_v2`). SHOULD match the `feature_id` declared on the matching `accepted_verifiers[]` entry, or be omitted to defer the selector to the seller. When the seller's entry pins a `feature_id`, that value wins; when neither side pins, the seller selects from the agent's `governance.creative_features` catalog.").optional() }).strict().describe("Buyer's representation that this embedding can be verified by a governance agent on the seller's `creative_policy.accepted_verifiers` list. The `agent_url` MUST match (canonicalized) one of the seller's published `accepted_verifiers[].agent_url` entries; sellers reject `sync_creatives` submissions whose `verify_agent.agent_url` is off-list with `PROVENANCE_VERIFIER_NOT_ACCEPTED`. This is buyer-supplied evidence, not buyer-driven routing \u2014 the seller is the verifier-of-record and the seller controls which agent it actually calls (the seller MAY use a different on-list agent if it determines this is more appropriate; the seller does not call buyer-asserted endpoints outside its allowlist). MAY be omitted for self-verifiable embeddings (e.g., a C2PA text manifest with a public key the seller already trusts).").optional(), "embedded_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() })).min(1).describe("Provenance metadata embedded within the content stream. Each entry declares one embedding layer: structured provenance data carried inside the content itself, as distinct from sidecar references (c2pa.manifest_url). Embedded provenance survives operations that break sidecar and file-level bindings: ad-server transcoding, CMS ingestion, copy-paste, reformatting, and CDN re-encoding. For ad-tech pipelines where content passes through multiple intermediaries, embedded provenance is the reliable path for provenance that persists from declaration through delivery. This is a declaration by the embedding party. The receiving party (the seller) is the verifier-of-record: it confirms the claim by calling a governance agent it trusts (typically one published in `creative_policy.accepted_verifiers`).").optional(), "watermarks": z.array(z.object({ "media_type": z.enum(["audio", "image", "video", "text"]).describe("Media category of the watermarked content"), "provider": z.string().describe("Organization that applied the watermark (e.g., 'Imatag', 'Steg.AI', 'Encypher'). Display label and audit context \u2014 not a wire identifier."), "verify_agent": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("URL of the governance agent the buyer represents was used to apply/detect this watermark. MUST use the `https://` scheme and MUST appear in the seller's `creative_policy.accepted_verifiers[].agent_url` list (canonicalized per /docs/reference/url-canonicalization: lowercase scheme and host, strip default port, normalize path dot-segments). Sellers MUST NOT call this URL until the canonicalized match is confirmed."), "feature_id": z.string().describe("Optional `feature_id` the buyer represents the seller should request via `get_creative_features` (e.g., `imatag.watermark_detected`). SHOULD match the `feature_id` declared on the matching `accepted_verifiers[]` entry, or be omitted to defer the selector to the seller. When the seller's entry pins a `feature_id`, that value wins; when neither side pins, the seller selects from the agent's `governance.creative_features` catalog.").optional() }).strict().describe("Buyer's representation that this watermark can be detected by a governance agent on the seller's `creative_policy.accepted_verifiers` list. The `agent_url` MUST match (canonicalized) one of the seller's published `accepted_verifiers[].agent_url` entries; sellers reject `sync_creatives` submissions whose `verify_agent.agent_url` is off-list with `PROVENANCE_VERIFIER_NOT_ACCEPTED`. This is buyer-supplied evidence, not buyer-driven routing \u2014 the seller is the verifier-of-record and the seller controls which agent it actually calls (the seller MAY use a different on-list agent if it determines this is more appropriate; the seller does not call buyer-asserted endpoints outside its allowlist).").optional(), "c2pa_action": z.enum(["c2pa.watermarked.bound", "c2pa.watermarked.unbound"]).describe("C2PA action classification for this watermark").optional(), "embedded_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() })).min(1).describe("Content watermarks applied to this asset. Each entry declares one watermarking layer: a content modification that encodes an identifier or fingerprint within the asset. Watermarks differ from embedded provenance: a watermark encodes an identifier (who generated it, who owns it), while embedded provenance carries or references a structured provenance record (the full chain of custody). A single asset may carry both. Aligns with C2PA action taxonomy: c2pa.watermarked.bound (watermark linked to a C2PA manifest) and c2pa.watermarked.unbound (watermark independent of any manifest). This is a declaration by the watermarking party. The receiving party (the seller) is the verifier-of-record: it confirms the claim by calling a governance agent it trusts (typically one published in `creative_policy.accepted_verifiers`).").optional(), "disclosure": z.object({ "required": z.boolean().describe("The declaring party's claim that AI disclosure is required for this content under applicable regulations. This is a declared signal carried through the supply chain \u2014 useful as a routing and audit input \u2014 not a regulatory determination made by the protocol. Receiving parties remain responsible for their own jurisdictional analysis and should not treat `required: false` as compliance cover."), "jurisdictions": z.array(z.object({ "country": z.string().describe("ISO 3166-1 alpha-2 country code (e.g., 'US', 'DE', 'CN')"), "region": z.string().describe("Sub-national region code (e.g., 'CA' for California, 'BY' for Bavaria)").optional(), "regulation": z.string().describe("Regulation identifier (e.g., 'eu_ai_act_article_50', 'ca_sb_942', 'cn_deep_synthesis')"), "label_text": z.string().describe("Required disclosure label text for this jurisdiction, in the local language").optional(), "render_guidance": z.object({ "persistence": z.enum(["continuous", "initial", "flexible"]).describe("How long the disclosure must persist during content playback or display").optional(), "min_duration_ms": z.number().int().gte(1).describe("Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available.").optional(), "positions": z.array(z.enum(["prominent", "footer", "audio", "subtitle", "overlay", "end_card", "pre_roll", "companion"]).describe("Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Preferred disclosure positions in priority order. The first position a format supports should be used.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).describe("How the disclosure should be rendered for this jurisdiction. Expresses the declaring party's intent for persistence and position based on regulatory requirements. Publishers control actual rendering but governance agents can audit whether guidance was followed.").refine((value) => Object.keys(value).length >= 1, "Object must contain at least 1 property").optional() })).min(1).describe("Jurisdictions where disclosure obligations apply").optional() }).describe("Regulatory disclosure requirements for this content. Indicates whether AI disclosure is required and under which jurisdictions.").optional(), "verification": z.array(z.object({ "verified_by": z.string().describe("Name of the verification service (e.g., 'DoubleVerify', 'Hive Moderation', 'Reality Defender')"), "verified_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "result": z.enum(["authentic", "ai_generated", "ai_modified", "inconclusive"]).describe("Verification outcome"), "confidence": z.number().gte(0).lte(1).describe("Confidence score of the verification result (0.0 to 1.0)").optional(), "details_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to the full verification report").optional() })).min(1).describe("Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).describe("Provenance metadata for this asset, overrides manifest-level provenance").optional() }).catchall(z.any()).describe("Override logo asset.").optional(), "colors": z.object({ "primary": z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional(), "secondary": z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional(), "accent": z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional() }).catchall(z.any()).describe("Override brand colors (hex strings).").optional(), "voice": z.string().describe("Override brand-voice description for surface-composed text/audio output.").optional(), "tagline": z.string().describe("Override tagline.").optional() }).catchall(z.any()).describe("Inline override for brand-kit fields normally resolved from `/.well-known/brand.json` on `domain` (logo, colors, voice, tagline). Use when brand.json is missing, stale, or inappropriate for this specific call \u2014 e.g., a campaign-scoped tagline, a co-branded creative, a freshly-rebranded color palette the brand.json hasn't shipped yet. Same inline-override pattern as `industries` and `data_subject_contestation` above: brand.json is canonical, the override is per-call. Adopters needing to override fields outside this subset (`voice_attributes`, `prohibited_terms`, etc.) MUST publish a different brand.json and reference it via a different `domain` \u2014 the inline override is intentionally narrow to a small high-traffic subset.\n\n**Merge semantics (normative).** The merge is **field-level**, not whole-object replacement. Each field within `brand_kit_override` (`logo`, `colors`, `voice`, `tagline`) is evaluated independently \u2014 when a field is present on the override the override value applies; when a field is absent the brand.json value applies (or is absent if brand.json doesn't carry one either). For composite fields (`colors.primary`, `colors.secondary`, `colors.accent`), the merge is one level deeper: each color slot is evaluated independently \u2014 a producer can override `colors.primary` while still inheriting `colors.secondary` from brand.json. SDKs MUST NOT treat a present `brand_kit_override.colors` as wiping the brand.json `colors` block entirely; only the per-slot fields present in the override take precedence. Without this rule, a partial-override semantics would diverge across SDKs and produce inconsistent rendering for the same payload.").optional() }).strict().describe("Vendor that produced these viewability values. Optional but RECOMMENDED so the row is self-describing \u2014 buyer agents reading delivery in isolation can attribute the numbers without joining back to `package.committed_metrics` or `package.performance_standards`. The vendor's `brand.json` `agents[type='measurement']` is the discovery anchor; the metric definitions live on the agent's `get_adcp_capabilities.measurement.metrics[]` block. Same shape as `vendor_metric_value.vendor` for symmetry across vendor-attested surfaces.").optional(), "measurable_impressions": z.number().gte(0).describe("Impressions where viewability could be measured. Excludes environments without measurement capability (e.g., non-Intersection Observer browsers, certain app environments). Coverage denominator for `viewable_rate`, `viewed_seconds`, and both viewed-seconds distributions \u2014 every duration statistic is computed over this same measurable population.").optional(), "viewable_impressions": z.number().gte(0).describe("Impressions that met the viewability threshold defined by the measurement standard.").optional(), "viewable_rate": z.number().gte(0).lte(1).describe("Viewable impression rate (viewable_impressions / measurable_impressions). Range 0.0 to 1.0.").optional(), "viewed_seconds": z.number().gte(0).describe("Average in-view duration per measurable impression, in seconds. Reporting-side counterpart to the `viewed_seconds` optimization metric in `optimization-goal.json`. Computed over `measurable_impressions`, not total impressions \u2014 the same denominator as `viewable_rate`. The viewability `standard` governs the threshold (e.g., MRC's 50% pixels for 1s display / 2s video) that defines when an impression is in view and therefore when the clock is running. Sellers reporting against a `viewed_seconds` optimization goal MUST populate this field.").optional(), "viewed_seconds_percentiles": z.object({ "p25": z.number().gte(0).describe("25th-percentile in-view duration in seconds."), "p50": z.number().gte(0).describe("Median (50th-percentile) in-view duration in seconds."), "p75": z.number().gte(0).describe("75th-percentile in-view duration in seconds."), "p90": z.number().gte(0).describe("90th-percentile in-view duration in seconds."), "p95": z.number().gte(0).describe("95th-percentile in-view duration in seconds.") }).strict().describe("Percentile summary of the per-impression in-view durations whose arithmetic mean is reported in `viewed_seconds`. This object MUST use the same reporting row, measurement vendor, viewability `standard`, and `measurable_impressions` population as `viewed_seconds`; sellers MUST omit it when `measurable_impressions` is zero. Percentiles use the nearest-rank definition: sort the N observed durations in ascending order and select rank `ceil(p \xD7 N)` (one-based) for percentile p. Values MUST be non-decreasing from p25 through p95. The structured metric identity `viewed_seconds_percentiles` makes this optional surface discoverable and requestable; it is not sortable and the nested object remains the canonical carrier.").optional(), "viewed_seconds_histogram": z.array(z.object({ "lower_bound_seconds": z.number().gte(0).describe("Inclusive lower bound of this duration bucket, in seconds."), "upper_bound_seconds": z.number().gte(0).describe("Exclusive upper bound of this duration bucket, in seconds. MUST be greater than `lower_bound_seconds`. Omit only on the final bucket to represent an unbounded upper range.").optional(), "impressions": z.number().int().gte(0).describe("Number of measurable impressions whose in-view duration falls in this bucket.") }).strict()).min(1).describe("Bucketed counts of the per-impression in-view durations whose arithmetic mean is reported in `viewed_seconds`. Buckets MUST be ordered by ascending lower bound, MUST NOT overlap, and MUST partition every impression in the same `measurable_impressions` population exactly once; therefore the sum of `impressions` MUST equal `measurable_impressions`. Buckets need not be contiguous: a gap between consecutive bucket boundaries is permitted when no impressions fall within that range \u2014 the sum constraint enforces this implicitly, and validators MUST NOT independently require contiguity. Each bucket is half-open `[lower_bound_seconds, upper_bound_seconds)`; only the final bucket MAY omit `upper_bound_seconds`, representing an unbounded upper range. Sellers choose boundaries, but buyers MUST combine histograms only when the complete boundary sequence, measurement vendor, and viewability `standard` match. The structured metric identity `viewed_seconds_histogram` makes this optional surface discoverable and requestable; it is not sortable and this nested array remains the canonical carrier.").optional(), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to these metrics. Governs the in-view threshold for `viewable_rate`, `viewed_seconds`, and both viewed-seconds distributions.").optional() }).catchall(z.any()).and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "viewed_seconds_percentiles": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "viewed_seconds_percentiles": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "measurable_impressions": z.number().int().gte(1).optional() }))]), z.union([z.any().refine((value) => !z.object({ "viewed_seconds_histogram": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "viewed_seconds_histogram": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "measurable_impressions": z.number().int().optional() }))])), z.intersection(z.union([z.any().refine((value) => !z.object({ "viewed_seconds_percentiles": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "viewed_seconds_percentiles": z.any().refine((value) => value !== void 0, "Required"), "viewed_seconds": z.any().refine((value) => value !== void 0, "Required"), "measurable_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "viewed_seconds_histogram": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "viewed_seconds_histogram": z.any().refine((value) => value !== void 0, "Required"), "viewed_seconds": z.any().refine((value) => value !== void 0, "Required"), "measurable_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Viewability metrics. Viewable rate should be calculated as viewable_impressions / measurable_impressions (not total impressions), since some environments cannot measure viewability. Includes `viewed_seconds` \u2014 average in-view duration \u2014 plus optional percentile and histogram distributions over that duration; all three use the same `measurable_impressions` population and are governed by the same viewability threshold (`standard`). Sellers SHOULD include `standard` whenever measured viewability values are reported because MRC and GroupM rows are not interchangeable. The numeric leaves are addressable via the leaf metric identities `viewable_rate`, `viewable_impressions`, `measurable_impressions`, and `viewed_seconds` for declaration, commitments, aggregates, and breakdown sorting. The structured distribution carriers require explicit `viewed_seconds_percentiles` and `viewed_seconds_histogram` identities for declaration, commitment, and selection; they are not numeric aggregate rows or sort keys. This object remains the canonical carrier of every value. When a buy reports under more than one standard, contract a specific standard via the `viewability_standard` qualifier on `committed_metrics`; when the package's `committed_metrics` carry a `viewability_standard` qualifier, sellers MUST populate `standard` on reported viewability objects so reconciliation can match the qualifier.").optional(), "engagements": z.number().gte(0).describe("Total engagements \u2014 direct interactions with the ad beyond viewing. Includes social reactions/comments/shares, story/unit opens, interactive overlay taps on CTV, companion banner interactions on audio. Platform-specific; corresponds to the 'engagements' optimization metric. Maps to DBCFM KPI_INTERACTIONS (Interaktionen) in the Reporting/Performance block.").optional(), "follows": z.number().gte(0).describe("New followers, page likes, artist/podcast/channel follows, or free channel/feed subscribes attributed to this delivery. Paid subscriptions are conversion events with `event_type: subscribe`, not `follows`.").optional(), "saves": z.number().gte(0).describe("Saves, bookmarks, playlist adds, pins attributed to this delivery.").optional(), "profile_visits": z.number().gte(0).describe("Visits to the brand's in-platform page (profile, artist page, channel, or storefront) attributed to this delivery. Does not include external website clicks.").optional(), "engagement_rate": z.number().gte(0).lte(1).describe("Platform-specific engagement rate (0.0 to 1.0). Typically engagements/impressions, but definition varies by platform.").optional(), "cost_per_click": z.number().gte(0).describe("Cost per click (spend / clicks)").optional(), "cost_per_completed_view": z.number().gte(0).describe("Cost per completed view (spend / completed_views). Primary CPCV pricing scalar for video/audio inventory; the package's `pricing_model` is `cpcv` when this field is the billing basis.").optional(), "cpm": z.number().gte(0).describe("Cost per thousand impressions, computed as (spend / impressions) \xD7 1000. Universal pricing scalar across CTV, display, mobile/web video, native, audio, and DOOH inventory; the package's `pricing_model` is `cpm` when this field is the billing basis. Field name aligns with the canonical `cpm` token in `enums/pricing-model.json` and `pricing-options/cpm-option.json` so buyers cross-walk pricing model \u2192 reported scalar without a translation table.").optional(), "downloads": z.number().gte(0).describe("Audio/podcast downloads (IAB Podcast Measurement Technical Guidelines 2.x methodology). Distinct from `views` \u2014 for podcast inventory this is the count of podcast episode downloads; for streaming audio it is the count of stream starts that meet the platform's download threshold. Prefer this over `views` for audio inventory.").optional(), "units_sold": z.number().gte(0).describe("Items sold attributed to this delivery. Retail-media scalar distinct from `conversions` \u2014 a single conversion (transaction) may carry multiple `units_sold`. Used by retail media platforms where the buyer optimizes against unit movement, not transaction count. Attribution lookback windows are platform-specific (commonly 7/14/30 days, view-through and click-through variants); sellers SHOULD declare the window via `reporting_capabilities.measurement_windows` or `measurement_terms` rather than encoding it in this scalar.").optional(), "new_to_brand_units": z.number().gte(0).describe("Units sold to first-time brand buyers (count, not rate). Retail-media scalar \u2014 the unit-volume parallel to the conversion-fraction `new_to_brand_rate`. Used by retail media platforms where new-customer acquisition unit volume is a primary KPI. Same attribution-window note as `units_sold` applies.").optional(), "by_action_source": z.array(z.object({ "action_source": z.enum(["website", "app", "offline", "phone_call", "chat", "email", "in_store", "system_generated", "other"]).describe("Where the conversion occurred"), "event_source_id": z.string().describe("Event source that produced these conversions (for disambiguation when multiple event sources are configured)").optional(), "count": z.number().gte(0).describe("Number of conversions from this action source"), "value": z.number().gte(0).describe("Total monetary value of conversions from this action source").optional() }).catchall(z.any())).describe("Conversion metrics broken down by action source (website, app, in_store, etc.). Useful for omnichannel sellers where conversions occur across digital and physical channels.").optional(), "vendor_metric_values": z.array(z.object({ "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where /.well-known/brand.json is hosted, or the brand's operating domain"), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand identifier within the house portfolio. Optional for single-brand domains.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit for a global/default identity. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account identity and is not delivery targeting.").optional(), "industries": z.array(z.string()).describe("Inline override for the brand's industries. Useful when the caller cannot modify the brand's canonical brand.json but needs to declare industries for governance (e.g., Annex III vertical detection). brand.json remains the canonical source; when omitted here, governance agents SHOULD resolve from brand.json.").optional(), "data_subject_contestation": z.object({ "url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).optional(), "email": z.string().email().optional(), "languages": z.array(z.string()).optional() }).strict().and(z.union([z.object({ "url": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "email": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Inline override for the brand's contestation contact point. Useful when the operator does not control brand.json but needs to discharge Art 22(3) for this plan. brand.json is canonical; when omitted, governance agents resolve brand \u2192 house \u2192 missing.").optional(), "brand_kit_override": z.object({ "logo": z.object({ "asset_type": z.literal("image").describe("Discriminator identifying this as an image asset. See /schemas/creative/asset-types for the registry."), "url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to the image asset"), "width": z.number().int().gte(1).describe("Width in pixels"), "height": z.number().int().gte(1).describe("Height in pixels"), "file_size_bytes": z.number().int().gte(1).describe("Image file size in bytes. Required by agents that advertise a max_file_size_kb constraint.").optional(), "pixel_ratio": z.number().gt(0).describe("Intrinsic pixels per logical render pixel (for example `2` for a 600\xD7500 image intended to render at 300\xD7250). Optional because a validator can infer the ratio when the target format declares logical dimensions. When supplied, it MUST agree with both `width / logical_width` and `height / logical_height`; it is never a substitute for the intrinsic `width` and `height` fields.").optional(), "state_id": z.string().describe("Binding used only when this image populates a `seller_rendered_stateful_display` `state_canvases` slot. It MUST match one declared `states[].state_id` (semantic validators resolve it). Omit for ordinary image slots.").optional(), "breakpoint_id": z.string().describe("Binding used only when this image populates a `seller_rendered_stateful_display` `state_canvases` slot. It MUST match one breakpoint declared on the selected state (semantic validators resolve it). Omit for ordinary image slots.").optional(), "focal_point": z.array(z.number().gte(0).lte(1)).min(2).max(2).describe("Normalized `[x, y]` coordinates (0\u20131 from top-left) of the image's visual anchor. Seller-side renderers crop toward the focal point when deriving renditions across breakpoints and aspect ratios; absent, cropping falls back to center-weighted defaults.").optional(), "format": z.string().describe("Image file format (jpg, png, gif, webp, etc.)").optional(), "alt_text": z.string().describe("Alternative text for accessibility").optional(), "provenance": z.object({ "digital_source_type": z.enum(["digital_capture", "digital_creation", "trained_algorithmic_media", "composite_with_trained_algorithmic_media", "algorithmic_media", "composite_capture", "composite_synthetic", "human_edits", "data_driven_media"]).describe("IPTC-aligned classification of AI involvement in producing this content").optional(), "synthetic_depiction": z.boolean().describe("Assessed declaration of whether the content synthetically depicts a real or fictional person performing or appearing in a way that was generated or materially manipulated rather than captured as depicted. `true` covers both a fully synthetic performer and material manipulation of a real performer; `false` is an assessed declaration that the content does not contain such a depiction. Absence means the content has not been assessed for synthetic depiction. This field does not claim consent, legality, or independent verification, and receivers MUST NOT derive it solely from `digital_source_type`.").optional(), "ai_tool": z.object({ "name": z.string().describe("Name of the AI tool or model (e.g., 'DALL-E 3', 'Stable Diffusion XL', 'Gemini')"), "version": z.string().describe("Version identifier for the AI tool or model (e.g., '25.1', '0125', '2.1'). For generative models, use the model version rather than the API version.").optional(), "provider": z.string().describe("Organization that provides the AI tool (e.g., 'OpenAI', 'Stability AI', 'Google')").optional() }).describe("AI system used to generate or modify this content. Aligns with IPTC 2025.1 AI metadata fields and C2PA claim_generator.").optional(), "human_oversight": z.enum(["none", "prompt_only", "selected", "edited", "directed"]).describe("Level of human involvement in the AI-assisted creation process. Independent of `disclosure.required` \u2014 the protocol does not derive disclosure obligations from oversight level. Some regulations include carve-outs for human-edited or human-directed AI output, but those carve-outs have factual prerequisites the schema cannot evaluate. Asserting `edited` or `directed` does not by itself justify `disclosure.required: false`.").optional(), "declared_by": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent or service that declared this provenance").optional(), "role": z.enum(["creator", "advertiser", "agency", "platform", "tool"]).describe("Role of the declaring party in the supply chain") }).describe("Party declaring this provenance. Identifies who attached the provenance claim, enabling receiving parties to assess trust.").optional(), "declared_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "created_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "c2pa": z.object({ "manifest_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to the C2PA manifest store for this content") }).describe("C2PA sidecar manifest reference. Links to a detached cryptographic provenance manifest for this content. Note: file-level C2PA bindings break when ad servers transcode, resize, or re-encode assets. For pipelines with intermediaries, consider embedded_provenance as the primary provenance mechanism.").optional(), "embedded_provenance": z.array(z.object({ "method": z.enum(["manifest_wrapper", "provenance_markers"]).describe("How provenance data is carried within the content"), "standard": z.string().describe("Standard the embedding conforms to, if any (e.g., 'c2pa' for C2PA Section A.7 text manifest embedding)").optional(), "provider": z.string().describe("Organization that performed the embedding (e.g., 'Encypher', 'Digimarc'). Display label and audit context \u2014 not a wire identifier."), "verify_agent": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("URL of the governance agent the buyer represents was used to embed/verify this layer. MUST use the `https://` scheme and MUST appear in the seller's `creative_policy.accepted_verifiers[].agent_url` list (canonicalized per /docs/reference/url-canonicalization: lowercase scheme and host, strip default port, normalize path dot-segments). Sellers MUST NOT call this URL until the canonicalized match is confirmed."), "feature_id": z.string().describe("Optional `feature_id` the buyer represents the seller should request via `get_creative_features` (e.g., `encypher.markers_present_v2`). SHOULD match the `feature_id` declared on the matching `accepted_verifiers[]` entry, or be omitted to defer the selector to the seller. When the seller's entry pins a `feature_id`, that value wins; when neither side pins, the seller selects from the agent's `governance.creative_features` catalog.").optional() }).strict().describe("Buyer's representation that this embedding can be verified by a governance agent on the seller's `creative_policy.accepted_verifiers` list. The `agent_url` MUST match (canonicalized) one of the seller's published `accepted_verifiers[].agent_url` entries; sellers reject `sync_creatives` submissions whose `verify_agent.agent_url` is off-list with `PROVENANCE_VERIFIER_NOT_ACCEPTED`. This is buyer-supplied evidence, not buyer-driven routing \u2014 the seller is the verifier-of-record and the seller controls which agent it actually calls (the seller MAY use a different on-list agent if it determines this is more appropriate; the seller does not call buyer-asserted endpoints outside its allowlist). MAY be omitted for self-verifiable embeddings (e.g., a C2PA text manifest with a public key the seller already trusts).").optional(), "embedded_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() })).min(1).describe("Provenance metadata embedded within the content stream. Each entry declares one embedding layer: structured provenance data carried inside the content itself, as distinct from sidecar references (c2pa.manifest_url). Embedded provenance survives operations that break sidecar and file-level bindings: ad-server transcoding, CMS ingestion, copy-paste, reformatting, and CDN re-encoding. For ad-tech pipelines where content passes through multiple intermediaries, embedded provenance is the reliable path for provenance that persists from declaration through delivery. This is a declaration by the embedding party. The receiving party (the seller) is the verifier-of-record: it confirms the claim by calling a governance agent it trusts (typically one published in `creative_policy.accepted_verifiers`).").optional(), "watermarks": z.array(z.object({ "media_type": z.enum(["audio", "image", "video", "text"]).describe("Media category of the watermarked content"), "provider": z.string().describe("Organization that applied the watermark (e.g., 'Imatag', 'Steg.AI', 'Encypher'). Display label and audit context \u2014 not a wire identifier."), "verify_agent": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://")).describe("URL of the governance agent the buyer represents was used to apply/detect this watermark. MUST use the `https://` scheme and MUST appear in the seller's `creative_policy.accepted_verifiers[].agent_url` list (canonicalized per /docs/reference/url-canonicalization: lowercase scheme and host, strip default port, normalize path dot-segments). Sellers MUST NOT call this URL until the canonicalized match is confirmed."), "feature_id": z.string().describe("Optional `feature_id` the buyer represents the seller should request via `get_creative_features` (e.g., `imatag.watermark_detected`). SHOULD match the `feature_id` declared on the matching `accepted_verifiers[]` entry, or be omitted to defer the selector to the seller. When the seller's entry pins a `feature_id`, that value wins; when neither side pins, the seller selects from the agent's `governance.creative_features` catalog.").optional() }).strict().describe("Buyer's representation that this watermark can be detected by a governance agent on the seller's `creative_policy.accepted_verifiers` list. The `agent_url` MUST match (canonicalized) one of the seller's published `accepted_verifiers[].agent_url` entries; sellers reject `sync_creatives` submissions whose `verify_agent.agent_url` is off-list with `PROVENANCE_VERIFIER_NOT_ACCEPTED`. This is buyer-supplied evidence, not buyer-driven routing \u2014 the seller is the verifier-of-record and the seller controls which agent it actually calls (the seller MAY use a different on-list agent if it determines this is more appropriate; the seller does not call buyer-asserted endpoints outside its allowlist).").optional(), "c2pa_action": z.enum(["c2pa.watermarked.bound", "c2pa.watermarked.unbound"]).describe("C2PA action classification for this watermark").optional(), "embedded_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() })).min(1).describe("Content watermarks applied to this asset. Each entry declares one watermarking layer: a content modification that encodes an identifier or fingerprint within the asset. Watermarks differ from embedded provenance: a watermark encodes an identifier (who generated it, who owns it), while embedded provenance carries or references a structured provenance record (the full chain of custody). A single asset may carry both. Aligns with C2PA action taxonomy: c2pa.watermarked.bound (watermark linked to a C2PA manifest) and c2pa.watermarked.unbound (watermark independent of any manifest). This is a declaration by the watermarking party. The receiving party (the seller) is the verifier-of-record: it confirms the claim by calling a governance agent it trusts (typically one published in `creative_policy.accepted_verifiers`).").optional(), "disclosure": z.object({ "required": z.boolean().describe("The declaring party's claim that AI disclosure is required for this content under applicable regulations. This is a declared signal carried through the supply chain \u2014 useful as a routing and audit input \u2014 not a regulatory determination made by the protocol. Receiving parties remain responsible for their own jurisdictional analysis and should not treat `required: false` as compliance cover."), "jurisdictions": z.array(z.object({ "country": z.string().describe("ISO 3166-1 alpha-2 country code (e.g., 'US', 'DE', 'CN')"), "region": z.string().describe("Sub-national region code (e.g., 'CA' for California, 'BY' for Bavaria)").optional(), "regulation": z.string().describe("Regulation identifier (e.g., 'eu_ai_act_article_50', 'ca_sb_942', 'cn_deep_synthesis')"), "label_text": z.string().describe("Required disclosure label text for this jurisdiction, in the local language").optional(), "render_guidance": z.object({ "persistence": z.enum(["continuous", "initial", "flexible"]).describe("How long the disclosure must persist during content playback or display").optional(), "min_duration_ms": z.number().int().gte(1).describe("Minimum display duration in milliseconds for initial persistence. Recommended when persistence is initial \u2014 without it, the duration is at the publisher's discretion. At serve time the publisher reads this from provenance since the brief is not available.").optional(), "positions": z.array(z.enum(["prominent", "footer", "audio", "subtitle", "overlay", "end_card", "pre_roll", "companion"]).describe("Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Preferred disclosure positions in priority order. The first position a format supports should be used.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).describe("How the disclosure should be rendered for this jurisdiction. Expresses the declaring party's intent for persistence and position based on regulatory requirements. Publishers control actual rendering but governance agents can audit whether guidance was followed.").refine((value) => Object.keys(value).length >= 1, "Object must contain at least 1 property").optional() })).min(1).describe("Jurisdictions where disclosure obligations apply").optional() }).describe("Regulatory disclosure requirements for this content. Indicates whether AI disclosure is required and under which jurisdictions.").optional(), "verification": z.array(z.object({ "verified_by": z.string().describe("Name of the verification service (e.g., 'DoubleVerify', 'Hive Moderation', 'Reality Defender')"), "verified_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "result": z.enum(["authentic", "ai_generated", "ai_modified", "inconclusive"]).describe("Verification outcome"), "confidence": z.number().gte(0).lte(1).describe("Confidence score of the verification result (0.0 to 1.0)").optional(), "details_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to the full verification report").optional() })).min(1).describe("Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim \u2014 verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).describe("Provenance metadata for this asset, overrides manifest-level provenance").optional() }).catchall(z.any()).describe("Override logo asset.").optional(), "colors": z.object({ "primary": z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional(), "secondary": z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional(), "accent": z.string().regex(new RegExp("^#[0-9a-fA-F]{6}$")).optional() }).catchall(z.any()).describe("Override brand colors (hex strings).").optional(), "voice": z.string().describe("Override brand-voice description for surface-composed text/audio output.").optional(), "tagline": z.string().describe("Override tagline.").optional() }).catchall(z.any()).describe("Inline override for brand-kit fields normally resolved from `/.well-known/brand.json` on `domain` (logo, colors, voice, tagline). Use when brand.json is missing, stale, or inappropriate for this specific call \u2014 e.g., a campaign-scoped tagline, a co-branded creative, a freshly-rebranded color palette the brand.json hasn't shipped yet. Same inline-override pattern as `industries` and `data_subject_contestation` above: brand.json is canonical, the override is per-call. Adopters needing to override fields outside this subset (`voice_attributes`, `prohibited_terms`, etc.) MUST publish a different brand.json and reference it via a different `domain` \u2014 the inline override is intentionally narrow to a small high-traffic subset.\n\n**Merge semantics (normative).** The merge is **field-level**, not whole-object replacement. Each field within `brand_kit_override` (`logo`, `colors`, `voice`, `tagline`) is evaluated independently \u2014 when a field is present on the override the override value applies; when a field is absent the brand.json value applies (or is absent if brand.json doesn't carry one either). For composite fields (`colors.primary`, `colors.secondary`, `colors.accent`), the merge is one level deeper: each color slot is evaluated independently \u2014 a producer can override `colors.primary` while still inheriting `colors.secondary` from brand.json. SDKs MUST NOT treat a present `brand_kit_override.colors` as wiping the brand.json `colors` block entirely; only the per-slot fields present in the override take precedence. Without this rule, a partial-override semantics would diverge across SDKs and produce inconsistent rendering for the same payload.").optional() }).strict().describe("Vendor that produced this value. Matches a `vendor_metrics[].vendor` declaration on the product."), "metric_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).min(1).max(64).describe("Identifier for the metric within the vendor's vocabulary. Matches a `vendor_metrics[].metric_id` declaration on the product."), "value": z.number().describe("The reported value. Unit semantics are vendor-defined \u2014 see `unit` field below and the vendor's `brand.json` measurement-agent documentation."), "unit": z.string().describe("Unit of the value. Free-form to accommodate the heterogeneity of vendor metrics (e.g., `score`, `seconds`, `persons`, `gCO2e`, `USD`, `lift_percent`). When the value is monetary, use the ISO 4217 code (e.g., `USD`, `EUR`); for non-monetary, use whatever the vendor publishes. Optional on every row \u2014 the canonical unit lives at the vendor's measurement-agent metric definition (`brand.json` `agents[type='measurement']`). When sellers populate it inline they SHOULD match the vendor's published unit; buyers MAY resolve from the vendor's measurement agent when this field is absent.").optional(), "measurable_impressions": z.number().gte(0).describe("Number of impressions in this reporting period that the vendor was able to measure. Coverage denominator \u2014 buyers compute coverage rate as `measurable_impressions / impressions`. When absent, coverage is unspecified \u2014 buyers MUST NOT compute a coverage rate or assume full coverage. When the vendor measured zero impressions but is integrated, set to 0 explicitly. When the entry is omitted from `vendor_metric_values` entirely, the buyer infers no measurement happened (no integration). This pattern parallels `viewability.measurable_impressions` (`delivery-metrics.json#/properties/viewability`), which has handled vendor coverage in the IAS/DV/MRC ecosystem for over a decade \u2014 same convention: absence is unknown, not full. For channels where the atomic observation unit is a play or screen-second rather than an impression (DOOH, cinema, place-based), report `measurable_plays` or `measurable_play_seconds` instead \u2014 `impressions` there is itself a modelled figure (`plays \xD7 audience multiplier`), so `measurable_impressions / impressions` divides a measured count by a model output and has no interpretation.").optional(), "measurable_plays": z.number().gte(0).describe("Number of plays (loop plays / spots aired) in this reporting period that the vendor was able to measure. Coverage denominator for channels where a play, not an impression, is the atomic observation unit \u2014 DOOH, cinema, place-based audio. Buyers compute coverage as `measurable_plays / plays` (top-level `plays` on `delivery-metrics.json`). Same absence semantics as `measurable_impressions`: absent means coverage is unspecified and buyers MUST NOT compute a rate; 0 means the vendor is integrated but measured nothing. A row SHOULD carry exactly one coverage denominator \u2014 the one matching the unit the vendor actually observes.").optional(), "measurable_play_seconds": z.number().gte(0).describe("Play-seconds \u2014 seconds of creative playout summed across endpoints (screens, speakers, players) \u2014 in this reporting period that the vendor was able to measure. Medium-neutral on purpose: place-based audio has plays and duration but no screen. Coverage denominator when the vendor meters exposure duration rather than discrete plays. On screen networks buyers compute coverage as `measurable_play_seconds / dooh_metrics.screen_time_seconds`; on other place-based media, against the seller's reported playout seconds for the period. Same absence semantics as `measurable_impressions`.").optional(), "vendor_relationship": z.enum(["first_party", "affiliated", "third_party"]).describe("Optional echo of the product's `reporting_capabilities.vendor_metrics[].vendor_relationship` for this `(vendor, metric_id)`, so the delivery row is self-describing without joining back to the product (same reasoning as `viewability.vendor`). When present it MUST equal the declared value; buyers MAY resolve from the product declaration when absent. Absence on the row is *undeclared*, never `third_party`. A relationship disposition, not a trust ranking. Deliberately not a `qualifier` key: the relationship is constant across every row for a (seller, vendor) pair and does not partition rows, so it stays out of the `(vendor, metric_id, qualifier)` reconciliation join.").optional(), "qualifier": z.object({ "viewability_standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional(), "completion_source": z.enum(["seller_attested", "vendor_attested"]).describe("Trust-source disambiguator for `completion_rate` \u2014 *who* attested to the completion event, not *how* (methodology granularity is a separate dimension; future qualifier keys may add it if buyer demand surfaces). The two paths can yield materially different rates, particularly in SSAI environments where the player's view of completion may differ from a vendor's. Used as a `qualifier.completion_source` key on `committed_metrics`, `missing_metrics`, and package-level delivery values (`metric_values` or `vendor_metric_values`) to disambiguate which trust source the row represents. Edge cases: walled gardens where the seller is also the measurement vendor (YouTube, Spotify) collapse to `seller_attested` by trust-model logic \u2014 the same party served and counted. IAB-certified first-party podcast measurement (Podtrac, Triton on their own platforms; Art19 on its own platform) likewise collapses to `seller_attested`. The same vendor's offering on a third-party platform (Podtrac on a publisher who isn't Podtrac) is `vendor_attested`. The trust axis is *not* who runs the SDK \u2014 it's who is independent of the seller's revenue interest.").optional(), "attribution_methodology": z.enum(["deterministic_purchase", "probabilistic", "panel_based", "modeled"]).describe("How attribution between ad exposure and outcome events was computed. Used as a `qualifier.attribution_methodology` key on `committed_metrics`, `missing_metrics`, package-level delivery values (`metric_values` or `vendor_metric_values`), and `performance-feedback.metric` to disambiguate the same outcome metric reported under different methodologies \u2014 `conversion_value` measured deterministically (matched purchase IDs) is not the same number as `conversion_value` measured probabilistically (modeled match) and should never be summed across methodologies. The retail-media closed-loop pattern typically reports under `deterministic_purchase`; MMM and clean-room outputs typically report under `modeled` or `probabilistic`; panel-based measurement (Nielsen, comScore, Edison) reports under `panel_based`.").optional(), "attribution_window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").optional(), "lift_dimension": z.enum(["awareness", "consideration", "favorability", "purchase_intent", "ad_recall"]).describe("Brand-lift dimension disambiguator. Brand lift is multidimensional in production \u2014 Kantar, Upwave, Cint, DoubleVerify, and similar vendors report awareness, consideration, favorability, purchase intent, and ad recall as separate measurements with their own sample sizes and confidence intervals. Used as a `qualifier.lift_dimension` key on `committed_metrics`, `missing_metrics`, package-level delivery values (`metric_values` or `vendor_metric_values`), and `performance-feedback.metric` to disambiguate which dimension of `brand_lift` a row represents. Two `brand_lift` rows under different lift dimensions represent different surveyed outcomes and must not be combined into a single number.").optional() }).strict().describe("Optional qualifier disambiguating this row from sibling rows for the same (vendor, metric_id) \u2014 e.g., the same vendor outcome metric reported under 7-day and 30-day attribution windows. Same closed key set as `committed-metric`. When the matching `committed_metrics` entry carries a qualifier, this row MUST carry the identical qualifier so reconciliation joins on `(vendor, metric_id, qualifier)`.").optional(), "breakdown": z.record(z.string(), z.any()).describe("Optional structured payload for vendor metrics that don't fit a single scalar \u2014 panel demographic breakouts, co-view audience composition, incremental reach + frequency + lift decompositions. Free-form; the keys and value semantics are defined by the vendor (see the vendor's `brand.json` measurement-agent docs). Buyers MUST treat this object as opaque without consulting the vendor's documentation. Vendors place any fields beyond the standard envelope (e.g., confidence intervals, panel sizes) inside this object rather than at the top level.").optional() }).strict().describe("A reported value for a vendor-defined metric, emitted in `delivery-metrics.json` `vendor_metric_values` parallel to standard scalars. Identifies the vendor (BrandRef), the metric name within that vendor's vocabulary, the value, and the coverage denominator (`measurable_impressions`) \u2014 vendor measurement is rarely 100% coverage. Channels whose atomic observation unit is a play or screen-second rather than an impression (DOOH, cinema, place-based) use the sibling denominators `measurable_plays` / `measurable_play_seconds`. `vendor_relationship` optionally echoes the seller's declared relationship to the vendor (`first_party` / `affiliated` / `third_party`) so a row is self-describing without a discovery hop. The `breakdown` slot accommodates vendors that emit structured payloads beyond a single scalar (panel demographic breakouts, co-view ratios, incremental decompositions). To add fields beyond what this schema defines, vendors place them inside `breakdown` rather than alongside the standard envelope.")).describe("Reported values for vendor-defined metrics that the product's `reporting_capabilities.vendor_metrics` declared. Each entry carries the vendor (BrandRef), the metric identifier within the vendor's vocabulary, the value, optional unit, and `measurable_impressions` as the coverage denominator \u2014 vendor measurement is rarely 100% of delivered impressions, since vendors only score impressions where their SDK fires or their panel matches. When a declared vendor metric is omitted from this array, buyers infer no measurement happened (no integration). One row per `(vendor.domain, vendor.brand_id, metric_id, qualifier)` per reporting period \u2014 the same vendor metric MAY appear in multiple rows only when each carries a distinct qualifier (e.g., 7-day and 30-day attribution windows); sellers MUST de-duplicate before emission and MUST NOT emit two rows with the same tuple; buyers MAY treat duplicate rows as a seller-side conformance bug. The structured `vendor_metric_values` array is the recommended path for vendor metrics; `additionalProperties: true` on this parent object is preserved so existing free-form vendor emissions remain conformant during migration.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "reach": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "reach": z.any().refine((value) => value !== void 0, "Required"), "reach_unit": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Standard delivery metrics that can be reported at media buy, package, or creative level"), z.object({ "package_id": z.string().optional(), "pacing_index": z.number().gte(0).describe("Subordinate package pacing diagnostic. May be absent for seller-optimized packages without package-level pacing.").optional(), "pricing_model": z.enum(["cpm", "vcpm", "cpc", "cpcv", "cpv", "cpp", "cpa", "revenue_share", "flat_rate", "time"]).describe("Supported pricing models for advertising products").optional(), "rate": z.number().gte(0).optional(), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")).describe("ISO 4217 currency code for this package's spend and currency-denominated pricing rate. The rate for revenue_share is a dimensionless commission fraction, but attributed monetary values still use this currency. When the enclosing media_buy_deliveries[].currency is present, this value MUST equal it. For AdCP-authored buys both values MUST equal the media-buy currency. A different package currency is permitted only for a legacy or externally created mixed-currency buy whose row currency and row-level monetary totals are omitted. When both row and deprecated response-wide currency are absent, a package with monetary values MUST include this field. AdCP does not perform currency conversion.").optional(), "delivery_status": z.enum(["delivering", "not_delivering", "completed", "budget_exhausted", "flight_ended", "goal_met"]).describe("System-reported operational state of this package. Reflects actual delivery state independent of buyer pause control. 'not_delivering' means zero impressions were recorded for the entire reporting_period while the package was in-flight. Sellers SHOULD only report 'not_delivering' once the package's data is_final for the period \u2014 a provisional (is_final: false) zero may still be measurement catching up, not genuine non-delivery.").optional(), "paused": z.boolean().optional(), "is_final": z.boolean().optional(), "finalized_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "measurement_window": z.string().max(50).optional(), "supersedes_window": z.string().max(50).optional(), "metric_values": z.array(z.intersection(z.object({ "scope": z.literal("standard").describe("Standard metric from the closed `available-metric.json` enum."), "metric_id": z.intersection(z.enum(["impressions", "spend", "clicks", "ctr", "views", "completed_views", "completion_rate", "conversions", "conversion_value", "commissionable_value", "roas", "cost_per_acquisition", "new_to_brand_rate", "leads", "reach", "frequency", "grps", "engagements", "engagement_rate", "follows", "saves", "profile_visits", "viewability", "viewable_rate", "viewable_impressions", "measurable_impressions", "viewed_seconds", "viewed_seconds_percentiles", "viewed_seconds_histogram", "quartile_data", "quartile_25", "quartile_50", "quartile_75", "quartile_100", "time_based_views", "dooh_metrics", "ooh_metrics", "cost_per_click", "cost_per_completed_view", "cpm", "downloads", "units_sold", "new_to_brand_units", "plays", "incremental_sales_lift", "brand_lift", "foot_traffic", "conversion_lift", "brand_search_lift"]).describe("Standard delivery and performance metrics available for reporting. Most values name flat numeric fields of `core/delivery-metrics.json`. Leaf identities address a single numeric value nested inside an object-shaped metric so it can be declared, committed, aggregated, and sorted individually: `quartile_25`/`quartile_50`/`quartile_75`/`quartile_100` resolve to `quartile_data.q1_views`\u2013`q4_views`, and `viewable_rate`/`viewable_impressions`/`measurable_impressions`/`viewed_seconds` resolve to the same-named fields of `viewability`. Structured nested identities `viewed_seconds_percentiles` and `viewed_seconds_histogram` make the corresponding optional distribution carriers discoverable, committable, and requestable, but not aggregatable or sortable. The nested object or array remains the canonical carrier \u2014 nested identities never introduce duplicate flat response fields. Container tokens such as `viewability`, `quartile_data`, `dooh_metrics`, and `time_based_views` declare their documented nested surface. **Container subsumption applies only to numeric leaves**: `viewability` subsumes `viewable_rate`, `viewable_impressions`, `measurable_impressions`, and `viewed_seconds`; `quartile_data` subsumes `quartile_25`, `quartile_50`, `quartile_75`, and `quartile_100`. This rule applies to capability declaration, `required_metrics` filtering, format `reported_metrics` intersection, and `requested_metrics` selection. Optional structured identities MUST be declared explicitly: `viewability` alone does not satisfy `viewed_seconds_percentiles` or `viewed_seconds_histogram`. Requesting any nested identity selects its canonical carrier in the response. A nested identity declaration does not imply sibling values or the carrier's non-metric fields."), z.any().refine((value) => !z.enum(["viewability", "viewed_seconds_percentiles", "viewed_seconds_histogram", "quartile_data", "time_based_views", "dooh_metrics"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema")).describe("Identifier for a scalar standard metric. Container tokens and structured distribution identities are committed and selected through their canonical carriers, not represented as numeric aggregate rows."), "qualifier": z.object({ "viewability_standard": z.enum(["mrc", "groupm"]).describe("Viewability standard under which this row was measured. MRC and GroupM define materially different thresholds; never sum across standards.").optional(), "completion_source": z.enum(["seller_attested", "vendor_attested"]).describe("Source of `completion_rate` attestation for this row \u2014 `seller_attested` from player/ad server, `vendor_attested` from a third-party measurement vendor. The two paths can yield different rates; never sum across sources.").optional(), "attribution_methodology": z.enum(["deterministic_purchase", "probabilistic", "panel_based", "modeled"]).describe("Attribution methodology under which this outcome row was computed (`deterministic_purchase`, `probabilistic`, `panel_based`, `modeled`). Outcome metrics measured under different methodologies represent materially different numbers; never sum across methodologies.").optional(), "attribution_window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("Attribution window for this outcome row. Object-valued duration (`{interval, unit}`), not a shorthand string. Outcome metrics measured over different windows represent the same metric over different time periods; the partition keeps them as separate rows so buyers don't accidentally aggregate.").optional(), "lift_dimension": z.enum(["awareness", "consideration", "favorability", "purchase_intent", "ad_recall"]).describe("Brand-lift dimension this row represents (awareness, consideration, favorability, purchase intent, or ad recall). Required when `metric_id` is `brand_lift`. Each dimension is a separate surveyed outcome with its own sample size and confidence interval; never sum across dimensions.").optional() }).strict().describe("Qualifier keys disambiguating this row from sibling rows under the same `metric_id`. Symmetric with `committed_metrics.qualifier` today; expected to diverge in future minors as transparency disclosures buyers don't commit to ship delivery-only. Closed (`additionalProperties: false`) \u2014 new qualifier keys ship explicitly.").optional(), "value": z.number().describe("Aggregated metric value for this `(metric_id, qualifier)` partition. Heterogeneous by `metric_id` \u2014 rate metrics (`viewable_rate`, `completion_rate`) are 0.0\u20131.0; cost-per metrics (`cost_per_acquisition`, `cost_per_completed_view`) are currency amounts; count metrics (`impressions`, `clicks`) are non-negative integers as numbers; ratio metrics (`roas`) are non-negative numbers. Buyer agents MUST inspect `metric_id` before doing arithmetic \u2014 same dispatch convention as `committed_metrics`."), "measurable_impressions": z.number().gte(0).describe("Coverage denominator for verification metrics (e.g., `viewable_rate`). Buyers compute coverage as `measurable_impressions / impressions` from the partition.").optional(), "viewable_impressions": z.number().gte(0).describe("Component for `viewable_rate` (numerator).").optional(), "impressions": z.number().gte(0).describe("Component for rate metrics whose denominator is total impressions (e.g., `completion_rate`, `engagement_rate`).").optional(), "completed_views": z.number().gte(0).describe("Component for `completion_rate` (numerator).").optional(), "spend": z.number().gte(0).describe("Component for cost-per metrics (denominator-ish; the cost half of the ratio).").optional(), "conversions": z.number().gte(0).describe("Component for `cost_per_acquisition` and ROAS-family metrics.").optional(), "conversion_value": z.number().gte(0).describe("Component for `roas` (numerator).").optional(), "clicks": z.number().gte(0).describe("Component for `cost_per_click` and click-rate metrics.").optional() }).strict().and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "metric_id": z.literal("viewable_rate").optional() }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "metric_id": z.literal("viewable_rate").optional() }), z.object({ "measurable_impressions": z.any().refine((value) => value !== void 0, "Required"), "viewable_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough())]), z.union([z.any().refine((value) => !z.object({ "metric_id": z.literal("completion_rate").optional() }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "metric_id": z.literal("completion_rate").optional() }), z.object({ "impressions": z.any().refine((value) => value !== void 0, "Required"), "completed_views": z.any().refine((value) => value !== void 0, "Required") }).passthrough())])), z.intersection(z.union([z.any().refine((value) => !z.object({ "metric_id": z.literal("cost_per_acquisition").optional() }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "metric_id": z.literal("cost_per_acquisition").optional() }), z.object({ "spend": z.any().refine((value) => value !== void 0, "Required"), "conversions": z.any().refine((value) => value !== void 0, "Required") }).passthrough())]), z.union([z.any().refine((value) => !z.object({ "metric_id": z.literal("roas").optional() }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "metric_id": z.literal("roas").optional() }), z.object({ "spend": z.any().refine((value) => value !== void 0, "Required"), "conversion_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough())])))), z.object({ "qualifier": z.any().refine((value) => Object.keys(value).length >= 1, "Object must contain at least 1 property") })).describe("A qualified standard delivery value reported at package grain. The qualifier is required and must be non-empty; unqualified spend remains on the package's flat spend field.")).describe("Qualified standard delivery values for this package. Each entry is the delivered counterpart to a standard-scope package.committed_metrics or by_package[].missing_metrics row, using the same atomic key (scope, metric_id, qualifier). Sellers report one row per full qualifier set at package grain; when a metric appears here, its flat scalar counterpart on the package MUST be omitted to avoid two sources of truth. Vendor-scope values continue to use vendor_metric_values. Buyers reconcile rows directly and perform any compatible cross-package aggregation themselves.").optional() }).catchall(z.any()))).describe("Metrics broken down by package.") }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "currency": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "currency": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "totals": z.object({ "spend": z.any().refine((value) => value !== void 0, "Required") }).passthrough().optional() }))]).describe("Must also satisfy at least one of these alternatives."))).describe("Delivery rows for one or more media buys included in this notification."), "errors": z.array(z.object({ "code": z.string().min(1).max(64).describe("Error code for programmatic handling. The error-code vocabulary is open: `error.code` is wire-typed `string` (not a closed enum), the standard codes published in `enums/error-code.json` are documentary, and senders MAY emit codes outside that set (platform-specific codes, or codes introduced in a later AdCP version). Receivers MUST decode unknown codes \u2014 treat the response as well-formed, read `error.recovery` for the recovery classification, and fall back to `transient` when `recovery` is absent. See `error-handling.mdx#forward-compatible-decoding-normative` for the full forward-compat contract \u2014 this rule is what lets future maintenance lines ship new codes additively."), "message": z.string().describe("Human-readable error message"), "buyer_reason": z.object({ "code": z.string().min(1).max(64).describe("Machine-readable buyer-actionable reason from the standard `enums/error-code.json` vocabulary or a producer-specific extension. Extensions MUST follow the standard `X_{VENDOR}_{CODE}` naming rule. The wire field is open for forward compatibility. Receivers MUST accept unknown values and use the enclosing `error.recovery` plus this object's `message` as the fallback."), "message": z.string().min(1).describe("Buyer-safe explanation of the actionable failure. MUST NOT expose vendor identifiers, ad-server type names, internal object names, internal IDs, stack traces, or other producer-private implementation details.") }).catchall(z.any()).describe("Optional buyer-actionable classification of the failure. Use this when the enclosing error code or message is too coarse or contains producer-internal context that must not cross the buyer trust boundary. `code` reuses the comprehensive standard vocabulary and recovery classifications published in `enums/error-code.json`, including policy, governance, account, commercial, inventory, and creative failures. The wire field remains open for forward compatibility. `message` MUST be safe to show to the buyer and MUST NOT contain vendor identifiers, ad-server type names, internal object names, internal IDs, stack traces, or other producer-private implementation details. When present, the enclosing `error.recovery` MUST classify the buyer-actionable reason. If both the enclosing code and buyer reason are registered, their standard recovery classifications MUST agree with each other and with `error.recovery`; sellers MUST choose the closest compatible enclosing code rather than retain a conflicting upstream transport wrapper. One buyer_reason classifies one error object. If a rejection contains independently actionable failures from different classes, sellers MUST emit separate error objects or omit buyer_reason rather than select a misleading single class.").optional(), "field": z.string().describe("Field path associated with the error in JSONPath-lite format (e.g., 'packages[0].targeting'). When `issues[]` is also present, sellers MUST set this to `issues[0].pointer` translated from RFC 6901 to JSONPath-lite (e.g., '/packages/0/targeting' \u2192 'packages[0].targeting') so pre-3.1 consumers reading `field` only get deterministic behavior. Will be deprecated in a future major version in favor of `issues[].pointer`.").optional(), "suggestion": z.string().describe("Suggested fix for the error").optional(), "retry_after": z.number().gte(1).lte(3600).describe("Seconds to wait before retrying the operation. AdCP 3.2 producers MUST emit an integer from 1 through 3600. The 3.x schema continues to accept finite fractional values for backward compatibility with earlier producers; consumers receiving one MUST round up to the next whole second before clamping so the retry is never scheduled earlier than intended. Non-finite values are treated as absent.").optional(), "issues": z.array(z.object({ "pointer": z.string().describe("RFC 6901 JSON Pointer to the offending field in the request payload (e.g., '/packages/0/targeting/geo_countries/2'). Format chosen to match Ajv's native validation output (`instancePath`); standardized and unambiguous on keys containing `/` or `~`. NOTE: this differs from the legacy top-level `field` which uses JSONPath-lite (`packages[0].targeting.geo_countries[2]`). When sellers populate `field` from `issues[0].pointer` for backward compatibility (see `field` description), they MUST translate the format \u2014 `/packages/0/x` \u2192 `packages[0].x`. Future major versions will deprecate `field` in favor of `issues[].pointer`."), "message": z.string().describe("Human-readable description of why this specific field was rejected."), "keyword": z.string().describe("Schema keyword that rejected the payload, drawn from the JSON Schema vocabulary (e.g., 'required', 'type', 'format', 'enum', 'pattern', 'minimum', 'maxLength'). Matches the keyword names emitted by JSON Schema validators (Ajv, jsonschema, etc.) so agents can pattern-match on rejection class without parsing message text. Implementers SHOULD use the validator's native keyword name; do not invent custom values here."), "schemaPath": z.string().describe("Optional. JSON Schema tree path of the rejecting keyword (e.g. '#/properties/packages/items/oneOf/1'). 3.1+ consumers SHOULD prefer `schema_id`; `schemaPath` is retained for 3.0.x compatibility (renamed to `schema_path` in a future major). See error-handling.mdx for the validator-internals production-emit rules.").optional(), "schema_id": z.string().describe("Optional. `$id` of the rejecting (sub-)schema (e.g. `/schemas/3.1.0/core/activation-key.json`). MUST resolve to a `$id` published in the spec at the version the seller advertises via `get_adcp_capabilities` \u2014 either a deep sub-schema (the typical case) or the response-root `$id` (the bundled-tree fallback for tools served from bundles built before #3868). Sellers MUST NOT emit when the rejection occurred against a private extension, server-only sub-schema, or pre-release element \u2014 the public-spec replay rationale only holds when the rejecting element is reachable from the public bundle. Sellers populating `schemaPath` SHOULD also populate `schema_id` when they have it so 3.1+ readers don't get strictly less than 3.0.x readers. See error-handling.mdx for resolution guidance and the bundled-tree caveat.").optional() }).catchall(z.any())).describe("Structured list of validation failures. Primary use is `VALIDATION_ERROR`, where multi-field rejections are common and `field` (singular) cannot carry the full pointer map. MAY appear on other error codes that reject multiple fields at once. When `issues` is present, sellers MUST also populate `field` from `issues[0]` for backward compatibility with pre-3.1 consumers that read `field` only \u2014 translating the RFC 6901 `pointer` format to the JSONPath-lite format `field` uses (e.g., `/packages/0/targeting` \u2192 `packages[0].targeting`). MUST (not SHOULD) so consumers reading `field` get deterministic behavior across sellers \u2014 the cost is one line of dual-write per seller; the cost of SHOULD is a long tail of seller-A-vs-seller-B inconsistency. Future major versions will deprecate `field` in favor of `issues[].pointer`.").optional(), "details": z.record(z.string(), z.any()).describe('Additional task-specific error details. Sellers MAY mirror `issues[]` here as `details.issues` for backward compatibility with pre-3.1 consumers reading from `details`; new consumers SHOULD prefer the top-level `issues` field.\n\n**Canonical rejection-set shape (3.1+).** When the error reports a rejected value against a closed set of accepted values (e.g., enum mismatch, unsupported pricing option, invalid signal id), sellers SHOULD use the canonical key `accepted_values: <array>` under `details` rather than seller-specific variants observed in the wild (`available`, `allowed`, `accepted_values` at the error root, etc.). The canonical shape:\n\n```json\n{\n "code": "INVALID_PRICING_OPTION",\n "message": "Pricing option not found: po_prism_abandoner_cpm",\n "field": "pricing_option_id",\n "details": {\n "rejected_value": "po_prism_abandoner_cpm",\n "accepted_values": ["po_prism_cart_cpm", "po_prism_view_cpm"]\n }\n}\n```\n\n- `rejected_value` (optional): the offending value the buyer supplied, echoed for buyer-side diagnostic clarity (especially when the offending field is nested or transformed before validation).\n- `accepted_values` (optional): the closed set the seller would have accepted at this field on this call. Sellers MUST NOT enumerate the full ecosystem-wide accepted set if it differs from what\'s accepted for *this caller in this context* (account, brand, scope) \u2014 leaking ecosystem-wide accepted sets to a per-caller rejection turns the error into an enumeration oracle.\n\nThis is **SHOULD-level guidance**, not MUST: `details` remains `additionalProperties: true` and pre-3.1 sellers using `available` / `allowed` / `accepted_values` at the error root remain conformant. The canonical shape lets buyer-side diagnostic tooling (SDK runner hints, dashboards, error classifiers) reliably surface the accepted-set without per-seller pattern matching. SDKs SHOULD accept any of the legacy variants and normalize on read; the canonical shape is what new sellers and 3.1+ adopters should emit going forward.').optional(), "recovery": z.enum(["transient", "correctable", "terminal"]).describe("Agent recovery classification. transient: retry after delay (rate limit, service unavailable, timeout). correctable: fix the request and resend (invalid field, budget too low, creative rejected). terminal: requires human action (account suspended, payment required, account not found). AdCP 3.2 producers MUST populate `recovery` on every error; 3.1 producers SHOULD populate it. The shared 3.x schema intentionally does not add `recovery` to `required` so retained and live errors from earlier 3.x producers remain decodable. When `buyer_reason` is present, `recovery` is required and MUST classify that buyer-actionable reason. If the enclosing code and buyer reason are both registered, their standard recovery classifications MUST agree with each other and with this field. A receiver that does not recognize `error.code` (a newer code, or a platform-specific code) MUST still be able to classify the error from `recovery`. When a legacy error omits `recovery`, receivers use the registered classification for a known code and fall back to `transient` for an unknown code, subject to the bounded retry budget. The `enumMetadata.recovery` block in `enums/error-code.json` is the documentary mirror for known top-level and buyer-reason codes; `error.recovery` on the wire is authoritative when present.").optional(), "source": z.enum(["producer", "sdk"]).describe("Who emitted this error entry. `producer` (default when absent): emitted by the response's authoring agent (the seller for `get_products`, the creative agent for `build_creative`, etc.). `sdk`: augmented by a consuming SDK that detected a non-fatal advisory condition on consumption (e.g., `FORMAT_PROJECTION_FAILED` when the buyer SDK couldn't project a v1 format to a canonical, or `FORMAT_DECLARATION_DIVERGENT` when the SDK detected a producer bug on read). SDK-augmented entries SHOULD also set `sdk_id` so downstream consumers can identify which intermediate processor inserted the entry.\n\n**Multi-hop propagation (normative).** AdCP is a federated agent network \u2014 responses commonly traverse multiple SDKs (e.g., sales agent \u2192 interchange \u2192 DSP \u2192 buyer). When an SDK augments `errors[]` with a consumption-detected entry, the augmented response carries the entry forward to subsequent hops. Each hop that detects the same condition independently SHOULD deduplicate by `(code, field)` rather than re-emit; the existing entry's `sdk_id` identifies which earlier processor saw it first. Producer entries (those without `source: \"sdk\"`) are authoritative for what the response's authoring agent self-detected; SDK entries are observations made on top.\n\n**Replay/audit safety.** Persisted or replayed responses carry `source` and `sdk_id` so the audit trail can distinguish seller-emitted entries from SDK-augmented ones. Without `source`, a downstream consumer can't tell whether a code came from the seller or an intermediate SDK, which corrupts attribution.").optional(), "sdk_id": z.string().describe('Optional identifier for the SDK that augmented this error entry. Format: `<sdk_package_name>@<version>` (e.g., `@adcontextprotocol/adcp@7.3.0`, `adcontextprotocol-adcp-python@1.2.0`). MUST be set when `source: "sdk"`; MUST be absent when `source: "producer"` or absent. Lets downstream consumers identify which intermediate processor inserted the entry, useful for debugging cross-SDK divergence (e.g., one SDK detects a projection failure that another SDK\'s registry version doesn\'t).').optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "buyer_reason": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "buyer_reason": z.any().refine((value) => value !== void 0, "Required"), "recovery": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Standard error structure for task-specific errors and warnings")).describe("Task-specific delivery errors or warnings.").optional(), "sandbox": z.boolean().optional(), "context": z.record(z.string(), z.any()).describe("Opaque correlation data that is echoed unchanged in responses. Used for internal tracking, UI session IDs, trace IDs, and other caller-specific identifiers that don't affect protocol behavior. Context data is never parsed by AdCP agents - it's simply preserved and returned.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).catchall(z.any()).describe("Payload-only delivery report result carried under core/mcp-webhook-payload.json result for task_type media_buy_delivery. This is not a top-level webhook POST body and does not include protocol envelope fields such as task_id or status."))();
3440
3422
  const BuildCreativeAsyncWorkingSchema = /* @__PURE__ */ (() => z.object({
3441
3423
  percentage: z.number().optional(),
3442
3424
  current_step: z.string().optional(),
@@ -4070,7 +4052,7 @@ const BuildCreativeEstimateSchema = /* @__PURE__ */ (() => z.object({
4070
4052
  consumption_estimate: CreativeConsumptionSchema.optional()
4071
4053
  }).passthrough()).optional()
4072
4054
  }).passthrough(),
4073
- expires_at: z.iso.datetime().optional(),
4055
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
4074
4056
  context: ContextObjectSchema.optional(),
4075
4057
  ext: ExtensionObjectSchema.optional()
4076
4058
  }).passthrough())();
@@ -4087,7 +4069,7 @@ const PreviewCreativeSingleResponseSchema = /* @__PURE__ */ (() => z.object({
4087
4069
  }).passthrough()),
4088
4070
  quality_used: CreativeQualitySchema.optional(),
4089
4071
  interactive_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
4090
- expires_at: z.iso.datetime().optional(),
4072
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
4091
4073
  context: ContextObjectSchema.optional(),
4092
4074
  ext: ExtensionObjectSchema.optional()
4093
4075
  }).passthrough())();
@@ -4180,7 +4162,7 @@ const A2UIUserActionSchema = /* @__PURE__ */ (() => z.object({
4180
4162
  name: z.string(),
4181
4163
  context: z.object({}).passthrough().optional()
4182
4164
  }).passthrough(),
4183
- timestamp: z.iso.datetime().optional()
4165
+ timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
4184
4166
  }).passthrough())();
4185
4167
  const PublisherEntrySchema = /* @__PURE__ */ (() => z.object({
4186
4168
  publisher_domain: z.string().regex(/^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/),
@@ -4191,7 +4173,7 @@ const PublisherEntrySchema = /* @__PURE__ */ (() => z.object({
4191
4173
  property_ids: z.array(z.string()).optional(),
4192
4174
  signing_keys_pinned: z.boolean().optional(),
4193
4175
  status: z.union([z.literal("authorized"), z.literal("revoked")]),
4194
- last_verified_at: z.iso.datetime()
4176
+ last_verified_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
4195
4177
  }).passthrough())();
4196
4178
  const AcquireRightsRequestSchema = /* @__PURE__ */ (() => z.object({
4197
4179
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
@@ -4282,7 +4264,7 @@ const CreativeApprovedSchema = /* @__PURE__ */ (() => z.object({
4282
4264
  rights_id: z.string(),
4283
4265
  creative_id: z.string().optional(),
4284
4266
  creative_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
4285
- approved_at: z.iso.datetime().optional(),
4267
+ approved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
4286
4268
  conditions: z.array(z.string()).optional(),
4287
4269
  context: ContextObjectSchema.optional(),
4288
4270
  ext: ExtensionObjectSchema.optional()
@@ -4461,7 +4443,7 @@ const RevocationNotificationSchema = /* @__PURE__ */ (() => z.object({
4461
4443
  rights_id: z.string(),
4462
4444
  brand_id: z.string(),
4463
4445
  reason: z.string(),
4464
- effective_at: z.iso.datetime(),
4446
+ effective_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
4465
4447
  revoked_uses: z.array(RightUseSchema).optional(),
4466
4448
  context: ContextObjectSchema.optional(),
4467
4449
  ext: ExtensionObjectSchema.optional()
@@ -4488,7 +4470,7 @@ const SearchBrandResultSchema = /* @__PURE__ */ (() => z.object({
4488
4470
  name: z.string()
4489
4471
  }).passthrough().optional(),
4490
4472
  relationship_trust: z.union([z.literal("inline"), z.literal("mutual"), z.literal("leaf_only"), z.literal("house_only"), z.literal("standalone"), z.literal("unverifiable")]).optional(),
4491
- relationship_verified_at: z.iso.datetime().optional(),
4473
+ relationship_verified_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
4492
4474
  claimed_house_domain: z.string().optional(),
4493
4475
  names: z.array(z.record(z.string(), z.string())),
4494
4476
  description: z.string().optional(),
@@ -4532,7 +4514,7 @@ const VerifySubsidiaryClaimSchema = /* @__PURE__ */ (() => z.object({
4532
4514
  claim: z.object({
4533
4515
  subsidiary_domain: z.string(),
4534
4516
  subsidiary_brand_id: z.string().regex(/^[a-z0-9_]+$/).optional(),
4535
- observed_at: z.iso.datetime().optional()
4517
+ observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
4536
4518
  }).passthrough()
4537
4519
  }).passthrough())();
4538
4520
  const VerifyParentClaimSchema = /* @__PURE__ */ (() => z.object({
@@ -4540,7 +4522,7 @@ const VerifyParentClaimSchema = /* @__PURE__ */ (() => z.object({
4540
4522
  claim: z.object({
4541
4523
  parent_domain: z.string(),
4542
4524
  claimant_says: z.string().optional(),
4543
- observed_at: z.iso.datetime().optional()
4525
+ observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
4544
4526
  }).passthrough()
4545
4527
  }).passthrough())();
4546
4528
  const VerifyPropertyClaimSchema = /* @__PURE__ */ (() => z.object({
@@ -4642,8 +4624,8 @@ const CollectionListChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
4642
4624
  collections_removed: z.int().optional(),
4643
4625
  total_collections: z.int().optional()
4644
4626
  }).passthrough().optional(),
4645
- resolved_at: z.iso.datetime(),
4646
- cache_valid_until: z.iso.datetime().optional(),
4627
+ resolved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
4628
+ cache_valid_until: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
4647
4629
  signature: z.string(),
4648
4630
  ext: ExtensionObjectSchema.optional()
4649
4631
  }).passthrough())();
@@ -4893,11 +4875,11 @@ const AccountChangeRecordedWebhookSchema = /* @__PURE__ */ (() => z.object({
4893
4875
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
4894
4876
  notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
4895
4877
  notification_type: z.literal("account.change_recorded"),
4896
- fired_at: z.iso.datetime(),
4878
+ fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
4897
4879
  subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
4898
4880
  account_id: z.string().min(1).max(255),
4899
4881
  change_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
4900
- recorded_at: z.iso.datetime(),
4882
+ recorded_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
4901
4883
  resource: z.object({
4902
4884
  type: z.string().min(1).max(100).regex(/^[a-z][a-z0-9_.-]{0,99}$/),
4903
4885
  resource_id: z.string().min(1).max(255),
@@ -4962,17 +4944,17 @@ const AccountStatusChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
4962
4944
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
4963
4945
  notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
4964
4946
  notification_type: z.literal("account.status_changed"),
4965
- fired_at: z.iso.datetime(),
4947
+ fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
4966
4948
  subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
4967
4949
  account_id: z.string(),
4968
4950
  previous_status: AccountStatusSchema,
4969
4951
  status: AccountStatusSchema,
4970
- observed_at: z.iso.datetime(),
4952
+ observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
4971
4953
  reason_code: z.union([z.literal("seller_approved"), z.literal("seller_rejected"), z.literal("payment_required"), z.literal("credit_limit_reached"), z.literal("funds_depleted"), z.literal("setup_required"), z.literal("policy_review"), z.literal("policy_violation"), z.literal("compliance_hold"), z.literal("buyer_requested"), z.literal("seller_closed"), z.literal("manual_update"), z.literal("other")]),
4972
4954
  reason_detail: z.string().max(500).optional(),
4973
4955
  setup: z.object({
4974
4956
  message: z.string(),
4975
- expires_at: z.iso.datetime().optional()
4957
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
4976
4958
  }).passthrough().optional(),
4977
4959
  ext: ExtensionObjectSchema.optional()
4978
4960
  }).passthrough())();
@@ -5043,7 +5025,7 @@ const AgentSigningKeySchema = /* @__PURE__ */ (() => z.object({
5043
5025
  y: z.string().optional(),
5044
5026
  n: z.string().optional(),
5045
5027
  e: z.string().optional(),
5046
- revoked_at: z.iso.datetime().optional()
5028
+ revoked_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
5047
5029
  }).passthrough())();
5048
5030
  const AgentWebhookChallengeSchema = /* @__PURE__ */ (() => z.object({
5049
5031
  type: z.literal("webhook.challenge"),
@@ -5065,7 +5047,7 @@ const PriceSchema = /* @__PURE__ */ (() => z.object({
5065
5047
  const VASTAssetSchema = /* @__PURE__ */ (() => z.object({
5066
5048
  asset_type: z.literal("vast"),
5067
5049
  vast_version: VASTVersionSchema.optional(),
5068
- macro_declarations: z.array(MacroDeclarationSchema).optional(),
5050
+ macro_declarations: z.array(MacroDeclarationSchema).min(1).optional(),
5069
5051
  vpaid_enabled: z.boolean().optional(),
5070
5052
  duration_ms: z.number().int().gte(0).optional(),
5071
5053
  tracking_events: z.array(VASTTrackingEventSchema).optional(),
@@ -5079,7 +5061,7 @@ const VASTAssetSchema = /* @__PURE__ */ (() => z.object({
5079
5061
  location: z.object({
5080
5062
  field: z.literal("url").optional()
5081
5063
  }).passthrough().optional()
5082
- }).passthrough()).optional()
5064
+ }).passthrough()).min(1).optional()
5083
5065
  }).passthrough(), z.object({
5084
5066
  delivery_type: z.literal("inline"),
5085
5067
  content: z.string(),
@@ -5087,8 +5069,8 @@ const VASTAssetSchema = /* @__PURE__ */ (() => z.object({
5087
5069
  location: z.object({
5088
5070
  field: z.literal("content").optional()
5089
5071
  }).passthrough().optional()
5090
- }).passthrough()).optional()
5091
- }).passthrough()])))();
5072
+ }).passthrough()).min(1).optional()
5073
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
5092
5074
  const AdCPAssetGroupVocabularyRegistrySchema = /* @__PURE__ */ (() => z.object({}).passthrough())();
5093
5075
  const AttestationIssuerSchema = /* @__PURE__ */ (() => z.union([AttestationBrandIssuerSchema, AttestationAgentIssuerSchema, AttestationOriginIssuerSchema]))();
5094
5076
  const AudienceEvidenceRequirementsSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({
@@ -5131,7 +5113,7 @@ const AuthorizedAgentBaseFieldsSchema = /* @__PURE__ */ (() => z.object({
5131
5113
  authorized_for: z.string().min(1).max(500),
5132
5114
  signing_keys: z.array(AgentSigningKeySchema).optional(),
5133
5115
  encryption_keys: z.array(AgentEncryptionKeySchema).optional(),
5134
- last_updated: z.iso.datetime().optional()
5116
+ last_updated: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
5135
5117
  }).passthrough())();
5136
5118
  const MaxBidWithCostPerSchema = /* @__PURE__ */ (() => z.object({
5137
5119
  kind: z.literal("max_bid_with_cost_per"),
@@ -5155,7 +5137,7 @@ const BrandResponseAuthorizationResultSchema = /* @__PURE__ */ (() => z.object({
5155
5137
  reason: z.union([z.literal("brand_json_unavailable"), z.literal("agent_not_authorized"), z.literal("agent_authorization_ambiguous"), z.literal("jwks_unavailable"), z.literal("kid_not_authorized"), z.literal("kid_authorization_ambiguous"), z.literal("key_material_mismatch"), z.literal("key_purpose_invalid")]),
5156
5138
  kid: z.string().min(1).optional(),
5157
5139
  jwks_uri: z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(/^https:\/\//).optional()
5158
- }).passthrough()])))();
5140
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
5159
5141
  const BudgetRangeSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({
5160
5142
  min: z.number().gte(0).optional(),
5161
5143
  max: z.number().gte(0).optional(),
@@ -5182,10 +5164,10 @@ const CapabilitiesChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
5182
5164
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
5183
5165
  notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
5184
5166
  notification_type: z.literal("capabilities.changed"),
5185
- fired_at: z.iso.datetime(),
5167
+ fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
5186
5168
  subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
5187
5169
  agent_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"),
5188
- changed_at: z.iso.datetime(),
5170
+ changed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
5189
5171
  reason: z.union([z.literal("configuration_changed"), z.literal("deployment_changed"), z.literal("capability_enabled"), z.literal("capability_disabled"), z.literal("protocol_versions_changed"), z.literal("manual_refresh"), z.literal("other")]),
5190
5172
  capabilities_version: z.string().min(1).max(255),
5191
5173
  changed_paths: z.array(z.string()).optional(),
@@ -5268,7 +5250,7 @@ const CatchmentSchema = /* @__PURE__ */ (() => z.object({
5268
5250
  coordinates: z.array(z.unknown())
5269
5251
  }).passthrough(),
5270
5252
  ext: ExtensionObjectSchema.optional()
5271
- }).passthrough()])))();
5253
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
5272
5254
  const CollectionDistributionSchema = /* @__PURE__ */ (() => z.object({
5273
5255
  publisher_domain: z.string(),
5274
5256
  property_ids: z.array(PropertyIDSchema).optional(),
@@ -5627,7 +5609,7 @@ const GeographicPlaceCatalogEntrySchema = /* @__PURE__ */ (() => z.object({
5627
5609
  parent_labels: z.array(z.string()),
5628
5610
  status: z.union([z.literal("active"), z.literal("removal_planned"), z.literal("deprecated")]),
5629
5611
  replaced_by_values: z.array(z.string()).optional(),
5630
- valid_until: z.iso.datetime().optional(),
5612
+ valid_until: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
5631
5613
  ext: ExtensionObjectSchema.optional()
5632
5614
  }).passthrough())();
5633
5615
  const GeographicPlaceCatalogCapabilitySchema = /* @__PURE__ */ (() => z.object({
@@ -5664,7 +5646,7 @@ const IndicatorsChangedWebhookSchema = /* @__PURE__ */ (() => z.union([z.object(
5664
5646
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
5665
5647
  notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
5666
5648
  notification_type: z.literal("indicators.changed"),
5667
- fired_at: z.iso.datetime(),
5649
+ fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
5668
5650
  subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
5669
5651
  account_id: z.string(),
5670
5652
  relationship_kind: z.literal("media_buy"),
@@ -5673,13 +5655,13 @@ const IndicatorsChangedWebhookSchema = /* @__PURE__ */ (() => z.union([z.object(
5673
5655
  creative_id: z.string().optional(),
5674
5656
  change_kind: z.union([z.literal("asserted"), z.literal("cleared"), z.literal("updated"), z.literal("invalidated"), z.literal("coverage_changed"), z.literal("assignment_removed")]),
5675
5657
  changed_indicator_types: z.array(IndicatorTypeSchema),
5676
- observed_at: z.iso.datetime(),
5658
+ observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
5677
5659
  ext: ExtensionObjectSchema.optional()
5678
5660
  }).passthrough(), z.object({
5679
5661
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
5680
5662
  notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
5681
5663
  notification_type: z.literal("indicators.changed"),
5682
- fired_at: z.iso.datetime(),
5664
+ fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
5683
5665
  subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
5684
5666
  account_id: z.string(),
5685
5667
  relationship_kind: z.literal("package"),
@@ -5688,13 +5670,13 @@ const IndicatorsChangedWebhookSchema = /* @__PURE__ */ (() => z.union([z.object(
5688
5670
  creative_id: z.string().optional(),
5689
5671
  change_kind: z.union([z.literal("asserted"), z.literal("cleared"), z.literal("updated"), z.literal("invalidated"), z.literal("coverage_changed"), z.literal("assignment_removed")]),
5690
5672
  changed_indicator_types: z.array(IndicatorTypeSchema),
5691
- observed_at: z.iso.datetime(),
5673
+ observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
5692
5674
  ext: ExtensionObjectSchema.optional()
5693
5675
  }).passthrough(), z.object({
5694
5676
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
5695
5677
  notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
5696
5678
  notification_type: z.literal("indicators.changed"),
5697
- fired_at: z.iso.datetime(),
5679
+ fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
5698
5680
  subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
5699
5681
  account_id: z.string(),
5700
5682
  relationship_kind: z.literal("creative_assignment"),
@@ -5703,7 +5685,7 @@ const IndicatorsChangedWebhookSchema = /* @__PURE__ */ (() => z.union([z.object(
5703
5685
  creative_id: z.string(),
5704
5686
  change_kind: z.union([z.literal("asserted"), z.literal("cleared"), z.literal("updated"), z.literal("invalidated"), z.literal("coverage_changed"), z.literal("assignment_removed")]),
5705
5687
  changed_indicator_types: z.array(IndicatorTypeSchema),
5706
- observed_at: z.iso.datetime(),
5688
+ observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
5707
5689
  ext: ExtensionObjectSchema.optional()
5708
5690
  }).passthrough()]))();
5709
5691
  const InstallmentReferenceSchema = /* @__PURE__ */ (() => z.object({
@@ -5825,7 +5807,7 @@ const PerformanceFeedbackAssertionSchema = /* @__PURE__ */ (() => z.object({
5825
5807
  }).passthrough().optional()
5826
5808
  }).passthrough().optional(),
5827
5809
  evidence_ref: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
5828
- as_of: z.iso.datetime().optional(),
5810
+ as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
5829
5811
  final: z.boolean().optional(),
5830
5812
  supersedes_feedback_id: z.string().min(1).optional()
5831
5813
  }).passthrough())();
@@ -5835,8 +5817,8 @@ const PerformanceFeedbackSchema = /* @__PURE__ */ (() => z.object({
5835
5817
  package_id: z.string().optional(),
5836
5818
  creative_id: z.string().optional(),
5837
5819
  measurement_period: z.object({
5838
- start: z.iso.datetime(),
5839
- end: z.iso.datetime()
5820
+ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
5821
+ end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
5840
5822
  }).passthrough(),
5841
5823
  performance_index: z.number().min(0),
5842
5824
  metric_type: MetricTypeSchema.optional(),
@@ -5865,8 +5847,8 @@ const PerformanceFeedbackSchema = /* @__PURE__ */ (() => z.object({
5865
5847
  feedback_source: FeedbackSourceSchema,
5866
5848
  vendor: BrandReferenceSchema.optional(),
5867
5849
  status: z.union([z.literal("accepted"), z.literal("queued"), z.literal("applied"), z.literal("rejected")]),
5868
- submitted_at: z.iso.datetime(),
5869
- applied_at: z.iso.datetime().optional()
5850
+ submitted_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
5851
+ applied_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
5870
5852
  }).passthrough())();
5871
5853
  const PlacementPresentationReferenceSchema = /* @__PURE__ */ (() => z.object({
5872
5854
  uri: z.string().regex(new RegExp("^https://")).refine(adcpJsonSchemaUri, "Invalid URI"),
@@ -5945,10 +5927,10 @@ const PrincipalChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
5945
5927
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
5946
5928
  notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
5947
5929
  notification_type: z.literal("principal.changed"),
5948
- fired_at: z.iso.datetime(),
5930
+ fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
5949
5931
  subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
5950
5932
  agent_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"),
5951
- changed_at: z.iso.datetime(),
5933
+ changed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
5952
5934
  reason: z.union([z.literal("destination_state_changed"), z.literal("setup_expiring"), z.literal("setup_expired"), z.literal("proof_invalidated"), z.literal("declarations_intersection_changed"), z.literal("other")]),
5953
5935
  destination_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/).optional(),
5954
5936
  ext: ExtensionObjectSchema.optional()
@@ -6093,7 +6075,7 @@ const AgentProfilePayloadSchema = /* @__PURE__ */ (() => z.object({
6093
6075
  property_count: z.int().min(0).optional(),
6094
6076
  publisher_count: z.int().min(0).optional(),
6095
6077
  has_tmp: z.boolean().optional(),
6096
- updated_at: z.iso.datetime().optional()
6078
+ updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
6097
6079
  }).passthrough())();
6098
6080
  const CompliancePayloadSchema = /* @__PURE__ */ (() => z.object({
6099
6081
  agent_url: z.string(),
@@ -6324,7 +6306,7 @@ const ReportingDeliveryReadyWebhookSchema = /* @__PURE__ */ (() => z.object({
6324
6306
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
6325
6307
  notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
6326
6308
  notification_type: z.literal("reporting.delivery_ready"),
6327
- fired_at: z.iso.datetime(),
6309
+ fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
6328
6310
  subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
6329
6311
  account_id: z.string().min(1),
6330
6312
  delivery_config_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
@@ -6333,7 +6315,7 @@ const ReportingDeliveryReadyWebhookSchema = /* @__PURE__ */ (() => z.object({
6333
6315
  reporting_materialization_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
6334
6316
  readiness: z.union([z.literal("available"), z.literal("delivered")]),
6335
6317
  finality: ReportingFinalitySchema,
6336
- data_through: z.iso.datetime().nullable(),
6318
+ data_through: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").nullable(),
6337
6319
  feed_purpose: ReportingFeedPurposeSchema
6338
6320
  }).passthrough())();
6339
6321
  const ReportingFileCompressionSchema = /* @__PURE__ */ (() => z.union([z.literal("none"), z.literal("gzip"), z.literal("zstd"), z.literal("snappy")]))();
@@ -6354,8 +6336,8 @@ const ReportingFileManifestSchema = /* @__PURE__ */ (() => z.object({
6354
6336
  reporting_obligation_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
6355
6337
  reporting_materialization_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
6356
6338
  period: z.object({
6357
- start: z.iso.datetime(),
6358
- end: z.iso.datetime(),
6339
+ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
6340
+ end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
6359
6341
  source_timezone: z.string().min(1)
6360
6342
  }).strict(),
6361
6343
  format: z.union([z.literal("jsonl"), z.literal("csv"), z.literal("parquet"), z.literal("avro"), z.literal("orc")]),
@@ -6364,13 +6346,13 @@ const ReportingFileManifestSchema = /* @__PURE__ */ (() => z.object({
6364
6346
  total_size_bytes: z.int().min(0),
6365
6347
  row_count: z.int().min(0),
6366
6348
  control_totals: z.array(ReportingControlTotalSchema),
6367
- created_at: z.iso.datetime()
6349
+ created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
6368
6350
  }).strict())();
6369
6351
  const ReportingLedgerChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
6370
6352
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
6371
6353
  notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
6372
6354
  notification_type: z.literal("reporting.ledger_changed"),
6373
- fired_at: z.iso.datetime(),
6355
+ fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
6374
6356
  subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
6375
6357
  account_id: z.string().min(1),
6376
6358
  change_kind: z.union([z.literal("revision_published"), z.literal("adjustment_published")]),
@@ -6588,7 +6570,7 @@ const ReportingStatusChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
6588
6570
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
6589
6571
  notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
6590
6572
  notification_type: z.literal("reporting.status_changed"),
6591
- fired_at: z.iso.datetime(),
6573
+ fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
6592
6574
  subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
6593
6575
  account_id: z.string().min(1),
6594
6576
  delivery_config_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
@@ -6670,7 +6652,7 @@ const AttestationReferenceSchema = /* @__PURE__ */ (() => z.object({
6670
6652
  agent_url: z.string().regex(new RegExp("^https://[^/?#@]+(?:/[^?#]*)?(?:\\?[^#]*)?$")).refine(adcpJsonSchemaUri, "Invalid URI")
6671
6653
  }).passthrough().optional(),
6672
6654
  ext: ExtensionObjectSchema.optional()
6673
- }).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
6655
+ }).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
6674
6656
  issuer: AttestationIssuerSchema,
6675
6657
  claim_type: z.string().refine(adcpJsonSchemaUri, "Invalid URI"),
6676
6658
  subject: AttestationSubjectSchema,
@@ -6768,7 +6750,7 @@ const SignalDefinitionSchema = /* @__PURE__ */ (() => z.object({
6768
6750
  response_sla_days: z.int().min(1).max(90).optional(),
6769
6751
  ccpa_opt_out_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(/^https:\/\//).optional()
6770
6752
  }).passthrough().optional(),
6771
- last_updated: z.iso.datetime().optional(),
6753
+ last_updated: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
6772
6754
  dts_compliant_version: z.string().optional()
6773
6755
  }).passthrough())();
6774
6756
  const SignalFiltersSchema = /* @__PURE__ */ (() => z.object({
@@ -6827,9 +6809,9 @@ const TasksGetResponseSchema = /* @__PURE__ */ (() => z.object({
6827
6809
  adcp_major_version: z.number().int().gte(1).lte(99).optional(),
6828
6810
  task_type: TaskTypeSchema,
6829
6811
  protocol: AdCPProtocolSchema,
6830
- created_at: z.iso.datetime(),
6831
- updated_at: z.iso.datetime(),
6832
- completed_at: z.iso.datetime().optional(),
6812
+ created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
6813
+ updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
6814
+ completed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
6833
6815
  has_webhook: z.boolean().optional(),
6834
6816
  progress: z.object({
6835
6817
  percentage: z.number().min(0).max(100).optional(),
@@ -6847,7 +6829,7 @@ const TasksGetResponseSchema = /* @__PURE__ */ (() => z.object({
6847
6829
  }).passthrough().optional()
6848
6830
  }).passthrough().optional(),
6849
6831
  history: z.array(z.object({
6850
- timestamp: z.iso.datetime(),
6832
+ timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
6851
6833
  type: z.union([z.literal("request"), z.literal("response")]),
6852
6834
  data: z.object({}).passthrough()
6853
6835
  }).passthrough()).optional(),
@@ -6865,10 +6847,10 @@ const TasksListRequestSchema = /* @__PURE__ */ (() => z.object({
6865
6847
  statuses: z.array(TaskStatusSchema).optional(),
6866
6848
  task_type: TaskTypeSchema.optional(),
6867
6849
  task_types: z.array(TaskTypeSchema).optional(),
6868
- created_after: z.iso.datetime().optional(),
6869
- created_before: z.iso.datetime().optional(),
6870
- updated_after: z.iso.datetime().optional(),
6871
- updated_before: z.iso.datetime().optional(),
6850
+ created_after: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
6851
+ created_before: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
6852
+ updated_after: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
6853
+ updated_before: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
6872
6854
  task_ids: z.array(z.string()).max(100).optional(),
6873
6855
  context_contains: z.string().optional(),
6874
6856
  has_webhook: z.boolean().optional()
@@ -6916,9 +6898,9 @@ const TasksListResponseSchema = /* @__PURE__ */ (() => z.object({
6916
6898
  task_type: TaskTypeSchema,
6917
6899
  domain: z.union([z.literal("media-buy"), z.literal("signals"), z.literal("creative")]),
6918
6900
  status: TaskStatusSchema,
6919
- created_at: z.iso.datetime(),
6920
- updated_at: z.iso.datetime(),
6921
- completed_at: z.iso.datetime().optional(),
6901
+ created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
6902
+ updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
6903
+ completed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
6922
6904
  has_webhook: z.boolean().optional()
6923
6905
  }).passthrough()),
6924
6906
  pagination: PaginationResponseSchema,
@@ -6970,7 +6952,7 @@ const AgenticAdvertisingOrgVerificationTokenClaimsSchema = /* @__PURE__ */ (() =
6970
6952
  verified_specialisms: z.array(z.string()),
6971
6953
  verification_modes: z.array(VerificationTokenModeSchema),
6972
6954
  grading_profile: z.union([z.literal("legacy"), z.literal("spec")]).optional(),
6973
- first_failing_spec_at: z.iso.datetime().optional(),
6955
+ first_failing_spec_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
6974
6956
  adcp_version: z.string().regex(/^[1-9][0-9]*\.[0-9]+$/).optional(),
6975
6957
  protocol_version: z.string().optional()
6976
6958
  }).passthrough())();
@@ -7002,26 +6984,26 @@ const CreativeAssignmentChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
7002
6984
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
7003
6985
  notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
7004
6986
  notification_type: z.literal("creative.assignment_changed"),
7005
- fired_at: z.iso.datetime(),
6987
+ fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
7006
6988
  subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
7007
6989
  account_id: z.string(),
7008
6990
  media_buy_id: z.string(),
7009
6991
  package_id: z.string(),
7010
6992
  creative_id: z.string(),
7011
6993
  change_kind: z.union([z.literal("assigned"), z.literal("unassigned"), z.literal("approval_changed")]),
7012
- observed_at: z.iso.datetime(),
6994
+ observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
7013
6995
  ext: ExtensionObjectSchema.optional()
7014
6996
  }).passthrough())();
7015
6997
  const CreativePurgedWebhookSchema = /* @__PURE__ */ (() => z.object({
7016
6998
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
7017
6999
  notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
7018
7000
  notification_type: z.literal("creative.purged"),
7019
- fired_at: z.iso.datetime(),
7001
+ fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
7020
7002
  subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
7021
7003
  account_id: z.string(),
7022
7004
  creative_id: z.string(),
7023
7005
  purge_kind: z.union([z.literal("soft"), z.literal("hard")]),
7024
- purged_at: z.iso.datetime(),
7006
+ purged_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
7025
7007
  reason_code: CreativeEventReasonCodeSchema,
7026
7008
  reason_detail: z.string().max(500).optional(),
7027
7009
  initiator: z.union([z.literal("seller"), z.literal("system")]),
@@ -7031,7 +7013,7 @@ const CreativeStatusChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
7031
7013
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
7032
7014
  notification_id: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]{1,255}$/),
7033
7015
  notification_type: z.literal("creative.status_changed"),
7034
- fired_at: z.iso.datetime(),
7016
+ fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
7035
7017
  subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
7036
7018
  account_id: z.string(),
7037
7019
  creative_id: z.string(),
@@ -7039,7 +7021,7 @@ const CreativeStatusChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
7039
7021
  transition: z.object({
7040
7022
  from: z.union([z.literal("processing"), z.literal("pending_review"), z.literal("approved"), z.literal("suspended")]),
7041
7023
  to: CreativeStatusSchema,
7042
- observed_at: z.iso.datetime()
7024
+ observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
7043
7025
  }).passthrough(),
7044
7026
  reason_code: CreativeEventReasonCodeSchema,
7045
7027
  reason_detail: z.string().max(500).optional(),
@@ -7291,7 +7273,7 @@ const ToolNameSchema = /* @__PURE__ */ (() => z.string().regex(/^[a-z][a-z0-9_]*
7291
7273
  const AdCPManifestSchema = /* @__PURE__ */ (() => z.object({
7292
7274
  $schema: z.string().optional(),
7293
7275
  adcp_version: z.string().regex(/^\d+\.\d+\.\d+(-[A-Za-z0-9.-]+)?$/),
7294
- generated_at: z.iso.datetime(),
7276
+ generated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
7295
7277
  tools: z.record(z.string(), z.object({
7296
7278
  protocol: z.union([z.literal("media-buy"), z.literal("signals"), z.literal("governance"), z.literal("account"), z.literal("creative"), z.literal("brand"), z.literal("content-standards"), z.literal("property"), z.literal("collection"), z.literal("sponsored-intelligence"), z.literal("protocol"), z.literal("compliance"), z.literal("trusted-match"), z.literal("a2ui")]),
7297
7279
  mutating: z.boolean(),
@@ -7479,8 +7461,8 @@ const PropertyListChangedWebhookSchema = /* @__PURE__ */ (() => z.object({
7479
7461
  properties_removed: z.int().optional(),
7480
7462
  total_properties: z.int().optional()
7481
7463
  }).passthrough().optional(),
7482
- resolved_at: z.iso.datetime(),
7483
- cache_valid_until: z.iso.datetime().optional(),
7464
+ resolved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
7465
+ cache_valid_until: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
7484
7466
  signature: z.string(),
7485
7467
  ext: ExtensionObjectSchema.optional()
7486
7468
  }).passthrough())();
@@ -7682,7 +7664,7 @@ const IdentityMatchRequestSchema = /* @__PURE__ */ (() => z.object({
7682
7664
  verification_level: z.union([z.literal("orb"), z.literal("device"), z.literal("document")]).optional(),
7683
7665
  signal_binding: z.string().optional(),
7684
7666
  proof: z.object({}).passthrough(),
7685
- expires_at: z.iso.datetime().optional()
7667
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
7686
7668
  }).strict().optional()
7687
7669
  }).strict()).max(3),
7688
7670
  consent: z.object({
@@ -8091,25 +8073,25 @@ const FrequencyCapIntervalConstraintsSchema = /* @__PURE__ */ (() => z.object({
8091
8073
  maximum_interval: z.number().optional(),
8092
8074
  allowed_intervals: z.array(z.number()).optional(),
8093
8075
  ext: ExtensionObjectSchema.optional()
8094
- }).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
8076
+ }).passthrough().and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
8095
8077
  unit: FrequencyCapDurationUnitSchema,
8096
8078
  minimum_interval: z.number().optional(),
8097
8079
  maximum_interval: z.number().optional(),
8098
8080
  allowed_intervals: z.array(z.number()).optional(),
8099
8081
  ext: ExtensionObjectSchema.optional()
8100
- }).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
8082
+ }).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
8101
8083
  unit: FrequencyCapDurationUnitSchema,
8102
8084
  minimum_interval: z.number().optional(),
8103
8085
  maximum_interval: z.number().optional(),
8104
8086
  allowed_intervals: z.array(z.number()).optional(),
8105
8087
  ext: ExtensionObjectSchema.optional()
8106
- }).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
8088
+ }).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
8107
8089
  unit: FrequencyCapDurationUnitSchema,
8108
8090
  minimum_interval: z.number().optional(),
8109
8091
  maximum_interval: z.number().optional(),
8110
8092
  allowed_intervals: z.array(z.number()).optional(),
8111
8093
  ext: ExtensionObjectSchema.optional()
8112
- }).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])))();
8094
+ }).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
8113
8095
  const FrequencyCapConstraintsSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({
8114
8096
  mutable_fields: z.array(FrequencyCapMutableFieldSchema).optional(),
8115
8097
  supported_control_modes: z.array(FrequencyCapControlModeSchema).optional(),
@@ -8314,7 +8296,7 @@ const AcceptProposalRequestSchema = /* @__PURE__ */ (() => z.object({
8314
8296
  budget_cap_timezone: z.string().min(1).optional(),
8315
8297
  io_acceptance: z.object({
8316
8298
  io_id: z.string().min(1),
8317
- accepted_at: z.iso.datetime(),
8299
+ accepted_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
8318
8300
  signatory: z.string().min(1).max(250),
8319
8301
  signature_id: z.string().min(1).optional()
8320
8302
  }).passthrough().optional(),
@@ -8333,7 +8315,7 @@ const ControlAppliedSchema = /* @__PURE__ */ (() => z.object({
8333
8315
  media_buy_id: z.string().min(1),
8334
8316
  revision: z.int().min(1),
8335
8317
  media_buy_status: MediaBuyStatusSchema.optional(),
8336
- implementation_date: z.iso.datetime().optional().nullable(),
8318
+ implementation_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
8337
8319
  affected_package_ids: z.array(z.string()).optional(),
8338
8320
  available_actions: z.array(CanonicalMediaBuyActionSchema).optional(),
8339
8321
  warnings: z.array(WarningSchema.and(z.object({
@@ -8467,7 +8449,7 @@ const TagURLSchema = /* @__PURE__ */ (() => z.object({
8467
8449
  location: z.object({
8468
8450
  field: z.literal("url").optional()
8469
8451
  }).passthrough().optional()
8470
- }).passthrough())).optional(),
8452
+ }).passthrough())).min(1).optional(),
8471
8453
  provenance: ProvenanceSchema.optional(),
8472
8454
  delivery_type: z.literal("tag_url"),
8473
8455
  url: MacroBearingURL1Schema
@@ -8478,7 +8460,7 @@ const PairedRedirectSchema = /* @__PURE__ */ (() => z.object({
8478
8460
  location: z.object({
8479
8461
  field: z.union([z.literal("ad_request_url"), z.literal("clickthrough_url")]).optional()
8480
8462
  }).passthrough().optional()
8481
- }).passthrough())).optional(),
8463
+ }).passthrough())).min(1).optional(),
8482
8464
  provenance: ProvenanceSchema.optional(),
8483
8465
  delivery_type: z.literal("paired_redirect"),
8484
8466
  ad_request_url: MacroBearingURL2Schema,
@@ -8492,7 +8474,7 @@ const URLAsset1Schema = /* @__PURE__ */ (() => z.object({
8492
8474
  location: z.object({
8493
8475
  field: z.literal("url").optional()
8494
8476
  }).passthrough().optional()
8495
- }).passthrough())).optional(),
8477
+ }).passthrough())).min(1).optional(),
8496
8478
  description: z.string().optional(),
8497
8479
  state_id: z.string().optional(),
8498
8480
  provenance: ProvenanceSchema.optional()
@@ -8531,7 +8513,7 @@ const GetMediaBuysRequestSchema = /* @__PURE__ */ (() => z.object({
8531
8513
  }).passthrough())();
8532
8514
  const ScopedCreativeApprovalSchema = /* @__PURE__ */ (() => z.object({
8533
8515
  scope: IndicatorScopeSchema,
8534
- approval_status: CreativeApprovalStatusSchema.and(z.union([z.literal("pending_review"), z.literal("approved"), z.literal("rejected")])),
8516
+ approval_status: CreativeApprovalStatusSchema.and(z.union([z.literal("pending_review"), z.literal("approved"), z.literal("rejected")]).describe("Must also satisfy at least one of these alternatives.")),
8535
8517
  rejection_reason: z.string().optional()
8536
8518
  }).passthrough())();
8537
8519
  const GetMediaBuyDeliveryRequestSchema = /* @__PURE__ */ (() => z.object({
@@ -8684,8 +8666,8 @@ const GetReportingStatusRequestSchema = /* @__PURE__ */ (() => z.object({
8684
8666
  delivery_config_ids: z.array(z.string()).max(16).optional(),
8685
8667
  feed_purposes: z.array(ReportingFeedPurposeSchema).optional(),
8686
8668
  period: z.object({
8687
- start: z.iso.datetime(),
8688
- end: z.iso.datetime()
8669
+ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
8670
+ end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
8689
8671
  }).passthrough().optional(),
8690
8672
  health: z.array(ReportingHealthSchema).optional(),
8691
8673
  finality: z.array(ReportingFinalitySchema).optional(),
@@ -8804,7 +8786,7 @@ const UnavailableLookupSchema = /* @__PURE__ */ (() => z.object({
8804
8786
  context_id: z.string().optional(),
8805
8787
  context: ContextObjectSchema.optional(),
8806
8788
  message: z.literal("Reporting status resource is unavailable.").optional(),
8807
- timestamp: z.iso.datetime().optional(),
8789
+ timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
8808
8790
  replayed: z.boolean().optional(),
8809
8791
  adcp_error: z.object({
8810
8792
  code: z.literal("NOT_FOUND"),
@@ -8824,7 +8806,7 @@ const OperationalFailureSchema = /* @__PURE__ */ (() => z.object({
8824
8806
  context_id: z.string().optional(),
8825
8807
  context: ContextObjectSchema.optional(),
8826
8808
  message: z.string().optional(),
8827
- timestamp: z.iso.datetime().optional(),
8809
+ timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
8828
8810
  replayed: z.boolean().optional(),
8829
8811
  adcp_error: ErrorSchema.optional(),
8830
8812
  errors: z.array(ErrorSchema)
@@ -8943,8 +8925,8 @@ const ProvidePerformanceFeedbackSuccessSchema = /* @__PURE__ */ (() => z.object(
8943
8925
  feedback_id: z.string().min(1).optional(),
8944
8926
  application_status: z.union([z.literal("accepted"), z.literal("applied"), z.literal("not_applied")]).optional(),
8945
8927
  status_reason: z.string().max(500).optional(),
8946
- received_at: z.iso.datetime().optional(),
8947
- applied_at: z.iso.datetime().optional(),
8928
+ received_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
8929
+ applied_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
8948
8930
  sandbox: z.boolean().optional(),
8949
8931
  context: ContextObjectSchema.optional(),
8950
8932
  ext: ExtensionObjectSchema.optional()
@@ -9079,7 +9061,7 @@ const SyncAudiencesSuccessSchema = /* @__PURE__ */ (() => z.object({
9079
9061
  matched: z.int().min(0),
9080
9062
  match_rate: z.number().min(0).max(1)
9081
9063
  }).passthrough()).optional(),
9082
- last_synced_at: z.iso.datetime().optional(),
9064
+ last_synced_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
9083
9065
  source: z.object({
9084
9066
  kind: z.union([z.literal("dataset"), z.literal("platform_segment")]),
9085
9067
  vendor: BrandReferenceSchema,
@@ -9141,8 +9123,8 @@ const SyncCatalogsSuccessSchema = /* @__PURE__ */ (() => z.object({
9141
9123
  status: CatalogItemStatusSchema,
9142
9124
  reasons: z.array(z.string()).optional()
9143
9125
  }).passthrough()).optional(),
9144
- last_synced_at: z.iso.datetime().optional(),
9145
- next_fetch_at: z.iso.datetime().optional(),
9126
+ last_synced_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
9127
+ next_fetch_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
9146
9128
  changes: z.array(z.string()).optional(),
9147
9129
  errors: z.array(ErrorSchema).optional(),
9148
9130
  warnings: z.array(z.string()).optional()
@@ -9182,7 +9164,7 @@ const EvaluatorSpecSchema = /* @__PURE__ */ (() => z.object({
9182
9164
  evaluator_id: z.string()
9183
9165
  }).passthrough(), z.object({
9184
9166
  agent_url: z.string().regex(new RegExp("^https://")).refine(adcpJsonSchemaUri, "Invalid URI")
9185
- }).passthrough()])))();
9167
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
9186
9168
  const RightsConstraintSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({
9187
9169
  rights_id: z.string(),
9188
9170
  rights_agent: z.object({
@@ -9712,8 +9694,8 @@ const GetPropertyListResponseSchema = /* @__PURE__ */ (() => z.object({
9712
9694
  list: PropertyListSchema,
9713
9695
  identifiers: z.array(IdentifierSchema).optional(),
9714
9696
  pagination: PaginationResponseSchema.optional(),
9715
- resolved_at: z.iso.datetime().optional(),
9716
- cache_valid_until: z.iso.datetime().optional(),
9697
+ resolved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
9698
+ cache_valid_until: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
9717
9699
  coverage_gaps: z.record(z.string(), z.array(IdentifierSchema)).optional(),
9718
9700
  ext: ExtensionObjectSchema.optional()
9719
9701
  }).passthrough())();
@@ -9873,8 +9855,8 @@ const GetCollectionListResponseSchema = /* @__PURE__ */ (() => z.object({
9873
9855
  kind: CollectionKindSchema.optional()
9874
9856
  }).passthrough()).optional(),
9875
9857
  pagination: PaginationResponseSchema.optional(),
9876
- resolved_at: z.iso.datetime().optional(),
9877
- cache_valid_until: z.iso.datetime().optional(),
9858
+ resolved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
9859
+ cache_valid_until: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
9878
9860
  coverage_gaps: z.record(z.string(), z.array(z.object({
9879
9861
  type: DistributionIdentifierTypeSchema,
9880
9862
  value: z.string()
@@ -10116,7 +10098,7 @@ const CreateContentStandardsResponseSchema = /* @__PURE__ */ (() => z.object({
10116
10098
  conflicting_standards_id: z.string().optional(),
10117
10099
  context: ContextObjectSchema.optional(),
10118
10100
  ext: ExtensionObjectSchema.optional()
10119
- }).passthrough()])))();
10101
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
10120
10102
  const UpdateContentStandardsRequestSchema = /* @__PURE__ */ (() => z.object({
10121
10103
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
10122
10104
  adcp_major_version: z.number().int().gte(1).lte(99).optional(),
@@ -10198,7 +10180,7 @@ const CalibrateContentResponseSchema = /* @__PURE__ */ (() => z.object({
10198
10180
  errors: z.array(ErrorSchema),
10199
10181
  context: ContextObjectSchema.optional(),
10200
10182
  ext: ExtensionObjectSchema.optional()
10201
- }).passthrough()])))();
10183
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
10202
10184
  const ValidateContentDeliveryRequestSchema = /* @__PURE__ */ (() => z.object({
10203
10185
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
10204
10186
  adcp_major_version: z.number().int().gte(1).lte(99).optional(),
@@ -10206,7 +10188,7 @@ const ValidateContentDeliveryRequestSchema = /* @__PURE__ */ (() => z.object({
10206
10188
  records: z.array(z.object({
10207
10189
  record_id: z.string(),
10208
10190
  media_buy_id: z.string().optional(),
10209
- timestamp: z.iso.datetime().optional(),
10191
+ timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
10210
10192
  artifact: ArtifactSchema,
10211
10193
  country: z.string().optional(),
10212
10194
  channel: z.string().optional(),
@@ -10257,7 +10239,7 @@ const ValidateContentDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
10257
10239
  errors: z.array(ErrorSchema),
10258
10240
  context: ContextObjectSchema.optional(),
10259
10241
  ext: ExtensionObjectSchema.optional()
10260
- }).passthrough()])))();
10242
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
10261
10243
  const GetMediaBuyArtifactsRequestSchema = /* @__PURE__ */ (() => z.object({
10262
10244
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
10263
10245
  adcp_major_version: z.number().int().gte(1).lte(99).optional(),
@@ -10266,8 +10248,8 @@ const GetMediaBuyArtifactsRequestSchema = /* @__PURE__ */ (() => z.object({
10266
10248
  package_ids: z.array(z.string()).optional(),
10267
10249
  failures_only: z.boolean().optional(),
10268
10250
  time_range: z.object({
10269
- start: z.iso.datetime().optional(),
10270
- end: z.iso.datetime().optional()
10251
+ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
10252
+ end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
10271
10253
  }).passthrough().optional(),
10272
10254
  pagination: z.object({
10273
10255
  max_results: z.int().min(1).max(1e4).optional(),
@@ -10294,7 +10276,7 @@ const GetMediaBuyArtifactsResponseSchema = /* @__PURE__ */ (() => z.object({
10294
10276
  media_buy_id: z.string(),
10295
10277
  artifacts: z.array(z.object({
10296
10278
  record_id: z.string(),
10297
- timestamp: z.iso.datetime().optional(),
10279
+ timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
10298
10280
  package_id: z.string().optional(),
10299
10281
  artifact: ArtifactSchema,
10300
10282
  country: z.string().optional(),
@@ -10318,7 +10300,7 @@ const GetMediaBuyArtifactsResponseSchema = /* @__PURE__ */ (() => z.object({
10318
10300
  errors: z.array(ErrorSchema),
10319
10301
  context: ContextObjectSchema.optional(),
10320
10302
  ext: ExtensionObjectSchema.optional()
10321
- }).passthrough()])))();
10303
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
10322
10304
  const GetCreativeFeaturesSuccessSchema = /* @__PURE__ */ (() => z.object({
10323
10305
  evaluation_id: z.string().min(1).optional(),
10324
10306
  results: z.array(CreativeFeatureResultSchema),
@@ -10369,8 +10351,8 @@ const SyncPlansRequestSchema = /* @__PURE__ */ (() => z.object({
10369
10351
  }).passthrough()).optional()
10370
10352
  }).passthrough().optional(),
10371
10353
  flight: z.object({
10372
- start: z.iso.datetime(),
10373
- end: z.iso.datetime()
10354
+ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
10355
+ end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
10374
10356
  }).passthrough(),
10375
10357
  countries: z.array(z.string()).optional(),
10376
10358
  regions: z.array(z.string()).optional(),
@@ -10391,7 +10373,7 @@ const SyncPlansRequestSchema = /* @__PURE__ */ (() => z.object({
10391
10373
  currency: z.string()
10392
10374
  }).passthrough().optional(),
10393
10375
  markets: z.array(z.string()).optional(),
10394
- expires_at: z.iso.datetime().optional()
10376
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
10395
10377
  }).passthrough()).optional(),
10396
10378
  portfolio: z.object({
10397
10379
  member_plan_ids: z.array(z.string()),
@@ -10486,12 +10468,12 @@ const ReportPlanAdjustmentRequestSchema = /* @__PURE__ */ (() => z.object({
10486
10468
  currency: z.string().regex(/^[A-Z]{3}$/)
10487
10469
  }).passthrough().optional(),
10488
10470
  reason: z.string().min(1).max(1e3).optional(),
10489
- effective_at: z.iso.datetime().optional(),
10471
+ effective_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
10490
10472
  evidence: z.object({
10491
10473
  evidence_id: z.string().min(1).max(255),
10492
10474
  evidence_type: z.union([z.literal("decommitment_agreement"), z.literal("refund_settlement"), z.literal("credit_note"), z.literal("makegood_agreement")]),
10493
10475
  digest: z.string().regex(/^sha256:[a-f0-9]{64}$/),
10494
- issued_at: z.iso.datetime()
10476
+ issued_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
10495
10477
  }).passthrough().optional(),
10496
10478
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
10497
10479
  context: ContextObjectSchema.optional(),
@@ -10586,7 +10568,7 @@ const GetPlanAuditLogsResponseSchema = /* @__PURE__ */ (() => z.object({
10586
10568
  check_id: z.string(),
10587
10569
  reason: z.string(),
10588
10570
  resolution: z.string().optional(),
10589
- resolved_at: z.iso.datetime().optional()
10571
+ resolved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
10590
10572
  }).passthrough()).optional(),
10591
10573
  drift_metrics: z.object({
10592
10574
  escalation_rate: z.number().min(0).max(1).optional(),
@@ -10605,7 +10587,7 @@ const GetPlanAuditLogsResponseSchema = /* @__PURE__ */ (() => z.object({
10605
10587
  entries: z.array(z.object({
10606
10588
  id: z.string(),
10607
10589
  type: z.union([z.literal("check"), z.literal("outcome"), z.literal("adjustment")]),
10608
- timestamp: z.iso.datetime(),
10590
+ timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
10609
10591
  plan_id: z.string().optional(),
10610
10592
  caller: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
10611
10593
  tool: z.string().optional(),
@@ -10630,13 +10612,13 @@ const GetPlanAuditLogsResponseSchema = /* @__PURE__ */ (() => z.object({
10630
10612
  statement_id: z.string(),
10631
10613
  statement_digest: z.string().regex(/^sha256:[a-f0-9]{64}$/),
10632
10614
  sequence: z.int().min(1),
10633
- issued_at: z.iso.datetime(),
10615
+ issued_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
10634
10616
  seller_reference: z.string(),
10635
10617
  cumulative_spend: z.number().min(0),
10636
10618
  currency: z.string().regex(/^[A-Z]{3}$/),
10637
10619
  reporting_period: z.object({
10638
- start: z.iso.datetime(),
10639
- end: z.iso.datetime()
10620
+ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
10621
+ end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
10640
10622
  }).passthrough(),
10641
10623
  canonical_payload: z.object({
10642
10624
  seller_reference: z.string(),
@@ -10654,19 +10636,19 @@ const GetPlanAuditLogsResponseSchema = /* @__PURE__ */ (() => z.object({
10654
10636
  }).passthrough().optional(),
10655
10637
  headroom_restored: z.number().min(0).optional(),
10656
10638
  reason: z.string().optional(),
10657
- effective_at: z.iso.datetime().optional(),
10639
+ effective_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
10658
10640
  committed_budget: z.number().optional(),
10659
10641
  reported_committed_budget: z.number().min(0).optional(),
10660
10642
  seller_reference: z.string().optional(),
10661
10643
  delivery: z.object({
10662
10644
  observation_id: z.string().min(1).max(255).optional(),
10663
10645
  source: z.union([z.literal("seller_statement_copy"), z.literal("buyer_measurement")]).optional(),
10664
- observed_at: z.iso.datetime().optional(),
10646
+ observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
10665
10647
  seller_statement_id: z.string().optional(),
10666
10648
  seller_statement_digest: z.string().regex(/^sha256:[a-f0-9]{64}$/).optional(),
10667
10649
  reporting_period: z.object({
10668
- start: z.iso.datetime(),
10669
- end: z.iso.datetime()
10650
+ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
10651
+ end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
10670
10652
  }).passthrough().optional(),
10671
10653
  cumulative_spend: z.number().min(0).optional(),
10672
10654
  currency: z.string().regex(/^[A-Z]{3}$/).optional(),
@@ -10690,10 +10672,10 @@ const GetPlanAuditLogsResponseSchema = /* @__PURE__ */ (() => z.object({
10690
10672
  evidence_id: z.string(),
10691
10673
  evidence_type: z.union([z.literal("decommitment_agreement"), z.literal("refund_settlement"), z.literal("credit_note"), z.literal("makegood_agreement")]),
10692
10674
  digest: z.string().regex(/^sha256:[a-f0-9]{64}$/),
10693
- issued_at: z.iso.datetime()
10675
+ issued_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
10694
10676
  }).passthrough().optional(),
10695
10677
  reviewed_by: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
10696
- reviewed_at: z.iso.datetime().optional(),
10678
+ reviewed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
10697
10679
  review_reason: z.string().optional()
10698
10680
  }).passthrough()).optional(),
10699
10681
  governed_actions: z.array(z.object({
@@ -10709,8 +10691,8 @@ const GetPlanAuditLogsResponseSchema = /* @__PURE__ */ (() => z.object({
10709
10691
  seller_reported_spend: z.number().min(0).optional(),
10710
10692
  buyer_observed_spend: z.number().min(0).optional(),
10711
10693
  delivery_reporting_period: z.object({
10712
- start: z.iso.datetime(),
10713
- end: z.iso.datetime()
10694
+ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
10695
+ end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
10714
10696
  }).passthrough().optional(),
10715
10697
  conservative_exposure: z.number().min(0).optional(),
10716
10698
  delivery_reconciliation_status: z.union([z.literal("consistent"), z.literal("measurement_variance"), z.literal("disputed"), z.literal("unmatched"), z.literal("closed_unresolved")]).optional(),
@@ -10746,17 +10728,17 @@ const CheckGovernanceResponseSchema = /* @__PURE__ */ (() => z.object({
10746
10728
  reason: z.string()
10747
10729
  }).passthrough()).optional(),
10748
10730
  consultation_context: z.string().min(1).max(255).regex(/^[A-Za-z0-9_.:-]+$/).optional(),
10749
- expires_at: z.iso.datetime().optional(),
10750
- next_check: z.iso.datetime().optional(),
10731
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
10732
+ next_check: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
10751
10733
  delivery_statement: z.object({
10752
10734
  statement_id: z.string(),
10753
10735
  statement_digest: z.string().regex(/^sha256:[a-f0-9]{64}$/),
10754
10736
  sequence: z.int().min(1),
10755
- issued_at: z.iso.datetime(),
10737
+ issued_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
10756
10738
  seller_reference: z.string(),
10757
10739
  reporting_period: z.object({
10758
- start: z.iso.datetime(),
10759
- end: z.iso.datetime()
10740
+ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
10741
+ end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
10760
10742
  }).passthrough(),
10761
10743
  cumulative_spend: z.number().min(0),
10762
10744
  currency: z.string().regex(/^[A-Z]{3}$/),
@@ -10805,13 +10787,13 @@ const SIGetOfferingResponseSchema = /* @__PURE__ */ (() => z.object({
10805
10787
  available: z.boolean(),
10806
10788
  offering_token: z.string().optional(),
10807
10789
  ttl_seconds: z.int().min(0).optional(),
10808
- checked_at: z.iso.datetime().optional(),
10790
+ checked_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
10809
10791
  offering: z.object({
10810
10792
  offering_id: z.string().optional(),
10811
10793
  title: z.string().optional(),
10812
10794
  summary: z.string().optional(),
10813
10795
  tagline: z.string().optional(),
10814
- expires_at: z.iso.datetime().optional(),
10796
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
10815
10797
  availability_status: OfferingAvailabilityStatusSchema.optional(),
10816
10798
  price_hint: z.string().optional(),
10817
10799
  image_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
@@ -10972,7 +10954,7 @@ const SITerminateSessionResponseSchema = /* @__PURE__ */ (() => z.object({
10972
10954
  checkout_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
10973
10955
  checkout_token: z.string().optional(),
10974
10956
  payload: z.object({}).passthrough().optional(),
10975
- expires_at: z.iso.datetime().optional()
10957
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
10976
10958
  }).passthrough().optional(),
10977
10959
  follow_up: z.object({
10978
10960
  action: z.union([z.literal("save_for_later"), z.literal("set_reminder"), z.literal("subscribe_updates"), z.literal("none")]).optional(),
@@ -11133,9 +11115,9 @@ const GetTaskStatusResponseSchema = /* @__PURE__ */ (() => z.object({
11133
11115
  adcp_major_version: z.number().int().gte(1).lte(99).optional(),
11134
11116
  task_type: TaskTypeSchema,
11135
11117
  protocol: AdCPProtocolSchema,
11136
- created_at: z.iso.datetime(),
11137
- updated_at: z.iso.datetime(),
11138
- completed_at: z.iso.datetime().optional(),
11118
+ created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
11119
+ updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
11120
+ completed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11139
11121
  has_webhook: z.boolean().optional(),
11140
11122
  progress: z.object({
11141
11123
  percentage: z.number().min(0).max(100).optional(),
@@ -11153,7 +11135,7 @@ const GetTaskStatusResponseSchema = /* @__PURE__ */ (() => z.object({
11153
11135
  }).passthrough().optional()
11154
11136
  }).passthrough().optional(),
11155
11137
  history: z.array(z.object({
11156
- timestamp: z.iso.datetime(),
11138
+ timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
11157
11139
  type: z.union([z.literal("request"), z.literal("response")]),
11158
11140
  data: z.object({}).passthrough()
11159
11141
  }).passthrough()).optional(),
@@ -11171,10 +11153,10 @@ const ListTasksRequestSchema = /* @__PURE__ */ (() => z.object({
11171
11153
  statuses: z.array(TaskStatusSchema).optional(),
11172
11154
  task_type: TaskTypeSchema.optional(),
11173
11155
  task_types: z.array(TaskTypeSchema).optional(),
11174
- created_after: z.iso.datetime().optional(),
11175
- created_before: z.iso.datetime().optional(),
11176
- updated_after: z.iso.datetime().optional(),
11177
- updated_before: z.iso.datetime().optional(),
11156
+ created_after: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11157
+ created_before: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11158
+ updated_after: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11159
+ updated_before: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11178
11160
  task_ids: z.array(z.string()).max(100).optional(),
11179
11161
  context_contains: z.string().optional(),
11180
11162
  has_webhook: z.boolean().optional()
@@ -11222,9 +11204,9 @@ const ListTasksResponseSchema = /* @__PURE__ */ (() => z.object({
11222
11204
  task_type: TaskTypeSchema,
11223
11205
  domain: z.union([z.literal("media-buy"), z.literal("signals"), z.literal("creative")]),
11224
11206
  status: TaskStatusSchema,
11225
- created_at: z.iso.datetime(),
11226
- updated_at: z.iso.datetime(),
11227
- completed_at: z.iso.datetime().optional(),
11207
+ created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
11208
+ updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
11209
+ completed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11228
11210
  has_webhook: z.boolean().optional()
11229
11211
  }).passthrough()),
11230
11212
  pagination: PaginationResponseSchema,
@@ -11368,15 +11350,15 @@ const ListAccountChangesResponseSchema = /* @__PURE__ */ (() => z.object({
11368
11350
  changes: z.array(AccountChangeSchema).max(100).optional(),
11369
11351
  cursor: z.string().min(1).max(4096).optional(),
11370
11352
  has_more: z.boolean().optional(),
11371
- available_since: z.iso.datetime().optional(),
11372
- generated_at: z.iso.datetime().optional(),
11353
+ available_since: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11354
+ generated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11373
11355
  source_coverage: z.array(z.object({
11374
11356
  source_id: z.string().max(255),
11375
11357
  kind: z.union([z.literal("seller"), z.literal("connected_platform")]),
11376
11358
  status: z.union([z.literal("current"), z.literal("delayed"), z.literal("unavailable"), z.literal("not_configured")]),
11377
- coverage_start: z.iso.datetime().optional(),
11378
- observed_through: z.iso.datetime().optional(),
11379
- last_successful_sync_at: z.iso.datetime().optional(),
11359
+ coverage_start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11360
+ observed_through: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11361
+ last_successful_sync_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11380
11362
  stale_after_seconds: z.int().min(1).max(2592e3).optional(),
11381
11363
  resource_types: z.array(z.string()).max(50)
11382
11364
  }).passthrough()).max(50).optional(),
@@ -11386,15 +11368,15 @@ const ListAccountChangesResponseSchema = /* @__PURE__ */ (() => z.object({
11386
11368
  changes: z.array(AccountChangeSchema).max(100),
11387
11369
  cursor: z.string().min(1).max(4096),
11388
11370
  has_more: z.boolean(),
11389
- available_since: z.iso.datetime(),
11390
- generated_at: z.iso.datetime(),
11371
+ available_since: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
11372
+ generated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
11391
11373
  source_coverage: z.array(z.object({
11392
11374
  source_id: z.string().max(255),
11393
11375
  kind: z.union([z.literal("seller"), z.literal("connected_platform")]),
11394
11376
  status: z.union([z.literal("current"), z.literal("delayed"), z.literal("unavailable"), z.literal("not_configured")]),
11395
- coverage_start: z.iso.datetime().optional(),
11396
- observed_through: z.iso.datetime().optional(),
11397
- 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(),
11398
11380
  stale_after_seconds: z.int().min(1).max(2592e3).optional(),
11399
11381
  resource_types: z.array(z.string()).max(50)
11400
11382
  }).passthrough()).max(50).optional(),
@@ -11406,15 +11388,15 @@ const ListAccountChangesResponseSchema = /* @__PURE__ */ (() => z.object({
11406
11388
  changes: z.array(AccountChangeSchema).max(100).optional(),
11407
11389
  cursor: z.string().min(1).max(4096).optional(),
11408
11390
  has_more: z.boolean().optional(),
11409
- available_since: z.iso.datetime().optional(),
11410
- generated_at: z.iso.datetime().optional(),
11391
+ available_since: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11392
+ generated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11411
11393
  source_coverage: z.array(z.object({
11412
11394
  source_id: z.string().max(255),
11413
11395
  kind: z.union([z.literal("seller"), z.literal("connected_platform")]),
11414
11396
  status: z.union([z.literal("current"), z.literal("delayed"), z.literal("unavailable"), z.literal("not_configured")]),
11415
- coverage_start: z.iso.datetime().optional(),
11416
- observed_through: z.iso.datetime().optional(),
11417
- last_successful_sync_at: z.iso.datetime().optional(),
11397
+ coverage_start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11398
+ observed_through: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11399
+ last_successful_sync_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11418
11400
  stale_after_seconds: z.int().min(1).max(2592e3).optional(),
11419
11401
  resource_types: z.array(z.string()).max(50)
11420
11402
  }).passthrough()).max(50).optional(),
@@ -11422,7 +11404,7 @@ const ListAccountChangesResponseSchema = /* @__PURE__ */ (() => z.object({
11422
11404
  context: ContextObjectSchema.optional(),
11423
11405
  ext: ExtensionObjectSchema.optional(),
11424
11406
  status: z.literal("failed")
11425
- }).passthrough()])))();
11407
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
11426
11408
  const ListAccountsRequestSchema = /* @__PURE__ */ (() => z.object({
11427
11409
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
11428
11410
  adcp_major_version: z.number().int().gte(1).lte(99).optional(),
@@ -11503,7 +11485,7 @@ const ReportUsageRequestSchema = /* @__PURE__ */ (() => z.object({
11503
11485
  build_variant_id: z.string().optional(),
11504
11486
  property_list_id: z.string().optional(),
11505
11487
  final: z.boolean().optional(),
11506
- finalized_at: z.iso.datetime().optional(),
11488
+ finalized_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
11507
11489
  measurement_window: z.string().max(50).optional()
11508
11490
  }).passthrough()),
11509
11491
  context: ContextObjectSchema.optional(),
@@ -11701,7 +11683,7 @@ const RawAttestationSchema = /* @__PURE__ */ (() => z.object({
11701
11683
  purpose: z.union([z.literal("platform_primary"), z.literal("measurement"), z.literal("attribution"), z.literal("creative_serving"), z.literal("identity"), z.literal("other")]).optional(),
11702
11684
  payload: z.object({}).passthrough(),
11703
11685
  payload_length: z.int().min(0),
11704
- timestamp: z.iso.datetime(),
11686
+ timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
11705
11687
  status_code: z.int().min(100).max(599).optional()
11706
11688
  }).passthrough())();
11707
11689
  const DigestAttestationSchema = /* @__PURE__ */ (() => z.object({
@@ -11719,7 +11701,7 @@ const DigestAttestationSchema = /* @__PURE__ */ (() => z.object({
11719
11701
  identifier_value_sha256: z.string().regex(/^[a-f0-9]{64}$/),
11720
11702
  found: z.boolean()
11721
11703
  }).passthrough()).max(64).optional(),
11722
- timestamp: z.iso.datetime(),
11704
+ timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
11723
11705
  status_code: z.int().min(100).max(599).optional()
11724
11706
  }).passthrough())();
11725
11707
  const IndividualImageAssetSchema = /* @__PURE__ */ (() => BaseIndividualAssetSchema.merge(z.object({
@@ -11768,7 +11750,7 @@ const BudgetChangeConstraintsSchema = /* @__PURE__ */ (() => z.object({
11768
11750
  min_result_amount: MoneySchema
11769
11751
  }).passthrough(), z.object({
11770
11752
  max_result_amount: MoneySchema
11771
- }).passthrough()])))();
11753
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
11772
11754
  const MediaBuyChangeTermConstraintsSchema = /* @__PURE__ */ (() => z.union([BudgetChangeConstraintsSchema, FlightChangeConstraintsSchema, PackageCountConstraintsSchema, EffectiveTimingConstraintsSchema]))();
11773
11755
  const ReportingFileTransferSchema = /* @__PURE__ */ (() => z.object({
11774
11756
  pattern: z.literal("file_transfer"),
@@ -11784,9 +11766,9 @@ const SelectedPlacementsSchema = /* @__PURE__ */ (() => z.object({
11784
11766
  }).passthrough())();
11785
11767
  const DisplayTagAssetSchema = /* @__PURE__ */ (() => z.object({
11786
11768
  asset_type: z.literal("display_tag"),
11787
- macro_declarations: z.array(MacroDeclarationSchema).optional(),
11769
+ macro_declarations: z.array(MacroDeclarationSchema).min(1).optional(),
11788
11770
  provenance: ProvenanceSchema.optional()
11789
- }).passthrough().and(z.union([TagURLSchema, InlineMarkupSchema, PairedRedirectSchema])))();
11771
+ }).passthrough().and(z.union([TagURLSchema, InlineMarkupSchema, PairedRedirectSchema]).describe("Must also satisfy at least one of these alternatives.")))();
11790
11772
  const DAASTAssetSchema = /* @__PURE__ */ (() => z.object({
11791
11773
  asset_type: z.literal("daast"),
11792
11774
  daast_version: DAASTVersionSchema.optional(),
@@ -11795,7 +11777,7 @@ const DAASTAssetSchema = /* @__PURE__ */ (() => z.object({
11795
11777
  companion_ads: z.boolean().optional(),
11796
11778
  transcript_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
11797
11779
  provenance: ProvenanceSchema.optional(),
11798
- macro_declarations: z.array(MacroDeclarationSchema).optional()
11780
+ macro_declarations: z.array(MacroDeclarationSchema).min(1).optional()
11799
11781
  }).passthrough().and(z.union([z.object({
11800
11782
  delivery_type: z.literal("url"),
11801
11783
  url: MacroBearingURL5Schema,
@@ -11803,7 +11785,7 @@ const DAASTAssetSchema = /* @__PURE__ */ (() => z.object({
11803
11785
  location: z.object({
11804
11786
  field: z.literal("url").optional()
11805
11787
  }).passthrough().optional()
11806
- }).passthrough()).optional()
11788
+ }).passthrough()).min(1).optional()
11807
11789
  }).passthrough(), z.object({
11808
11790
  delivery_type: z.literal("inline"),
11809
11791
  content: z.string(),
@@ -11811,8 +11793,8 @@ const DAASTAssetSchema = /* @__PURE__ */ (() => z.object({
11811
11793
  location: z.object({
11812
11794
  field: z.literal("content").optional()
11813
11795
  }).passthrough().optional()
11814
- }).passthrough()).optional()
11815
- }).passthrough()])))();
11796
+ }).passthrough()).min(1).optional()
11797
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
11816
11798
  const CardAssetSchema = /* @__PURE__ */ (() => z.object({
11817
11799
  asset_type: z.literal("card"),
11818
11800
  media: z.union([ImageAssetSchema, VideoAssetSchema]),
@@ -11832,7 +11814,7 @@ const PixelTrackerAssetSchema = /* @__PURE__ */ (() => z.object({}).passthrough(
11832
11814
  location: z.object({
11833
11815
  field: z.literal("url").optional()
11834
11816
  }).passthrough().optional()
11835
- }).passthrough())).optional(),
11817
+ }).passthrough())).min(1).optional(),
11836
11818
  custom_event_name: z.string().optional(),
11837
11819
  provenance: ProvenanceSchema.optional()
11838
11820
  }).passthrough()))();
@@ -11844,7 +11826,7 @@ const VASTTrackerAssetSchema = /* @__PURE__ */ (() => z.object({}).passthrough()
11844
11826
  location: z.object({
11845
11827
  field: z.literal("url").optional()
11846
11828
  }).passthrough().optional()
11847
- }).passthrough())).optional(),
11829
+ }).passthrough())).min(1).optional(),
11848
11830
  offset: z.string().regex(new RegExp("^(\\d{2}:[0-5]\\d:[0-5]\\d(\\.\\d{3})?|(100|\\d{1,2})%)$")).optional(),
11849
11831
  target: z.union([z.literal("linear"), z.literal("non_linear"), z.literal("companion")]).optional(),
11850
11832
  provenance: ProvenanceSchema.optional()
@@ -11857,7 +11839,7 @@ const DAASTTrackerAssetSchema = /* @__PURE__ */ (() => z.object({}).passthrough(
11857
11839
  location: z.object({
11858
11840
  field: z.literal("url").optional()
11859
11841
  }).passthrough().optional()
11860
- }).passthrough())).optional(),
11842
+ }).passthrough())).min(1).optional(),
11861
11843
  offset: z.string().regex(new RegExp("^(\\d{2}:[0-5]\\d:[0-5]\\d(\\.\\d{3})?|(100|\\d{1,2})%)$")).optional(),
11862
11844
  target: z.union([z.literal("linear"), z.literal("companion")]).optional(),
11863
11845
  provenance: ProvenanceSchema.optional()
@@ -11907,8 +11889,8 @@ const ProductFormatDeclarationSchema = /* @__PURE__ */ (() => z.object({}).passt
11907
11889
  format_shape: z.string().optional(),
11908
11890
  v1_format_ref: z.array(FormatReferenceStructuredObjectSchema).optional(),
11909
11891
  format_schema: PlatformExtensionReferenceSchema.optional()
11910
- }).passthrough()).and(z.union([ImageFormatDeclarationSchema, HTML5FormatDeclarationSchema, DisplayTagFormatDeclarationSchema, ImageCarouselFormatDeclarationSchema, HostedVideoFormatDeclarationSchema, VASTVideoFormatDeclarationSchema, HostedAudioFormatDeclarationSchema, VASTAudioFormatDeclarationSchema, DAASTAudioFormatDeclarationSchema, SponsoredPlacementFormatDeclarationSchema, NativeInFeedFormatDeclarationSchema, ResponsiveCreativeFormatDeclarationSchema, AgentPlacementFormatDeclarationSchema, SellerRenderedStatefulDisplayFormatDeclarationSchema, CoordinatedPlacementsFormatDeclarationSchema, CustomFormatDeclarationSchema])))();
11911
- const PlacementSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({}).passthrough()).merge(z.object({}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()])).and(z.object({
11892
+ }).passthrough()).describe("Common constraints for every product format.").and(z.union([ImageFormatDeclarationSchema, HTML5FormatDeclarationSchema, DisplayTagFormatDeclarationSchema, ImageCarouselFormatDeclarationSchema, HostedVideoFormatDeclarationSchema, VASTVideoFormatDeclarationSchema, HostedAudioFormatDeclarationSchema, VASTAudioFormatDeclarationSchema, DAASTAudioFormatDeclarationSchema, SponsoredPlacementFormatDeclarationSchema, NativeInFeedFormatDeclarationSchema, ResponsiveCreativeFormatDeclarationSchema, AgentPlacementFormatDeclarationSchema, SellerRenderedStatefulDisplayFormatDeclarationSchema, CoordinatedPlacementsFormatDeclarationSchema, CustomFormatDeclarationSchema]).describe("Must also satisfy at least one of these alternatives.")))();
11893
+ const PlacementSchema = /* @__PURE__ */ (() => z.object({}).passthrough().merge(z.object({}).passthrough()).merge(z.object({}).passthrough()).and(z.union([z.object({}).passthrough(), z.object({}).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.object({
11912
11894
  kind: z.union([z.literal("publisher_ref"), z.literal("seller_inline")]),
11913
11895
  placement_id: z.string(),
11914
11896
  publisher_domain: z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).optional(),
@@ -12087,7 +12069,7 @@ const GetCreativeFeaturesResponseSchema = /* @__PURE__ */ (() => z.object({
12087
12069
  payload: z.object({}).passthrough().optional(),
12088
12070
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
12089
12071
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
12090
- }).passthrough().and(z.union([GetCreativeFeaturesSuccessSchema, GetCreativeFeaturesErrorSchema, GetCreativeFeaturesSubmittedSchema])))();
12072
+ }).passthrough().and(z.union([GetCreativeFeaturesSuccessSchema, GetCreativeFeaturesErrorSchema, GetCreativeFeaturesSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
12091
12073
  const SyncCatalogsResponseSchema = /* @__PURE__ */ (() => z.object({
12092
12074
  context_id: z.string().optional(),
12093
12075
  context: ContextObjectSchema.optional(),
@@ -12102,7 +12084,7 @@ const SyncCatalogsResponseSchema = /* @__PURE__ */ (() => z.object({
12102
12084
  payload: z.object({}).passthrough().optional(),
12103
12085
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
12104
12086
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
12105
- }).passthrough().and(z.union([SyncCatalogsSuccessSchema, SyncCatalogsErrorSchema, SyncCatalogsSubmittedSchema])))();
12087
+ }).passthrough().and(z.union([SyncCatalogsSuccessSchema, SyncCatalogsErrorSchema, SyncCatalogsSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
12106
12088
  const ProductSchema = /* @__PURE__ */ (() => z.object({
12107
12089
  product_id: z.string(),
12108
12090
  name: z.string(),
@@ -12281,7 +12263,7 @@ const CanonicalProductPlacementSchema = /* @__PURE__ */ (() => z.object({
12281
12263
  kind: z.literal("publisher_ref")
12282
12264
  }).passthrough(), z.object({
12283
12265
  kind: z.literal("seller_inline")
12284
- }).passthrough()])))();
12266
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
12285
12267
  const TargetingOverlaySupport1Schema = /* @__PURE__ */ (() => TargetingOverlaySupportSchema)();
12286
12268
  const CanonicalProductActionSchema = /* @__PURE__ */ (() => z.object({
12287
12269
  action: CanonicalMediaBuyActionNameSchema,
@@ -12291,9 +12273,10 @@ const CanonicalProductActionSchema = /* @__PURE__ */ (() => z.object({
12291
12273
  constraints: MediaBuyChangeTermConstraintsSchema.optional(),
12292
12274
  terms_ref: z.string().optional()
12293
12275
  }).passthrough())();
12294
- const 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]))();
12276
+ const AssetVariantSchemaOptionsSource = /* @__PURE__ */ (() => z.union([ImageAssetSchema, VideoAssetSchema, AudioAssetSchema, VASTAssetSchema, DisplayTagAssetSchema, TextAssetSchema, URLAssetSchema, HTMLAssetSchema, JavaScriptAssetSchema, ZipAssetSchema, WebhookAssetSchema, CSSAssetSchema, DAASTAssetSchema, MarkdownAssetSchema, BriefAssetSchema, CatalogAssetSchema, PublishedPostAssetSchema, CardAssetSchema, PixelTrackerAssetSchema, VASTTrackerAssetSchema, DAASTTrackerAssetSchema]))();
12277
+ const AssetVariantSchema = /* @__PURE__ */ (() => AssetVariantSchemaOptionsSource)();
12295
12278
  const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
12296
- const objectSchema = z.object({ "geo_countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_countries_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Exclude specific countries from delivery. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_regions": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Restrict delivery to exact canonical ISO 3166-2 subdivisions (states, provinces, regions, departments, or other subdivision categories). Unknown identifiers are invalid. At create or update, sellers MUST reject unsupported identifiers and MUST NOT silently widen, drop, or partially apply the list. During get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome. Exact internal translation preserves accepted identifiers in package readback.").optional(), "geo_regions_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Exclude exact canonical ISO 3166-2 subdivisions. Support is independent from geo_regions inclusion support. Unknown identifiers and values also present in geo_regions are invalid. At create or update, sellers MUST reject unsupported identifiers and partial application; during get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome.").optional(), "geo_metros": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict().describe("A targeted metro area.")).min(1).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_metros_exclude": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes to exclude within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict()).min(1).describe("Exclude specific metro areas from delivery. Each entry specifies the classification system and excluded values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })])).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Restrict delivery to specific postal areas. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas_exclude": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })])).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Exclude specific postal areas from delivery. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_places": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))])).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Restrict delivery to catalog-backed named places. Values MUST be stable identifiers in the declared system, not display names. Sellers must declare supported systems, countries, and place types in get_adcp_capabilities and reject unsupported entries rather than silently dropping them.").optional(), "geo_places_exclude": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))])).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Exclude catalog-backed named places. Uses the same identifier-based shape as geo_places. Sellers MUST reject overlap with geo_places for the same country, system, place_type, and value.").optional(), "daypart_targets": z.array(z.object({ "days": z.array(z.enum(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]).describe("Days of the week for daypart targeting")).min(1).describe("Days of week this window applies to. Use multiple days for compact targeting (e.g., monday-friday in one object)."), "start_hour": z.number().int().gte(0).lte(23).describe("Start hour (inclusive), 0-23 in 24-hour format. 0 = midnight, 6 = 6:00am, 18 = 6:00pm."), "end_hour": z.number().int().gte(1).lte(24).describe("End hour (exclusive), 1-24 in 24-hour format. 10 = 10:00am, 24 = midnight. Must be greater than start_hour."), "timezone": z.union([z.literal("inventory_local"), z.any().refine((value) => !z.literal("inventory_local").safeParse(value).success, "Invalid input: Should NOT be valid against schema").describe("Concrete timezone identifier in the implementation's supported IANA Time Zone Database, such as America/New_York, CET, or UTC.")]).describe("Civil-time clock used to evaluate this window. 'inventory_local' evaluates the hours in the seller-assigned local timezone of each inventory unit that can deliver the impression, such as a screen, venue, station, or publisher property; it never means the buyer, account, or server timezone. A concrete IANA timezone identifier (for example, 'America/New_York', 'CET', or 'UTC') evaluates one shared civil-time clock across the targeted inventory. Omission defaults to 'inventory_local'. Buyers that begin with a user or account preference MUST resolve it to a concrete IANA identifier before sending the daypart; 'user_timezone' and 'account_timezone' are not wire values. For each candidate delivery instant, convert the instant into this clock and compare its resulting local day and hour with the half-open window: a skipped DST hour has no matching instants, while both occurrences of a repeated hour match. This delivery clock is independent of reporting_capabilities.timezone.").default("inventory_local"), "label": z.string().describe("Optional human-readable name for this time window (e.g., 'Morning Drive', 'Prime Time')").optional() }).strict().describe("A time window for daypart targeting. Specifies days of week, an hour range, and the civil-time clock used to evaluate it. start_hour is inclusive, end_hour is exclusive (e.g., 6-10 = 6:00am to 10:00am). Follows the Google Ads AdScheduleInfo / DV360 DayPartTargeting pattern.")).min(1).describe("Restrict delivery to specific time windows. Each entry specifies days of week, an hour range, and an optional timezone that defaults to inventory_local. A concrete IANA zone uses one shared civil-time clock, while inventory_local evaluates each inventory unit in its seller-assigned local timezone. Entries are independent and MAY use different clocks.").optional(), "axe_include_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to include for targeting.").optional(), "axe_exclude_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to exclude from targeting.").optional(), "audience_include": z.array(z.string()).min(1).describe("Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities.").optional(), "audience_exclude": z.array(z.string()).min(1).describe("Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities.").optional(), "signal_targeting_groups": z.object({ "operator": z.literal("all").describe("Groups-level operator. Required even though v1 only supports 'all': every child group must be satisfied."), "groups": z.array(z.object({ "operator": z.enum(["any", "none"]).describe("How to evaluate the signals in this group. 'any' is an OR include group. 'none' is an exclusion group equivalent to NOT (A OR B OR C)."), "signals": z.array(z.object({ "pricing_option_id": z.string().describe("Pricing option selected for this signal. Use the pricing_option_id from the product's signal_targeting_options entry when product-scoped pricing is present; otherwise use the seller get_signals pricing only when the product option does not override it. Required when the selected signal has pricing_options; omit only when the signal is bundled into the product price or has no incremental cost.").optional(), "signal_agent_segment_id": z.string().describe("Optional opaque resolved-segment or seller execution handle for this signal. Omit when signal_ref plus the value expression is sufficient for the seller to resolve the signal. Include when the product option exposes a separate runtime or activation handle, and pass it verbatim. Buyers SHOULD prefer an exposed segment handle over reconstructing condition identity from categorical values because the handle can carry provider namespace and methodology distinctions.").optional(), "activation_key": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
12279
+ const objectSchema = z.object({ "geo_countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_countries_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Exclude specific countries from delivery. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_regions": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Restrict delivery to exact canonical ISO 3166-2 subdivisions (states, provinces, regions, departments, or other subdivision categories). Unknown identifiers are invalid. At create or update, sellers MUST reject unsupported identifiers and MUST NOT silently widen, drop, or partially apply the list. During get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome. Exact internal translation preserves accepted identifiers in package readback.").optional(), "geo_regions_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Exclude exact canonical ISO 3166-2 subdivisions. Support is independent from geo_regions inclusion support. Unknown identifiers and values also present in geo_regions are invalid. At create or update, sellers MUST reject unsupported identifiers and partial application; during get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome.").optional(), "geo_metros": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict().describe("A targeted metro area.")).min(1).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_metros_exclude": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes to exclude within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict()).min(1).describe("Exclude specific metro areas from delivery. Each entry specifies the classification system and excluded values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })]).describe("Must also satisfy at least one of these alternatives.")).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Restrict delivery to specific postal areas. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas_exclude": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })]).describe("Must also satisfy at least one of these alternatives.")).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Exclude specific postal areas from delivery. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_places": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Restrict delivery to catalog-backed named places. Values MUST be stable identifiers in the declared system, not display names. Sellers must declare supported systems, countries, and place types in get_adcp_capabilities and reject unsupported entries rather than silently dropping them.").optional(), "geo_places_exclude": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Exclude catalog-backed named places. Uses the same identifier-based shape as geo_places. Sellers MUST reject overlap with geo_places for the same country, system, place_type, and value.").optional(), "daypart_targets": z.array(z.object({ "days": z.array(z.enum(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]).describe("Days of the week for daypart targeting")).min(1).describe("Days of week this window applies to. Use multiple days for compact targeting (e.g., monday-friday in one object)."), "start_hour": z.number().int().gte(0).lte(23).describe("Start hour (inclusive), 0-23 in 24-hour format. 0 = midnight, 6 = 6:00am, 18 = 6:00pm."), "end_hour": z.number().int().gte(1).lte(24).describe("End hour (exclusive), 1-24 in 24-hour format. 10 = 10:00am, 24 = midnight. Must be greater than start_hour."), "timezone": z.union([z.literal("inventory_local"), z.any().refine((value) => !z.literal("inventory_local").safeParse(value).success, "Invalid input: Should NOT be valid against schema").describe("Concrete timezone identifier in the implementation's supported IANA Time Zone Database, such as America/New_York, CET, or UTC.")]).describe("Civil-time clock used to evaluate this window. 'inventory_local' evaluates the hours in the seller-assigned local timezone of each inventory unit that can deliver the impression, such as a screen, venue, station, or publisher property; it never means the buyer, account, or server timezone. A concrete IANA timezone identifier (for example, 'America/New_York', 'CET', or 'UTC') evaluates one shared civil-time clock across the targeted inventory. Omission defaults to 'inventory_local'. Buyers that begin with a user or account preference MUST resolve it to a concrete IANA identifier before sending the daypart; 'user_timezone' and 'account_timezone' are not wire values. For each candidate delivery instant, convert the instant into this clock and compare its resulting local day and hour with the half-open window: a skipped DST hour has no matching instants, while both occurrences of a repeated hour match. This delivery clock is independent of reporting_capabilities.timezone.").default("inventory_local"), "label": z.string().describe("Optional human-readable name for this time window (e.g., 'Morning Drive', 'Prime Time')").optional() }).strict().describe("A time window for daypart targeting. Specifies days of week, an hour range, and the civil-time clock used to evaluate it. start_hour is inclusive, end_hour is exclusive (e.g., 6-10 = 6:00am to 10:00am). Follows the Google Ads AdScheduleInfo / DV360 DayPartTargeting pattern.")).min(1).describe("Restrict delivery to specific time windows. Each entry specifies days of week, an hour range, and an optional timezone that defaults to inventory_local. A concrete IANA zone uses one shared civil-time clock, while inventory_local evaluates each inventory unit in its seller-assigned local timezone. Entries are independent and MAY use different clocks.").optional(), "axe_include_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to include for targeting.").optional(), "axe_exclude_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to exclude from targeting.").optional(), "audience_include": z.array(z.string()).min(1).describe("Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities.").optional(), "audience_exclude": z.array(z.string()).min(1).describe("Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities.").optional(), "signal_targeting_groups": z.object({ "operator": z.literal("all").describe("Groups-level operator. Required even though v1 only supports 'all': every child group must be satisfied."), "groups": z.array(z.object({ "operator": z.enum(["any", "none"]).describe("How to evaluate the signals in this group. 'any' is an OR include group. 'none' is an exclusion group equivalent to NOT (A OR B OR C)."), "signals": z.array(z.object({ "pricing_option_id": z.string().describe("Pricing option selected for this signal. Use the pricing_option_id from the product's signal_targeting_options entry when product-scoped pricing is present; otherwise use the seller get_signals pricing only when the product option does not override it. Required when the selected signal has pricing_options; omit only when the signal is bundled into the product price or has no incremental cost.").optional(), "signal_agent_segment_id": z.string().describe("Optional opaque resolved-segment or seller execution handle for this signal. Omit when signal_ref plus the value expression is sufficient for the seller to resolve the signal. Include when the product option exposes a separate runtime or activation handle, and pass it verbatim. Buyers SHOULD prefer an exposed segment handle over reconstructing condition identity from categorical values because the handle can carry provider namespace and methodology distinctions.").optional(), "activation_key": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
12297
12280
  const schemas = [z.object({ "type": z.literal("segment_id").describe("Segment ID based targeting"), "segment_id": z.string().describe("The platform-specific segment identifier to use in campaign targeting") }).catchall(z.any()), z.object({ "type": z.literal("key_value").describe("Key-value pair based targeting"), "key": z.string().describe("The targeting parameter key"), "value": z.string().describe("The targeting parameter value") }).catchall(z.any())];
12298
12281
  const { errors, failed } = schemas.reduce(
12299
12282
  ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
@@ -12394,7 +12377,7 @@ const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
12394
12377
  message: "Invalid input: Should pass single schema. Passed " + passed2
12395
12378
  });
12396
12379
  }
12397
- }).describe("Named signal being targeted."), "value_type": z.literal("numeric").describe("Discriminator for numeric signals."), "min_value": z.number().describe("Minimum value, inclusive. Omit for no minimum. Should be within the signal definition's range when declared.").optional(), "max_value": z.number().describe("Maximum value, inclusive. Omit for no maximum. Should be within the signal definition's range when declared.").optional() }).catchall(z.any()).and(z.union([z.object({ "min_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Numeric signal expression - target users within a value range. At least one of min_value or max_value is required. If both min_value and max_value are provided, min_value MUST be <= max_value.")];
12380
+ }).describe("Named signal being targeted."), "value_type": z.literal("numeric").describe("Discriminator for numeric signals."), "min_value": z.number().describe("Minimum value, inclusive. Omit for no minimum. Should be within the signal definition's range when declared.").optional(), "max_value": z.number().describe("Maximum value, inclusive. Omit for no maximum. Should be within the signal definition's range when declared.").optional() }).catchall(z.any()).and(z.union([z.object({ "min_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Numeric signal expression - target users within a value range. At least one of min_value or max_value is required. If both min_value and max_value are provided, min_value MUST be <= max_value.")];
12398
12381
  const { errors, failed } = schemas.reduce(
12399
12382
  ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
12400
12383
  errors: [...errors2, ...result.error.issues],
@@ -12469,7 +12452,7 @@ const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
12469
12452
  message: "Invalid input: Should pass single schema. Passed " + passed2
12470
12453
  });
12471
12454
  }
12472
- }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("binary").describe("Discriminator for binary signals"), "value": z.boolean().describe("Whether to include (true) or exclude (false) users matching this signal") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Binary signal targeting - user either matches or doesn't"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
12455
+ }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("binary").describe("Discriminator for binary signals"), "value": z.boolean().describe("Whether to include (true) or exclude (false) users matching this signal") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Binary signal targeting - user either matches or doesn't"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
12473
12456
  const schemas2 = [z.object({ "scope": z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Product-local signal identifier. For local signals exposed on both get_signals and get_products, this MUST match get_signals.signals[].signal_ref.signal_id for the same signal.") }).catchall(z.any()).describe("Product-scoped signal. The signal_id is meaningful only within the selected product/package context and MUST match a Product.included_signals[].signal_ref.signal_id or Product.signal_targeting_options[].signal_ref.signal_id for that product, depending on whether the signal is descriptive or selectable."), z.object({ "scope": z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that publishes the signal definition in its adagents.json signals[]."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(z.any()).describe("Data-provider-scoped signal. The signal_id resolves through the data provider's published adagents.json signals[] and can be authorization-verified there."), z.object({ "scope": z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(z.any()).describe("Signal-source-scoped signal. Use this for source-native signals that are not published in upstream adagents.json signals[]. The buyer trusts the issuing signal source for this identity; use scope 'data_provider' instead when the signal is published in adagents.json signals[], even if the publisher is also the seller or signal source.")];
12474
12457
  const { errors: errors2, failed: failed2 } = schemas2.reduce(
12475
12458
  ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
@@ -12519,7 +12502,7 @@ const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
12519
12502
  message: "Invalid input: Should pass single schema. Passed " + passed2
12520
12503
  });
12521
12504
  }
12522
- }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("categorical").describe("Discriminator for categorical signals"), "values": z.array(z.string()).min(1).describe("Values to target. Users with any of these values will be included.") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Categorical signal targeting - target users with specific values"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
12505
+ }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("categorical").describe("Discriminator for categorical signals"), "values": z.array(z.string()).min(1).describe("Values to target. Users with any of these values will be included.") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Categorical signal targeting - target users with specific values"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
12523
12506
  const schemas2 = [z.object({ "scope": z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Product-local signal identifier. For local signals exposed on both get_signals and get_products, this MUST match get_signals.signals[].signal_ref.signal_id for the same signal.") }).catchall(z.any()).describe("Product-scoped signal. The signal_id is meaningful only within the selected product/package context and MUST match a Product.included_signals[].signal_ref.signal_id or Product.signal_targeting_options[].signal_ref.signal_id for that product, depending on whether the signal is descriptive or selectable."), z.object({ "scope": z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that publishes the signal definition in its adagents.json signals[]."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(z.any()).describe("Data-provider-scoped signal. The signal_id resolves through the data provider's published adagents.json signals[] and can be authorization-verified there."), z.object({ "scope": z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(z.any()).describe("Signal-source-scoped signal. Use this for source-native signals that are not published in upstream adagents.json signals[]. The buyer trusts the issuing signal source for this identity; use scope 'data_provider' instead when the signal is published in adagents.json signals[], even if the publisher is also the seller or signal source.")];
12524
12507
  const { errors: errors2, failed: failed2 } = schemas2.reduce(
12525
12508
  ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
@@ -12569,7 +12552,7 @@ const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
12569
12552
  message: "Invalid input: Should pass single schema. Passed " + passed2
12570
12553
  });
12571
12554
  }
12572
- }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("numeric").describe("Discriminator for numeric signals"), "min_value": z.number().describe("Minimum value (inclusive). Omit for no minimum. Must be <= max_value when both are provided. Should be >= signal's range.min if defined.").optional(), "max_value": z.number().describe("Maximum value (inclusive). Omit for no maximum. Must be >= min_value when both are provided. Should be <= signal's range.max if defined.").optional() }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Numeric signal targeting - target users within a value range. If min_value is provided, it must be <= max_value. Values should be within the signal's defined range (see signal definition).")];
12555
+ }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("numeric").describe("Discriminator for numeric signals"), "min_value": z.number().describe("Minimum value (inclusive). Omit for no minimum. Must be <= max_value when both are provided. Should be >= signal's range.min if defined.").optional(), "max_value": z.number().describe("Maximum value (inclusive). Omit for no maximum. Must be >= min_value when both are provided. Should be <= signal's range.max if defined.").optional() }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Numeric signal targeting - target users within a value range. If min_value is provided, it must be <= max_value. Values should be within the signal's defined range (see signal definition).")];
12573
12556
  const { errors, failed } = schemas.reduce(
12574
12557
  ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
12575
12558
  errors: [...errors2, ...result.error.issues],
@@ -12593,7 +12576,7 @@ const TargetingOverlaySchema = /* @__PURE__ */ (() => (() => {
12593
12576
  message: "Invalid input: Should pass single schema. Passed " + passed
12594
12577
  });
12595
12578
  }
12596
- }).describe("Targeting constraint for a specific signal. Uses value_type as discriminator to determine the targeting expression format.")).min(1).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.").optional(), "demographics": z.object({ "age": z.intersection(z.object({ "min": z.number().int().gte(0).lte(150).describe("Inclusive minimum age in completed years. Omit for an open lower bound.").optional(), "max": z.number().int().gte(0).lte(150).describe("Inclusive maximum age in completed years. Omit for an open upper bound.").optional(), "include_unknown": z.boolean().describe("Whether delivery to people whose age is unavailable is part of this predicate. This field has no default and MUST be supplied.") }).catchall(z.any()).and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A canonical audience-age predicate in completed integer years. min and max are inclusive; omitting one bound means no restriction in that direction. At least one bound is required. include_unknown is always explicit because people whose age is unavailable are not members of any numeric interval. Implementations MUST reject min greater than max; JSON Schema draft-07 cannot compare sibling numeric values."), z.object({ "accepted_bases": z.array(z.enum(["verified", "declared", "inferred"]).describe("User-level bases that may resolve age for demographic targeting execution. Population estimates are deliberately absent because aggregate composition cannot establish an individual impression's age.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("User-level age determination bases the buyer permits for this predicate. Sellers MUST use only these bases or reject the request; they MUST NOT silently fall back to another basis. When omitted, the buyer imposes no determination-basis constraint beyond product capability and any age_restriction. population_estimate is structurally unavailable because aggregate evidence cannot identify an eligible user.").optional(), "accepted_verification_methods": z.array(z.enum(["facial_age_estimation", "id_document", "digital_id", "credit_card", "world_id"]).describe("Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Verification methods acceptable when verified is an accepted basis. This field narrows verified demographic execution; age_restriction.accepted_methods independently governs legal eligibility and the two sets are intersected when both are present.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "accepted_verification_methods": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "accepted_verification_methods": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "accepted_bases": z.any().refine((value) => !z.array(z.any().refine((value2) => !z.literal("verified").safeParse(value2).success, "Invalid input: Should NOT be valid against schema")).safeParse(value).success, "Invalid input: Should NOT be valid against schema") }))]))) }).catchall(z.any()).describe("Canonical demographic audience targeting intent with optional constraints on how age may be determined. This is distinct from age_restriction: demographics selects an audience, while age_restriction expresses a legal eligibility or verification floor. Fresh create/update targeting MUST compile exactly or be rejected. During get_products, a seller may offer a different configured predicate only through sparse targeting_resolution modifications on a distinguishable product_id; selecting that product accepts the alternative. Sellers never silently broaden, narrow, default, drop, or substitute the basis.").optional(), "frequency_cap": z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2.").optional(), "property_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list for targeting specific properties within this product. The package runs on the intersection of the product's publisher_properties and this list. Sellers SHOULD return a validation error if the product has property_targeting_allowed: false.").optional(), "property_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list whose properties must not carry the buyer's ads. Matched properties are removed from delivery. Use for brand-safety do-not-run lists (apps, sites). Exclude wins on overlap with property_list, and applies regardless of the product's property_targeting_allowed flag. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for including specific collections (programs, publications, channels) within this product. The package runs on the intersection of matched collections and this list. Use for inclusion-based collection targeting. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for excluding specific collections (programs, publications, channels) from this product. Matched collections must not carry the buyer's ads. Use for brand safety do-not-air lists. Seller must declare support in get_adcp_capabilities.").optional(), "placement_selection": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
12579
+ }).describe("Targeting constraint for a specific signal. Uses value_type as discriminator to determine the targeting expression format.")).min(1).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.").optional(), "demographics": z.object({ "age": z.intersection(z.object({ "min": z.number().int().gte(0).lte(150).describe("Inclusive minimum age in completed years. Omit for an open lower bound.").optional(), "max": z.number().int().gte(0).lte(150).describe("Inclusive maximum age in completed years. Omit for an open upper bound.").optional(), "include_unknown": z.boolean().describe("Whether delivery to people whose age is unavailable is part of this predicate. This field has no default and MUST be supplied.") }).catchall(z.any()).and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A canonical audience-age predicate in completed integer years. min and max are inclusive; omitting one bound means no restriction in that direction. At least one bound is required. include_unknown is always explicit because people whose age is unavailable are not members of any numeric interval. Implementations MUST reject min greater than max; JSON Schema draft-07 cannot compare sibling numeric values."), z.object({ "accepted_bases": z.array(z.enum(["verified", "declared", "inferred"]).describe("User-level bases that may resolve age for demographic targeting execution. Population estimates are deliberately absent because aggregate composition cannot establish an individual impression's age.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("User-level age determination bases the buyer permits for this predicate. Sellers MUST use only these bases or reject the request; they MUST NOT silently fall back to another basis. When omitted, the buyer imposes no determination-basis constraint beyond product capability and any age_restriction. population_estimate is structurally unavailable because aggregate evidence cannot identify an eligible user.").optional(), "accepted_verification_methods": z.array(z.enum(["facial_age_estimation", "id_document", "digital_id", "credit_card", "world_id"]).describe("Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Verification methods acceptable when verified is an accepted basis. This field narrows verified demographic execution; age_restriction.accepted_methods independently governs legal eligibility and the two sets are intersected when both are present.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "accepted_verification_methods": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "accepted_verification_methods": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "accepted_bases": z.any().refine((value) => !z.array(z.any().refine((value2) => !z.literal("verified").safeParse(value2).success, "Invalid input: Should NOT be valid against schema")).safeParse(value).success, "Invalid input: Should NOT be valid against schema") }))]).describe("Must also satisfy at least one of these alternatives."))) }).catchall(z.any()).describe("Canonical demographic audience targeting intent with optional constraints on how age may be determined. This is distinct from age_restriction: demographics selects an audience, while age_restriction expresses a legal eligibility or verification floor. Fresh create/update targeting MUST compile exactly or be rejected. During get_products, a seller may offer a different configured predicate only through sparse targeting_resolution modifications on a distinguishable product_id; selecting that product accepts the alternative. Sellers never silently broaden, narrow, default, drop, or substitute the basis.").optional(), "frequency_cap": z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2.").optional(), "property_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list for targeting specific properties within this product. The package runs on the intersection of the product's publisher_properties and this list. Sellers SHOULD return a validation error if the product has property_targeting_allowed: false.").optional(), "property_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list whose properties must not carry the buyer's ads. Matched properties are removed from delivery. Use for brand-safety do-not-run lists (apps, sites). Exclude wins on overlap with property_list, and applies regardless of the product's property_targeting_allowed flag. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for including specific collections (programs, publications, channels) within this product. The package runs on the intersection of matched collections and this list. Use for inclusion-based collection targeting. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for excluding specific collections (programs, publications, channels) from this product. Matched collections must not carry the buyer's ads. Use for brand safety do-not-air lists. Seller must declare support in get_adcp_capabilities.").optional(), "placement_selection": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
12597
12580
  const schemas = [z.object({ "mode": z.literal("selected"), "placement_refs": z.array(z.union([z.intersection(z.object({ "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring a publisher-catalog placement is hosted, or the inventory publisher associated with an inline placement. Omitted only for legacy single-publisher product-context references.").optional(), "placement_id": z.string().describe("Placement ID from the publisher's adagents.json placement catalog, or an inline seller-defined placement ID interpreted within the enclosing seller and product context.") }).catchall(z.any()).describe("Legacy-compatible product-context reference to a placement. For publisher-catalog placements, publisher_domain plus placement_id resolves the declaration in that publisher's adagents.json. For seller-inline placements, the enclosing seller and product supply scope. When publisher_domain is omitted on legacy inputs, receivers MAY interpret the ID relative to the enclosing single-publisher product. Use placement-identity.json when a self-contained cross-document identity is required."), z.object({ "publisher_domain": z.any().refine((value) => value !== void 0, "Required") }).passthrough()), z.any().superRefine((x2, ctx2) => {
12598
12581
  const schemas2 = [z.object({ "kind": z.literal("publisher_ref"), "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain whose adagents.json declares placement_id."), "placement_id": z.string().min(1) }).strict(), z.object({ "kind": z.literal("seller_inline"), "seller_agent": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("The seller agent's API endpoint URL as declared in the property publisher's adagents.json `authorized_agents[].url`. MUST use the `https://` scheme. Receivers compare this URL against the `authorized_agents` list using the AdCP URL canonicalization rules \u2014 not byte-equality \u2014 and reject mismatches with `seller_not_authorized`. See docs/reference/url-canonicalization."), "id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).min(1).describe("Reserved for a future registry-assigned stable seller identifier. Not used today \u2014 senders MUST NOT populate this field until a registry is defined. When a future release populates both `agent_url` and `id`, `agent_url` remains authoritative and `id` is advisory.").optional() }).strict().describe("Sales agent that defines and maintains the inline placement namespace."), "placement_id": z.string().min(1).describe("Stable placement ID within the defining sales agent's namespace. The agent MUST NOT reuse it for a different semantic placement.") }).strict()];
12599
12582
  const { errors: errors2, failed: failed2 } = schemas2.reduce(
@@ -12817,7 +12800,7 @@ const CreativeManifestSchema = /* @__PURE__ */ (() => z.object({}).passthrough()
12817
12800
  const BuildCreativeMultiSuccessSchema = /* @__PURE__ */ (() => z.object({
12818
12801
  creative_manifests: z.array(CreativeManifestSchema),
12819
12802
  sandbox: z.boolean().optional(),
12820
- expires_at: z.iso.datetime().optional(),
12803
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
12821
12804
  preview: z.object({
12822
12805
  previews: z.array(z.object({
12823
12806
  preview_id: z.string(),
@@ -12831,7 +12814,7 @@ const BuildCreativeMultiSuccessSchema = /* @__PURE__ */ (() => z.object({
12831
12814
  }).passthrough()
12832
12815
  }).passthrough()),
12833
12816
  interactive_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
12834
- expires_at: z.iso.datetime()
12817
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
12835
12818
  }).passthrough().optional(),
12836
12819
  preview_error: ErrorSchema.optional(),
12837
12820
  pricing_option_id: z.string().optional(),
@@ -12882,7 +12865,7 @@ const BuildCreativeVariantSuccessSchema = /* @__PURE__ */ (() => z.object({
12882
12865
  budget_status: z.union([z.literal("complete"), z.literal("capped")]).optional(),
12883
12866
  errors: z.array(ErrorSchema).optional(),
12884
12867
  sandbox: z.boolean().optional(),
12885
- expires_at: z.iso.datetime().optional(),
12868
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
12886
12869
  context: ContextObjectSchema.optional(),
12887
12870
  ext: ExtensionObjectSchema.optional()
12888
12871
  }).passthrough())();
@@ -12895,13 +12878,13 @@ const PreviewCreativeVariantResponseSchema = /* @__PURE__ */ (() => z.object({
12895
12878
  renders: z.array(PreviewRenderSchema)
12896
12879
  }).passthrough()),
12897
12880
  manifest: CreativeManifestSchema.optional(),
12898
- expires_at: z.iso.datetime().optional(),
12881
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
12899
12882
  context: ContextObjectSchema.optional(),
12900
12883
  ext: ExtensionObjectSchema.optional()
12901
12884
  }).passthrough())();
12902
12885
  const AAODirectoryAgentPublishersInverseLookupResponseSchema = /* @__PURE__ */ (() => z.object({
12903
12886
  agent_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI"),
12904
- directory_indexed_at: z.iso.datetime().nullable(),
12887
+ directory_indexed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").nullable(),
12905
12888
  publishers: z.array(PublisherEntrySchema),
12906
12889
  next_cursor: z.string().optional().nullable()
12907
12890
  }).passthrough())();
@@ -12936,7 +12919,7 @@ const CreativeApprovalResponseSchema = /* @__PURE__ */ (() => z.object({
12936
12919
  payload: z.object({}).passthrough().optional(),
12937
12920
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
12938
12921
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
12939
- }).passthrough().and(z.union([CreativeApprovedSchema, CreativeRejectedSchema, CreativePendingReviewSchema, CreativeApprovalErrorSchema])))();
12922
+ }).passthrough().and(z.union([CreativeApprovedSchema, CreativeRejectedSchema, CreativePendingReviewSchema, CreativeApprovalErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
12940
12923
  const GetBrandIdentityResponseSchema = /* @__PURE__ */ (() => z.object({
12941
12924
  context_id: z.string().optional(),
12942
12925
  context: ContextObjectSchema.optional(),
@@ -12951,7 +12934,7 @@ const GetBrandIdentityResponseSchema = /* @__PURE__ */ (() => z.object({
12951
12934
  payload: z.object({}).passthrough().optional(),
12952
12935
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
12953
12936
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
12954
- }).passthrough().and(z.union([GetBrandIdentitySuccessSchema, GetBrandIdentityErrorSchema])))();
12937
+ }).passthrough().and(z.union([GetBrandIdentitySuccessSchema, GetBrandIdentityErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
12955
12938
  const GetRightsSuccessSchema = /* @__PURE__ */ (() => z.object({
12956
12939
  rights: z.array(z.object({
12957
12940
  rights_id: z.string(),
@@ -12996,7 +12979,7 @@ const UpdateRightsSuccessSchema = /* @__PURE__ */ (() => z.object({
12996
12979
  generation_credentials: z.array(GenerationCredentialSchema),
12997
12980
  rights_constraint: RightsConstraintSchema.and(z.object({}).passthrough()),
12998
12981
  paused: z.boolean().optional(),
12999
- implementation_date: z.iso.datetime().optional().nullable(),
12982
+ implementation_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
13000
12983
  context: ContextObjectSchema.optional(),
13001
12984
  ext: ExtensionObjectSchema.optional()
13002
12985
  }).passthrough())();
@@ -13055,10 +13038,10 @@ const ArtifactWebhookPayloadSchema = /* @__PURE__ */ (() => z.object({
13055
13038
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
13056
13039
  media_buy_id: z.string(),
13057
13040
  batch_id: z.string(),
13058
- timestamp: z.iso.datetime(),
13041
+ timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
13059
13042
  artifacts: z.array(z.object({
13060
13043
  artifact: ArtifactSchema,
13061
- delivered_at: z.iso.datetime(),
13044
+ delivered_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
13062
13045
  impression_id: z.string().optional(),
13063
13046
  package_id: z.string().optional()
13064
13047
  }).passthrough()),
@@ -13236,8 +13219,8 @@ const FlightItemSchema = /* @__PURE__ */ (() => z.object({
13236
13219
  airline: z.string().optional(),
13237
13220
  price: PriceSchema.optional(),
13238
13221
  description: z.string().optional(),
13239
- departure_time: z.iso.datetime().optional(),
13240
- arrival_time: z.iso.datetime().optional(),
13222
+ departure_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
13223
+ arrival_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
13241
13224
  image_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
13242
13225
  url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
13243
13226
  tags: z.array(z.string()).optional(),
@@ -13336,7 +13319,7 @@ const HotelItemSchema = /* @__PURE__ */ (() => z.object({
13336
13319
  const IndicatorBearingResourceStateSchema = /* @__PURE__ */ (() => z.object({
13337
13320
  indicators: z.array(IndicatorSchema).optional(),
13338
13321
  indicator_types_evaluated: z.array(IndicatorTypeSchema).optional(),
13339
- indicators_as_of: z.iso.datetime().optional(),
13322
+ indicators_as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
13340
13323
  indicators_evaluated_scope: z.array(IndicatorScopeSchema).optional()
13341
13324
  }).passthrough())();
13342
13325
  const InstallmentDeliveryMetricsSchema = /* @__PURE__ */ (() => DeliveryMetricsSchema.merge(z.object({
@@ -13385,8 +13368,8 @@ const OfferingSchema = /* @__PURE__ */ (() => z.object({
13385
13368
  name: z.string(),
13386
13369
  description: z.string().optional(),
13387
13370
  tagline: z.string().optional(),
13388
- valid_from: z.iso.datetime().optional(),
13389
- valid_to: z.iso.datetime().optional(),
13371
+ valid_from: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
13372
+ valid_to: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
13390
13373
  checkout_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
13391
13374
  landing_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
13392
13375
  assets: z.array(OfferingAssetGroupSchema).optional(),
@@ -13423,7 +13406,7 @@ const InlineDeclarationSchema = /* @__PURE__ */ (() => z.object({}).passthrough(
13423
13406
  format_shape: z.string().optional(),
13424
13407
  v1_format_ref: z.array(FormatReferenceStructuredObjectSchema).optional(),
13425
13408
  format_schema: PlatformExtensionReferenceSchema.optional()
13426
- }).passthrough()).and(z.union([ImageFormatDeclarationSchema, HTML5FormatDeclarationSchema, DisplayTagFormatDeclarationSchema, ImageCarouselFormatDeclarationSchema, HostedVideoFormatDeclarationSchema, VASTVideoFormatDeclarationSchema, HostedAudioFormatDeclarationSchema, VASTAudioFormatDeclarationSchema, DAASTAudioFormatDeclarationSchema, SponsoredPlacementFormatDeclarationSchema, NativeInFeedFormatDeclarationSchema, ResponsiveCreativeFormatDeclarationSchema, AgentPlacementFormatDeclarationSchema, SellerRenderedStatefulDisplayFormatDeclarationSchema, CoordinatedPlacementsFormatDeclarationSchema, CustomFormatDeclarationSchema])))();
13409
+ }).passthrough()).and(z.union([ImageFormatDeclarationSchema, HTML5FormatDeclarationSchema, DisplayTagFormatDeclarationSchema, ImageCarouselFormatDeclarationSchema, HostedVideoFormatDeclarationSchema, VASTVideoFormatDeclarationSchema, HostedAudioFormatDeclarationSchema, VASTAudioFormatDeclarationSchema, DAASTAudioFormatDeclarationSchema, SponsoredPlacementFormatDeclarationSchema, NativeInFeedFormatDeclarationSchema, ResponsiveCreativeFormatDeclarationSchema, AgentPlacementFormatDeclarationSchema, SellerRenderedStatefulDisplayFormatDeclarationSchema, CoordinatedPlacementsFormatDeclarationSchema, CustomFormatDeclarationSchema]).describe("Must also satisfy at least one of these alternatives.")))();
13427
13410
  const PublisherDOOHPlacementAttributesSchema = /* @__PURE__ */ (() => z.object({
13428
13411
  slot_duration_seconds: z.int().min(1).optional(),
13429
13412
  loop_duration_seconds: z.int().min(1).optional(),
@@ -13647,14 +13630,14 @@ const AuthorizationPayloadSchema = /* @__PURE__ */ (() => z.object({
13647
13630
  delegation_type: z.union([z.literal("direct"), z.literal("delegated"), z.literal("ad_network")]).optional(),
13648
13631
  exclusive: z.boolean().optional(),
13649
13632
  signing_keys: z.array(AgentSigningKeySchema).optional(),
13650
- effective_from: z.iso.datetime().optional(),
13651
- effective_until: z.iso.datetime().optional(),
13633
+ effective_from: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
13634
+ effective_until: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
13652
13635
  evidence: z.union([z.literal("adagents_json"), z.literal("agent_claim"), z.literal("community"), z.literal("override")]).optional(),
13653
13636
  disputed: z.boolean().optional(),
13654
13637
  created_by: z.string().optional().nullable(),
13655
- expires_at: z.iso.datetime().optional().nullable(),
13656
- created_at: z.iso.datetime().optional().nullable(),
13657
- updated_at: z.iso.datetime().optional().nullable(),
13638
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
13639
+ created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
13640
+ updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
13658
13641
  override_applied: z.boolean().optional(),
13659
13642
  override_reason: z.string().optional().nullable()
13660
13643
  }).passthrough())();
@@ -13665,7 +13648,7 @@ const RegistryEventSchema = /* @__PURE__ */ (() => z.object({
13665
13648
  entity_id: z.string(),
13666
13649
  payload: z.object({}).passthrough(),
13667
13650
  actor: z.string(),
13668
- created_at: z.iso.datetime()
13651
+ created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
13669
13652
  }).passthrough().and(z.union([z.object({
13670
13653
  event_type: z.literal("property.created"),
13671
13654
  entity_type: z.literal("property").optional(),
@@ -13687,14 +13670,14 @@ const RegistryEventSchema = /* @__PURE__ */ (() => z.object({
13687
13670
  entity_type: z.literal("property").optional(),
13688
13671
  payload: z.object({
13689
13672
  property_rid: z.uuid(),
13690
- last_resolved_at: z.iso.datetime().optional(),
13673
+ last_resolved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
13691
13674
  reason: z.string().optional()
13692
13675
  }).passthrough().optional()
13693
13676
  }).passthrough(), z.object({
13694
13677
  event_type: z.literal("property.reactivated"),
13695
13678
  entity_type: z.literal("property").optional(),
13696
13679
  payload: PropertyPayloadSchema.merge(z.object({
13697
- reactivated_at: z.iso.datetime().optional()
13680
+ reactivated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
13698
13681
  }).passthrough()).optional()
13699
13682
  }).passthrough(), z.object({
13700
13683
  event_type: z.literal("collection.created"),
@@ -13785,7 +13768,7 @@ const RegistryEventSchema = /* @__PURE__ */ (() => z.object({
13785
13768
  event_type: z.literal("authorization.modified"),
13786
13769
  entity_type: z.literal("authorization").optional(),
13787
13770
  payload: AuthorizationPayloadSchema.optional()
13788
- }).passthrough()])))();
13771
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
13789
13772
  const ReportingCanonicalizationContractSchema = /* @__PURE__ */ (() => z.object({
13790
13773
  contract_version: z.literal("1.0"),
13791
13774
  media_type: z.literal("application/vnd.adcp.reporting-canonicalization+json"),
@@ -13908,7 +13891,7 @@ const GovernanceAgentNotAcceptedDetailsSchema = /* @__PURE__ */ (() => z.union([
13908
13891
  disclosure: z.literal("opaque"),
13909
13892
  rejection_ref: z.string().max(128).regex(/^[A-Za-z0-9_.:-]+$/).optional()
13910
13893
  }).passthrough()]))();
13911
- const VASTVersionMismatchDetailsSchema = /* @__PURE__ */ (() => z.union([AssetOutsideAcceptedVersionIntersectionSchema, InspectedDocumentVersionMismatchSchema, SupportedVersionsCompatibilityDetailsSchema]).and(z.object({
13894
+ const VASTVersionMismatchDetailsSchema = /* @__PURE__ */ (() => z.union([AssetOutsideAcceptedVersionIntersectionSchema, InspectedDocumentVersionMismatchSchema, SupportedVersionsCompatibilityDetailsSchema]).describe("Must also satisfy at least one of these alternatives.").and(z.object({
13912
13895
  mismatch_reason: z.union([z.literal("asset_outside_acceptance"), z.literal("document_version_mismatch")]).optional(),
13913
13896
  asset_vast_version: VASTVersionSchema.optional(),
13914
13897
  observed_document_vast_version: z.string().optional().nullable(),
@@ -13922,13 +13905,13 @@ const BoundedValueLevel_2Schema = /* @__PURE__ */ (() => z.union([BoundedScalarS
13922
13905
  const BoundedValueSchema = /* @__PURE__ */ (() => z.union([BoundedScalarSchema, z.array(BoundedValueLevel_2Schema), z.record(z.string(), BoundedValueLevel_2Schema)]))();
13923
13906
  const AcceptancePolicyCatalogSchema = /* @__PURE__ */ (() => z.object({
13924
13907
  catalog_version: z.string().min(1),
13925
- generated_at: z.iso.datetime().optional(),
13908
+ generated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
13926
13909
  profiles: z.array(AcceptancePolicyProfileSchema).optional(),
13927
13910
  registry_profiles: z.array(RegistryAcceptancePolicyProfileReferenceSchema).optional(),
13928
13911
  ext: ExtensionObjectSchema.optional()
13929
13912
  }).passthrough())();
13930
13913
  const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
13931
- const objectSchema = z.object({ "geo_countries": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE')."), z.null()]).optional(), "geo_countries_exclude": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Exclude specific countries from delivery. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE')."), z.null()]).optional(), "geo_regions": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Restrict delivery to exact canonical ISO 3166-2 subdivisions (states, provinces, regions, departments, or other subdivision categories). Unknown identifiers are invalid. At create or update, sellers MUST reject unsupported identifiers and MUST NOT silently widen, drop, or partially apply the list. During get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome. Exact internal translation preserves accepted identifiers in package readback."), z.null()]).optional(), "geo_regions_exclude": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Exclude exact canonical ISO 3166-2 subdivisions. Support is independent from geo_regions inclusion support. Unknown identifiers and values also present in geo_regions are invalid. At create or update, sellers MUST reject unsupported identifiers and partial application; during get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome."), z.null()]).optional(), "geo_metros": z.union([z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict().describe("A targeted metro area.")).min(1).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities."), z.null().describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.")]).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_metros_exclude": z.union([z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes to exclude within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict()).min(1).describe("Exclude specific metro areas from delivery. Each entry specifies the classification system and excluded values. Seller must declare supported systems in get_adcp_capabilities."), z.null()]).optional(), "geo_postal_areas": z.union([z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })])).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Restrict delivery to specific postal areas. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities."), z.null()]).optional(), "geo_postal_areas_exclude": z.union([z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })])).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Exclude specific postal areas from delivery. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities."), z.null()]).optional(), "geo_places": z.union([z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))])).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Restrict delivery to catalog-backed named places. Values MUST be stable identifiers in the declared system, not display names. Sellers must declare supported systems, countries, and place types in get_adcp_capabilities and reject unsupported entries rather than silently dropping them."), z.null()]).optional(), "geo_places_exclude": z.union([z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))])).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Exclude catalog-backed named places. Uses the same identifier-based shape as geo_places. Sellers MUST reject overlap with geo_places for the same country, system, place_type, and value."), z.null()]).optional(), "daypart_targets": z.union([z.array(z.object({ "days": z.array(z.enum(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]).describe("Days of the week for daypart targeting")).min(1).describe("Days of week this window applies to. Use multiple days for compact targeting (e.g., monday-friday in one object)."), "start_hour": z.number().int().gte(0).lte(23).describe("Start hour (inclusive), 0-23 in 24-hour format. 0 = midnight, 6 = 6:00am, 18 = 6:00pm."), "end_hour": z.number().int().gte(1).lte(24).describe("End hour (exclusive), 1-24 in 24-hour format. 10 = 10:00am, 24 = midnight. Must be greater than start_hour."), "timezone": z.union([z.literal("inventory_local"), z.any().refine((value) => !z.literal("inventory_local").safeParse(value).success, "Invalid input: Should NOT be valid against schema").describe("Concrete timezone identifier in the implementation's supported IANA Time Zone Database, such as America/New_York, CET, or UTC.")]).describe("Civil-time clock used to evaluate this window. 'inventory_local' evaluates the hours in the seller-assigned local timezone of each inventory unit that can deliver the impression, such as a screen, venue, station, or publisher property; it never means the buyer, account, or server timezone. A concrete IANA timezone identifier (for example, 'America/New_York', 'CET', or 'UTC') evaluates one shared civil-time clock across the targeted inventory. Omission defaults to 'inventory_local'. Buyers that begin with a user or account preference MUST resolve it to a concrete IANA identifier before sending the daypart; 'user_timezone' and 'account_timezone' are not wire values. For each candidate delivery instant, convert the instant into this clock and compare its resulting local day and hour with the half-open window: a skipped DST hour has no matching instants, while both occurrences of a repeated hour match. This delivery clock is independent of reporting_capabilities.timezone.").default("inventory_local"), "label": z.string().describe("Optional human-readable name for this time window (e.g., 'Morning Drive', 'Prime Time')").optional() }).strict().describe("A time window for daypart targeting. Specifies days of week, an hour range, and the civil-time clock used to evaluate it. start_hour is inclusive, end_hour is exclusive (e.g., 6-10 = 6:00am to 10:00am). Follows the Google Ads AdScheduleInfo / DV360 DayPartTargeting pattern.")).min(1).describe("Restrict delivery to specific time windows. Each entry specifies days of week, an hour range, and an optional timezone that defaults to inventory_local. A concrete IANA zone uses one shared civil-time clock, while inventory_local evaluates each inventory unit in its seller-assigned local timezone. Entries are independent and MAY use different clocks."), z.null()]).optional(), "axe_include_segment": z.union([z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to include for targeting."), z.null()]).optional(), "axe_exclude_segment": z.union([z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to exclude from targeting."), z.null()]).optional(), "audience_include": z.union([z.array(z.string()).min(1).describe("Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "audience_exclude": z.union([z.array(z.string()).min(1).describe("Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "signal_targeting_groups": z.union([z.object({ "operator": z.literal("all").describe("Groups-level operator. Required even though v1 only supports 'all': every child group must be satisfied."), "groups": z.array(z.object({ "operator": z.enum(["any", "none"]).describe("How to evaluate the signals in this group. 'any' is an OR include group. 'none' is an exclusion group equivalent to NOT (A OR B OR C)."), "signals": z.array(z.object({ "pricing_option_id": z.string().describe("Pricing option selected for this signal. Use the pricing_option_id from the product's signal_targeting_options entry when product-scoped pricing is present; otherwise use the seller get_signals pricing only when the product option does not override it. Required when the selected signal has pricing_options; omit only when the signal is bundled into the product price or has no incremental cost.").optional(), "signal_agent_segment_id": z.string().describe("Optional opaque resolved-segment or seller execution handle for this signal. Omit when signal_ref plus the value expression is sufficient for the seller to resolve the signal. Include when the product option exposes a separate runtime or activation handle, and pass it verbatim. Buyers SHOULD prefer an exposed segment handle over reconstructing condition identity from categorical values because the handle can carry provider namespace and methodology distinctions.").optional(), "activation_key": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
13914
+ const objectSchema = z.object({ "geo_countries": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE')."), z.null()]).optional(), "geo_countries_exclude": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Exclude specific countries from delivery. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE')."), z.null()]).optional(), "geo_regions": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Restrict delivery to exact canonical ISO 3166-2 subdivisions (states, provinces, regions, departments, or other subdivision categories). Unknown identifiers are invalid. At create or update, sellers MUST reject unsupported identifiers and MUST NOT silently widen, drop, or partially apply the list. During get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome. Exact internal translation preserves accepted identifiers in package readback."), z.null()]).optional(), "geo_regions_exclude": z.union([z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Exclude exact canonical ISO 3166-2 subdivisions. Support is independent from geo_regions inclusion support. Unknown identifiers and values also present in geo_regions are invalid. At create or update, sellers MUST reject unsupported identifiers and partial application; during get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome."), z.null()]).optional(), "geo_metros": z.union([z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict().describe("A targeted metro area.")).min(1).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities."), z.null().describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.")]).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_metros_exclude": z.union([z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes to exclude within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).strict()).min(1).describe("Exclude specific metro areas from delivery. Each entry specifies the classification system and excluded values. Seller must declare supported systems in get_adcp_capabilities."), z.null()]).optional(), "geo_postal_areas": z.union([z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })]).describe("Must also satisfy at least one of these alternatives.")).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Restrict delivery to specific postal areas. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities."), z.null()]).optional(), "geo_postal_areas_exclude": z.union([z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system (e.g., 'zip', 'outward', 'plz', 'postal_code')."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })]).describe("Must also satisfy at least one of these alternatives.")).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).strict()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Exclude specific postal areas from delivery. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities."), z.null()]).optional(), "geo_places": z.union([z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Restrict delivery to catalog-backed named places. Values MUST be stable identifiers in the declared system, not display names. Sellers must declare supported systems, countries, and place types in get_adcp_capabilities and reject unsupported entries rather than silently dropping them."), z.null()]).optional(), "geo_places_exclude": z.union([z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).strict().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Exclude catalog-backed named places. Uses the same identifier-based shape as geo_places. Sellers MUST reject overlap with geo_places for the same country, system, place_type, and value."), z.null()]).optional(), "daypart_targets": z.union([z.array(z.object({ "days": z.array(z.enum(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]).describe("Days of the week for daypart targeting")).min(1).describe("Days of week this window applies to. Use multiple days for compact targeting (e.g., monday-friday in one object)."), "start_hour": z.number().int().gte(0).lte(23).describe("Start hour (inclusive), 0-23 in 24-hour format. 0 = midnight, 6 = 6:00am, 18 = 6:00pm."), "end_hour": z.number().int().gte(1).lte(24).describe("End hour (exclusive), 1-24 in 24-hour format. 10 = 10:00am, 24 = midnight. Must be greater than start_hour."), "timezone": z.union([z.literal("inventory_local"), z.any().refine((value) => !z.literal("inventory_local").safeParse(value).success, "Invalid input: Should NOT be valid against schema").describe("Concrete timezone identifier in the implementation's supported IANA Time Zone Database, such as America/New_York, CET, or UTC.")]).describe("Civil-time clock used to evaluate this window. 'inventory_local' evaluates the hours in the seller-assigned local timezone of each inventory unit that can deliver the impression, such as a screen, venue, station, or publisher property; it never means the buyer, account, or server timezone. A concrete IANA timezone identifier (for example, 'America/New_York', 'CET', or 'UTC') evaluates one shared civil-time clock across the targeted inventory. Omission defaults to 'inventory_local'. Buyers that begin with a user or account preference MUST resolve it to a concrete IANA identifier before sending the daypart; 'user_timezone' and 'account_timezone' are not wire values. For each candidate delivery instant, convert the instant into this clock and compare its resulting local day and hour with the half-open window: a skipped DST hour has no matching instants, while both occurrences of a repeated hour match. This delivery clock is independent of reporting_capabilities.timezone.").default("inventory_local"), "label": z.string().describe("Optional human-readable name for this time window (e.g., 'Morning Drive', 'Prime Time')").optional() }).strict().describe("A time window for daypart targeting. Specifies days of week, an hour range, and the civil-time clock used to evaluate it. start_hour is inclusive, end_hour is exclusive (e.g., 6-10 = 6:00am to 10:00am). Follows the Google Ads AdScheduleInfo / DV360 DayPartTargeting pattern.")).min(1).describe("Restrict delivery to specific time windows. Each entry specifies days of week, an hour range, and an optional timezone that defaults to inventory_local. A concrete IANA zone uses one shared civil-time clock, while inventory_local evaluates each inventory unit in its seller-assigned local timezone. Entries are independent and MAY use different clocks."), z.null()]).optional(), "axe_include_segment": z.union([z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to include for targeting."), z.null()]).optional(), "axe_exclude_segment": z.union([z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to exclude from targeting."), z.null()]).optional(), "audience_include": z.union([z.array(z.string()).min(1).describe("Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "audience_exclude": z.union([z.array(z.string()).min(1).describe("Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "signal_targeting_groups": z.union([z.object({ "operator": z.literal("all").describe("Groups-level operator. Required even though v1 only supports 'all': every child group must be satisfied."), "groups": z.array(z.object({ "operator": z.enum(["any", "none"]).describe("How to evaluate the signals in this group. 'any' is an OR include group. 'none' is an exclusion group equivalent to NOT (A OR B OR C)."), "signals": z.array(z.object({ "pricing_option_id": z.string().describe("Pricing option selected for this signal. Use the pricing_option_id from the product's signal_targeting_options entry when product-scoped pricing is present; otherwise use the seller get_signals pricing only when the product option does not override it. Required when the selected signal has pricing_options; omit only when the signal is bundled into the product price or has no incremental cost.").optional(), "signal_agent_segment_id": z.string().describe("Optional opaque resolved-segment or seller execution handle for this signal. Omit when signal_ref plus the value expression is sufficient for the seller to resolve the signal. Include when the product option exposes a separate runtime or activation handle, and pass it verbatim. Buyers SHOULD prefer an exposed segment handle over reconstructing condition identity from categorical values because the handle can carry provider namespace and methodology distinctions.").optional(), "activation_key": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
13932
13915
  const schemas = [z.object({ "type": z.literal("segment_id").describe("Segment ID based targeting"), "segment_id": z.string().describe("The platform-specific segment identifier to use in campaign targeting") }).catchall(z.any()), z.object({ "type": z.literal("key_value").describe("Key-value pair based targeting"), "key": z.string().describe("The targeting parameter key"), "value": z.string().describe("The targeting parameter value") }).catchall(z.any())];
13933
13916
  const { errors, failed } = schemas.reduce(
13934
13917
  ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
@@ -14029,7 +14012,7 @@ const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
14029
14012
  message: "Invalid input: Should pass single schema. Passed " + passed2
14030
14013
  });
14031
14014
  }
14032
- }).describe("Named signal being targeted."), "value_type": z.literal("numeric").describe("Discriminator for numeric signals."), "min_value": z.number().describe("Minimum value, inclusive. Omit for no minimum. Should be within the signal definition's range when declared.").optional(), "max_value": z.number().describe("Maximum value, inclusive. Omit for no maximum. Should be within the signal definition's range when declared.").optional() }).catchall(z.any()).and(z.union([z.object({ "min_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Numeric signal expression - target users within a value range. At least one of min_value or max_value is required. If both min_value and max_value are provided, min_value MUST be <= max_value.")];
14015
+ }).describe("Named signal being targeted."), "value_type": z.literal("numeric").describe("Discriminator for numeric signals."), "min_value": z.number().describe("Minimum value, inclusive. Omit for no minimum. Should be within the signal definition's range when declared.").optional(), "max_value": z.number().describe("Maximum value, inclusive. Omit for no maximum. Should be within the signal definition's range when declared.").optional() }).catchall(z.any()).and(z.union([z.object({ "min_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Numeric signal expression - target users within a value range. At least one of min_value or max_value is required. If both min_value and max_value are provided, min_value MUST be <= max_value.")];
14033
14016
  const { errors, failed } = schemas.reduce(
14034
14017
  ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
14035
14018
  errors: [...errors2, ...result.error.issues],
@@ -14104,7 +14087,7 @@ const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
14104
14087
  message: "Invalid input: Should pass single schema. Passed " + passed2
14105
14088
  });
14106
14089
  }
14107
- }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("binary").describe("Discriminator for binary signals"), "value": z.boolean().describe("Whether to include (true) or exclude (false) users matching this signal") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Binary signal targeting - user either matches or doesn't"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
14090
+ }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("binary").describe("Discriminator for binary signals"), "value": z.boolean().describe("Whether to include (true) or exclude (false) users matching this signal") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Binary signal targeting - user either matches or doesn't"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
14108
14091
  const schemas2 = [z.object({ "scope": z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Product-local signal identifier. For local signals exposed on both get_signals and get_products, this MUST match get_signals.signals[].signal_ref.signal_id for the same signal.") }).catchall(z.any()).describe("Product-scoped signal. The signal_id is meaningful only within the selected product/package context and MUST match a Product.included_signals[].signal_ref.signal_id or Product.signal_targeting_options[].signal_ref.signal_id for that product, depending on whether the signal is descriptive or selectable."), z.object({ "scope": z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that publishes the signal definition in its adagents.json signals[]."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(z.any()).describe("Data-provider-scoped signal. The signal_id resolves through the data provider's published adagents.json signals[] and can be authorization-verified there."), z.object({ "scope": z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(z.any()).describe("Signal-source-scoped signal. Use this for source-native signals that are not published in upstream adagents.json signals[]. The buyer trusts the issuing signal source for this identity; use scope 'data_provider' instead when the signal is published in adagents.json signals[], even if the publisher is also the seller or signal source.")];
14109
14092
  const { errors: errors2, failed: failed2 } = schemas2.reduce(
14110
14093
  ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
@@ -14154,7 +14137,7 @@ const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
14154
14137
  message: "Invalid input: Should pass single schema. Passed " + passed2
14155
14138
  });
14156
14139
  }
14157
- }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("categorical").describe("Discriminator for categorical signals"), "values": z.array(z.string()).min(1).describe("Values to target. Users with any of these values will be included.") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Categorical signal targeting - target users with specific values"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
14140
+ }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("categorical").describe("Discriminator for categorical signals"), "values": z.array(z.string()).min(1).describe("Values to target. Users with any of these values will be included.") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Categorical signal targeting - target users with specific values"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
14158
14141
  const schemas2 = [z.object({ "scope": z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Product-local signal identifier. For local signals exposed on both get_signals and get_products, this MUST match get_signals.signals[].signal_ref.signal_id for the same signal.") }).catchall(z.any()).describe("Product-scoped signal. The signal_id is meaningful only within the selected product/package context and MUST match a Product.included_signals[].signal_ref.signal_id or Product.signal_targeting_options[].signal_ref.signal_id for that product, depending on whether the signal is descriptive or selectable."), z.object({ "scope": z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that publishes the signal definition in its adagents.json signals[]."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(z.any()).describe("Data-provider-scoped signal. The signal_id resolves through the data provider's published adagents.json signals[] and can be authorization-verified there."), z.object({ "scope": z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(z.any()).describe("Signal-source-scoped signal. Use this for source-native signals that are not published in upstream adagents.json signals[]. The buyer trusts the issuing signal source for this identity; use scope 'data_provider' instead when the signal is published in adagents.json signals[], even if the publisher is also the seller or signal source.")];
14159
14142
  const { errors: errors2, failed: failed2 } = schemas2.reduce(
14160
14143
  ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
@@ -14204,7 +14187,7 @@ const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
14204
14187
  message: "Invalid input: Should pass single schema. Passed " + passed2
14205
14188
  });
14206
14189
  }
14207
- }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("numeric").describe("Discriminator for numeric signals"), "min_value": z.number().describe("Minimum value (inclusive). Omit for no minimum. Must be <= max_value when both are provided. Should be >= signal's range.min if defined.").optional(), "max_value": z.number().describe("Maximum value (inclusive). Omit for no maximum. Must be >= min_value when both are provided. Should be <= signal's range.max if defined.").optional() }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Numeric signal targeting - target users within a value range. If min_value is provided, it must be <= max_value. Values should be within the signal's defined range (see signal definition).")];
14190
+ }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("numeric").describe("Discriminator for numeric signals"), "min_value": z.number().describe("Minimum value (inclusive). Omit for no minimum. Must be <= max_value when both are provided. Should be >= signal's range.min if defined.").optional(), "max_value": z.number().describe("Maximum value (inclusive). Omit for no maximum. Must be >= min_value when both are provided. Should be <= signal's range.max if defined.").optional() }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Numeric signal targeting - target users within a value range. If min_value is provided, it must be <= max_value. Values should be within the signal's defined range (see signal definition).")];
14208
14191
  const { errors, failed } = schemas.reduce(
14209
14192
  ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
14210
14193
  errors: [...errors2, ...result.error.issues],
@@ -14228,7 +14211,7 @@ const TargetingOverlayInputSchema = /* @__PURE__ */ (() => (() => {
14228
14211
  message: "Invalid input: Should pass single schema. Passed " + passed
14229
14212
  });
14230
14213
  }
14231
- }).describe("Targeting constraint for a specific signal. Uses value_type as discriminator to determine the targeting expression format.")).min(1).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing."), z.null().describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.")]).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.").optional(), "demographics": z.union([z.object({ "age": z.intersection(z.object({ "min": z.number().int().gte(0).lte(150).describe("Inclusive minimum age in completed years. Omit for an open lower bound.").optional(), "max": z.number().int().gte(0).lte(150).describe("Inclusive maximum age in completed years. Omit for an open upper bound.").optional(), "include_unknown": z.boolean().describe("Whether delivery to people whose age is unavailable is part of this predicate. This field has no default and MUST be supplied.") }).catchall(z.any()).and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A canonical audience-age predicate in completed integer years. min and max are inclusive; omitting one bound means no restriction in that direction. At least one bound is required. include_unknown is always explicit because people whose age is unavailable are not members of any numeric interval. Implementations MUST reject min greater than max; JSON Schema draft-07 cannot compare sibling numeric values."), z.object({ "accepted_bases": z.array(z.enum(["verified", "declared", "inferred"]).describe("User-level bases that may resolve age for demographic targeting execution. Population estimates are deliberately absent because aggregate composition cannot establish an individual impression's age.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("User-level age determination bases the buyer permits for this predicate. Sellers MUST use only these bases or reject the request; they MUST NOT silently fall back to another basis. When omitted, the buyer imposes no determination-basis constraint beyond product capability and any age_restriction. population_estimate is structurally unavailable because aggregate evidence cannot identify an eligible user.").optional(), "accepted_verification_methods": z.array(z.enum(["facial_age_estimation", "id_document", "digital_id", "credit_card", "world_id"]).describe("Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Verification methods acceptable when verified is an accepted basis. This field narrows verified demographic execution; age_restriction.accepted_methods independently governs legal eligibility and the two sets are intersected when both are present.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "accepted_verification_methods": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "accepted_verification_methods": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "accepted_bases": z.any().refine((value) => !z.array(z.any().refine((value2) => !z.literal("verified").safeParse(value2).success, "Invalid input: Should NOT be valid against schema")).safeParse(value).success, "Invalid input: Should NOT be valid against schema") }))]))) }).catchall(z.any()).describe("Canonical demographic audience targeting intent with optional constraints on how age may be determined. This is distinct from age_restriction: demographics selects an audience, while age_restriction expresses a legal eligibility or verification floor. Fresh create/update targeting MUST compile exactly or be rejected. During get_products, a seller may offer a different configured predicate only through sparse targeting_resolution modifications on a distinguishable product_id; selecting that product accepts the alternative. Sellers never silently broaden, narrow, default, drop, or substitute the basis."), z.null()]).optional(), "frequency_cap": z.union([z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2."), z.null()]).optional(), "property_list": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list for targeting specific properties within this product. The package runs on the intersection of the product's publisher_properties and this list. Sellers SHOULD return a validation error if the product has property_targeting_allowed: false."), z.null()]).optional(), "property_list_exclude": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list whose properties must not carry the buyer's ads. Matched properties are removed from delivery. Use for brand-safety do-not-run lists (apps, sites). Exclude wins on overlap with property_list, and applies regardless of the product's property_targeting_allowed flag. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "collection_list": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for including specific collections (programs, publications, channels) within this product. The package runs on the intersection of matched collections and this list. Use for inclusion-based collection targeting. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "collection_list_exclude": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for excluding specific collections (programs, publications, channels) from this product. Matched collections must not carry the buyer's ads. Use for brand safety do-not-air lists. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "placement_selection": z.union([z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
14214
+ }).describe("Targeting constraint for a specific signal. Uses value_type as discriminator to determine the targeting expression format.")).min(1).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing."), z.null().describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.")]).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.").optional(), "demographics": z.union([z.object({ "age": z.intersection(z.object({ "min": z.number().int().gte(0).lte(150).describe("Inclusive minimum age in completed years. Omit for an open lower bound.").optional(), "max": z.number().int().gte(0).lte(150).describe("Inclusive maximum age in completed years. Omit for an open upper bound.").optional(), "include_unknown": z.boolean().describe("Whether delivery to people whose age is unavailable is part of this predicate. This field has no default and MUST be supplied.") }).catchall(z.any()).and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A canonical audience-age predicate in completed integer years. min and max are inclusive; omitting one bound means no restriction in that direction. At least one bound is required. include_unknown is always explicit because people whose age is unavailable are not members of any numeric interval. Implementations MUST reject min greater than max; JSON Schema draft-07 cannot compare sibling numeric values."), z.object({ "accepted_bases": z.array(z.enum(["verified", "declared", "inferred"]).describe("User-level bases that may resolve age for demographic targeting execution. Population estimates are deliberately absent because aggregate composition cannot establish an individual impression's age.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("User-level age determination bases the buyer permits for this predicate. Sellers MUST use only these bases or reject the request; they MUST NOT silently fall back to another basis. When omitted, the buyer imposes no determination-basis constraint beyond product capability and any age_restriction. population_estimate is structurally unavailable because aggregate evidence cannot identify an eligible user.").optional(), "accepted_verification_methods": z.array(z.enum(["facial_age_estimation", "id_document", "digital_id", "credit_card", "world_id"]).describe("Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Verification methods acceptable when verified is an accepted basis. This field narrows verified demographic execution; age_restriction.accepted_methods independently governs legal eligibility and the two sets are intersected when both are present.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "accepted_verification_methods": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "accepted_verification_methods": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "accepted_bases": z.any().refine((value) => !z.array(z.any().refine((value2) => !z.literal("verified").safeParse(value2).success, "Invalid input: Should NOT be valid against schema")).safeParse(value).success, "Invalid input: Should NOT be valid against schema") }))]).describe("Must also satisfy at least one of these alternatives."))) }).catchall(z.any()).describe("Canonical demographic audience targeting intent with optional constraints on how age may be determined. This is distinct from age_restriction: demographics selects an audience, while age_restriction expresses a legal eligibility or verification floor. Fresh create/update targeting MUST compile exactly or be rejected. During get_products, a seller may offer a different configured predicate only through sparse targeting_resolution modifications on a distinguishable product_id; selecting that product accepts the alternative. Sellers never silently broaden, narrow, default, drop, or substitute the basis."), z.null()]).optional(), "frequency_cap": z.union([z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).strict().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2."), z.null()]).optional(), "property_list": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list for targeting specific properties within this product. The package runs on the intersection of the product's publisher_properties and this list. Sellers SHOULD return a validation error if the product has property_targeting_allowed: false."), z.null()]).optional(), "property_list_exclude": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a property list whose properties must not carry the buyer's ads. Matched properties are removed from delivery. Use for brand-safety do-not-run lists (apps, sites). Exclude wins on overlap with property_list, and applies regardless of the product's property_targeting_allowed flag. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "collection_list": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for including specific collections (programs, publications, channels) within this product. The package runs on the intersection of matched collections and this list. Use for inclusion-based collection targeting. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "collection_list_exclude": z.union([z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).strict().describe("Reference to a collection list for excluding specific collections (programs, publications, channels) from this product. Matched collections must not carry the buyer's ads. Use for brand safety do-not-air lists. Seller must declare support in get_adcp_capabilities."), z.null()]).optional(), "placement_selection": z.union([z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
14232
14215
  const schemas = [z.object({ "mode": z.literal("selected"), "placement_refs": z.array(z.union([z.intersection(z.object({ "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring a publisher-catalog placement is hosted, or the inventory publisher associated with an inline placement. Omitted only for legacy single-publisher product-context references.").optional(), "placement_id": z.string().describe("Placement ID from the publisher's adagents.json placement catalog, or an inline seller-defined placement ID interpreted within the enclosing seller and product context.") }).catchall(z.any()).describe("Legacy-compatible product-context reference to a placement. For publisher-catalog placements, publisher_domain plus placement_id resolves the declaration in that publisher's adagents.json. For seller-inline placements, the enclosing seller and product supply scope. When publisher_domain is omitted on legacy inputs, receivers MAY interpret the ID relative to the enclosing single-publisher product. Use placement-identity.json when a self-contained cross-document identity is required."), z.object({ "publisher_domain": z.any().refine((value) => value !== void 0, "Required") }).passthrough()), z.any().superRefine((x2, ctx2) => {
14233
14216
  const schemas2 = [z.object({ "kind": z.literal("publisher_ref"), "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain whose adagents.json declares placement_id."), "placement_id": z.string().min(1) }).strict(), z.object({ "kind": z.literal("seller_inline"), "seller_agent": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("The seller agent's API endpoint URL as declared in the property publisher's adagents.json `authorized_agents[].url`. MUST use the `https://` scheme. Receivers compare this URL against the `authorized_agents` list using the AdCP URL canonicalization rules \u2014 not byte-equality \u2014 and reject mismatches with `seller_not_authorized`. See docs/reference/url-canonicalization."), "id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).min(1).describe("Reserved for a future registry-assigned stable seller identifier. Not used today \u2014 senders MUST NOT populate this field until a registry is defined. When a future release populates both `agent_url` and `id`, `agent_url` remains authoritative and `id` is advisory.").optional() }).strict().describe("Sales agent that defines and maintains the inline placement namespace."), "placement_id": z.string().min(1).describe("Stable placement ID within the defining sales agent's namespace. The agent MUST NOT reuse it for a different semantic placement.") }).strict()];
14234
14217
  const { errors: errors2, failed: failed2 } = schemas2.reduce(
@@ -14406,12 +14389,12 @@ const ProposalRefinementSchema = /* @__PURE__ */ (() => z.object({
14406
14389
  action: z.literal("finalize")
14407
14390
  }).passthrough(), z.union([z.object({}).passthrough(), z.object({
14408
14391
  change_kind: z.literal("cancellation")
14409
- }).passthrough()])])))();
14392
+ }).passthrough()])]).describe("Must also satisfy at least one of these alternatives.")))();
14410
14393
  const PropertyFeatureResultSchema = /* @__PURE__ */ (() => z.object({
14411
14394
  property: PropertyIDSchema,
14412
14395
  features: z.record(z.string(), PropertyFeatureValueSchema).optional(),
14413
14396
  coverage_status: z.union([z.literal("covered"), z.literal("not_covered"), z.literal("pending")]),
14414
- last_evaluated: z.iso.datetime().optional(),
14397
+ last_evaluated: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
14415
14398
  ext: ExtensionObjectSchema.optional()
14416
14399
  }).passthrough())();
14417
14400
  const PackageFormatSnapshotSchema = /* @__PURE__ */ (() => ProductFormatDeclarationSchema.and(z.object({}).passthrough()).and(z.object({
@@ -14728,7 +14711,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
14728
14711
  message: "Invalid input: Should pass single schema. Passed " + passed
14729
14712
  });
14730
14713
  }
14731
- })).describe('Discriminated reference to a product format option. The global canonical shape is still named by `format_kind`; this reference selects one concrete product `format_options[]` entry. `scope: "publisher"` identifies a publisher-declared catalog option by `{ publisher_domain, format_option_id }`. `scope: "product"` identifies a product-local option by `format_option_id`; the enclosing package/product context supplies the namespace.')).min(1).describe("Canonical format options selected from the published product offer. Legacy named-format identifiers are not accepted.").optional(), "catalog_ids": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Previously synchronized account catalog IDs promoted by this selection. Callers manage catalog bodies through sync_catalogs rather than inlining them here.").optional(), "budget": z.number().gte(0).describe("Hard spend cap for this selection in the media-buy currency. In seller-optimized allocation it is an optional ceiling, not a reserved allocation, and requires advertised media_buy.features.seller_optimized_package_budgets; otherwise rejected with UNSUPPORTED_FEATURE before any over-subscription validation.").optional(), "daily_budget_cap": z.number().gte(0).describe("Optional hard daily spend ceiling for this purchase. It is subordinate to the media-buy aggregate daily cap and is not a reserved daily allocation. Its day boundary is the media buy's budget_cap_timezone.").optional(), "min_spend_target": z.number().gte(0).describe("Soft lifetime spend target for seller-optimized allocation. Requires advertised media_buy.features.seller_optimized_min_spend_targets; otherwise rejected with UNSUPPORTED_FEATURE before any over-subscription validation.").optional(), "impressions": z.number().gte(0).optional(), "start_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "end_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "pacing": z.enum(["even", "asap", "front_loaded"]).describe("Purchase pacing, subordinate to media-buy pacing. In seller-optimized allocation, pacing that differs from the media-buy pacing requires advertised media_buy.features.seller_optimized_package_pacing; otherwise rejected with UNSUPPORTED_FEATURE.").optional(), "bidding": z.object({ "automatic": z.literal(true).describe("Explicitly use seller/provider automatic bidding at this authored scope. At package scope this is a complete override of a media-buy policy, not inheritance. It MUST be the only field in the block and MUST be preserved on readback.").optional(), "bid_amount": z.number().gt(0).describe("Manual auction bid denominated in the media-buy currency and expressed per the selected pricing option's auction unit. For example, a CPM option interprets the amount per thousand impressions. This is the amount submitted to the auction, not a promise that the clearing price equals it. Requires an auction-priced pricing option whose currency equals the media-buy currency.").optional(), "max_bid": z.number().gt(0).describe("Hard per-auction ceiling denominated in the media-buy currency and expressed per the selected pricing option's auction unit. This is the only canonical hard auction ceiling and MUST NOT be translated into an average outcome-cost control. Requires an auction-priced pricing option whose currency equals the media-buy currency. May stand alone or supplement cost_per/roas only when the relevant scope capability advertises that combination.").optional(), "cost_per": z.object({ "amount": z.number().gt(0).describe("Average cost amount per scope-bound primary-goal result, denominated in the media-buy currency."), "strength": z.enum(["cap", "target"]).describe("`cap` optimizes for an average at or below the amount and accepts underdelivery when necessary; `target` optimizes around the amount while balancing volume and spend. Neither is a per-result or per-auction guarantee.") }).passthrough().describe("Average cost control per result of the scope-bound primary optimization goal. At seller-optimized media-buy scope it binds to budget_allocation.optimization_goals; at package scope it binds to that package's optimization_goals; at fixed media-buy scope it binds independently to each inheriting package and is valid only when their primary-goal result units are compatible. Metric goals are compatible only when metric and every result-defining qualifier match; vendor_metric goals only when vendor and metric_id match; event goals only when the event_type/custom_event_name set and resolved attribution_window match. Primary is the earliest array entry among goals tied for the lowest explicit numeric priority; unprioritized goals follow explicitly prioritized goals; when all priorities are absent, the first entry is primary.").optional(), "roas": z.object({ "value": z.number().gt(0).describe("Return per unit of ad spend; 4 means 4 units of value per 1 unit spent."), "strength": z.enum(["floor", "target"]).describe("`floor` prefers underdelivery to knowingly optimizing below the requested return; `target` optimizes around the requested return. Neither guarantees realized return.") }).passthrough().describe("Dimensionless return-on-ad-spend control bound to the same scope-specific primary goal rules as cost_per. The bound goal must be value-bearing; a fixed media-buy default requires a value-bearing primary goal on every inheriting package. Every referenced value-bearing event source MUST declare value_currencies containing the media-buy currency. The seller validates this at buy creation; each buy consumes only exact-currency records, while other declared currencies remain available to other buys. Sellers MUST NOT perform currency conversion.").optional() }).passthrough().and(z.any().refine((value) => !z.union([z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "max_bid": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "cost_per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "roas": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required"), "max_bid": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required"), "cost_per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required"), "roas": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "cost_per": z.any().refine((value2) => value2 !== void 0, "Required"), "roas": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema")).describe("Buyer-authored execution policy for automatic delivery, auction bidding, average outcome cost, or return on ad spend. The containing object determines authored scope: media-buy `bidding` is a complete inherited default and package `bidding` is a complete package override. Sellers MUST preserve authored scope on readback and MUST NOT copy an inherited media-buy policy into package `bidding`. Every monetary field in this block is denominated in the media-buy currency; the selected pricing option supplies the auction unit, never another denomination. Auction-unit identity is the pricing_model plus every canonical billing-event qualifier after defaults are applied: for example CPV view threshold, CPP demographic system/demographic, CPA event tuple, time time_unit, and flat-rate/DOOH parameters. An extension qualifier participates only when its registered extension specification explicitly defines how it contributes to auction-unit identity. A media-buy bid_amount or max_bid is valid only when every inheriting package resolves the same auction-unit identity. Every affected pricing option MUST use the media-buy currency; split currency-mismatched packages into separate buys. Seller-optimized media-buy cost_per/roas bind to the primary budget_allocation.optimization_goals goal. Package-authored cost_per/roas bind to the package primary optimization goal. The primary goal is the earliest array entry among goals with the lowest explicit numeric priority; unprioritized goals follow explicitly prioritized goals; when all priorities are absent, the first entry is primary. In fixed allocation, an inherited media-buy cost_per is valid only when all inheriting packages have compatible primary-goal result units; inherited roas requires value-bearing primary goals on every inheriting package. Canonical ROAS requires each value-bearing event source to declare the media-buy currency in value_currencies; each buy consumes only exact-currency records and sellers MUST NOT convert them. Absence invokes inheritance or provider automatic delivery; `{automatic:true}` is an explicit authored policy that overrides inheritance. Sellers MUST reject unsupported modes, combinations, units, currency, goal bindings, or native placements before any provider mutation and MUST NOT silently translate semantics.").refine((value) => Object.keys(value).length >= 1, "Object must contain at least 1 property").optional(), "targeting_overlay": z.object({ "geo_countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_countries_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Exclude specific countries from delivery. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_regions": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Restrict delivery to exact canonical ISO 3166-2 subdivisions (states, provinces, regions, departments, or other subdivision categories). Unknown identifiers are invalid. At create or update, sellers MUST reject unsupported identifiers and MUST NOT silently widen, drop, or partially apply the list. During get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome. Exact internal translation preserves accepted identifiers in package readback.").optional(), "geo_regions_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Exclude exact canonical ISO 3166-2 subdivisions. Support is independent from geo_regions inclusion support. Unknown identifiers and values also present in geo_regions are invalid. At create or update, sellers MUST reject unsupported identifiers and partial application; during get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome.").optional(), "geo_metros": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).passthrough().describe("A targeted metro area.")).min(1).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_metros_exclude": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes to exclude within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).passthrough()).min(1).describe("Exclude specific metro areas from delivery. Each entry specifies the classification system and excluded values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).passthrough().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })])).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).passthrough()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Restrict delivery to specific postal areas. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas_exclude": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).passthrough().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })])).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).passthrough()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Exclude specific postal areas from delivery. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_places": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))])).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Restrict delivery to catalog-backed named places. Values MUST be stable identifiers in the declared system, not display names. Sellers must declare supported systems, countries, and place types in get_adcp_capabilities and reject unsupported entries rather than silently dropping them.").optional(), "geo_places_exclude": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))])).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Exclude catalog-backed named places. Uses the same identifier-based shape as geo_places. Sellers MUST reject overlap with geo_places for the same country, system, place_type, and value.").optional(), "daypart_targets": z.array(z.object({ "days": z.array(z.enum(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]).describe("Days of the week for daypart targeting")).min(1).describe("Days of week this window applies to. Use multiple days for compact targeting (e.g., monday-friday in one object)."), "start_hour": z.number().int().gte(0).lte(23).describe("Start hour (inclusive), 0-23 in 24-hour format. 0 = midnight, 6 = 6:00am, 18 = 6:00pm."), "end_hour": z.number().int().gte(1).lte(24).describe("End hour (exclusive), 1-24 in 24-hour format. 10 = 10:00am, 24 = midnight. Must be greater than start_hour."), "timezone": z.union([z.literal("inventory_local"), z.any().refine((value) => !z.literal("inventory_local").safeParse(value).success, "Invalid input: Should NOT be valid against schema").describe("Concrete timezone identifier in the implementation's supported IANA Time Zone Database, such as America/New_York, CET, or UTC.")]).describe("Civil-time clock used to evaluate this window. 'inventory_local' evaluates the hours in the seller-assigned local timezone of each inventory unit that can deliver the impression, such as a screen, venue, station, or publisher property; it never means the buyer, account, or server timezone. A concrete IANA timezone identifier (for example, 'America/New_York', 'CET', or 'UTC') evaluates one shared civil-time clock across the targeted inventory. Omission defaults to 'inventory_local'. Buyers that begin with a user or account preference MUST resolve it to a concrete IANA identifier before sending the daypart; 'user_timezone' and 'account_timezone' are not wire values. For each candidate delivery instant, convert the instant into this clock and compare its resulting local day and hour with the half-open window: a skipped DST hour has no matching instants, while both occurrences of a repeated hour match. This delivery clock is independent of reporting_capabilities.timezone.").default("inventory_local"), "label": z.string().describe("Optional human-readable name for this time window (e.g., 'Morning Drive', 'Prime Time')").optional() }).passthrough().describe("A time window for daypart targeting. Specifies days of week, an hour range, and the civil-time clock used to evaluate it. start_hour is inclusive, end_hour is exclusive (e.g., 6-10 = 6:00am to 10:00am). Follows the Google Ads AdScheduleInfo / DV360 DayPartTargeting pattern.")).min(1).describe("Restrict delivery to specific time windows. Each entry specifies days of week, an hour range, and an optional timezone that defaults to inventory_local. A concrete IANA zone uses one shared civil-time clock, while inventory_local evaluates each inventory unit in its seller-assigned local timezone. Entries are independent and MAY use different clocks.").optional(), "axe_include_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to include for targeting.").optional(), "axe_exclude_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to exclude from targeting.").optional(), "audience_include": z.array(z.string()).min(1).describe("Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities.").optional(), "audience_exclude": z.array(z.string()).min(1).describe("Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities.").optional(), "signal_targeting_groups": z.object({ "operator": z.literal("all").describe("Groups-level operator. Required even though v1 only supports 'all': every child group must be satisfied."), "groups": z.array(z.object({ "operator": z.enum(["any", "none"]).describe("How to evaluate the signals in this group. 'any' is an OR include group. 'none' is an exclusion group equivalent to NOT (A OR B OR C)."), "signals": z.array(z.object({ "pricing_option_id": z.string().describe("Pricing option selected for this signal. Use the pricing_option_id from the product's signal_targeting_options entry when product-scoped pricing is present; otherwise use the seller get_signals pricing only when the product option does not override it. Required when the selected signal has pricing_options; omit only when the signal is bundled into the product price or has no incremental cost.").optional(), "signal_agent_segment_id": z.string().describe("Optional opaque resolved-segment or seller execution handle for this signal. Omit when signal_ref plus the value expression is sufficient for the seller to resolve the signal. Include when the product option exposes a separate runtime or activation handle, and pass it verbatim. Buyers SHOULD prefer an exposed segment handle over reconstructing condition identity from categorical values because the handle can carry provider namespace and methodology distinctions.").optional(), "activation_key": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
14714
+ })).describe('Discriminated reference to a product format option. The global canonical shape is still named by `format_kind`; this reference selects one concrete product `format_options[]` entry. `scope: "publisher"` identifies a publisher-declared catalog option by `{ publisher_domain, format_option_id }`. `scope: "product"` identifies a product-local option by `format_option_id`; the enclosing package/product context supplies the namespace.')).min(1).describe("Canonical format options selected from the published product offer. Legacy named-format identifiers are not accepted.").optional(), "catalog_ids": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Previously synchronized account catalog IDs promoted by this selection. Callers manage catalog bodies through sync_catalogs rather than inlining them here.").optional(), "budget": z.number().gte(0).describe("Hard spend cap for this selection in the media-buy currency. In seller-optimized allocation it is an optional ceiling, not a reserved allocation, and requires advertised media_buy.features.seller_optimized_package_budgets; otherwise rejected with UNSUPPORTED_FEATURE before any over-subscription validation.").optional(), "daily_budget_cap": z.number().gte(0).describe("Optional hard daily spend ceiling for this purchase. It is subordinate to the media-buy aggregate daily cap and is not a reserved daily allocation. Its day boundary is the media buy's budget_cap_timezone.").optional(), "min_spend_target": z.number().gte(0).describe("Soft lifetime spend target for seller-optimized allocation. Requires advertised media_buy.features.seller_optimized_min_spend_targets; otherwise rejected with UNSUPPORTED_FEATURE before any over-subscription validation.").optional(), "impressions": z.number().gte(0).optional(), "start_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "end_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "pacing": z.enum(["even", "asap", "front_loaded"]).describe("Purchase pacing, subordinate to media-buy pacing. In seller-optimized allocation, pacing that differs from the media-buy pacing requires advertised media_buy.features.seller_optimized_package_pacing; otherwise rejected with UNSUPPORTED_FEATURE.").optional(), "bidding": z.object({ "automatic": z.literal(true).describe("Explicitly use seller/provider automatic bidding at this authored scope. At package scope this is a complete override of a media-buy policy, not inheritance. It MUST be the only field in the block and MUST be preserved on readback.").optional(), "bid_amount": z.number().gt(0).describe("Manual auction bid denominated in the media-buy currency and expressed per the selected pricing option's auction unit. For example, a CPM option interprets the amount per thousand impressions. This is the amount submitted to the auction, not a promise that the clearing price equals it. Requires an auction-priced pricing option whose currency equals the media-buy currency.").optional(), "max_bid": z.number().gt(0).describe("Hard per-auction ceiling denominated in the media-buy currency and expressed per the selected pricing option's auction unit. This is the only canonical hard auction ceiling and MUST NOT be translated into an average outcome-cost control. Requires an auction-priced pricing option whose currency equals the media-buy currency. May stand alone or supplement cost_per/roas only when the relevant scope capability advertises that combination.").optional(), "cost_per": z.object({ "amount": z.number().gt(0).describe("Average cost amount per scope-bound primary-goal result, denominated in the media-buy currency."), "strength": z.enum(["cap", "target"]).describe("`cap` optimizes for an average at or below the amount and accepts underdelivery when necessary; `target` optimizes around the amount while balancing volume and spend. Neither is a per-result or per-auction guarantee.") }).passthrough().describe("Average cost control per result of the scope-bound primary optimization goal. At seller-optimized media-buy scope it binds to budget_allocation.optimization_goals; at package scope it binds to that package's optimization_goals; at fixed media-buy scope it binds independently to each inheriting package and is valid only when their primary-goal result units are compatible. Metric goals are compatible only when metric and every result-defining qualifier match; vendor_metric goals only when vendor and metric_id match; event goals only when the event_type/custom_event_name set and resolved attribution_window match. Primary is the earliest array entry among goals tied for the lowest explicit numeric priority; unprioritized goals follow explicitly prioritized goals; when all priorities are absent, the first entry is primary.").optional(), "roas": z.object({ "value": z.number().gt(0).describe("Return per unit of ad spend; 4 means 4 units of value per 1 unit spent."), "strength": z.enum(["floor", "target"]).describe("`floor` prefers underdelivery to knowingly optimizing below the requested return; `target` optimizes around the requested return. Neither guarantees realized return.") }).passthrough().describe("Dimensionless return-on-ad-spend control bound to the same scope-specific primary goal rules as cost_per. The bound goal must be value-bearing; a fixed media-buy default requires a value-bearing primary goal on every inheriting package. Every referenced value-bearing event source MUST declare value_currencies containing the media-buy currency. The seller validates this at buy creation; each buy consumes only exact-currency records, while other declared currencies remain available to other buys. Sellers MUST NOT perform currency conversion.").optional() }).passthrough().and(z.any().refine((value) => !z.union([z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "max_bid": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "cost_per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "automatic": z.any().refine((value2) => value2 !== void 0, "Required"), "roas": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required"), "max_bid": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required"), "cost_per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "bid_amount": z.any().refine((value2) => value2 !== void 0, "Required"), "roas": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "cost_per": z.any().refine((value2) => value2 !== void 0, "Required"), "roas": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema")).describe("Buyer-authored execution policy for automatic delivery, auction bidding, average outcome cost, or return on ad spend. The containing object determines authored scope: media-buy `bidding` is a complete inherited default and package `bidding` is a complete package override. Sellers MUST preserve authored scope on readback and MUST NOT copy an inherited media-buy policy into package `bidding`. Every monetary field in this block is denominated in the media-buy currency; the selected pricing option supplies the auction unit, never another denomination. Auction-unit identity is the pricing_model plus every canonical billing-event qualifier after defaults are applied: for example CPV view threshold, CPP demographic system/demographic, CPA event tuple, time time_unit, and flat-rate/DOOH parameters. An extension qualifier participates only when its registered extension specification explicitly defines how it contributes to auction-unit identity. A media-buy bid_amount or max_bid is valid only when every inheriting package resolves the same auction-unit identity. Every affected pricing option MUST use the media-buy currency; split currency-mismatched packages into separate buys. Seller-optimized media-buy cost_per/roas bind to the primary budget_allocation.optimization_goals goal. Package-authored cost_per/roas bind to the package primary optimization goal. The primary goal is the earliest array entry among goals with the lowest explicit numeric priority; unprioritized goals follow explicitly prioritized goals; when all priorities are absent, the first entry is primary. In fixed allocation, an inherited media-buy cost_per is valid only when all inheriting packages have compatible primary-goal result units; inherited roas requires value-bearing primary goals on every inheriting package. Canonical ROAS requires each value-bearing event source to declare the media-buy currency in value_currencies; each buy consumes only exact-currency records and sellers MUST NOT convert them. Absence invokes inheritance or provider automatic delivery; `{automatic:true}` is an explicit authored policy that overrides inheritance. Sellers MUST reject unsupported modes, combinations, units, currency, goal bindings, or native placements before any provider mutation and MUST NOT silently translate semantics.").refine((value) => Object.keys(value).length >= 1, "Object must contain at least 1 property").optional(), "targeting_overlay": z.object({ "geo_countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_countries_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).describe("Exclude specific countries from delivery. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').").optional(), "geo_regions": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Restrict delivery to exact canonical ISO 3166-2 subdivisions (states, provinces, regions, departments, or other subdivision categories). Unknown identifiers are invalid. At create or update, sellers MUST reject unsupported identifiers and MUST NOT silently widen, drop, or partially apply the list. During get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome. Exact internal translation preserves accepted identifiers in package readback.").optional(), "geo_regions_exclude": z.array(z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$"))).min(1).describe("Exclude exact canonical ISO 3166-2 subdivisions. Support is independent from geo_regions inclusion support. Unknown identifiers and values also present in geo_regions are invalid. At create or update, sellers MUST reject unsupported identifiers and partial application; during get_products, a seller may instead return a sparse, buyer-reviewable targeting_resolution modification for a valid but unsupported requested outcome.").optional(), "geo_metros": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).passthrough().describe("A targeted metro area.")).min(1).describe("Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_metros_exclude": z.array(z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": z.array(z.string()).min(1).describe("Metro codes to exclude within the system (e.g., ['501', '602'] for Nielsen DMAs)") }).passthrough()).min(1).describe("Exclude specific metro areas from delivery. Each entry specifies the classification system and excluded values. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).passthrough().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })]).describe("Must also satisfy at least one of these alternatives.")).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).passthrough()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Restrict delivery to specific postal areas. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_postal_areas_exclude": z.array(z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system."), "values": z.array(z.string()).min(1).describe("Postal codes within the country and system.") }).passthrough().and(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })]).describe("Must also satisfy at least one of these alternatives.")).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom.")), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system."), "values": z.array(z.string()).min(1).describe("Postal codes within the legacy system.") }).passthrough()]).describe("Postal area values. Prefer the native country + postal system form. Deprecated legacy country-fused postal-system tokens remain accepted for compatibility.")).min(1).describe("Exclude specific postal areas from delivery. Prefer the native country + postal system form. The deprecated legacy country-fused postal-system tokens remain accepted for compatibility. Seller must declare supported systems in get_adcp_capabilities.").optional(), "geo_places": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Restrict delivery to catalog-backed named places. Values MUST be stable identifiers in the declared system, not display names. Sellers must declare supported systems, countries, and place types in get_adcp_capabilities and reject unsupported entries rather than silently dropping them.").optional(), "geo_places_exclude": z.array(z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": z.union([z.enum(["geonames", "google_ads", "microsoft_ads"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Collision-safe identifier namespace for geographic places. Registered tokens have protocol-defined semantics. Unregistered systems MUST use an absolute HTTPS URI controlled by the catalog owner; consumers compare URI systems as exact opaque strings."), "system_version": z.string().min(1).describe("Optional exact catalog version from the seller's declared supported_versions. When omitted, the seller applies catalog.current_version and MUST echo that version on persisted package state.").optional(), "place_type": z.union([z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), z.string().refine(adcpJsonSchemaUri, "Invalid URI").regex(new RegExp("^https://"))]).describe("Canonical place classification. Registered tokens have protocol-defined meanings. Catalog-specific classifications without a registered mapping MUST use an absolute HTTPS URI controlled by the vocabulary owner; consumers compare URI types as exact opaque strings."), "values": z.array(z.string().min(1)).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Stable place identifiers in the declared system. Display names are not valid targeting values."), "value_labels": z.record(z.string(), z.string().min(1)).describe("Optional human-readable diagnostic labels keyed by identifiers present in values. Extra keys are a conformance error. Labels are non-authoritative and MUST NOT be used to resolve or apply targeting.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "system": z.enum(["geonames", "google_ads", "microsoft_ads"]) }), z.object({ "values": z.any().optional() }))]).describe("Must also satisfy at least one of these alternatives.")).describe("A catalog-backed named place target. Values are stable identifiers in the declared system. Entries within geo_places form a union; different geographic inclusion dimensions intersect. value_labels are diagnostic only and MUST NOT be used to resolve targeting.")).min(1).describe("Exclude catalog-backed named places. Uses the same identifier-based shape as geo_places. Sellers MUST reject overlap with geo_places for the same country, system, place_type, and value.").optional(), "daypart_targets": z.array(z.object({ "days": z.array(z.enum(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]).describe("Days of the week for daypart targeting")).min(1).describe("Days of week this window applies to. Use multiple days for compact targeting (e.g., monday-friday in one object)."), "start_hour": z.number().int().gte(0).lte(23).describe("Start hour (inclusive), 0-23 in 24-hour format. 0 = midnight, 6 = 6:00am, 18 = 6:00pm."), "end_hour": z.number().int().gte(1).lte(24).describe("End hour (exclusive), 1-24 in 24-hour format. 10 = 10:00am, 24 = midnight. Must be greater than start_hour."), "timezone": z.union([z.literal("inventory_local"), z.any().refine((value) => !z.literal("inventory_local").safeParse(value).success, "Invalid input: Should NOT be valid against schema").describe("Concrete timezone identifier in the implementation's supported IANA Time Zone Database, such as America/New_York, CET, or UTC.")]).describe("Civil-time clock used to evaluate this window. 'inventory_local' evaluates the hours in the seller-assigned local timezone of each inventory unit that can deliver the impression, such as a screen, venue, station, or publisher property; it never means the buyer, account, or server timezone. A concrete IANA timezone identifier (for example, 'America/New_York', 'CET', or 'UTC') evaluates one shared civil-time clock across the targeted inventory. Omission defaults to 'inventory_local'. Buyers that begin with a user or account preference MUST resolve it to a concrete IANA identifier before sending the daypart; 'user_timezone' and 'account_timezone' are not wire values. For each candidate delivery instant, convert the instant into this clock and compare its resulting local day and hour with the half-open window: a skipped DST hour has no matching instants, while both occurrences of a repeated hour match. This delivery clock is independent of reporting_capabilities.timezone.").default("inventory_local"), "label": z.string().describe("Optional human-readable name for this time window (e.g., 'Morning Drive', 'Prime Time')").optional() }).passthrough().describe("A time window for daypart targeting. Specifies days of week, an hour range, and the civil-time clock used to evaluate it. start_hour is inclusive, end_hour is exclusive (e.g., 6-10 = 6:00am to 10:00am). Follows the Google Ads AdScheduleInfo / DV360 DayPartTargeting pattern.")).min(1).describe("Restrict delivery to specific time windows. Each entry specifies days of week, an hour range, and an optional timezone that defaults to inventory_local. A concrete IANA zone uses one shared civil-time clock, while inventory_local evaluates each inventory unit in its seller-assigned local timezone. Entries are independent and MAY use different clocks.").optional(), "axe_include_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to include for targeting.").optional(), "axe_exclude_segment": z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to exclude from targeting.").optional(), "audience_include": z.array(z.string()).min(1).describe("Restrict delivery to members of these first-party CRM audiences. Only users present in the uploaded lists are eligible. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Not for lookalike expansion \u2014 express that intent in the campaign brief. Seller must declare support in get_adcp_capabilities.").optional(), "audience_exclude": z.array(z.string()).min(1).describe("Suppress delivery to members of these first-party CRM audiences. Matched users are excluded regardless of other targeting. References audience_id values from sync_audiences on the same seller account \u2014 audience IDs are not portable across sellers. Seller must declare support in get_adcp_capabilities.").optional(), "signal_targeting_groups": z.object({ "operator": z.literal("all").describe("Groups-level operator. Required even though v1 only supports 'all': every child group must be satisfied."), "groups": z.array(z.object({ "operator": z.enum(["any", "none"]).describe("How to evaluate the signals in this group. 'any' is an OR include group. 'none' is an exclusion group equivalent to NOT (A OR B OR C)."), "signals": z.array(z.object({ "pricing_option_id": z.string().describe("Pricing option selected for this signal. Use the pricing_option_id from the product's signal_targeting_options entry when product-scoped pricing is present; otherwise use the seller get_signals pricing only when the product option does not override it. Required when the selected signal has pricing_options; omit only when the signal is bundled into the product price or has no incremental cost.").optional(), "signal_agent_segment_id": z.string().describe("Optional opaque resolved-segment or seller execution handle for this signal. Omit when signal_ref plus the value expression is sufficient for the seller to resolve the signal. Include when the product option exposes a separate runtime or activation handle, and pass it verbatim. Buyers SHOULD prefer an exposed segment handle over reconstructing condition identity from categorical values because the handle can carry provider namespace and methodology distinctions.").optional(), "activation_key": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
14732
14715
  const schemas = [z.object({ "type": z.literal("segment_id").describe("Segment ID based targeting"), "segment_id": z.string().describe("The platform-specific segment identifier to use in campaign targeting") }).catchall(z.any()), z.object({ "type": z.literal("key_value").describe("Key-value pair based targeting"), "key": z.string().describe("The targeting parameter key"), "value": z.string().describe("The targeting parameter value") }).catchall(z.any())];
14733
14716
  const { errors, failed } = schemas.reduce(
14734
14717
  ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
@@ -14829,7 +14812,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
14829
14812
  message: "Invalid input: Should pass single schema. Passed " + passed2
14830
14813
  });
14831
14814
  }
14832
- }).describe("Named signal being targeted."), "value_type": z.literal("numeric").describe("Discriminator for numeric signals."), "min_value": z.number().describe("Minimum value, inclusive. Omit for no minimum. Should be within the signal definition's range when declared.").optional(), "max_value": z.number().describe("Maximum value, inclusive. Omit for no maximum. Should be within the signal definition's range when declared.").optional() }).catchall(z.any()).and(z.union([z.object({ "min_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Numeric signal expression - target users within a value range. At least one of min_value or max_value is required. If both min_value and max_value are provided, min_value MUST be <= max_value.")];
14815
+ }).describe("Named signal being targeted."), "value_type": z.literal("numeric").describe("Discriminator for numeric signals."), "min_value": z.number().describe("Minimum value, inclusive. Omit for no minimum. Should be within the signal definition's range when declared.").optional(), "max_value": z.number().describe("Maximum value, inclusive. Omit for no maximum. Should be within the signal definition's range when declared.").optional() }).catchall(z.any()).and(z.union([z.object({ "min_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_value": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Numeric signal expression - target users within a value range. At least one of min_value or max_value is required. If both min_value and max_value are provided, min_value MUST be <= max_value.")];
14833
14816
  const { errors, failed } = schemas.reduce(
14834
14817
  ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
14835
14818
  errors: [...errors2, ...result.error.issues],
@@ -14904,7 +14887,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
14904
14887
  message: "Invalid input: Should pass single schema. Passed " + passed2
14905
14888
  });
14906
14889
  }
14907
- }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("binary").describe("Discriminator for binary signals"), "value": z.boolean().describe("Whether to include (true) or exclude (false) users matching this signal") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Binary signal targeting - user either matches or doesn't"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
14890
+ }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("binary").describe("Discriminator for binary signals"), "value": z.boolean().describe("Whether to include (true) or exclude (false) users matching this signal") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Binary signal targeting - user either matches or doesn't"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
14908
14891
  const schemas2 = [z.object({ "scope": z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Product-local signal identifier. For local signals exposed on both get_signals and get_products, this MUST match get_signals.signals[].signal_ref.signal_id for the same signal.") }).catchall(z.any()).describe("Product-scoped signal. The signal_id is meaningful only within the selected product/package context and MUST match a Product.included_signals[].signal_ref.signal_id or Product.signal_targeting_options[].signal_ref.signal_id for that product, depending on whether the signal is descriptive or selectable."), z.object({ "scope": z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that publishes the signal definition in its adagents.json signals[]."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(z.any()).describe("Data-provider-scoped signal. The signal_id resolves through the data provider's published adagents.json signals[] and can be authorization-verified there."), z.object({ "scope": z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(z.any()).describe("Signal-source-scoped signal. Use this for source-native signals that are not published in upstream adagents.json signals[]. The buyer trusts the issuing signal source for this identity; use scope 'data_provider' instead when the signal is published in adagents.json signals[], even if the publisher is also the seller or signal source.")];
14909
14892
  const { errors: errors2, failed: failed2 } = schemas2.reduce(
14910
14893
  ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
@@ -14954,7 +14937,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
14954
14937
  message: "Invalid input: Should pass single schema. Passed " + passed2
14955
14938
  });
14956
14939
  }
14957
- }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("categorical").describe("Discriminator for categorical signals"), "values": z.array(z.string()).min(1).describe("Values to target. Users with any of these values will be included.") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Categorical signal targeting - target users with specific values"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
14940
+ }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("categorical").describe("Discriminator for categorical signals"), "values": z.array(z.string()).min(1).describe("Values to target. Users with any of these values will be included.") }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Categorical signal targeting - target users with specific values"), z.object({ "signal_ref": z.any().superRefine((x2, ctx2) => {
14958
14941
  const schemas2 = [z.object({ "scope": z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Product-local signal identifier. For local signals exposed on both get_signals and get_products, this MUST match get_signals.signals[].signal_ref.signal_id for the same signal.") }).catchall(z.any()).describe("Product-scoped signal. The signal_id is meaningful only within the selected product/package context and MUST match a Product.included_signals[].signal_ref.signal_id or Product.signal_targeting_options[].signal_ref.signal_id for that product, depending on whether the signal is descriptive or selectable."), z.object({ "scope": z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that publishes the signal definition in its adagents.json signals[]."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(z.any()).describe("Data-provider-scoped signal. The signal_id resolves through the data provider's published adagents.json signals[] and can be authorization-verified there."), z.object({ "scope": z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(z.any()).describe("Signal-source-scoped signal. Use this for source-native signals that are not published in upstream adagents.json signals[]. The buyer trusts the issuing signal source for this identity; use scope 'data_provider' instead when the signal is published in adagents.json signals[], even if the publisher is also the seller or signal source.")];
14959
14942
  const { errors: errors2, failed: failed2 } = schemas2.reduce(
14960
14943
  ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
@@ -15004,7 +14987,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
15004
14987
  message: "Invalid input: Should pass single schema. Passed " + passed2
15005
14988
  });
15006
14989
  }
15007
- }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("numeric").describe("Discriminator for numeric signals"), "min_value": z.number().describe("Minimum value (inclusive). Omit for no minimum. Must be <= max_value when both are provided. Should be >= signal's range.min if defined.").optional(), "max_value": z.number().describe("Maximum value (inclusive). Omit for no maximum. Must be >= min_value when both are provided. Should be <= signal's range.max if defined.").optional() }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Numeric signal targeting - target users within a value range. If min_value is provided, it must be <= max_value. Values should be within the signal's defined range (see signal definition).")];
14990
+ }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": z.literal("numeric").describe("Discriminator for numeric signals"), "min_value": z.number().describe("Minimum value (inclusive). Omit for no minimum. Must be <= max_value when both are provided. Should be >= signal's range.min if defined.").optional(), "max_value": z.number().describe("Maximum value (inclusive). Omit for no maximum. Must be >= min_value when both are provided. Should be <= signal's range.max if defined.").optional() }).catchall(z.any()).and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Numeric signal targeting - target users within a value range. If min_value is provided, it must be <= max_value. Values should be within the signal's defined range (see signal definition).")];
15008
14991
  const { errors, failed } = schemas.reduce(
15009
14992
  ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
15010
14993
  errors: [...errors2, ...result.error.issues],
@@ -15028,7 +15011,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
15028
15011
  message: "Invalid input: Should pass single schema. Passed " + passed
15029
15012
  });
15030
15013
  }
15031
- }).describe("Targeting constraint for a specific signal. Uses value_type as discriminator to determine the targeting expression format.")).min(1).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.").optional(), "demographics": z.object({ "age": z.intersection(z.object({ "min": z.number().int().gte(0).lte(150).describe("Inclusive minimum age in completed years. Omit for an open lower bound.").optional(), "max": z.number().int().gte(0).lte(150).describe("Inclusive maximum age in completed years. Omit for an open upper bound.").optional(), "include_unknown": z.boolean().describe("Whether delivery to people whose age is unavailable is part of this predicate. This field has no default and MUST be supplied.") }).catchall(z.any()).and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A canonical audience-age predicate in completed integer years. min and max are inclusive; omitting one bound means no restriction in that direction. At least one bound is required. include_unknown is always explicit because people whose age is unavailable are not members of any numeric interval. Implementations MUST reject min greater than max; JSON Schema draft-07 cannot compare sibling numeric values."), z.object({ "accepted_bases": z.array(z.enum(["verified", "declared", "inferred"]).describe("User-level bases that may resolve age for demographic targeting execution. Population estimates are deliberately absent because aggregate composition cannot establish an individual impression's age.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("User-level age determination bases the buyer permits for this predicate. Sellers MUST use only these bases or reject the request; they MUST NOT silently fall back to another basis. When omitted, the buyer imposes no determination-basis constraint beyond product capability and any age_restriction. population_estimate is structurally unavailable because aggregate evidence cannot identify an eligible user.").optional(), "accepted_verification_methods": z.array(z.enum(["facial_age_estimation", "id_document", "digital_id", "credit_card", "world_id"]).describe("Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Verification methods acceptable when verified is an accepted basis. This field narrows verified demographic execution; age_restriction.accepted_methods independently governs legal eligibility and the two sets are intersected when both are present.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "accepted_verification_methods": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "accepted_verification_methods": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "accepted_bases": z.any().refine((value) => !z.array(z.any().refine((value2) => !z.literal("verified").safeParse(value2).success, "Invalid input: Should NOT be valid against schema")).safeParse(value).success, "Invalid input: Should NOT be valid against schema") }))]))) }).catchall(z.any()).describe("Canonical demographic audience targeting intent with optional constraints on how age may be determined. This is distinct from age_restriction: demographics selects an audience, while age_restriction expresses a legal eligibility or verification floor. Fresh create/update targeting MUST compile exactly or be rejected. During get_products, a seller may offer a different configured predicate only through sparse targeting_resolution modifications on a distinguishable product_id; selecting that product accepts the alternative. Sellers never silently broaden, narrow, default, drop, or substitute the basis.").optional(), "frequency_cap": z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2.").optional(), "property_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a property list for targeting specific properties within this product. The package runs on the intersection of the product's publisher_properties and this list. Sellers SHOULD return a validation error if the product has property_targeting_allowed: false.").optional(), "property_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a property list whose properties must not carry the buyer's ads. Matched properties are removed from delivery. Use for brand-safety do-not-run lists (apps, sites). Exclude wins on overlap with property_list, and applies regardless of the product's property_targeting_allowed flag. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a collection list for including specific collections (programs, publications, channels) within this product. The package runs on the intersection of matched collections and this list. Use for inclusion-based collection targeting. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a collection list for excluding specific collections (programs, publications, channels) from this product. Matched collections must not carry the buyer's ads. Use for brand safety do-not-air lists. Seller must declare support in get_adcp_capabilities.").optional(), "placement_selection": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
15014
+ }).describe("Targeting constraint for a specific signal. Uses value_type as discriminator to determine the targeting expression format.")).min(1).describe("DEPRECATED. Use signal_targeting_groups for package-level signal targeting. Legacy flat signal_targeting remains accepted during the SignalRef migration window but cannot express grouped include/exclude composition or product-scoped pricing.").optional(), "demographics": z.object({ "age": z.intersection(z.object({ "min": z.number().int().gte(0).lte(150).describe("Inclusive minimum age in completed years. Omit for an open lower bound.").optional(), "max": z.number().int().gte(0).lte(150).describe("Inclusive maximum age in completed years. Omit for an open upper bound.").optional(), "include_unknown": z.boolean().describe("Whether delivery to people whose age is unavailable is part of this predicate. This field has no default and MUST be supplied.") }).catchall(z.any()).and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A canonical audience-age predicate in completed integer years. min and max are inclusive; omitting one bound means no restriction in that direction. At least one bound is required. include_unknown is always explicit because people whose age is unavailable are not members of any numeric interval. Implementations MUST reject min greater than max; JSON Schema draft-07 cannot compare sibling numeric values."), z.object({ "accepted_bases": z.array(z.enum(["verified", "declared", "inferred"]).describe("User-level bases that may resolve age for demographic targeting execution. Population estimates are deliberately absent because aggregate composition cannot establish an individual impression's age.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("User-level age determination bases the buyer permits for this predicate. Sellers MUST use only these bases or reject the request; they MUST NOT silently fall back to another basis. When omitted, the buyer imposes no determination-basis constraint beyond product capability and any age_restriction. population_estimate is structurally unavailable because aggregate evidence cannot identify an eligible user.").optional(), "accepted_verification_methods": z.array(z.enum(["facial_age_estimation", "id_document", "digital_id", "credit_card", "world_id"]).describe("Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Verification methods acceptable when verified is an accepted basis. This field narrows verified demographic execution; age_restriction.accepted_methods independently governs legal eligibility and the two sets are intersected when both are present.").optional() }).catchall(z.any()).and(z.union([z.any().refine((value) => !z.object({ "accepted_verification_methods": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "accepted_verification_methods": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "accepted_bases": z.any().refine((value) => !z.array(z.any().refine((value2) => !z.literal("verified").safeParse(value2).success, "Invalid input: Should NOT be valid against schema")).safeParse(value).success, "Invalid input: Should NOT be valid against schema") }))]).describe("Must also satisfy at least one of these alternatives."))) }).catchall(z.any()).describe("Canonical demographic audience targeting intent with optional constraints on how age may be determined. This is distinct from age_restriction: demographics selects an audience, while age_restriction expresses a legal eligibility or verification floor. Fresh create/update targeting MUST compile exactly or be rejected. During get_products, a seller may offer a different configured predicate only through sparse targeting_resolution modifications on a distinguishable product_id; selecting that product accepts the alternative. Sellers never silently broaden, narrow, default, drop, or substitute the basis.").optional(), "frequency_cap": z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2.").optional(), "property_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a property list for targeting specific properties within this product. The package runs on the intersection of the product's publisher_properties and this list. Sellers SHOULD return a validation error if the product has property_targeting_allowed: false.").optional(), "property_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a property list whose properties must not carry the buyer's ads. Matched properties are removed from delivery. Use for brand-safety do-not-run lists (apps, sites). Exclude wins on overlap with property_list, and applies regardless of the product's property_targeting_allowed flag. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a collection list for including specific collections (programs, publications, channels) within this product. The package runs on the intersection of matched collections and this list. Use for inclusion-based collection targeting. Seller must declare support in get_adcp_capabilities.").optional(), "collection_list_exclude": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": z.string().describe("JWT or other authorization token for accessing the list. Optional if the list is public or caller has implicit access.").optional() }).passthrough().describe("Reference to a collection list for excluding specific collections (programs, publications, channels) from this product. Matched collections must not carry the buyer's ads. Use for brand safety do-not-air lists. Seller must declare support in get_adcp_capabilities.").optional(), "placement_selection": z.record(z.string(), z.any()).and(z.any().superRefine((x, ctx) => {
15032
15015
  const schemas = [z.object({ "mode": z.literal("selected"), "placement_refs": z.array(z.union([z.intersection(z.object({ "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring a publisher-catalog placement is hosted, or the inventory publisher associated with an inline placement. Omitted only for legacy single-publisher product-context references.").optional(), "placement_id": z.string().describe("Placement ID from the publisher's adagents.json placement catalog, or an inline seller-defined placement ID interpreted within the enclosing seller and product context.") }).catchall(z.any()).describe("Legacy-compatible product-context reference to a placement. For publisher-catalog placements, publisher_domain plus placement_id resolves the declaration in that publisher's adagents.json. For seller-inline placements, the enclosing seller and product supply scope. When publisher_domain is omitted on legacy inputs, receivers MAY interpret the ID relative to the enclosing single-publisher product. Use placement-identity.json when a self-contained cross-document identity is required."), z.object({ "publisher_domain": z.any().refine((value) => value !== void 0, "Required") }).passthrough()), z.any().superRefine((x2, ctx2) => {
15033
15016
  const schemas2 = [z.object({ "kind": z.literal("publisher_ref"), "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain whose adagents.json declares placement_id."), "placement_id": z.string().min(1) }).passthrough(), z.object({ "kind": z.literal("seller_inline"), "seller_agent": z.object({ "agent_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("The seller agent's API endpoint URL as declared in the property publisher's adagents.json `authorized_agents[].url`. MUST use the `https://` scheme. Receivers compare this URL against the `authorized_agents` list using the AdCP URL canonicalization rules \u2014 not byte-equality \u2014 and reject mismatches with `seller_not_authorized`. See docs/reference/url-canonicalization."), "id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).min(1).describe("Reserved for a future registry-assigned stable seller identifier. Not used today \u2014 senders MUST NOT populate this field until a registry is defined. When a future release populates both `agent_url` and `id`, `agent_url` remains authoritative and `id` is advisory.").optional() }).passthrough().describe("Sales agent that defines and maintains the inline placement namespace."), "placement_id": z.string().min(1).describe("Stable placement ID within the defining sales agent's namespace. The agent MUST NOT reuse it for a different semantic placement.") }).passthrough()];
15034
15017
  const { errors: errors2, failed: failed2 } = schemas2.reduce(
@@ -15129,7 +15112,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
15129
15112
  });
15130
15113
  }
15131
15114
  }))).min(1).describe("Target users within travel time, distance, or a custom boundary around arbitrary geographic points. Multiple entries use OR semantics \u2014 a user within range of any listed point is eligible. For campaigns targeting 10+ locations, consider using store_catchments with a location catalog instead. Seller must declare support in get_adcp_capabilities.").optional(), "language": z.array(z.string().regex(new RegExp("^(?:[a-z]{2,8}(?:-[A-Z][a-z]{3})?(?:-(?:[A-Z]{2}|[0-9]{3}))?(?:-(?:[a-z0-9]{5,8}|[0-9][a-z0-9]{3}))*(?:-[0-9a-wy-z](?:-[a-z0-9]{2,8})+)*(?:-x(?:-[a-z0-9]{1,8})+)?|x(?:-[a-z0-9]{1,8})+)$")).min(2).max(63).describe("A well-formed BCP 47 language tag used by AdCP only as language identity. Script and region may refine that identity; other valid BCP 47 subtags remain part of tag matching but do not make this a general locale-settings object. It does not determine currency, time zone, number/date formatting, market, or legal jurisdiction. The AdCP canonical wire profile requires lower-case language and variants, title-case script, and upper-case region (for example `en-US`, `zh-Hant-TW`, or `x-private`). RFC 5646 comparisons are case-insensitive and its case regularization is optional; AdCP intentionally requires this stricter single wire spelling and receivers MUST reject differently cased tags rather than silently normalizing them. The schema pattern enforces the AdCP casing profile and extension structure for commonly used tags; conforming receivers additionally validate the complete RFC 5646 grammar and registry rules. Every new AdCP field carrying BCP 47 language identity or a concrete language range MUST reference this schema instead of declaring independent string constraints.")).min(1).describe("Restrict to users with specific language preferences using canonical BCP 47 language ranges. Each buyer range is evaluated against a user's language-preference tag with RFC 4647 section 3.3.1 Basic Filtering: 'fr' matches 'fr', 'fr-CA', and 'fr-FR', while 'fr-CA' matches 'fr-CA' and more-specific descendants but not 'fr' or 'fr-FR'. Values use OR logic.").optional(), "keyword_targets": z.array(z.object({ "keyword": z.string().min(1).describe("The keyword to target"), "match_type": z.enum(["broad", "phrase", "exact"]).describe("Keyword targeting match type. broad: ads may serve on queries semantically related to the keyword. phrase: ads serve when the query contains the keyword phrase. exact: ads serve only when the query matches the keyword exactly."), "bid_price": z.number().gte(0).describe("Per-keyword bid price, denominated in the same currency as the package's pricing option. Overrides the package-level bid_price for this keyword. Inherits the max_bid interpretation from the pricing option: when max_bid is true, this is the keyword's bid ceiling; when false, this is the exact bid. If omitted, the package bid_price applies.").optional() }).passthrough()).min(1).describe("Keyword targeting for search and retail media platforms. Restricts delivery to queries matching the specified keywords. Each keyword is identified by the tuple (keyword, match_type) \u2014 the same keyword string with different match types are distinct targets. Sellers SHOULD reject duplicate (keyword, match_type) pairs within a single request. Seller must declare support in get_adcp_capabilities.").optional(), "negative_keywords": z.array(z.object({ "keyword": z.string().min(1).describe("The keyword to exclude"), "match_type": z.enum(["broad", "phrase", "exact"]).describe("Keyword targeting match type. broad: ads may serve on queries semantically related to the keyword. phrase: ads serve when the query contains the keyword phrase. exact: ads serve only when the query matches the keyword exactly.") }).passthrough().describe("An excluded keyword.")).min(1).describe("Keywords to exclude from delivery. Queries matching these keywords will not trigger the ad. Each negative keyword is identified by the tuple (keyword, match_type). Seller must declare support in get_adcp_capabilities.").optional() }).catchall(z.any()).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "demographics": z.any().refine((value2) => value2 !== void 0, "Required"), "age_restriction": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "demographics": z.any().refine((value) => value !== void 0, "Required"), "age_restriction": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "demographics": z.object({ "age": z.object({ "include_unknown": z.literal(false).optional() }).optional() }).optional() }))]).describe("Unknown-age delivery cannot satisfy a minimum-age eligibility policy. When demographic audience targeting and age_restriction are both present, include_unknown must be false."), z.union([z.any().refine((value) => !z.object({ "age_restriction": z.object({ "verification_required": z.literal(true) }), "demographics": z.object({ "age": z.object({ "accepted_bases": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough() }) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "age_restriction": z.object({ "verification_required": z.literal(true) }), "demographics": z.object({ "age": z.object({ "accepted_bases": z.any().refine((value) => value !== void 0, "Required") }).passthrough() }) }), z.object({ "demographics": z.object({ "age": z.object({ "accepted_bases": z.any().refine((value) => !z.array(z.any().refine((value2) => !z.literal("verified").safeParse(value2).success, "Invalid input: Should NOT be valid against schema")).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional() }).optional() }).optional() }))]).describe("A legal verification requirement always narrows demographic targeting. When the buyer supplies accepted_bases and age_restriction requires verification, verified must be accepted; otherwise the constraints have an empty intersection and the request is invalid."))).describe("Resolved effective buyer-selected targeting, including compatible wholesale signal selections, applied within the product's published targeting contract. Cleared dimensions are omitted; null is invalid in an accepted snapshot.").optional(), "optimization_goals": z.array(z.any().superRefine((x, ctx) => {
15132
- const schemas = [z.object({ "kind": z.literal("metric"), "metric": z.enum(["clicks", "views", "completed_views", "viewed_seconds", "viewable_rate", "engagements", "follows", "saves", "profile_visits", "reach"]), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional(), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.").optional(), "reach_unit": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").optional(), "target_frequency": z.object({ "min": z.number().int().gte(1).optional(), "max": z.number().int().gte(1).optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.") }).passthrough().and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).optional(), "view_duration_seconds": z.number().gt(0).optional(), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough().and(z.intersection(z.union([z.any().refine((value) => !z.object({ "metric": z.literal("viewable_rate") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "metric": z.literal("viewable_rate") }), z.object({ "target": z.object({ "value": z.any().optional() }).optional() }))]), z.any())), z.object({ "kind": z.literal("event"), "event_sources": z.array(z.object({ "event_source_id": z.string().min(1), "event_type": z.enum(["page_view", "view_content", "select_content", "select_item", "search", "share", "add_to_cart", "remove_from_cart", "viewed_cart", "add_to_wishlist", "initiate_checkout", "add_payment_info", "purchase", "refund", "lead", "qualify_lead", "close_convert_lead", "disqualify_lead", "complete_registration", "subscribe", "follow", "content_view", "watch_milestone", "start_trial", "app_install", "app_launch", "contact", "schedule", "donate", "submit_application", "custom"]).describe("Standard marketing event types for event logging, aligned with IAB ECAPI"), "custom_event_name": z.string().min(1).optional(), "value_field": z.string().min(1).optional(), "value_factor": z.number().default(1) }).passthrough()).min(1), "target": z.object({ "kind": z.literal("maximize_value") }).passthrough().optional(), "attribution_window": z.object({ "post_click": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-click attribution window. Conversions occurring within this duration after a click are attributed to the ad.").optional(), "post_view": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-view attribution window. Conversions occurring within this duration after an ad impression (without click) are attributed to the ad.").optional(), "model": z.enum(["last_touch", "first_touch", "linear", "time_decay", "data_driven"]).describe("Attribution model used to assign credit when multiple touchpoints exist. SHOULD be populated when committing to a specific model; when absent, the seller's default applies.").optional() }).catchall(z.any()).describe("Describes the attribution methodology and lookback windows used for conversion measurement. Enables cross-platform comparison by making attribution methodology transparent. Used as a `$ref` from `optimization-goal.json` (buyer's optimization-time attribution choice), `get-media-buy-delivery-response.json` (seller-declared attribution methodology in delivery reports), and similar surfaces. All fields are optional individually but at least one of `post_click`, `post_view`, or `model` SHOULD be populated; absence of `model` means the seller's default attribution model applies (typically `last_touch` per industry convention) \u2014 sellers SHOULD populate `model` explicitly when committing to a specific methodology.").optional(), "priority": z.number().int().gte(1).optional() }).passthrough(), z.object({ "kind": z.literal("vendor_metric"), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "metric_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).min(1).max(64).describe("Identifier for a vendor-defined metric within the vendor's vocabulary. Stable lookup key; the vendor publishes the canonical list (with category, methodology, and standard alignment) in `brand.json` `agents[type='measurement']`. Lowercase with underscores so a future enum promotion into `available-metric.json` is a literal string lift. Identifier is namespaced by the vendor \u2014 the same `metric_id` may mean different things in different vendors' vocabularies."), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough()];
15115
+ const schemas = [z.object({ "kind": z.literal("metric"), "metric": z.enum(["clicks", "views", "completed_views", "viewed_seconds", "viewable_rate", "engagements", "follows", "saves", "profile_visits", "reach"]), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional(), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.").optional(), "reach_unit": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").optional(), "target_frequency": z.object({ "min": z.number().int().gte(1).optional(), "max": z.number().int().gte(1).optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.") }).passthrough().and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).optional(), "view_duration_seconds": z.number().gt(0).optional(), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough().and(z.intersection(z.union([z.any().refine((value) => !z.object({ "metric": z.literal("viewable_rate") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "metric": z.literal("viewable_rate") }), z.object({ "target": z.object({ "value": z.any().optional() }).optional() }))]), z.any())), z.object({ "kind": z.literal("event"), "event_sources": z.array(z.object({ "event_source_id": z.string().min(1), "event_type": z.enum(["page_view", "view_content", "select_content", "select_item", "search", "share", "add_to_cart", "remove_from_cart", "viewed_cart", "add_to_wishlist", "initiate_checkout", "add_payment_info", "purchase", "refund", "lead", "qualify_lead", "close_convert_lead", "disqualify_lead", "complete_registration", "subscribe", "follow", "content_view", "watch_milestone", "start_trial", "app_install", "app_launch", "contact", "schedule", "donate", "submit_application", "custom"]).describe("Standard marketing event types for event logging, aligned with IAB ECAPI"), "custom_event_name": z.string().min(1).optional(), "value_field": z.string().min(1).optional(), "value_factor": z.number().default(1) }).passthrough()).min(1), "target": z.object({ "kind": z.literal("maximize_value") }).passthrough().optional(), "attribution_window": z.object({ "post_click": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-click attribution window. Conversions occurring within this duration after a click are attributed to the ad.").optional(), "post_view": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-view attribution window. Conversions occurring within this duration after an ad impression (without click) are attributed to the ad.").optional(), "model": z.enum(["last_touch", "first_touch", "linear", "time_decay", "data_driven"]).describe("Attribution model used to assign credit when multiple touchpoints exist. SHOULD be populated when committing to a specific model; when absent, the seller's default applies.").optional() }).catchall(z.any()).describe("Describes the attribution methodology and lookback windows used for conversion measurement. Enables cross-platform comparison by making attribution methodology transparent. Used as a `$ref` from `optimization-goal.json` (buyer's optimization-time attribution choice), `get-media-buy-delivery-response.json` (seller-declared attribution methodology in delivery reports), and similar surfaces. All fields are optional individually but at least one of `post_click`, `post_view`, or `model` SHOULD be populated; absence of `model` means the seller's default attribution model applies (typically `last_touch` per industry convention) \u2014 sellers SHOULD populate `model` explicitly when committing to a specific methodology.").optional(), "priority": z.number().int().gte(1).optional() }).passthrough(), z.object({ "kind": z.literal("vendor_metric"), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "metric_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).min(1).max(64).describe("Identifier for a vendor-defined metric within the vendor's vocabulary. Stable lookup key; the vendor publishes the canonical list (with category, methodology, and standard alignment) in `brand.json` `agents[type='measurement']`. Lowercase with underscores so a future enum promotion into `available-metric.json` is a literal string lift. Identifier is namespaced by the vendor \u2014 the same `metric_id` may mean different things in different vendors' vocabularies."), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough()];
15133
15116
  const { errors, failed } = schemas.reduce(
15134
15117
  ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
15135
15118
  errors: [...errors2, ...result.error.issues],
@@ -15178,7 +15161,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
15178
15161
  message: "Invalid input: Should pass single schema. Passed " + passed
15179
15162
  });
15180
15163
  }
15181
- })).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").optional(), "accepted_attestation_claim_types": z.array(z.string().refine(adcpJsonSchemaUri, "Invalid URI")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.object({ "independent_attestation_required": z.literal(true) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "independent_attestation_required": z.literal(true) }), z.object({ "accepted_attestation_issuers": z.any().refine((value) => value !== void 0, "Required") }).passthrough())])).describe("Buyer evidence-admissibility policy carried into the accepted purchase snapshot.").optional(), "audience_evidence_pins": z.array(z.object({ "evidence_id": z.string().min(1), "snapshot_id": z.string().min(1), "version": z.string().min(1), "content_digest": z.string().regex(new RegExp("^sha256:[a-f0-9]{64}$")), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().describe("Buyer-authored pin to one exact immutable audience-evidence snapshot selected during discovery. Sellers MUST match all four fields against a single published snapshot; they MUST reject the package rather than substitute a newer version or reuse snapshot_id with changed content. A confirmed package MUST return the same identity in audience_evidence_selections with decision_use package_construction.")).min(1).describe("Exact immutable audience-evidence snapshots selected for package construction.").optional(), "agency_estimate_number": z.string().max(100).describe("Package-level agency estimate or authorization reference.").optional(), "context": z.record(z.string(), z.any()).describe("Opaque buyer package correlation preserved in the accepted snapshot and readback.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional(), "measurement_terms": z.object({ "billing_measurement": z.object({ "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "max_variance_percent": z.number().gte(0).lt(100).optional(), "measurement_window": z.string().min(1).optional(), "finalization_deadline_hours": z.number().int().gte(0).optional() }).passthrough().optional(), "makegood_policy": z.object({ "available_remedies": z.array(z.enum(["additional_delivery", "credit", "invoice_adjustment"]).describe("Remedy types available when a performance standard or billing measurement threshold is breached.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!") }).passthrough().optional() }).passthrough().describe("Published or negotiated billing-measurement and makegood terms for this purchase. Direct buyers may omit this to inherit the product default; accepted proposal snapshots preserve the resolved terms.").optional(), "performance_standards": z.array(z.object({ "metric": z.enum(["viewability", "ivt", "completion_rate", "brand_safety", "attention_score"]).describe("Performance metrics that support rate thresholds on media buys \u2014 the verification subset of the broader metric vocabulary. Each metric specifies whether its threshold is a floor (must exceed) or ceiling (must not exceed). Shared values with `available-metric.json` mirror the delivery vocabulary (`viewability` \u2192 `viewable_rate` family, `completion_rate` \u2192 same name); verification-only values (`ivt`, `brand_safety`, `attention_score`) are typically vendor-attested and do not appear in `available-metric.json` because they're not seller-reportable scalars \u2014 they flow through `vendor_metric_values` or vendor-scope `committed_metrics` entries with the matching `performance_standard.vendor` BrandRef anchoring identity."), "threshold": z.number().gte(0).lte(1), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional(), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.") }).passthrough().describe("Compact committed metric threshold with resolvable vendor identity and no creative or brand-asset graph.")).min(1).describe("Published or negotiated metric thresholds and measurement vendors. Direct buyers may omit this to inherit the product defaults; accepted proposal snapshots preserve every applicable standard.").optional() }).passthrough().describe("One resolved canonical product selection in a compact proposal or accepted commercial snapshot. Request-side buy_products selections use product-purchase-input.json. This strict snapshot shape contains effective non-null targeting and resolved inherited terms. Creative content and creative assignments are intentionally absent."), z.object({ "product_id": z.any().refine((value) => value !== void 0, "Required"), "pricing_option_id": z.any().refine((value) => value !== void 0, "Required"), "pricing": z.any().refine((value) => value !== void 0, "Required"), "start_time": z.any().refine((value) => value !== void 0, "Required"), "end_time": z.any().refine((value) => value !== void 0, "Required") }).passthrough())).min(1).describe("Exact canonical product, pricing, format, catalog, budget, targeting, bidding, optimization, resolved flight, measurement, and performance terms in the commercial envelope."), "start_time": z.any().superRefine((x, ctx) => {
15164
+ })).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").optional(), "accepted_attestation_claim_types": z.array(z.string().refine(adcpJsonSchemaUri, "Invalid URI")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.object({ "independent_attestation_required": z.literal(true) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "independent_attestation_required": z.literal(true) }), z.object({ "accepted_attestation_issuers": z.any().refine((value) => value !== void 0, "Required") }).passthrough())]).describe("Must also satisfy at least one of these alternatives.")).describe("Buyer evidence-admissibility policy carried into the accepted purchase snapshot.").optional(), "audience_evidence_pins": z.array(z.object({ "evidence_id": z.string().min(1), "snapshot_id": z.string().min(1), "version": z.string().min(1), "content_digest": z.string().regex(new RegExp("^sha256:[a-f0-9]{64}$")), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().describe("Buyer-authored pin to one exact immutable audience-evidence snapshot selected during discovery. Sellers MUST match all four fields against a single published snapshot; they MUST reject the package rather than substitute a newer version or reuse snapshot_id with changed content. A confirmed package MUST return the same identity in audience_evidence_selections with decision_use package_construction.")).min(1).describe("Exact immutable audience-evidence snapshots selected for package construction.").optional(), "agency_estimate_number": z.string().max(100).describe("Package-level agency estimate or authorization reference.").optional(), "context": z.record(z.string(), z.any()).describe("Opaque buyer package correlation preserved in the accepted snapshot and readback.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional(), "measurement_terms": z.object({ "billing_measurement": z.object({ "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "max_variance_percent": z.number().gte(0).lt(100).optional(), "measurement_window": z.string().min(1).optional(), "finalization_deadline_hours": z.number().int().gte(0).optional() }).passthrough().optional(), "makegood_policy": z.object({ "available_remedies": z.array(z.enum(["additional_delivery", "credit", "invoice_adjustment"]).describe("Remedy types available when a performance standard or billing measurement threshold is breached.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!") }).passthrough().optional() }).passthrough().describe("Published or negotiated billing-measurement and makegood terms for this purchase. Direct buyers may omit this to inherit the product default; accepted proposal snapshots preserve the resolved terms.").optional(), "performance_standards": z.array(z.object({ "metric": z.enum(["viewability", "ivt", "completion_rate", "brand_safety", "attention_score"]).describe("Performance metrics that support rate thresholds on media buys \u2014 the verification subset of the broader metric vocabulary. Each metric specifies whether its threshold is a floor (must exceed) or ceiling (must not exceed). Shared values with `available-metric.json` mirror the delivery vocabulary (`viewability` \u2192 `viewable_rate` family, `completion_rate` \u2192 same name); verification-only values (`ivt`, `brand_safety`, `attention_score`) are typically vendor-attested and do not appear in `available-metric.json` because they're not seller-reportable scalars \u2014 they flow through `vendor_metric_values` or vendor-scope `committed_metrics` entries with the matching `performance_standard.vendor` BrandRef anchoring identity."), "threshold": z.number().gte(0).lte(1), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional(), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.") }).passthrough().describe("Compact committed metric threshold with resolvable vendor identity and no creative or brand-asset graph.")).min(1).describe("Published or negotiated metric thresholds and measurement vendors. Direct buyers may omit this to inherit the product defaults; accepted proposal snapshots preserve every applicable standard.").optional() }).passthrough().describe("One resolved canonical product selection in a compact proposal or accepted commercial snapshot. Request-side buy_products selections use product-purchase-input.json. This strict snapshot shape contains effective non-null targeting and resolved inherited terms. Creative content and creative assignments are intentionally absent."), z.object({ "product_id": z.any().refine((value) => value !== void 0, "Required"), "pricing_option_id": z.any().refine((value) => value !== void 0, "Required"), "pricing": z.any().refine((value) => value !== void 0, "Required"), "start_time": z.any().refine((value) => value !== void 0, "Required"), "end_time": z.any().refine((value) => value !== void 0, "Required") }).passthrough())).min(1).describe("Exact canonical product, pricing, format, catalog, budget, targeting, bidding, optimization, resolved flight, measurement, and performance terms in the commercial envelope."), "start_time": z.any().superRefine((x, ctx) => {
15182
15165
  const schemas = [z.literal("asap").describe("Start campaign as soon as possible"), z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")];
15183
15166
  const { errors, failed } = schemas.reduce(
15184
15167
  ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
@@ -15203,9 +15186,9 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
15203
15186
  message: "Invalid input: Should pass single schema. Passed " + passed
15204
15187
  });
15205
15188
  }
15206
- }).describe("Campaign start timing: 'asap' or ISO 8601 date-time"), "end_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), "total_budget": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().optional(), "daily_budget_cap": z.number().gte(0).describe("Hard aggregate daily spend ceiling accepted as part of these terms. It bounds total spend without creating purchase allocations.").optional(), "frequency_cap": z.intersection(z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2."), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()).describe("Hard MediaBuy-level cap accepted as part of these terms. One counter aggregates exposures across every purchase; purchase targeting caps remain independently binding.").optional(), "budget_cap_timezone": z.string().min(1).describe("Shared IANA calendar-day boundary for aggregate and purchase daily caps in these terms.").optional(), "budget_allocation": z.any().superRefine((x, ctx) => {
15189
+ }).describe("Campaign start timing: 'asap' or ISO 8601 date-time"), "end_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), "total_budget": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().optional(), "daily_budget_cap": z.number().gte(0).describe("Hard aggregate daily spend ceiling accepted as part of these terms. It bounds total spend without creating purchase allocations.").optional(), "frequency_cap": z.intersection(z.object({ "suppress": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.').optional(), "suppress_minutes": z.number().gte(0).describe("Deprecated \u2014 use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).").optional(), "max_impressions": z.number().int().gte(1).describe("Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window. campaign applies across the owning field's full flight: the package flight for a targeting overlay, or the MediaBuy flight for a root cap.").optional(), "per": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").describe("Entity granularity for impression counting. Required when max_impressions is set.").optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe('Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.').optional() }).catchall(z.any()).and(z.union([z.object({ "suppress": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "suppress_minutes": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "max_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required"), "per": z.any().refine((value) => value !== void 0, "Required"), "window": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.intersection(z.union([z.any().refine((value) => !z.object({ "per": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "per": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), z.union([z.any().refine((value) => !z.object({ "window": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "window": z.any().refine((value) => value !== void 0, "Required"), "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])))).describe("Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set. Field location determines scope; this value has no scope discriminator. The MediaBuy root uses the narrower media-buy-frequency-cap schema, which permits maximum impressions only in 3.2."), z.object({ "max_impressions": z.any().refine((value) => value !== void 0, "Required") }).passthrough()).describe("Hard MediaBuy-level cap accepted as part of these terms. One counter aggregates exposures across every purchase; purchase targeting caps remain independently binding.").optional(), "budget_cap_timezone": z.string().min(1).describe("Shared IANA calendar-day boundary for aggregate and purchase daily caps in these terms.").optional(), "budget_allocation": z.any().superRefine((x, ctx) => {
15207
15190
  const schemas = [z.object({ "mode": z.literal("fixed") }).passthrough(), z.object({ "mode": z.literal("seller_optimized"), "optimization_goals": z.array(z.any().superRefine((x2, ctx2) => {
15208
- const schemas2 = [z.object({ "kind": z.literal("metric"), "metric": z.enum(["clicks", "views", "completed_views", "viewed_seconds", "viewable_rate", "engagements", "follows", "saves", "profile_visits", "reach"]), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional(), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.").optional(), "reach_unit": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").optional(), "target_frequency": z.object({ "min": z.number().int().gte(1).optional(), "max": z.number().int().gte(1).optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.") }).passthrough().and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).optional(), "view_duration_seconds": z.number().gt(0).optional(), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough().and(z.intersection(z.union([z.any().refine((value) => !z.object({ "metric": z.literal("viewable_rate") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "metric": z.literal("viewable_rate") }), z.object({ "target": z.object({ "value": z.any().optional() }).optional() }))]), z.any())), z.object({ "kind": z.literal("event"), "event_sources": z.array(z.object({ "event_source_id": z.string().min(1), "event_type": z.enum(["page_view", "view_content", "select_content", "select_item", "search", "share", "add_to_cart", "remove_from_cart", "viewed_cart", "add_to_wishlist", "initiate_checkout", "add_payment_info", "purchase", "refund", "lead", "qualify_lead", "close_convert_lead", "disqualify_lead", "complete_registration", "subscribe", "follow", "content_view", "watch_milestone", "start_trial", "app_install", "app_launch", "contact", "schedule", "donate", "submit_application", "custom"]).describe("Standard marketing event types for event logging, aligned with IAB ECAPI"), "custom_event_name": z.string().min(1).optional(), "value_field": z.string().min(1).optional(), "value_factor": z.number().default(1) }).passthrough()).min(1), "target": z.object({ "kind": z.literal("maximize_value") }).passthrough().optional(), "attribution_window": z.object({ "post_click": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-click attribution window. Conversions occurring within this duration after a click are attributed to the ad.").optional(), "post_view": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-view attribution window. Conversions occurring within this duration after an ad impression (without click) are attributed to the ad.").optional(), "model": z.enum(["last_touch", "first_touch", "linear", "time_decay", "data_driven"]).describe("Attribution model used to assign credit when multiple touchpoints exist. SHOULD be populated when committing to a specific model; when absent, the seller's default applies.").optional() }).catchall(z.any()).describe("Describes the attribution methodology and lookback windows used for conversion measurement. Enables cross-platform comparison by making attribution methodology transparent. Used as a `$ref` from `optimization-goal.json` (buyer's optimization-time attribution choice), `get-media-buy-delivery-response.json` (seller-declared attribution methodology in delivery reports), and similar surfaces. All fields are optional individually but at least one of `post_click`, `post_view`, or `model` SHOULD be populated; absence of `model` means the seller's default attribution model applies (typically `last_touch` per industry convention) \u2014 sellers SHOULD populate `model` explicitly when committing to a specific methodology.").optional(), "priority": z.number().int().gte(1).optional() }).passthrough(), z.object({ "kind": z.literal("vendor_metric"), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "metric_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).min(1).max(64).describe("Identifier for a vendor-defined metric within the vendor's vocabulary. Stable lookup key; the vendor publishes the canonical list (with category, methodology, and standard alignment) in `brand.json` `agents[type='measurement']`. Lowercase with underscores so a future enum promotion into `available-metric.json` is a literal string lift. Identifier is namespaced by the vendor \u2014 the same `metric_id` may mean different things in different vendors' vocabularies."), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough()];
15191
+ const schemas2 = [z.object({ "kind": z.literal("metric"), "metric": z.enum(["clicks", "views", "completed_views", "viewed_seconds", "viewable_rate", "engagements", "follows", "saves", "profile_visits", "reach"]), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional(), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.").optional(), "reach_unit": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").optional(), "target_frequency": z.object({ "min": z.number().int().gte(1).optional(), "max": z.number().int().gte(1).optional(), "window": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.") }).passthrough().and(z.union([z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).optional(), "view_duration_seconds": z.number().gt(0).optional(), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough().and(z.intersection(z.union([z.any().refine((value) => !z.object({ "metric": z.literal("viewable_rate") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "metric": z.literal("viewable_rate") }), z.object({ "target": z.object({ "value": z.any().optional() }).optional() }))]), z.any())), z.object({ "kind": z.literal("event"), "event_sources": z.array(z.object({ "event_source_id": z.string().min(1), "event_type": z.enum(["page_view", "view_content", "select_content", "select_item", "search", "share", "add_to_cart", "remove_from_cart", "viewed_cart", "add_to_wishlist", "initiate_checkout", "add_payment_info", "purchase", "refund", "lead", "qualify_lead", "close_convert_lead", "disqualify_lead", "complete_registration", "subscribe", "follow", "content_view", "watch_milestone", "start_trial", "app_install", "app_launch", "contact", "schedule", "donate", "submit_application", "custom"]).describe("Standard marketing event types for event logging, aligned with IAB ECAPI"), "custom_event_name": z.string().min(1).optional(), "value_field": z.string().min(1).optional(), "value_factor": z.number().default(1) }).passthrough()).min(1), "target": z.object({ "kind": z.literal("maximize_value") }).passthrough().optional(), "attribution_window": z.object({ "post_click": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-click attribution window. Conversions occurring within this duration after a click are attributed to the ad.").optional(), "post_view": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, time budgets, and other time-based settings. When unit is 'campaign', interval must be 1 \u2014 the window spans the full campaign flight.").describe("Post-view attribution window. Conversions occurring within this duration after an ad impression (without click) are attributed to the ad.").optional(), "model": z.enum(["last_touch", "first_touch", "linear", "time_decay", "data_driven"]).describe("Attribution model used to assign credit when multiple touchpoints exist. SHOULD be populated when committing to a specific model; when absent, the seller's default applies.").optional() }).catchall(z.any()).describe("Describes the attribution methodology and lookback windows used for conversion measurement. Enables cross-platform comparison by making attribution methodology transparent. Used as a `$ref` from `optimization-goal.json` (buyer's optimization-time attribution choice), `get-media-buy-delivery-response.json` (seller-declared attribution methodology in delivery reports), and similar surfaces. All fields are optional individually but at least one of `post_click`, `post_view`, or `model` SHOULD be populated; absence of `model` means the seller's default attribution model applies (typically `last_touch` per industry convention) \u2014 sellers SHOULD populate `model` explicitly when committing to a specific methodology.").optional(), "priority": z.number().int().gte(1).optional() }).passthrough(), z.object({ "kind": z.literal("vendor_metric"), "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "metric_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).min(1).max(64).describe("Identifier for a vendor-defined metric within the vendor's vocabulary. Stable lookup key; the vendor publishes the canonical list (with category, methodology, and standard alignment) in `brand.json` `agents[type='measurement']`. Lowercase with underscores so a future enum promotion into `available-metric.json` is a literal string lift. Identifier is namespaced by the vendor \u2014 the same `metric_id` may mean different things in different vendors' vocabularies."), "target": z.object({ "kind": z.literal("threshold_rate"), "value": z.number().gt(0) }).passthrough().optional(), "priority": z.number().int().gte(1).optional() }).passthrough()];
15209
15192
  const { errors: errors2, failed: failed2 } = schemas2.reduce(
15210
15193
  ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
15211
15194
  errors: [...errors3, ...result.error.issues],
@@ -15279,7 +15262,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
15279
15262
  });
15280
15263
  }
15281
15264
  })).describe("One metric the seller commits to report for a commercial product term. Vendor identity uses BrandKey so the compact lifecycle does not inline brand or provenance documents.")).min(1) }).passthrough()).min(1).describe("Binding reporting contract keyed by position in purchases. Amendments preserve prior entries and add metrics with effective_at; seller-assigned package IDs live in the execution binding, outside this digest.").optional(), "cancellation_terms": z.object({ "effective_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), "fee": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().optional(), "reason": z.string().min(1).max(500).optional() }).passthrough().optional(), "change_terms": z.array(z.object({ "term_id": z.string().regex(new RegExp("^[A-Za-z0-9_.:-]+$")), "action": z.enum(["pause", "resume", "cancel", "extend_flight", "shorten_flight", "update_flight_dates", "increase_budget", "decrease_budget", "reallocate_budget", "update_budget_allocation", "update_targeting", "update_pacing", "update_bidding", "update_frequency_caps", "update_media_buy_frequency_cap", "update_catalog_assignments", "update_keywords", "update_optimization_goals", "update_impression_goal", "update_spend_target", "update_reporting_webhook", "replace_creative", "update_creative_assignments", "remove_creative", "add_packages", "remove_packages"]).describe("Fine-grained MediaBuy action vocabulary for compact product and lifecycle surfaces. Deprecated coarse 3.x actions are absent."), "service_mode": z.enum(["self_serve", "conditional_self_serve", "seller_managed", "requires_approval"]).describe("How a seller honors a routed compact-lifecycle action."), "allowed_statuses": z.array(z.enum(["pending_creatives", "pending_start", "active", "paused"])).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Non-terminal MediaBuy statuses in which this negotiated right may be exercised. When absent, the right applies in every non-terminal status where the canonical action itself is meaningful. This field describes contractual lifecycle scope; available_actions[] remains authoritative for the current instant.").optional(), "processing_sla": z.object({ "response_max": z.string().regex(new RegExp("^P(?!$)(\\d+Y)?(\\d+M)?(\\d+D)?(T(\\d+H)?(\\d+M)?(\\d+S)?)?$")).describe("Maximum elapsed time from when the buyer issues the action to when the seller acknowledges receipt (mode-appropriate: synchronous response for self_serve, tolerance decision for conditional_self_serve, or queue acknowledgement for seller_managed and legacy requires_approval). Sellers include weekends and non-working periods in the maximum. ISO 8601 duration.").optional(), "completion_max": z.string().regex(new RegExp("^P(?!$)(\\d+Y)?(\\d+M)?(\\d+D)?(T(\\d+H)?(\\d+M)?(\\d+S)?)?$")).describe("Maximum elapsed time from buyer issuing the action to the seller completing it (mutation applied, proposal finalized, or seller-managed decision resolved). Sellers include weekends and non-working periods in the maximum. ISO 8601 duration.").optional() }).passthrough().describe("Binding elapsed-time acknowledgement and completion commitment. Sellers account for weekends and non-working periods when declaring the maximum.").optional(), "conditions": z.array(z.string().regex(new RegExp("^[A-Za-z0-9][A-Za-z0-9_.:-]{0,199}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Opaque stable condition identifiers defined by terms_ref or bilateral commercial documentation. Implementations compare identifiers; they MUST NOT execute or interpret them as instructions.").optional(), "constraints": z.any().superRefine((x, ctx) => {
15282
- const schemas = [z.object({ "kind": z.literal("budget"), "max_delta_amount": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().describe("Maximum absolute amount by which the affected budget may change in the direction named by the action.").optional(), "max_delta_percent": z.number().gte(0).describe("Maximum percentage change relative to the current committed value. Values above 100 are valid for increases greater than the current value.").optional(), "min_result_amount": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().describe("Minimum resulting committed value after the change.").optional(), "max_result_amount": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().describe("Maximum resulting committed value after the change.").optional() }).passthrough().and(z.union([z.object({ "max_delta_amount": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_delta_percent": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "min_result_amount": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_result_amount": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])), z.object({ "kind": z.literal("flight"), "max_change": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("Maximum extension, shortening, or shift in the direction named by the action.").optional(), "earliest_result": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "latest_result": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "minimum_notice": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("Minimum elapsed notice before the requested flight change may take effect.").optional() }).passthrough().and(z.union([z.object({ "max_change": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "earliest_result": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "latest_result": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "minimum_notice": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])), z.object({ "kind": z.literal("package_count"), "max_additions": z.number().int().gte(0).describe("Maximum packages that may be added by one exercise of the right.").optional(), "max_removals": z.number().int().gte(0).describe("Maximum packages that may be removed by one exercise of the right.").optional(), "max_result_count": z.number().int().gte(0).describe("Maximum active package count after the change.").optional() }).passthrough().and(z.union([z.object({ "max_additions": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_removals": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_result_count": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])), z.object({ "kind": z.literal("effective_timing"), "minimum_notice": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("Minimum elapsed notice before pause, resume, cancellation, or another operational action may take effect.").optional(), "earliest_effective_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "latest_effective_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() }).passthrough().and(z.union([z.object({ "minimum_notice": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "earliest_effective_at": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "latest_effective_at": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]))];
15265
+ const schemas = [z.object({ "kind": z.literal("budget"), "max_delta_amount": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().describe("Maximum absolute amount by which the affected budget may change in the direction named by the action.").optional(), "max_delta_percent": z.number().gte(0).describe("Maximum percentage change relative to the current committed value. Values above 100 are valid for increases greater than the current value.").optional(), "min_result_amount": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().describe("Minimum resulting committed value after the change.").optional(), "max_result_amount": z.object({ "amount": z.number().gte(0), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().describe("Maximum resulting committed value after the change.").optional() }).passthrough().and(z.union([z.object({ "max_delta_amount": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_delta_percent": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "min_result_amount": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_result_amount": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")), z.object({ "kind": z.literal("flight"), "max_change": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("Maximum extension, shortening, or shift in the direction named by the action.").optional(), "earliest_result": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "latest_result": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "minimum_notice": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("Minimum elapsed notice before the requested flight change may take effect.").optional() }).passthrough().and(z.union([z.object({ "max_change": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "earliest_result": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "latest_result": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "minimum_notice": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")), z.object({ "kind": z.literal("package_count"), "max_additions": z.number().int().gte(0).describe("Maximum packages that may be added by one exercise of the right.").optional(), "max_removals": z.number().int().gte(0).describe("Maximum packages that may be removed by one exercise of the right.").optional(), "max_result_count": z.number().int().gte(0).describe("Maximum active package count after the change.").optional() }).passthrough().and(z.union([z.object({ "max_additions": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_removals": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max_result_count": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")), z.object({ "kind": z.literal("effective_timing"), "minimum_notice": z.object({ "interval": z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": z.enum(["seconds", "minutes", "hours", "days", "campaign"]).describe("Time unit. 'seconds' for sub-minute precision. 'campaign' spans the full campaign flight.") }).passthrough().describe("Minimum elapsed notice before pause, resume, cancellation, or another operational action may take effect.").optional(), "earliest_effective_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "latest_effective_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional() }).passthrough().and(z.union([z.object({ "minimum_notice": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "earliest_effective_at": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "latest_effective_at": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives."))];
15283
15266
  const { errors, failed } = schemas.reduce(
15284
15267
  ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
15285
15268
  errors: [...errors2, ...result.error.issues],
@@ -15303,8 +15286,8 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
15303
15286
  message: "Invalid input: Should pass single schema. Passed " + passed
15304
15287
  });
15305
15288
  }
15306
- }).describe("Portable bounds that buyer and seller SDKs can preflight. Omission means no machine-readable bound was promised; opaque conditions remain unevaluated.").optional(), "terms_ref": z.string().min(1).max(1e3).describe("Stable contract reference. Resolving it cannot expand the typed right and MUST use the caller's normal authenticated contract-document path, never ambient seller credentials.").optional(), "description": z.string().min(1).max(1e3).describe("Display-only summary; it cannot grant authority, add an action, or override typed fields.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().describe("A proposal-bound buyer change right. It binds to the resulting media buy and account, not personally to the caller, and may be exercised by any caller admitted by both seller account authorization and applicable signed governance delegation.")).min(1).describe("Binding buyer change rights included in the commercial envelope and therefore covered by terms_digest. Entries are uniquely keyed by action. When this field is present, an omitted action is not a negotiated change right. Omission of the entire field means legacy-unspecified rights, not a prohibition.").optional() }).passthrough().describe("Complete typed commercial envelope for a compact-lifecycle proposal. This is the authoritative audit and refinement snapshot; allocations and narrative fields are explanatory views rather than substitutes for these terms."), "terms_digest": z.string().regex(new RegExp("^sha256:[A-Za-z0-9_-]{43}$")).describe("Base64url SHA-256 digest of the RFC 8785 JCS serialization of commercial_terms, prefixed with sha256:."), "insertion_order": z.object({ "io_id": z.string().max(255).describe("Unique identifier for this insertion order. Referenced by io_acceptance on create_media_buy."), "terms": z.object({ "advertiser": z.string().max(500).describe("Advertiser name or identifier").optional(), "publisher": z.string().max(500).describe("Publisher name or identifier").optional(), "total_budget": z.object({ "amount": z.number().gte(0), "currency": z.string().min(3).max(3).describe("ISO 4217 currency code") }).describe("Total committed budget").optional(), "flight_start": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "flight_end": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "payment_terms": z.enum(["net_30", "net_60", "net_90", "prepaid", "due_on_receipt"]).describe("Payment terms").optional() }).catchall(z.any()).describe("Summary fields echoed from the committed proposal for agent verification. Buyer agents use these to confirm the IO matches what was negotiated before a human signs. These are read-only summaries, not negotiation surfaces \u2014 deal terms live on products and packages.").optional(), "terms_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to a human-readable document containing the full insertion order terms").optional(), "signing_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to an electronic signing service (e.g., DocuSign) for human signature workflows. When present, a human must sign before the buyer agent can proceed with create_media_buy.").optional(), "requires_signature": z.boolean().describe("Whether the buyer must accept this IO before creating a media buy. When true, create_media_buy requires an io_acceptance referencing this io_id.") }).catchall(z.any()).describe("A signing wrapper attached to a committed proposal. The IO does not introduce new deal terms \u2014 all negotiated terms (performance standards, measurement terms, cancellation policy, pricing) live on the product and package. The IO exists for human signature workflows and provides summary fields so buyer agents can verify the IO matches the committed proposal before a human signs.").optional(), "total_budget_guidance": z.object({ "min": z.number().gte(0).optional(), "recommended": z.number().gte(0).optional(), "max": z.number().gte(0).optional(), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().and(z.union([z.object({ "recommended": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Optional budget guidance for this proposal \u2014 the planning answer to criteria.outcome_target and to open-budget briefs. commercial_terms.total_budget remains the concrete figure the plan is priced at; this band expresses the seller's recommended range around it. When criteria.outcome_target carries cost_per, the cost answer is commercial_terms.bidding.cost_per and this band's currency equals cost_per.currency.").optional(), "forecast": z.object({ "points": z.array(z.object({ "label": z.string().max(128).optional(), "budget": z.number().gte(0).optional(), "product_id": z.string().optional(), "dimensions": z.array(z.any().superRefine((x, ctx) => {
15307
- const schemas = [z.object({ "kind": z.literal("geo").describe("Dimension family discriminator."), "geo_level": z.enum(["country", "region", "metro", "postal_area"]).describe("Geographic level for this forecast point."), "system": z.string().describe("Classification system for metro or postal_area levels. Required when geo_level is 'metro' or 'postal_area'. Metro rows use metro-system enum values such as 'nielsen_dma'; native postal rows use country-local postal-system enum values such as 'zip' with country 'US'; deprecated legacy postal rows may use legacy-postal-system enum values such as 'us_zip'. Omit for country and region rows.").optional(), "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code. Required for native postal_area rows and omitted for legacy postal rows, metro rows, country rows, and region rows.").optional(), "geo_code": z.string().describe("Geographic code within the level and system. Country: ISO 3166-1 alpha-2 ('US'). Region: ISO 3166-2 with country prefix ('US-CA'). Metro/postal: system-specific code ('501', '10001')."), "geo_name": z.string().describe("Human-readable geographic name (e.g., 'United States', 'California', 'New York DMA').").optional() }).passthrough().and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("country") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("country") }), z.object({ "geo_code": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code.").optional() }))]), z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("region") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("region") }), z.object({ "geo_code": z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$")).describe("ISO 3166-2 subdivision code.").optional() }))])), z.intersection(z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("metro") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("metro") }), z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')") }))]), z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("postal_area") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("postal_area") }), z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })])).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom."), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system.") })]))])))).describe("A geographic dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("placement").describe("Dimension family discriminator."), "placement_ref": z.object({ "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring a publisher-catalog placement is hosted, or the inventory publisher associated with an inline placement. Omitted only for legacy single-publisher product-context references.").optional(), "placement_id": z.string().describe("Placement ID from the publisher's adagents.json placement catalog, or an inline seller-defined placement ID interpreted within the enclosing seller and product context.") }).catchall(z.any()).describe("Structured placement reference for this forecast row. References an entry from the product's placements array."), "placement_name": z.string().describe("Human-readable placement name, useful when the buyer has not resolved the placement catalog.").optional() }).passthrough().describe("A placement dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("device_type").describe("Dimension family discriminator."), "device_type": z.enum(["desktop", "mobile", "tablet", "ctv", "dooh", "unknown"]).describe("Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) \u2192 mobile, 2 (PC) \u2192 desktop, 4 (Phone) \u2192 mobile, 5 (Tablet) \u2192 tablet, 6 (Connected Device) \u2192 ctv, 7 (Set Top Box) \u2192 ctv. DOOH inventory uses dooh.") }).passthrough().describe("A device form-factor dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("device_platform").describe("Dimension family discriminator."), "device_platform": z.enum(["ios", "android", "windows", "macos", "linux", "chromeos", "tvos", "tizen", "webos", "fire_os", "roku_os", "unknown"]).describe("Operating system platforms for device targeting. Browser values from Sec-CH-UA-Platform standard, extended for CTV.") }).passthrough().describe("An operating-system or platform dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("audience").describe("Dimension family discriminator."), "audience_id": z.string().describe("Audience segment identifier for this forecast row."), "audience_source": z.enum(["synced", "platform", "third_party", "lookalike", "retargeting", "unknown"]).describe("Origin of the audience segment."), "audience_name": z.string().describe("Human-readable audience segment name.").optional() }).passthrough().describe("An audience segment dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("signal").describe("Dimension family discriminator."), "signal_ref": z.any().superRefine((x2, ctx2) => {
15289
+ }).describe("Portable bounds that buyer and seller SDKs can preflight. Omission means no machine-readable bound was promised; opaque conditions remain unevaluated.").optional(), "terms_ref": z.string().min(1).max(1e3).describe("Stable contract reference. Resolving it cannot expand the typed right and MUST use the caller's normal authenticated contract-document path, never ambient seller credentials.").optional(), "description": z.string().min(1).max(1e3).describe("Display-only summary; it cannot grant authority, add an action, or override typed fields.").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().describe("A proposal-bound buyer change right. It binds to the resulting media buy and account, not personally to the caller, and may be exercised by any caller admitted by both seller account authorization and applicable signed governance delegation.")).min(1).describe("Binding buyer change rights included in the commercial envelope and therefore covered by terms_digest. Entries are uniquely keyed by action. When this field is present, an omitted action is not a negotiated change right. Omission of the entire field means legacy-unspecified rights, not a prohibition.").optional() }).passthrough().describe("Complete typed commercial envelope for a compact-lifecycle proposal. This is the authoritative audit and refinement snapshot; allocations and narrative fields are explanatory views rather than substitutes for these terms."), "terms_digest": z.string().regex(new RegExp("^sha256:[A-Za-z0-9_-]{43}$")).describe("Base64url SHA-256 digest of the RFC 8785 JCS serialization of commercial_terms, prefixed with sha256:."), "insertion_order": z.object({ "io_id": z.string().max(255).describe("Unique identifier for this insertion order. Referenced by io_acceptance on create_media_buy."), "terms": z.object({ "advertiser": z.string().max(500).describe("Advertiser name or identifier").optional(), "publisher": z.string().max(500).describe("Publisher name or identifier").optional(), "total_budget": z.object({ "amount": z.number().gte(0), "currency": z.string().min(3).max(3).describe("ISO 4217 currency code") }).describe("Total committed budget").optional(), "flight_start": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "flight_end": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "payment_terms": z.enum(["net_30", "net_60", "net_90", "prepaid", "due_on_receipt"]).describe("Payment terms").optional() }).catchall(z.any()).describe("Summary fields echoed from the committed proposal for agent verification. Buyer agents use these to confirm the IO matches what was negotiated before a human signs. These are read-only summaries, not negotiation surfaces \u2014 deal terms live on products and packages.").optional(), "terms_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to a human-readable document containing the full insertion order terms").optional(), "signing_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL to an electronic signing service (e.g., DocuSign) for human signature workflows. When present, a human must sign before the buyer agent can proceed with create_media_buy.").optional(), "requires_signature": z.boolean().describe("Whether the buyer must accept this IO before creating a media buy. When true, create_media_buy requires an io_acceptance referencing this io_id.") }).catchall(z.any()).describe("A signing wrapper attached to a committed proposal. The IO does not introduce new deal terms \u2014 all negotiated terms (performance standards, measurement terms, cancellation policy, pricing) live on the product and package. The IO exists for human signature workflows and provides summary fields so buyer agents can verify the IO matches the committed proposal before a human signs.").optional(), "total_budget_guidance": z.object({ "min": z.number().gte(0).optional(), "recommended": z.number().gte(0).optional(), "max": z.number().gte(0).optional(), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")) }).passthrough().and(z.union([z.object({ "recommended": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "min": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "max": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("Optional budget guidance for this proposal \u2014 the planning answer to criteria.outcome_target and to open-budget briefs. commercial_terms.total_budget remains the concrete figure the plan is priced at; this band expresses the seller's recommended range around it. When criteria.outcome_target carries cost_per, the cost answer is commercial_terms.bidding.cost_per and this band's currency equals cost_per.currency.").optional(), "forecast": z.object({ "points": z.array(z.object({ "label": z.string().max(128).optional(), "budget": z.number().gte(0).optional(), "product_id": z.string().optional(), "dimensions": z.array(z.any().superRefine((x, ctx) => {
15290
+ const schemas = [z.object({ "kind": z.literal("geo").describe("Dimension family discriminator."), "geo_level": z.enum(["country", "region", "metro", "postal_area"]).describe("Geographic level for this forecast point."), "system": z.string().describe("Classification system for metro or postal_area levels. Required when geo_level is 'metro' or 'postal_area'. Metro rows use metro-system enum values such as 'nielsen_dma'; native postal rows use country-local postal-system enum values such as 'zip' with country 'US'; deprecated legacy postal rows may use legacy-postal-system enum values such as 'us_zip'. Omit for country and region rows.").optional(), "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code. Required for native postal_area rows and omitted for legacy postal rows, metro rows, country rows, and region rows.").optional(), "geo_code": z.string().describe("Geographic code within the level and system. Country: ISO 3166-1 alpha-2 ('US'). Region: ISO 3166-2 with country prefix ('US-CA'). Metro/postal: system-specific code ('501', '10001')."), "geo_name": z.string().describe("Human-readable geographic name (e.g., 'United States', 'California', 'New York DMA').").optional() }).passthrough().and(z.intersection(z.intersection(z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("country") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("country") }), z.object({ "geo_code": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code.").optional() }))]), z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("region") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("region") }), z.object({ "geo_code": z.string().regex(new RegExp("^[A-Z]{2}-[A-Z0-9]{1,3}$")).describe("ISO 3166-2 subdivision code.").optional() }))])), z.intersection(z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("metro") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("metro") }), z.object({ "system": z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')") }))]), z.union([z.any().refine((value) => !z.object({ "geo_level": z.literal("postal_area") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "geo_level": z.literal("postal_area") }), z.union([z.object({ "country": z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": z.enum(["postal_code", "zip", "zip_plus_four", "outward", "full", "fsa", "plz", "code_postal", "postcode", "cep", "pin", "custom", "us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Country-local postal code system.") }).and(z.union([z.object({ "country": z.literal("US").optional(), "system": z.enum(["zip", "zip_plus_four"]).optional() }), z.object({ "country": z.literal("GB").optional(), "system": z.enum(["outward", "full"]).optional() }), z.object({ "country": z.literal("CA").optional(), "system": z.enum(["fsa", "full"]).optional() }), z.object({ "country": z.enum(["DE", "CH", "AT"]).optional(), "system": z.literal("plz").optional() }), z.object({ "country": z.literal("FR").optional(), "system": z.literal("code_postal").optional() }), z.object({ "country": z.literal("AU").optional(), "system": z.literal("postcode").optional() }), z.object({ "country": z.literal("BR").optional(), "system": z.literal("cep").optional() }), z.object({ "country": z.literal("IN").optional(), "system": z.literal("pin").optional() }), z.object({ "country": z.literal("ZA").optional(), "system": z.literal("postal_code").optional() }), z.object({ "country": z.any().refine((value) => !z.enum(["US", "GB", "CA", "DE", "CH", "AT", "FR", "AU", "BR", "IN", "ZA"]).safeParse(value).success, "Invalid input: Should NOT be valid against schema").optional(), "system": z.enum(["postal_code", "custom"]).optional() })]).describe("Must also satisfy at least one of these alternatives.")).describe("Valid country-local postal system pairing. Registered countries only accept their registered local systems; countries without a registered local system use postal_code or custom."), z.object({ "system": z.enum(["us_zip", "us_zip_plus_four", "gb_outward", "gb_full", "ca_fsa", "ca_full", "de_plz", "fr_code_postal", "au_postcode", "ch_plz", "at_plz"]).describe("Deprecated country-fused postal code system (e.g., 'us_zip', 'gb_outward'). Prefer country + postal-system.") })]))])))).describe("A geographic dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("placement").describe("Dimension family discriminator."), "placement_ref": z.object({ "publisher_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain where the adagents.json declaring a publisher-catalog placement is hosted, or the inventory publisher associated with an inline placement. Omitted only for legacy single-publisher product-context references.").optional(), "placement_id": z.string().describe("Placement ID from the publisher's adagents.json placement catalog, or an inline seller-defined placement ID interpreted within the enclosing seller and product context.") }).catchall(z.any()).describe("Structured placement reference for this forecast row. References an entry from the product's placements array."), "placement_name": z.string().describe("Human-readable placement name, useful when the buyer has not resolved the placement catalog.").optional() }).passthrough().describe("A placement dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("device_type").describe("Dimension family discriminator."), "device_type": z.enum(["desktop", "mobile", "tablet", "ctv", "dooh", "unknown"]).describe("Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) \u2192 mobile, 2 (PC) \u2192 desktop, 4 (Phone) \u2192 mobile, 5 (Tablet) \u2192 tablet, 6 (Connected Device) \u2192 ctv, 7 (Set Top Box) \u2192 ctv. DOOH inventory uses dooh.") }).passthrough().describe("A device form-factor dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("device_platform").describe("Dimension family discriminator."), "device_platform": z.enum(["ios", "android", "windows", "macos", "linux", "chromeos", "tvos", "tizen", "webos", "fire_os", "roku_os", "unknown"]).describe("Operating system platforms for device targeting. Browser values from Sec-CH-UA-Platform standard, extended for CTV.") }).passthrough().describe("An operating-system or platform dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("audience").describe("Dimension family discriminator."), "audience_id": z.string().describe("Audience segment identifier for this forecast row."), "audience_source": z.enum(["synced", "platform", "third_party", "lookalike", "retargeting", "unknown"]).describe("Origin of the audience segment."), "audience_name": z.string().describe("Human-readable audience segment name.").optional() }).passthrough().describe("An audience segment dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("signal").describe("Dimension family discriminator."), "signal_ref": z.any().superRefine((x2, ctx2) => {
15308
15291
  const schemas2 = [z.object({ "scope": z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Product-local signal identifier. For local signals exposed on both get_signals and get_products, this MUST match get_signals.signals[].signal_ref.signal_id for the same signal.") }).catchall(z.any()).describe("Product-scoped signal. The signal_id is meaningful only within the selected product/package context and MUST match a Product.included_signals[].signal_ref.signal_id or Product.signal_targeting_options[].signal_ref.signal_id for that product, depending on whether the signal is descriptive or selectable."), z.object({ "scope": z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that publishes the signal definition in its adagents.json signals[]."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(z.any()).describe("Data-provider-scoped signal. The signal_id resolves through the data provider's published adagents.json signals[] and can be authorization-verified there."), z.object({ "scope": z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(z.any()).describe("Signal-source-scoped signal. Use this for source-native signals that are not published in upstream adagents.json signals[]. The buyer trusts the issuing signal source for this identity; use scope 'data_provider' instead when the signal is published in adagents.json signals[], even if the publisher is also the seller or signal source.")];
15309
15292
  const { errors: errors2, failed: failed2 } = schemas2.reduce(
15310
15293
  ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
@@ -15329,7 +15312,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
15329
15312
  message: "Invalid input: Should pass single schema. Passed " + passed2
15330
15313
  });
15331
15314
  }
15332
- }).describe("Canonical signal reference for this forecast row. Required when the row needs to disambiguate product-local, data-provider, or signal-source identity. Product-relative forecasts SHOULD use signal_ref.").optional(), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier shorthand for this forecast row. Use only when the enclosing context already identifies the signal unambiguously, such as a coverage_forecast nested directly under one get_signals signal item. Otherwise use signal_ref.").optional(), "signal_value": z.union([z.string().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value."), z.number().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value."), z.boolean().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value."), z.null().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value.")]).describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value.").optional(), "presence": z.enum(["present", "absent"]).describe("Whether the signal is present for this point. Use 'absent' for the explicit not-present bucket."), "signal_name": z.string().describe("Human-readable signal name, useful when the buyer has not resolved the signal definition.").optional(), "signal_value_name": z.string().describe("Human-readable label for the signal value bucket.").optional() }).passthrough().and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "presence": z.literal("absent") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "presence": z.literal("absent") }), z.object({ "signal_value": z.null() }))]), z.union([z.any().refine((value) => !z.object({ "presence": z.literal("present") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "presence": z.literal("present") }), z.object({ "signal_value": z.union([z.string(), z.number(), z.boolean()]).optional() }))]))).describe("A signal value or signal-presence dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("time").describe("Dimension family discriminator."), "start_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), "end_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time") }).passthrough().describe("A calendar-window dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules. Windows are half-open intervals [start_time, end_time): the row covers instants at or after start_time and strictly before end_time, so adjacent windows share a boundary without overlapping. end_time MUST be after start_time; JSON Schema draft-07 cannot compare sibling values, so conformance tooling enforces the ordering. Within one forecast, sellers MUST emit non-overlapping windows and SHOULD coalesce adjacent windows whose availability_status and metrics do not materially differ. When the request scoped the forecast with offer_filters.availability_horizon, a complete forecast partitions the requested horizon; a seller that cannot cover the full horizon signals the gap through the response's incomplete[] mechanism rather than silently omitting windows.")];
15315
+ }).describe("Canonical signal reference for this forecast row. Required when the row needs to disambiguate product-local, data-provider, or signal-source identity. Product-relative forecasts SHOULD use signal_ref.").optional(), "signal_id": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier shorthand for this forecast row. Use only when the enclosing context already identifies the signal unambiguously, such as a coverage_forecast nested directly under one get_signals signal item. Otherwise use signal_ref.").optional(), "signal_value": z.union([z.string().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value."), z.number().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value."), z.boolean().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value."), z.null().describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value.")]).describe("Signal value bucket represented by this point. Use null with presence 'absent' to represent inventory where the signal is not present. Omit when the row describes any present value rather than one specific value.").optional(), "presence": z.enum(["present", "absent"]).describe("Whether the signal is present for this point. Use 'absent' for the explicit not-present bucket."), "signal_name": z.string().describe("Human-readable signal name, useful when the buyer has not resolved the signal definition.").optional(), "signal_value_name": z.string().describe("Human-readable label for the signal value bucket.").optional() }).passthrough().and(z.union([z.object({ "signal_ref": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "signal_id": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).and(z.intersection(z.union([z.any().refine((value) => !z.object({ "presence": z.literal("absent") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "presence": z.literal("absent") }), z.object({ "signal_value": z.null() }))]), z.union([z.any().refine((value) => !z.object({ "presence": z.literal("present") }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "presence": z.literal("present") }), z.object({ "signal_value": z.union([z.string(), z.number(), z.boolean()]).optional() }))]))).describe("A signal value or signal-presence dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules."), z.object({ "kind": z.literal("time").describe("Dimension family discriminator."), "start_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"), "end_time": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time") }).passthrough().describe("A calendar-window dimension for a ForecastPoint row. Variant of ForecastPoint dimensions; see forecast-point-dimensions.json for dispatch rules. Windows are half-open intervals [start_time, end_time): the row covers instants at or after start_time and strictly before end_time, so adjacent windows share a boundary without overlapping. end_time MUST be after start_time; JSON Schema draft-07 cannot compare sibling values, so conformance tooling enforces the ordering. Within one forecast, sellers MUST emit non-overlapping windows and SHOULD coalesce adjacent windows whose availability_status and metrics do not materially differ. When the request scoped the forecast with offer_filters.availability_horizon, a complete forecast partitions the requested horizon; a seller that cannot cover the full horizon signals the gap through the response's incomplete[] mechanism rather than silently omitting windows.")];
15333
15316
  const { errors, failed } = schemas.reduce(
15334
15317
  ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
15335
15318
  errors: [...errors2, ...result.error.issues],
@@ -15353,7 +15336,7 @@ const CanonicalProposalSchema = /* @__PURE__ */ (() => (() => {
15353
15336
  message: "Invalid input: Should pass single schema. Passed " + passed
15354
15337
  });
15355
15338
  }
15356
- })).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Dimension constraints represented by a ForecastPoint. Use this when one product, proposal, or signal coverage forecast needs to expose availability or forecasted delivery by country, region, placement, device, audience, signal value, time window, or intersections such as placement x country without creating separate products solely for each slice. Each item declares one dimension family via `kind`; when multiple items are present, the point represents their intersection. Sellers MUST NOT emit more than one item for each `kind` in a point. Consumers MUST NOT treat repeated kinds as OR semantics; repeated peer values such as two countries are a seller conformance issue. Dimension values are descriptors of the forecast row and are independent of pricing_options.").optional(), "availability_status": z.enum(["available", "unavailable"]).describe("Bookability of the inventory a forecast row describes, as of the forecast's generated_at. A snapshot, never a hold: valid_until bounds freshness, and proposal finalization or purchase remains the commitment boundary.").optional(), "metrics": z.object({ "coverage_rate": z.intersection(z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together."), z.object({ "low": z.any().optional(), "mid": z.any().optional(), "high": z.any().optional() })).describe("A forecast range whose low, midpoint, and high values are rates in the inclusive interval from 0 to 1.").optional() }).catchall(z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.")), "viewability": z.object({ "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.").optional(), "measurable_impressions": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "viewable_impressions": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "viewable_rate": z.intersection(z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together."), z.object({ "low": z.any().optional(), "mid": z.any().optional(), "high": z.any().optional() })).describe("A forecast range whose low, midpoint, and high values are rates in the inclusive interval from 0 to 1.").optional(), "viewed_seconds": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.union([z.object({ "measurable_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "viewable_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "viewable_rate": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "viewed_seconds": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "standard": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).optional(), "vendor_metric_values": z.array(z.object({ "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "metric_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).min(1).max(64).describe("Identifier for a vendor-defined metric within the vendor's vocabulary. Stable lookup key; the vendor publishes the canonical list (with category, methodology, and standard alignment) in `brand.json` `agents[type='measurement']`. Lowercase with underscores so a future enum promotion into `available-metric.json` is a literal string lift. Identifier is namespaced by the vendor \u2014 the same `metric_id` may mean different things in different vendors' vocabularies."), "value": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together."), "unit": z.string().optional(), "measurable_impressions": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "breakdown": z.record(z.string(), z.any()).optional() }).passthrough().describe("Compact forecasted vendor metric with a BrandKey vendor pointer and no embedded brand assets.")).optional() }).passthrough().describe("Compact forecast row with numeric ranges and identity-only measurement-vendor references.")).min(1), "forecast_range_unit": z.enum(["spend", "availability", "reach_freq", "weekly", "daily", "clicks", "conversions", "package"]).describe("Describes how to interpret the points array in a DeliveryForecast \u2014 what axis the curve represents").optional(), "method": z.enum(["estimate", "modeled", "guaranteed"]).describe("Method used to produce a delivery forecast"), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")), "demographic_system": z.enum(["nielsen", "nielsen_audio", "barb", "agf", "oztam", "mediametrie", "custom"]).describe("Audience measurement systems for demographic notation in GRP forecasts and pricing, across video and audio channels. Specifies how demographics are written, not whose panel produced the numbers \u2014 provider identity is measurement_source.").optional(), "demographic": z.string().optional(), "measurement_source": z.string().regex(new RegExp("^[a-z0-9_]+$")).max(64).optional(), "reach_unit": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").optional(), "generated_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "valid_until": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().describe("Compact product forecast without legacy BrandRef or creative dependencies.").describe("Aggregate forecasted delivery for the proposal. For outcome_target requests, points carry the goal's metric or event key in metrics; with cost_per, that is the goal volume planned under the commercial_terms.bidding policy, and currency equals cost_per.currency.").optional() }).passthrough().describe("Compact immutable proposal for the AdCP 3.2 lifecycle. commercial_terms is the sole authoritative commercial envelope; narrative fields do not duplicate legacy allocation or creative graphs.");
15339
+ })).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Dimension constraints represented by a ForecastPoint. Use this when one product, proposal, or signal coverage forecast needs to expose availability or forecasted delivery by country, region, placement, device, audience, signal value, time window, or intersections such as placement x country without creating separate products solely for each slice. Each item declares one dimension family via `kind`; when multiple items are present, the point represents their intersection. Sellers MUST NOT emit more than one item for each `kind` in a point. Consumers MUST NOT treat repeated kinds as OR semantics; repeated peer values such as two countries are a seller conformance issue. Dimension values are descriptors of the forecast row and are independent of pricing_options.").optional(), "availability_status": z.enum(["available", "unavailable"]).describe("Bookability of the inventory a forecast row describes, as of the forecast's generated_at. A snapshot, never a hold: valid_until bounds freshness, and proposal finalization or purchase remains the commitment boundary.").optional(), "metrics": z.object({ "coverage_rate": z.intersection(z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together."), z.object({ "low": z.any().optional(), "mid": z.any().optional(), "high": z.any().optional() })).describe("A forecast range whose low, midpoint, and high values are rates in the inclusive interval from 0 to 1.").optional() }).catchall(z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.")), "viewability": z.object({ "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery.").optional(), "measurable_impressions": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "viewable_impressions": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "viewable_rate": z.intersection(z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together."), z.object({ "low": z.any().optional(), "mid": z.any().optional(), "high": z.any().optional() })).describe("A forecast range whose low, midpoint, and high values are rates in the inclusive interval from 0 to 1.").optional(), "viewed_seconds": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "standard": z.enum(["mrc", "groupm"]).describe("Viewability measurement standard applied to determine whether an impression qualifies as viewable. These are materially different thresholds and should not be compared across standards.").optional() }).passthrough().and(z.union([z.any().refine((value) => !z.union([z.object({ "measurable_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "viewable_impressions": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "viewable_rate": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), z.object({ "viewed_seconds": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough()]).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), z.object({ "standard": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).optional(), "vendor_metric_values": z.array(z.object({ "vendor": z.object({ "domain": z.string().regex(new RegExp("^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$")).describe("Domain that hosts /.well-known/brand.json or is registered for the brand."), "brand_id": z.string().regex(new RegExp("^[a-z0-9_]+$")).describe("Brand within a house-of-brands manifest. Omit for a single-brand domain.").optional(), "countries": z.array(z.string().regex(new RegExp("^[A-Z]{2}$"))).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Canonical set of ISO 3166-1 alpha-2 countries for this advertiser identity. Omit when the identity is global or the house does not split the brand geographically. Array order is not meaningful; producers MUST sort codes lexicographically before computing keys or signatures. This qualifies account and proposal identity and is not delivery targeting.").optional() }).passthrough().describe("Stable brand identity used to resolve the canonical brand manifest, optionally qualified by the countries of a commercial advertiser entity. The manifest URL is derived from domain; callers do not send brand assets or per-call brand overrides. Countries do not target delivery."), "metric_id": z.string().regex(new RegExp("^[a-z][a-z0-9_]*$")).min(1).max(64).describe("Identifier for a vendor-defined metric within the vendor's vocabulary. Stable lookup key; the vendor publishes the canonical list (with category, methodology, and standard alignment) in `brand.json` `agents[type='measurement']`. Lowercase with underscores so a future enum promotion into `available-metric.json` is a literal string lift. Identifier is namespaced by the vendor \u2014 the same `metric_id` may mean different things in different vendors' vocabularies."), "value": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together."), "unit": z.string().optional(), "measurable_impressions": z.object({ "low": z.number().gte(0).describe("Conservative (low-end) forecast value").optional(), "mid": z.number().gte(0).describe("Expected (most likely) forecast value").optional(), "high": z.number().gte(0).describe("Optimistic (high-end) forecast value").optional() }).catchall(z.any()).and(z.union([z.object({ "mid": z.any().refine((value) => value !== void 0, "Required") }).passthrough(), z.object({ "low": z.any().refine((value) => value !== void 0, "Required"), "high": z.any().refine((value) => value !== void 0, "Required") }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")).describe("A forecast value with optional confidence bounds. Either mid (point estimate) or both low and high (range) must be provided. mid represents the most likely outcome. low and high represent conservative and optimistic estimates. All three can be provided together.").optional(), "breakdown": z.record(z.string(), z.any()).optional() }).passthrough().describe("Compact forecasted vendor metric with a BrandKey vendor pointer and no embedded brand assets.")).optional() }).passthrough().describe("Compact forecast row with numeric ranges and identity-only measurement-vendor references.")).min(1), "forecast_range_unit": z.enum(["spend", "availability", "reach_freq", "weekly", "daily", "clicks", "conversions", "package"]).describe("Describes how to interpret the points array in a DeliveryForecast \u2014 what axis the curve represents").optional(), "method": z.enum(["estimate", "modeled", "guaranteed"]).describe("Method used to produce a delivery forecast"), "currency": z.string().regex(new RegExp("^[A-Z]{3}$")), "demographic_system": z.enum(["nielsen", "nielsen_audio", "barb", "agf", "oztam", "mediametrie", "custom"]).describe("Audience measurement systems for demographic notation in GRP forecasts and pricing, across video and audio channels. Specifies how demographics are written, not whose panel produced the numbers \u2014 provider identity is measurement_source.").optional(), "demographic": z.string().optional(), "measurement_source": z.string().regex(new RegExp("^[a-z0-9_]+$")).max(64).optional(), "reach_unit": z.enum(["individuals", "households", "devices", "accounts", "cookies", "custom"]).describe("Unit of measurement for reach and audience size metrics. Different channels and measurement providers count reach in fundamentally different units, making cross-channel comparison impossible without declaring the unit.").optional(), "generated_at": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "valid_until": z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(), "ext": z.record(z.string(), z.any()).describe("Extension object for platform-specific, vendor-namespaced parameters. Extensions are always optional and must be namespaced under a vendor/platform key (e.g., ext.gam, ext.roku). Used for custom capabilities, partner-specific configuration, and features being proposed for standardization.").optional() }).passthrough().describe("Compact product forecast without legacy BrandRef or creative dependencies.").describe("Aggregate forecasted delivery for the proposal. For outcome_target requests, points carry the goal's metric or event key in metrics; with cost_per, that is the goal volume planned under the commercial_terms.bidding policy, and currency equals cost_per.currency.").optional() }).passthrough().describe("Compact immutable proposal for the AdCP 3.2 lifecycle. commercial_terms is the sole authoritative commercial envelope; narrative fields do not duplicate legacy allocation or creative graphs.");
15357
15340
  const exactSchema = objectSchema.superRefine((value, ctx) => {
15358
15341
  const checked = z.intersection(z.intersection(z.union([z.any().refine((value2) => !z.object({ "proposal_kind": z.enum(["media_buy_update", "media_buy_cancellation"]) }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "proposal_kind": z.enum(["media_buy_update", "media_buy_cancellation"]) }), z.object({ "parent_proposal_id": z.any().refine((value2) => value2 !== void 0, "Required"), "media_buy_id": z.any().refine((value2) => value2 !== void 0, "Required"), "base_media_buy_revision": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough())]), z.union([z.any().refine((value2) => !z.object({ "proposal_status": z.literal("accepted") }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "proposal_status": z.literal("accepted") }), z.object({ "media_buy_id": z.any().refine((value2) => value2 !== void 0, "Required"), "accepted_at": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough())])), z.intersection(z.union([z.any().refine((value2) => !z.object({ "proposal_status": z.literal("committed") }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "proposal_status": z.literal("committed") }), z.object({ "expires_at": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough())]), z.union([z.any().refine((value2) => !z.object({ "proposal_kind": z.literal("media_buy_cancellation") }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema"), z.intersection(z.object({ "proposal_kind": z.literal("media_buy_cancellation") }), z.object({ "commercial_terms": z.object({ "cancellation_terms": z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().optional() }))]))).safeParse(value);
15359
15342
  if (!checked.success) {
@@ -15434,7 +15417,7 @@ const BuyProductsRequestSchema = /* @__PURE__ */ (() => z.object({
15434
15417
  budget_cap_timezone: z.string().min(1).optional(),
15435
15418
  budget_allocation: CanonicalBudgetAllocationSchema.optional(),
15436
15419
  start_time: StartTimingSchema,
15437
- end_time: z.iso.datetime(),
15420
+ end_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
15438
15421
  pacing: PacingSchema.optional(),
15439
15422
  bidding: BiddingPolicySchema.optional(),
15440
15423
  paused: z.boolean().optional(),
@@ -15456,7 +15439,7 @@ const CommittedMediaBuySchema = /* @__PURE__ */ (() => z.object({
15456
15439
  name: z.string().min(1).max(255).regex(/\S/).optional(),
15457
15440
  revision: z.int().min(1),
15458
15441
  media_buy_status: MediaBuyStatusSchema.optional(),
15459
- confirmed_at: z.iso.datetime().optional().nullable(),
15442
+ confirmed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
15460
15443
  accepted_proposal: CanonicalProposalSchema.and(z.object({
15461
15444
  proposal_status: z.literal("accepted"),
15462
15445
  media_buy_id: z.string().min(1)
@@ -15987,8 +15970,8 @@ const PackageUpdateSchema = /* @__PURE__ */ (() => z.object({
15987
15970
  bidding: BiddingPolicySchema.optional().nullable(),
15988
15971
  impressions: z.number().min(0).optional(),
15989
15972
  daily_budget_cap: z.number().min(0).optional().nullable(),
15990
- start_time: z.iso.datetime().optional(),
15991
- end_time: z.iso.datetime().optional(),
15973
+ start_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
15974
+ end_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
15992
15975
  paused: z.boolean().optional(),
15993
15976
  canceled: z.literal(true).optional(),
15994
15977
  cancellation_reason: z.string().max(500).optional(),
@@ -16030,7 +16013,7 @@ const UpdateMediaBuySuccessSchema = /* @__PURE__ */ (() => z.object({
16030
16013
  budget_allocation: BudgetAllocationSchema.optional(),
16031
16014
  pacing: PacingSchema.optional(),
16032
16015
  bidding: BiddingPolicySchema.optional(),
16033
- implementation_date: z.iso.datetime().optional().nullable(),
16016
+ implementation_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
16034
16017
  invoice_recipient: BusinessEntitySchema.optional(),
16035
16018
  affected_packages: z.array(PackageSchema).optional(),
16036
16019
  valid_actions: z.array(MediaBuyValidActionSchema).optional(),
@@ -16105,16 +16088,16 @@ const PackageStatusSchema = /* @__PURE__ */ (() => z.object({
16105
16088
  pacing: PacingSchema.optional(),
16106
16089
  targeting_overlay: TargetingOverlaySchema.optional(),
16107
16090
  targeting_resolution: PackageTargetingResolutionSchema.optional(),
16108
- start_time: z.iso.datetime().optional(),
16109
- end_time: z.iso.datetime().optional(),
16091
+ start_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
16092
+ end_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
16110
16093
  paused: z.boolean().optional(),
16111
16094
  canceled: z.boolean().optional(),
16112
16095
  cancellation: z.object({
16113
- canceled_at: z.iso.datetime(),
16096
+ canceled_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
16114
16097
  canceled_by: CanceledBySchema,
16115
16098
  reason: z.string().max(500).optional()
16116
16099
  }).passthrough().optional(),
16117
- creative_deadline: z.iso.datetime().optional(),
16100
+ creative_deadline: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
16118
16101
  context: ContextObjectSchema.optional(),
16119
16102
  creative_approvals: z.array(z.object({
16120
16103
  creative_id: z.string(),
@@ -16124,8 +16107,8 @@ const PackageStatusSchema = /* @__PURE__ */ (() => z.object({
16124
16107
  indicators: z.array(IndicatorSchema.and(z.object({
16125
16108
  type: z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]).optional()
16126
16109
  }).passthrough())).optional(),
16127
- indicator_types_evaluated: z.array(IndicatorTypeSchema.and(z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]))).optional(),
16128
- indicators_as_of: z.iso.datetime().optional(),
16110
+ indicator_types_evaluated: z.array(IndicatorTypeSchema.and(z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]).describe("Must also satisfy at least one of these alternatives."))).optional(),
16111
+ indicators_as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
16129
16112
  indicators_evaluated_scope: z.array(IndicatorScopeSchema).optional()
16130
16113
  }).passthrough()).optional(),
16131
16114
  formats_to_provide: z.array(PackageFormatSnapshotSchema).optional(),
@@ -16134,7 +16117,7 @@ const PackageStatusSchema = /* @__PURE__ */ (() => z.object({
16134
16117
  format_ids_pending: z.array(FormatReferenceStructuredObjectSchema).optional(),
16135
16118
  snapshot_unavailable_reason: SnapshotUnavailableReasonSchema.optional(),
16136
16119
  snapshot: z.object({
16137
- as_of: z.iso.datetime(),
16120
+ as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
16138
16121
  staleness_seconds: z.int().min(0),
16139
16122
  impressions: z.number().min(0),
16140
16123
  spend: z.number().min(0),
@@ -16200,10 +16183,10 @@ const GetMediaBuyDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
16200
16183
  partial_data: z.boolean().optional(),
16201
16184
  unavailable_count: z.int().min(0).optional(),
16202
16185
  sequence_number: z.int().min(1).optional(),
16203
- next_expected_at: z.iso.datetime().optional(),
16186
+ next_expected_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
16204
16187
  reporting_period: z.object({
16205
- start: z.iso.datetime(),
16206
- end: z.iso.datetime(),
16188
+ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
16189
+ end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
16207
16190
  timezone: z.string().min(1).optional()
16208
16191
  }).passthrough(),
16209
16192
  reporting_revision_binding: z.object({
@@ -16241,10 +16224,10 @@ const GetMediaBuyDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
16241
16224
  media_buy_id: z.string(),
16242
16225
  currency: z.string().regex(/^[A-Z]{3}$/).optional(),
16243
16226
  status: z.union([z.literal("pending_creatives"), z.literal("pending_start"), z.literal("pending"), z.literal("active"), z.literal("paused"), z.literal("completed"), z.literal("rejected"), z.literal("canceled"), z.literal("failed"), z.literal("reporting_delayed")]),
16244
- expected_availability: z.iso.datetime().optional(),
16227
+ expected_availability: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
16245
16228
  is_adjusted: z.boolean().optional(),
16246
16229
  is_final: z.boolean().optional(),
16247
- finalized_at: z.iso.datetime().optional(),
16230
+ finalized_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
16248
16231
  pricing_model: PricingModelSchema.optional(),
16249
16232
  pacing_index: z.number().min(0).optional(),
16250
16233
  totals: DeliveryMetricsSchema.merge(z.object({
@@ -16259,7 +16242,7 @@ const GetMediaBuyDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
16259
16242
  delivery_status: DeliveryStatusSchema.optional(),
16260
16243
  paused: z.boolean().optional(),
16261
16244
  is_final: z.boolean().optional(),
16262
- finalized_at: z.iso.datetime().optional(),
16245
+ finalized_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
16263
16246
  measurement_window: z.string().max(50).optional(),
16264
16247
  supersedes_window: z.string().max(50).optional(),
16265
16248
  missing_metrics: z.array(MissingMetricSchema).optional(),
@@ -16346,7 +16329,7 @@ const GetMediaBuyDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
16346
16329
  by_spot: z.array(DeliveryMetricsSchema.merge(z.object({
16347
16330
  spot_id: z.string().min(1),
16348
16331
  creative_id: z.string().min(1).optional(),
16349
- aired_at: z.iso.datetime(),
16332
+ aired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
16350
16333
  network: z.string().min(1).optional(),
16351
16334
  station: z.string().min(1).optional(),
16352
16335
  daypart: z.string().min(1).optional()
@@ -16364,8 +16347,8 @@ const GetMediaBuyDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
16364
16347
  }).passthrough()).optional()
16365
16348
  }).passthrough())),
16366
16349
  windows: z.array(z.object({
16367
- window_start: z.iso.datetime(),
16368
- window_end: z.iso.datetime(),
16350
+ window_start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
16351
+ window_end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
16369
16352
  totals: DeliveryMetricsSchema,
16370
16353
  by_package: z.array(DeliveryMetricsSchema.merge(z.object({
16371
16354
  package_id: z.string(),
@@ -16454,7 +16437,7 @@ const ProvidePerformanceFeedbackResponseSchema = /* @__PURE__ */ (() => z.object
16454
16437
  payload: z.object({}).passthrough().optional(),
16455
16438
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
16456
16439
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
16457
- }).passthrough().and(z.union([ProvidePerformanceFeedbackSuccessSchema, ProvidePerformanceFeedbackErrorSchema])))();
16440
+ }).passthrough().and(z.union([ProvidePerformanceFeedbackSuccessSchema, ProvidePerformanceFeedbackErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
16458
16441
  const SyncEventSourcesResponseSchema = /* @__PURE__ */ (() => z.object({
16459
16442
  context_id: z.string().optional(),
16460
16443
  context: ContextObjectSchema.optional(),
@@ -16469,7 +16452,7 @@ const SyncEventSourcesResponseSchema = /* @__PURE__ */ (() => z.object({
16469
16452
  payload: z.object({}).passthrough().optional(),
16470
16453
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
16471
16454
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
16472
- }).passthrough().and(z.union([SyncEventSourcesSuccessSchema, SyncEventSourcesErrorSchema])))();
16455
+ }).passthrough().and(z.union([SyncEventSourcesSuccessSchema, SyncEventSourcesErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
16473
16456
  const LogEventResponseSchema = /* @__PURE__ */ (() => z.object({
16474
16457
  context_id: z.string().optional(),
16475
16458
  context: ContextObjectSchema.optional(),
@@ -16484,7 +16467,7 @@ const LogEventResponseSchema = /* @__PURE__ */ (() => z.object({
16484
16467
  payload: z.object({}).passthrough().optional(),
16485
16468
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
16486
16469
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
16487
- }).passthrough().and(z.union([LogEventSuccessSchema, LogEventErrorSchema])))();
16470
+ }).passthrough().and(z.union([LogEventSuccessSchema, LogEventErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
16488
16471
  const SyncAudiencesResponseSchema = /* @__PURE__ */ (() => z.object({
16489
16472
  context_id: z.string().optional(),
16490
16473
  context: ContextObjectSchema.optional(),
@@ -16499,7 +16482,7 @@ const SyncAudiencesResponseSchema = /* @__PURE__ */ (() => z.object({
16499
16482
  payload: z.object({}).passthrough().optional(),
16500
16483
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
16501
16484
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
16502
- }).passthrough().and(z.union([SyncAudiencesSuccessSchema, SyncAudiencesErrorSchema, SyncAudiencesSubmittedSchema])))();
16485
+ }).passthrough().and(z.union([SyncAudiencesSuccessSchema, SyncAudiencesErrorSchema, SyncAudiencesSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
16503
16486
  const BuildCreativeRequestSchema = /* @__PURE__ */ (() => z.object({
16504
16487
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
16505
16488
  adcp_major_version: z.number().int().gte(1).lte(99).optional(),
@@ -16562,7 +16545,7 @@ const BuildCreativeSuccessSchema = /* @__PURE__ */ (() => z.object({
16562
16545
  build_variant_id: z.string().optional(),
16563
16546
  recipe_hash: z.string().optional(),
16564
16547
  sandbox: z.boolean().optional(),
16565
- expires_at: z.iso.datetime().optional(),
16548
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
16566
16549
  preview: z.object({
16567
16550
  previews: z.array(z.object({
16568
16551
  preview_id: z.string(),
@@ -16574,7 +16557,7 @@ const BuildCreativeSuccessSchema = /* @__PURE__ */ (() => z.object({
16574
16557
  }).passthrough()
16575
16558
  }).passthrough()),
16576
16559
  interactive_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
16577
- expires_at: z.iso.datetime()
16560
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
16578
16561
  }).passthrough().optional(),
16579
16562
  preview_error: ErrorSchema.optional(),
16580
16563
  pricing_option_id: z.string().optional(),
@@ -16675,7 +16658,7 @@ const PreviewCreativeResponseSchema = /* @__PURE__ */ (() => z.object({
16675
16658
  payload: z.object({}).passthrough().optional(),
16676
16659
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
16677
16660
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
16678
- }).passthrough().and(z.union([PreviewCreativeSingleResponseSchema, PreviewCreativeBatchResponseSchema, PreviewCreativeVariantResponseSchema, PreviewCreativeSubmittedSchema])))();
16661
+ }).passthrough().and(z.union([PreviewCreativeSingleResponseSchema, PreviewCreativeBatchResponseSchema, PreviewCreativeVariantResponseSchema, PreviewCreativeSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
16679
16662
  const ListTransformersResponseCreativeAgentSchema = /* @__PURE__ */ (() => z.object({
16680
16663
  context_id: z.string().optional(),
16681
16664
  context: ContextObjectSchema.optional(),
@@ -16713,8 +16696,8 @@ const GetCreativeDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
16713
16696
  media_buy_id: z.string().optional(),
16714
16697
  currency: z.string().regex(/^[A-Z]{3}$/),
16715
16698
  reporting_period: z.object({
16716
- start: z.iso.datetime(),
16717
- end: z.iso.datetime(),
16699
+ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
16700
+ end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
16718
16701
  timezone: z.string().optional()
16719
16702
  }).passthrough(),
16720
16703
  creatives: z.array(z.object({
@@ -16792,7 +16775,7 @@ const SyncCreativesSuccessSchema = /* @__PURE__ */ (() => z.object({
16792
16775
  warnings: z.array(z.string()).optional(),
16793
16776
  macro_resolution_results: z.array(MacroResolutionResultSchema).optional(),
16794
16777
  preview_url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
16795
- expires_at: z.iso.datetime().optional(),
16778
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
16796
16779
  assigned_to: z.array(z.string()).optional(),
16797
16780
  assignment_errors: z.record(z.string(), z.string()).optional()
16798
16781
  }).passthrough()),
@@ -16820,7 +16803,7 @@ const ActivateSignalResponseSchema = /* @__PURE__ */ (() => z.object({
16820
16803
  payload: z.object({}).passthrough().optional(),
16821
16804
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
16822
16805
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
16823
- }).passthrough().and(z.union([ActivateSignalSuccessSchema, ActivateSignalErrorSchema])))();
16806
+ }).passthrough().and(z.union([ActivateSignalSuccessSchema, ActivateSignalErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
16824
16807
  const CreatePropertyListResponseSchema = /* @__PURE__ */ (() => z.object({
16825
16808
  context_id: z.string().optional(),
16826
16809
  context: ContextObjectSchema.optional(),
@@ -16880,7 +16863,7 @@ const ListContentStandardsResponseSchema = /* @__PURE__ */ (() => z.object({
16880
16863
  errors: z.array(ErrorSchema),
16881
16864
  context: ContextObjectSchema.optional(),
16882
16865
  ext: ExtensionObjectSchema.optional()
16883
- }).passthrough()])))();
16866
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
16884
16867
  const GetContentStandardsResponseSchema = /* @__PURE__ */ (() => z.object({
16885
16868
  context_id: z.string().optional(),
16886
16869
  context: ContextObjectSchema.optional(),
@@ -16913,7 +16896,7 @@ const GetContentStandardsResponseSchema = /* @__PURE__ */ (() => z.object({
16913
16896
  errors: z.array(ErrorSchema),
16914
16897
  context: ContextObjectSchema.optional(),
16915
16898
  ext: ExtensionObjectSchema.optional()
16916
- }).passthrough()])))();
16899
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
16917
16900
  const CreateContentStandardsRequestSchema = /* @__PURE__ */ (() => z.object({
16918
16901
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
16919
16902
  adcp_major_version: z.number().int().gte(1).lte(99).optional(),
@@ -16955,7 +16938,7 @@ const UpdateContentStandardsResponseSchema = /* @__PURE__ */ (() => z.object({
16955
16938
  payload: z.object({}).passthrough().optional(),
16956
16939
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
16957
16940
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
16958
- }).passthrough().and(z.union([UpdateContentStandardsSuccessSchema, UpdateContentStandardsErrorSchema])))();
16941
+ }).passthrough().and(z.union([UpdateContentStandardsSuccessSchema, UpdateContentStandardsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
16959
16942
  const GetCreativeFeaturesRequestSchema = /* @__PURE__ */ (() => z.object({
16960
16943
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
16961
16944
  adcp_major_version: z.number().int().gte(1).lte(99).optional(),
@@ -16982,17 +16965,17 @@ const ReportPlanOutcomeRequestSchema = /* @__PURE__ */ (() => z.object({
16982
16965
  budget: z.number().min(0).optional()
16983
16966
  }).passthrough()).optional(),
16984
16967
  planned_delivery: PlannedDeliverySchema.optional(),
16985
- creative_deadline: z.iso.datetime().optional()
16968
+ creative_deadline: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
16986
16969
  }).passthrough().optional(),
16987
16970
  delivery: z.union([z.object({
16988
16971
  observation_id: z.string().min(1).max(255),
16989
16972
  source: z.literal("seller_statement_copy"),
16990
- observed_at: z.iso.datetime(),
16973
+ observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
16991
16974
  seller_statement_id: z.string(),
16992
16975
  seller_statement_digest: z.string().regex(/^sha256:[a-f0-9]{64}$/),
16993
16976
  reporting_period: z.object({
16994
- start: z.iso.datetime(),
16995
- end: z.iso.datetime()
16977
+ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
16978
+ end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
16996
16979
  }).passthrough(),
16997
16980
  cumulative_spend: z.number().min(0),
16998
16981
  currency: z.string().regex(/^[A-Z]{3}$/),
@@ -17001,12 +16984,12 @@ const ReportPlanOutcomeRequestSchema = /* @__PURE__ */ (() => z.object({
17001
16984
  }).passthrough(), z.object({
17002
16985
  observation_id: z.string().min(1).max(255),
17003
16986
  source: z.literal("buyer_measurement"),
17004
- observed_at: z.iso.datetime(),
16987
+ observed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
17005
16988
  seller_statement_id: z.string().optional(),
17006
16989
  seller_statement_digest: z.string().regex(/^sha256:[a-f0-9]{64}$/).optional(),
17007
16990
  reporting_period: z.object({
17008
- start: z.iso.datetime(),
17009
- end: z.iso.datetime()
16991
+ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
16992
+ end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
17010
16993
  }).passthrough(),
17011
16994
  cumulative_spend: z.number().min(0),
17012
16995
  currency: z.string().regex(/^[A-Z]{3}$/),
@@ -17044,10 +17027,10 @@ const CheckGovernanceRequestSchema = /* @__PURE__ */ (() => z.object({}).passthr
17044
17027
  statement_id: z.string().min(1).max(255).optional(),
17045
17028
  statement_digest: z.string().regex(/^sha256:[a-f0-9]{64}$/).optional(),
17046
17029
  sequence: z.int().min(1).optional(),
17047
- issued_at: z.iso.datetime().optional(),
17030
+ issued_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
17048
17031
  reporting_period: z.object({
17049
- start: z.iso.datetime(),
17050
- end: z.iso.datetime()
17032
+ start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
17033
+ end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
17051
17034
  }).passthrough(),
17052
17035
  spend: z.number().min(0).optional(),
17053
17036
  cumulative_spend: z.number().min(0).optional(),
@@ -17113,7 +17096,7 @@ const GetAdCPCapabilitiesResponseSchema = /* @__PURE__ */ (() => z.object({
17113
17096
  }).passthrough().optional(),
17114
17097
  capability_changes: z.object({
17115
17098
  capabilities_version: z.string().min(1).max(255).optional(),
17116
- last_modified: z.iso.datetime().optional(),
17099
+ last_modified: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
17117
17100
  cache_ttl_seconds: z.int().min(60).max(604800).optional(),
17118
17101
  notifications: z.union([CapabilityChangeNotificationsSupportedSchema, CapabilityChangeNotificationsUnsupportedSchema]).optional()
17119
17102
  }).passthrough().optional(),
@@ -17485,7 +17468,7 @@ const GetAdCPCapabilitiesResponseSchema = /* @__PURE__ */ (() => z.object({
17485
17468
  pricing_version_separate: z.boolean().optional(),
17486
17469
  cache_scope_account: z.boolean().optional()
17487
17470
  }).passthrough().optional(),
17488
- last_updated: z.iso.datetime().optional(),
17471
+ last_updated: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
17489
17472
  errors: z.array(ErrorSchema).optional(),
17490
17473
  ext: ExtensionObjectSchema.optional(),
17491
17474
  wholesale_feed_webhooks: z.object({
@@ -17606,7 +17589,7 @@ const SyncAccountsSuccessSchema = /* @__PURE__ */ (() => z.object({
17606
17589
  setup: z.object({
17607
17590
  url: z.string().refine(adcpJsonSchemaUri, "Invalid URI").optional(),
17608
17591
  message: z.string(),
17609
- expires_at: z.iso.datetime().optional()
17592
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
17610
17593
  }).passthrough().optional(),
17611
17594
  rate_card: z.string().optional(),
17612
17595
  payment_terms: PaymentTermsSchema.optional(),
@@ -17638,7 +17621,7 @@ const SyncGovernanceResponseSchema = /* @__PURE__ */ (() => z.object({
17638
17621
  payload: z.object({}).passthrough().optional(),
17639
17622
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
17640
17623
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
17641
- }).passthrough().and(z.union([SyncGovernanceSuccessSchema, SyncGovernanceErrorSchema])))();
17624
+ }).passthrough().and(z.union([SyncGovernanceSuccessSchema, SyncGovernanceErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
17642
17625
  const GetAccountFinancialsResponseSchema = /* @__PURE__ */ (() => z.object({
17643
17626
  context_id: z.string().optional(),
17644
17627
  context: ContextObjectSchema.optional(),
@@ -17653,7 +17636,7 @@ const GetAccountFinancialsResponseSchema = /* @__PURE__ */ (() => z.object({
17653
17636
  payload: z.object({}).passthrough().optional(),
17654
17637
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
17655
17638
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
17656
- }).passthrough().and(z.union([GetAccountFinancialsSuccessSchema, GetAccountFinancialsErrorSchema])))();
17639
+ }).passthrough().and(z.union([GetAccountFinancialsSuccessSchema, GetAccountFinancialsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
17657
17640
  const GetProductsCompletionSchema = /* @__PURE__ */ (() => AdCPVersionEnvelopeSchema.merge(ProtocolEnvelopeSchema).merge(z.object({}).passthrough()).merge(z.object({
17658
17641
  products: z.array(ProductSchema).optional(),
17659
17642
  targeting_resolution: ProductDiscoveryTargetingResolutionSchema.optional(),
@@ -17708,7 +17691,7 @@ const UpstreamTrafficSuccessSchema = /* @__PURE__ */ (() => z.object({
17708
17691
  recorded_calls: z.array(z.union([RawAttestationSchema, DigestAttestationSchema])),
17709
17692
  total_count: z.int().min(0),
17710
17693
  truncated: z.boolean().optional(),
17711
- since_timestamp: z.iso.datetime(),
17694
+ since_timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
17712
17695
  context: ContextObjectSchema.optional(),
17713
17696
  ext: ExtensionObjectSchema.optional()
17714
17697
  }).passthrough())();
@@ -17768,8 +17751,8 @@ const ValidatePropertyDeliveryResponseSchema = /* @__PURE__ */ (() => z.object({
17768
17751
  unknown_impressions: z.int()
17769
17752
  }).passthrough().optional(),
17770
17753
  results: z.array(ValidationResultSchema),
17771
- validated_at: z.iso.datetime(),
17772
- list_resolved_at: z.iso.datetime().optional(),
17754
+ validated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
17755
+ list_resolved_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
17773
17756
  ext: ExtensionObjectSchema.optional()
17774
17757
  }).passthrough())();
17775
17758
  const RequestProposalsResponseSchema = /* @__PURE__ */ (() => z.union([z.object({
@@ -17779,7 +17762,7 @@ const RequestProposalsResponseSchema = /* @__PURE__ */ (() => z.union([z.object(
17779
17762
  suggestions: z.never().optional(),
17780
17763
  proposals: z.array(CanonicalProposalSchema.and(z.object({
17781
17764
  proposal_status: z.literal("draft"),
17782
- expires_at: z.iso.datetime()
17765
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
17783
17766
  }).passthrough())),
17784
17767
  products: z.array(CanonicalProductSchema),
17785
17768
  incomplete: z.array(z.object({
@@ -17817,7 +17800,7 @@ const RequestProposalsResponseSchema = /* @__PURE__ */ (() => z.union([z.object(
17817
17800
  }).passthrough(), z.object({
17818
17801
  kind: z.literal("legacy_create"),
17819
17802
  continuation_token: z.string().min(16),
17820
- continuation_expires_at: z.iso.datetime(),
17803
+ continuation_expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
17821
17804
  source_adcp_version: z.union([z.literal("2.5"), z.literal("3.0"), z.literal("3.1")]),
17822
17805
  product_ids: z.array(z.string()),
17823
17806
  losses: z.array(z.union([z.literal("feed_version_not_atomic"), z.literal("pricing_version_not_atomic"), z.literal("mutation_idempotency_not_guaranteed")])),
@@ -17879,7 +17862,7 @@ const RequestProposalsResponseSchema = /* @__PURE__ */ (() => z.union([z.object(
17879
17862
  suggestions: z.array(z.string()).optional(),
17880
17863
  proposals: z.array(CanonicalProposalSchema.and(z.object({
17881
17864
  proposal_status: z.literal("draft"),
17882
- expires_at: z.iso.datetime()
17865
+ expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time")
17883
17866
  }).passthrough())).optional(),
17884
17867
  products: z.array(CanonicalProductSchema).optional(),
17885
17868
  incomplete: z.array(z.object({
@@ -17896,7 +17879,7 @@ const RequestProposalsResponseSchema = /* @__PURE__ */ (() => z.union([z.object(
17896
17879
  }).passthrough(), z.object({
17897
17880
  kind: z.literal("legacy_create"),
17898
17881
  continuation_token: z.string().min(16),
17899
- continuation_expires_at: z.iso.datetime(),
17882
+ continuation_expires_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
17900
17883
  source_adcp_version: z.union([z.literal("2.5"), z.literal("3.0"), z.literal("3.1")]),
17901
17884
  product_ids: z.array(z.string()),
17902
17885
  losses: z.array(z.union([z.literal("feed_version_not_atomic"), z.literal("pricing_version_not_atomic"), z.literal("mutation_idempotency_not_guaranteed")])),
@@ -18002,9 +17985,9 @@ const MediaBuySchema = /* @__PURE__ */ (() => z.object({
18002
17985
  health: MediaBuyHealthSchema.and(z.string()).optional(),
18003
17986
  impairments: z.array(ImpairmentSchema).optional(),
18004
17987
  rejection_reason: z.string().optional(),
18005
- confirmed_at: z.iso.datetime().nullable(),
17988
+ confirmed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").nullable(),
18006
17989
  cancellation: z.object({
18007
- canceled_at: z.iso.datetime(),
17990
+ canceled_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18008
17991
  canceled_by: CanceledBySchema,
18009
17992
  reason: z.string().max(500).optional()
18010
17993
  }).passthrough().optional(),
@@ -18019,10 +18002,10 @@ const MediaBuySchema = /* @__PURE__ */ (() => z.object({
18019
18002
  packages: z.array(PackageSchema),
18020
18003
  context: ContextObjectSchema.optional(),
18021
18004
  invoice_recipient: BusinessEntity1Schema.optional(),
18022
- creative_deadline: z.iso.datetime().optional(),
18005
+ creative_deadline: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18023
18006
  revision: z.int().min(1),
18024
- created_at: z.iso.datetime().optional(),
18025
- updated_at: z.iso.datetime().optional(),
18007
+ created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18008
+ updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18026
18009
  ext: ExtensionObjectSchema.optional()
18027
18010
  }).passthrough())();
18028
18011
  const RefineProposalsResponseSchema = /* @__PURE__ */ (() => z.union([z.object({
@@ -18228,7 +18211,7 @@ const UpdateMediaBuyResponseSchema = /* @__PURE__ */ (() => z.object({
18228
18211
  payload: z.object({}).passthrough().optional(),
18229
18212
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
18230
18213
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
18231
- }).passthrough().and(z.union([UpdateMediaBuySuccessSchema, UpdateMediaBuyErrorSchema, UpdateMediaBuySubmittedSchema])))();
18214
+ }).passthrough().and(z.union([UpdateMediaBuySuccessSchema, UpdateMediaBuyErrorSchema, UpdateMediaBuySubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
18232
18215
  const BuildCreativeResponseSchema = /* @__PURE__ */ (() => z.object({
18233
18216
  context_id: z.string().optional(),
18234
18217
  context: ContextObjectSchema.optional(),
@@ -18243,7 +18226,7 @@ const BuildCreativeResponseSchema = /* @__PURE__ */ (() => z.object({
18243
18226
  payload: z.object({}).passthrough().optional(),
18244
18227
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
18245
18228
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
18246
- }).passthrough().and(z.union([BuildCreativeSuccessSchema, BuildCreativeMultiSuccessSchema, BuildCreativeVariantSuccessSchema, BuildCreativeEstimateSchema, BuildCreativeErrorSchema, BuildCreativeSubmittedSchema])))();
18229
+ }).passthrough().and(z.union([BuildCreativeSuccessSchema, BuildCreativeMultiSuccessSchema, BuildCreativeVariantSuccessSchema, BuildCreativeEstimateSchema, BuildCreativeErrorSchema, BuildCreativeSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
18247
18230
  const SyncCreativesResponseSchema = /* @__PURE__ */ (() => z.object({
18248
18231
  context_id: z.string().optional(),
18249
18232
  context: ContextObjectSchema.optional(),
@@ -18258,7 +18241,7 @@ const SyncCreativesResponseSchema = /* @__PURE__ */ (() => z.object({
18258
18241
  payload: z.object({}).passthrough().optional(),
18259
18242
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
18260
18243
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
18261
- }).passthrough().and(z.union([SyncCreativesSuccessSchema, SyncCreativesErrorSchema, SyncCreativesSubmittedSchema])))();
18244
+ }).passthrough().and(z.union([SyncCreativesSuccessSchema, SyncCreativesErrorSchema, SyncCreativesSubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
18262
18245
  const CreateMediaBuySuccessSchema = /* @__PURE__ */ (() => z.object({
18263
18246
  proposal_id: z.string().min(1).optional(),
18264
18247
  media_buy_id: z.string(),
@@ -18266,8 +18249,8 @@ const CreateMediaBuySuccessSchema = /* @__PURE__ */ (() => z.object({
18266
18249
  account: AccountSchema.optional(),
18267
18250
  invoice_recipient: BusinessEntitySchema.optional(),
18268
18251
  media_buy_status: MediaBuyStatusSchema.optional(),
18269
- confirmed_at: z.iso.datetime().optional().nullable(),
18270
- creative_deadline: z.iso.datetime().optional(),
18252
+ confirmed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
18253
+ creative_deadline: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18271
18254
  revision: z.int().min(1).optional(),
18272
18255
  currency: z.string().regex(/^[A-Z]{3}$/).optional(),
18273
18256
  total_budget: z.number().min(0).optional(),
@@ -18300,7 +18283,7 @@ const AcquireRightsResponseSchema = /* @__PURE__ */ (() => z.object({
18300
18283
  payload: z.object({}).passthrough().optional(),
18301
18284
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
18302
18285
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
18303
- }).passthrough().and(z.union([AcquireRightsAcquiredSchema, AcquireRightsPendingApprovalSchema, AcquireRightsRejectedSchema, AcquireRightsErrorSchema])))();
18286
+ }).passthrough().and(z.union([AcquireRightsAcquiredSchema, AcquireRightsPendingApprovalSchema, AcquireRightsRejectedSchema, AcquireRightsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
18304
18287
  const GetRightsResponseSchema = /* @__PURE__ */ (() => z.object({
18305
18288
  context_id: z.string().optional(),
18306
18289
  context: ContextObjectSchema.optional(),
@@ -18315,8 +18298,8 @@ const GetRightsResponseSchema = /* @__PURE__ */ (() => z.object({
18315
18298
  payload: z.object({}).passthrough().optional(),
18316
18299
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
18317
18300
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
18318
- }).passthrough().and(z.union([GetRightsSuccessSchema, GetRightsErrorSchema])))();
18319
- const SearchBrandsResponseSchema = /* @__PURE__ */ (() => AdCPVersionEnvelopeSchema.merge(ProtocolEnvelopeSchema).and(z.union([SearchBrandsSuccessSchema, SearchBrandsErrorSchema])))();
18301
+ }).passthrough().and(z.union([GetRightsSuccessSchema, GetRightsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
18302
+ const SearchBrandsResponseSchema = /* @__PURE__ */ (() => AdCPVersionEnvelopeSchema.merge(ProtocolEnvelopeSchema).and(z.union([SearchBrandsSuccessSchema, SearchBrandsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
18320
18303
  const UpdateRightsResponseSchema = /* @__PURE__ */ (() => z.object({
18321
18304
  context_id: z.string().optional(),
18322
18305
  context: ContextObjectSchema.optional(),
@@ -18331,7 +18314,7 @@ const UpdateRightsResponseSchema = /* @__PURE__ */ (() => z.object({
18331
18314
  payload: z.object({}).passthrough().optional(),
18332
18315
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
18333
18316
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
18334
- }).passthrough().and(z.union([UpdateRightsSuccessSchema, UpdateRightsErrorSchema])))();
18317
+ }).passthrough().and(z.union([UpdateRightsSuccessSchema, UpdateRightsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
18335
18318
  const VerifyBrandClaimResponseSchema = /* @__PURE__ */ (() => z.object({
18336
18319
  context_id: z.string().optional(),
18337
18320
  context: ContextObjectSchema.optional(),
@@ -18346,7 +18329,7 @@ const VerifyBrandClaimResponseSchema = /* @__PURE__ */ (() => z.object({
18346
18329
  payload: z.object({}).passthrough().optional(),
18347
18330
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
18348
18331
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
18349
- }).passthrough().and(z.union([VerifyBrandClaimSuccessSchema, VerifyBrandClaimErrorSchema])))();
18332
+ }).passthrough().and(z.union([VerifyBrandClaimSuccessSchema, VerifyBrandClaimErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
18350
18333
  const VerifyBrandClaimsResponseBulkSchema = /* @__PURE__ */ (() => z.object({
18351
18334
  context_id: z.string().optional(),
18352
18335
  context: ContextObjectSchema.optional(),
@@ -18361,7 +18344,7 @@ const VerifyBrandClaimsResponseBulkSchema = /* @__PURE__ */ (() => z.object({
18361
18344
  payload: z.object({}).passthrough().optional(),
18362
18345
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
18363
18346
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
18364
- }).passthrough().and(z.union([VerifyBrandClaimsSuccessSchema, VerifyBrandClaimsErrorSchema])))();
18347
+ }).passthrough().and(z.union([VerifyBrandClaimsSuccessSchema, VerifyBrandClaimsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
18365
18348
  const AppItemSchema = /* @__PURE__ */ (() => z.object({
18366
18349
  app_id: z.string(),
18367
18350
  name: z.string(),
@@ -18439,8 +18422,8 @@ const RegistryFeedResponseSchema = /* @__PURE__ */ (() => z.object({
18439
18422
  cursor: z.uuid().nullable(),
18440
18423
  has_more: z.boolean(),
18441
18424
  freshness: z.object({
18442
- generated_at: z.iso.datetime(),
18443
- latest_event_created_at: z.iso.datetime().nullable(),
18425
+ generated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18426
+ latest_event_created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").nullable(),
18444
18427
  lag_seconds: z.int().min(0).nullable(),
18445
18428
  retention_days: z.int().min(1)
18446
18429
  }).passthrough()
@@ -18450,7 +18433,7 @@ const WholesaleFeedEventSchema = /* @__PURE__ */ (() => z.object({
18450
18433
  event_type: z.union([z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change")]),
18451
18434
  entity_type: z.union([z.literal("product"), z.literal("signal"), z.literal("feed")]),
18452
18435
  entity_id: z.string(),
18453
- created_at: z.iso.datetime(),
18436
+ created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18454
18437
  payload: z.object({}).passthrough()
18455
18438
  }).passthrough().and(z.union([z.object({
18456
18439
  event_type: z.literal("product.created"),
@@ -18479,7 +18462,7 @@ const WholesaleFeedEventSchema = /* @__PURE__ */ (() => z.object({
18479
18462
  pricing_options: z.array(PricingOptionSchema).optional(),
18480
18463
  canonical_pricing_options: z.array(CanonicalPricingOptionSchema).optional(),
18481
18464
  previous_pricing_option_ids: z.array(z.string()).optional(),
18482
- effective_at: z.iso.datetime().optional(),
18465
+ effective_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18483
18466
  retracts_event_id: z.uuid().optional(),
18484
18467
  applies_to: CacheLayerScopeSchema
18485
18468
  }).passthrough().optional()
@@ -18518,7 +18501,7 @@ const WholesaleFeedEventSchema = /* @__PURE__ */ (() => z.object({
18518
18501
  signal_ref: SignalRefSchema.optional(),
18519
18502
  pricing_options: z.array(VendorPricingOptionSchema),
18520
18503
  previous_pricing_option_ids: z.array(z.string()).optional(),
18521
- effective_at: z.iso.datetime().optional(),
18504
+ effective_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18522
18505
  retracts_event_id: z.uuid().optional(),
18523
18506
  applies_to: CacheLayerScopeSchema
18524
18507
  }).passthrough().optional()
@@ -18541,12 +18524,12 @@ const WholesaleFeedEventSchema = /* @__PURE__ */ (() => z.object({
18541
18524
  applies_to: CacheLayerScopeSchema,
18542
18525
  affected_entity_type: z.union([z.literal("product"), z.literal("signal")])
18543
18526
  }).passthrough().optional()
18544
- }).passthrough()])))();
18527
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
18545
18528
  const WholesaleFeedWebhookSchema = /* @__PURE__ */ (() => z.object({
18546
18529
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
18547
18530
  notification_id: z.uuid(),
18548
18531
  notification_type: z.union([z.literal("product.created"), z.literal("product.updated"), z.literal("product.priced"), z.literal("product.removed"), z.literal("signal.created"), z.literal("signal.updated"), z.literal("signal.priced"), z.literal("signal.removed"), z.literal("wholesale_feed.bulk_change")]),
18549
- fired_at: z.iso.datetime(),
18532
+ fired_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18550
18533
  subscriber_id: z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]{1,64}$/),
18551
18534
  account_id: z.string(),
18552
18535
  wholesale_feed_version: z.string(),
@@ -18609,7 +18592,7 @@ const ListProductsResponseSchema = /* @__PURE__ */ (() => z.object({
18609
18592
  replayed: z.literal(true).optional(),
18610
18593
  context: ContextObjectSchema.optional(),
18611
18594
  ext: ExtensionObjectSchema.optional()
18612
- }).passthrough()])))();
18595
+ }).passthrough()]).describe("Must also satisfy at least one of these alternatives.")))();
18613
18596
  const BuyProductsResponseSchema = /* @__PURE__ */ (() => MediaBuyCommitmentResponseSchema)();
18614
18597
  const AcceptProposalResponseSchema = /* @__PURE__ */ (() => MediaBuyCommitmentResponseSchema)();
18615
18598
  const ExplicitPackagesWithFixedAllocationSchema = /* @__PURE__ */ (() => z.object({
@@ -18632,7 +18615,7 @@ const CreateMediaBuyResponseSchema = /* @__PURE__ */ (() => z.object({
18632
18615
  payload: z.object({}).passthrough().optional(),
18633
18616
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
18634
18617
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
18635
- }).passthrough().and(z.union([CreateMediaBuySuccessSchema, CreateMediaBuyErrorSchema, CreateMediaBuySubmittedSchema])))();
18618
+ }).passthrough().and(z.union([CreateMediaBuySuccessSchema, CreateMediaBuyErrorSchema, CreateMediaBuySubmittedSchema]).describe("Must also satisfy at least one of these alternatives.")))();
18636
18619
  const UpdateMediaBuyRequestSchema = /* @__PURE__ */ (() => z.object({
18637
18620
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
18638
18621
  adcp_major_version: z.number().int().gte(1).lte(99).optional(),
@@ -18645,7 +18628,7 @@ const UpdateMediaBuyRequestSchema = /* @__PURE__ */ (() => z.object({
18645
18628
  canceled: z.literal(true).optional(),
18646
18629
  cancellation_reason: z.string().max(500).optional(),
18647
18630
  start_time: StartTimingSchema.optional(),
18648
- end_time: z.iso.datetime().optional(),
18631
+ end_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18649
18632
  total_budget: z.object({
18650
18633
  amount: z.number().min(0),
18651
18634
  currency: z.string().regex(/^[A-Z]{3}$/)
@@ -18677,7 +18660,7 @@ const GetMediaBuysResponseMediaBuySchema = /* @__PURE__ */ (() => z.object({
18677
18660
  account: AccountSchema.optional(),
18678
18661
  invoice_recipient: BusinessEntitySchema.optional(),
18679
18662
  status: MediaBuyStatusSchema,
18680
- status_as_of: z.iso.datetime().optional().nullable(),
18663
+ status_as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
18681
18664
  health: MediaBuyHealthSchema.and(z.string()).optional(),
18682
18665
  impairments: z.array(ImpairmentSchema).optional(),
18683
18666
  rejection_reason: z.string().optional(),
@@ -18689,25 +18672,25 @@ const GetMediaBuysResponseMediaBuySchema = /* @__PURE__ */ (() => z.object({
18689
18672
  budget_allocation: BudgetAllocationSchema.optional(),
18690
18673
  pacing: PacingSchema.optional(),
18691
18674
  bidding: BiddingPolicySchema.optional(),
18692
- start_time: z.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(),
18675
+ start_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18676
+ end_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18677
+ creative_deadline: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18678
+ confirmed_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
18696
18679
  cancellation: z.object({
18697
- canceled_at: z.iso.datetime(),
18680
+ canceled_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18698
18681
  canceled_by: CanceledBySchema,
18699
18682
  reason: z.string().max(500).optional()
18700
18683
  }).passthrough().optional(),
18701
18684
  revision: z.int().min(1).optional(),
18702
- created_at: z.iso.datetime().optional(),
18703
- updated_at: z.iso.datetime().optional(),
18685
+ created_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18686
+ updated_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18704
18687
  context: ContextObjectSchema.optional(),
18705
18688
  valid_actions: z.array(MediaBuyValidActionSchema).optional(),
18706
18689
  available_actions: z.array(z.union([CanonicalMediaBuyActionSchema, MediaBuyAvailableActionSchema])).optional(),
18707
18690
  webhook_activity: z.array(WebhookActivityRecordSchema).max(200).optional(),
18708
18691
  history: z.array(z.object({
18709
18692
  revision: z.int().min(1),
18710
- timestamp: z.iso.datetime(),
18693
+ timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18711
18694
  actor: z.string().optional(),
18712
18695
  action: z.string(),
18713
18696
  summary: z.string().max(500).optional(),
@@ -18737,12 +18720,12 @@ const GetReportingStatusResponseSchema = /* @__PURE__ */ (() => z.object({
18737
18720
  adcp_major_version: z.number().gte(1).lte(99).int().optional(),
18738
18721
  view: ReportingStatusViewSchema.optional(),
18739
18722
  ledger_snapshot_id: z.string().min(1).max(255).optional(),
18740
- ledger_as_of: z.iso.datetime().optional(),
18723
+ ledger_as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18741
18724
  changes_checkpoint: z.string().min(1).max(2048).optional(),
18742
18725
  account_id: z.string().min(1).optional(),
18743
18726
  scope: z.object({
18744
- period_start: z.iso.datetime(),
18745
- period_end: z.iso.datetime(),
18727
+ period_start: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18728
+ period_end: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18746
18729
  scope_closed: z.boolean(),
18747
18730
  media_buy_ids: z.array(ReportingMediaBuyIDSchema).optional(),
18748
18731
  all_accessible_media_buys: z.boolean(),
@@ -18753,13 +18736,13 @@ const GetReportingStatusResponseSchema = /* @__PURE__ */ (() => z.object({
18753
18736
  }).passthrough()),
18754
18737
  feed_purposes: z.array(ReportingFeedPurposeSchema),
18755
18738
  finality: z.array(ReportingFinalitySchema),
18756
- ledger_retained_from: z.iso.datetime(),
18739
+ ledger_retained_from: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18757
18740
  coverage_complete: z.boolean()
18758
18741
  }).passthrough().optional(),
18759
18742
  health: ReportingHealthSchema.optional(),
18760
18743
  coverage: ReportingCoverageSchema.optional(),
18761
- data_through: z.iso.datetime().optional().nullable(),
18762
- next_expected_at: z.iso.datetime().optional(),
18744
+ data_through: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional().nullable(),
18745
+ next_expected_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18763
18746
  obligation_counts: z.object({
18764
18747
  total: z.int().min(0),
18765
18748
  waiting: z.int().min(0),
@@ -18781,7 +18764,7 @@ const GetReportingStatusResponseSchema = /* @__PURE__ */ (() => z.object({
18781
18764
  receipts: z.array(ReportingReceiptSchema).optional(),
18782
18765
  errors: z.array(ErrorSchema).optional(),
18783
18766
  ext: ExtensionObjectSchema.optional()
18784
- }).passthrough().and(z.union([SuccessfulLookupSchema, FailedLookupSchema])).superRefine((value, ctx) => {
18767
+ }).passthrough().and(z.union([SuccessfulLookupSchema, FailedLookupSchema]).describe("Must also satisfy at least one of these alternatives.")).superRefine((value, ctx) => {
18785
18768
  const closedStructures = { "scope": { "allowedFields": ["period_start", "period_end", "scope_closed", "media_buy_ids", "all_accessible_media_buys", "delivery_config_generations", "feed_purposes", "finality", "ledger_retained_from", "coverage_complete"], "requiredFields": ["period_start", "period_end", "scope_closed", "all_accessible_media_buys", "delivery_config_generations", "feed_purposes", "finality", "ledger_retained_from", "coverage_complete"] }, "deliveryConfigGeneration": { "allowedFields": ["delivery_config_id", "delivery_config_version", "feed_purpose"], "requiredFields": ["delivery_config_id", "delivery_config_version", "feed_purpose"] }, "obligationCounts": { "allowedFields": ["total", "waiting", "healthy", "delayed", "action_required", "complete", "consumer_status_pending"], "requiredFields": ["total", "waiting", "healthy", "delayed", "action_required", "complete"] }, "pagination": { "allowedFields": ["has_more", "cursor", "total_count"], "requiredFields": ["has_more"] }, "paginationRequiredByView": { "periods": ["has_more", "total_count"], "revision": ["has_more", "total_count"] } };
18786
18769
  const addIssues = (schema, candidate, path) => {
18787
18770
  const parsed = schema.safeParse(candidate);
@@ -18870,8 +18853,8 @@ const ListedCreativeNamedFormatReferenceSchema = /* @__PURE__ */ (() => z.object
18870
18853
  format_id: FormatReferenceStructuredObjectSchema,
18871
18854
  format_option_ref: FormatOptionReferenceSchema.optional(),
18872
18855
  status: CreativeStatusSchema,
18873
- created_date: z.iso.datetime(),
18874
- updated_date: z.iso.datetime(),
18856
+ created_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18857
+ updated_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18875
18858
  assets: z.record(z.string(), z.union([AssetVariantSchema, z.array(AssetVariantSchema)])).optional(),
18876
18859
  component_assets: z.record(z.string(), CreativeAssetsSchema).optional(),
18877
18860
  localization: CreativeLocalizationReadbackSchema.optional(),
@@ -18893,30 +18876,30 @@ const ListedCreativeNamedFormatReferenceSchema = /* @__PURE__ */ (() => z.object
18893
18876
  assigned_packages: z.array(z.object({
18894
18877
  package_id: z.string(),
18895
18878
  media_buy_id: z.string().optional(),
18896
- assigned_date: z.iso.datetime(),
18879
+ assigned_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18897
18880
  approval_status: CreativeApprovalStatusSchema.optional(),
18898
18881
  rejection_reason: z.string().optional(),
18899
18882
  approval_scopes: z.array(ScopedCreativeApprovalSchema).optional(),
18900
18883
  indicators: z.array(IndicatorSchema.and(z.object({
18901
18884
  type: z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]).optional()
18902
18885
  }).passthrough())).optional(),
18903
- indicator_types_evaluated: z.array(IndicatorTypeSchema.and(z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]))).optional(),
18904
- indicators_as_of: z.iso.datetime().optional(),
18886
+ indicator_types_evaluated: z.array(IndicatorTypeSchema.and(z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]).describe("Must also satisfy at least one of these alternatives."))).optional(),
18887
+ indicators_as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18905
18888
  indicators_evaluated_scope: z.array(IndicatorScopeSchema).optional()
18906
18889
  }).passthrough()).optional()
18907
18890
  }).passthrough().optional(),
18908
18891
  snapshot: z.object({
18909
- as_of: z.iso.datetime(),
18892
+ as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18910
18893
  staleness_seconds: z.int().min(0),
18911
18894
  impressions: z.int().min(0),
18912
- last_served: z.iso.datetime().optional()
18895
+ last_served: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
18913
18896
  }).passthrough().optional(),
18914
18897
  snapshot_unavailable_reason: SnapshotUnavailableReasonSchema.optional(),
18915
18898
  items: z.array(CreativeItemSchema).optional(),
18916
18899
  pricing_options: z.array(VendorPricingOptionSchema).optional(),
18917
18900
  purge: z.object({
18918
18901
  kind: z.literal("soft"),
18919
- at: z.iso.datetime(),
18902
+ at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18920
18903
  reason_code: CreativeEventReasonCodeSchema
18921
18904
  }).passthrough().optional(),
18922
18905
  webhook_activity: z.array(WebhookActivityRecordSchema).max(200).optional()
@@ -18930,8 +18913,8 @@ const ListedCreativeCanonicalFormatKindSchema = /* @__PURE__ */ (() => z.object(
18930
18913
  format_kind: CanonicalFormatKindSchema,
18931
18914
  format_option_ref: FormatOptionReferenceSchema.optional(),
18932
18915
  status: CreativeStatusSchema,
18933
- created_date: z.iso.datetime(),
18934
- updated_date: z.iso.datetime(),
18916
+ created_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18917
+ updated_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18935
18918
  assets: z.record(z.string(), z.union([AssetVariantSchema, z.array(AssetVariantSchema)])).optional(),
18936
18919
  component_assets: z.record(z.string(), CreativeAssetsSchema).optional(),
18937
18920
  localization: CreativeLocalizationReadbackSchema.optional(),
@@ -18953,30 +18936,30 @@ const ListedCreativeCanonicalFormatKindSchema = /* @__PURE__ */ (() => z.object(
18953
18936
  assigned_packages: z.array(z.object({
18954
18937
  package_id: z.string(),
18955
18938
  media_buy_id: z.string().optional(),
18956
- assigned_date: z.iso.datetime(),
18939
+ assigned_date: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18957
18940
  approval_status: CreativeApprovalStatusSchema.optional(),
18958
18941
  rejection_reason: z.string().optional(),
18959
18942
  approval_scopes: z.array(ScopedCreativeApprovalSchema).optional(),
18960
18943
  indicators: z.array(IndicatorSchema.and(z.object({
18961
18944
  type: z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]).optional()
18962
18945
  }).passthrough())).optional(),
18963
- indicator_types_evaluated: z.array(IndicatorTypeSchema.and(z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]))).optional(),
18964
- indicators_as_of: z.iso.datetime().optional(),
18946
+ indicator_types_evaluated: z.array(IndicatorTypeSchema.and(z.union([z.literal("creative_fatigue"), z.literal("creative_quality_opportunity")]).describe("Must also satisfy at least one of these alternatives."))).optional(),
18947
+ indicators_as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
18965
18948
  indicators_evaluated_scope: z.array(IndicatorScopeSchema).optional()
18966
18949
  }).passthrough()).optional()
18967
18950
  }).passthrough().optional(),
18968
18951
  snapshot: z.object({
18969
- as_of: z.iso.datetime(),
18952
+ as_of: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18970
18953
  staleness_seconds: z.int().min(0),
18971
18954
  impressions: z.int().min(0),
18972
- last_served: z.iso.datetime().optional()
18955
+ last_served: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional()
18973
18956
  }).passthrough().optional(),
18974
18957
  snapshot_unavailable_reason: SnapshotUnavailableReasonSchema.optional(),
18975
18958
  items: z.array(CreativeItemSchema).optional(),
18976
18959
  pricing_options: z.array(VendorPricingOptionSchema).optional(),
18977
18960
  purge: z.object({
18978
18961
  kind: z.literal("soft"),
18979
- at: z.iso.datetime(),
18962
+ at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
18980
18963
  reason_code: CreativeEventReasonCodeSchema
18981
18964
  }).passthrough().optional(),
18982
18965
  webhook_activity: z.array(WebhookActivityRecordSchema).max(200).optional()
@@ -19023,7 +19006,7 @@ const SyncAccountsResponseSchema = /* @__PURE__ */ (() => z.object({
19023
19006
  payload: z.object({}).passthrough().optional(),
19024
19007
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
19025
19008
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
19026
- }).passthrough().and(z.union([SyncAccountsSuccessSchema, SyncAccountsErrorSchema])))();
19009
+ }).passthrough().and(z.union([SyncAccountsSuccessSchema, SyncAccountsErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
19027
19010
  const ComplyTestControllerRequestSchema = /* @__PURE__ */ (() => z.object({
19028
19011
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
19029
19012
  adcp_major_version: z.number().int().gte(1).lte(99).optional(),
@@ -19046,7 +19029,7 @@ const ComplyTestControllerRequestSchema = /* @__PURE__ */ (() => z.object({
19046
19029
  catalog_id: z.string().min(1).max(255).optional(),
19047
19030
  catalog_generation: z.string().min(1).max(255).optional(),
19048
19031
  item_id: z.string().min(1).max(255).optional(),
19049
- target_time: z.iso.datetime().optional(),
19032
+ target_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
19050
19033
  status: z.string().optional(),
19051
19034
  rejection_reason: z.string().optional(),
19052
19035
  purge_kind: z.union([z.literal("soft"), z.literal("hard")]).optional(),
@@ -19101,7 +19084,7 @@ const ComplyTestControllerRequestSchema = /* @__PURE__ */ (() => z.object({
19101
19084
  upstream_name: z.string().optional(),
19102
19085
  cache_age_seconds: z.int().min(0).optional(),
19103
19086
  result: ComplianceTaskCompletionDataSchema.optional(),
19104
- since_timestamp: z.iso.datetime().optional(),
19087
+ since_timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
19105
19088
  endpoint_pattern: z.string().optional(),
19106
19089
  limit: z.int().min(1).max(1e3).optional(),
19107
19090
  attestation_mode: z.union([z.literal("raw"), z.literal("digest")]).optional(),
@@ -19127,7 +19110,7 @@ const ComplyTestControllerResponseSchema = /* @__PURE__ */ (() => z.object({
19127
19110
  payload: z.object({}).passthrough().optional(),
19128
19111
  adcp_version: z.string().regex(new RegExp("^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[a-zA-Z0-9](?:[a-zA-Z0-9.-]*[a-zA-Z0-9])?)?$")).optional(),
19129
19112
  adcp_major_version: z.number().int().gte(1).lte(99).optional()
19130
- }).passthrough().and(z.union([ListScenariosSuccessSchema, StateTransitionSuccessSchema, SimulationSuccessSchema, ForcedDirectiveSuccessSchema, SeedSuccessSchema, ProvenanceAuditObservationsSuccessSchema, UpstreamTrafficSuccessSchema, ControllerErrorSchema])))();
19113
+ }).passthrough().and(z.union([ListScenariosSuccessSchema, StateTransitionSuccessSchema, SimulationSuccessSchema, ForcedDirectiveSuccessSchema, SeedSuccessSchema, ProvenanceAuditObservationsSuccessSchema, UpstreamTrafficSuccessSchema, ControllerErrorSchema]).describe("Must also satisfy at least one of these alternatives.")))();
19131
19114
  const AdCPAsyncResponseDataSchema = /* @__PURE__ */ (() => z.union([GetProductsResponseSchema, GetProductsRejectedSchema, GetProductsAsyncWorkingSchema, GetProductsAsyncInputRequiredSchema, GetProductsAsyncSubmittedSchema, RequestProposalsResponseSchema, RequestProposalsAsyncSubmittedSchema, RefineProposalsResponseSchema, RefineProposalsAsyncSubmittedSchema, DeclineProposalsResponseSchema, MediaBuyCommitmentResponseSchema, ControlMediaBuyResponseSchema, CompactTaskSubmittedSchema, CompactTaskWorkingSchema, CompactTaskInputRequiredSchema, GetSignalsResponseSchema, GetSignalsAsyncWorkingSchema, GetSignalsAsyncSubmittedSchema, CreateMediaBuyResponseSchema, CreateMediaBuyAsyncWorkingSchema, CreateMediaBuyAsyncInputRequiredSchema, CreateMediaBuyAsyncSubmittedSchema, UpdateMediaBuyResponseSchema, UpdateMediaBuyAsyncWorkingSchema, UpdateMediaBuyAsyncInputRequiredSchema, UpdateMediaBuyAsyncSubmittedSchema, MediaBuyDeliveryWebhookResultSchema, BuildCreativeResponseSchema, PreviewCreativeResponseSchema, BuildCreativeAsyncWorkingSchema, BuildCreativeAsyncInputRequiredSchema, BuildCreativeAsyncSubmittedSchema, GetCreativeFeaturesResponseSchema, GetCreativeFeaturesAsyncSubmittedSchema, SyncCreativesResponseSchema, SyncCreativesAsyncWorkingSchema, SyncCreativesAsyncInputRequiredSchema, SyncCreativesAsyncSubmittedSchema, SyncCatalogsResponseSchema, SyncCatalogsAsyncWorkingSchema, SyncCatalogsAsyncInputRequiredSchema, SyncCatalogsAsyncSubmittedSchema]))();
19132
19115
  const MCPWebhookPayloadSchema = /* @__PURE__ */ (() => z.object({
19133
19116
  idempotency_key: z.string().min(16).max(255).regex(/^[A-Za-z0-9_.:-]{16,255}$/),
@@ -19137,7 +19120,7 @@ const MCPWebhookPayloadSchema = /* @__PURE__ */ (() => z.object({
19137
19120
  task_type: TaskTypeSchema,
19138
19121
  protocol: AdCPProtocolSchema.optional(),
19139
19122
  status: TaskStatusSchema,
19140
- timestamp: z.iso.datetime(),
19123
+ timestamp: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
19141
19124
  message: z.string().optional(),
19142
19125
  context_id: z.string().optional(),
19143
19126
  token: z.string().min(16).max(4096).optional(),
@@ -19168,7 +19151,7 @@ const CreateMediaBuyRequestSchema = /* @__PURE__ */ (() => z.object({
19168
19151
  invoice_recipient: BusinessEntitySchema.optional(),
19169
19152
  io_acceptance: z.object({
19170
19153
  io_id: z.string(),
19171
- accepted_at: z.iso.datetime(),
19154
+ accepted_at: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
19172
19155
  signatory: z.string().min(1).max(250),
19173
19156
  signature_id: z.string().optional()
19174
19157
  }).passthrough().optional(),
@@ -19176,7 +19159,7 @@ const CreateMediaBuyRequestSchema = /* @__PURE__ */ (() => z.object({
19176
19159
  name: z.string().min(1).max(255).regex(/\S/).optional(),
19177
19160
  agency_estimate_number: z.string().max(100).optional(),
19178
19161
  start_time: StartTimingSchema,
19179
- end_time: z.iso.datetime(),
19162
+ end_time: z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time"),
19180
19163
  pacing: PacingSchema.optional(),
19181
19164
  bidding: BiddingPolicySchema.optional(),
19182
19165
  paused: z.boolean().optional(),