@adcp/sdk 14.0.0-rc.38 → 14.0.0-rc.39

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 (600) hide show
  1. package/bin/adcp-storyboard-summary.js +286 -0
  2. package/bin/adcp.js +221 -10
  3. package/dist/lib/conformance/schemaLoader.d.mts +1 -1
  4. package/dist/lib/conformance/schemaLoader.d.ts +1 -1
  5. package/dist/lib/core/AgentClient.d.mts +6 -1
  6. package/dist/lib/core/AgentClient.d.ts +6 -1
  7. package/dist/lib/core/AgentClient.js +9 -0
  8. package/dist/lib/core/AgentClient.mjs +9 -0
  9. package/dist/lib/core/ConversationTypes.d.mts +29 -0
  10. package/dist/lib/core/ConversationTypes.d.ts +29 -0
  11. package/dist/lib/core/SingleAgentClient.d.mts +3 -1
  12. package/dist/lib/core/SingleAgentClient.d.ts +3 -1
  13. package/dist/lib/core/SingleAgentClient.js +9 -1
  14. package/dist/lib/core/SingleAgentClient.mjs +9 -1
  15. package/dist/lib/core/TaskExecutor.d.mts +13 -1
  16. package/dist/lib/core/TaskExecutor.d.ts +13 -1
  17. package/dist/lib/core/TaskExecutor.js +216 -18
  18. package/dist/lib/core/TaskExecutor.mjs +216 -19
  19. package/dist/lib/index.d.mts +5 -2
  20. package/dist/lib/index.d.ts +5 -2
  21. package/dist/lib/index.js +10 -1
  22. package/dist/lib/index.mjs +10 -1
  23. package/dist/lib/media-buy/action-assessment.d.mts +77 -0
  24. package/dist/lib/media-buy/action-assessment.d.ts +77 -0
  25. package/dist/lib/media-buy/action-assessment.js +300 -0
  26. package/dist/lib/media-buy/action-assessment.mjs +284 -0
  27. package/dist/lib/media-buy/action-constraints.d.mts +9 -0
  28. package/dist/lib/media-buy/action-constraints.d.ts +9 -0
  29. package/dist/lib/media-buy/action-constraints.js +170 -0
  30. package/dist/lib/media-buy/action-constraints.mjs +146 -0
  31. package/dist/lib/media-buy/action-contracts.d.mts +40 -0
  32. package/dist/lib/media-buy/action-contracts.d.ts +40 -0
  33. package/dist/lib/media-buy/action-contracts.js +304 -0
  34. package/dist/lib/media-buy/action-contracts.mjs +267 -0
  35. package/dist/lib/media-buy/action-metadata.generated.d.mts +37 -0
  36. package/dist/lib/media-buy/action-metadata.generated.d.ts +37 -0
  37. package/dist/lib/media-buy/action-metadata.generated.js +128 -0
  38. package/dist/lib/media-buy/action-metadata.generated.mjs +101 -0
  39. package/dist/lib/media-buy/action-types.d.mts +106 -0
  40. package/dist/lib/media-buy/action-types.d.ts +106 -0
  41. package/dist/lib/{types/v3-1-beta/tools.generated.js → media-buy/action-types.js} +2 -2
  42. package/dist/lib/media-buy/actions.d.mts +6 -0
  43. package/dist/lib/media-buy/actions.d.ts +6 -0
  44. package/dist/lib/media-buy/actions.js +38 -0
  45. package/dist/lib/media-buy/actions.mjs +9 -0
  46. package/dist/lib/media-buy/available-actions.d.mts +2 -1
  47. package/dist/lib/media-buy/available-actions.d.ts +2 -1
  48. package/dist/lib/media-buy/available-actions.js +4 -3
  49. package/dist/lib/media-buy/available-actions.mjs +4 -3
  50. package/dist/lib/media-buy/compatibility.js +3 -0
  51. package/dist/lib/media-buy/compatibility.mjs +3 -0
  52. package/dist/lib/media-buy/index.d.mts +4 -0
  53. package/dist/lib/media-buy/index.d.ts +4 -0
  54. package/dist/lib/media-buy/index.js +3 -1
  55. package/dist/lib/media-buy/index.mjs +1 -0
  56. package/dist/lib/media-buy/legacy-action-ids.d.mts +1 -0
  57. package/dist/lib/media-buy/legacy-action-ids.d.ts +1 -0
  58. package/dist/lib/media-buy/legacy-action-ids.js +50 -0
  59. package/dist/lib/media-buy/legacy-action-ids.mjs +26 -0
  60. package/dist/lib/media-buy/mutations.d.mts +70 -0
  61. package/dist/lib/media-buy/mutations.d.ts +70 -0
  62. package/dist/lib/media-buy/mutations.js +525 -0
  63. package/dist/lib/media-buy/mutations.mjs +498 -0
  64. package/dist/lib/media-buy/preflight.d.mts +20 -69
  65. package/dist/lib/media-buy/preflight.d.ts +20 -69
  66. package/dist/lib/media-buy/preflight.js +100 -336
  67. package/dist/lib/media-buy/preflight.mjs +111 -333
  68. package/dist/lib/media-buy/targeting-input.d.mts +7 -4
  69. package/dist/lib/media-buy/targeting-input.d.ts +7 -4
  70. package/dist/lib/media-buy/types.d.mts +55 -7
  71. package/dist/lib/media-buy/types.d.ts +55 -7
  72. package/dist/lib/protocols/rawResponseCapture.d.mts +12 -0
  73. package/dist/lib/protocols/rawResponseCapture.d.ts +12 -0
  74. package/dist/lib/protocols/rawResponseCapture.js +33 -3
  75. package/dist/lib/protocols/rawResponseCapture.mjs +32 -3
  76. package/dist/lib/registry/types.generated.d.mts +377 -9
  77. package/dist/lib/registry/types.generated.d.ts +377 -9
  78. package/dist/lib/reporting/evidence.d.mts +1 -0
  79. package/dist/lib/reporting/evidence.d.ts +1 -0
  80. package/dist/lib/reporting/evidence.js +32 -3
  81. package/dist/lib/reporting/evidence.mjs +31 -3
  82. package/dist/lib/reporting/ledger/handler.d.mts +51 -1
  83. package/dist/lib/reporting/ledger/handler.d.ts +51 -1
  84. package/dist/lib/reporting/ledger/handler.js +306 -38
  85. package/dist/lib/reporting/ledger/handler.mjs +304 -37
  86. package/dist/lib/reporting/ledger/health.d.mts +12 -0
  87. package/dist/lib/reporting/ledger/health.d.ts +12 -0
  88. package/dist/lib/reporting/ledger/health.js +15 -2
  89. package/dist/lib/reporting/ledger/health.mjs +13 -1
  90. package/dist/lib/reporting/ledger/index.d.mts +3 -0
  91. package/dist/lib/reporting/ledger/index.d.ts +3 -0
  92. package/dist/lib/reporting/ledger/index.js +7 -1
  93. package/dist/lib/reporting/ledger/index.mjs +3 -0
  94. package/dist/lib/reporting/ledger/lifecycle.d.mts +31 -4
  95. package/dist/lib/reporting/ledger/lifecycle.d.ts +31 -4
  96. package/dist/lib/reporting/ledger/lifecycle.js +244 -37
  97. package/dist/lib/reporting/ledger/lifecycle.mjs +244 -37
  98. package/dist/lib/reporting/ledger/managed-postgres.d.mts +231 -0
  99. package/dist/lib/reporting/ledger/managed-postgres.d.ts +231 -0
  100. package/dist/lib/reporting/ledger/managed-postgres.js +1797 -0
  101. package/dist/lib/reporting/ledger/managed-postgres.mjs +1776 -0
  102. package/dist/lib/reporting/ledger/managed.d.mts +355 -0
  103. package/dist/lib/reporting/ledger/managed.d.ts +355 -0
  104. package/dist/lib/reporting/ledger/managed.js +661 -0
  105. package/dist/lib/reporting/ledger/managed.mjs +633 -0
  106. package/dist/lib/reporting/ledger/notification-activity.d.mts +222 -0
  107. package/dist/lib/reporting/ledger/notification-activity.d.ts +222 -0
  108. package/dist/lib/reporting/ledger/notification-activity.js +1139 -0
  109. package/dist/lib/reporting/ledger/notification-activity.mjs +1110 -0
  110. package/dist/lib/reporting/ledger/postgres.d.mts +161 -1
  111. package/dist/lib/reporting/ledger/postgres.d.ts +161 -1
  112. package/dist/lib/reporting/ledger/postgres.js +1153 -21
  113. package/dist/lib/reporting/ledger/postgres.mjs +1152 -21
  114. package/dist/lib/reporting/ledger/producer.d.mts +8 -0
  115. package/dist/lib/reporting/ledger/producer.d.ts +8 -0
  116. package/dist/lib/reporting/ledger/producer.js +146 -52
  117. package/dist/lib/reporting/ledger/producer.mjs +146 -51
  118. package/dist/lib/reporting/ledger/types.d.mts +358 -1
  119. package/dist/lib/reporting/ledger/types.d.ts +358 -1
  120. package/dist/lib/reporting/ledger/types.js +3 -0
  121. package/dist/lib/reporting/ledger/types.mjs +2 -0
  122. package/dist/lib/reporting/service/conformance.d.mts +35 -0
  123. package/dist/lib/reporting/service/conformance.d.ts +35 -0
  124. package/dist/lib/reporting/service/conformance.js +89 -0
  125. package/dist/lib/reporting/service/conformance.mjs +68 -0
  126. package/dist/lib/reporting/service/index.d.mts +182 -0
  127. package/dist/lib/reporting/service/index.d.ts +182 -0
  128. package/dist/lib/reporting/service/index.js +793 -0
  129. package/dist/lib/reporting/service/index.mjs +787 -0
  130. package/dist/lib/reporting/source/index.d.mts +2 -1
  131. package/dist/lib/reporting/source/index.d.ts +2 -1
  132. package/dist/lib/reporting/source/index.js +16 -3
  133. package/dist/lib/reporting/source/index.mjs +12 -1
  134. package/dist/lib/reporting/source/inline.d.mts +88 -1
  135. package/dist/lib/reporting/source/inline.d.ts +88 -1
  136. package/dist/lib/reporting/source/inline.js +1161 -163
  137. package/dist/lib/reporting/source/inline.mjs +1166 -163
  138. package/dist/lib/reporting/source/manifest.js +12 -7
  139. package/dist/lib/reporting/source/manifest.mjs +12 -7
  140. package/dist/lib/reporting/source/source.d.mts +26 -0
  141. package/dist/lib/reporting/source/source.d.ts +26 -0
  142. package/dist/lib/reporting/source/source.js +71 -2
  143. package/dist/lib/reporting/source/source.mjs +65 -1
  144. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  145. package/dist/lib/server/create-adcp-server.d.mts +18 -0
  146. package/dist/lib/server/create-adcp-server.d.ts +18 -0
  147. package/dist/lib/server/create-adcp-server.js +52 -2
  148. package/dist/lib/server/create-adcp-server.mjs +52 -2
  149. package/dist/lib/server/decisioning/account.d.mts +1 -1
  150. package/dist/lib/server/decisioning/account.d.ts +1 -1
  151. package/dist/lib/server/decisioning/index.d.mts +1 -0
  152. package/dist/lib/server/decisioning/index.d.ts +1 -0
  153. package/dist/lib/server/decisioning/platform.d.mts +3 -0
  154. package/dist/lib/server/decisioning/platform.d.ts +3 -0
  155. package/dist/lib/server/decisioning/runtime/from-platform.js +88 -10
  156. package/dist/lib/server/decisioning/runtime/from-platform.mjs +88 -10
  157. package/dist/lib/server/decisioning/specialisms/reporting.d.mts +38 -0
  158. package/dist/lib/server/decisioning/specialisms/reporting.d.ts +38 -0
  159. package/dist/lib/{types/v3-1-beta/index.js → server/decisioning/specialisms/reporting.js} +2 -8
  160. package/dist/lib/server/decisioning/specialisms/reporting.mjs +0 -0
  161. package/dist/lib/server/index.d.mts +4 -2
  162. package/dist/lib/server/index.d.ts +4 -2
  163. package/dist/lib/server/index.js +5 -0
  164. package/dist/lib/server/index.mjs +4 -0
  165. package/dist/lib/server/media-buy-action-resolver.d.mts +63 -0
  166. package/dist/lib/server/media-buy-action-resolver.d.ts +63 -0
  167. package/dist/lib/server/media-buy-action-resolver.js +297 -0
  168. package/dist/lib/server/media-buy-action-resolver.mjs +285 -0
  169. package/dist/lib/server/media-buy-actions.d.mts +7 -8
  170. package/dist/lib/server/media-buy-actions.d.ts +7 -8
  171. package/dist/lib/server/media-buy-actions.js +57 -14
  172. package/dist/lib/server/media-buy-actions.mjs +63 -14
  173. package/dist/lib/server/notification-subscriptions/index.d.mts +2 -2
  174. package/dist/lib/server/notification-subscriptions/index.d.ts +2 -2
  175. package/dist/lib/server/notification-subscriptions/index.js +2 -0
  176. package/dist/lib/server/notification-subscriptions/index.mjs +2 -0
  177. package/dist/lib/server/notification-subscriptions/postgres-runtime.d.mts +3 -1
  178. package/dist/lib/server/notification-subscriptions/postgres-runtime.d.ts +3 -1
  179. package/dist/lib/server/notification-subscriptions/postgres-runtime.js +1 -0
  180. package/dist/lib/server/notification-subscriptions/postgres-runtime.mjs +1 -0
  181. package/dist/lib/server/notification-subscriptions/runtime.d.mts +12 -1
  182. package/dist/lib/server/notification-subscriptions/runtime.d.ts +12 -1
  183. package/dist/lib/server/notification-subscriptions/runtime.js +102 -16
  184. package/dist/lib/server/notification-subscriptions/runtime.mjs +101 -16
  185. package/dist/lib/server/notification-subscriptions/types.d.mts +104 -1
  186. package/dist/lib/server/notification-subscriptions/types.d.ts +104 -1
  187. package/dist/lib/server/webhook-emitter.d.mts +40 -5
  188. package/dist/lib/server/webhook-emitter.d.ts +40 -5
  189. package/dist/lib/server/webhook-emitter.js +23 -12
  190. package/dist/lib/server/webhook-emitter.mjs +23 -12
  191. package/dist/lib/storage/interfaces.d.mts +14 -2
  192. package/dist/lib/storage/interfaces.d.ts +14 -2
  193. package/dist/lib/testing/compliance/comply.d.mts +9 -3
  194. package/dist/lib/testing/compliance/comply.d.ts +9 -3
  195. package/dist/lib/testing/compliance/comply.js +158 -3
  196. package/dist/lib/testing/compliance/comply.mjs +159 -4
  197. package/dist/lib/testing/compliance/storyboard-tracks.js +7 -5
  198. package/dist/lib/testing/compliance/storyboard-tracks.mjs +7 -5
  199. package/dist/lib/testing/compliance/summary.js +10 -1
  200. package/dist/lib/testing/compliance/summary.mjs +10 -1
  201. package/dist/lib/testing/index.d.mts +1 -1
  202. package/dist/lib/testing/index.d.ts +1 -1
  203. package/dist/lib/testing/index.js +2 -0
  204. package/dist/lib/testing/index.mjs +3 -1
  205. package/dist/lib/testing/storyboard/agent-routing.d.mts +12 -43
  206. package/dist/lib/testing/storyboard/agent-routing.d.ts +12 -43
  207. package/dist/lib/testing/storyboard/agent-routing.js +75 -13
  208. package/dist/lib/testing/storyboard/agent-routing.mjs +70 -12
  209. package/dist/lib/testing/storyboard/index.d.mts +1 -0
  210. package/dist/lib/testing/storyboard/index.d.ts +1 -0
  211. package/dist/lib/testing/storyboard/index.js +3 -0
  212. package/dist/lib/testing/storyboard/index.mjs +2 -0
  213. package/dist/lib/testing/storyboard/junit.d.mts +1 -1
  214. package/dist/lib/testing/storyboard/junit.d.ts +1 -1
  215. package/dist/lib/testing/storyboard/junit.js +21 -2
  216. package/dist/lib/testing/storyboard/junit.mjs +21 -2
  217. package/dist/lib/testing/storyboard/probes.d.mts +130 -0
  218. package/dist/lib/testing/storyboard/probes.d.ts +130 -0
  219. package/dist/lib/testing/storyboard/probes.js +682 -10
  220. package/dist/lib/testing/storyboard/probes.mjs +683 -3
  221. package/dist/lib/testing/storyboard/request-signing/builder.d.mts +16 -5
  222. package/dist/lib/testing/storyboard/request-signing/builder.d.ts +16 -5
  223. package/dist/lib/testing/storyboard/request-signing/grader.d.mts +44 -1
  224. package/dist/lib/testing/storyboard/request-signing/grader.d.ts +44 -1
  225. package/dist/lib/testing/storyboard/request-signing/grader.js +46 -22
  226. package/dist/lib/testing/storyboard/request-signing/grader.mjs +43 -21
  227. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.d.mts +86 -11
  228. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.d.ts +86 -11
  229. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.js +119 -25
  230. package/dist/lib/testing/storyboard/request-signing/probe-dispatch.mjs +117 -26
  231. package/dist/lib/testing/storyboard/request-signing/synthesize.js +22 -2
  232. package/dist/lib/testing/storyboard/request-signing/synthesize.mjs +22 -2
  233. package/dist/lib/testing/storyboard/runner.d.mts +103 -0
  234. package/dist/lib/testing/storyboard/runner.d.ts +103 -0
  235. package/dist/lib/testing/storyboard/runner.js +1090 -268
  236. package/dist/lib/testing/storyboard/runner.mjs +1096 -261
  237. package/dist/lib/testing/storyboard/seeding.d.mts +4 -1
  238. package/dist/lib/testing/storyboard/seeding.d.ts +4 -1
  239. package/dist/lib/testing/storyboard/seeding.js +55 -24
  240. package/dist/lib/testing/storyboard/seeding.mjs +55 -24
  241. package/dist/lib/testing/storyboard/test-kit.d.mts +37 -3
  242. package/dist/lib/testing/storyboard/test-kit.d.ts +37 -3
  243. package/dist/lib/testing/storyboard/test-kit.js +8 -2
  244. package/dist/lib/testing/storyboard/test-kit.mjs +7 -2
  245. package/dist/lib/testing/storyboard/types.d.mts +132 -10
  246. package/dist/lib/testing/storyboard/types.d.ts +132 -10
  247. package/dist/lib/testing/storyboard/types.js +17 -0
  248. package/dist/lib/testing/storyboard/types.mjs +16 -0
  249. package/dist/lib/testing/storyboard/validations.d.mts +1 -1
  250. package/dist/lib/testing/storyboard/validations.d.ts +1 -1
  251. package/dist/lib/testing/storyboard/validations.js +16 -0
  252. package/dist/lib/testing/storyboard/validations.mjs +16 -0
  253. package/dist/lib/testing/test-controller.d.mts +1 -1
  254. package/dist/lib/testing/test-controller.d.ts +1 -1
  255. package/dist/lib/types/buy-products.d.ts +71 -6
  256. package/dist/lib/types/control-media-buy.d.ts +25 -11
  257. package/dist/lib/types/core.generated.d.mts +69 -10
  258. package/dist/lib/types/core.generated.d.ts +69 -10
  259. package/dist/lib/types/create-media-buy.d.ts +71 -6
  260. package/dist/lib/types/forward-compat-error-codes.d.mts +7 -6
  261. package/dist/lib/types/forward-compat-error-codes.d.ts +7 -6
  262. package/dist/lib/types/index.d.mts +2 -2
  263. package/dist/lib/types/index.d.ts +2 -2
  264. package/dist/lib/types/schemas.generated.d.ts +8040 -8116
  265. package/dist/lib/types/schemas.generated.js +1074 -309
  266. package/dist/lib/types/schemas.generated.mjs +1068 -309
  267. package/dist/lib/types/tools.generated.d.mts +65 -6
  268. package/dist/lib/types/tools.generated.d.ts +65 -6
  269. package/dist/lib/types/update-media-buy.d.ts +71 -6
  270. package/dist/lib/utils/redact-secrets.d.mts +1 -1
  271. package/dist/lib/utils/redact-secrets.d.ts +1 -1
  272. package/dist/lib/utils/redact-secrets.js +1 -1
  273. package/dist/lib/utils/redact-secrets.mjs +1 -1
  274. package/dist/lib/v2/projection/cache-versions.d.mts +0 -1
  275. package/dist/lib/v2/projection/cache-versions.d.ts +0 -1
  276. package/dist/lib/v2/projection/cache-versions.js +1 -15
  277. package/dist/lib/v2/projection/cache-versions.mjs +1 -14
  278. package/dist/lib/v2/projection/canonical-properties.js +2 -2
  279. package/dist/lib/v2/projection/canonical-properties.mjs +3 -3
  280. package/dist/lib/v2/projection/registry.d.mts +1 -1
  281. package/dist/lib/v2/projection/registry.d.ts +1 -1
  282. package/dist/lib/v2/projection/registry.js +2 -2
  283. package/dist/lib/v2/projection/registry.mjs +3 -3
  284. package/dist/lib/version.d.mts +5 -5
  285. package/dist/lib/version.d.ts +5 -5
  286. package/dist/lib/version.js +3 -8
  287. package/dist/lib/version.mjs +3 -8
  288. package/dist/lib/wholesale-feed-sync/index.d.mts +1 -0
  289. package/dist/lib/wholesale-feed-sync/index.d.ts +1 -0
  290. package/dist/lib/wholesale-feed-sync/protocol-types.d.mts +42 -0
  291. package/dist/lib/wholesale-feed-sync/protocol-types.d.ts +42 -0
  292. package/dist/lib/wholesale-feed-sync/protocol-types.js +16 -0
  293. package/dist/lib/wholesale-feed-sync/protocol-types.mjs +0 -0
  294. package/dist/lib/wholesale-feed-sync/sync.d.mts +6 -6
  295. package/dist/lib/wholesale-feed-sync/sync.d.ts +6 -6
  296. package/dist/lib/wholesale-feed-sync/sync.js +3 -1
  297. package/dist/lib/wholesale-feed-sync/sync.mjs +3 -1
  298. package/dist/lib/wholesale-feed-sync/types.d.mts +15 -14
  299. package/dist/lib/wholesale-feed-sync/types.d.ts +15 -14
  300. package/dist/lib/wholesale-feed-sync/webhook-notification.d.mts +7 -5
  301. package/dist/lib/wholesale-feed-sync/webhook-notification.d.ts +7 -5
  302. package/dist/lib/wholesale-feed-sync/webhook-notification.js +45 -0
  303. package/dist/lib/wholesale-feed-sync/webhook-notification.mjs +44 -0
  304. package/docs/CLI.md +1 -1
  305. package/docs/TYPE-SUMMARY.md +118 -4
  306. package/docs/guides/ASYNC-API-REFERENCE.md +62 -1
  307. package/docs/guides/ASYNC-DEVELOPER-GUIDE.md +25 -0
  308. package/docs/guides/ASYNC-DOCUMENTATION-INDEX.md +3 -0
  309. package/docs/guides/BUYER-QUICKSTART-3.2.md +5 -0
  310. package/docs/guides/DURABLE-BUYER-WRITES.md +337 -0
  311. package/docs/guides/EXISTING-PLATFORM.md +35 -0
  312. package/docs/guides/MEDIA-BUY-3.2-COMPATIBILITY.md +7 -3
  313. package/docs/guides/MEDIA-BUY-ACTION-ASSESSMENT.md +300 -0
  314. package/docs/guides/REPORTING-LEDGER.md +654 -3
  315. package/docs/guides/REPORTING-SOURCE-EXECUTOR.md +63 -1
  316. package/docs/guides/SELLER-QUICKSTART-3.2.md +2 -0
  317. package/docs/guides/VALIDATE-YOUR-AGENT.md +35 -0
  318. package/docs/guides/idempotency-crash-recovery.md +4 -0
  319. package/docs/llms.txt +4 -2
  320. package/docs/migration-14.x-rc-worksheet.md +5 -5
  321. package/docs/migration-7.9-to-7.10.md +7 -5
  322. package/examples/README.md +17 -0
  323. package/examples/durable-buyer-writes/caller.ts +745 -0
  324. package/examples/durable-buyer-writes/worker.ts +240 -0
  325. package/examples/reliable-reporting-service/README.md +100 -0
  326. package/examples/seller-3.2-starter.ts +7 -8
  327. package/examples/targeting-input-existing-platform.ts +153 -0
  328. package/package.json +41 -29
  329. package/skills/build-seller-agent/specialisms/signed-requests.md +11 -1
  330. package/skills/cross-cutting.md +28 -11
  331. package/compliance/cache/3.1.0-beta.7/domains/brand/index.yaml +0 -160
  332. package/compliance/cache/3.1.0-beta.7/domains/brand/scenarios/distributed_brand_resolution.yaml +0 -415
  333. package/compliance/cache/3.1.0-beta.7/domains/brand/scenarios/single_side_trust_extension.yaml +0 -454
  334. package/compliance/cache/3.1.0-beta.7/domains/creative/index.yaml +0 -339
  335. package/compliance/cache/3.1.0-beta.7/domains/creative/scenarios/billing_out_of_band.yaml +0 -153
  336. package/compliance/cache/3.1.0-beta.7/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -389
  337. package/compliance/cache/3.1.0-beta.7/domains/creative/scenarios/native_in_feed.yaml +0 -543
  338. package/compliance/cache/3.1.0-beta.7/domains/governance/index.yaml +0 -682
  339. package/compliance/cache/3.1.0-beta.7/domains/media-buy/index.yaml +0 -781
  340. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/audience_buy_flow.yaml +0 -380
  341. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/available_actions.yaml +0 -565
  342. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/billing_finality_delivery.yaml +0 -354
  343. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/canonical_formats.yaml +0 -711
  344. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/clicks_buy_flow.yaml +0 -264
  345. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/completed_views_buy_flow.yaml +0 -344
  346. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/create_media_buy_async.yaml +0 -234
  347. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +0 -419
  348. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/creative_reception.yaml +0 -247
  349. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/delivery_reporting.yaml +0 -357
  350. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/dependency_impairment.yaml +0 -633
  351. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +0 -800
  352. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/event_dedup_flow.yaml +0 -399
  353. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -309
  354. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/governance_approved.yaml +0 -214
  355. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/governance_conditions.yaml +0 -199
  356. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/governance_denied.yaml +0 -204
  357. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/governance_denied_recovery.yaml +0 -252
  358. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/invalid_transitions.yaml +0 -289
  359. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/inventory_list_no_match.yaml +0 -148
  360. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/inventory_list_targeting.yaml +0 -276
  361. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/measurement_accountability.yaml +0 -244
  362. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/measurement_terms_rejected.yaml +0 -203
  363. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/pending_creatives_to_start.yaml +0 -274
  364. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -500
  365. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/performance_buy_flow.yaml +0 -428
  366. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -470
  367. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/product_signal_targeting.yaml +0 -373
  368. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/proposal_finalize.yaml +0 -399
  369. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -264
  370. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/proposal_not_found_errors.yaml +0 -257
  371. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/provenance_audit_observation.yaml +0 -333
  372. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/provenance_enforcement.yaml +0 -517
  373. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -294
  374. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/reach_buy_flow.yaml +0 -823
  375. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -360
  376. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/refine_products.yaml +0 -148
  377. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/vendor_metric_accountability.yaml +0 -293
  378. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -307
  379. package/compliance/cache/3.1.0-beta.7/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -576
  380. package/compliance/cache/3.1.0-beta.7/domains/media-buy/state-machine.yaml +0 -442
  381. package/compliance/cache/3.1.0-beta.7/domains/signals/index.yaml +0 -266
  382. package/compliance/cache/3.1.0-beta.7/domains/sponsored-intelligence/index.yaml +0 -256
  383. package/compliance/cache/3.1.0-beta.7/index.json +0 -356
  384. package/compliance/cache/3.1.0-beta.7/protocols/brand/index.yaml +0 -160
  385. package/compliance/cache/3.1.0-beta.7/protocols/brand/scenarios/distributed_brand_resolution.yaml +0 -415
  386. package/compliance/cache/3.1.0-beta.7/protocols/brand/scenarios/single_side_trust_extension.yaml +0 -454
  387. package/compliance/cache/3.1.0-beta.7/protocols/creative/index.yaml +0 -339
  388. package/compliance/cache/3.1.0-beta.7/protocols/creative/scenarios/billing_out_of_band.yaml +0 -153
  389. package/compliance/cache/3.1.0-beta.7/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +0 -389
  390. package/compliance/cache/3.1.0-beta.7/protocols/creative/scenarios/native_in_feed.yaml +0 -543
  391. package/compliance/cache/3.1.0-beta.7/protocols/governance/index.yaml +0 -682
  392. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/index.yaml +0 -781
  393. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/audience_buy_flow.yaml +0 -380
  394. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/available_actions.yaml +0 -565
  395. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/billing_finality_delivery.yaml +0 -354
  396. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/canonical_formats.yaml +0 -711
  397. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/clicks_buy_flow.yaml +0 -264
  398. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +0 -344
  399. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/create_media_buy_async.yaml +0 -234
  400. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +0 -419
  401. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/creative_reception.yaml +0 -247
  402. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/delivery_reporting.yaml +0 -357
  403. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/dependency_impairment.yaml +0 -633
  404. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +0 -800
  405. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/event_dedup_flow.yaml +0 -399
  406. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +0 -309
  407. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/governance_approved.yaml +0 -214
  408. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/governance_conditions.yaml +0 -199
  409. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/governance_denied.yaml +0 -204
  410. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/governance_denied_recovery.yaml +0 -252
  411. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/invalid_transitions.yaml +0 -289
  412. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/inventory_list_no_match.yaml +0 -148
  413. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/inventory_list_targeting.yaml +0 -276
  414. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/measurement_accountability.yaml +0 -244
  415. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +0 -203
  416. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +0 -274
  417. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +0 -500
  418. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/performance_buy_flow.yaml +0 -428
  419. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +0 -470
  420. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/product_signal_targeting.yaml +0 -373
  421. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/proposal_finalize.yaml +0 -399
  422. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +0 -264
  423. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +0 -257
  424. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/provenance_audit_observation.yaml +0 -333
  425. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/provenance_enforcement.yaml +0 -517
  426. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +0 -294
  427. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/reach_buy_flow.yaml +0 -823
  428. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +0 -360
  429. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/refine_products.yaml +0 -148
  430. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +0 -293
  431. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +0 -307
  432. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +0 -576
  433. package/compliance/cache/3.1.0-beta.7/protocols/media-buy/state-machine.yaml +0 -442
  434. package/compliance/cache/3.1.0-beta.7/protocols/signals/index.yaml +0 -266
  435. package/compliance/cache/3.1.0-beta.7/protocols/sponsored-intelligence/index.yaml +0 -256
  436. package/compliance/cache/3.1.0-beta.7/specialisms/audience-sync/index.yaml +0 -313
  437. package/compliance/cache/3.1.0-beta.7/specialisms/brand-rights/index.yaml +0 -350
  438. package/compliance/cache/3.1.0-beta.7/specialisms/brand-rights/scenarios/governance_denied.yaml +0 -226
  439. package/compliance/cache/3.1.0-beta.7/specialisms/collection-lists/index.yaml +0 -359
  440. package/compliance/cache/3.1.0-beta.7/specialisms/content-standards/index.yaml +0 -572
  441. package/compliance/cache/3.1.0-beta.7/specialisms/creative-ad-server/index.yaml +0 -409
  442. package/compliance/cache/3.1.0-beta.7/specialisms/creative-generative/generative-seller.yaml +0 -807
  443. package/compliance/cache/3.1.0-beta.7/specialisms/creative-generative/index.yaml +0 -758
  444. package/compliance/cache/3.1.0-beta.7/specialisms/creative-template/index.yaml +0 -510
  445. package/compliance/cache/3.1.0-beta.7/specialisms/governance-aware-seller/index.yaml +0 -143
  446. package/compliance/cache/3.1.0-beta.7/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +0 -117
  447. package/compliance/cache/3.1.0-beta.7/specialisms/governance-delivery-monitor/index.yaml +0 -441
  448. package/compliance/cache/3.1.0-beta.7/specialisms/governance-spend-authority/denied.yaml +0 -221
  449. package/compliance/cache/3.1.0-beta.7/specialisms/governance-spend-authority/index.yaml +0 -330
  450. package/compliance/cache/3.1.0-beta.7/specialisms/property-lists/index.yaml +0 -482
  451. package/compliance/cache/3.1.0-beta.7/specialisms/sales-broadcast-tv/index.yaml +0 -738
  452. package/compliance/cache/3.1.0-beta.7/specialisms/sales-catalog-driven/index.yaml +0 -840
  453. package/compliance/cache/3.1.0-beta.7/specialisms/sales-guaranteed/index.yaml +0 -601
  454. package/compliance/cache/3.1.0-beta.7/specialisms/sales-non-guaranteed/index.yaml +0 -546
  455. package/compliance/cache/3.1.0-beta.7/specialisms/sales-proposal-mode/index.yaml +0 -586
  456. package/compliance/cache/3.1.0-beta.7/specialisms/sales-social/index.yaml +0 -919
  457. package/compliance/cache/3.1.0-beta.7/specialisms/signal-marketplace/index.yaml +0 -424
  458. package/compliance/cache/3.1.0-beta.7/specialisms/signal-marketplace/scenarios/governance_denied.yaml +0 -211
  459. package/compliance/cache/3.1.0-beta.7/specialisms/signal-owned/index.yaml +0 -317
  460. package/compliance/cache/3.1.0-beta.7/specialisms/sponsored-intelligence/index.yaml +0 -59
  461. package/compliance/cache/3.1.0-beta.7/test-kits/acme-outdoor-live.yaml +0 -78
  462. package/compliance/cache/3.1.0-beta.7/test-kits/acme-outdoor.yaml +0 -223
  463. package/compliance/cache/3.1.0-beta.7/test-kits/billing-gate-runner.yaml +0 -115
  464. package/compliance/cache/3.1.0-beta.7/test-kits/bistro-oranje.yaml +0 -126
  465. package/compliance/cache/3.1.0-beta.7/test-kits/distributed-brand-runner.yaml +0 -281
  466. package/compliance/cache/3.1.0-beta.7/test-kits/nova-motors.yaml +0 -262
  467. package/compliance/cache/3.1.0-beta.7/test-kits/osei-natural.yaml +0 -126
  468. package/compliance/cache/3.1.0-beta.7/test-kits/parallel-dispatch-runner.yaml +0 -196
  469. package/compliance/cache/3.1.0-beta.7/test-kits/rate-limit-trip-runner.yaml +0 -172
  470. package/compliance/cache/3.1.0-beta.7/test-kits/signed-requests-runner.yaml +0 -155
  471. package/compliance/cache/3.1.0-beta.7/test-kits/single-side-trust-runner.yaml +0 -294
  472. package/compliance/cache/3.1.0-beta.7/test-kits/substitution-observer-runner.yaml +0 -688
  473. package/compliance/cache/3.1.0-beta.7/test-kits/summit-foods.yaml +0 -125
  474. package/compliance/cache/3.1.0-beta.7/test-kits/webhook-receiver-runner.yaml +0 -265
  475. package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/001-minimal-plan.json +0 -43
  476. package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/002-full-plan.json +0 -217
  477. package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/003-bookkeeping-stripped.json +0 -60
  478. package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/004a-human-review-omitted.json +0 -43
  479. package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/004b-human-review-explicit-null.json +0 -49
  480. package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/005a-policy-categories-order-1.json +0 -53
  481. package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/005b-policy-categories-order-2.json +0 -57
  482. package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/006a-ext-trace-v1.json +0 -49
  483. package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/006b-ext-trace-v2.json +0 -53
  484. package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/007-unicode-objectives.json +0 -43
  485. package/compliance/cache/3.1.0-beta.7/test-vectors/plan-hash/008-numeric-canonicalization.json +0 -65
  486. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/README.md +0 -220
  487. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/canonicalization.json +0 -241
  488. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/keys.json +0 -60
  489. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/001-no-signature-header.json +0 -24
  490. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/002-wrong-tag.json +0 -26
  491. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/003-expired-signature.json +0 -26
  492. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/004-window-too-long.json +0 -26
  493. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/005-alg-not-allowed.json +0 -26
  494. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/006-missing-covered-component.json +0 -26
  495. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/007-missing-content-digest.json +0 -26
  496. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/008-unknown-keyid.json +0 -26
  497. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +0 -27
  498. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/010-content-digest-mismatch.json +0 -33
  499. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/011-malformed-header.json +0 -27
  500. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/012-missing-expires-param.json +0 -26
  501. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/013-expires-le-created.json +0 -27
  502. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/014-missing-nonce-param.json +0 -27
  503. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/015-signature-invalid.json +0 -28
  504. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/016-replayed-nonce.json +0 -35
  505. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/017-key-revoked.json +0 -38
  506. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +0 -28
  507. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/019-signature-without-signature-input.json +0 -26
  508. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/020-rate-abuse.json +0 -34
  509. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +0 -31
  510. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/022-multi-valued-content-type.json +0 -31
  511. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +0 -32
  512. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/024-unquoted-string-param.json +0 -31
  513. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +0 -43
  514. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/026-non-ascii-host.json +0 -31
  515. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +0 -25
  516. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +0 -26
  517. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/001-basic-post.json +0 -30
  518. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/002-post-with-content-digest.json +0 -31
  519. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/003-es256-post.json +0 -30
  520. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/004-multiple-signature-labels.json +0 -26
  521. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/005-default-port-stripped.json +0 -30
  522. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/006-dot-segment-path.json +0 -30
  523. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/007-query-byte-preserved.json +0 -30
  524. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/008-percent-encoded-path.json +0 -30
  525. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +0 -30
  526. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +0 -30
  527. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/011-ipv6-authority.json +0 -30
  528. package/compliance/cache/3.1.0-beta.7/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +0 -30
  529. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/README.md +0 -211
  530. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/keys.json +0 -61
  531. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/001-wrong-tag.json +0 -26
  532. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/002-expired-signature.json +0 -26
  533. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/003-window-too-long.json +0 -26
  534. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +0 -26
  535. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/005-missing-authority-component.json +0 -26
  536. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/006-missing-content-digest.json +0 -25
  537. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/007-unknown-keyid.json +0 -26
  538. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +0 -26
  539. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +0 -26
  540. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +0 -26
  541. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/011-signature-without-input.json +0 -25
  542. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/012-missing-expires-param.json +0 -26
  543. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/013-expires-le-created.json +0 -26
  544. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +0 -26
  545. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/015-signature-invalid.json +0 -26
  546. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/016-replayed-nonce.json +0 -37
  547. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/017-key-revoked.json +0 -32
  548. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/018-rate-abuse.json +0 -33
  549. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/019-revocation-stale.json +0 -32
  550. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +0 -41
  551. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +0 -26
  552. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/positive/001-basic-post.json +0 -24
  553. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/positive/002-es256-post.json +0 -24
  554. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +0 -24
  555. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/positive/004-default-port-stripped.json +0 -24
  556. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +0 -24
  557. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +0 -24
  558. package/compliance/cache/3.1.0-beta.7/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +0 -25
  559. package/compliance/cache/3.1.0-beta.7/universal/billing-gate-dispatch.yaml +0 -450
  560. package/compliance/cache/3.1.0-beta.7/universal/canonical-format-validate-input.yaml +0 -640
  561. package/compliance/cache/3.1.0-beta.7/universal/capability-discovery.yaml +0 -125
  562. package/compliance/cache/3.1.0-beta.7/universal/collection-lists-pagination-integrity.yaml +0 -306
  563. package/compliance/cache/3.1.0-beta.7/universal/comply-controller-mode-gate.yaml +0 -141
  564. package/compliance/cache/3.1.0-beta.7/universal/content-standards-pagination-integrity.yaml +0 -326
  565. package/compliance/cache/3.1.0-beta.7/universal/deterministic-testing.yaml +0 -1430
  566. package/compliance/cache/3.1.0-beta.7/universal/error-compliance-signals.yaml +0 -377
  567. package/compliance/cache/3.1.0-beta.7/universal/error-compliance.yaml +0 -528
  568. package/compliance/cache/3.1.0-beta.7/universal/fictional-entities.yaml +0 -307
  569. package/compliance/cache/3.1.0-beta.7/universal/get-media-buys-pagination-integrity.yaml +0 -160
  570. package/compliance/cache/3.1.0-beta.7/universal/get-signals-pagination-integrity.yaml +0 -211
  571. package/compliance/cache/3.1.0-beta.7/universal/idempotency.yaml +0 -861
  572. package/compliance/cache/3.1.0-beta.7/universal/notification-config-event-scope.yaml +0 -119
  573. package/compliance/cache/3.1.0-beta.7/universal/notification-config-lifecycle.yaml +0 -337
  574. package/compliance/cache/3.1.0-beta.7/universal/notification-config-rejections.yaml +0 -107
  575. package/compliance/cache/3.1.0-beta.7/universal/pagination-integrity-creative-formats.yaml +0 -265
  576. package/compliance/cache/3.1.0-beta.7/universal/pagination-integrity-list-accounts.yaml +0 -245
  577. package/compliance/cache/3.1.0-beta.7/universal/pagination-integrity.yaml +0 -263
  578. package/compliance/cache/3.1.0-beta.7/universal/property-lists-pagination-integrity.yaml +0 -307
  579. package/compliance/cache/3.1.0-beta.7/universal/read-tool-idempotency.yaml +0 -405
  580. package/compliance/cache/3.1.0-beta.7/universal/runner-output-contract.yaml +0 -1266
  581. package/compliance/cache/3.1.0-beta.7/universal/schema-validation-signals.yaml +0 -181
  582. package/compliance/cache/3.1.0-beta.7/universal/schema-validation.yaml +0 -548
  583. package/compliance/cache/3.1.0-beta.7/universal/security.yaml +0 -539
  584. package/compliance/cache/3.1.0-beta.7/universal/signed-requests.yaml +0 -217
  585. package/compliance/cache/3.1.0-beta.7/universal/stale-response-advisory.yaml +0 -295
  586. package/compliance/cache/3.1.0-beta.7/universal/storyboard-schema.yaml +0 -2136
  587. package/compliance/cache/3.1.0-beta.7/universal/v3-envelope-integrity.yaml +0 -117
  588. package/compliance/cache/3.1.0-beta.7/universal/version-negotiation.yaml +0 -130
  589. package/compliance/cache/3.1.0-beta.7/universal/webhook-emission.yaml +0 -411
  590. package/compliance/cache/3.1.0-beta.7/universal/wholesale-feed-bulk-webhooks.yaml +0 -82
  591. package/compliance/cache/3.1.0-beta.7/universal/wholesale-feed-product-webhooks.yaml +0 -83
  592. package/compliance/cache/3.1.0-beta.7/universal/wholesale-feed-products.yaml +0 -151
  593. package/compliance/cache/3.1.0-beta.7/universal/wholesale-feed-signal-webhooks.yaml +0 -83
  594. package/compliance/cache/3.1.0-beta.7/universal/wholesale-feed-signals.yaml +0 -149
  595. package/dist/lib/types/v3-1-beta/index.d.mts +0 -1
  596. package/dist/lib/types/v3-1-beta/index.d.ts +0 -1
  597. package/dist/lib/types/v3-1-beta/index.mjs +0 -1
  598. package/dist/lib/types/v3-1-beta/tools.generated.d.mts +0 -26788
  599. package/dist/lib/types/v3-1-beta/tools.generated.d.ts +0 -26788
  600. /package/dist/lib/{types/v3-1-beta/tools.generated.mjs → media-buy/action-types.mjs} +0 -0
@@ -1337,12 +1337,18 @@ __export(schemas_generated_exports, {
1337
1337
  TargetLocalizationReadbackSchema: () => TargetLocalizationReadbackSchema,
1338
1338
  TargetingCollectionListSchema: () => TargetingCollectionListSchema,
1339
1339
  TargetingCollectionSelectionSchema: () => TargetingCollectionSelectionSchema,
1340
+ TargetingDevicePlatformsInputSchema: () => TargetingDevicePlatformsInputSchema,
1341
+ TargetingDeviceTypesInputSchema: () => TargetingDeviceTypesInputSchema,
1340
1342
  TargetingFrequencyCapSchema: () => TargetingFrequencyCapSchema,
1343
+ TargetingGeoMetrosInputSchema: () => TargetingGeoMetrosInputSchema,
1341
1344
  TargetingGeoMetrosSchema: () => TargetingGeoMetrosSchema,
1345
+ TargetingKeywordsInputSchema: () => TargetingKeywordsInputSchema,
1342
1346
  TargetingKeywordsSchema: () => TargetingKeywordsSchema,
1343
1347
  TargetingKvsSchema: () => TargetingKvsSchema,
1348
+ TargetingLanguagesInputSchema: () => TargetingLanguagesInputSchema,
1344
1349
  TargetingLanguagesSchema: () => TargetingLanguagesSchema,
1345
1350
  TargetingModificationSchema: () => TargetingModificationSchema,
1351
+ TargetingNegativeKeywordsInputSchema: () => TargetingNegativeKeywordsInputSchema,
1346
1352
  TargetingNegativeKeywordsSchema: () => TargetingNegativeKeywordsSchema,
1347
1353
  TargetingOverlayInputSchema: () => TargetingOverlayInputSchema,
1348
1354
  TargetingOverlayRequirementsSchema: () => TargetingOverlayRequirementsSchema,
@@ -2277,7 +2283,9 @@ const AgeRestrictionSchema = import_zod.z.object({
2277
2283
  verification_required: import_zod.z.boolean().optional(),
2278
2284
  accepted_methods: import_zod.z.array(AgeVerificationMethodSchema).optional()
2279
2285
  }).passthrough();
2286
+ const TargetingDevicePlatformsInputSchema = import_zod.z.array(DevicePlatformSchema);
2280
2287
  const DevicePlatformExcludeSchema = import_zod.z.array(DevicePlatformSchema);
2288
+ const TargetingDeviceTypesInputSchema = import_zod.z.array(DeviceTypeSchema);
2281
2289
  const DeviceTypeExcludeSchema = import_zod.z.array(DeviceTypeSchema);
2282
2290
  const BrowserSchema = import_zod.z.array(BrowserFamilySchema);
2283
2291
  const BrowserExcludeSchema = import_zod.z.array(BrowserFamilySchema);
@@ -2287,12 +2295,12 @@ const StoreCatchmentsSchema = import_zod.z.array(import_zod.z.object({
2287
2295
  catchment_ids: import_zod.z.array(import_zod.z.string()).optional()
2288
2296
  }).passthrough());
2289
2297
  const GeoProximitySchema = import_zod.z.array(import_zod.z.union([import_zod.z.object({}).passthrough(), import_zod.z.object({}).passthrough(), import_zod.z.object({}).passthrough()]));
2290
- const TargetingLanguagesSchema = import_zod.z.array(LanguageTagSchema);
2291
- const TargetingKeywordsSchema = import_zod.z.array(import_zod.z.object({
2298
+ const TargetingLanguagesInputSchema = import_zod.z.array(LanguageTagSchema).nullable();
2299
+ const TargetingKeywordsInputSchema = import_zod.z.array(import_zod.z.object({
2292
2300
  keyword: import_zod.z.string(),
2293
2301
  match_type: MatchTypeSchema,
2294
2302
  bid_price: import_zod.z.number().optional()
2295
- }).passthrough());
2303
+ }).passthrough()).nullable();
2296
2304
  const GeoMetroSchema = import_zod.z.object({
2297
2305
  system: MetroAreaSystemSchema,
2298
2306
  values: import_zod.z.array(import_zod.z.string())
@@ -4024,6 +4032,12 @@ const AttestationEvaluationSchema = import_zod.z.object({}).passthrough().merge(
4024
4032
  ext: ExtensionObjectSchema.optional()
4025
4033
  }).passthrough());
4026
4034
  const TargetingGeoMetrosSchema = import_zod.z.array(GeoMetroSchema);
4035
+ const TargetingLanguagesSchema = import_zod.z.array(LanguageTagSchema);
4036
+ const TargetingKeywordsSchema = import_zod.z.array(import_zod.z.object({
4037
+ keyword: import_zod.z.string(),
4038
+ match_type: MatchTypeSchema,
4039
+ bid_price: import_zod.z.number().optional()
4040
+ }).passthrough());
4027
4041
  const TargetingNegativeKeywordsSchema = import_zod.z.array(NegativeKeywordSchema);
4028
4042
  const DemographicPredicateSchema = import_zod.z.object({
4029
4043
  age: DemographicAgeRangeSchema
@@ -9457,11 +9471,13 @@ const DeclineProposalsRequestSchema = import_zod.z.object({
9457
9471
  declines: import_zod.z.array(ProposalDeclineSchema).max(25),
9458
9472
  opportunity: OpportunityContextSchema.optional()
9459
9473
  }).passthrough();
9474
+ const TargetingGeoMetrosInputSchema = import_zod.z.array(GeoMetroSchema).nullable();
9460
9475
  const GeoPostalAreasSchema = import_zod.z.array(PostalAreaSchema);
9461
9476
  const GeoPostalAreasExcludeSchema = import_zod.z.array(PostalAreaSchema);
9462
9477
  const GeoPlacesSchema = import_zod.z.array(GeographicPlaceAreaSchema);
9463
9478
  const GeoPlacesExcludeSchema = import_zod.z.array(GeographicPlaceAreaSchema);
9464
9479
  const DaypartTargetsSchema = import_zod.z.array(DaypartTargetSchema);
9480
+ const TargetingNegativeKeywordsInputSchema = import_zod.z.array(NegativeKeywordSchema).nullable();
9465
9481
  const AcceptProposalRequestSchema = import_zod.z.object({
9466
9482
  adcp_version: import_zod.z.string().optional(),
9467
9483
  adcp_major_version: import_zod.z.number().optional(),
@@ -13346,276 +13362,642 @@ const RightsConstraintSchema = import_zod.z.object({}).passthrough().merge(impor
13346
13362
  }).passthrough())).max(4).optional(),
13347
13363
  ext: ExtensionObjectSchema.optional()
13348
13364
  }).passthrough());
13349
- const TargetingOverlaySchema = TargetingUnknownAgeEligibilityConstraintSchema.merge(TargetingVerifiedAgeBasisConstraintSchema).merge(import_zod.z.object({
13350
- geo_countries: import_zod.z.array(import_zod.z.string()).optional(),
13351
- geo_countries_exclude: import_zod.z.array(import_zod.z.string()).optional(),
13352
- geo_regions: import_zod.z.array(import_zod.z.string()).optional(),
13353
- geo_regions_exclude: import_zod.z.array(import_zod.z.string()).optional(),
13354
- geo_metros: TargetingGeoMetrosSchema.optional(),
13355
- geo_metros_exclude: import_zod.z.array(import_zod.z.object({
13356
- system: MetroAreaSystemSchema,
13357
- values: import_zod.z.array(import_zod.z.string())
13358
- }).passthrough()).optional(),
13359
- geo_postal_areas: import_zod.z.array(PostalAreaSchema).optional(),
13360
- geo_postal_areas_exclude: import_zod.z.array(PostalAreaSchema).optional(),
13361
- geo_places: import_zod.z.array(GeographicPlaceAreaSchema).optional(),
13362
- geo_places_exclude: import_zod.z.array(GeographicPlaceAreaSchema).optional(),
13363
- daypart_targets: import_zod.z.array(DaypartTargetSchema).optional(),
13364
- axe_include_segment: import_zod.z.string().optional(),
13365
- axe_exclude_segment: import_zod.z.string().optional(),
13366
- audience_include: import_zod.z.array(import_zod.z.string()).optional(),
13367
- audience_exclude: import_zod.z.array(import_zod.z.string()).optional(),
13368
- signal_targeting_groups: TargetingSignalGroupsSchema.optional(),
13369
- signal_targeting: import_zod.z.array(SignalTargetingSchema).optional(),
13370
- demographics: DemographicTargetingIntentSchema.optional(),
13371
- frequency_cap: TargetingFrequencyCapSchema.optional(),
13372
- property_list: TargetingPropertyListSchema.optional(),
13373
- property_list_exclude: PropertyListReferenceSchema.optional(),
13374
- collection_list: TargetingCollectionListSchema.optional(),
13375
- collection_list_exclude: CollectionListReferenceSchema.optional(),
13376
- placement_selection: PlacementSelectionSchema.optional(),
13377
- collection_selection: TargetingCollectionSelectionSchema.optional(),
13378
- age_restriction: import_zod.z.object({
13379
- min: import_zod.z.number().int().gte(13).lte(99),
13380
- verification_required: import_zod.z.boolean().optional(),
13381
- accepted_methods: import_zod.z.array(AgeVerificationMethodSchema).optional()
13382
- }).passthrough().optional(),
13383
- device_platform: import_zod.z.array(DevicePlatformSchema).optional(),
13384
- device_platform_exclude: import_zod.z.array(DevicePlatformSchema).optional(),
13385
- device_type: import_zod.z.array(DeviceTypeSchema).optional(),
13386
- device_type_exclude: import_zod.z.array(DeviceTypeSchema).optional(),
13387
- browser: import_zod.z.array(BrowserFamilySchema).optional(),
13388
- browser_exclude: import_zod.z.array(BrowserFamilySchema).optional(),
13389
- store_catchments: import_zod.z.array(import_zod.z.object({
13390
- catalog_id: import_zod.z.string(),
13391
- store_ids: import_zod.z.array(import_zod.z.string()).optional(),
13392
- catchment_ids: import_zod.z.array(import_zod.z.string()).optional()
13393
- }).passthrough()).optional(),
13394
- geo_proximity: import_zod.z.array(import_zod.z.union([import_zod.z.object({}).passthrough(), import_zod.z.object({}).passthrough(), import_zod.z.object({}).passthrough()])).optional(),
13395
- language: TargetingLanguagesSchema.optional(),
13396
- keyword_targets: TargetingKeywordsSchema.optional(),
13397
- negative_keywords: TargetingNegativeKeywordsSchema.optional()
13398
- }).passthrough());
13399
- const DeliveryForecast1Schema = DeliveryForecastSchema;
13400
- const GetProductsAsyncInputRequiredSchema = import_zod.z.object({
13401
- reason: import_zod.z.union([import_zod.z.literal("CLARIFICATION_NEEDED"), import_zod.z.literal("BUDGET_REQUIRED")]).optional(),
13402
- partial_results: import_zod.z.array(ProductSchema).optional(),
13403
- suggestions: import_zod.z.array(import_zod.z.string()).optional(),
13404
- context: ContextObjectSchema.optional(),
13405
- ext: ExtensionObjectSchema.optional()
13406
- }).passthrough();
13407
- const ProductPurchaseSchema = import_zod.z.object({
13408
- product_id: import_zod.z.string().min(1),
13409
- pricing_option_id: import_zod.z.string().min(1),
13410
- pricing: CanonicalPricingOptionSchema.optional(),
13411
- format_option_refs: import_zod.z.array(FormatOptionReferenceSchema).optional(),
13412
- catalog_ids: import_zod.z.array(import_zod.z.string()).optional(),
13413
- budget: import_zod.z.number().gte(0).optional(),
13414
- daily_budget_cap: import_zod.z.number().gte(0).optional(),
13415
- min_spend_target: import_zod.z.number().gte(0).optional(),
13416
- impressions: ProductPurchaseImpressionsSchema.optional(),
13417
- start_time: import_zod.z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
13418
- end_time: import_zod.z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
13419
- pacing: PacingSchema.optional(),
13420
- bidding: BiddingPolicySchema.optional(),
13421
- targeting_overlay: TargetingOverlaySchema.optional(),
13422
- optimization_goals: import_zod.z.array(CanonicalOptimizationGoalSchema).optional(),
13423
- audience_evidence_requirements: ProductPurchaseAudienceEvidenceRequirementsSchema.optional(),
13424
- audience_evidence_pins: import_zod.z.array(AudienceEvidencePinSchema).optional(),
13425
- agency_estimate_number: import_zod.z.string().max(100).optional(),
13426
- context: ContextObjectSchema.optional(),
13427
- ext: ExtensionObjectSchema.optional(),
13428
- measurement_terms: ProductPurchaseMeasurementTermsSchema.optional(),
13429
- performance_standards: import_zod.z.array(CanonicalPerformanceStandardSchema).optional()
13430
- }).passthrough();
13431
- const CanonicalForecastPointSchema = import_zod.z.object({
13432
- label: import_zod.z.string().max(128).optional(),
13433
- budget: import_zod.z.number().gte(0).optional(),
13434
- product_id: import_zod.z.string().optional(),
13435
- dimensions: ForecastPointDimensionsSchema.optional(),
13436
- availability_status: AvailabilityStatusSchema.optional(),
13437
- metrics: import_zod.z.object({
13438
- coverage_rate: ForecastRateRangeSchema.optional()
13439
- }).passthrough().catchall(ForecastRangeSchema),
13440
- viewability: import_zod.z.union([import_zod.z.object({}).passthrough(), import_zod.z.object({}).passthrough()]).optional(),
13441
- vendor_metric_values: import_zod.z.array(CanonicalForecastVendorMetricValueSchema).optional()
13442
- }).passthrough();
13443
- const CreativeAssetValueSchema = import_zod.z.unknown().superRefine((value, ctx) => {
13444
- const variants = Array.isArray(value) ? value : [value];
13445
- if (variants.length === 0 || variants.some((variant) => !AssetVariantSchema.safeParse(variant).success)) {
13446
- ctx.addIssue({
13447
- code: "custom",
13448
- message: "creative slot must contain an asset or non-empty array of assets"
13449
- });
13450
- }
13451
- });
13452
- const CreativeAssetsRuntimeSchema = import_zod.z.record(import_zod.z.string(), import_zod.z.unknown()).superRefine((assets, ctx) => {
13453
- for (const [slotKey, assetValue] of Object.entries(assets)) {
13454
- if (/^[a-z0-9_]+$/.test(slotKey) && !CreativeAssetValueSchema.safeParse(assetValue).success) {
13455
- ctx.addIssue({
13365
+ const TargetingOverlaySchema = (() => {
13366
+ const objectSchema = import_zod.z.object({ "geo_countries": import_zod.z.array(import_zod.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": import_zod.z.array(import_zod.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": import_zod.z.array(import_zod.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": import_zod.z.array(import_zod.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": import_zod.z.array(import_zod.z.object({ "system": import_zod.z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": import_zod.z.array(import_zod.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": import_zod.z.array(import_zod.z.object({ "system": import_zod.z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": import_zod.z.array(import_zod.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": import_zod.z.array(import_zod.z.union([import_zod.z.object({ "country": import_zod.z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": import_zod.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": import_zod.z.array(import_zod.z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(import_zod.z.object({ "country": import_zod.z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": import_zod.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(import_zod.z.union([import_zod.z.object({ "country": import_zod.z.literal("US").optional(), "system": import_zod.z.enum(["zip", "zip_plus_four"]).optional() }), import_zod.z.object({ "country": import_zod.z.literal("GB").optional(), "system": import_zod.z.enum(["outward", "full"]).optional() }), import_zod.z.object({ "country": import_zod.z.literal("CA").optional(), "system": import_zod.z.enum(["fsa", "full"]).optional() }), import_zod.z.object({ "country": import_zod.z.enum(["DE", "CH", "AT"]).optional(), "system": import_zod.z.literal("plz").optional() }), import_zod.z.object({ "country": import_zod.z.literal("FR").optional(), "system": import_zod.z.literal("code_postal").optional() }), import_zod.z.object({ "country": import_zod.z.literal("AU").optional(), "system": import_zod.z.literal("postcode").optional() }), import_zod.z.object({ "country": import_zod.z.literal("BR").optional(), "system": import_zod.z.literal("cep").optional() }), import_zod.z.object({ "country": import_zod.z.literal("IN").optional(), "system": import_zod.z.literal("pin").optional() }), import_zod.z.object({ "country": import_zod.z.literal("ZA").optional(), "system": import_zod.z.literal("postal_code").optional() }), import_zod.z.object({ "country": import_zod.z.any().refine((value) => !import_zod.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": import_zod.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.")), import_zod.z.object({ "system": import_zod.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": import_zod.z.array(import_zod.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": import_zod.z.array(import_zod.z.union([import_zod.z.object({ "country": import_zod.z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": import_zod.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": import_zod.z.array(import_zod.z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(import_zod.z.object({ "country": import_zod.z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": import_zod.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(import_zod.z.union([import_zod.z.object({ "country": import_zod.z.literal("US").optional(), "system": import_zod.z.enum(["zip", "zip_plus_four"]).optional() }), import_zod.z.object({ "country": import_zod.z.literal("GB").optional(), "system": import_zod.z.enum(["outward", "full"]).optional() }), import_zod.z.object({ "country": import_zod.z.literal("CA").optional(), "system": import_zod.z.enum(["fsa", "full"]).optional() }), import_zod.z.object({ "country": import_zod.z.enum(["DE", "CH", "AT"]).optional(), "system": import_zod.z.literal("plz").optional() }), import_zod.z.object({ "country": import_zod.z.literal("FR").optional(), "system": import_zod.z.literal("code_postal").optional() }), import_zod.z.object({ "country": import_zod.z.literal("AU").optional(), "system": import_zod.z.literal("postcode").optional() }), import_zod.z.object({ "country": import_zod.z.literal("BR").optional(), "system": import_zod.z.literal("cep").optional() }), import_zod.z.object({ "country": import_zod.z.literal("IN").optional(), "system": import_zod.z.literal("pin").optional() }), import_zod.z.object({ "country": import_zod.z.literal("ZA").optional(), "system": import_zod.z.literal("postal_code").optional() }), import_zod.z.object({ "country": import_zod.z.any().refine((value) => !import_zod.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": import_zod.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.")), import_zod.z.object({ "system": import_zod.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": import_zod.z.array(import_zod.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": import_zod.z.array(import_zod.z.object({ "country": import_zod.z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": import_zod.z.union([import_zod.z.enum(["geonames", "google_ads", "microsoft_ads"]), import_zod.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": import_zod.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": import_zod.z.union([import_zod.z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), import_zod.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": import_zod.z.array(import_zod.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": import_zod.z.record(import_zod.z.string(), import_zod.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": import_zod.z.record(import_zod.z.string(), import_zod.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(import_zod.z.union([import_zod.z.any().refine((value) => !import_zod.z.object({ "system": import_zod.z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), import_zod.z.intersection(import_zod.z.object({ "system": import_zod.z.enum(["geonames", "google_ads", "microsoft_ads"]) }), import_zod.z.object({ "values": import_zod.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": import_zod.z.array(import_zod.z.object({ "country": import_zod.z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": import_zod.z.union([import_zod.z.enum(["geonames", "google_ads", "microsoft_ads"]), import_zod.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": import_zod.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": import_zod.z.union([import_zod.z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), import_zod.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": import_zod.z.array(import_zod.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": import_zod.z.record(import_zod.z.string(), import_zod.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": import_zod.z.record(import_zod.z.string(), import_zod.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(import_zod.z.union([import_zod.z.any().refine((value) => !import_zod.z.object({ "system": import_zod.z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), import_zod.z.intersection(import_zod.z.object({ "system": import_zod.z.enum(["geonames", "google_ads", "microsoft_ads"]) }), import_zod.z.object({ "values": import_zod.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": import_zod.z.array(import_zod.z.object({ "days": import_zod.z.array(import_zod.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": import_zod.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": import_zod.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": import_zod.z.union([import_zod.z.literal("inventory_local"), import_zod.z.any().refine((value) => !import_zod.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": import_zod.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": import_zod.z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to include for targeting.").optional(), "axe_exclude_segment": import_zod.z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to exclude from targeting.").optional(), "audience_include": import_zod.z.array(import_zod.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": import_zod.z.array(import_zod.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": import_zod.z.object({ "operator": import_zod.z.literal("all").describe("Groups-level operator. Required even though v1 only supports 'all': every child group must be satisfied."), "groups": import_zod.z.array(import_zod.z.object({ "operator": import_zod.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": import_zod.z.array(import_zod.z.object({ "pricing_option_id": import_zod.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": import_zod.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": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).and(import_zod.z.any().superRefine((x, ctx) => {
13367
+ const schemas = [import_zod.z.object({ "type": import_zod.z.literal("segment_id").describe("Segment ID based targeting"), "segment_id": import_zod.z.string().describe("The platform-specific segment identifier to use in campaign targeting") }).catchall(import_zod.z.any()), import_zod.z.object({ "type": import_zod.z.literal("key_value").describe("Key-value pair based targeting"), "key": import_zod.z.string().describe("The targeting parameter key"), "value": import_zod.z.string().describe("The targeting parameter value") }).catchall(import_zod.z.any())];
13368
+ const { errors, failed } = schemas.reduce(
13369
+ ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
13370
+ errors: [...errors2, ...result.error.issues],
13371
+ failed: failed2 + 1
13372
+ } : { errors: errors2, failed: failed2 })(
13373
+ schema.safeParse(x)
13374
+ ),
13375
+ { errors: [], failed: 0 }
13376
+ );
13377
+ const passed = schemas.length - failed;
13378
+ if (passed !== 1) {
13379
+ ctx.addIssue(errors.length ? {
13380
+ path: [],
13381
+ code: "invalid_union",
13382
+ errors: [errors],
13383
+ message: "Invalid input: Should pass single schema. Passed " + passed
13384
+ } : {
13385
+ path: [],
13456
13386
  code: "custom",
13457
- path: [slotKey],
13458
- message: "creative slot must contain an asset or non-empty array of assets"
13387
+ errors: [errors],
13388
+ message: "Invalid input: Should pass single schema. Passed " + passed
13459
13389
  });
13460
13390
  }
13461
- }
13462
- });
13463
- const CreativeManifestSchema = import_zod.z.object({}).passthrough().merge(import_zod.z.object({
13464
- format_id: FormatReferenceStructuredObjectSchema.optional(),
13465
- format_kind: CanonicalFormatKindSchema.optional(),
13466
- format_option_ref: FormatOptionReferenceSchema.optional(),
13467
- representation_selection: RepresentationSelectionSchema.optional(),
13468
- assets: CreativeAssetsRuntimeSchema,
13469
- component_assets: import_zod.z.record(import_zod.z.string(), CreativeAssetsSchema).optional(),
13470
- brand: BrandReferenceSchema.optional(),
13471
- rights: import_zod.z.array(RightsConstraintSchema).optional(),
13472
- industry_identifiers: import_zod.z.array(IndustryIdentifierSchema).optional(),
13473
- provenance: ProvenanceSchema.optional(),
13474
- ext: ExtensionObjectSchema.optional()
13475
- }).passthrough()).superRefine((value, ctx) => {
13476
- const hasFormatId = value.format_id !== void 0;
13477
- const hasFormatKind = value.format_kind !== void 0;
13478
- if (hasFormatId === hasFormatKind) {
13479
- ctx.addIssue({
13480
- code: "custom",
13481
- path: [],
13482
- message: "creative identity requires exactly one of format_id or format_kind"
13483
- });
13484
- }
13485
- if ("capability_id" in value || "capability_ref" in value) {
13486
- ctx.addIssue({
13487
- code: "custom",
13488
- path: [],
13489
- message: "creative identity does not allow capability_id or capability_ref"
13490
- });
13491
- }
13492
- });
13493
- const BuildCreativeMultiSuccessSchema = import_zod.z.object({
13494
- creative_manifests: import_zod.z.array(CreativeManifestSchema),
13495
- sandbox: import_zod.z.boolean().optional(),
13496
- expires_at: import_zod.z.iso.datetime().optional(),
13497
- preview: import_zod.z.object({
13498
- previews: import_zod.z.array(import_zod.z.object({
13499
- preview_id: import_zod.z.string(),
13500
- format_id: FormatReferenceStructuredObjectSchema.optional(),
13501
- capability_id: import_zod.z.string().regex(/^[a-zA-Z0-9_-]+$/).optional(),
13502
- renders: import_zod.z.array(PreviewRenderSchema),
13503
- input: import_zod.z.object({
13504
- name: import_zod.z.string(),
13505
- macros: import_zod.z.record(import_zod.z.string(), import_zod.z.string()).optional(),
13506
- context_description: import_zod.z.string().optional()
13507
- }).passthrough()
13508
- }).passthrough()),
13509
- interactive_url: import_zod.z.string().optional(),
13510
- expires_at: import_zod.z.iso.datetime()
13511
- }).passthrough().optional(),
13512
- preview_error: ErrorSchema.optional(),
13513
- pricing_option_id: import_zod.z.string().optional(),
13514
- vendor_cost: import_zod.z.number().min(0).optional(),
13515
- currency: import_zod.z.string().regex(/^[A-Z]{3}$/).optional(),
13516
- consumption: CreativeConsumptionSchema.optional(),
13517
- context: ContextObjectSchema.optional(),
13518
- ext: ExtensionObjectSchema.optional()
13519
- }).passthrough();
13520
- const BuildCreativeVariantSuccessSchema = import_zod.z.object({
13521
- creatives: import_zod.z.array(import_zod.z.object({
13522
- build_creative_id: import_zod.z.string().optional(),
13523
- catalog_item_ref: import_zod.z.object({
13524
- catalog_type: import_zod.z.string().optional(),
13525
- item_id: import_zod.z.string()
13526
- }).passthrough().optional(),
13527
- signal_condition: SignalTargetingSchema.optional(),
13528
- variants: import_zod.z.array(import_zod.z.object({
13529
- build_variant_id: import_zod.z.string(),
13530
- recipe_hash: import_zod.z.string().optional(),
13531
- parent_build_variant_id: import_zod.z.string().optional(),
13532
- creative_manifest: CreativeManifestSchema,
13533
- variant_axis_value: import_zod.z.unknown().optional(),
13534
- recommended: import_zod.z.boolean().optional(),
13535
- rank: import_zod.z.int().min(1).optional(),
13536
- eval: import_zod.z.object({
13537
- features: import_zod.z.array(CreativeFeatureResultSchema).optional(),
13538
- ranked_against: import_zod.z.int().min(1).optional(),
13539
- calls_used: import_zod.z.int().min(0).optional(),
13540
- seconds_used: import_zod.z.number().min(0).optional(),
13541
- ext: ExtensionObjectSchema.optional()
13542
- }).passthrough().optional(),
13543
- pricing_option_id: import_zod.z.string().optional(),
13544
- vendor_cost: import_zod.z.number().min(0).optional(),
13545
- currency: import_zod.z.string().regex(/^[A-Z]{3}$/).optional(),
13546
- consumption: CreativeConsumptionSchema.optional()
13547
- }).passthrough()).optional(),
13548
- errors: import_zod.z.array(ErrorSchema).optional()
13549
- }).passthrough()),
13550
- items_total: import_zod.z.int().min(0).optional(),
13551
- items_returned: import_zod.z.int().min(0).optional(),
13552
- leaves_total: import_zod.z.int().min(0).optional(),
13553
- leaves_returned: import_zod.z.int().min(0).optional(),
13554
- vendor_cost: import_zod.z.number().min(0).optional(),
13555
- currency: import_zod.z.string().regex(/^[A-Z]{3}$/).optional(),
13556
- keep_mode_applied: import_zod.z.union([import_zod.z.literal("keep_all"), import_zod.z.literal("keep_one"), import_zod.z.literal("keep_some")]).optional(),
13557
- selection_strategy_applied: CreativeSelectionStrategySchema.optional(),
13558
- budget_status: import_zod.z.union([import_zod.z.literal("complete"), import_zod.z.literal("capped")]).optional(),
13559
- errors: import_zod.z.array(ErrorSchema).optional(),
13560
- sandbox: import_zod.z.boolean().optional(),
13561
- expires_at: import_zod.z.iso.datetime().optional(),
13562
- context: ContextObjectSchema.optional(),
13563
- ext: ExtensionObjectSchema.optional()
13564
- }).passthrough();
13565
- const PreviewCreativeVariantResponseSchema = import_zod.z.object({
13566
- response_type: import_zod.z.literal("variant"),
13567
- variant_id: import_zod.z.string(),
13568
- creative_id: import_zod.z.string().optional(),
13569
- previews: import_zod.z.array(import_zod.z.object({
13570
- preview_id: import_zod.z.string(),
13571
- renders: import_zod.z.array(PreviewRenderSchema)
13572
- }).passthrough()),
13573
- manifest: CreativeManifestSchema.optional(),
13574
- expires_at: import_zod.z.iso.datetime().optional(),
13575
- context: ContextObjectSchema.optional(),
13576
- ext: ExtensionObjectSchema.optional()
13577
- }).passthrough();
13578
- const AAODirectoryAgentPublishersInverseLookupResponseSchema = import_zod.z.object({
13579
- agent_url: import_zod.z.string().refine(adcpJsonSchemaUri, "Invalid URI"),
13580
- directory_indexed_at: import_zod.z.iso.datetime().nullable(),
13581
- publishers: import_zod.z.array(PublisherEntrySchema),
13582
- next_cursor: import_zod.z.string().optional().nullable()
13583
- }).passthrough();
13584
- const AcquireRightsAcquiredSchema = import_zod.z.object({
13585
- rights_id: import_zod.z.string(),
13586
- rights_status: import_zod.z.literal("acquired"),
13587
- brand_id: import_zod.z.string(),
13588
- terms: RightsTermsSchema,
13589
- generation_credentials: import_zod.z.array(GenerationCredentialSchema),
13590
- restrictions: import_zod.z.array(import_zod.z.string()).optional(),
13591
- disclosure: import_zod.z.object({
13592
- required: import_zod.z.boolean(),
13593
- text: import_zod.z.string().optional()
13594
- }).passthrough().optional(),
13595
- approval_webhook: PushNotificationConfigSchema.optional(),
13596
- usage_reporting_url: import_zod.z.string().optional(),
13597
- rights_constraint: RightsConstraintSchema.and(import_zod.z.object({}).passthrough()),
13598
- context: ContextObjectSchema.optional(),
13599
- ext: ExtensionObjectSchema.optional()
13600
- }).passthrough();
13601
- const CreativeApprovalResponseSchema = import_zod.z.object({
13602
- context_id: import_zod.z.string().optional(),
13603
- context: ContextObjectSchema.optional(),
13604
- task_id: import_zod.z.string().optional(),
13605
- status: TaskStatusSchema,
13606
- message: import_zod.z.string().optional(),
13607
- timestamp: import_zod.z.string().optional(),
13608
- replayed: import_zod.z.boolean().optional(),
13609
- adcp_error: ErrorSchema.optional(),
13610
- push_notification_config: PushNotificationConfigSchema.optional(),
13611
- governance_context: import_zod.z.string().optional(),
13612
- payload: import_zod.z.object({}).passthrough().optional(),
13613
- adcp_version: import_zod.z.string().optional(),
13614
- adcp_major_version: import_zod.z.number().optional()
13615
- }).passthrough().and(import_zod.z.union([CreativeApprovedSchema, CreativeRejectedSchema, CreativePendingReviewSchema, CreativeApprovalErrorSchema]));
13616
- const GetBrandIdentityResponseSchema = import_zod.z.object({
13617
- context_id: import_zod.z.string().optional(),
13618
- context: ContextObjectSchema.optional(),
13391
+ })).describe("Destination-specific activation key returned by get_signals or activate_signal. Usually omitted for seller-offered signals selected directly through the same seller; include only when the selected signal was separately activated and the seller requires the activation key to correlate the package selection.").optional() }).catchall(import_zod.z.any()).and(import_zod.z.any().superRefine((x, ctx) => {
13392
+ const schemas = [import_zod.z.object({ "signal_ref": import_zod.z.any().superRefine((x2, ctx2) => {
13393
+ const schemas2 = [import_zod.z.object({ "scope": import_zod.z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": import_zod.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(import_zod.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."), import_zod.z.object({ "scope": import_zod.z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": import_zod.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": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(import_zod.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."), import_zod.z.object({ "scope": import_zod.z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": import_zod.z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(import_zod.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.")];
13394
+ const { errors: errors2, failed: failed2 } = schemas2.reduce(
13395
+ ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
13396
+ errors: [...errors3, ...result.error.issues],
13397
+ failed: failed3 + 1
13398
+ } : { errors: errors3, failed: failed3 })(
13399
+ schema.safeParse(x2)
13400
+ ),
13401
+ { errors: [], failed: 0 }
13402
+ );
13403
+ const passed2 = schemas2.length - failed2;
13404
+ if (passed2 !== 1) {
13405
+ ctx2.addIssue(errors2.length ? {
13406
+ path: [],
13407
+ code: "invalid_union",
13408
+ errors: [errors2],
13409
+ message: "Invalid input: Should pass single schema. Passed " + passed2
13410
+ } : {
13411
+ path: [],
13412
+ code: "custom",
13413
+ errors: [errors2],
13414
+ message: "Invalid input: Should pass single schema. Passed " + passed2
13415
+ });
13416
+ }
13417
+ }).describe("Named signal being targeted."), "value_type": import_zod.z.literal("binary").describe("Discriminator for binary signals."), "value": import_zod.z.literal(true).describe("Binary package signal entries match users for whom the signal is true. Use the parent group operator for include/exclude.") }).catchall(import_zod.z.any()).describe("Binary signal expression. In grouped package targeting, value is always true; use a parent group with operator 'none' for exclusion."), import_zod.z.object({ "signal_ref": import_zod.z.any().superRefine((x2, ctx2) => {
13418
+ const schemas2 = [import_zod.z.object({ "scope": import_zod.z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": import_zod.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(import_zod.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."), import_zod.z.object({ "scope": import_zod.z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": import_zod.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": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(import_zod.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."), import_zod.z.object({ "scope": import_zod.z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": import_zod.z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(import_zod.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.")];
13419
+ const { errors: errors2, failed: failed2 } = schemas2.reduce(
13420
+ ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
13421
+ errors: [...errors3, ...result.error.issues],
13422
+ failed: failed3 + 1
13423
+ } : { errors: errors3, failed: failed3 })(
13424
+ schema.safeParse(x2)
13425
+ ),
13426
+ { errors: [], failed: 0 }
13427
+ );
13428
+ const passed2 = schemas2.length - failed2;
13429
+ if (passed2 !== 1) {
13430
+ ctx2.addIssue(errors2.length ? {
13431
+ path: [],
13432
+ code: "invalid_union",
13433
+ errors: [errors2],
13434
+ message: "Invalid input: Should pass single schema. Passed " + passed2
13435
+ } : {
13436
+ path: [],
13437
+ code: "custom",
13438
+ errors: [errors2],
13439
+ message: "Invalid input: Should pass single schema. Passed " + passed2
13440
+ });
13441
+ }
13442
+ }).describe("Named signal being targeted."), "value_type": import_zod.z.literal("categorical").describe("Discriminator for categorical signals."), "values": import_zod.z.array(import_zod.z.string()).min(1).describe("Values to target. Users with any of these values match the expression.") }).catchall(import_zod.z.any()).describe("Categorical signal expression - target users with one of the listed values."), import_zod.z.object({ "signal_ref": import_zod.z.any().superRefine((x2, ctx2) => {
13443
+ const schemas2 = [import_zod.z.object({ "scope": import_zod.z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": import_zod.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(import_zod.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."), import_zod.z.object({ "scope": import_zod.z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": import_zod.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": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(import_zod.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."), import_zod.z.object({ "scope": import_zod.z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": import_zod.z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(import_zod.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.")];
13444
+ const { errors: errors2, failed: failed2 } = schemas2.reduce(
13445
+ ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
13446
+ errors: [...errors3, ...result.error.issues],
13447
+ failed: failed3 + 1
13448
+ } : { errors: errors3, failed: failed3 })(
13449
+ schema.safeParse(x2)
13450
+ ),
13451
+ { errors: [], failed: 0 }
13452
+ );
13453
+ const passed2 = schemas2.length - failed2;
13454
+ if (passed2 !== 1) {
13455
+ ctx2.addIssue(errors2.length ? {
13456
+ path: [],
13457
+ code: "invalid_union",
13458
+ errors: [errors2],
13459
+ message: "Invalid input: Should pass single schema. Passed " + passed2
13460
+ } : {
13461
+ path: [],
13462
+ code: "custom",
13463
+ errors: [errors2],
13464
+ message: "Invalid input: Should pass single schema. Passed " + passed2
13465
+ });
13466
+ }
13467
+ }).describe("Named signal being targeted."), "value_type": import_zod.z.literal("numeric").describe("Discriminator for numeric signals."), "min_value": import_zod.z.number().describe("Minimum value, inclusive. Omit for no minimum. Should be within the signal definition's range when declared.").optional(), "max_value": import_zod.z.number().describe("Maximum value, inclusive. Omit for no maximum. Should be within the signal definition's range when declared.").optional() }).catchall(import_zod.z.any()).and(import_zod.z.union([import_zod.z.object({ "min_value": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough(), import_zod.z.object({ "max_value": import_zod.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.")];
13468
+ const { errors, failed } = schemas.reduce(
13469
+ ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
13470
+ errors: [...errors2, ...result.error.issues],
13471
+ failed: failed2 + 1
13472
+ } : { errors: errors2, failed: failed2 })(
13473
+ schema.safeParse(x)
13474
+ ),
13475
+ { errors: [], failed: 0 }
13476
+ );
13477
+ const passed = schemas.length - failed;
13478
+ if (passed !== 1) {
13479
+ ctx.addIssue(errors.length ? {
13480
+ path: [],
13481
+ code: "invalid_union",
13482
+ errors: [errors],
13483
+ message: "Invalid input: Should pass single schema. Passed " + passed
13484
+ } : {
13485
+ path: [],
13486
+ code: "custom",
13487
+ errors: [errors],
13488
+ message: "Invalid input: Should pass single schema. Passed " + passed
13489
+ });
13490
+ }
13491
+ }).describe("Predicate over a named signal definition. Signals are typed dimensions, similar to feature values: binary signals match true, categorical signals match one of a set of values, and numeric signals match a range. In package signal targeting groups, include/exclude semantics are controlled by the parent group operator, not by negating the expression.")).describe("Buy-time selection of one seller-offered signal inside a package signal targeting group. The signal_ref uses scope 'product' for a product-local signal option, scope 'data_provider' for a signal defined in a data provider's published adagents.json signals[], or scope 'signal_source' for a source-native signal that is not published in adagents.json signals[]. The selected product's inline Product.signal_targeting_options, get_signals feed when inline options are omitted, and signal_targeting_rules define buy-time eligibility. Inclusion and exclusion are controlled by the parent group operator: use operator 'any' to include users matching the signal expression and operator 'none' to exclude users matching the signal expression. For binary signals, value MUST be true; do not use value=false for exclusion inside signal_targeting_groups. Use audience_include/audience_exclude only for buyer-managed first-party audiences registered through sync_audiences.")).min(1).describe("Signal targeting entries evaluated by this group. Each entry uses the package signal targeting shape, including signal_ref, value expression, and optional pricing, execution-handle, or activation fields.") }).catchall(import_zod.z.any()).describe("A basic Boolean group of package-level signal targeting entries. 'any' means the user must match at least one signal in the group. 'none' means the user must match none of the signals in the group. Use groups for portable include/exclude composition such as (A OR B) AND NOT (C OR D).")).min(1).describe("Signal targeting groups to evaluate. Use operator 'any' for include groups and 'none' for exclusion groups.") }).catchall(import_zod.z.any()).describe("Basic Boolean grouping for seller-offered signals. v1 supports a required top-level operator 'all' and child groups with operator 'any' for include groups or 'none' for exclusion groups. Example semantics: group 1 any(A, B) plus group 2 none(C, D) means (A OR B) AND NOT (C OR D). Signal entries reference named signal definitions with signal_ref scope 'product' for product-local signal options or scope 'data_provider' for external signals published in adagents.json signals[]. For simple include-only targeting, send one child group with operator 'any'. Sellers SHOULD reject entries that are not available for the product through inline signal_targeting_options or get_signals, are not active for the account, or exceed the product's signal_targeting_allowed/signal_targeting_rules/product terms. Signal targeting limits are product-scoped, not declared in get_adcp_capabilities, because products may be backed by different ad servers. Sellers MUST echo applied signal_targeting_groups on the resulting package state, including fixed/default selections. Sellers MAY return REQUOTE_REQUIRED when a targeting mutation changes commercial terms.").optional(), "signal_targeting": import_zod.z.array(import_zod.z.any().superRefine((x, ctx) => {
13492
+ const schemas = [import_zod.z.object({ "signal_ref": import_zod.z.any().superRefine((x2, ctx2) => {
13493
+ const schemas2 = [import_zod.z.object({ "scope": import_zod.z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": import_zod.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(import_zod.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."), import_zod.z.object({ "scope": import_zod.z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": import_zod.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": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(import_zod.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."), import_zod.z.object({ "scope": import_zod.z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": import_zod.z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(import_zod.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.")];
13494
+ const { errors: errors2, failed: failed2 } = schemas2.reduce(
13495
+ ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
13496
+ errors: [...errors3, ...result.error.issues],
13497
+ failed: failed3 + 1
13498
+ } : { errors: errors3, failed: failed3 })(
13499
+ schema.safeParse(x2)
13500
+ ),
13501
+ { errors: [], failed: 0 }
13502
+ );
13503
+ const passed2 = schemas2.length - failed2;
13504
+ if (passed2 !== 1) {
13505
+ ctx2.addIssue(errors2.length ? {
13506
+ path: [],
13507
+ code: "invalid_union",
13508
+ errors: [errors2],
13509
+ message: "Invalid input: Should pass single schema. Passed " + passed2
13510
+ } : {
13511
+ path: [],
13512
+ code: "custom",
13513
+ errors: [errors2],
13514
+ message: "Invalid input: Should pass single schema. Passed " + passed2
13515
+ });
13516
+ }
13517
+ }).describe("The signal to target. New targeting constraints SHOULD use signal_ref.").optional(), "signal_id": import_zod.z.any().superRefine((x2, ctx2) => {
13518
+ const schemas2 = [import_zod.z.object({ "source": import_zod.z.literal("catalog").describe("Discriminator indicating this signal is from a data provider's published adagents.json signals[]"), "data_provider_domain": import_zod.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 of the data provider that owns this signal (e.g., 'pinnacle-data.example'). The signal definition is published at this domain's /.well-known/adagents.json"), "id": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's catalog (e.g., 'likely_ev_buyers', 'income_100k_plus')") }).catchall(import_zod.z.any()).describe("Data-provider signal - references a signal from a data provider's published adagents.json signals[]. Buyers can verify authorization by checking the data provider's adagents.json."), import_zod.z.object({ "source": import_zod.z.literal("agent").describe("Discriminator indicating this signal is native to the signal source identified by agent_url, not from a data provider's published signal definitions."), "agent_url": import_zod.z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that provides this signal (e.g., 'https://signals.example/.well-known/adcp/signals')"), "id": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the agent's signal set (e.g., 'custom_auto_intenders')") }).catchall(import_zod.z.any()).describe("Agent signal - references a signal native to a signal source identified by agent_url. Not externally verifiable through an upstream catalog; buyer trusts the issuing signal source's claim about the signal.")];
13519
+ const { errors: errors2, failed: failed2 } = schemas2.reduce(
13520
+ ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
13521
+ errors: [...errors3, ...result.error.issues],
13522
+ failed: failed3 + 1
13523
+ } : { errors: errors3, failed: failed3 })(
13524
+ schema.safeParse(x2)
13525
+ ),
13526
+ { errors: [], failed: 0 }
13527
+ );
13528
+ const passed2 = schemas2.length - failed2;
13529
+ if (passed2 !== 1) {
13530
+ ctx2.addIssue(errors2.length ? {
13531
+ path: [],
13532
+ code: "invalid_union",
13533
+ errors: [errors2],
13534
+ message: "Invalid input: Should pass single schema. Passed " + passed2
13535
+ } : {
13536
+ path: [],
13537
+ code: "custom",
13538
+ errors: [errors2],
13539
+ message: "Invalid input: Should pass single schema. Passed " + passed2
13540
+ });
13541
+ }
13542
+ }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": import_zod.z.literal("binary").describe("Discriminator for binary signals"), "value": import_zod.z.boolean().describe("Whether to include (true) or exclude (false) users matching this signal") }).catchall(import_zod.z.any()).and(import_zod.z.union([import_zod.z.object({ "signal_ref": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough(), import_zod.z.object({ "signal_id": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Binary signal targeting - user either matches or doesn't"), import_zod.z.object({ "signal_ref": import_zod.z.any().superRefine((x2, ctx2) => {
13543
+ const schemas2 = [import_zod.z.object({ "scope": import_zod.z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": import_zod.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(import_zod.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."), import_zod.z.object({ "scope": import_zod.z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": import_zod.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": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(import_zod.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."), import_zod.z.object({ "scope": import_zod.z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": import_zod.z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(import_zod.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.")];
13544
+ const { errors: errors2, failed: failed2 } = schemas2.reduce(
13545
+ ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
13546
+ errors: [...errors3, ...result.error.issues],
13547
+ failed: failed3 + 1
13548
+ } : { errors: errors3, failed: failed3 })(
13549
+ schema.safeParse(x2)
13550
+ ),
13551
+ { errors: [], failed: 0 }
13552
+ );
13553
+ const passed2 = schemas2.length - failed2;
13554
+ if (passed2 !== 1) {
13555
+ ctx2.addIssue(errors2.length ? {
13556
+ path: [],
13557
+ code: "invalid_union",
13558
+ errors: [errors2],
13559
+ message: "Invalid input: Should pass single schema. Passed " + passed2
13560
+ } : {
13561
+ path: [],
13562
+ code: "custom",
13563
+ errors: [errors2],
13564
+ message: "Invalid input: Should pass single schema. Passed " + passed2
13565
+ });
13566
+ }
13567
+ }).describe("The signal to target. New targeting constraints SHOULD use signal_ref.").optional(), "signal_id": import_zod.z.any().superRefine((x2, ctx2) => {
13568
+ const schemas2 = [import_zod.z.object({ "source": import_zod.z.literal("catalog").describe("Discriminator indicating this signal is from a data provider's published adagents.json signals[]"), "data_provider_domain": import_zod.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 of the data provider that owns this signal (e.g., 'pinnacle-data.example'). The signal definition is published at this domain's /.well-known/adagents.json"), "id": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's catalog (e.g., 'likely_ev_buyers', 'income_100k_plus')") }).catchall(import_zod.z.any()).describe("Data-provider signal - references a signal from a data provider's published adagents.json signals[]. Buyers can verify authorization by checking the data provider's adagents.json."), import_zod.z.object({ "source": import_zod.z.literal("agent").describe("Discriminator indicating this signal is native to the signal source identified by agent_url, not from a data provider's published signal definitions."), "agent_url": import_zod.z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that provides this signal (e.g., 'https://signals.example/.well-known/adcp/signals')"), "id": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the agent's signal set (e.g., 'custom_auto_intenders')") }).catchall(import_zod.z.any()).describe("Agent signal - references a signal native to a signal source identified by agent_url. Not externally verifiable through an upstream catalog; buyer trusts the issuing signal source's claim about the signal.")];
13569
+ const { errors: errors2, failed: failed2 } = schemas2.reduce(
13570
+ ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
13571
+ errors: [...errors3, ...result.error.issues],
13572
+ failed: failed3 + 1
13573
+ } : { errors: errors3, failed: failed3 })(
13574
+ schema.safeParse(x2)
13575
+ ),
13576
+ { errors: [], failed: 0 }
13577
+ );
13578
+ const passed2 = schemas2.length - failed2;
13579
+ if (passed2 !== 1) {
13580
+ ctx2.addIssue(errors2.length ? {
13581
+ path: [],
13582
+ code: "invalid_union",
13583
+ errors: [errors2],
13584
+ message: "Invalid input: Should pass single schema. Passed " + passed2
13585
+ } : {
13586
+ path: [],
13587
+ code: "custom",
13588
+ errors: [errors2],
13589
+ message: "Invalid input: Should pass single schema. Passed " + passed2
13590
+ });
13591
+ }
13592
+ }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": import_zod.z.literal("categorical").describe("Discriminator for categorical signals"), "values": import_zod.z.array(import_zod.z.string()).min(1).describe("Values to target. Users with any of these values will be included.") }).catchall(import_zod.z.any()).and(import_zod.z.union([import_zod.z.object({ "signal_ref": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough(), import_zod.z.object({ "signal_id": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Categorical signal targeting - target users with specific values"), import_zod.z.object({ "signal_ref": import_zod.z.any().superRefine((x2, ctx2) => {
13593
+ const schemas2 = [import_zod.z.object({ "scope": import_zod.z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": import_zod.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(import_zod.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."), import_zod.z.object({ "scope": import_zod.z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": import_zod.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": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(import_zod.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."), import_zod.z.object({ "scope": import_zod.z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": import_zod.z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(import_zod.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.")];
13594
+ const { errors: errors2, failed: failed2 } = schemas2.reduce(
13595
+ ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
13596
+ errors: [...errors3, ...result.error.issues],
13597
+ failed: failed3 + 1
13598
+ } : { errors: errors3, failed: failed3 })(
13599
+ schema.safeParse(x2)
13600
+ ),
13601
+ { errors: [], failed: 0 }
13602
+ );
13603
+ const passed2 = schemas2.length - failed2;
13604
+ if (passed2 !== 1) {
13605
+ ctx2.addIssue(errors2.length ? {
13606
+ path: [],
13607
+ code: "invalid_union",
13608
+ errors: [errors2],
13609
+ message: "Invalid input: Should pass single schema. Passed " + passed2
13610
+ } : {
13611
+ path: [],
13612
+ code: "custom",
13613
+ errors: [errors2],
13614
+ message: "Invalid input: Should pass single schema. Passed " + passed2
13615
+ });
13616
+ }
13617
+ }).describe("The signal to target. New targeting constraints SHOULD use signal_ref.").optional(), "signal_id": import_zod.z.any().superRefine((x2, ctx2) => {
13618
+ const schemas2 = [import_zod.z.object({ "source": import_zod.z.literal("catalog").describe("Discriminator indicating this signal is from a data provider's published adagents.json signals[]"), "data_provider_domain": import_zod.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 of the data provider that owns this signal (e.g., 'pinnacle-data.example'). The signal definition is published at this domain's /.well-known/adagents.json"), "id": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's catalog (e.g., 'likely_ev_buyers', 'income_100k_plus')") }).catchall(import_zod.z.any()).describe("Data-provider signal - references a signal from a data provider's published adagents.json signals[]. Buyers can verify authorization by checking the data provider's adagents.json."), import_zod.z.object({ "source": import_zod.z.literal("agent").describe("Discriminator indicating this signal is native to the signal source identified by agent_url, not from a data provider's published signal definitions."), "agent_url": import_zod.z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that provides this signal (e.g., 'https://signals.example/.well-known/adcp/signals')"), "id": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the agent's signal set (e.g., 'custom_auto_intenders')") }).catchall(import_zod.z.any()).describe("Agent signal - references a signal native to a signal source identified by agent_url. Not externally verifiable through an upstream catalog; buyer trusts the issuing signal source's claim about the signal.")];
13619
+ const { errors: errors2, failed: failed2 } = schemas2.reduce(
13620
+ ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
13621
+ errors: [...errors3, ...result.error.issues],
13622
+ failed: failed3 + 1
13623
+ } : { errors: errors3, failed: failed3 })(
13624
+ schema.safeParse(x2)
13625
+ ),
13626
+ { errors: [], failed: 0 }
13627
+ );
13628
+ const passed2 = schemas2.length - failed2;
13629
+ if (passed2 !== 1) {
13630
+ ctx2.addIssue(errors2.length ? {
13631
+ path: [],
13632
+ code: "invalid_union",
13633
+ errors: [errors2],
13634
+ message: "Invalid input: Should pass single schema. Passed " + passed2
13635
+ } : {
13636
+ path: [],
13637
+ code: "custom",
13638
+ errors: [errors2],
13639
+ message: "Invalid input: Should pass single schema. Passed " + passed2
13640
+ });
13641
+ }
13642
+ }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": import_zod.z.literal("numeric").describe("Discriminator for numeric signals"), "min_value": import_zod.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": import_zod.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(import_zod.z.any()).and(import_zod.z.union([import_zod.z.object({ "signal_ref": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough(), import_zod.z.object({ "signal_id": import_zod.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).")];
13643
+ const { errors, failed } = schemas.reduce(
13644
+ ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
13645
+ errors: [...errors2, ...result.error.issues],
13646
+ failed: failed2 + 1
13647
+ } : { errors: errors2, failed: failed2 })(
13648
+ schema.safeParse(x)
13649
+ ),
13650
+ { errors: [], failed: 0 }
13651
+ );
13652
+ const passed = schemas.length - failed;
13653
+ if (passed !== 1) {
13654
+ ctx.addIssue(errors.length ? {
13655
+ path: [],
13656
+ code: "invalid_union",
13657
+ errors: [errors],
13658
+ message: "Invalid input: Should pass single schema. Passed " + passed
13659
+ } : {
13660
+ path: [],
13661
+ code: "custom",
13662
+ errors: [errors],
13663
+ message: "Invalid input: Should pass single schema. Passed " + passed
13664
+ });
13665
+ }
13666
+ }).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": import_zod.z.object({ "age": import_zod.z.intersection(import_zod.z.object({ "min": import_zod.z.number().int().gte(0).lte(150).describe("Inclusive minimum age in completed years. Omit for an open lower bound.").optional(), "max": import_zod.z.number().int().gte(0).lte(150).describe("Inclusive maximum age in completed years. Omit for an open upper bound.").optional(), "include_unknown": import_zod.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(import_zod.z.any()).and(import_zod.z.union([import_zod.z.object({ "min": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough(), import_zod.z.object({ "max": import_zod.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."), import_zod.z.object({ "accepted_bases": import_zod.z.array(import_zod.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": import_zod.z.array(import_zod.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(import_zod.z.any()).and(import_zod.z.union([import_zod.z.any().refine((value) => !import_zod.z.object({ "accepted_verification_methods": import_zod.z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), import_zod.z.intersection(import_zod.z.object({ "accepted_verification_methods": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough(), import_zod.z.object({ "accepted_bases": import_zod.z.any().refine((value) => !import_zod.z.array(import_zod.z.any().refine((value2) => !import_zod.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(import_zod.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": import_zod.z.object({ "suppress": import_zod.z.object({ "interval": import_zod.z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": import_zod.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": import_zod.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": import_zod.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": import_zod.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": import_zod.z.object({ "interval": import_zod.z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": import_zod.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(import_zod.z.any()).and(import_zod.z.union([import_zod.z.object({ "suppress": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough(), import_zod.z.object({ "suppress_minutes": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough(), import_zod.z.object({ "max_impressions": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).and(import_zod.z.intersection(import_zod.z.union([import_zod.z.any().refine((value) => !import_zod.z.object({ "max_impressions": import_zod.z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), import_zod.z.object({ "max_impressions": import_zod.z.any().refine((value) => value !== void 0, "Required"), "per": import_zod.z.any().refine((value) => value !== void 0, "Required"), "window": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), import_zod.z.intersection(import_zod.z.union([import_zod.z.any().refine((value) => !import_zod.z.object({ "per": import_zod.z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), import_zod.z.object({ "per": import_zod.z.any().refine((value) => value !== void 0, "Required"), "max_impressions": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), import_zod.z.union([import_zod.z.any().refine((value) => !import_zod.z.object({ "window": import_zod.z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), import_zod.z.object({ "window": import_zod.z.any().refine((value) => value !== void 0, "Required"), "max_impressions": import_zod.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": import_zod.z.object({ "agent_url": import_zod.z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": import_zod.z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": import_zod.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": import_zod.z.object({ "agent_url": import_zod.z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": import_zod.z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": import_zod.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": import_zod.z.object({ "agent_url": import_zod.z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": import_zod.z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": import_zod.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": import_zod.z.object({ "agent_url": import_zod.z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": import_zod.z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": import_zod.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": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).and(import_zod.z.any().superRefine((x, ctx) => {
13667
+ const schemas = [import_zod.z.object({ "mode": import_zod.z.literal("selected"), "placement_refs": import_zod.z.array(import_zod.z.union([import_zod.z.intersection(import_zod.z.object({ "publisher_domain": import_zod.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": import_zod.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(import_zod.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."), import_zod.z.object({ "publisher_domain": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough()), import_zod.z.any().superRefine((x2, ctx2) => {
13668
+ const schemas2 = [import_zod.z.object({ "kind": import_zod.z.literal("publisher_ref"), "publisher_domain": import_zod.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": import_zod.z.string().min(1) }).strict(), import_zod.z.object({ "kind": import_zod.z.literal("seller_inline"), "seller_agent": import_zod.z.object({ "agent_url": import_zod.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": import_zod.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": import_zod.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()];
13669
+ const { errors: errors2, failed: failed2 } = schemas2.reduce(
13670
+ ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
13671
+ errors: [...errors3, ...result.error.issues],
13672
+ failed: failed3 + 1
13673
+ } : { errors: errors3, failed: failed3 })(
13674
+ schema.safeParse(x2)
13675
+ ),
13676
+ { errors: [], failed: 0 }
13677
+ );
13678
+ const passed2 = schemas2.length - failed2;
13679
+ if (passed2 !== 1) {
13680
+ ctx2.addIssue(errors2.length ? {
13681
+ path: [],
13682
+ code: "invalid_union",
13683
+ errors: [errors2],
13684
+ message: "Invalid input: Should pass single schema. Passed " + passed2
13685
+ } : {
13686
+ path: [],
13687
+ code: "custom",
13688
+ errors: [errors2],
13689
+ message: "Invalid input: Should pass single schema. Passed " + passed2
13690
+ });
13691
+ }
13692
+ }).describe("Self-contained identity for either a publisher-catalog placement or a sales-agent-defined inline placement. The discriminator names which authority owns placement_id.")])).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Complete required placement set. A reference normally identifies a mode targetable placement. It MAY identify a mode included placement only when the set exactly equals the product's complete fixed included set, which is an inherent match rather than independent selection. Legacy publisher refs use {publisher_domain, placement_id}; authority-discriminated 3.2 identities use placement-identity.json so seller-inline inventory is selected by {seller_agent, placement_id}. An item that exactly matches placement-identity uses that canonical identity; otherwise a released-compatible item with publisher_domain and placement_id uses legacy product-context matching, and tolerated product metadata such as kind, name, or mode has no selection effect."), "ext": import_zod.z.record(import_zod.z.string(), import_zod.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(), import_zod.z.object({ "mode": import_zod.z.literal("default"), "ext": import_zod.z.record(import_zod.z.string(), import_zod.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()];
13693
+ const { errors, failed } = schemas.reduce(
13694
+ ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
13695
+ errors: [...errors2, ...result.error.issues],
13696
+ failed: failed2 + 1
13697
+ } : { errors: errors2, failed: failed2 })(
13698
+ schema.safeParse(x)
13699
+ ),
13700
+ { errors: [], failed: 0 }
13701
+ );
13702
+ const passed = schemas.length - failed;
13703
+ if (passed !== 1) {
13704
+ ctx.addIssue(errors.length ? {
13705
+ path: [],
13706
+ code: "invalid_union",
13707
+ errors: [errors],
13708
+ message: "Invalid input: Should pass single schema. Passed " + passed
13709
+ } : {
13710
+ path: [],
13711
+ code: "custom",
13712
+ errors: [errors],
13713
+ message: "Invalid input: Should pass single schema. Passed " + passed
13714
+ });
13715
+ }
13716
+ })).describe("Purchased placement selection within the product. This constrains package inventory; it is distinct from creative_assignments[].placement_refs, which only route individual creatives within the purchased set. On create, mode selected supplies the complete selected set and mode default uses the product default. In request-side Targeting Input, a non-null value replaces this dimension, omission preserves or inherits it, and null clears it when the product permits that broader inventory set.").optional(), "collection_selection": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).and(import_zod.z.any().superRefine((x, ctx) => {
13717
+ const schemas = [import_zod.z.object({ "mode": import_zod.z.literal("selected"), "collections": import_zod.z.array(import_zod.z.intersection(import_zod.z.object({ "publisher_domain": import_zod.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 these collections is hosted (e.g., 'mrbeast.com'). The collections array in that file contains the authoritative collection definitions."), "collection_ids": import_zod.z.array(import_zod.z.string()).min(1).describe("Collection IDs from the adagents.json collections array. Each ID must match a collection_id declared in that file. Omit to reference all collections declared in that file.").optional() }).catchall(import_zod.z.any()).describe("References collections declared in an adagents.json. Buyers resolve full collection objects by fetching the adagents.json at the given domain and matching collection_ids against its collections array. When collection_ids is omitted, the selector references every collection declared in that adagents.json \u2014 the bulk-grant form for authorization scoping (e.g., a host authorizing a channel owner's sales agent for all of the owner's collections without tracking owner-assigned IDs)."), import_zod.z.object({ "collection_ids": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough())).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Complete required collection set as domain-qualified selectors with explicit collection_ids; the domain-only bulk-grant form is authorization scoping, not selection. publisher_domain may be an external channel owner's domain."), "ext": import_zod.z.record(import_zod.z.string(), import_zod.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(), import_zod.z.object({ "mode": import_zod.z.literal("default"), "ext": import_zod.z.record(import_zod.z.string(), import_zod.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()];
13718
+ const { errors, failed } = schemas.reduce(
13719
+ ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
13720
+ errors: [...errors2, ...result.error.issues],
13721
+ failed: failed2 + 1
13722
+ } : { errors: errors2, failed: failed2 })(
13723
+ schema.safeParse(x)
13724
+ ),
13725
+ { errors: [], failed: 0 }
13726
+ );
13727
+ const passed = schemas.length - failed;
13728
+ if (passed !== 1) {
13729
+ ctx.addIssue(errors.length ? {
13730
+ path: [],
13731
+ code: "invalid_union",
13732
+ errors: [errors],
13733
+ message: "Invalid input: Should pass single schema. Passed " + passed
13734
+ } : {
13735
+ path: [],
13736
+ code: "custom",
13737
+ errors: [errors],
13738
+ message: "Invalid input: Should pass single schema. Passed " + passed
13739
+ });
13740
+ }
13741
+ })).describe("Purchased collection selection within the product. On create, mode selected supplies the complete selected set and mode default uses the product's full bundle. On package readback this is the committed selection sellers MUST echo as concrete selectors, materializing any collection_list composition; collection_list fields remain the buyer-managed list mechanism. In request-side Targeting Input, a non-null value replaces this dimension, omission preserves or inherits it, and null clears it when the product permits that broader inventory set.").optional(), "age_restriction": import_zod.z.object({ "min": import_zod.z.number().int().gte(13).lte(99).describe("Minimum age required"), "verification_required": import_zod.z.boolean().describe("Whether verified age (not inferred) is required for compliance").default(false), "accepted_methods": import_zod.z.array(import_zod.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).describe("Accepted verification methods. If omitted, any method the platform supports is acceptable.").optional() }).strict().describe("Age restriction for compliance. Use for legal requirements (alcohol, gambling), not audience targeting.").optional(), "device_platform": import_zod.z.array(import_zod.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.")).min(1).describe("Restrict to specific platforms. Use for technical compatibility (app only works on iOS). Values from Sec-CH-UA-Platform standard, extended for CTV.").optional(), "device_platform_exclude": import_zod.z.array(import_zod.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.")).min(1).describe("Exclude specific operating-system platforms from delivery. When a platform appears in both device_platform and device_platform_exclude, exclusion wins. Sellers MUST reject a request they cannot enforce rather than silently dropping the exclusion.").optional(), "device_type": import_zod.z.array(import_zod.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.")).min(1).describe("Restrict to specific device form factors. Use for campaigns targeting hardware categories rather than operating systems (e.g., mobile-only promotions, CTV campaigns).").optional(), "device_type_exclude": import_zod.z.array(import_zod.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.")).min(1).describe("Exclude specific device form factors from delivery (e.g., exclude CTV for app-install campaigns).").optional(), "browser": import_zod.z.array(import_zod.z.enum(["chrome", "safari", "firefox", "edge", "opera", "samsung_internet", "android_webview", "other", "unknown"]).describe("Portable browser families for targeting the impression delivery and rendering environment, not a post-click landing-page browser. Values identify browser families, not versions or seller-native browser IDs, and MUST NOT be inferred solely from operating system, device, web/mobile-web inventory, or placement. android_webview means an impression reliably classified as rendering in Android WebView. other means a seller-recognized browser family that is not explicitly enumerated; unknown means the seller cannot classify the browser into a recognized family.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Restrict delivery to specific canonical browser families in the impression delivery and rendering environment, not the post-click landing-page browser. Values MUST NOT be inferred solely from operating system, device, web/mobile-web inventory, or placement. Values in this array use OR semantics. When browser is supplied, families not listed are ineligible: other includes a seller-recognized family that is not explicitly enumerated, while unknown includes a browser the seller cannot classify into a recognized family. When the same family appears in browser and browser_exclude, exclusion wins. Browser and device constraints intersect; a seller that cannot enforce the exact combination MUST exclude or explicitly reconfigure the product during discovery and MUST reject it at create or update rather than silently widening delivery. Browser versions and seller-native IDs are intentionally unsupported.").optional(), "browser_exclude": import_zod.z.array(import_zod.z.enum(["chrome", "safari", "firefox", "edge", "opera", "samsung_internet", "android_webview", "other", "unknown"]).describe("Portable browser families for targeting the impression delivery and rendering environment, not a post-click landing-page browser. Values identify browser families, not versions or seller-native browser IDs, and MUST NOT be inferred solely from operating system, device, web/mobile-web inventory, or placement. android_webview means an impression reliably classified as rendering in Android WebView. other means a seller-recognized browser family that is not explicitly enumerated; unknown means the seller cannot classify the browser into a recognized family.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Exclude specific canonical browser families from delivery. other excludes seller-recognized families that are not explicitly enumerated; unknown excludes browsers the seller cannot classify into a recognized family. When the same family appears in browser and browser_exclude, exclusion wins. Sellers MUST reject a request they cannot enforce rather than silently dropping the exclusion.").optional(), "store_catchments": import_zod.z.array(import_zod.z.object({ "catalog_id": import_zod.z.string().describe("Synced store-type catalog ID from sync_catalogs."), "store_ids": import_zod.z.array(import_zod.z.string()).min(1).describe("Filter to specific stores within the catalog. Omit to target all stores.").optional(), "catchment_ids": import_zod.z.array(import_zod.z.string()).min(1).describe("Catchment zone IDs to target (e.g., 'walk', 'drive'). Omit to target all catchment zones.").optional() }).catchall(import_zod.z.any())).min(1).describe("Target users within store catchment areas from a synced store catalog. Each entry references a store-type catalog and optionally narrows to specific stores or catchment zones.").optional(), "geo_proximity": import_zod.z.array(import_zod.z.object({ "lat": import_zod.z.number().gte(-90).lte(90).describe("Latitude in decimal degrees (WGS 84). Required for travel_time and radius methods.").optional(), "lng": import_zod.z.number().gte(-180).lte(180).describe("Longitude in decimal degrees (WGS 84). Required for travel_time and radius methods.").optional(), "label": import_zod.z.string().describe("Human-readable label for this entry (e.g., 'D\xFCsseldorf', 'Heathrow Airport', 'Primary trade area').").optional(), "travel_time": import_zod.z.object({ "value": import_zod.z.number().gte(1).describe("Travel time limit."), "unit": import_zod.z.enum(["min", "hr"]).describe("Time unit for isochrone (travel-time catchment) calculations.") }).strict().describe("Travel time limit for isochrone calculation. The platform resolves this to a geographic boundary based on actual transportation networks.").optional(), "transport_mode": import_zod.z.enum(["walking", "cycling", "driving", "public_transport"]).describe("Transportation mode for isochrone calculation. Required when travel_time is provided.").optional(), "radius": import_zod.z.object({ "value": import_zod.z.number().gt(0).describe("Radius distance."), "unit": import_zod.z.enum(["km", "mi", "m"]).describe("Distance unit.") }).strict().describe("Simple radius from the point. The platform draws a circle of this distance around the coordinates.").optional(), "geometry": import_zod.z.object({ "type": import_zod.z.enum(["Polygon", "MultiPolygon"]).describe("GeoJSON geometry type."), "coordinates": import_zod.z.array(import_zod.z.any()).describe("GeoJSON coordinates array. For Polygon: array of linear rings. For MultiPolygon: array of polygons.") }).strict().describe("Pre-computed GeoJSON geometry defining the proximity boundary. Use when the buyer has already calculated isochrones (via TravelTime, Mapbox, etc.) or has custom boundaries. When geometry is provided, lat/lng are not required.").optional(), "ext": import_zod.z.record(import_zod.z.string(), import_zod.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(import_zod.z.any()).and(import_zod.z.any().superRefine((x, ctx) => {
13742
+ const schemas = [import_zod.z.object({ "lat": import_zod.z.any().refine((value) => value !== void 0, "Required"), "lng": import_zod.z.any().refine((value) => value !== void 0, "Required"), "travel_time": import_zod.z.any().refine((value) => value !== void 0, "Required"), "transport_mode": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough(), import_zod.z.object({ "lat": import_zod.z.any().refine((value) => value !== void 0, "Required"), "lng": import_zod.z.any().refine((value) => value !== void 0, "Required"), "radius": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough(), import_zod.z.object({ "geometry": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough()];
13743
+ const { errors, failed } = schemas.reduce(
13744
+ ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
13745
+ errors: [...errors2, ...result.error.issues],
13746
+ failed: failed2 + 1
13747
+ } : { errors: errors2, failed: failed2 })(
13748
+ schema.safeParse(x)
13749
+ ),
13750
+ { errors: [], failed: 0 }
13751
+ );
13752
+ const passed = schemas.length - failed;
13753
+ if (passed !== 1) {
13754
+ ctx.addIssue(errors.length ? {
13755
+ path: [],
13756
+ code: "invalid_union",
13757
+ errors: [errors],
13758
+ message: "Invalid input: Should pass single schema. Passed " + passed
13759
+ } : {
13760
+ path: [],
13761
+ code: "custom",
13762
+ errors: [errors],
13763
+ message: "Invalid input: Should pass single schema. Passed " + passed
13764
+ });
13765
+ }
13766
+ }))).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": import_zod.z.array(import_zod.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": import_zod.z.array(import_zod.z.object({ "keyword": import_zod.z.string().min(1).describe("The keyword to target"), "match_type": import_zod.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": import_zod.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() }).strict()).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": import_zod.z.array(import_zod.z.object({ "keyword": import_zod.z.string().min(1).describe("The keyword to exclude"), "match_type": import_zod.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.") }).strict().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(import_zod.z.any()).describe("Strict non-null targeting state used during product discovery, commercial snapshots, and media-buy readback. Targeting includes both audience eligibility and purchased-inventory selection: geography, demographics, placements, properties, collections, device compatibility, language, keywords, and other explicit controls. Sellers resolve requested outcomes against inherent product scope or selectable execution. Request-side create and update mutations use targeting-input.json so null can explicitly clear one dimension; resolved effective targeting omits cleared dimensions and MUST NOT contain null. A fresh create/update request MUST be applied exactly or rejected; get_products may instead return a request-scoped configured product with sparse, buyer-reviewable targeting_resolution modifications.");
13767
+ const exactSchema = objectSchema.superRefine((value, ctx) => {
13768
+ const checked = import_zod.z.intersection(import_zod.z.union([import_zod.z.any().refine((value2) => !import_zod.z.object({ "demographics": import_zod.z.any().refine((value3) => value3 !== void 0, "Required"), "age_restriction": import_zod.z.any().refine((value3) => value3 !== void 0, "Required") }).passthrough().safeParse(value2).success, "Invalid input: Should NOT be valid against schema"), import_zod.z.intersection(import_zod.z.object({ "demographics": import_zod.z.any().refine((value2) => value2 !== void 0, "Required"), "age_restriction": import_zod.z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), import_zod.z.object({ "demographics": import_zod.z.object({ "age": import_zod.z.object({ "include_unknown": import_zod.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."), import_zod.z.union([import_zod.z.any().refine((value2) => !import_zod.z.object({ "age_restriction": import_zod.z.object({ "verification_required": import_zod.z.literal(true) }), "demographics": import_zod.z.object({ "age": import_zod.z.object({ "accepted_bases": import_zod.z.any().refine((value3) => value3 !== void 0, "Required") }).passthrough() }) }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema"), import_zod.z.intersection(import_zod.z.object({ "age_restriction": import_zod.z.object({ "verification_required": import_zod.z.literal(true) }), "demographics": import_zod.z.object({ "age": import_zod.z.object({ "accepted_bases": import_zod.z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough() }) }), import_zod.z.object({ "demographics": import_zod.z.object({ "age": import_zod.z.object({ "accepted_bases": import_zod.z.any().refine((value2) => !import_zod.z.array(import_zod.z.any().refine((value3) => !import_zod.z.literal("verified").safeParse(value3).success, "Invalid input: Should NOT be valid against schema")).safeParse(value2).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.")).safeParse(value);
13769
+ if (!checked.success) {
13770
+ for (const issue of checked.error.issues) {
13771
+ ctx.addIssue({ code: "custom", path: issue.path, message: issue.message });
13772
+ }
13773
+ }
13774
+ });
13775
+ return Object.assign(exactSchema, {
13776
+ pick: objectSchema.pick.bind(objectSchema),
13777
+ omit: objectSchema.omit.bind(objectSchema),
13778
+ extend: objectSchema.extend.bind(objectSchema)
13779
+ });
13780
+ })();
13781
+ const DeliveryForecast1Schema = DeliveryForecastSchema;
13782
+ const GetProductsAsyncInputRequiredSchema = import_zod.z.object({
13783
+ reason: import_zod.z.union([import_zod.z.literal("CLARIFICATION_NEEDED"), import_zod.z.literal("BUDGET_REQUIRED")]).optional(),
13784
+ partial_results: import_zod.z.array(ProductSchema).optional(),
13785
+ suggestions: import_zod.z.array(import_zod.z.string()).optional(),
13786
+ context: ContextObjectSchema.optional(),
13787
+ ext: ExtensionObjectSchema.optional()
13788
+ }).passthrough();
13789
+ const ProductPurchaseSchema = import_zod.z.object({
13790
+ product_id: import_zod.z.string().min(1),
13791
+ pricing_option_id: import_zod.z.string().min(1),
13792
+ pricing: CanonicalPricingOptionSchema.optional(),
13793
+ format_option_refs: import_zod.z.array(FormatOptionReferenceSchema).optional(),
13794
+ catalog_ids: import_zod.z.array(import_zod.z.string()).optional(),
13795
+ budget: import_zod.z.number().gte(0).optional(),
13796
+ daily_budget_cap: import_zod.z.number().gte(0).optional(),
13797
+ min_spend_target: import_zod.z.number().gte(0).optional(),
13798
+ impressions: ProductPurchaseImpressionsSchema.optional(),
13799
+ start_time: import_zod.z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
13800
+ end_time: import_zod.z.string().refine(adcpJsonSchemaDateTime, "Invalid date-time").optional(),
13801
+ pacing: PacingSchema.optional(),
13802
+ bidding: BiddingPolicySchema.optional(),
13803
+ targeting_overlay: TargetingOverlaySchema.optional(),
13804
+ optimization_goals: import_zod.z.array(CanonicalOptimizationGoalSchema).optional(),
13805
+ audience_evidence_requirements: ProductPurchaseAudienceEvidenceRequirementsSchema.optional(),
13806
+ audience_evidence_pins: import_zod.z.array(AudienceEvidencePinSchema).optional(),
13807
+ agency_estimate_number: import_zod.z.string().max(100).optional(),
13808
+ context: ContextObjectSchema.optional(),
13809
+ ext: ExtensionObjectSchema.optional(),
13810
+ measurement_terms: ProductPurchaseMeasurementTermsSchema.optional(),
13811
+ performance_standards: import_zod.z.array(CanonicalPerformanceStandardSchema).optional()
13812
+ }).passthrough();
13813
+ const CanonicalForecastPointSchema = import_zod.z.object({
13814
+ label: import_zod.z.string().max(128).optional(),
13815
+ budget: import_zod.z.number().gte(0).optional(),
13816
+ product_id: import_zod.z.string().optional(),
13817
+ dimensions: ForecastPointDimensionsSchema.optional(),
13818
+ availability_status: AvailabilityStatusSchema.optional(),
13819
+ metrics: import_zod.z.object({
13820
+ coverage_rate: ForecastRateRangeSchema.optional()
13821
+ }).passthrough().catchall(ForecastRangeSchema),
13822
+ viewability: import_zod.z.union([import_zod.z.object({}).passthrough(), import_zod.z.object({}).passthrough()]).optional(),
13823
+ vendor_metric_values: import_zod.z.array(CanonicalForecastVendorMetricValueSchema).optional()
13824
+ }).passthrough();
13825
+ const CreativeAssetValueSchema = import_zod.z.unknown().superRefine((value, ctx) => {
13826
+ const variants = Array.isArray(value) ? value : [value];
13827
+ if (variants.length === 0 || variants.some((variant) => !AssetVariantSchema.safeParse(variant).success)) {
13828
+ ctx.addIssue({
13829
+ code: "custom",
13830
+ message: "creative slot must contain an asset or non-empty array of assets"
13831
+ });
13832
+ }
13833
+ });
13834
+ const CreativeAssetsRuntimeSchema = import_zod.z.record(import_zod.z.string(), import_zod.z.unknown()).superRefine((assets, ctx) => {
13835
+ for (const [slotKey, assetValue] of Object.entries(assets)) {
13836
+ if (/^[a-z0-9_]+$/.test(slotKey) && !CreativeAssetValueSchema.safeParse(assetValue).success) {
13837
+ ctx.addIssue({
13838
+ code: "custom",
13839
+ path: [slotKey],
13840
+ message: "creative slot must contain an asset or non-empty array of assets"
13841
+ });
13842
+ }
13843
+ }
13844
+ });
13845
+ const CreativeManifestSchema = import_zod.z.object({}).passthrough().merge(import_zod.z.object({
13846
+ format_id: FormatReferenceStructuredObjectSchema.optional(),
13847
+ format_kind: CanonicalFormatKindSchema.optional(),
13848
+ format_option_ref: FormatOptionReferenceSchema.optional(),
13849
+ representation_selection: RepresentationSelectionSchema.optional(),
13850
+ assets: CreativeAssetsRuntimeSchema,
13851
+ component_assets: import_zod.z.record(import_zod.z.string(), CreativeAssetsSchema).optional(),
13852
+ brand: BrandReferenceSchema.optional(),
13853
+ rights: import_zod.z.array(RightsConstraintSchema).optional(),
13854
+ industry_identifiers: import_zod.z.array(IndustryIdentifierSchema).optional(),
13855
+ provenance: ProvenanceSchema.optional(),
13856
+ ext: ExtensionObjectSchema.optional()
13857
+ }).passthrough()).superRefine((value, ctx) => {
13858
+ const hasFormatId = value.format_id !== void 0;
13859
+ const hasFormatKind = value.format_kind !== void 0;
13860
+ if (hasFormatId === hasFormatKind) {
13861
+ ctx.addIssue({
13862
+ code: "custom",
13863
+ path: [],
13864
+ message: "creative identity requires exactly one of format_id or format_kind"
13865
+ });
13866
+ }
13867
+ if ("capability_id" in value || "capability_ref" in value) {
13868
+ ctx.addIssue({
13869
+ code: "custom",
13870
+ path: [],
13871
+ message: "creative identity does not allow capability_id or capability_ref"
13872
+ });
13873
+ }
13874
+ });
13875
+ const BuildCreativeMultiSuccessSchema = import_zod.z.object({
13876
+ creative_manifests: import_zod.z.array(CreativeManifestSchema),
13877
+ sandbox: import_zod.z.boolean().optional(),
13878
+ expires_at: import_zod.z.iso.datetime().optional(),
13879
+ preview: import_zod.z.object({
13880
+ previews: import_zod.z.array(import_zod.z.object({
13881
+ preview_id: import_zod.z.string(),
13882
+ format_id: FormatReferenceStructuredObjectSchema.optional(),
13883
+ capability_id: import_zod.z.string().regex(/^[a-zA-Z0-9_-]+$/).optional(),
13884
+ renders: import_zod.z.array(PreviewRenderSchema),
13885
+ input: import_zod.z.object({
13886
+ name: import_zod.z.string(),
13887
+ macros: import_zod.z.record(import_zod.z.string(), import_zod.z.string()).optional(),
13888
+ context_description: import_zod.z.string().optional()
13889
+ }).passthrough()
13890
+ }).passthrough()),
13891
+ interactive_url: import_zod.z.string().optional(),
13892
+ expires_at: import_zod.z.iso.datetime()
13893
+ }).passthrough().optional(),
13894
+ preview_error: ErrorSchema.optional(),
13895
+ pricing_option_id: import_zod.z.string().optional(),
13896
+ vendor_cost: import_zod.z.number().min(0).optional(),
13897
+ currency: import_zod.z.string().regex(/^[A-Z]{3}$/).optional(),
13898
+ consumption: CreativeConsumptionSchema.optional(),
13899
+ context: ContextObjectSchema.optional(),
13900
+ ext: ExtensionObjectSchema.optional()
13901
+ }).passthrough();
13902
+ const BuildCreativeVariantSuccessSchema = import_zod.z.object({
13903
+ creatives: import_zod.z.array(import_zod.z.object({
13904
+ build_creative_id: import_zod.z.string().optional(),
13905
+ catalog_item_ref: import_zod.z.object({
13906
+ catalog_type: import_zod.z.string().optional(),
13907
+ item_id: import_zod.z.string()
13908
+ }).passthrough().optional(),
13909
+ signal_condition: SignalTargetingSchema.optional(),
13910
+ variants: import_zod.z.array(import_zod.z.object({
13911
+ build_variant_id: import_zod.z.string(),
13912
+ recipe_hash: import_zod.z.string().optional(),
13913
+ parent_build_variant_id: import_zod.z.string().optional(),
13914
+ creative_manifest: CreativeManifestSchema,
13915
+ variant_axis_value: import_zod.z.unknown().optional(),
13916
+ recommended: import_zod.z.boolean().optional(),
13917
+ rank: import_zod.z.int().min(1).optional(),
13918
+ eval: import_zod.z.object({
13919
+ features: import_zod.z.array(CreativeFeatureResultSchema).optional(),
13920
+ ranked_against: import_zod.z.int().min(1).optional(),
13921
+ calls_used: import_zod.z.int().min(0).optional(),
13922
+ seconds_used: import_zod.z.number().min(0).optional(),
13923
+ ext: ExtensionObjectSchema.optional()
13924
+ }).passthrough().optional(),
13925
+ pricing_option_id: import_zod.z.string().optional(),
13926
+ vendor_cost: import_zod.z.number().min(0).optional(),
13927
+ currency: import_zod.z.string().regex(/^[A-Z]{3}$/).optional(),
13928
+ consumption: CreativeConsumptionSchema.optional()
13929
+ }).passthrough()).optional(),
13930
+ errors: import_zod.z.array(ErrorSchema).optional()
13931
+ }).passthrough()),
13932
+ items_total: import_zod.z.int().min(0).optional(),
13933
+ items_returned: import_zod.z.int().min(0).optional(),
13934
+ leaves_total: import_zod.z.int().min(0).optional(),
13935
+ leaves_returned: import_zod.z.int().min(0).optional(),
13936
+ vendor_cost: import_zod.z.number().min(0).optional(),
13937
+ currency: import_zod.z.string().regex(/^[A-Z]{3}$/).optional(),
13938
+ keep_mode_applied: import_zod.z.union([import_zod.z.literal("keep_all"), import_zod.z.literal("keep_one"), import_zod.z.literal("keep_some")]).optional(),
13939
+ selection_strategy_applied: CreativeSelectionStrategySchema.optional(),
13940
+ budget_status: import_zod.z.union([import_zod.z.literal("complete"), import_zod.z.literal("capped")]).optional(),
13941
+ errors: import_zod.z.array(ErrorSchema).optional(),
13942
+ sandbox: import_zod.z.boolean().optional(),
13943
+ expires_at: import_zod.z.iso.datetime().optional(),
13944
+ context: ContextObjectSchema.optional(),
13945
+ ext: ExtensionObjectSchema.optional()
13946
+ }).passthrough();
13947
+ const PreviewCreativeVariantResponseSchema = import_zod.z.object({
13948
+ response_type: import_zod.z.literal("variant"),
13949
+ variant_id: import_zod.z.string(),
13950
+ creative_id: import_zod.z.string().optional(),
13951
+ previews: import_zod.z.array(import_zod.z.object({
13952
+ preview_id: import_zod.z.string(),
13953
+ renders: import_zod.z.array(PreviewRenderSchema)
13954
+ }).passthrough()),
13955
+ manifest: CreativeManifestSchema.optional(),
13956
+ expires_at: import_zod.z.iso.datetime().optional(),
13957
+ context: ContextObjectSchema.optional(),
13958
+ ext: ExtensionObjectSchema.optional()
13959
+ }).passthrough();
13960
+ const AAODirectoryAgentPublishersInverseLookupResponseSchema = import_zod.z.object({
13961
+ agent_url: import_zod.z.string().refine(adcpJsonSchemaUri, "Invalid URI"),
13962
+ directory_indexed_at: import_zod.z.iso.datetime().nullable(),
13963
+ publishers: import_zod.z.array(PublisherEntrySchema),
13964
+ next_cursor: import_zod.z.string().optional().nullable()
13965
+ }).passthrough();
13966
+ const AcquireRightsAcquiredSchema = import_zod.z.object({
13967
+ rights_id: import_zod.z.string(),
13968
+ rights_status: import_zod.z.literal("acquired"),
13969
+ brand_id: import_zod.z.string(),
13970
+ terms: RightsTermsSchema,
13971
+ generation_credentials: import_zod.z.array(GenerationCredentialSchema),
13972
+ restrictions: import_zod.z.array(import_zod.z.string()).optional(),
13973
+ disclosure: import_zod.z.object({
13974
+ required: import_zod.z.boolean(),
13975
+ text: import_zod.z.string().optional()
13976
+ }).passthrough().optional(),
13977
+ approval_webhook: PushNotificationConfigSchema.optional(),
13978
+ usage_reporting_url: import_zod.z.string().optional(),
13979
+ rights_constraint: RightsConstraintSchema.and(import_zod.z.object({}).passthrough()),
13980
+ context: ContextObjectSchema.optional(),
13981
+ ext: ExtensionObjectSchema.optional()
13982
+ }).passthrough();
13983
+ const CreativeApprovalResponseSchema = import_zod.z.object({
13984
+ context_id: import_zod.z.string().optional(),
13985
+ context: ContextObjectSchema.optional(),
13986
+ task_id: import_zod.z.string().optional(),
13987
+ status: TaskStatusSchema,
13988
+ message: import_zod.z.string().optional(),
13989
+ timestamp: import_zod.z.string().optional(),
13990
+ replayed: import_zod.z.boolean().optional(),
13991
+ adcp_error: ErrorSchema.optional(),
13992
+ push_notification_config: PushNotificationConfigSchema.optional(),
13993
+ governance_context: import_zod.z.string().optional(),
13994
+ payload: import_zod.z.object({}).passthrough().optional(),
13995
+ adcp_version: import_zod.z.string().optional(),
13996
+ adcp_major_version: import_zod.z.number().optional()
13997
+ }).passthrough().and(import_zod.z.union([CreativeApprovedSchema, CreativeRejectedSchema, CreativePendingReviewSchema, CreativeApprovalErrorSchema]));
13998
+ const GetBrandIdentityResponseSchema = import_zod.z.object({
13999
+ context_id: import_zod.z.string().optional(),
14000
+ context: ContextObjectSchema.optional(),
13619
14001
  task_id: import_zod.z.string().optional(),
13620
14002
  status: TaskStatusSchema,
13621
14003
  message: import_zod.z.string().optional(),
@@ -14619,45 +15001,422 @@ const AcceptancePolicyCatalogSchema = import_zod.z.object({
14619
15001
  registry_profiles: import_zod.z.array(RegistryAcceptancePolicyProfileReferenceSchema).optional(),
14620
15002
  ext: ExtensionObjectSchema.optional()
14621
15003
  }).passthrough();
14622
- const TargetingOverlayInputSchema = TargetingUnknownAgeEligibilityConstraintSchema.merge(TargetingVerifiedAgeBasisConstraintSchema).merge(import_zod.z.object({
14623
- geo_countries: GeoCountriesSchema.optional().nullable(),
14624
- geo_countries_exclude: GeoCountriesExcludeSchema.optional().nullable(),
14625
- geo_regions: GeoRegionsSchema.optional().nullable(),
14626
- geo_regions_exclude: GeoRegionsExcludeSchema.optional().nullable(),
14627
- geo_metros: TargetingGeoMetrosSchema.optional(),
14628
- geo_metros_exclude: GeoMetrosExcludeSchema.optional().nullable(),
14629
- geo_postal_areas: GeoPostalAreasSchema.optional().nullable(),
14630
- geo_postal_areas_exclude: GeoPostalAreasExcludeSchema.optional().nullable(),
14631
- geo_places: GeoPlacesSchema.optional().nullable(),
14632
- geo_places_exclude: GeoPlacesExcludeSchema.optional().nullable(),
14633
- daypart_targets: DaypartTargetsSchema.optional().nullable(),
14634
- axe_include_segment: import_zod.z.string().optional().nullable(),
14635
- axe_exclude_segment: import_zod.z.string().optional().nullable(),
14636
- audience_include: AudienceIncludeSchema.optional().nullable(),
14637
- audience_exclude: AudienceExcludeSchema.optional().nullable(),
14638
- signal_targeting_groups: TargetingSignalGroupsSchema.optional().nullable(),
14639
- signal_targeting: import_zod.z.array(SignalTargetingSchema).optional().nullable(),
14640
- demographics: DemographicTargetingIntentSchema.optional().nullable(),
14641
- frequency_cap: TargetingFrequencyCapSchema.optional().nullable(),
14642
- property_list: TargetingPropertyListSchema.optional().nullable(),
14643
- property_list_exclude: PropertyListReferenceSchema.optional().nullable(),
14644
- collection_list: TargetingCollectionListSchema.optional().nullable(),
14645
- collection_list_exclude: CollectionListReferenceSchema.optional().nullable(),
14646
- placement_selection: PlacementSelectionSchema.optional().nullable(),
14647
- collection_selection: TargetingCollectionSelectionSchema.optional().nullable(),
14648
- age_restriction: AgeRestrictionSchema.optional().nullable(),
14649
- device_platform: import_zod.z.array(DevicePlatformSchema).optional().nullable(),
14650
- device_platform_exclude: DevicePlatformExcludeSchema.optional().nullable(),
14651
- device_type: import_zod.z.array(DeviceTypeSchema).optional().nullable(),
14652
- device_type_exclude: DeviceTypeExcludeSchema.optional().nullable(),
14653
- browser: BrowserSchema.optional().nullable(),
14654
- browser_exclude: BrowserExcludeSchema.optional().nullable(),
14655
- store_catchments: StoreCatchmentsSchema.optional().nullable(),
14656
- geo_proximity: GeoProximitySchema.optional().nullable(),
14657
- language: TargetingLanguagesSchema.optional(),
14658
- keyword_targets: TargetingKeywordsSchema.optional(),
14659
- negative_keywords: TargetingNegativeKeywordsSchema.optional()
14660
- }).passthrough());
15004
+ const TargetingOverlayInputSchema = (() => {
15005
+ const objectSchema = import_zod.z.object({ "geo_countries": import_zod.z.union([import_zod.z.array(import_zod.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')."), import_zod.z.null()]).optional(), "geo_countries_exclude": import_zod.z.union([import_zod.z.array(import_zod.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')."), import_zod.z.null()]).optional(), "geo_regions": import_zod.z.union([import_zod.z.array(import_zod.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."), import_zod.z.null()]).optional(), "geo_regions_exclude": import_zod.z.union([import_zod.z.array(import_zod.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."), import_zod.z.null()]).optional(), "geo_metros": import_zod.z.union([import_zod.z.array(import_zod.z.object({ "system": import_zod.z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": import_zod.z.array(import_zod.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."), import_zod.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": import_zod.z.union([import_zod.z.array(import_zod.z.object({ "system": import_zod.z.enum(["nielsen_dma", "uk_itl1", "uk_itl2", "eurostat_nuts2", "custom"]).describe("Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')"), "values": import_zod.z.array(import_zod.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."), import_zod.z.null()]).optional(), "geo_postal_areas": import_zod.z.union([import_zod.z.array(import_zod.z.union([import_zod.z.object({ "country": import_zod.z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": import_zod.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": import_zod.z.array(import_zod.z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(import_zod.z.object({ "country": import_zod.z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": import_zod.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(import_zod.z.union([import_zod.z.object({ "country": import_zod.z.literal("US").optional(), "system": import_zod.z.enum(["zip", "zip_plus_four"]).optional() }), import_zod.z.object({ "country": import_zod.z.literal("GB").optional(), "system": import_zod.z.enum(["outward", "full"]).optional() }), import_zod.z.object({ "country": import_zod.z.literal("CA").optional(), "system": import_zod.z.enum(["fsa", "full"]).optional() }), import_zod.z.object({ "country": import_zod.z.enum(["DE", "CH", "AT"]).optional(), "system": import_zod.z.literal("plz").optional() }), import_zod.z.object({ "country": import_zod.z.literal("FR").optional(), "system": import_zod.z.literal("code_postal").optional() }), import_zod.z.object({ "country": import_zod.z.literal("AU").optional(), "system": import_zod.z.literal("postcode").optional() }), import_zod.z.object({ "country": import_zod.z.literal("BR").optional(), "system": import_zod.z.literal("cep").optional() }), import_zod.z.object({ "country": import_zod.z.literal("IN").optional(), "system": import_zod.z.literal("pin").optional() }), import_zod.z.object({ "country": import_zod.z.literal("ZA").optional(), "system": import_zod.z.literal("postal_code").optional() }), import_zod.z.object({ "country": import_zod.z.any().refine((value) => !import_zod.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": import_zod.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.")), import_zod.z.object({ "system": import_zod.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": import_zod.z.array(import_zod.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."), import_zod.z.null()]).optional(), "geo_postal_areas_exclude": import_zod.z.union([import_zod.z.array(import_zod.z.union([import_zod.z.object({ "country": import_zod.z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code for the postal values."), "system": import_zod.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": import_zod.z.array(import_zod.z.string()).min(1).describe("Postal codes within the country and system.") }).strict().and(import_zod.z.object({ "country": import_zod.z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code."), "system": import_zod.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(import_zod.z.union([import_zod.z.object({ "country": import_zod.z.literal("US").optional(), "system": import_zod.z.enum(["zip", "zip_plus_four"]).optional() }), import_zod.z.object({ "country": import_zod.z.literal("GB").optional(), "system": import_zod.z.enum(["outward", "full"]).optional() }), import_zod.z.object({ "country": import_zod.z.literal("CA").optional(), "system": import_zod.z.enum(["fsa", "full"]).optional() }), import_zod.z.object({ "country": import_zod.z.enum(["DE", "CH", "AT"]).optional(), "system": import_zod.z.literal("plz").optional() }), import_zod.z.object({ "country": import_zod.z.literal("FR").optional(), "system": import_zod.z.literal("code_postal").optional() }), import_zod.z.object({ "country": import_zod.z.literal("AU").optional(), "system": import_zod.z.literal("postcode").optional() }), import_zod.z.object({ "country": import_zod.z.literal("BR").optional(), "system": import_zod.z.literal("cep").optional() }), import_zod.z.object({ "country": import_zod.z.literal("IN").optional(), "system": import_zod.z.literal("pin").optional() }), import_zod.z.object({ "country": import_zod.z.literal("ZA").optional(), "system": import_zod.z.literal("postal_code").optional() }), import_zod.z.object({ "country": import_zod.z.any().refine((value) => !import_zod.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": import_zod.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.")), import_zod.z.object({ "system": import_zod.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": import_zod.z.array(import_zod.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."), import_zod.z.null()]).optional(), "geo_places": import_zod.z.union([import_zod.z.array(import_zod.z.object({ "country": import_zod.z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": import_zod.z.union([import_zod.z.enum(["geonames", "google_ads", "microsoft_ads"]), import_zod.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": import_zod.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": import_zod.z.union([import_zod.z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), import_zod.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": import_zod.z.array(import_zod.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": import_zod.z.record(import_zod.z.string(), import_zod.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": import_zod.z.record(import_zod.z.string(), import_zod.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(import_zod.z.union([import_zod.z.any().refine((value) => !import_zod.z.object({ "system": import_zod.z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), import_zod.z.intersection(import_zod.z.object({ "system": import_zod.z.enum(["geonames", "google_ads", "microsoft_ads"]) }), import_zod.z.object({ "values": import_zod.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."), import_zod.z.null()]).optional(), "geo_places_exclude": import_zod.z.union([import_zod.z.array(import_zod.z.object({ "country": import_zod.z.string().regex(new RegExp("^[A-Z]{2}$")).describe("ISO 3166-1 alpha-2 country code containing the place."), "system": import_zod.z.union([import_zod.z.enum(["geonames", "google_ads", "microsoft_ads"]), import_zod.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": import_zod.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": import_zod.z.union([import_zod.z.enum(["airport", "borough", "city", "city_region", "commune", "county", "district", "municipality", "neighborhood", "post_town", "prefecture", "province", "quarter", "state", "territory", "ward"]), import_zod.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": import_zod.z.array(import_zod.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": import_zod.z.record(import_zod.z.string(), import_zod.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": import_zod.z.record(import_zod.z.string(), import_zod.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(import_zod.z.union([import_zod.z.any().refine((value) => !import_zod.z.object({ "system": import_zod.z.enum(["geonames", "google_ads", "microsoft_ads"]) }).safeParse(value).success, "Invalid input: Should NOT be valid against schema"), import_zod.z.intersection(import_zod.z.object({ "system": import_zod.z.enum(["geonames", "google_ads", "microsoft_ads"]) }), import_zod.z.object({ "values": import_zod.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."), import_zod.z.null()]).optional(), "daypart_targets": import_zod.z.union([import_zod.z.array(import_zod.z.object({ "days": import_zod.z.array(import_zod.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": import_zod.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": import_zod.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": import_zod.z.union([import_zod.z.literal("inventory_local"), import_zod.z.any().refine((value) => !import_zod.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": import_zod.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."), import_zod.z.null()]).optional(), "axe_include_segment": import_zod.z.union([import_zod.z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to include for targeting."), import_zod.z.null()]).optional(), "axe_exclude_segment": import_zod.z.union([import_zod.z.string().describe("Deprecated: Use TMP provider fields instead. AXE segment ID to exclude from targeting."), import_zod.z.null()]).optional(), "audience_include": import_zod.z.union([import_zod.z.array(import_zod.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."), import_zod.z.null()]).optional(), "audience_exclude": import_zod.z.union([import_zod.z.array(import_zod.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."), import_zod.z.null()]).optional(), "signal_targeting_groups": import_zod.z.union([import_zod.z.object({ "operator": import_zod.z.literal("all").describe("Groups-level operator. Required even though v1 only supports 'all': every child group must be satisfied."), "groups": import_zod.z.array(import_zod.z.object({ "operator": import_zod.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": import_zod.z.array(import_zod.z.object({ "pricing_option_id": import_zod.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": import_zod.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": import_zod.z.record(import_zod.z.string(), import_zod.z.any()).and(import_zod.z.any().superRefine((x, ctx) => {
15006
+ const schemas = [import_zod.z.object({ "type": import_zod.z.literal("segment_id").describe("Segment ID based targeting"), "segment_id": import_zod.z.string().describe("The platform-specific segment identifier to use in campaign targeting") }).catchall(import_zod.z.any()), import_zod.z.object({ "type": import_zod.z.literal("key_value").describe("Key-value pair based targeting"), "key": import_zod.z.string().describe("The targeting parameter key"), "value": import_zod.z.string().describe("The targeting parameter value") }).catchall(import_zod.z.any())];
15007
+ const { errors, failed } = schemas.reduce(
15008
+ ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
15009
+ errors: [...errors2, ...result.error.issues],
15010
+ failed: failed2 + 1
15011
+ } : { errors: errors2, failed: failed2 })(
15012
+ schema.safeParse(x)
15013
+ ),
15014
+ { errors: [], failed: 0 }
15015
+ );
15016
+ const passed = schemas.length - failed;
15017
+ if (passed !== 1) {
15018
+ ctx.addIssue(errors.length ? {
15019
+ path: [],
15020
+ code: "invalid_union",
15021
+ errors: [errors],
15022
+ message: "Invalid input: Should pass single schema. Passed " + passed
15023
+ } : {
15024
+ path: [],
15025
+ code: "custom",
15026
+ errors: [errors],
15027
+ message: "Invalid input: Should pass single schema. Passed " + passed
15028
+ });
15029
+ }
15030
+ })).describe("Destination-specific activation key returned by get_signals or activate_signal. Usually omitted for seller-offered signals selected directly through the same seller; include only when the selected signal was separately activated and the seller requires the activation key to correlate the package selection.").optional() }).catchall(import_zod.z.any()).and(import_zod.z.any().superRefine((x, ctx) => {
15031
+ const schemas = [import_zod.z.object({ "signal_ref": import_zod.z.any().superRefine((x2, ctx2) => {
15032
+ const schemas2 = [import_zod.z.object({ "scope": import_zod.z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": import_zod.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(import_zod.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."), import_zod.z.object({ "scope": import_zod.z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": import_zod.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": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(import_zod.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."), import_zod.z.object({ "scope": import_zod.z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": import_zod.z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(import_zod.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.")];
15033
+ const { errors: errors2, failed: failed2 } = schemas2.reduce(
15034
+ ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
15035
+ errors: [...errors3, ...result.error.issues],
15036
+ failed: failed3 + 1
15037
+ } : { errors: errors3, failed: failed3 })(
15038
+ schema.safeParse(x2)
15039
+ ),
15040
+ { errors: [], failed: 0 }
15041
+ );
15042
+ const passed2 = schemas2.length - failed2;
15043
+ if (passed2 !== 1) {
15044
+ ctx2.addIssue(errors2.length ? {
15045
+ path: [],
15046
+ code: "invalid_union",
15047
+ errors: [errors2],
15048
+ message: "Invalid input: Should pass single schema. Passed " + passed2
15049
+ } : {
15050
+ path: [],
15051
+ code: "custom",
15052
+ errors: [errors2],
15053
+ message: "Invalid input: Should pass single schema. Passed " + passed2
15054
+ });
15055
+ }
15056
+ }).describe("Named signal being targeted."), "value_type": import_zod.z.literal("binary").describe("Discriminator for binary signals."), "value": import_zod.z.literal(true).describe("Binary package signal entries match users for whom the signal is true. Use the parent group operator for include/exclude.") }).catchall(import_zod.z.any()).describe("Binary signal expression. In grouped package targeting, value is always true; use a parent group with operator 'none' for exclusion."), import_zod.z.object({ "signal_ref": import_zod.z.any().superRefine((x2, ctx2) => {
15057
+ const schemas2 = [import_zod.z.object({ "scope": import_zod.z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": import_zod.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(import_zod.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."), import_zod.z.object({ "scope": import_zod.z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": import_zod.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": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(import_zod.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."), import_zod.z.object({ "scope": import_zod.z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": import_zod.z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(import_zod.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.")];
15058
+ const { errors: errors2, failed: failed2 } = schemas2.reduce(
15059
+ ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
15060
+ errors: [...errors3, ...result.error.issues],
15061
+ failed: failed3 + 1
15062
+ } : { errors: errors3, failed: failed3 })(
15063
+ schema.safeParse(x2)
15064
+ ),
15065
+ { errors: [], failed: 0 }
15066
+ );
15067
+ const passed2 = schemas2.length - failed2;
15068
+ if (passed2 !== 1) {
15069
+ ctx2.addIssue(errors2.length ? {
15070
+ path: [],
15071
+ code: "invalid_union",
15072
+ errors: [errors2],
15073
+ message: "Invalid input: Should pass single schema. Passed " + passed2
15074
+ } : {
15075
+ path: [],
15076
+ code: "custom",
15077
+ errors: [errors2],
15078
+ message: "Invalid input: Should pass single schema. Passed " + passed2
15079
+ });
15080
+ }
15081
+ }).describe("Named signal being targeted."), "value_type": import_zod.z.literal("categorical").describe("Discriminator for categorical signals."), "values": import_zod.z.array(import_zod.z.string()).min(1).describe("Values to target. Users with any of these values match the expression.") }).catchall(import_zod.z.any()).describe("Categorical signal expression - target users with one of the listed values."), import_zod.z.object({ "signal_ref": import_zod.z.any().superRefine((x2, ctx2) => {
15082
+ const schemas2 = [import_zod.z.object({ "scope": import_zod.z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": import_zod.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(import_zod.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."), import_zod.z.object({ "scope": import_zod.z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": import_zod.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": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(import_zod.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."), import_zod.z.object({ "scope": import_zod.z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": import_zod.z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(import_zod.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.")];
15083
+ const { errors: errors2, failed: failed2 } = schemas2.reduce(
15084
+ ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
15085
+ errors: [...errors3, ...result.error.issues],
15086
+ failed: failed3 + 1
15087
+ } : { errors: errors3, failed: failed3 })(
15088
+ schema.safeParse(x2)
15089
+ ),
15090
+ { errors: [], failed: 0 }
15091
+ );
15092
+ const passed2 = schemas2.length - failed2;
15093
+ if (passed2 !== 1) {
15094
+ ctx2.addIssue(errors2.length ? {
15095
+ path: [],
15096
+ code: "invalid_union",
15097
+ errors: [errors2],
15098
+ message: "Invalid input: Should pass single schema. Passed " + passed2
15099
+ } : {
15100
+ path: [],
15101
+ code: "custom",
15102
+ errors: [errors2],
15103
+ message: "Invalid input: Should pass single schema. Passed " + passed2
15104
+ });
15105
+ }
15106
+ }).describe("Named signal being targeted."), "value_type": import_zod.z.literal("numeric").describe("Discriminator for numeric signals."), "min_value": import_zod.z.number().describe("Minimum value, inclusive. Omit for no minimum. Should be within the signal definition's range when declared.").optional(), "max_value": import_zod.z.number().describe("Maximum value, inclusive. Omit for no maximum. Should be within the signal definition's range when declared.").optional() }).catchall(import_zod.z.any()).and(import_zod.z.union([import_zod.z.object({ "min_value": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough(), import_zod.z.object({ "max_value": import_zod.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.")];
15107
+ const { errors, failed } = schemas.reduce(
15108
+ ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
15109
+ errors: [...errors2, ...result.error.issues],
15110
+ failed: failed2 + 1
15111
+ } : { errors: errors2, failed: failed2 })(
15112
+ schema.safeParse(x)
15113
+ ),
15114
+ { errors: [], failed: 0 }
15115
+ );
15116
+ const passed = schemas.length - failed;
15117
+ if (passed !== 1) {
15118
+ ctx.addIssue(errors.length ? {
15119
+ path: [],
15120
+ code: "invalid_union",
15121
+ errors: [errors],
15122
+ message: "Invalid input: Should pass single schema. Passed " + passed
15123
+ } : {
15124
+ path: [],
15125
+ code: "custom",
15126
+ errors: [errors],
15127
+ message: "Invalid input: Should pass single schema. Passed " + passed
15128
+ });
15129
+ }
15130
+ }).describe("Predicate over a named signal definition. Signals are typed dimensions, similar to feature values: binary signals match true, categorical signals match one of a set of values, and numeric signals match a range. In package signal targeting groups, include/exclude semantics are controlled by the parent group operator, not by negating the expression.")).describe("Buy-time selection of one seller-offered signal inside a package signal targeting group. The signal_ref uses scope 'product' for a product-local signal option, scope 'data_provider' for a signal defined in a data provider's published adagents.json signals[], or scope 'signal_source' for a source-native signal that is not published in adagents.json signals[]. The selected product's inline Product.signal_targeting_options, get_signals feed when inline options are omitted, and signal_targeting_rules define buy-time eligibility. Inclusion and exclusion are controlled by the parent group operator: use operator 'any' to include users matching the signal expression and operator 'none' to exclude users matching the signal expression. For binary signals, value MUST be true; do not use value=false for exclusion inside signal_targeting_groups. Use audience_include/audience_exclude only for buyer-managed first-party audiences registered through sync_audiences.")).min(1).describe("Signal targeting entries evaluated by this group. Each entry uses the package signal targeting shape, including signal_ref, value expression, and optional pricing, execution-handle, or activation fields.") }).catchall(import_zod.z.any()).describe("A basic Boolean group of package-level signal targeting entries. 'any' means the user must match at least one signal in the group. 'none' means the user must match none of the signals in the group. Use groups for portable include/exclude composition such as (A OR B) AND NOT (C OR D).")).min(1).describe("Signal targeting groups to evaluate. Use operator 'any' for include groups and 'none' for exclusion groups.") }).catchall(import_zod.z.any()).describe("Basic Boolean grouping for seller-offered signals. v1 supports a required top-level operator 'all' and child groups with operator 'any' for include groups or 'none' for exclusion groups. Example semantics: group 1 any(A, B) plus group 2 none(C, D) means (A OR B) AND NOT (C OR D). Signal entries reference named signal definitions with signal_ref scope 'product' for product-local signal options or scope 'data_provider' for external signals published in adagents.json signals[]. For simple include-only targeting, send one child group with operator 'any'. Sellers SHOULD reject entries that are not available for the product through inline signal_targeting_options or get_signals, are not active for the account, or exceed the product's signal_targeting_allowed/signal_targeting_rules/product terms. Signal targeting limits are product-scoped, not declared in get_adcp_capabilities, because products may be backed by different ad servers. Sellers MUST echo applied signal_targeting_groups on the resulting package state, including fixed/default selections. Sellers MAY return REQUOTE_REQUIRED when a targeting mutation changes commercial terms."), import_zod.z.null()]).optional(), "signal_targeting": import_zod.z.union([import_zod.z.array(import_zod.z.any().superRefine((x, ctx) => {
15131
+ const schemas = [import_zod.z.object({ "signal_ref": import_zod.z.any().superRefine((x2, ctx2) => {
15132
+ const schemas2 = [import_zod.z.object({ "scope": import_zod.z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": import_zod.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(import_zod.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."), import_zod.z.object({ "scope": import_zod.z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": import_zod.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": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(import_zod.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."), import_zod.z.object({ "scope": import_zod.z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": import_zod.z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(import_zod.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.")];
15133
+ const { errors: errors2, failed: failed2 } = schemas2.reduce(
15134
+ ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
15135
+ errors: [...errors3, ...result.error.issues],
15136
+ failed: failed3 + 1
15137
+ } : { errors: errors3, failed: failed3 })(
15138
+ schema.safeParse(x2)
15139
+ ),
15140
+ { errors: [], failed: 0 }
15141
+ );
15142
+ const passed2 = schemas2.length - failed2;
15143
+ if (passed2 !== 1) {
15144
+ ctx2.addIssue(errors2.length ? {
15145
+ path: [],
15146
+ code: "invalid_union",
15147
+ errors: [errors2],
15148
+ message: "Invalid input: Should pass single schema. Passed " + passed2
15149
+ } : {
15150
+ path: [],
15151
+ code: "custom",
15152
+ errors: [errors2],
15153
+ message: "Invalid input: Should pass single schema. Passed " + passed2
15154
+ });
15155
+ }
15156
+ }).describe("The signal to target. New targeting constraints SHOULD use signal_ref.").optional(), "signal_id": import_zod.z.any().superRefine((x2, ctx2) => {
15157
+ const schemas2 = [import_zod.z.object({ "source": import_zod.z.literal("catalog").describe("Discriminator indicating this signal is from a data provider's published adagents.json signals[]"), "data_provider_domain": import_zod.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 of the data provider that owns this signal (e.g., 'pinnacle-data.example'). The signal definition is published at this domain's /.well-known/adagents.json"), "id": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's catalog (e.g., 'likely_ev_buyers', 'income_100k_plus')") }).catchall(import_zod.z.any()).describe("Data-provider signal - references a signal from a data provider's published adagents.json signals[]. Buyers can verify authorization by checking the data provider's adagents.json."), import_zod.z.object({ "source": import_zod.z.literal("agent").describe("Discriminator indicating this signal is native to the signal source identified by agent_url, not from a data provider's published signal definitions."), "agent_url": import_zod.z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that provides this signal (e.g., 'https://signals.example/.well-known/adcp/signals')"), "id": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the agent's signal set (e.g., 'custom_auto_intenders')") }).catchall(import_zod.z.any()).describe("Agent signal - references a signal native to a signal source identified by agent_url. Not externally verifiable through an upstream catalog; buyer trusts the issuing signal source's claim about the signal.")];
15158
+ const { errors: errors2, failed: failed2 } = schemas2.reduce(
15159
+ ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
15160
+ errors: [...errors3, ...result.error.issues],
15161
+ failed: failed3 + 1
15162
+ } : { errors: errors3, failed: failed3 })(
15163
+ schema.safeParse(x2)
15164
+ ),
15165
+ { errors: [], failed: 0 }
15166
+ );
15167
+ const passed2 = schemas2.length - failed2;
15168
+ if (passed2 !== 1) {
15169
+ ctx2.addIssue(errors2.length ? {
15170
+ path: [],
15171
+ code: "invalid_union",
15172
+ errors: [errors2],
15173
+ message: "Invalid input: Should pass single schema. Passed " + passed2
15174
+ } : {
15175
+ path: [],
15176
+ code: "custom",
15177
+ errors: [errors2],
15178
+ message: "Invalid input: Should pass single schema. Passed " + passed2
15179
+ });
15180
+ }
15181
+ }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": import_zod.z.literal("binary").describe("Discriminator for binary signals"), "value": import_zod.z.boolean().describe("Whether to include (true) or exclude (false) users matching this signal") }).catchall(import_zod.z.any()).and(import_zod.z.union([import_zod.z.object({ "signal_ref": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough(), import_zod.z.object({ "signal_id": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Binary signal targeting - user either matches or doesn't"), import_zod.z.object({ "signal_ref": import_zod.z.any().superRefine((x2, ctx2) => {
15182
+ const schemas2 = [import_zod.z.object({ "scope": import_zod.z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": import_zod.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(import_zod.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."), import_zod.z.object({ "scope": import_zod.z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": import_zod.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": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(import_zod.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."), import_zod.z.object({ "scope": import_zod.z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": import_zod.z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(import_zod.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.")];
15183
+ const { errors: errors2, failed: failed2 } = schemas2.reduce(
15184
+ ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
15185
+ errors: [...errors3, ...result.error.issues],
15186
+ failed: failed3 + 1
15187
+ } : { errors: errors3, failed: failed3 })(
15188
+ schema.safeParse(x2)
15189
+ ),
15190
+ { errors: [], failed: 0 }
15191
+ );
15192
+ const passed2 = schemas2.length - failed2;
15193
+ if (passed2 !== 1) {
15194
+ ctx2.addIssue(errors2.length ? {
15195
+ path: [],
15196
+ code: "invalid_union",
15197
+ errors: [errors2],
15198
+ message: "Invalid input: Should pass single schema. Passed " + passed2
15199
+ } : {
15200
+ path: [],
15201
+ code: "custom",
15202
+ errors: [errors2],
15203
+ message: "Invalid input: Should pass single schema. Passed " + passed2
15204
+ });
15205
+ }
15206
+ }).describe("The signal to target. New targeting constraints SHOULD use signal_ref.").optional(), "signal_id": import_zod.z.any().superRefine((x2, ctx2) => {
15207
+ const schemas2 = [import_zod.z.object({ "source": import_zod.z.literal("catalog").describe("Discriminator indicating this signal is from a data provider's published adagents.json signals[]"), "data_provider_domain": import_zod.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 of the data provider that owns this signal (e.g., 'pinnacle-data.example'). The signal definition is published at this domain's /.well-known/adagents.json"), "id": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's catalog (e.g., 'likely_ev_buyers', 'income_100k_plus')") }).catchall(import_zod.z.any()).describe("Data-provider signal - references a signal from a data provider's published adagents.json signals[]. Buyers can verify authorization by checking the data provider's adagents.json."), import_zod.z.object({ "source": import_zod.z.literal("agent").describe("Discriminator indicating this signal is native to the signal source identified by agent_url, not from a data provider's published signal definitions."), "agent_url": import_zod.z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that provides this signal (e.g., 'https://signals.example/.well-known/adcp/signals')"), "id": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the agent's signal set (e.g., 'custom_auto_intenders')") }).catchall(import_zod.z.any()).describe("Agent signal - references a signal native to a signal source identified by agent_url. Not externally verifiable through an upstream catalog; buyer trusts the issuing signal source's claim about the signal.")];
15208
+ const { errors: errors2, failed: failed2 } = schemas2.reduce(
15209
+ ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
15210
+ errors: [...errors3, ...result.error.issues],
15211
+ failed: failed3 + 1
15212
+ } : { errors: errors3, failed: failed3 })(
15213
+ schema.safeParse(x2)
15214
+ ),
15215
+ { errors: [], failed: 0 }
15216
+ );
15217
+ const passed2 = schemas2.length - failed2;
15218
+ if (passed2 !== 1) {
15219
+ ctx2.addIssue(errors2.length ? {
15220
+ path: [],
15221
+ code: "invalid_union",
15222
+ errors: [errors2],
15223
+ message: "Invalid input: Should pass single schema. Passed " + passed2
15224
+ } : {
15225
+ path: [],
15226
+ code: "custom",
15227
+ errors: [errors2],
15228
+ message: "Invalid input: Should pass single schema. Passed " + passed2
15229
+ });
15230
+ }
15231
+ }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": import_zod.z.literal("categorical").describe("Discriminator for categorical signals"), "values": import_zod.z.array(import_zod.z.string()).min(1).describe("Values to target. Users with any of these values will be included.") }).catchall(import_zod.z.any()).and(import_zod.z.union([import_zod.z.object({ "signal_ref": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough(), import_zod.z.object({ "signal_id": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).describe("Categorical signal targeting - target users with specific values"), import_zod.z.object({ "signal_ref": import_zod.z.any().superRefine((x2, ctx2) => {
15232
+ const schemas2 = [import_zod.z.object({ "scope": import_zod.z.literal("product").describe("Discriminator indicating the signal resolves through the selected product's included_signals or signal_targeting_options."), "signal_id": import_zod.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(import_zod.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."), import_zod.z.object({ "scope": import_zod.z.literal("data_provider").describe("Discriminator indicating the signal resolves through a data provider's published adagents.json signals[]."), "data_provider_domain": import_zod.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": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's published adagents.json signals[].") }).catchall(import_zod.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."), import_zod.z.object({ "scope": import_zod.z.literal("signal_source").describe("Discriminator indicating the signal resolves through the issuing signal source."), "signal_source_url": import_zod.z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that issues this source-native signal."), "signal_id": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the issuing signal source's signal set.") }).catchall(import_zod.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.")];
15233
+ const { errors: errors2, failed: failed2 } = schemas2.reduce(
15234
+ ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
15235
+ errors: [...errors3, ...result.error.issues],
15236
+ failed: failed3 + 1
15237
+ } : { errors: errors3, failed: failed3 })(
15238
+ schema.safeParse(x2)
15239
+ ),
15240
+ { errors: [], failed: 0 }
15241
+ );
15242
+ const passed2 = schemas2.length - failed2;
15243
+ if (passed2 !== 1) {
15244
+ ctx2.addIssue(errors2.length ? {
15245
+ path: [],
15246
+ code: "invalid_union",
15247
+ errors: [errors2],
15248
+ message: "Invalid input: Should pass single schema. Passed " + passed2
15249
+ } : {
15250
+ path: [],
15251
+ code: "custom",
15252
+ errors: [errors2],
15253
+ message: "Invalid input: Should pass single schema. Passed " + passed2
15254
+ });
15255
+ }
15256
+ }).describe("The signal to target. New targeting constraints SHOULD use signal_ref.").optional(), "signal_id": import_zod.z.any().superRefine((x2, ctx2) => {
15257
+ const schemas2 = [import_zod.z.object({ "source": import_zod.z.literal("catalog").describe("Discriminator indicating this signal is from a data provider's published adagents.json signals[]"), "data_provider_domain": import_zod.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 of the data provider that owns this signal (e.g., 'pinnacle-data.example'). The signal definition is published at this domain's /.well-known/adagents.json"), "id": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the data provider's catalog (e.g., 'likely_ev_buyers', 'income_100k_plus')") }).catchall(import_zod.z.any()).describe("Data-provider signal - references a signal from a data provider's published adagents.json signals[]. Buyers can verify authorization by checking the data provider's adagents.json."), import_zod.z.object({ "source": import_zod.z.literal("agent").describe("Discriminator indicating this signal is native to the signal source identified by agent_url, not from a data provider's published signal definitions."), "agent_url": import_zod.z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the signal source that provides this signal (e.g., 'https://signals.example/.well-known/adcp/signals')"), "id": import_zod.z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).describe("Signal identifier within the agent's signal set (e.g., 'custom_auto_intenders')") }).catchall(import_zod.z.any()).describe("Agent signal - references a signal native to a signal source identified by agent_url. Not externally verifiable through an upstream catalog; buyer trusts the issuing signal source's claim about the signal.")];
15258
+ const { errors: errors2, failed: failed2 } = schemas2.reduce(
15259
+ ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
15260
+ errors: [...errors3, ...result.error.issues],
15261
+ failed: failed3 + 1
15262
+ } : { errors: errors3, failed: failed3 })(
15263
+ schema.safeParse(x2)
15264
+ ),
15265
+ { errors: [], failed: 0 }
15266
+ );
15267
+ const passed2 = schemas2.length - failed2;
15268
+ if (passed2 !== 1) {
15269
+ ctx2.addIssue(errors2.length ? {
15270
+ path: [],
15271
+ code: "invalid_union",
15272
+ errors: [errors2],
15273
+ message: "Invalid input: Should pass single schema. Passed " + passed2
15274
+ } : {
15275
+ path: [],
15276
+ code: "custom",
15277
+ errors: [errors2],
15278
+ message: "Invalid input: Should pass single schema. Passed " + passed2
15279
+ });
15280
+ }
15281
+ }).describe("DEPRECATED. Use signal_ref instead. Legacy SignalId retained for compatibility with older clients.").optional(), "value_type": import_zod.z.literal("numeric").describe("Discriminator for numeric signals"), "min_value": import_zod.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": import_zod.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(import_zod.z.any()).and(import_zod.z.union([import_zod.z.object({ "signal_ref": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough(), import_zod.z.object({ "signal_id": import_zod.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).")];
15282
+ const { errors, failed } = schemas.reduce(
15283
+ ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
15284
+ errors: [...errors2, ...result.error.issues],
15285
+ failed: failed2 + 1
15286
+ } : { errors: errors2, failed: failed2 })(
15287
+ schema.safeParse(x)
15288
+ ),
15289
+ { errors: [], failed: 0 }
15290
+ );
15291
+ const passed = schemas.length - failed;
15292
+ if (passed !== 1) {
15293
+ ctx.addIssue(errors.length ? {
15294
+ path: [],
15295
+ code: "invalid_union",
15296
+ errors: [errors],
15297
+ message: "Invalid input: Should pass single schema. Passed " + passed
15298
+ } : {
15299
+ path: [],
15300
+ code: "custom",
15301
+ errors: [errors],
15302
+ message: "Invalid input: Should pass single schema. Passed " + passed
15303
+ });
15304
+ }
15305
+ }).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."), import_zod.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": import_zod.z.union([import_zod.z.object({ "age": import_zod.z.intersection(import_zod.z.object({ "min": import_zod.z.number().int().gte(0).lte(150).describe("Inclusive minimum age in completed years. Omit for an open lower bound.").optional(), "max": import_zod.z.number().int().gte(0).lte(150).describe("Inclusive maximum age in completed years. Omit for an open upper bound.").optional(), "include_unknown": import_zod.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(import_zod.z.any()).and(import_zod.z.union([import_zod.z.object({ "min": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough(), import_zod.z.object({ "max": import_zod.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."), import_zod.z.object({ "accepted_bases": import_zod.z.array(import_zod.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": import_zod.z.array(import_zod.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(import_zod.z.any()).and(import_zod.z.union([import_zod.z.any().refine((value) => !import_zod.z.object({ "accepted_verification_methods": import_zod.z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), import_zod.z.intersection(import_zod.z.object({ "accepted_verification_methods": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough(), import_zod.z.object({ "accepted_bases": import_zod.z.any().refine((value) => !import_zod.z.array(import_zod.z.any().refine((value2) => !import_zod.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(import_zod.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."), import_zod.z.null()]).optional(), "frequency_cap": import_zod.z.union([import_zod.z.object({ "suppress": import_zod.z.object({ "interval": import_zod.z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": import_zod.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": import_zod.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": import_zod.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": import_zod.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": import_zod.z.object({ "interval": import_zod.z.number().int().gte(1).describe("Number of time units. Must be 1 when unit is 'campaign'."), "unit": import_zod.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(import_zod.z.any()).and(import_zod.z.union([import_zod.z.object({ "suppress": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough(), import_zod.z.object({ "suppress_minutes": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough(), import_zod.z.object({ "max_impressions": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough()])).and(import_zod.z.intersection(import_zod.z.union([import_zod.z.any().refine((value) => !import_zod.z.object({ "max_impressions": import_zod.z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), import_zod.z.object({ "max_impressions": import_zod.z.any().refine((value) => value !== void 0, "Required"), "per": import_zod.z.any().refine((value) => value !== void 0, "Required"), "window": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), import_zod.z.intersection(import_zod.z.union([import_zod.z.any().refine((value) => !import_zod.z.object({ "per": import_zod.z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), import_zod.z.object({ "per": import_zod.z.any().refine((value) => value !== void 0, "Required"), "max_impressions": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough()]), import_zod.z.union([import_zod.z.any().refine((value) => !import_zod.z.object({ "window": import_zod.z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough().safeParse(value).success, "Invalid input: Should NOT be valid against schema"), import_zod.z.object({ "window": import_zod.z.any().refine((value) => value !== void 0, "Required"), "max_impressions": import_zod.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."), import_zod.z.null()]).optional(), "property_list": import_zod.z.union([import_zod.z.object({ "agent_url": import_zod.z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": import_zod.z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": import_zod.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."), import_zod.z.null()]).optional(), "property_list_exclude": import_zod.z.union([import_zod.z.object({ "agent_url": import_zod.z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the property list"), "list_id": import_zod.z.string().min(1).describe("Identifier for the property list within the agent"), "auth_token": import_zod.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."), import_zod.z.null()]).optional(), "collection_list": import_zod.z.union([import_zod.z.object({ "agent_url": import_zod.z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": import_zod.z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": import_zod.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."), import_zod.z.null()]).optional(), "collection_list_exclude": import_zod.z.union([import_zod.z.object({ "agent_url": import_zod.z.string().refine(adcpJsonSchemaUri, "Invalid URI").describe("URL of the agent managing the collection list"), "list_id": import_zod.z.string().min(1).describe("Identifier for the collection list within the agent"), "auth_token": import_zod.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."), import_zod.z.null()]).optional(), "placement_selection": import_zod.z.union([import_zod.z.record(import_zod.z.string(), import_zod.z.any()).and(import_zod.z.any().superRefine((x, ctx) => {
15306
+ const schemas = [import_zod.z.object({ "mode": import_zod.z.literal("selected"), "placement_refs": import_zod.z.array(import_zod.z.union([import_zod.z.intersection(import_zod.z.object({ "publisher_domain": import_zod.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": import_zod.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(import_zod.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."), import_zod.z.object({ "publisher_domain": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough()), import_zod.z.any().superRefine((x2, ctx2) => {
15307
+ const schemas2 = [import_zod.z.object({ "kind": import_zod.z.literal("publisher_ref"), "publisher_domain": import_zod.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": import_zod.z.string().min(1) }).strict(), import_zod.z.object({ "kind": import_zod.z.literal("seller_inline"), "seller_agent": import_zod.z.object({ "agent_url": import_zod.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": import_zod.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": import_zod.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()];
15308
+ const { errors: errors2, failed: failed2 } = schemas2.reduce(
15309
+ ({ errors: errors3, failed: failed3 }, schema) => ((result) => result.error ? {
15310
+ errors: [...errors3, ...result.error.issues],
15311
+ failed: failed3 + 1
15312
+ } : { errors: errors3, failed: failed3 })(
15313
+ schema.safeParse(x2)
15314
+ ),
15315
+ { errors: [], failed: 0 }
15316
+ );
15317
+ const passed2 = schemas2.length - failed2;
15318
+ if (passed2 !== 1) {
15319
+ ctx2.addIssue(errors2.length ? {
15320
+ path: [],
15321
+ code: "invalid_union",
15322
+ errors: [errors2],
15323
+ message: "Invalid input: Should pass single schema. Passed " + passed2
15324
+ } : {
15325
+ path: [],
15326
+ code: "custom",
15327
+ errors: [errors2],
15328
+ message: "Invalid input: Should pass single schema. Passed " + passed2
15329
+ });
15330
+ }
15331
+ }).describe("Self-contained identity for either a publisher-catalog placement or a sales-agent-defined inline placement. The discriminator names which authority owns placement_id.")])).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Complete required placement set. A reference normally identifies a mode targetable placement. It MAY identify a mode included placement only when the set exactly equals the product's complete fixed included set, which is an inherent match rather than independent selection. Legacy publisher refs use {publisher_domain, placement_id}; authority-discriminated 3.2 identities use placement-identity.json so seller-inline inventory is selected by {seller_agent, placement_id}. An item that exactly matches placement-identity uses that canonical identity; otherwise a released-compatible item with publisher_domain and placement_id uses legacy product-context matching, and tolerated product metadata such as kind, name, or mode has no selection effect."), "ext": import_zod.z.record(import_zod.z.string(), import_zod.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(), import_zod.z.object({ "mode": import_zod.z.literal("default"), "ext": import_zod.z.record(import_zod.z.string(), import_zod.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()];
15332
+ const { errors, failed } = schemas.reduce(
15333
+ ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
15334
+ errors: [...errors2, ...result.error.issues],
15335
+ failed: failed2 + 1
15336
+ } : { errors: errors2, failed: failed2 })(
15337
+ schema.safeParse(x)
15338
+ ),
15339
+ { errors: [], failed: 0 }
15340
+ );
15341
+ const passed = schemas.length - failed;
15342
+ if (passed !== 1) {
15343
+ ctx.addIssue(errors.length ? {
15344
+ path: [],
15345
+ code: "invalid_union",
15346
+ errors: [errors],
15347
+ message: "Invalid input: Should pass single schema. Passed " + passed
15348
+ } : {
15349
+ path: [],
15350
+ code: "custom",
15351
+ errors: [errors],
15352
+ message: "Invalid input: Should pass single schema. Passed " + passed
15353
+ });
15354
+ }
15355
+ })).describe("Purchased placement selection within the product. This constrains package inventory; it is distinct from creative_assignments[].placement_refs, which only route individual creatives within the purchased set. On create, mode selected supplies the complete selected set and mode default uses the product default. In request-side Targeting Input, a non-null value replaces this dimension, omission preserves or inherits it, and null clears it when the product permits that broader inventory set."), import_zod.z.null()]).optional(), "collection_selection": import_zod.z.union([import_zod.z.record(import_zod.z.string(), import_zod.z.any()).and(import_zod.z.any().superRefine((x, ctx) => {
15356
+ const schemas = [import_zod.z.object({ "mode": import_zod.z.literal("selected"), "collections": import_zod.z.array(import_zod.z.intersection(import_zod.z.object({ "publisher_domain": import_zod.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 these collections is hosted (e.g., 'mrbeast.com'). The collections array in that file contains the authoritative collection definitions."), "collection_ids": import_zod.z.array(import_zod.z.string()).min(1).describe("Collection IDs from the adagents.json collections array. Each ID must match a collection_id declared in that file. Omit to reference all collections declared in that file.").optional() }).catchall(import_zod.z.any()).describe("References collections declared in an adagents.json. Buyers resolve full collection objects by fetching the adagents.json at the given domain and matching collection_ids against its collections array. When collection_ids is omitted, the selector references every collection declared in that adagents.json \u2014 the bulk-grant form for authorization scoping (e.g., a host authorizing a channel owner's sales agent for all of the owner's collections without tracking owner-assigned IDs)."), import_zod.z.object({ "collection_ids": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough())).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Complete required collection set as domain-qualified selectors with explicit collection_ids; the domain-only bulk-grant form is authorization scoping, not selection. publisher_domain may be an external channel owner's domain."), "ext": import_zod.z.record(import_zod.z.string(), import_zod.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(), import_zod.z.object({ "mode": import_zod.z.literal("default"), "ext": import_zod.z.record(import_zod.z.string(), import_zod.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()];
15357
+ const { errors, failed } = schemas.reduce(
15358
+ ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
15359
+ errors: [...errors2, ...result.error.issues],
15360
+ failed: failed2 + 1
15361
+ } : { errors: errors2, failed: failed2 })(
15362
+ schema.safeParse(x)
15363
+ ),
15364
+ { errors: [], failed: 0 }
15365
+ );
15366
+ const passed = schemas.length - failed;
15367
+ if (passed !== 1) {
15368
+ ctx.addIssue(errors.length ? {
15369
+ path: [],
15370
+ code: "invalid_union",
15371
+ errors: [errors],
15372
+ message: "Invalid input: Should pass single schema. Passed " + passed
15373
+ } : {
15374
+ path: [],
15375
+ code: "custom",
15376
+ errors: [errors],
15377
+ message: "Invalid input: Should pass single schema. Passed " + passed
15378
+ });
15379
+ }
15380
+ })).describe("Purchased collection selection within the product. On create, mode selected supplies the complete selected set and mode default uses the product's full bundle. On package readback this is the committed selection sellers MUST echo as concrete selectors, materializing any collection_list composition; collection_list fields remain the buyer-managed list mechanism. In request-side Targeting Input, a non-null value replaces this dimension, omission preserves or inherits it, and null clears it when the product permits that broader inventory set."), import_zod.z.null()]).optional(), "age_restriction": import_zod.z.union([import_zod.z.object({ "min": import_zod.z.number().int().gte(13).lte(99).describe("Minimum age required"), "verification_required": import_zod.z.boolean().describe("Whether verified age (not inferred) is required for compliance").default(false), "accepted_methods": import_zod.z.array(import_zod.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).describe("Accepted verification methods. If omitted, any method the platform supports is acceptable.").optional() }).strict().describe("Age restriction for compliance. Use for legal requirements (alcohol, gambling), not audience targeting."), import_zod.z.null()]).optional(), "device_platform": import_zod.z.union([import_zod.z.array(import_zod.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.")).min(1).describe("Restrict to specific platforms. Use for technical compatibility (app only works on iOS). Values from Sec-CH-UA-Platform standard, extended for CTV."), import_zod.z.null()]).optional(), "device_platform_exclude": import_zod.z.union([import_zod.z.array(import_zod.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.")).min(1).describe("Exclude specific operating-system platforms from delivery. When a platform appears in both device_platform and device_platform_exclude, exclusion wins. Sellers MUST reject a request they cannot enforce rather than silently dropping the exclusion."), import_zod.z.null()]).optional(), "device_type": import_zod.z.union([import_zod.z.array(import_zod.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.")).min(1).describe("Restrict to specific device form factors. Use for campaigns targeting hardware categories rather than operating systems (e.g., mobile-only promotions, CTV campaigns)."), import_zod.z.null()]).optional(), "device_type_exclude": import_zod.z.union([import_zod.z.array(import_zod.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.")).min(1).describe("Exclude specific device form factors from delivery (e.g., exclude CTV for app-install campaigns)."), import_zod.z.null()]).optional(), "browser": import_zod.z.union([import_zod.z.array(import_zod.z.enum(["chrome", "safari", "firefox", "edge", "opera", "samsung_internet", "android_webview", "other", "unknown"]).describe("Portable browser families for targeting the impression delivery and rendering environment, not a post-click landing-page browser. Values identify browser families, not versions or seller-native browser IDs, and MUST NOT be inferred solely from operating system, device, web/mobile-web inventory, or placement. android_webview means an impression reliably classified as rendering in Android WebView. other means a seller-recognized browser family that is not explicitly enumerated; unknown means the seller cannot classify the browser into a recognized family.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Restrict delivery to specific canonical browser families in the impression delivery and rendering environment, not the post-click landing-page browser. Values MUST NOT be inferred solely from operating system, device, web/mobile-web inventory, or placement. Values in this array use OR semantics. When browser is supplied, families not listed are ineligible: other includes a seller-recognized family that is not explicitly enumerated, while unknown includes a browser the seller cannot classify into a recognized family. When the same family appears in browser and browser_exclude, exclusion wins. Browser and device constraints intersect; a seller that cannot enforce the exact combination MUST exclude or explicitly reconfigure the product during discovery and MUST reject it at create or update rather than silently widening delivery. Browser versions and seller-native IDs are intentionally unsupported."), import_zod.z.null()]).optional(), "browser_exclude": import_zod.z.union([import_zod.z.array(import_zod.z.enum(["chrome", "safari", "firefox", "edge", "opera", "samsung_internet", "android_webview", "other", "unknown"]).describe("Portable browser families for targeting the impression delivery and rendering environment, not a post-click landing-page browser. Values identify browser families, not versions or seller-native browser IDs, and MUST NOT be inferred solely from operating system, device, web/mobile-web inventory, or placement. android_webview means an impression reliably classified as rendering in Android WebView. other means a seller-recognized browser family that is not explicitly enumerated; unknown means the seller cannot classify the browser into a recognized family.")).min(1).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), "All items must be unique!").describe("Exclude specific canonical browser families from delivery. other excludes seller-recognized families that are not explicitly enumerated; unknown excludes browsers the seller cannot classify into a recognized family. When the same family appears in browser and browser_exclude, exclusion wins. Sellers MUST reject a request they cannot enforce rather than silently dropping the exclusion."), import_zod.z.null()]).optional(), "store_catchments": import_zod.z.union([import_zod.z.array(import_zod.z.object({ "catalog_id": import_zod.z.string().describe("Synced store-type catalog ID from sync_catalogs."), "store_ids": import_zod.z.array(import_zod.z.string()).min(1).describe("Filter to specific stores within the catalog. Omit to target all stores.").optional(), "catchment_ids": import_zod.z.array(import_zod.z.string()).min(1).describe("Catchment zone IDs to target (e.g., 'walk', 'drive'). Omit to target all catchment zones.").optional() }).catchall(import_zod.z.any())).min(1).describe("Target users within store catchment areas from a synced store catalog. Each entry references a store-type catalog and optionally narrows to specific stores or catchment zones."), import_zod.z.null()]).optional(), "geo_proximity": import_zod.z.union([import_zod.z.array(import_zod.z.object({ "lat": import_zod.z.number().gte(-90).lte(90).describe("Latitude in decimal degrees (WGS 84). Required for travel_time and radius methods.").optional(), "lng": import_zod.z.number().gte(-180).lte(180).describe("Longitude in decimal degrees (WGS 84). Required for travel_time and radius methods.").optional(), "label": import_zod.z.string().describe("Human-readable label for this entry (e.g., 'D\xFCsseldorf', 'Heathrow Airport', 'Primary trade area').").optional(), "travel_time": import_zod.z.object({ "value": import_zod.z.number().gte(1).describe("Travel time limit."), "unit": import_zod.z.enum(["min", "hr"]).describe("Time unit for isochrone (travel-time catchment) calculations.") }).strict().describe("Travel time limit for isochrone calculation. The platform resolves this to a geographic boundary based on actual transportation networks.").optional(), "transport_mode": import_zod.z.enum(["walking", "cycling", "driving", "public_transport"]).describe("Transportation mode for isochrone calculation. Required when travel_time is provided.").optional(), "radius": import_zod.z.object({ "value": import_zod.z.number().gt(0).describe("Radius distance."), "unit": import_zod.z.enum(["km", "mi", "m"]).describe("Distance unit.") }).strict().describe("Simple radius from the point. The platform draws a circle of this distance around the coordinates.").optional(), "geometry": import_zod.z.object({ "type": import_zod.z.enum(["Polygon", "MultiPolygon"]).describe("GeoJSON geometry type."), "coordinates": import_zod.z.array(import_zod.z.any()).describe("GeoJSON coordinates array. For Polygon: array of linear rings. For MultiPolygon: array of polygons.") }).strict().describe("Pre-computed GeoJSON geometry defining the proximity boundary. Use when the buyer has already calculated isochrones (via TravelTime, Mapbox, etc.) or has custom boundaries. When geometry is provided, lat/lng are not required.").optional(), "ext": import_zod.z.record(import_zod.z.string(), import_zod.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(import_zod.z.any()).and(import_zod.z.any().superRefine((x, ctx) => {
15381
+ const schemas = [import_zod.z.object({ "lat": import_zod.z.any().refine((value) => value !== void 0, "Required"), "lng": import_zod.z.any().refine((value) => value !== void 0, "Required"), "travel_time": import_zod.z.any().refine((value) => value !== void 0, "Required"), "transport_mode": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough(), import_zod.z.object({ "lat": import_zod.z.any().refine((value) => value !== void 0, "Required"), "lng": import_zod.z.any().refine((value) => value !== void 0, "Required"), "radius": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough(), import_zod.z.object({ "geometry": import_zod.z.any().refine((value) => value !== void 0, "Required") }).passthrough()];
15382
+ const { errors, failed } = schemas.reduce(
15383
+ ({ errors: errors2, failed: failed2 }, schema) => ((result) => result.error ? {
15384
+ errors: [...errors2, ...result.error.issues],
15385
+ failed: failed2 + 1
15386
+ } : { errors: errors2, failed: failed2 })(
15387
+ schema.safeParse(x)
15388
+ ),
15389
+ { errors: [], failed: 0 }
15390
+ );
15391
+ const passed = schemas.length - failed;
15392
+ if (passed !== 1) {
15393
+ ctx.addIssue(errors.length ? {
15394
+ path: [],
15395
+ code: "invalid_union",
15396
+ errors: [errors],
15397
+ message: "Invalid input: Should pass single schema. Passed " + passed
15398
+ } : {
15399
+ path: [],
15400
+ code: "custom",
15401
+ errors: [errors],
15402
+ message: "Invalid input: Should pass single schema. Passed " + passed
15403
+ });
15404
+ }
15405
+ }))).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."), import_zod.z.null()]).optional(), "language": import_zod.z.union([import_zod.z.array(import_zod.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."), import_zod.z.null().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.")]).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": import_zod.z.union([import_zod.z.array(import_zod.z.object({ "keyword": import_zod.z.string().min(1).describe("The keyword to target"), "match_type": import_zod.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": import_zod.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() }).strict()).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."), import_zod.z.null().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.")]).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": import_zod.z.union([import_zod.z.array(import_zod.z.object({ "keyword": import_zod.z.string().min(1).describe("The keyword to exclude"), "match_type": import_zod.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.") }).strict().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."), import_zod.z.null().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.")]).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(import_zod.z.any()).describe("Request-only targeting mutation input. Each known dimension has three states: omission inherits the product default on create or leaves the stored dimension unchanged on update; null explicitly suppresses the product default on create or clears the stored dimension on update; and a non-null value replaces that dimension and MUST satisfy the corresponding strict targeting.json constraint. Null is a command and MUST NOT appear in discovery criteria, accepted commercial terms, package responses, or package readback. Sellers apply all supplied dimensions atomically and return only the resulting non-null effective targeting state.");
15406
+ const exactSchema = objectSchema.superRefine((value, ctx) => {
15407
+ const checked = import_zod.z.intersection(import_zod.z.union([import_zod.z.any().refine((value2) => !import_zod.z.object({ "demographics": import_zod.z.any().refine((value3) => value3 !== void 0, "Required"), "age_restriction": import_zod.z.any().refine((value3) => value3 !== void 0, "Required") }).passthrough().safeParse(value2).success, "Invalid input: Should NOT be valid against schema"), import_zod.z.intersection(import_zod.z.object({ "demographics": import_zod.z.any().refine((value2) => value2 !== void 0, "Required"), "age_restriction": import_zod.z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough(), import_zod.z.object({ "demographics": import_zod.z.object({ "age": import_zod.z.object({ "include_unknown": import_zod.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."), import_zod.z.union([import_zod.z.any().refine((value2) => !import_zod.z.object({ "age_restriction": import_zod.z.object({ "verification_required": import_zod.z.literal(true) }), "demographics": import_zod.z.object({ "age": import_zod.z.object({ "accepted_bases": import_zod.z.any().refine((value3) => value3 !== void 0, "Required") }).passthrough() }) }).safeParse(value2).success, "Invalid input: Should NOT be valid against schema"), import_zod.z.intersection(import_zod.z.object({ "age_restriction": import_zod.z.object({ "verification_required": import_zod.z.literal(true) }), "demographics": import_zod.z.object({ "age": import_zod.z.object({ "accepted_bases": import_zod.z.any().refine((value2) => value2 !== void 0, "Required") }).passthrough() }) }), import_zod.z.object({ "demographics": import_zod.z.object({ "age": import_zod.z.object({ "accepted_bases": import_zod.z.any().refine((value2) => !import_zod.z.array(import_zod.z.any().refine((value3) => !import_zod.z.literal("verified").safeParse(value3).success, "Invalid input: Should NOT be valid against schema")).safeParse(value2).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.")).safeParse(value);
15408
+ if (!checked.success) {
15409
+ for (const issue of checked.error.issues) {
15410
+ ctx.addIssue({ code: "custom", path: issue.path, message: issue.message });
15411
+ }
15412
+ }
15413
+ });
15414
+ return Object.assign(exactSchema, {
15415
+ pick: objectSchema.pick.bind(objectSchema),
15416
+ omit: objectSchema.omit.bind(objectSchema),
15417
+ extend: objectSchema.extend.bind(objectSchema)
15418
+ });
15419
+ })();
14661
15420
  const ProductDiscoveryCriteriaSchema = import_zod.z.object({
14662
15421
  product_ids: import_zod.z.array(import_zod.z.string()).optional(),
14663
15422
  offer_filters: ProductOfferFiltersSchema.optional(),
@@ -21053,12 +21812,18 @@ const ListCreativesResponseSchema = import_zod.z.object({
21053
21812
  TargetLocalizationReadbackSchema,
21054
21813
  TargetingCollectionListSchema,
21055
21814
  TargetingCollectionSelectionSchema,
21815
+ TargetingDevicePlatformsInputSchema,
21816
+ TargetingDeviceTypesInputSchema,
21056
21817
  TargetingFrequencyCapSchema,
21818
+ TargetingGeoMetrosInputSchema,
21057
21819
  TargetingGeoMetrosSchema,
21820
+ TargetingKeywordsInputSchema,
21058
21821
  TargetingKeywordsSchema,
21059
21822
  TargetingKvsSchema,
21823
+ TargetingLanguagesInputSchema,
21060
21824
  TargetingLanguagesSchema,
21061
21825
  TargetingModificationSchema,
21826
+ TargetingNegativeKeywordsInputSchema,
21062
21827
  TargetingNegativeKeywordsSchema,
21063
21828
  TargetingOverlayInputSchema,
21064
21829
  TargetingOverlayRequirementsSchema,