@adcp/client 0.4.2 → 2.0.2

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 (35) hide show
  1. package/dist/lib/core/ADCPClient.d.ts +34 -1
  2. package/dist/lib/core/ADCPClient.d.ts.map +1 -1
  3. package/dist/lib/core/ADCPClient.js +46 -0
  4. package/dist/lib/core/ADCPClient.js.map +1 -1
  5. package/dist/lib/core/ADCPMultiAgentClient.d.ts +78 -0
  6. package/dist/lib/core/ADCPMultiAgentClient.d.ts.map +1 -1
  7. package/dist/lib/core/ADCPMultiAgentClient.js +99 -0
  8. package/dist/lib/core/ADCPMultiAgentClient.js.map +1 -1
  9. package/dist/lib/core/CreativeAgentClient.d.ts +148 -0
  10. package/dist/lib/core/CreativeAgentClient.d.ts.map +1 -0
  11. package/dist/lib/core/CreativeAgentClient.js +162 -0
  12. package/dist/lib/core/CreativeAgentClient.js.map +1 -0
  13. package/dist/lib/core/TaskExecutor.d.ts.map +1 -1
  14. package/dist/lib/core/TaskExecutor.js +2 -1
  15. package/dist/lib/core/TaskExecutor.js.map +1 -1
  16. package/dist/lib/index.d.ts +2 -1
  17. package/dist/lib/index.d.ts.map +1 -1
  18. package/dist/lib/index.js +5 -1
  19. package/dist/lib/index.js.map +1 -1
  20. package/dist/lib/types/adcp.d.ts +4 -3
  21. package/dist/lib/types/adcp.d.ts.map +1 -1
  22. package/dist/lib/types/core.generated.d.ts +700 -136
  23. package/dist/lib/types/core.generated.d.ts.map +1 -1
  24. package/dist/lib/types/core.generated.js +2 -2
  25. package/dist/lib/types/index.d.ts +1 -0
  26. package/dist/lib/types/index.d.ts.map +1 -1
  27. package/dist/lib/types/tools.generated.d.ts +1629 -525
  28. package/dist/lib/types/tools.generated.d.ts.map +1 -1
  29. package/dist/lib/types/tools.generated.js.map +1 -1
  30. package/dist/lib/utils/index.d.ts.map +1 -1
  31. package/dist/lib/utils/index.js +16 -4
  32. package/dist/lib/utils/index.js.map +1 -1
  33. package/dist/lib/version.d.ts +5 -5
  34. package/dist/lib/version.js +5 -5
  35. package/package.json +6 -2
@@ -65,15 +65,23 @@ export interface Package {
65
65
  */
66
66
  product_id?: string;
67
67
  /**
68
- * Array of product IDs to include in this package
68
+ * Budget allocation for this package in the currency specified by the pricing option
69
69
  */
70
- products?: string[];
71
- budget?: Budget;
70
+ budget?: number;
71
+ pacing?: Pacing;
72
+ /**
73
+ * ID of the selected pricing option from the product's pricing_options array
74
+ */
75
+ pricing_option_id?: string;
76
+ /**
77
+ * Bid price for auction-based CPM pricing (present if using cpm-auction-option)
78
+ */
79
+ bid_price?: number;
72
80
  /**
73
81
  * Impression goal for this package
74
82
  */
75
83
  impressions?: number;
76
- targeting_overlay?: Targeting;
84
+ targeting_overlay?: TargetingOverlay;
77
85
  /**
78
86
  * Creative assets assigned to this package
79
87
  */
@@ -81,71 +89,29 @@ export interface Package {
81
89
  /**
82
90
  * Format IDs that creative assets will be provided for this package
83
91
  */
84
- formats_to_provide?: string[];
92
+ format_ids_to_provide?: FormatID[];
85
93
  status: PackageStatus;
86
94
  }
87
95
  /**
88
- * Budget configuration for a media buy or package
96
+ * Optional geographic refinements for media buys. Most targeting should be expressed in the brief and handled by the publisher. These fields are primarily for geographic restrictions (RCT testing, regulatory compliance).
89
97
  */
90
- export interface Budget {
98
+ export interface TargetingOverlay {
91
99
  /**
92
- * Total budget amount
93
- */
94
- total: number;
95
- /**
96
- * ISO 4217 currency code
97
- */
98
- currency: string;
99
- pacing?: Pacing;
100
- }
101
- /**
102
- * Audience targeting criteria
103
- */
104
- export interface Targeting {
105
- /**
106
- * Target specific countries (ISO codes)
100
+ * Restrict delivery to specific countries (ISO codes). Use for regulatory compliance or RCT testing.
107
101
  */
108
102
  geo_country_any_of?: string[];
109
103
  /**
110
- * Target specific regions/states
104
+ * Restrict delivery to specific regions/states. Use for regulatory compliance or RCT testing.
111
105
  */
112
106
  geo_region_any_of?: string[];
113
107
  /**
114
- * Target specific metro areas (DMA codes)
108
+ * Restrict delivery to specific metro areas (DMA codes). Use for regulatory compliance or RCT testing.
115
109
  */
116
110
  geo_metro_any_of?: string[];
117
111
  /**
118
- * Target specific postal/ZIP codes
112
+ * Restrict delivery to specific postal/ZIP codes. Use for regulatory compliance or RCT testing.
119
113
  */
120
114
  geo_postal_code_any_of?: string[];
121
- /**
122
- * Audience segment IDs to target
123
- */
124
- audience_segment_any_of?: string[];
125
- /**
126
- * AXE segment ID to include for targeting
127
- */
128
- axe_include_segment?: string;
129
- /**
130
- * AXE segment ID to exclude from targeting
131
- */
132
- axe_exclude_segment?: string;
133
- /**
134
- * Signal IDs from get_signals
135
- */
136
- signals?: string[];
137
- /**
138
- * Target specific device types
139
- */
140
- device_type_any_of?: ('desktop' | 'mobile' | 'tablet' | 'connected_tv' | 'smart_speaker')[];
141
- /**
142
- * Target specific operating systems
143
- */
144
- os_any_of?: ('windows' | 'macos' | 'ios' | 'android' | 'linux' | 'roku' | 'tvos' | 'other')[];
145
- /**
146
- * Target specific browsers
147
- */
148
- browser_any_of?: ('chrome' | 'firefox' | 'safari' | 'edge' | 'other')[];
149
115
  frequency_cap?: FrequencyCap;
150
116
  }
151
117
  /**
@@ -171,26 +137,36 @@ export interface CreativeAssignment {
171
137
  weight?: number;
172
138
  }
173
139
  /**
174
- * Creative asset for upload to library - supports both hosted assets and third-party snippets
175
- */
176
- export type CreativeAsset = CreativeAsset1 & CreativeAsset2;
177
- /**
178
- * Type of snippet content
140
+ * Structured format identifier with agent URL and format name
179
141
  */
180
- export type SnippetType = 'vast_xml' | 'vast_url' | 'html' | 'javascript' | 'iframe' | 'daast_url';
142
+ export interface FormatID {
143
+ /**
144
+ * URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)
145
+ */
146
+ agent_url: string;
147
+ /**
148
+ * Format identifier within the agent's namespace (e.g., 'display_300x250', 'video_standard_30s')
149
+ */
150
+ id: string;
151
+ }
181
152
  /**
182
- * Sub-asset for multi-asset creative formats, including carousel images and native ad template variables
153
+ * VAST (Video Ad Serving Template) tag for third-party video ad serving
183
154
  */
184
- export type SubAsset = SubAsset1 & SubAsset2;
185
- export type SubAsset2 = {
186
- [k: string]: unknown;
187
- } | {
155
+ export type VASTAsset = VASTAsset1 & VASTAsset2;
156
+ export type VASTAsset2 = {
188
157
  [k: string]: unknown;
189
158
  };
190
- export type CreativeAsset2 = {
159
+ /**
160
+ * DAAST (Digital Audio Ad Serving Template) tag for third-party audio ad serving
161
+ */
162
+ export type DAASTAsset = DAASTAsset1 & DAASTAsset2;
163
+ export type DAASTAsset2 = {
191
164
  [k: string]: unknown;
192
165
  };
193
- export interface CreativeAsset1 {
166
+ /**
167
+ * Creative asset for upload to library - supports static assets, generative formats, and third-party snippets
168
+ */
169
+ export interface CreativeAsset {
194
170
  /**
195
171
  * Unique identifier for the creative
196
172
  */
@@ -199,61 +175,293 @@ export interface CreativeAsset1 {
199
175
  * Human-readable creative name
200
176
  */
201
177
  name: string;
178
+ format_id: FormatID;
179
+ /**
180
+ * Assets required by the format, keyed by asset_role
181
+ */
182
+ assets: {
183
+ /**
184
+ * This interface was referenced by `undefined`'s JSON-Schema definition
185
+ * via the `patternProperty` "^[a-zA-Z0-9_-]+$".
186
+ */
187
+ [k: string]: ImageAsset | VideoAsset | AudioAsset | TextAsset | HTMLAsset | CSSAsset | JavaScriptAsset | VASTAsset | DAASTAsset | PromotedOfferingsAsset | URLAsset;
188
+ };
189
+ /**
190
+ * Preview contexts for generative formats - defines what scenarios to generate previews for
191
+ */
192
+ inputs?: {
193
+ /**
194
+ * Human-readable name for this preview variant
195
+ */
196
+ name: string;
197
+ /**
198
+ * Macro values to apply for this preview
199
+ */
200
+ macros?: {
201
+ [k: string]: string;
202
+ };
203
+ /**
204
+ * Natural language description of the context for AI-generated content
205
+ */
206
+ context_description?: string;
207
+ }[];
202
208
  /**
203
- * Creative format type (e.g., video, audio, display)
209
+ * User-defined tags for organization and searchability
204
210
  */
205
- format: string;
211
+ tags?: string[];
206
212
  /**
207
- * URL of the creative file (for hosted assets)
213
+ * For generative creatives: set to true to approve and finalize, false to request regeneration with updated assets/message. Omit for non-generative creatives.
208
214
  */
209
- media_url?: string;
215
+ approved?: boolean;
216
+ }
217
+ /**
218
+ * Format identifier specifying which format this creative conforms to
219
+ */
220
+ export interface FormatID {
210
221
  /**
211
- * Third-party tag, VAST XML, or code snippet (for third-party served assets)
222
+ * URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)
212
223
  */
213
- snippet?: string;
214
- snippet_type?: SnippetType;
224
+ agent_url: string;
215
225
  /**
216
- * Landing page URL for the creative
226
+ * Format identifier within the agent's namespace (e.g., 'display_300x250', 'video_standard_30s')
217
227
  */
218
- click_url?: string;
228
+ id: string;
229
+ }
230
+ /**
231
+ * Image asset with URL and dimensions
232
+ */
233
+ export interface ImageAsset {
234
+ asset_type: 'image';
219
235
  /**
220
- * Duration in milliseconds (for video/audio)
236
+ * URL to the image asset
221
237
  */
222
- duration?: number;
238
+ url: string;
223
239
  /**
224
- * Width in pixels (for video/display)
240
+ * Image width in pixels
225
241
  */
226
242
  width?: number;
227
243
  /**
228
- * Height in pixels (for video/display)
244
+ * Image height in pixels
229
245
  */
230
246
  height?: number;
231
247
  /**
232
- * User-defined tags for organization and searchability
248
+ * Image file format (jpg, png, gif, webp, etc.)
233
249
  */
234
- tags?: string[];
250
+ format?: string;
251
+ /**
252
+ * Alternative text for accessibility
253
+ */
254
+ alt_text?: string;
255
+ }
256
+ /**
257
+ * Video asset with URL and specifications
258
+ */
259
+ export interface VideoAsset {
260
+ asset_type: 'video';
261
+ /**
262
+ * URL to the video asset
263
+ */
264
+ url: string;
265
+ /**
266
+ * Video width in pixels
267
+ */
268
+ width?: number;
269
+ /**
270
+ * Video height in pixels
271
+ */
272
+ height?: number;
273
+ /**
274
+ * Video duration in milliseconds
275
+ */
276
+ duration_ms?: number;
277
+ /**
278
+ * Video file format (mp4, webm, mov, etc.)
279
+ */
280
+ format?: string;
281
+ /**
282
+ * Video bitrate in kilobits per second
283
+ */
284
+ bitrate_kbps?: number;
285
+ }
286
+ /**
287
+ * Audio asset with URL and specifications
288
+ */
289
+ export interface AudioAsset {
290
+ asset_type: 'audio';
291
+ /**
292
+ * URL to the audio asset
293
+ */
294
+ url: string;
295
+ /**
296
+ * Audio duration in milliseconds
297
+ */
298
+ duration_ms?: number;
299
+ /**
300
+ * Audio file format (mp3, wav, aac, etc.)
301
+ */
302
+ format?: string;
303
+ /**
304
+ * Audio bitrate in kilobits per second
305
+ */
306
+ bitrate_kbps?: number;
307
+ }
308
+ /**
309
+ * Text content asset
310
+ */
311
+ export interface TextAsset {
312
+ asset_type: 'text';
313
+ /**
314
+ * Text content
315
+ */
316
+ content: string;
235
317
  /**
236
- * Sub-assets for multi-asset formats like carousels
318
+ * Maximum character length constraint
237
319
  */
238
- assets?: SubAsset[];
320
+ max_length?: number;
321
+ /**
322
+ * Language code (e.g., 'en', 'es', 'fr')
323
+ */
324
+ language?: string;
239
325
  }
240
- export interface SubAsset1 {
326
+ /**
327
+ * HTML content asset
328
+ */
329
+ export interface HTMLAsset {
330
+ asset_type: 'html';
241
331
  /**
242
- * Type of asset. Common types: headline, body_text, thumbnail_image, product_image, featured_image, logo, cta_text, price_text, sponsor_name, author_name, click_url
332
+ * HTML content
243
333
  */
244
- asset_type?: string;
334
+ content: string;
245
335
  /**
246
- * Unique identifier for the asset within the creative
336
+ * HTML version (e.g., 'HTML5')
247
337
  */
248
- asset_id?: string;
338
+ version?: string;
339
+ }
340
+ /**
341
+ * CSS stylesheet asset
342
+ */
343
+ export interface CSSAsset {
344
+ asset_type: 'css';
249
345
  /**
250
- * URL for media assets (images, videos, etc.)
346
+ * CSS content
251
347
  */
252
- content_uri?: string;
348
+ content: string;
253
349
  /**
254
- * Text content for text-based assets like headlines, body text, CTA text, etc.
350
+ * CSS media query context (e.g., 'screen', 'print')
255
351
  */
256
- content?: string | string[];
352
+ media?: string;
353
+ }
354
+ /**
355
+ * JavaScript code asset
356
+ */
357
+ export interface JavaScriptAsset {
358
+ asset_type: 'javascript';
359
+ /**
360
+ * JavaScript content
361
+ */
362
+ content: string;
363
+ /**
364
+ * JavaScript module type
365
+ */
366
+ module_type?: 'esm' | 'commonjs' | 'script';
367
+ }
368
+ export interface VASTAsset1 {
369
+ asset_type?: 'vast';
370
+ /**
371
+ * URL endpoint that returns VAST XML
372
+ */
373
+ url?: string;
374
+ /**
375
+ * Inline VAST XML content
376
+ */
377
+ content?: string;
378
+ /**
379
+ * VAST specification version
380
+ */
381
+ vast_version?: '2.0' | '3.0' | '4.0' | '4.1' | '4.2';
382
+ /**
383
+ * Whether VPAID (Video Player-Ad Interface Definition) is supported
384
+ */
385
+ vpaid_enabled?: boolean;
386
+ /**
387
+ * Maximum allowed wrapper/redirect depth
388
+ */
389
+ max_wrapper_depth?: number;
390
+ /**
391
+ * Expected video duration in milliseconds (if known)
392
+ */
393
+ duration_ms?: number;
394
+ /**
395
+ * Tracking events supported by this VAST tag
396
+ */
397
+ tracking_events?: ('start' | 'firstQuartile' | 'midpoint' | 'thirdQuartile' | 'complete' | 'impression' | 'click' | 'pause' | 'resume' | 'skip' | 'mute' | 'unmute' | 'fullscreen' | 'exitFullscreen' | 'playerExpand' | 'playerCollapse')[];
398
+ }
399
+ export interface DAASTAsset1 {
400
+ asset_type?: 'daast';
401
+ /**
402
+ * URL endpoint that returns DAAST XML
403
+ */
404
+ url?: string;
405
+ /**
406
+ * Inline DAAST XML content
407
+ */
408
+ content?: string;
409
+ /**
410
+ * DAAST specification version
411
+ */
412
+ daast_version?: '1.0' | '1.1';
413
+ /**
414
+ * Expected audio duration in milliseconds (if known)
415
+ */
416
+ duration_ms?: number;
417
+ /**
418
+ * Tracking events supported by this DAAST tag
419
+ */
420
+ tracking_events?: ('start' | 'firstQuartile' | 'midpoint' | 'thirdQuartile' | 'complete' | 'impression' | 'pause' | 'resume' | 'skip' | 'mute' | 'unmute')[];
421
+ /**
422
+ * Whether companion display ads are included
423
+ */
424
+ companion_ads?: boolean;
425
+ }
426
+ /**
427
+ * Reference to promoted offerings specification
428
+ */
429
+ export interface PromotedOfferingsAsset {
430
+ asset_type: 'promoted_offerings';
431
+ /**
432
+ * URL of the advertiser's brand or offering (e.g., https://retailer.com)
433
+ */
434
+ url?: string;
435
+ /**
436
+ * Brand colors
437
+ */
438
+ colors?: {
439
+ primary?: string;
440
+ secondary?: string;
441
+ accent?: string;
442
+ };
443
+ /**
444
+ * Brand fonts
445
+ */
446
+ fonts?: string[];
447
+ /**
448
+ * Brand tone/voice
449
+ */
450
+ tone?: string;
451
+ }
452
+ /**
453
+ * URL reference asset
454
+ */
455
+ export interface URLAsset {
456
+ asset_type: 'url';
457
+ /**
458
+ * URL reference
459
+ */
460
+ url: string;
461
+ /**
462
+ * Description of what this URL points to
463
+ */
464
+ description?: string;
257
465
  }
258
466
  /**
259
467
  * Represents available advertising inventory
@@ -267,6 +475,10 @@ export type PropertyIdentifierTypes = 'domain' | 'subdomain' | 'network_id' | 'i
267
475
  * Type of inventory delivery
268
476
  */
269
477
  export type DeliveryType = 'guaranteed' | 'non_guaranteed';
478
+ /**
479
+ * A pricing model option offered by a publisher for a product. Each pricing model has its own schema with model-specific requirements.
480
+ */
481
+ export type PricingOption = CPMFixedRatePricingOption | CPMAuctionPricingOption | VCPMFixedRatePricingOption | VCPMAuctionPricingOption | CPCPricingOption | CPCVPricingOption | CPVPricingOption | CPPPricingOption | FlatRatePricingOption;
270
482
  export type Product2 = {
271
483
  [k: string]: unknown;
272
484
  };
@@ -296,23 +508,35 @@ export interface Product1 {
296
508
  */
297
509
  property_tags?: [string, ...string[]];
298
510
  /**
299
- * Array of supported creative format IDs - use list_creative_formats to get full format details
511
+ * Array of supported creative format IDs - structured format_id objects with agent_url and id
300
512
  */
301
- format_ids: string[];
513
+ format_ids: FormatID[];
302
514
  delivery_type: DeliveryType;
303
515
  /**
304
- * Whether this product has fixed pricing (true) or uses auction (false)
305
- */
306
- is_fixed_price: boolean;
307
- /**
308
- * Cost per thousand impressions in USD
516
+ * Available pricing models for this product
517
+ *
518
+ * @minItems 1
309
519
  */
310
- cpm?: number;
520
+ pricing_options: [PricingOption, ...PricingOption[]];
311
521
  /**
312
- * Minimum budget requirement in USD
522
+ * Estimated exposures/impressions for guaranteed products
313
523
  */
314
- min_spend?: number;
524
+ estimated_exposures?: number;
315
525
  measurement?: Measurement;
526
+ /**
527
+ * Measurement provider and methodology for delivery metrics. The buyer accepts the declared provider as the source of truth for the buy. REQUIRED for all products.
528
+ */
529
+ delivery_measurement: {
530
+ /**
531
+ * Measurement provider(s) used for this product (e.g., 'Google Ad Manager with IAS viewability', 'Nielsen DAR', 'Geopath for DOOH impressions')
532
+ */
533
+ provider: string;
534
+ /**
535
+ * Additional details about measurement methodology in plain language (e.g., 'MRC-accredited viewability. 50% in-view for 1s display / 2s video', 'Panel-based demographic measurement updated monthly')
536
+ */
537
+ notes?: string;
538
+ };
539
+ reporting_capabilities?: ReportingCapabilities;
316
540
  creative_policy?: CreativePolicy;
317
541
  /**
318
542
  * Whether this is a custom product
@@ -369,6 +593,347 @@ export interface Property {
369
593
  */
370
594
  publisher_domain: string;
371
595
  }
596
+ /**
597
+ * Structured format identifier with agent URL and format name
598
+ */
599
+ export interface FormatID {
600
+ /**
601
+ * URL of the agent that defines this format (e.g., 'https://creatives.adcontextprotocol.org' for standard formats, or 'https://publisher.com/.well-known/adcp/sales' for custom formats)
602
+ */
603
+ agent_url: string;
604
+ /**
605
+ * Format identifier within the agent's namespace (e.g., 'display_300x250', 'video_standard_30s')
606
+ */
607
+ id: string;
608
+ }
609
+ /**
610
+ * Cost Per Mille (cost per 1,000 impressions) with guaranteed fixed rate - common for direct/guaranteed deals
611
+ */
612
+ export interface CPMFixedRatePricingOption {
613
+ /**
614
+ * Unique identifier for this pricing option within the product (e.g., 'cpm_usd_guaranteed')
615
+ */
616
+ pricing_option_id: string;
617
+ /**
618
+ * Cost per 1,000 impressions
619
+ */
620
+ pricing_model: 'cpm';
621
+ /**
622
+ * Fixed CPM rate (cost per 1,000 impressions)
623
+ */
624
+ rate: number;
625
+ /**
626
+ * ISO 4217 currency code
627
+ */
628
+ currency: string;
629
+ /**
630
+ * Minimum spend requirement per package using this pricing option, in the specified currency
631
+ */
632
+ min_spend_per_package?: number;
633
+ }
634
+ /**
635
+ * Cost Per Mille (cost per 1,000 impressions) with auction-based pricing - common for programmatic/non-guaranteed inventory
636
+ */
637
+ export interface CPMAuctionPricingOption {
638
+ /**
639
+ * Unique identifier for this pricing option within the product (e.g., 'cpm_usd_auction')
640
+ */
641
+ pricing_option_id: string;
642
+ /**
643
+ * Cost per 1,000 impressions
644
+ */
645
+ pricing_model: 'cpm';
646
+ /**
647
+ * ISO 4217 currency code
648
+ */
649
+ currency: string;
650
+ /**
651
+ * Pricing guidance for auction-based CPM bidding
652
+ */
653
+ price_guidance: {
654
+ /**
655
+ * Minimum bid price - publisher will reject bids under this value
656
+ */
657
+ floor: number;
658
+ /**
659
+ * 25th percentile winning price
660
+ */
661
+ p25?: number;
662
+ /**
663
+ * Median winning price
664
+ */
665
+ p50?: number;
666
+ /**
667
+ * 75th percentile winning price
668
+ */
669
+ p75?: number;
670
+ /**
671
+ * 90th percentile winning price
672
+ */
673
+ p90?: number;
674
+ };
675
+ /**
676
+ * Minimum spend requirement per package using this pricing option, in the specified currency
677
+ */
678
+ min_spend_per_package?: number;
679
+ }
680
+ /**
681
+ * Viewable Cost Per Mille (cost per 1,000 viewable impressions) with guaranteed fixed rate - impressions meeting MRC viewability standard (50% pixels in-view for 1 second for display, 2 seconds for video)
682
+ */
683
+ export interface VCPMFixedRatePricingOption {
684
+ /**
685
+ * Unique identifier for this pricing option within the product (e.g., 'vcpm_usd_guaranteed')
686
+ */
687
+ pricing_option_id: string;
688
+ /**
689
+ * Cost per 1,000 viewable impressions (MRC standard)
690
+ */
691
+ pricing_model: 'vcpm';
692
+ /**
693
+ * Fixed vCPM rate (cost per 1,000 viewable impressions)
694
+ */
695
+ rate: number;
696
+ /**
697
+ * ISO 4217 currency code
698
+ */
699
+ currency: string;
700
+ /**
701
+ * Minimum spend requirement per package using this pricing option, in the specified currency
702
+ */
703
+ min_spend_per_package?: number;
704
+ }
705
+ /**
706
+ * Viewable Cost Per Mille (cost per 1,000 viewable impressions) with auction-based pricing - impressions meeting MRC viewability standard (50% pixels in-view for 1 second for display, 2 seconds for video)
707
+ */
708
+ export interface VCPMAuctionPricingOption {
709
+ /**
710
+ * Unique identifier for this pricing option within the product (e.g., 'vcpm_usd_auction')
711
+ */
712
+ pricing_option_id: string;
713
+ /**
714
+ * Cost per 1,000 viewable impressions (MRC standard)
715
+ */
716
+ pricing_model: 'vcpm';
717
+ /**
718
+ * ISO 4217 currency code
719
+ */
720
+ currency: string;
721
+ /**
722
+ * Statistical guidance for auction pricing
723
+ */
724
+ price_guidance: {
725
+ /**
726
+ * Minimum acceptable bid price
727
+ */
728
+ floor: number;
729
+ /**
730
+ * 25th percentile of recent winning bids
731
+ */
732
+ p25?: number;
733
+ /**
734
+ * Median of recent winning bids
735
+ */
736
+ p50?: number;
737
+ /**
738
+ * 75th percentile of recent winning bids
739
+ */
740
+ p75?: number;
741
+ /**
742
+ * 90th percentile of recent winning bids
743
+ */
744
+ p90?: number;
745
+ };
746
+ /**
747
+ * Minimum spend requirement per package using this pricing option, in the specified currency
748
+ */
749
+ min_spend_per_package?: number;
750
+ }
751
+ /**
752
+ * Cost Per Click fixed-rate pricing for performance-driven advertising campaigns
753
+ */
754
+ export interface CPCPricingOption {
755
+ /**
756
+ * Unique identifier for this pricing option within the product (e.g., 'cpc_usd_fixed')
757
+ */
758
+ pricing_option_id: string;
759
+ /**
760
+ * Cost per click
761
+ */
762
+ pricing_model: 'cpc';
763
+ /**
764
+ * Fixed CPC rate (cost per click)
765
+ */
766
+ rate: number;
767
+ /**
768
+ * ISO 4217 currency code
769
+ */
770
+ currency: string;
771
+ /**
772
+ * Minimum spend requirement per package using this pricing option, in the specified currency
773
+ */
774
+ min_spend_per_package?: number;
775
+ }
776
+ /**
777
+ * Cost Per Completed View (100% video/audio completion) fixed-rate pricing
778
+ */
779
+ export interface CPCVPricingOption {
780
+ /**
781
+ * Unique identifier for this pricing option within the product (e.g., 'cpcv_usd_guaranteed')
782
+ */
783
+ pricing_option_id: string;
784
+ /**
785
+ * Cost per completed view (100% completion)
786
+ */
787
+ pricing_model: 'cpcv';
788
+ /**
789
+ * Fixed CPCV rate (cost per 100% completion)
790
+ */
791
+ rate: number;
792
+ /**
793
+ * ISO 4217 currency code
794
+ */
795
+ currency: string;
796
+ /**
797
+ * Minimum spend requirement per package using this pricing option, in the specified currency
798
+ */
799
+ min_spend_per_package?: number;
800
+ }
801
+ /**
802
+ * Cost Per View (at publisher-defined threshold) fixed-rate pricing for video/audio
803
+ */
804
+ export interface CPVPricingOption {
805
+ /**
806
+ * Unique identifier for this pricing option within the product (e.g., 'cpv_usd_50pct')
807
+ */
808
+ pricing_option_id: string;
809
+ /**
810
+ * Cost per view at threshold
811
+ */
812
+ pricing_model: 'cpv';
813
+ /**
814
+ * Fixed CPV rate (cost per view)
815
+ */
816
+ rate: number;
817
+ /**
818
+ * ISO 4217 currency code
819
+ */
820
+ currency: string;
821
+ /**
822
+ * CPV-specific parameters defining the view threshold
823
+ */
824
+ parameters: {
825
+ view_threshold: number | {
826
+ /**
827
+ * Seconds of viewing required (e.g., 30 for YouTube-style '30 seconds = view')
828
+ */
829
+ duration_seconds: number;
830
+ };
831
+ };
832
+ /**
833
+ * Minimum spend requirement per package using this pricing option, in the specified currency
834
+ */
835
+ min_spend_per_package?: number;
836
+ }
837
+ /**
838
+ * Cost Per Point (Gross Rating Point) fixed-rate pricing for TV and audio campaigns requiring demographic measurement
839
+ */
840
+ export interface CPPPricingOption {
841
+ /**
842
+ * Unique identifier for this pricing option within the product (e.g., 'cpp_usd_p18-49')
843
+ */
844
+ pricing_option_id: string;
845
+ /**
846
+ * Cost per Gross Rating Point
847
+ */
848
+ pricing_model: 'cpp';
849
+ /**
850
+ * Fixed CPP rate (cost per rating point)
851
+ */
852
+ rate: number;
853
+ /**
854
+ * ISO 4217 currency code
855
+ */
856
+ currency: string;
857
+ /**
858
+ * CPP-specific parameters for demographic targeting and GRP requirements
859
+ */
860
+ parameters: {
861
+ /**
862
+ * Target demographic in Nielsen format: P/M/W/A/C + age range. Examples: P18-49 (Persons 18-49), M25-54 (Men 25-54), W35+ (Women 35+), A18-34 (Adults 18-34), C2-11 (Children 2-11)
863
+ */
864
+ demographic: string;
865
+ /**
866
+ * Minimum GRPs/TRPs required for this pricing option
867
+ */
868
+ min_points?: number;
869
+ };
870
+ /**
871
+ * Minimum spend requirement per package using this pricing option, in the specified currency
872
+ */
873
+ min_spend_per_package?: number;
874
+ }
875
+ /**
876
+ * Flat rate pricing for DOOH, sponsorships, and time-based campaigns - fixed cost regardless of delivery volume
877
+ */
878
+ export interface FlatRatePricingOption {
879
+ /**
880
+ * Unique identifier for this pricing option within the product (e.g., 'flat_rate_usd_24h_takeover')
881
+ */
882
+ pricing_option_id: string;
883
+ /**
884
+ * Fixed cost regardless of delivery volume
885
+ */
886
+ pricing_model: 'flat_rate';
887
+ /**
888
+ * Flat rate cost
889
+ */
890
+ rate: number;
891
+ /**
892
+ * ISO 4217 currency code
893
+ */
894
+ currency: string;
895
+ /**
896
+ * Whether this is a fixed rate (true) or auction-based (false)
897
+ */
898
+ is_fixed: true;
899
+ /**
900
+ * Flat rate parameters for DOOH and time-based campaigns
901
+ */
902
+ parameters?: {
903
+ /**
904
+ * Duration in hours for time-based flat rate pricing (DOOH)
905
+ */
906
+ duration_hours?: number;
907
+ /**
908
+ * Guaranteed share of voice as percentage (DOOH, 0-100)
909
+ */
910
+ sov_percentage?: number;
911
+ /**
912
+ * Duration of ad loop rotation in seconds (DOOH)
913
+ */
914
+ loop_duration_seconds?: number;
915
+ /**
916
+ * Minimum number of times ad plays per hour (DOOH frequency guarantee)
917
+ */
918
+ min_plays_per_hour?: number;
919
+ /**
920
+ * Named venue package identifier for DOOH (e.g., 'times_square_network', 'airport_terminals')
921
+ */
922
+ venue_package?: string;
923
+ /**
924
+ * Estimated impressions for this flat rate option (informational, commonly used with SOV or time-based DOOH)
925
+ */
926
+ estimated_impressions?: number;
927
+ /**
928
+ * Specific daypart for time-based pricing (e.g., 'morning_commute', 'evening_prime', 'overnight')
929
+ */
930
+ daypart?: string;
931
+ };
932
+ /**
933
+ * Minimum spend requirement per package using this pricing option, in the specified currency
934
+ */
935
+ min_spend_per_package?: number;
936
+ }
372
937
  /**
373
938
  * Measurement capabilities included with a product
374
939
  */
@@ -390,6 +955,33 @@ export interface Measurement {
390
955
  */
391
956
  reporting: string;
392
957
  }
958
+ /**
959
+ * Reporting capabilities available for a product
960
+ */
961
+ export interface ReportingCapabilities {
962
+ /**
963
+ * Supported reporting frequency options
964
+ *
965
+ * @minItems 1
966
+ */
967
+ available_reporting_frequencies: ['hourly' | 'daily' | 'monthly', ...('hourly' | 'daily' | 'monthly')[]];
968
+ /**
969
+ * Expected delay in minutes before reporting data becomes available (e.g., 240 for 4-hour delay)
970
+ */
971
+ expected_delay_minutes: number;
972
+ /**
973
+ * Timezone for reporting periods. Use 'UTC' or IANA timezone (e.g., 'America/New_York'). Critical for daily/monthly frequency alignment.
974
+ */
975
+ timezone: string;
976
+ /**
977
+ * Whether this product supports webhook-based reporting notifications
978
+ */
979
+ supports_webhooks: boolean;
980
+ /**
981
+ * Metrics available in reporting. Impressions and spend are always implicitly included.
982
+ */
983
+ available_metrics: ('impressions' | 'spend' | 'clicks' | 'ctr' | 'video_completions' | 'completion_rate' | 'conversions' | 'viewability' | 'engagement_rate')[];
984
+ }
393
985
  /**
394
986
  * Creative requirements and restrictions for a product
395
987
  */
@@ -408,53 +1000,25 @@ export interface CreativePolicy {
408
1000
  templates_available: boolean;
409
1001
  }
410
1002
  /**
411
- * Audience targeting criteria
1003
+ * Optional geographic refinements for media buys. Most targeting should be expressed in the brief and handled by the publisher. These fields are primarily for geographic restrictions (RCT testing, regulatory compliance).
412
1004
  */
413
- export interface Targeting {
1005
+ export interface TargetingOverlay {
414
1006
  /**
415
- * Target specific countries (ISO codes)
1007
+ * Restrict delivery to specific countries (ISO codes). Use for regulatory compliance or RCT testing.
416
1008
  */
417
1009
  geo_country_any_of?: string[];
418
1010
  /**
419
- * Target specific regions/states
1011
+ * Restrict delivery to specific regions/states. Use for regulatory compliance or RCT testing.
420
1012
  */
421
1013
  geo_region_any_of?: string[];
422
1014
  /**
423
- * Target specific metro areas (DMA codes)
1015
+ * Restrict delivery to specific metro areas (DMA codes). Use for regulatory compliance or RCT testing.
424
1016
  */
425
1017
  geo_metro_any_of?: string[];
426
1018
  /**
427
- * Target specific postal/ZIP codes
1019
+ * Restrict delivery to specific postal/ZIP codes. Use for regulatory compliance or RCT testing.
428
1020
  */
429
1021
  geo_postal_code_any_of?: string[];
430
- /**
431
- * Audience segment IDs to target
432
- */
433
- audience_segment_any_of?: string[];
434
- /**
435
- * AXE segment ID to include for targeting
436
- */
437
- axe_include_segment?: string;
438
- /**
439
- * AXE segment ID to exclude from targeting
440
- */
441
- axe_exclude_segment?: string;
442
- /**
443
- * Signal IDs from get_signals
444
- */
445
- signals?: string[];
446
- /**
447
- * Target specific device types
448
- */
449
- device_type_any_of?: ('desktop' | 'mobile' | 'tablet' | 'connected_tv' | 'smart_speaker')[];
450
- /**
451
- * Target specific operating systems
452
- */
453
- os_any_of?: ('windows' | 'macos' | 'ios' | 'android' | 'linux' | 'roku' | 'tvos' | 'other')[];
454
- /**
455
- * Target specific browsers
456
- */
457
- browser_any_of?: ('chrome' | 'firefox' | 'safari' | 'edge' | 'other')[];
458
1022
  frequency_cap?: FrequencyCap;
459
1023
  }
460
1024
  /**