@adcp/client 3.11.2 → 3.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +35 -32
  2. package/dist/lib/adapters/property-list-adapter.d.ts.map +1 -1
  3. package/dist/lib/adapters/property-list-adapter.js +10 -5
  4. package/dist/lib/adapters/property-list-adapter.js.map +1 -1
  5. package/dist/lib/agents/index.generated.d.ts +33 -1
  6. package/dist/lib/agents/index.generated.d.ts.map +1 -1
  7. package/dist/lib/agents/index.generated.js +48 -0
  8. package/dist/lib/agents/index.generated.js.map +1 -1
  9. package/dist/lib/core/ADCPMultiAgentClient.d.ts +0 -1
  10. package/dist/lib/core/ADCPMultiAgentClient.d.ts.map +1 -1
  11. package/dist/lib/core/ADCPMultiAgentClient.js +0 -1
  12. package/dist/lib/core/ADCPMultiAgentClient.js.map +1 -1
  13. package/dist/lib/index.d.ts +4 -2
  14. package/dist/lib/index.d.ts.map +1 -1
  15. package/dist/lib/index.js +14 -3
  16. package/dist/lib/index.js.map +1 -1
  17. package/dist/lib/testing/scenarios/creative.js +11 -1
  18. package/dist/lib/testing/scenarios/creative.js.map +1 -1
  19. package/dist/lib/testing/types.d.ts +12 -0
  20. package/dist/lib/testing/types.d.ts.map +1 -1
  21. package/dist/lib/types/adcp.d.ts +1 -0
  22. package/dist/lib/types/adcp.d.ts.map +1 -1
  23. package/dist/lib/types/core.generated.d.ts +660 -45
  24. package/dist/lib/types/core.generated.d.ts.map +1 -1
  25. package/dist/lib/types/core.generated.js +2 -2
  26. package/dist/lib/types/core.generated.js.map +1 -1
  27. package/dist/lib/types/schemas.generated.d.ts +5821 -3396
  28. package/dist/lib/types/schemas.generated.d.ts.map +1 -1
  29. package/dist/lib/types/schemas.generated.js +717 -177
  30. package/dist/lib/types/schemas.generated.js.map +1 -1
  31. package/dist/lib/types/tools.generated.d.ts +2198 -384
  32. package/dist/lib/types/tools.generated.d.ts.map +1 -1
  33. package/dist/lib/types/tools.generated.js +0 -3
  34. package/dist/lib/types/tools.generated.js.map +1 -1
  35. package/dist/lib/utils/capabilities.d.ts +4 -0
  36. package/dist/lib/utils/capabilities.d.ts.map +1 -1
  37. package/dist/lib/utils/capabilities.js +6 -1
  38. package/dist/lib/utils/capabilities.js.map +1 -1
  39. package/dist/lib/utils/index.d.ts +2 -1
  40. package/dist/lib/utils/index.d.ts.map +1 -1
  41. package/dist/lib/utils/index.js +6 -1
  42. package/dist/lib/utils/index.js.map +1 -1
  43. package/dist/lib/utils/pagination.d.ts +31 -0
  44. package/dist/lib/utils/pagination.d.ts.map +1 -0
  45. package/dist/lib/utils/pagination.js +51 -0
  46. package/dist/lib/utils/pagination.js.map +1 -0
  47. package/dist/lib/utils/pricing-adapter.d.ts +4 -0
  48. package/dist/lib/utils/pricing-adapter.d.ts.map +1 -1
  49. package/dist/lib/utils/pricing-adapter.js +7 -0
  50. package/dist/lib/utils/pricing-adapter.js.map +1 -1
  51. package/dist/lib/version.d.ts +7 -7
  52. package/dist/lib/version.d.ts.map +1 -1
  53. package/dist/lib/version.js +6 -6
  54. package/dist/lib/version.js.map +1 -1
  55. package/package.json +2 -2
@@ -11,7 +11,7 @@ export type AssetContentType = 'image' | 'video' | 'audio' | 'text' | 'markdown'
11
11
  */
12
12
  export type DeliveryType = 'guaranteed' | 'non_guaranteed';
13
13
  /**
14
- * High-level categories for creative formats based on media type and delivery channel. Describes WHERE and HOW a creative displays, not what content it contains.
14
+ * DEPRECATED: High-level categories for creative formats. These categories are lossy abstractions that don't scale well to emerging ad formats. Use the assets array in Format objects to understand creative requirements instead - it provides precise information about what asset types are needed (video, image, text, etc.).
15
15
  */
16
16
  export type FormatCategory = 'audio' | 'video' | 'display' | 'native' | 'dooh' | 'rich_media' | 'universal';
17
17
  /**
@@ -178,12 +178,14 @@ export interface GetProductsRequest {
178
178
  */
179
179
  proposal_id?: string;
180
180
  brand_manifest?: BrandManifestReference;
181
+ product_selectors?: PromotedProducts;
181
182
  /**
182
- * Account context for product lookup. When provided, returns products with pricing specific to this account's rate card. Optional if the agent has a single account.
183
+ * Account ID for product lookup. Required when the seller declares account.required_for_products = true in capabilities. Returns products with pricing specific to this account's rate card.
183
184
  */
184
185
  account_id?: string;
185
186
  filters?: ProductFilters;
186
187
  property_list?: PropertyListReference;
188
+ pagination?: PaginationRequest;
187
189
  context?: ContextObject;
188
190
  ext?: ExtensionObject;
189
191
  }
@@ -241,29 +243,29 @@ export interface BrandManifest {
241
243
  height?: number;
242
244
  }[];
243
245
  /**
244
- * Brand color palette
246
+ * Brand color palette. Each role accepts a single hex color or an array of hex colors for brands with multiple values per role.
245
247
  */
246
248
  colors?: {
247
249
  /**
248
- * Primary brand color (hex format)
250
+ * Primary brand color(s)
249
251
  */
250
- primary?: string;
252
+ primary?: string | [string, ...string[]];
251
253
  /**
252
- * Secondary brand color (hex format)
254
+ * Secondary brand color(s)
253
255
  */
254
- secondary?: string;
256
+ secondary?: string | [string, ...string[]];
255
257
  /**
256
- * Accent color (hex format)
258
+ * Accent color(s)
257
259
  */
258
- accent?: string;
260
+ accent?: string | [string, ...string[]];
259
261
  /**
260
- * Background color (hex format)
262
+ * Background color(s)
261
263
  */
262
- background?: string;
264
+ background?: string | [string, ...string[]];
263
265
  /**
264
- * Text color (hex format)
266
+ * Text color(s)
265
267
  */
266
- text?: string;
268
+ text?: string | [string, ...string[]];
267
269
  };
268
270
  /**
269
271
  * Brand typography guidelines
@@ -285,7 +287,7 @@ export interface BrandManifest {
285
287
  /**
286
288
  * Brand voice and messaging tone guidelines for creative agents.
287
289
  */
288
- tone?: {
290
+ tone?: string | {
289
291
  /**
290
292
  * High-level voice descriptor (e.g., 'warm and inviting', 'professional and trustworthy')
291
293
  */
@@ -498,6 +500,32 @@ export interface BrandManifest {
498
500
  };
499
501
  [k: string]: unknown | undefined;
500
502
  }
503
+ /**
504
+ * Selectors to filter the brand manifest product catalog for product discovery. When provided, sellers should only return advertising products where the selected catalog items have matches. Uses the same selection methods as promoted-offerings.
505
+ */
506
+ export interface PromotedProducts {
507
+ /**
508
+ * GTIN product identifiers for cross-retailer catalog matching. Accepts standard GTIN formats (GTIN-8, UPC-A/GTIN-12, EAN-13/GTIN-13, GTIN-14).
509
+ */
510
+ manifest_gtins?: string[];
511
+ /**
512
+ * Direct product SKU references from the brand manifest product catalog
513
+ */
514
+ manifest_skus?: string[];
515
+ /**
516
+ * Select products by tags from the brand manifest product catalog (e.g., 'organic', 'sauces', 'holiday')
517
+ */
518
+ manifest_tags?: string[];
519
+ /**
520
+ * Select products from a specific category in the brand manifest product catalog (e.g., 'beverages/soft-drinks', 'food/sauces')
521
+ */
522
+ manifest_category?: string;
523
+ /**
524
+ * Natural language query to select products from the brand manifest (e.g., 'all Kraft Heinz pasta sauces', 'organic products under $20')
525
+ */
526
+ manifest_query?: string;
527
+ [k: string]: unknown | undefined;
528
+ }
501
529
  /**
502
530
  * Structured filters for product discovery
503
531
  */
@@ -509,12 +537,16 @@ export interface ProductFilters {
509
537
  is_fixed_price?: boolean;
510
538
  /**
511
539
  * Filter by format types
540
+ *
541
+ * @minItems 1
512
542
  */
513
- format_types?: FormatCategory[];
543
+ format_types?: [FormatCategory, ...FormatCategory[]];
514
544
  /**
515
545
  * Filter by specific format IDs
546
+ *
547
+ * @minItems 1
516
548
  */
517
- format_ids?: FormatID[];
549
+ format_ids?: [FormatID, ...FormatID[]];
518
550
  /**
519
551
  * Only return products accepting IAB standard formats
520
552
  */
@@ -539,45 +571,77 @@ export interface ProductFilters {
539
571
  };
540
572
  /**
541
573
  * Filter by country coverage using ISO 3166-1 alpha-2 codes (e.g., ['US', 'CA', 'GB']). Works for all inventory types.
574
+ *
575
+ * @minItems 1
542
576
  */
543
- countries?: string[];
577
+ countries?: [string, ...string[]];
544
578
  /**
545
579
  * Filter by region coverage using ISO 3166-2 codes (e.g., ['US-NY', 'US-CA', 'GB-SCT']). Use for locally-bound inventory (regional OOH, local TV) where products have region-specific coverage.
580
+ *
581
+ * @minItems 1
546
582
  */
547
- regions?: string[];
583
+ regions?: [string, ...string[]];
548
584
  /**
549
585
  * Filter by metro coverage for locally-bound inventory (radio, DOOH, local TV). Use when products have DMA/metro-specific coverage. For digital inventory where products have broad coverage, use required_geo_targeting instead to filter by seller capability.
586
+ *
587
+ * @minItems 1
550
588
  */
551
- metros?: {
552
- system: MetroAreaSystem;
553
- /**
554
- * Metro code within the system (e.g., '501' for NYC DMA)
555
- */
556
- code: string;
557
- }[];
589
+ metros?: [
590
+ {
591
+ system: MetroAreaSystem;
592
+ /**
593
+ * Metro code within the system (e.g., '501' for NYC DMA)
594
+ */
595
+ code: string;
596
+ },
597
+ ...{
598
+ system: MetroAreaSystem;
599
+ /**
600
+ * Metro code within the system (e.g., '501' for NYC DMA)
601
+ */
602
+ code: string;
603
+ }[]
604
+ ];
558
605
  /**
559
- * Filter by advertising channels (e.g., ['display', 'video', 'dooh'])
606
+ * Filter by advertising channels (e.g., ['display', 'ctv', 'dooh'])
607
+ *
608
+ * @minItems 1
560
609
  */
561
- channels?: MediaChannel[];
610
+ channels?: [MediaChannel, ...MediaChannel[]];
562
611
  /**
563
612
  * Filter to products executable through specific agentic ad exchanges. URLs are canonical identifiers.
613
+ *
614
+ * @minItems 1
564
615
  */
565
- required_axe_integrations?: string[];
616
+ required_axe_integrations?: [string, ...string[]];
566
617
  required_features?: MediaBuyFeatures;
567
618
  /**
568
619
  * Filter to products from sellers supporting specific geo targeting capabilities. Each entry specifies a targeting level (country, region, metro, postal_area) and optionally a system for levels that have multiple classification systems.
620
+ *
621
+ * @minItems 1
569
622
  */
570
- required_geo_targeting?: {
571
- level: GeographicTargetingLevel;
572
- /**
573
- * Classification system within the level. Required for metro (e.g., 'nielsen_dma') and postal_area (e.g., 'us_zip'). Not applicable for country/region which use ISO standards.
574
- */
575
- system?: string;
576
- }[];
623
+ required_geo_targeting?: [
624
+ {
625
+ level: GeographicTargetingLevel;
626
+ /**
627
+ * Classification system within the level. Required for metro (e.g., 'nielsen_dma') and postal_area (e.g., 'us_zip'). Not applicable for country/region which use ISO standards.
628
+ */
629
+ system?: string;
630
+ },
631
+ ...{
632
+ level: GeographicTargetingLevel;
633
+ /**
634
+ * Classification system within the level. Required for metro (e.g., 'nielsen_dma') and postal_area (e.g., 'us_zip'). Not applicable for country/region which use ISO standards.
635
+ */
636
+ system?: string;
637
+ }[]
638
+ ];
577
639
  /**
578
640
  * Filter to products supporting specific signals from data provider catalogs. Products must have the requested signals in their data_provider_signals and signal_targeting_allowed must be true (or all signals requested).
641
+ *
642
+ * @minItems 1
579
643
  */
580
- signal_targeting?: SignalTargeting[];
644
+ signal_targeting?: [SignalTargeting, ...SignalTargeting[]];
581
645
  [k: string]: unknown | undefined;
582
646
  }
583
647
  /**
@@ -622,6 +686,10 @@ export interface MediaBuyFeatures {
622
686
  * Full support for content_standards configuration including sampling rates and category filtering
623
687
  */
624
688
  content_standards?: boolean;
689
+ /**
690
+ * Supports sync_event_sources and log_event tasks for conversion event tracking
691
+ */
692
+ conversion_tracking?: boolean;
625
693
  [k: string]: boolean | undefined;
626
694
  }
627
695
  /**
@@ -641,6 +709,19 @@ export interface PropertyListReference {
641
709
  */
642
710
  auth_token?: string;
643
711
  }
712
+ /**
713
+ * Standard cursor-based pagination parameters for list operations
714
+ */
715
+ export interface PaginationRequest {
716
+ /**
717
+ * Maximum number of items to return per page
718
+ */
719
+ max_results?: number;
720
+ /**
721
+ * Opaque cursor from a previous response to fetch the next page
722
+ */
723
+ cursor?: string;
724
+ }
644
725
  /**
645
726
  * Opaque correlation data that is echoed unchanged in responses. Used for internal tracking, UI session IDs, trace IDs, and other caller-specific identifiers that don't affect protocol behavior. Context data is never parsed by AdCP agents - it's simply preserved and returned.
646
727
  */
@@ -708,9 +789,17 @@ export type PropertyID = string;
708
789
  */
709
790
  export type PropertyTag = string;
710
791
  /**
711
- * Type of inventory delivery
792
+ * Standardized advertising media channels describing how buyers allocate budget. Channels are planning abstractions, not technical substrates. See the Media Channel Taxonomy specification for detailed definitions.
793
+ */
794
+ export type PricingOption = CPMPricingOption | VCPMPricingOption | CPCPricingOption | CPCVPricingOption | CPVPricingOption | CPPPricingOption | CPAPricingOption | FlatRatePricingOption | TimeBasedPricingOption;
795
+ /**
796
+ * Measurement system for the demographic field. Defaults to nielsen when omitted.
712
797
  */
713
- export type PricingOption = CPMPricingOption | VCPMPricingOption | CPCPricingOption | CPCVPricingOption | CPVPricingOption | CPPPricingOption | FlatRatePricingOption;
798
+ export type DemographicSystem = 'nielsen' | 'barb' | 'agf' | 'oztam' | 'mediametrie' | 'custom';
799
+ /**
800
+ * Standard marketing event types for event logging, aligned with IAB ECAPI
801
+ */
802
+ export type EventType = 'page_view' | 'view_content' | 'select_content' | 'select_item' | 'search' | 'share' | 'add_to_cart' | 'remove_from_cart' | 'viewed_cart' | 'add_to_wishlist' | 'initiate_checkout' | 'add_payment_info' | 'purchase' | 'refund' | 'lead' | 'qualify_lead' | 'close_convert_lead' | 'disqualify_lead' | 'complete_registration' | 'subscribe' | 'start_trial' | 'app_install' | 'app_launch' | 'contact' | 'schedule' | 'donate' | 'submit_application' | 'custom';
714
803
  /**
715
804
  * Available frequencies for delivery reports and metrics updates
716
805
  */
@@ -718,7 +807,7 @@ export type ReportingFrequency = 'hourly' | 'daily' | 'monthly';
718
807
  /**
719
808
  * Standard delivery and performance metrics available for reporting
720
809
  */
721
- export type AvailableMetric = 'impressions' | 'spend' | 'clicks' | 'ctr' | 'video_completions' | 'completion_rate' | 'conversions' | 'viewability' | 'engagement_rate';
810
+ export type AvailableMetric = 'impressions' | 'spend' | 'clicks' | 'ctr' | 'video_completions' | 'completion_rate' | 'conversions' | 'conversion_value' | 'roas' | 'cost_per_acquisition' | 'new_to_brand_rate' | 'viewability' | 'engagement_rate' | 'views' | 'completed_views' | 'leads' | 'reach' | 'frequency' | 'grps' | 'quartile_data' | 'dooh_metrics' | 'cost_per_click';
722
811
  /**
723
812
  * Co-branding requirement
724
813
  */
@@ -773,6 +862,30 @@ export type DataProviderSignalSelector = {
773
862
  signal_tags: [string, ...string[]];
774
863
  [k: string]: unknown | undefined;
775
864
  };
865
+ /**
866
+ * Where the conversion event originated
867
+ */
868
+ export type ActionSource = 'website' | 'app' | 'offline' | 'phone_call' | 'chat' | 'email' | 'in_store' | 'system_generated' | 'other';
869
+ /**
870
+ * Days of the week for daypart targeting
871
+ */
872
+ export type DayOfWeek = 'monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday' | 'sunday';
873
+ /**
874
+ * How to interpret the points array. 'spend' (default when omitted): points at ascending budget levels. 'reach_freq': points at ascending reach/frequency targets. 'weekly'/'daily': metrics are per-period values. 'clicks'/'conversions': points at ascending outcome targets.
875
+ */
876
+ export type ForecastRangeUnit = 'spend' | 'reach_freq' | 'weekly' | 'daily' | 'clicks' | 'conversions';
877
+ /**
878
+ * Method used to produce this forecast
879
+ */
880
+ export type ForecastMethod = 'estimate' | 'modeled' | 'guaranteed';
881
+ /**
882
+ * Measurement system for the demographic field. Ensures buyer and seller agree on demographic notation.
883
+ */
884
+ export type DemographicSystem1 = 'nielsen' | 'barb' | 'agf' | 'oztam' | 'mediametrie' | 'custom';
885
+ /**
886
+ * Unit of measurement for reach and audience_size metrics in this forecast. Required for cross-channel forecast comparison.
887
+ */
888
+ export type ReachUnit = 'individuals' | 'households' | 'devices' | 'accounts' | 'cookies' | 'custom';
776
889
  /**
777
890
  * Response payload for get_products task
778
891
  */
@@ -793,6 +906,11 @@ export interface GetProductsResponse {
793
906
  * [AdCP 3.0] Indicates whether property_list filtering was applied. True if the agent filtered products based on the provided property_list. Absent or false if property_list was not provided or not supported by this agent.
794
907
  */
795
908
  property_list_applied?: boolean;
909
+ /**
910
+ * Indicates whether product_selectors filtering was applied. True if the seller filtered results based on the provided product_selectors. Absent or false if product_selectors was not provided or not supported by this agent.
911
+ */
912
+ product_selectors_applied?: boolean;
913
+ pagination?: PaginationResponse;
796
914
  context?: ContextObject;
797
915
  ext?: ExtensionObject;
798
916
  }
@@ -818,6 +936,10 @@ export interface Product {
818
936
  * @minItems 1
819
937
  */
820
938
  publisher_properties: [PublisherPropertySelector, ...PublisherPropertySelector[]];
939
+ /**
940
+ * Advertising channels this product is sold as. Products inherit from their properties' supported_channels but may narrow the scope. For example, a product covering YouTube properties might be sold as ['ctv'] even though those properties support ['olv', 'social', 'ctv'].
941
+ */
942
+ channels?: MediaChannel[];
821
943
  /**
822
944
  * Array of supported creative format IDs - structured format_id objects with agent_url and id
823
945
  */
@@ -871,6 +993,48 @@ export interface Product {
871
993
  * Whether buyers can filter this product to a subset of its data_provider_signals. When false (default), the product includes all listed signals as a bundle. When true, buyers can target specific signals.
872
994
  */
873
995
  signal_targeting_allowed?: boolean;
996
+ /**
997
+ * Conversion tracking for this product. Presence indicates the product supports conversion-optimized delivery. Seller-level capabilities (supported event types, UID types, attribution windows) are declared in get_adcp_capabilities.
998
+ */
999
+ conversion_tracking?: {
1000
+ /**
1001
+ * Action sources relevant to this product (e.g. a retail media product might have 'in_store' and 'website', while a display product might only have 'website')
1002
+ *
1003
+ * @minItems 1
1004
+ */
1005
+ action_sources?: [ActionSource, ...ActionSource[]];
1006
+ /**
1007
+ * Optimization strategies this product supports when an optimization_goal is set on a package
1008
+ *
1009
+ * @minItems 1
1010
+ */
1011
+ supported_optimization_strategies?: [
1012
+ 'maximize_conversions' | 'target_cpa' | 'target_roas',
1013
+ ...('maximize_conversions' | 'target_cpa' | 'target_roas')[]
1014
+ ];
1015
+ /**
1016
+ * Whether the seller provides its own always-on measurement (e.g. Amazon sales attribution for Amazon advertisers). When true, sync_event_sources response will include seller-managed event sources with managed_by='seller'.
1017
+ */
1018
+ platform_managed?: boolean;
1019
+ [k: string]: unknown | undefined;
1020
+ };
1021
+ /**
1022
+ * When the buyer provides a brand_manifest with product_catalog, indicates which of the buyer's catalog items are eligible for this product. Enables buyers to make informed product_selector choices in create_media_buy. Only present for products where catalog matching is relevant (e.g. sponsored product listings on retail media). Sellers SHOULD include at least one of matched_gtins or matched_skus.
1023
+ */
1024
+ catalog_match?: {
1025
+ /**
1026
+ * GTINs from the buyer's catalog that are eligible on this product's inventory. Buyers can use these values in product_selectors.manifest_gtins when creating media buys. Standard GTIN formats (GTIN-8 through GTIN-14).
1027
+ */
1028
+ matched_gtins?: string[];
1029
+ /**
1030
+ * SKUs from the buyer's catalog that are eligible on this product's inventory. Buyers can use these values in product_selectors.manifest_skus when creating media buys.
1031
+ */
1032
+ matched_skus?: string[];
1033
+ /**
1034
+ * Total catalog items evaluated from the buyer's feed.
1035
+ */
1036
+ submitted_count: number;
1037
+ };
874
1038
  /**
875
1039
  * Explanation of why this product matches the brief (only included when brief is provided)
876
1040
  */
@@ -1239,8 +1403,9 @@ export interface CPPPricingOption {
1239
1403
  * CPP-specific parameters for demographic targeting
1240
1404
  */
1241
1405
  parameters: {
1406
+ demographic_system?: DemographicSystem;
1242
1407
  /**
1243
- * Target demographic in Nielsen format (P18-49, M25-54, W35+, etc.)
1408
+ * Target demographic code within the specified demographic_system (e.g., P18-49 for Nielsen, ABC1 Adults for BARB)
1244
1409
  */
1245
1410
  demographic: string;
1246
1411
  /**
@@ -1277,6 +1442,44 @@ export interface PriceGuidance5 {
1277
1442
  p90?: number;
1278
1443
  [k: string]: unknown | undefined;
1279
1444
  }
1445
+ /**
1446
+ * Cost Per Acquisition pricing. Advertiser pays a fixed price when a specified conversion event occurs. The event_type field declares which event triggers billing (e.g., purchase, lead, app_install).
1447
+ */
1448
+ export interface CPAPricingOption {
1449
+ /**
1450
+ * Unique identifier for this pricing option within the product
1451
+ */
1452
+ pricing_option_id: string;
1453
+ /**
1454
+ * Cost per acquisition (conversion event)
1455
+ */
1456
+ pricing_model: 'cpa';
1457
+ /**
1458
+ * The conversion event type that triggers billing (e.g., purchase, lead, app_install)
1459
+ */
1460
+ event_type: EventType;
1461
+ /**
1462
+ * Name of the custom event when event_type is 'custom'. Required when event_type is 'custom', ignored otherwise.
1463
+ */
1464
+ custom_event_name?: string;
1465
+ /**
1466
+ * When present, only events from this specific event source count toward billing. Allows different CPA rates for different sources (e.g., online vs in-store purchases). Must match an event source configured via sync_event_sources.
1467
+ */
1468
+ event_source_id?: string;
1469
+ /**
1470
+ * ISO 4217 currency code
1471
+ */
1472
+ currency: string;
1473
+ /**
1474
+ * Fixed price per acquisition in the specified currency
1475
+ */
1476
+ fixed_price: number;
1477
+ /**
1478
+ * Minimum spend requirement per package using this pricing option, in the specified currency
1479
+ */
1480
+ min_spend_per_package?: number;
1481
+ [k: string]: unknown | undefined;
1482
+ }
1280
1483
  /**
1281
1484
  * Flat rate pricing for DOOH, sponsorships, and time-based campaigns. If fixed_price is present, it's fixed pricing. If absent, it's auction-based.
1282
1485
  */
@@ -1364,6 +1567,77 @@ export interface PriceGuidance6 {
1364
1567
  p90?: number;
1365
1568
  [k: string]: unknown | undefined;
1366
1569
  }
1570
+ /**
1571
+ * Cost per time unit (hour, day, week, or month) - rate scales with campaign duration. If fixed_price is present, it's fixed pricing. If absent, it's auction-based.
1572
+ */
1573
+ export interface TimeBasedPricingOption {
1574
+ /**
1575
+ * Unique identifier for this pricing option within the product
1576
+ */
1577
+ pricing_option_id: string;
1578
+ /**
1579
+ * Cost per time unit - rate scales with campaign duration
1580
+ */
1581
+ pricing_model: 'time';
1582
+ /**
1583
+ * ISO 4217 currency code
1584
+ */
1585
+ currency: string;
1586
+ /**
1587
+ * Cost per time unit. If present, this is fixed pricing. If absent, auction-based.
1588
+ */
1589
+ fixed_price?: number;
1590
+ /**
1591
+ * Minimum acceptable bid per time unit for auction pricing (mutually exclusive with fixed_price). Bids below this value will be rejected.
1592
+ */
1593
+ floor_price?: number;
1594
+ price_guidance?: PriceGuidance7;
1595
+ /**
1596
+ * Time-based pricing parameters
1597
+ */
1598
+ parameters: {
1599
+ /**
1600
+ * The time unit for pricing. Total cost = fixed_price × number of time_units in the campaign flight.
1601
+ */
1602
+ time_unit: 'hour' | 'day' | 'week' | 'month';
1603
+ /**
1604
+ * Minimum booking duration in time_units
1605
+ */
1606
+ min_duration?: number;
1607
+ /**
1608
+ * Maximum booking duration in time_units. Must be >= min_duration when both are present.
1609
+ */
1610
+ max_duration?: number;
1611
+ [k: string]: unknown | undefined;
1612
+ };
1613
+ /**
1614
+ * Minimum spend requirement per package using this pricing option, in the specified currency
1615
+ */
1616
+ min_spend_per_package?: number;
1617
+ [k: string]: unknown | undefined;
1618
+ }
1619
+ /**
1620
+ * Optional pricing guidance for auction-based bidding
1621
+ */
1622
+ export interface PriceGuidance7 {
1623
+ /**
1624
+ * 25th percentile of recent winning bids
1625
+ */
1626
+ p25?: number;
1627
+ /**
1628
+ * Median of recent winning bids
1629
+ */
1630
+ p50?: number;
1631
+ /**
1632
+ * 75th percentile of recent winning bids
1633
+ */
1634
+ p75?: number;
1635
+ /**
1636
+ * 90th percentile of recent winning bids
1637
+ */
1638
+ p90?: number;
1639
+ [k: string]: unknown | undefined;
1640
+ }
1367
1641
  /**
1368
1642
  * Measurement capabilities included with a product
1369
1643
  */
@@ -1409,9 +1683,17 @@ export interface ReportingCapabilities {
1409
1683
  */
1410
1684
  supports_webhooks: boolean;
1411
1685
  /**
1412
- * Metrics available in reporting. Impressions and spend are always implicitly included.
1686
+ * Metrics available in reporting. Impressions and spend are always implicitly included. When a creative format declares reported_metrics, buyers receive the intersection of these product-level metrics and the format's reported_metrics.
1413
1687
  */
1414
1688
  available_metrics: AvailableMetric[];
1689
+ /**
1690
+ * Whether this product supports creative-level metric breakdowns in delivery reporting (by_creative within by_package)
1691
+ */
1692
+ supports_creative_breakdown?: boolean;
1693
+ /**
1694
+ * Whether delivery data can be filtered to arbitrary date ranges. 'date_range' means the platform supports start_date/end_date parameters. 'lifetime_only' means the platform returns campaign lifetime totals and date range parameters are not accepted.
1695
+ */
1696
+ date_range_support: 'date_range' | 'lifetime_only';
1415
1697
  [k: string]: unknown | undefined;
1416
1698
  }
1417
1699
  /**
@@ -1530,6 +1812,7 @@ export interface Proposal {
1530
1812
  * Explanation of how this proposal aligns with the campaign brief
1531
1813
  */
1532
1814
  brief_alignment?: string;
1815
+ forecast?: DeliveryForecast1;
1533
1816
  ext?: ExtensionObject;
1534
1817
  [k: string]: unknown | undefined;
1535
1818
  }
@@ -1561,71 +1844,222 @@ export interface ProductAllocation {
1561
1844
  * Categorical tags for this allocation (e.g., 'desktop', 'german', 'mobile') - useful for grouping/filtering allocations by dimension
1562
1845
  */
1563
1846
  tags?: string[];
1847
+ /**
1848
+ * Recommended time windows for this allocation in spot-plan proposals.
1849
+ *
1850
+ * @minItems 1
1851
+ */
1852
+ daypart_targets?: [DaypartTarget, ...DaypartTarget[]];
1853
+ forecast?: DeliveryForecast;
1564
1854
  ext?: ExtensionObject;
1565
1855
  [k: string]: unknown | undefined;
1566
1856
  }
1567
1857
  /**
1568
- * Standard error structure for task-specific errors and warnings
1858
+ * A time window for daypart targeting. Specifies days of week and an hour range. 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.
1569
1859
  */
1570
- export interface Error {
1571
- /**
1572
- * Error code for programmatic handling
1573
- */
1574
- code: string;
1575
- /**
1576
- * Human-readable error message
1577
- */
1578
- message: string;
1860
+ export interface DaypartTarget {
1579
1861
  /**
1580
- * Field path associated with the error (e.g., 'packages[0].targeting')
1862
+ * Days of week this window applies to. Use multiple days for compact targeting (e.g., monday-friday in one object).
1863
+ *
1864
+ * @minItems 1
1581
1865
  */
1582
- field?: string;
1866
+ days: [DayOfWeek, ...DayOfWeek[]];
1583
1867
  /**
1584
- * Suggested fix for the error
1868
+ * Start hour (inclusive), 0-23 in 24-hour format. 0 = midnight, 6 = 6:00am, 18 = 6:00pm.
1585
1869
  */
1586
- suggestion?: string;
1870
+ start_hour: number;
1587
1871
  /**
1588
- * Seconds to wait before retrying the operation
1872
+ * End hour (exclusive), 1-24 in 24-hour format. 10 = 10:00am, 24 = midnight. Must be greater than start_hour.
1589
1873
  */
1590
- retry_after?: number;
1874
+ end_hour: number;
1591
1875
  /**
1592
- * Additional task-specific error details
1876
+ * Optional human-readable name for this time window (e.g., 'Morning Drive', 'Prime Time')
1593
1877
  */
1594
- details?: {
1595
- [k: string]: unknown | undefined;
1596
- };
1597
- [k: string]: unknown | undefined;
1878
+ label?: string;
1598
1879
  }
1599
1880
  /**
1600
- * Opaque correlation data that is echoed unchanged in responses. Used for internal tracking, UI session IDs, trace IDs, and other caller-specific identifiers that don't affect protocol behavior. Context data is never parsed by AdCP agents - it's simply preserved and returned.
1601
- */
1602
- /**
1603
- * Filter by format type (technical categories with distinct requirements)
1881
+ * Forecasted delivery metrics for this allocation
1604
1882
  */
1605
- export interface ListCreativeFormatsRequest {
1883
+ export interface DeliveryForecast {
1606
1884
  /**
1607
- * Return only these specific format IDs (e.g., from get_products response)
1885
+ * Forecasted delivery at one or more budget levels. A single point is a standard forecast; multiple points ordered by ascending budget form a curve showing how metrics scale with spend. Each point pairs a budget with metric ranges.
1886
+ *
1887
+ * @minItems 1
1608
1888
  */
1609
- format_ids?: FormatID[];
1610
- type?: FormatCategory;
1889
+ points: [ForecastPoint, ...ForecastPoint[]];
1890
+ forecast_range_unit?: ForecastRangeUnit;
1891
+ method: ForecastMethod;
1611
1892
  /**
1612
- * Filter to formats that include these asset types. For third-party tags, search for 'html' or 'javascript'. E.g., ['image', 'text'] returns formats with images and text, ['javascript'] returns formats accepting JavaScript tags.
1893
+ * ISO 4217 currency code for monetary values in this forecast (spend, budget)
1613
1894
  */
1614
- asset_types?: AssetContentType[];
1895
+ currency: string;
1896
+ demographic_system?: DemographicSystem1;
1615
1897
  /**
1616
- * Maximum width in pixels (inclusive). Returns formats where ANY render has width <= this value. For multi-render formats, matches if at least one render fits.
1898
+ * Target demographic code within the specified demographic_system. For Nielsen: P18-49, M25-54, W35+. For BARB: ABC1 Adults, 16-34. For AGF: E 14-49.
1617
1899
  */
1618
- max_width?: number;
1900
+ demographic?: string;
1901
+ reach_unit?: ReachUnit;
1619
1902
  /**
1620
- * Maximum height in pixels (inclusive). Returns formats where ANY render has height <= this value. For multi-render formats, matches if at least one render fits.
1903
+ * When this forecast was computed
1621
1904
  */
1622
- max_height?: number;
1905
+ generated_at?: string;
1623
1906
  /**
1624
- * Minimum width in pixels (inclusive). Returns formats where ANY render has width >= this value.
1907
+ * When this forecast expires. After this time, the forecast should be refreshed. Forecast expiry does not affect proposal executability.
1625
1908
  */
1626
- min_width?: number;
1627
- /**
1628
- * Minimum height in pixels (inclusive). Returns formats where ANY render has height >= this value.
1909
+ valid_until?: string;
1910
+ ext?: ExtensionObject;
1911
+ [k: string]: unknown | undefined;
1912
+ }
1913
+ /**
1914
+ * A forecast at a specific budget level. A single point represents a standard forecast; multiple points ordered by ascending budget form a curve showing how delivery metrics scale with spend.
1915
+ */
1916
+ export interface ForecastPoint {
1917
+ /**
1918
+ * Budget amount for this forecast point. For allocation-level forecasts, this is the absolute budget for that allocation (not the percentage). For proposal-level forecasts, this is the total proposal budget.
1919
+ */
1920
+ budget: number;
1921
+ /**
1922
+ * Forecasted metric values at this budget level. Keys are either forecastable-metric values for delivery/engagement (impressions, reach, spend, etc.) or event-type values for outcomes (purchase, lead, app_install, etc.). Values are ForecastRange objects (low/mid/high). Use { "mid": value } for point estimates. Include spend when the platform predicts it will differ from budget.
1923
+ */
1924
+ metrics: {
1925
+ [k: string]: ForecastRange | undefined;
1926
+ };
1927
+ [k: string]: unknown | undefined;
1928
+ }
1929
+ /**
1930
+ * A forecast value with optional low/high bounds. The mid value represents the most likely outcome. When low and high are provided, they represent conservative and optimistic estimates respectively.
1931
+ */
1932
+ export interface ForecastRange {
1933
+ /**
1934
+ * Conservative (low-end) forecast value
1935
+ */
1936
+ low?: number;
1937
+ /**
1938
+ * Expected (most likely) forecast value
1939
+ */
1940
+ mid: number;
1941
+ /**
1942
+ * Optimistic (high-end) forecast value
1943
+ */
1944
+ high?: number;
1945
+ [k: string]: unknown | undefined;
1946
+ }
1947
+ /**
1948
+ * Aggregate forecasted delivery metrics for the entire proposal. When both proposal-level and allocation-level forecasts are present, the proposal-level forecast is authoritative for total delivery estimation.
1949
+ */
1950
+ export interface DeliveryForecast1 {
1951
+ /**
1952
+ * Forecasted delivery at one or more budget levels. A single point is a standard forecast; multiple points ordered by ascending budget form a curve showing how metrics scale with spend. Each point pairs a budget with metric ranges.
1953
+ *
1954
+ * @minItems 1
1955
+ */
1956
+ points: [ForecastPoint, ...ForecastPoint[]];
1957
+ forecast_range_unit?: ForecastRangeUnit;
1958
+ method: ForecastMethod;
1959
+ /**
1960
+ * ISO 4217 currency code for monetary values in this forecast (spend, budget)
1961
+ */
1962
+ currency: string;
1963
+ demographic_system?: DemographicSystem1;
1964
+ /**
1965
+ * Target demographic code within the specified demographic_system. For Nielsen: P18-49, M25-54, W35+. For BARB: ABC1 Adults, 16-34. For AGF: E 14-49.
1966
+ */
1967
+ demographic?: string;
1968
+ reach_unit?: ReachUnit;
1969
+ /**
1970
+ * When this forecast was computed
1971
+ */
1972
+ generated_at?: string;
1973
+ /**
1974
+ * When this forecast expires. After this time, the forecast should be refreshed. Forecast expiry does not affect proposal executability.
1975
+ */
1976
+ valid_until?: string;
1977
+ ext?: ExtensionObject;
1978
+ [k: string]: unknown | undefined;
1979
+ }
1980
+ /**
1981
+ * Standard error structure for task-specific errors and warnings
1982
+ */
1983
+ export interface Error {
1984
+ /**
1985
+ * Error code for programmatic handling
1986
+ */
1987
+ code: string;
1988
+ /**
1989
+ * Human-readable error message
1990
+ */
1991
+ message: string;
1992
+ /**
1993
+ * Field path associated with the error (e.g., 'packages[0].targeting')
1994
+ */
1995
+ field?: string;
1996
+ /**
1997
+ * Suggested fix for the error
1998
+ */
1999
+ suggestion?: string;
2000
+ /**
2001
+ * Seconds to wait before retrying the operation
2002
+ */
2003
+ retry_after?: number;
2004
+ /**
2005
+ * Additional task-specific error details
2006
+ */
2007
+ details?: {
2008
+ [k: string]: unknown | undefined;
2009
+ };
2010
+ [k: string]: unknown | undefined;
2011
+ }
2012
+ /**
2013
+ * Standard cursor-based pagination metadata for list responses
2014
+ */
2015
+ export interface PaginationResponse {
2016
+ /**
2017
+ * Whether more results are available beyond this page
2018
+ */
2019
+ has_more: boolean;
2020
+ /**
2021
+ * Opaque cursor to pass in the next request to fetch the next page. Only present when has_more is true.
2022
+ */
2023
+ cursor?: string;
2024
+ /**
2025
+ * Total number of items matching the query across all pages. Optional because not all backends can efficiently compute this.
2026
+ */
2027
+ total_count?: number;
2028
+ }
2029
+ /**
2030
+ * Opaque correlation data that is echoed unchanged in responses. Used for internal tracking, UI session IDs, trace IDs, and other caller-specific identifiers that don't affect protocol behavior. Context data is never parsed by AdCP agents - it's simply preserved and returned.
2031
+ */
2032
+ /**
2033
+ * Filter by format type (technical categories with distinct requirements)
2034
+ */
2035
+ export type WCAGLevel = 'A' | 'AA' | 'AAA';
2036
+ /**
2037
+ * Request parameters for discovering supported creative formats
2038
+ */
2039
+ export interface ListCreativeFormatsRequest {
2040
+ /**
2041
+ * Return only these specific format IDs (e.g., from get_products response)
2042
+ */
2043
+ format_ids?: FormatID[];
2044
+ type?: FormatCategory;
2045
+ /**
2046
+ * Filter to formats that include these asset types. For third-party tags, search for 'html' or 'javascript'. E.g., ['image', 'text'] returns formats with images and text, ['javascript'] returns formats accepting JavaScript tags.
2047
+ */
2048
+ asset_types?: AssetContentType[];
2049
+ /**
2050
+ * Maximum width in pixels (inclusive). Returns formats where ANY render has width <= this value. For multi-render formats, matches if at least one render fits.
2051
+ */
2052
+ max_width?: number;
2053
+ /**
2054
+ * Maximum height in pixels (inclusive). Returns formats where ANY render has height <= this value. For multi-render formats, matches if at least one render fits.
2055
+ */
2056
+ max_height?: number;
2057
+ /**
2058
+ * Minimum width in pixels (inclusive). Returns formats where ANY render has width >= this value.
2059
+ */
2060
+ min_width?: number;
2061
+ /**
2062
+ * Minimum height in pixels (inclusive). Returns formats where ANY render has height >= this value.
1629
2063
  */
1630
2064
  min_height?: number;
1631
2065
  /**
@@ -1636,6 +2070,8 @@ export interface ListCreativeFormatsRequest {
1636
2070
  * Search for formats by name (case-insensitive partial match)
1637
2071
  */
1638
2072
  name_search?: string;
2073
+ wcag_level?: WCAGLevel;
2074
+ pagination?: PaginationRequest;
1639
2075
  context?: ContextObject;
1640
2076
  ext?: ExtensionObject;
1641
2077
  }
@@ -1643,13 +2079,17 @@ export interface ListCreativeFormatsRequest {
1643
2079
  * Structured format identifier with agent URL and format name. Can reference: (1) a concrete format with fixed dimensions (id only), (2) a template format without parameters (id only), or (3) a template format with parameters (id + dimensions/duration). Template formats accept parameters in format_id while concrete formats have fixed dimensions in their definition. Parameterized format IDs create unique, specific format variants.
1644
2080
  */
1645
2081
  /**
1646
- * Media type of this format - determines rendering method and asset requirements
2082
+ * DEPRECATED: High-level category for this format. Use the assets array to understand creative requirements instead - it provides precise information about what asset types are needed.
1647
2083
  */
1648
2084
  export type FormatIDParameter = 'dimensions' | 'duration';
1649
2085
  /**
1650
- * Capabilities supported by creative agents for format handling
2086
+ * Standardized macro placeholders for dynamic value substitution in creative tracking URLs. Macros are replaced with actual values at impression time. See docs/creative/universal-macros.mdx for detailed documentation.
1651
2087
  */
1652
- export type CreativeAgentCapability = 'validation' | 'assembly' | 'generation' | 'preview';
2088
+ export type UniversalMacro = 'MEDIA_BUY_ID' | 'PACKAGE_ID' | 'CREATIVE_ID' | 'CACHEBUSTER' | 'TIMESTAMP' | 'CLICK_URL' | 'GDPR' | 'GDPR_CONSENT' | 'US_PRIVACY' | 'GPP_STRING' | 'GPP_SID' | 'IP_ADDRESS' | 'LIMIT_AD_TRACKING' | 'DEVICE_TYPE' | 'OS' | 'OS_VERSION' | 'DEVICE_MAKE' | 'DEVICE_MODEL' | 'USER_AGENT' | 'APP_BUNDLE' | 'APP_NAME' | 'COUNTRY' | 'REGION' | 'CITY' | 'ZIP' | 'DMA' | 'LAT' | 'LONG' | 'DEVICE_ID' | 'DEVICE_ID_TYPE' | 'DOMAIN' | 'PAGE_URL' | 'REFERRER' | 'KEYWORDS' | 'PLACEMENT_ID' | 'FOLD_POSITION' | 'AD_WIDTH' | 'AD_HEIGHT' | 'VIDEO_ID' | 'VIDEO_TITLE' | 'VIDEO_DURATION' | 'VIDEO_CATEGORY' | 'CONTENT_GENRE' | 'CONTENT_RATING' | 'PLAYER_WIDTH' | 'PLAYER_HEIGHT' | 'POD_POSITION' | 'POD_SIZE' | 'AD_BREAK_ID' | 'STATION_ID' | 'SHOW_NAME' | 'EPISODE_ID' | 'AUDIO_DURATION' | 'AXEM';
2089
+ /**
2090
+ * WCAG conformance level that this format achieves. For format-rendered creatives, the format guarantees this level. For opaque creatives, the format requires assets that self-certify to this level.
2091
+ */
2092
+ export type CreativeAgentCapability = 'validation' | 'assembly' | 'generation' | 'preview' | 'delivery';
1653
2093
  /**
1654
2094
  * Response payload for list_creative_formats task
1655
2095
  */
@@ -1679,6 +2119,7 @@ export interface ListCreativeFormatsResponse {
1679
2119
  * Task-specific errors and warnings (e.g., format availability issues)
1680
2120
  */
1681
2121
  errors?: Error[];
2122
+ pagination?: PaginationResponse;
1682
2123
  context?: ContextObject;
1683
2124
  ext?: ExtensionObject;
1684
2125
  }
@@ -1699,7 +2140,7 @@ export interface Format {
1699
2140
  * Optional URL to showcase page with examples and interactive demos of this format
1700
2141
  */
1701
2142
  example_url?: string;
1702
- type: FormatCategory;
2143
+ type?: FormatCategory;
1703
2144
  /**
1704
2145
  * List of parameters this format accepts in format_id. Template formats define which parameters (dimensions, duration, etc.) can be specified when instantiating the format. Empty or omitted means this is a concrete format with fixed parameters.
1705
2146
  */
@@ -1745,6 +2186,10 @@ export interface Format {
1745
2186
  * Maximum number of repetitions allowed
1746
2187
  */
1747
2188
  max_count: number;
2189
+ /**
2190
+ * How the platform uses repetitions of this group. 'sequential' means all items display in order (carousels, playlists). 'optimize' means the platform selects the best-performing combination from alternatives (asset group optimization like Meta Advantage+ or Google Pmax).
2191
+ */
2192
+ selection_mode?: 'sequential' | 'optimize';
1748
2193
  /**
1749
2194
  * Assets within each repetition of this group
1750
2195
  */
@@ -1757,9 +2202,9 @@ export interface Format {
1757
2202
  [k: string]: unknown | undefined;
1758
2203
  };
1759
2204
  /**
1760
- * List of universal macros supported by this format (e.g., MEDIA_BUY_ID, CACHEBUSTER, DEVICE_ID). Used for validation and developer tooling.
2205
+ * List of universal macros supported by this format (e.g., MEDIA_BUY_ID, CACHEBUSTER, DEVICE_ID). Used for validation and developer tooling. See docs/creative/universal-macros.mdx for full documentation.
1761
2206
  */
1762
- supported_macros?: string[];
2207
+ supported_macros?: (UniversalMacro | string)[];
1763
2208
  /**
1764
2209
  * For generative formats: array of format IDs that this format can generate. When a format accepts inputs like brand_manifest and message, this specifies what concrete output formats can be produced (e.g., a generative banner format might output standard image banner formats).
1765
2210
  */
@@ -1777,6 +2222,16 @@ export interface Format {
1777
2222
  };
1778
2223
  [k: string]: unknown | undefined;
1779
2224
  };
2225
+ /**
2226
+ * Accessibility posture of this format. Declares the WCAG conformance level that creatives produced by this format will meet.
2227
+ */
2228
+ accessibility?: {
2229
+ wcag_level: WCAGLevel;
2230
+ /**
2231
+ * When true, all assets with x-accessibility fields must include those fields. For inspectable assets (image, video, audio), this means providing accessibility metadata like alt_text or captions. For opaque assets (HTML, JavaScript), this means providing self-declared accessibility properties.
2232
+ */
2233
+ requires_accessible_assets?: boolean;
2234
+ };
1780
2235
  /**
1781
2236
  * Optional detailed card with carousel and full specifications. Provides rich format documentation similar to ad spec pages.
1782
2237
  */
@@ -1790,6 +2245,12 @@ export interface Format {
1790
2245
  };
1791
2246
  [k: string]: unknown | undefined;
1792
2247
  };
2248
+ /**
2249
+ * Metrics this format can produce in delivery reporting. Buyers receive the intersection of format reported_metrics and product available_metrics. If omitted, the format defers entirely to product-level metric declarations.
2250
+ *
2251
+ * @minItems 1
2252
+ */
2253
+ reported_metrics?: [AvailableMetric, ...AvailableMetric[]];
1793
2254
  [k: string]: unknown | undefined;
1794
2255
  }
1795
2256
  /**
@@ -1861,11 +2322,19 @@ export interface FormatID3 {
1861
2322
  */
1862
2323
  export type Pacing = 'even' | 'asap' | 'front_loaded';
1863
2324
  /**
1864
- * Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')
2325
+ * Event type to optimize for (e.g. purchase, lead)
2326
+ */
2327
+ export type MetroAreaSystem1 = 'nielsen_dma' | 'uk_itl1' | 'uk_itl2' | 'eurostat_nuts2' | 'custom';
2328
+ /**
2329
+ * Postal code system (e.g., 'us_zip', 'gb_outward'). System name encodes country and precision.
1865
2330
  */
1866
2331
  export type PostalCodeSystem = 'us_zip' | 'us_zip_plus_four' | 'gb_outward' | 'gb_full' | 'ca_fsa' | 'ca_full' | 'de_plz' | 'fr_code_postal' | 'au_postcode';
1867
2332
  /**
1868
- * Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.
2333
+ * Postal code system (e.g., 'us_zip', 'gb_outward'). System name encodes country and precision.
2334
+ */
2335
+ export type PostalCodeSystem1 = 'us_zip' | 'us_zip_plus_four' | 'gb_outward' | 'gb_full' | 'ca_fsa' | 'ca_full' | 'de_plz' | 'fr_code_postal' | 'au_postcode';
2336
+ /**
2337
+ * Days of the week for daypart targeting
1869
2338
  */
1870
2339
  export type AgeVerificationMethod = 'facial_age_estimation' | 'id_document' | 'digital_id' | 'credit_card' | 'world_id';
1871
2340
  /**
@@ -1901,6 +2370,14 @@ export type VASTAsset = {
1901
2370
  * Tracking events supported by this VAST tag
1902
2371
  */
1903
2372
  tracking_events?: VASTTrackingEvent[];
2373
+ /**
2374
+ * URL to captions file (WebVTT, SRT, etc.)
2375
+ */
2376
+ captions_url?: string;
2377
+ /**
2378
+ * URL to audio description track for visually impaired users
2379
+ */
2380
+ audio_description_url?: string;
1904
2381
  [k: string]: unknown | undefined;
1905
2382
  } | {
1906
2383
  /**
@@ -1924,6 +2401,14 @@ export type VASTAsset = {
1924
2401
  * Tracking events supported by this VAST tag
1925
2402
  */
1926
2403
  tracking_events?: VASTTrackingEvent[];
2404
+ /**
2405
+ * URL to captions file (WebVTT, SRT, etc.)
2406
+ */
2407
+ captions_url?: string;
2408
+ /**
2409
+ * URL to audio description track for visually impaired users
2410
+ */
2411
+ audio_description_url?: string;
1927
2412
  [k: string]: unknown | undefined;
1928
2413
  };
1929
2414
  /**
@@ -1963,6 +2448,10 @@ export type DAASTAsset = {
1963
2448
  * Whether companion display ads are included
1964
2449
  */
1965
2450
  companion_ads?: boolean;
2451
+ /**
2452
+ * URL to text transcript of the audio content
2453
+ */
2454
+ transcript_url?: string;
1966
2455
  [k: string]: unknown | undefined;
1967
2456
  } | {
1968
2457
  /**
@@ -1986,6 +2475,10 @@ export type DAASTAsset = {
1986
2475
  * Whether companion display ads are included
1987
2476
  */
1988
2477
  companion_ads?: boolean;
2478
+ /**
2479
+ * URL to text transcript of the audio content
2480
+ */
2481
+ transcript_url?: string;
1989
2482
  [k: string]: unknown | undefined;
1990
2483
  };
1991
2484
  /**
@@ -2029,7 +2522,7 @@ export interface CreateMediaBuyRequest {
2029
2522
  */
2030
2523
  buyer_ref: string;
2031
2524
  /**
2032
- * Account to bill for this media buy. Optional if the agent has a single account or the seller can determine the account from context (brand + agent). Required if the agent has multiple accounts and the seller cannot route automatically.
2525
+ * Account to bill for this media buy. Required when the agent has access to multiple accounts; when omitted, the seller uses the agent's sole account. The seller maps the agent's brand + operator to an account during sync_accounts; the agent passes that account_id here.
2033
2526
  */
2034
2527
  account_id?: string;
2035
2528
  /**
@@ -2146,56 +2639,191 @@ export interface PackageRequest {
2146
2639
  * Whether this package should be created in a paused state. Paused packages do not deliver impressions. Defaults to false.
2147
2640
  */
2148
2641
  paused?: boolean;
2642
+ optimization_goal?: OptimizationGoal;
2149
2643
  targeting_overlay?: TargetingOverlay;
2150
2644
  /**
2151
2645
  * Assign existing library creatives to this package with optional weights and placement targeting
2646
+ *
2647
+ * @minItems 1
2152
2648
  */
2153
- creative_assignments?: CreativeAssignment[];
2649
+ creative_assignments?: [CreativeAssignment, ...CreativeAssignment[]];
2154
2650
  /**
2155
2651
  * Upload new creative assets and assign to this package (creatives will be added to library). Use creative_assignments instead for existing library creatives.
2156
2652
  *
2653
+ * @minItems 1
2157
2654
  * @maxItems 100
2158
2655
  */
2159
- creatives?: CreativeAsset[];
2656
+ creatives?: [CreativeAsset, ...CreativeAsset[]];
2160
2657
  ext?: ExtensionObject;
2161
2658
  [k: string]: unknown | undefined;
2162
2659
  }
2163
2660
  /**
2164
2661
  * Structured format identifier with agent URL and format name. Can reference: (1) a concrete format with fixed dimensions (id only), (2) a template format without parameters (id only), or (3) a template format with parameters (id + dimensions/duration). Template formats accept parameters in format_id while concrete formats have fixed dimensions in their definition. Parameterized format IDs create unique, specific format variants.
2165
2662
  */
2663
+ export interface OptimizationGoal {
2664
+ /**
2665
+ * Event source to optimize against (must be configured on this account via sync_event_sources)
2666
+ */
2667
+ event_source_id: string;
2668
+ event_type: EventType;
2669
+ /**
2670
+ * Target return on ad spend (e.g. 4.0 = $4 conversion value per $1 spent). Mutually exclusive with target_cpa.
2671
+ */
2672
+ target_roas?: number;
2673
+ /**
2674
+ * Target cost per acquisition in the buy currency. Mutually exclusive with target_roas.
2675
+ */
2676
+ target_cpa?: number;
2677
+ /**
2678
+ * Attribution window for this optimization goal. Values must match an option declared in the seller's conversion_tracking.attribution_windows capability. When omitted, the seller uses their default window.
2679
+ */
2680
+ attribution_window?: {
2681
+ /**
2682
+ * Click-through attribution window (e.g. '7d', '28d', '30d')
2683
+ */
2684
+ click_through: string;
2685
+ /**
2686
+ * View-through attribution window (e.g. '1d', '7d')
2687
+ */
2688
+ view_through?: string;
2689
+ [k: string]: unknown | undefined;
2690
+ };
2691
+ [k: string]: unknown | undefined;
2692
+ }
2693
+ /**
2694
+ * Optional restriction overlays for media buys. Most targeting should be expressed in the brief and handled by the publisher. These fields are for functional restrictions: geographic (RCT testing, regulatory compliance), age verification (alcohol, gambling), device platform (app compatibility), and language (localization).
2695
+ */
2166
2696
  export interface TargetingOverlay {
2167
2697
  /**
2168
2698
  * Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').
2699
+ *
2700
+ * @minItems 1
2701
+ */
2702
+ geo_countries?: [string, ...string[]];
2703
+ /**
2704
+ * Exclude specific countries from delivery. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').
2705
+ *
2706
+ * @minItems 1
2169
2707
  */
2170
- geo_countries?: string[];
2708
+ geo_countries_exclude?: [string, ...string[]];
2171
2709
  /**
2172
2710
  * Restrict delivery to specific regions/states. ISO 3166-2 subdivision codes (e.g., 'US-CA', 'GB-SCT').
2711
+ *
2712
+ * @minItems 1
2713
+ */
2714
+ geo_regions?: [string, ...string[]];
2715
+ /**
2716
+ * Exclude specific regions/states from delivery. ISO 3166-2 subdivision codes (e.g., 'US-CA', 'GB-SCT').
2717
+ *
2718
+ * @minItems 1
2173
2719
  */
2174
- geo_regions?: string[];
2720
+ geo_regions_exclude?: [string, ...string[]];
2175
2721
  /**
2176
2722
  * Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.
2723
+ *
2724
+ * @minItems 1
2177
2725
  */
2178
- geo_metros?: {
2179
- system: MetroAreaSystem;
2180
- /**
2181
- * Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)
2182
- *
2183
- * @minItems 1
2184
- */
2185
- values: [string, ...string[]];
2186
- }[];
2726
+ geo_metros?: [
2727
+ {
2728
+ system: MetroAreaSystem;
2729
+ /**
2730
+ * Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)
2731
+ *
2732
+ * @minItems 1
2733
+ */
2734
+ values: [string, ...string[]];
2735
+ },
2736
+ ...{
2737
+ system: MetroAreaSystem;
2738
+ /**
2739
+ * Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)
2740
+ *
2741
+ * @minItems 1
2742
+ */
2743
+ values: [string, ...string[]];
2744
+ }[]
2745
+ ];
2746
+ /**
2747
+ * Exclude specific metro areas from delivery. Each entry specifies the classification system and excluded values. Seller must declare supported systems in get_adcp_capabilities.
2748
+ *
2749
+ * @minItems 1
2750
+ */
2751
+ geo_metros_exclude?: [
2752
+ {
2753
+ system: MetroAreaSystem1;
2754
+ /**
2755
+ * Metro codes to exclude within the system (e.g., ['501', '602'] for Nielsen DMAs)
2756
+ *
2757
+ * @minItems 1
2758
+ */
2759
+ values: [string, ...string[]];
2760
+ },
2761
+ ...{
2762
+ system: MetroAreaSystem1;
2763
+ /**
2764
+ * Metro codes to exclude within the system (e.g., ['501', '602'] for Nielsen DMAs)
2765
+ *
2766
+ * @minItems 1
2767
+ */
2768
+ values: [string, ...string[]];
2769
+ }[]
2770
+ ];
2187
2771
  /**
2188
2772
  * Restrict delivery to specific postal areas. Each entry specifies the postal system and target values. Seller must declare supported systems in get_adcp_capabilities.
2773
+ *
2774
+ * @minItems 1
2189
2775
  */
2190
- geo_postal_areas?: {
2191
- system: PostalCodeSystem;
2192
- /**
2193
- * Postal codes within the system (e.g., ['10001', '10002'] for us_zip)
2194
- *
2195
- * @minItems 1
2196
- */
2197
- values: [string, ...string[]];
2198
- }[];
2776
+ geo_postal_areas?: [
2777
+ {
2778
+ system: PostalCodeSystem;
2779
+ /**
2780
+ * Postal codes within the system (e.g., ['10001', '10002'] for us_zip)
2781
+ *
2782
+ * @minItems 1
2783
+ */
2784
+ values: [string, ...string[]];
2785
+ },
2786
+ ...{
2787
+ system: PostalCodeSystem;
2788
+ /**
2789
+ * Postal codes within the system (e.g., ['10001', '10002'] for us_zip)
2790
+ *
2791
+ * @minItems 1
2792
+ */
2793
+ values: [string, ...string[]];
2794
+ }[]
2795
+ ];
2796
+ /**
2797
+ * Exclude specific postal areas from delivery. Each entry specifies the postal system and excluded values. Seller must declare supported systems in get_adcp_capabilities.
2798
+ *
2799
+ * @minItems 1
2800
+ */
2801
+ geo_postal_areas_exclude?: [
2802
+ {
2803
+ system: PostalCodeSystem1;
2804
+ /**
2805
+ * Postal codes to exclude within the system (e.g., ['10001', '10002'] for us_zip)
2806
+ *
2807
+ * @minItems 1
2808
+ */
2809
+ values: [string, ...string[]];
2810
+ },
2811
+ ...{
2812
+ system: PostalCodeSystem1;
2813
+ /**
2814
+ * Postal codes to exclude within the system (e.g., ['10001', '10002'] for us_zip)
2815
+ *
2816
+ * @minItems 1
2817
+ */
2818
+ values: [string, ...string[]];
2819
+ }[]
2820
+ ];
2821
+ /**
2822
+ * Restrict delivery to specific time windows. Each entry specifies days of week and an hour range.
2823
+ *
2824
+ * @minItems 1
2825
+ */
2826
+ daypart_targets?: [DaypartTarget, ...DaypartTarget[]];
2199
2827
  /**
2200
2828
  * AXE segment ID to include for targeting
2201
2829
  */
@@ -2220,8 +2848,10 @@ export interface TargetingOverlay {
2220
2848
  verification_required?: boolean;
2221
2849
  /**
2222
2850
  * Accepted verification methods. If omitted, any method the platform supports is acceptable.
2851
+ *
2852
+ * @minItems 1
2223
2853
  */
2224
- accepted_methods?: AgeVerificationMethod[];
2854
+ accepted_methods?: [AgeVerificationMethod, ...AgeVerificationMethod[]];
2225
2855
  };
2226
2856
  /**
2227
2857
  * Restrict to specific platforms. Use for technical compatibility (app only works on iOS). Values from Sec-CH-UA-Platform standard, extended for CTV.
@@ -2238,7 +2868,7 @@ export interface TargetingOverlay {
2238
2868
  [k: string]: unknown | undefined;
2239
2869
  }
2240
2870
  /**
2241
- * Frequency capping settings for package-level application
2871
+ * A time window for daypart targeting. Specifies days of week and an hour range. 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.
2242
2872
  */
2243
2873
  export interface FrequencyCap {
2244
2874
  /**
@@ -2457,6 +3087,18 @@ export interface VideoAsset {
2457
3087
  * True peak level in dBFS
2458
3088
  */
2459
3089
  audio_true_peak_dbfs?: number;
3090
+ /**
3091
+ * URL to captions file (WebVTT, SRT, etc.)
3092
+ */
3093
+ captions_url?: string;
3094
+ /**
3095
+ * URL to text transcript of the video content
3096
+ */
3097
+ transcript_url?: string;
3098
+ /**
3099
+ * URL to audio description track for visually impaired users
3100
+ */
3101
+ audio_description_url?: string;
2460
3102
  [k: string]: unknown | undefined;
2461
3103
  }
2462
3104
  /**
@@ -2507,6 +3149,10 @@ export interface AudioAsset {
2507
3149
  * True peak level in dBFS
2508
3150
  */
2509
3151
  true_peak_dbfs?: number;
3152
+ /**
3153
+ * URL to text transcript of the audio content
3154
+ */
3155
+ transcript_url?: string;
2510
3156
  [k: string]: unknown | undefined;
2511
3157
  }
2512
3158
  /**
@@ -2535,18 +3181,39 @@ export interface HTMLAsset {
2535
3181
  * HTML version (e.g., 'HTML5')
2536
3182
  */
2537
3183
  version?: string;
2538
- [k: string]: unknown | undefined;
2539
- }
2540
- /**
2541
- * CSS stylesheet asset
2542
- */
2543
- export interface CSSAsset {
2544
3184
  /**
2545
- * CSS content
3185
+ * Self-declared accessibility properties for this opaque creative
2546
3186
  */
2547
- content: string;
2548
- /**
2549
- * CSS media query context (e.g., 'screen', 'print')
3187
+ accessibility?: {
3188
+ /**
3189
+ * Text alternative describing the creative content
3190
+ */
3191
+ alt_text?: string;
3192
+ /**
3193
+ * Whether the creative can be fully operated via keyboard
3194
+ */
3195
+ keyboard_navigable?: boolean;
3196
+ /**
3197
+ * Whether the creative respects prefers-reduced-motion or provides pause/stop controls
3198
+ */
3199
+ motion_control?: boolean;
3200
+ /**
3201
+ * Whether the creative has been tested with screen readers
3202
+ */
3203
+ screen_reader_tested?: boolean;
3204
+ };
3205
+ [k: string]: unknown | undefined;
3206
+ }
3207
+ /**
3208
+ * CSS stylesheet asset
3209
+ */
3210
+ export interface CSSAsset {
3211
+ /**
3212
+ * CSS content
3213
+ */
3214
+ content: string;
3215
+ /**
3216
+ * CSS media query context (e.g., 'screen', 'print')
2550
3217
  */
2551
3218
  media?: string;
2552
3219
  [k: string]: unknown | undefined;
@@ -2560,6 +3227,27 @@ export interface JavaScriptAsset {
2560
3227
  */
2561
3228
  content: string;
2562
3229
  module_type?: JavaScriptModuleType;
3230
+ /**
3231
+ * Self-declared accessibility properties for this opaque creative
3232
+ */
3233
+ accessibility?: {
3234
+ /**
3235
+ * Text alternative describing the creative content
3236
+ */
3237
+ alt_text?: string;
3238
+ /**
3239
+ * Whether the creative can be fully operated via keyboard
3240
+ */
3241
+ keyboard_navigable?: boolean;
3242
+ /**
3243
+ * Whether the creative respects prefers-reduced-motion or provides pause/stop controls
3244
+ */
3245
+ motion_control?: boolean;
3246
+ /**
3247
+ * Whether the creative has been tested with screen readers
3248
+ */
3249
+ screen_reader_tested?: boolean;
3250
+ };
2563
3251
  [k: string]: unknown | undefined;
2564
3252
  }
2565
3253
  /**
@@ -2599,28 +3287,6 @@ export interface PromotedOfferings {
2599
3287
  /**
2600
3288
  * Inline brand manifest object
2601
3289
  */
2602
- export interface PromotedProducts {
2603
- /**
2604
- * Direct product SKU references from the brand manifest product catalog
2605
- */
2606
- manifest_skus?: string[];
2607
- /**
2608
- * Select products by tags from the brand manifest product catalog (e.g., 'organic', 'sauces', 'holiday')
2609
- */
2610
- manifest_tags?: string[];
2611
- /**
2612
- * Select products from a specific category in the brand manifest product catalog (e.g., 'beverages/soft-drinks', 'food/sauces')
2613
- */
2614
- manifest_category?: string;
2615
- /**
2616
- * Natural language query to select products from the brand manifest (e.g., 'all Kraft Heinz pasta sauces', 'organic products under $20')
2617
- */
2618
- manifest_query?: string;
2619
- [k: string]: unknown | undefined;
2620
- }
2621
- /**
2622
- * A promotable offering from a brand. Can represent a campaign, product promotion, service, or any other thing the brand wants to make available. Offerings can be promoted via traditional creatives (using portfolio_ref or assets) or conversational SI experiences (via si_agent_url at the promoted-offerings level).
2623
- */
2624
3290
  export interface Offering {
2625
3291
  /**
2626
3292
  * Unique identifier for this offering. Used by hosts to reference specific offerings in si_get_offering calls.
@@ -2768,7 +3434,7 @@ export interface Account {
2768
3434
  */
2769
3435
  account_id: string;
2770
3436
  /**
2771
- * Human-readable account name (e.g., 'Coke', 'Coke c/o Publicis')
3437
+ * Human-readable account name (e.g., 'Acme', 'Acme c/o Pinnacle')
2772
3438
  */
2773
3439
  name: string;
2774
3440
  /**
@@ -2780,9 +3446,25 @@ export interface Account {
2780
3446
  */
2781
3447
  billing_proxy?: string;
2782
3448
  /**
2783
- * Account status
3449
+ * Account status. pending_approval: seller reviewing (credit, contracts). payment_required: credit limit reached or funds depleted. suspended: was active, now paused. closed: terminated.
3450
+ */
3451
+ status: 'active' | 'pending_approval' | 'payment_required' | 'suspended' | 'closed';
3452
+ /**
3453
+ * House domain where brand.json is hosted. Canonical identity anchor for the brand.
3454
+ */
3455
+ house?: string;
3456
+ /**
3457
+ * Brand ID within the house portfolio (from brand.json)
3458
+ */
3459
+ brand_id?: string;
3460
+ /**
3461
+ * Domain of the entity operating this account
3462
+ */
3463
+ operator?: string;
3464
+ /**
3465
+ * Who is invoiced on this account. brand: seller invoices the brand directly. operator: seller invoices the operator (agency). agent: agent consolidates billing.
2784
3466
  */
2785
- status: 'active' | 'suspended' | 'closed';
3467
+ billing?: 'brand' | 'operator' | 'agent';
2786
3468
  /**
2787
3469
  * Identifier for the rate card applied to this account
2788
3470
  */
@@ -2799,6 +3481,7 @@ export interface Account {
2799
3481
  currency: string;
2800
3482
  };
2801
3483
  ext?: ExtensionObject;
3484
+ [k: string]: unknown | undefined;
2802
3485
  }
2803
3486
  /**
2804
3487
  * 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.
@@ -2842,6 +3525,7 @@ export interface Package {
2842
3525
  * Format IDs that creative assets will be provided for this package
2843
3526
  */
2844
3527
  format_ids_to_provide?: FormatID[];
3528
+ optimization_goal?: OptimizationGoal;
2845
3529
  /**
2846
3530
  * Whether this package is paused by the buyer. Paused packages do not deliver impressions. Defaults to false.
2847
3531
  */
@@ -3048,19 +3732,7 @@ export interface ListCreativesRequest {
3048
3732
  field?: CreativeSortField;
3049
3733
  direction?: SortDirection;
3050
3734
  };
3051
- /**
3052
- * Pagination parameters
3053
- */
3054
- pagination?: {
3055
- /**
3056
- * Maximum number of creatives to return
3057
- */
3058
- limit?: number;
3059
- /**
3060
- * Number of creatives to skip
3061
- */
3062
- offset?: number;
3063
- };
3735
+ pagination?: PaginationRequest;
3064
3736
  /**
3065
3737
  * Include package assignment information in response
3066
3738
  */
@@ -3086,24 +3758,34 @@ export interface ListCreativesRequest {
3086
3758
  export interface CreativeFilters {
3087
3759
  /**
3088
3760
  * Filter creatives by owning accounts. Useful for agencies managing multiple client accounts.
3761
+ *
3762
+ * @minItems 1
3089
3763
  */
3090
- account_ids?: string[];
3764
+ account_ids?: [string, ...string[]];
3091
3765
  /**
3092
3766
  * Filter by creative format types (e.g., video, audio, display)
3767
+ *
3768
+ * @minItems 1
3093
3769
  */
3094
- formats?: string[];
3770
+ formats?: [string, ...string[]];
3095
3771
  /**
3096
3772
  * Filter by creative approval statuses
3773
+ *
3774
+ * @minItems 1
3097
3775
  */
3098
- statuses?: CreativeStatus[];
3776
+ statuses?: [CreativeStatus, ...CreativeStatus[]];
3099
3777
  /**
3100
3778
  * Filter by creative tags (all tags must match)
3779
+ *
3780
+ * @minItems 1
3101
3781
  */
3102
- tags?: string[];
3782
+ tags?: [string, ...string[]];
3103
3783
  /**
3104
3784
  * Filter by creative tags (any tag must match)
3785
+ *
3786
+ * @minItems 1
3105
3787
  */
3106
- tags_any?: string[];
3788
+ tags_any?: [string, ...string[]];
3107
3789
  /**
3108
3790
  * Filter by creative names containing this text (case-insensitive)
3109
3791
  */
@@ -3111,9 +3793,10 @@ export interface CreativeFilters {
3111
3793
  /**
3112
3794
  * Filter by specific creative IDs
3113
3795
  *
3796
+ * @minItems 1
3114
3797
  * @maxItems 100
3115
3798
  */
3116
- creative_ids?: string[];
3799
+ creative_ids?: [string, ...string[]];
3117
3800
  /**
3118
3801
  * Filter creatives created after this date (ISO 8601)
3119
3802
  */
@@ -3132,16 +3815,22 @@ export interface CreativeFilters {
3132
3815
  updated_before?: string;
3133
3816
  /**
3134
3817
  * Filter creatives assigned to any of these packages
3818
+ *
3819
+ * @minItems 1
3135
3820
  */
3136
- assigned_to_packages?: string[];
3821
+ assigned_to_packages?: [string, ...string[]];
3137
3822
  /**
3138
3823
  * Filter creatives assigned to any of these media buys
3824
+ *
3825
+ * @minItems 1
3139
3826
  */
3140
- media_buy_ids?: string[];
3827
+ media_buy_ids?: [string, ...string[]];
3141
3828
  /**
3142
3829
  * Filter creatives assigned to media buys with any of these buyer references
3830
+ *
3831
+ * @minItems 1
3143
3832
  */
3144
- buyer_refs?: string[];
3833
+ buyer_refs?: [string, ...string[]];
3145
3834
  /**
3146
3835
  * Filter for unassigned creatives when true, assigned creatives when false
3147
3836
  */
@@ -3153,7 +3842,7 @@ export interface CreativeFilters {
3153
3842
  [k: string]: unknown | undefined;
3154
3843
  }
3155
3844
  /**
3156
- * Opaque correlation data that is echoed unchanged in responses. Used for internal tracking, UI session IDs, trace IDs, and other caller-specific identifiers that don't affect protocol behavior. Context data is never parsed by AdCP agents - it's simply preserved and returned.
3845
+ * Standard cursor-based pagination parameters for list operations
3157
3846
  */
3158
3847
  /**
3159
3848
  * Sort direction for list queries
@@ -3206,11 +3895,11 @@ export interface ListCreativesResponse {
3206
3895
  /**
3207
3896
  * Total number of creatives matching filters (across all pages)
3208
3897
  */
3209
- total_matching: number;
3898
+ total_matching?: number;
3210
3899
  /**
3211
3900
  * Number of creatives returned in this response
3212
3901
  */
3213
- returned: number;
3902
+ returned?: number;
3214
3903
  /**
3215
3904
  * List of filters that were applied to the query
3216
3905
  */
@@ -3223,31 +3912,7 @@ export interface ListCreativesResponse {
3223
3912
  direction?: SortDirection;
3224
3913
  };
3225
3914
  };
3226
- /**
3227
- * Pagination information for navigating results
3228
- */
3229
- pagination: {
3230
- /**
3231
- * Maximum number of results requested
3232
- */
3233
- limit: number;
3234
- /**
3235
- * Number of results skipped
3236
- */
3237
- offset: number;
3238
- /**
3239
- * Whether more results are available
3240
- */
3241
- has_more: boolean;
3242
- /**
3243
- * Total number of pages available
3244
- */
3245
- total_pages?: number;
3246
- /**
3247
- * Current page number (1-based)
3248
- */
3249
- current_page?: number;
3250
- };
3915
+ pagination: PaginationResponse;
3251
3916
  /**
3252
3917
  * Array of creative assets matching the query
3253
3918
  */
@@ -3386,7 +4051,7 @@ export interface ListCreativesResponse {
3386
4051
  ext?: ExtensionObject;
3387
4052
  }
3388
4053
  /**
3389
- * Account that owns this creative
4054
+ * Standard cursor-based pagination metadata for list responses
3390
4055
  */
3391
4056
  /**
3392
4057
  * Request parameters for updating campaign and package settings
@@ -3449,6 +4114,7 @@ export type PackageUpdate = {
3449
4114
  * Pause/resume specific package (true = paused, false = active)
3450
4115
  */
3451
4116
  paused?: boolean;
4117
+ optimization_goal?: OptimizationGoal;
3452
4118
  targeting_overlay?: TargetingOverlay;
3453
4119
  /**
3454
4120
  * Replace creative assignments for this package with optional weights and placement targeting. Uses replacement semantics - omit to leave assignments unchanged.
@@ -3457,9 +4123,10 @@ export type PackageUpdate = {
3457
4123
  /**
3458
4124
  * Upload new creative assets and assign to this package (creatives will be added to library). Use creative_assignments instead for existing library creatives.
3459
4125
  *
4126
+ * @minItems 1
3460
4127
  * @maxItems 100
3461
4128
  */
3462
- creatives?: CreativeAsset[];
4129
+ creatives?: [CreativeAsset, ...CreativeAsset[]];
3463
4130
  ext?: ExtensionObject;
3464
4131
  [k: string]: unknown | undefined;
3465
4132
  } & {
@@ -3517,6 +4184,10 @@ export type MediaBuyStatus = 'pending_activation' | 'active' | 'paused' | 'compl
3517
4184
  * Request parameters for retrieving comprehensive delivery metrics
3518
4185
  */
3519
4186
  export interface GetMediaBuyDeliveryRequest {
4187
+ /**
4188
+ * Filter delivery data to a specific account. When provided, only returns media buys belonging to this account. When omitted, returns data across all accessible accounts. Optional if the agent has a single account.
4189
+ */
4190
+ account_id?: string;
3520
4191
  /**
3521
4192
  * Array of publisher media buy IDs to get delivery data for
3522
4193
  */
@@ -3530,11 +4201,11 @@ export interface GetMediaBuyDeliveryRequest {
3530
4201
  */
3531
4202
  status_filter?: MediaBuyStatus | MediaBuyStatus[];
3532
4203
  /**
3533
- * Start date for reporting period (YYYY-MM-DD)
4204
+ * Start date for reporting period (YYYY-MM-DD). When omitted along with end_date, returns campaign lifetime data. Only accepted when the product's reporting_capabilities.date_range_support is 'date_range'.
3534
4205
  */
3535
4206
  start_date?: string;
3536
4207
  /**
3537
- * End date for reporting period (YYYY-MM-DD)
4208
+ * End date for reporting period (YYYY-MM-DD). When omitted along with start_date, returns campaign lifetime data. Only accepted when the product's reporting_capabilities.date_range_support is 'date_range'.
3538
4209
  */
3539
4210
  end_date?: string;
3540
4211
  context?: ContextObject;
@@ -3543,14 +4214,18 @@ export interface GetMediaBuyDeliveryRequest {
3543
4214
  /**
3544
4215
  * Opaque correlation data that is echoed unchanged in responses. Used for internal tracking, UI session IDs, trace IDs, and other caller-specific identifiers that don't affect protocol behavior. Context data is never parsed by AdCP agents - it's simply preserved and returned.
3545
4216
  */
4217
+ /**
4218
+ * Attribution model used to assign credit when multiple touchpoints exist
4219
+ */
4220
+ export type AttributionModel = 'last_touch' | 'first_touch' | 'linear' | 'time_decay' | 'data_driven';
3546
4221
  /**
3547
4222
  * Pricing model used for this media buy
3548
4223
  */
3549
- export type PricingModel = 'cpm' | 'vcpm' | 'cpc' | 'cpcv' | 'cpv' | 'cpp' | 'flat_rate';
4224
+ export type PricingModel = 'cpm' | 'vcpm' | 'cpc' | 'cpcv' | 'cpv' | 'cpp' | 'cpa' | 'flat_rate' | 'time';
3550
4225
  /**
3551
- * The pricing model used for this package (e.g., cpm, cpcv, cpp). Indicates how the package is billed and which metrics are most relevant for optimization.
4226
+ * The event type
3552
4227
  */
3553
- export type PricingModel1 = 'cpm' | 'vcpm' | 'cpc' | 'cpcv' | 'cpv' | 'cpp' | 'flat_rate';
4228
+ export type PricingModel1 = 'cpm' | 'vcpm' | 'cpc' | 'cpcv' | 'cpv' | 'cpp' | 'cpa' | 'flat_rate' | 'time';
3554
4229
  /**
3555
4230
  * Response payload for get_media_buy_delivery task
3556
4231
  */
@@ -3592,6 +4267,7 @@ export interface GetMediaBuyDeliveryResponse {
3592
4267
  * ISO 4217 currency code
3593
4268
  */
3594
4269
  currency: string;
4270
+ attribution_window?: AttributionWindow;
3595
4271
  /**
3596
4272
  * Combined metrics across all returned media buys. Only included in API responses (get_media_buy_delivery), not in webhook notifications.
3597
4273
  */
@@ -3612,6 +4288,26 @@ export interface GetMediaBuyDeliveryResponse {
3612
4288
  * Total video completions across all media buys (if applicable)
3613
4289
  */
3614
4290
  video_completions?: number;
4291
+ /**
4292
+ * Total conversions across all media buys (if applicable)
4293
+ */
4294
+ conversions?: number;
4295
+ /**
4296
+ * Total conversion value across all media buys (if applicable)
4297
+ */
4298
+ conversion_value?: number;
4299
+ /**
4300
+ * Aggregate return on ad spend across all media buys (total conversion_value / total spend)
4301
+ */
4302
+ roas?: number;
4303
+ /**
4304
+ * Fraction of total conversions across all media buys from first-time brand buyers (weighted by conversion volume, not a simple average of per-buy rates)
4305
+ */
4306
+ new_to_brand_rate?: number;
4307
+ /**
4308
+ * Aggregate cost per conversion across all media buys (total spend / total conversions)
4309
+ */
4310
+ cost_per_acquisition?: number;
3615
4311
  /**
3616
4312
  * Number of media buys included in the response
3617
4313
  */
@@ -3681,6 +4377,19 @@ export interface GetMediaBuyDeliveryResponse {
3681
4377
  * Whether this package is currently paused by the buyer
3682
4378
  */
3683
4379
  paused?: boolean;
4380
+ /**
4381
+ * Metrics broken down by creative within this package. Available when the seller supports creative-level reporting.
4382
+ */
4383
+ by_creative?: (DeliveryMetrics & {
4384
+ /**
4385
+ * Creative identifier matching the creative assignment
4386
+ */
4387
+ creative_id: string;
4388
+ /**
4389
+ * Observed delivery share for this creative within the package during the reporting period, expressed as a percentage (0-100). Reflects actual delivery distribution, not a configured setting.
4390
+ */
4391
+ weight?: number;
4392
+ })[];
3684
4393
  })[];
3685
4394
  /**
3686
4395
  * Day-by-day delivery
@@ -3698,6 +4407,22 @@ export interface GetMediaBuyDeliveryResponse {
3698
4407
  * Daily spend
3699
4408
  */
3700
4409
  spend: number;
4410
+ /**
4411
+ * Daily conversions
4412
+ */
4413
+ conversions?: number;
4414
+ /**
4415
+ * Daily conversion value
4416
+ */
4417
+ conversion_value?: number;
4418
+ /**
4419
+ * Daily return on ad spend (conversion_value / spend)
4420
+ */
4421
+ roas?: number;
4422
+ /**
4423
+ * Daily fraction of conversions from first-time brand buyers (0 = none, 1 = all)
4424
+ */
4425
+ new_to_brand_rate?: number;
3701
4426
  }[];
3702
4427
  }[];
3703
4428
  /**
@@ -3707,6 +4432,21 @@ export interface GetMediaBuyDeliveryResponse {
3707
4432
  context?: ContextObject;
3708
4433
  ext?: ExtensionObject;
3709
4434
  }
4435
+ /**
4436
+ * Attribution methodology and lookback windows used for conversion metrics in this response. All media buys from a single seller share the same attribution methodology. Enables cross-platform comparison (e.g., Amazon 14-day click vs. Criteo 30-day click).
4437
+ */
4438
+ export interface AttributionWindow {
4439
+ /**
4440
+ * Click-through attribution window in days. Conversions occurring within this many days after a click are attributed to the ad.
4441
+ */
4442
+ click_window_days?: number;
4443
+ /**
4444
+ * View-through attribution window in days. Conversions occurring within this many days after an ad impression (without click) are attributed to the ad.
4445
+ */
4446
+ view_window_days?: number;
4447
+ model: AttributionModel;
4448
+ [k: string]: unknown | undefined;
4449
+ }
3710
4450
  /**
3711
4451
  * Standard delivery metrics that can be reported at media buy, package, or creative level
3712
4452
  */
@@ -3740,13 +4480,48 @@ export interface DeliveryMetrics {
3740
4480
  */
3741
4481
  completion_rate?: number;
3742
4482
  /**
3743
- * Conversions (reserved for future CPA pricing support)
4483
+ * Total conversions attributed to this delivery. When by_event_type is present, this equals the sum of all by_event_type[].count entries.
3744
4484
  */
3745
4485
  conversions?: number;
3746
4486
  /**
3747
- * Leads generated (reserved for future CPL pricing support)
4487
+ * Total monetary value of attributed conversions (in the reporting currency)
4488
+ */
4489
+ conversion_value?: number;
4490
+ /**
4491
+ * Return on ad spend (conversion_value / spend)
4492
+ */
4493
+ roas?: number;
4494
+ /**
4495
+ * Cost per conversion (spend / conversions)
4496
+ */
4497
+ cost_per_acquisition?: number;
4498
+ /**
4499
+ * Fraction of conversions from first-time brand buyers (0 = none, 1 = all)
4500
+ */
4501
+ new_to_brand_rate?: number;
4502
+ /**
4503
+ * Leads generated (convenience alias for by_event_type where event_type='lead')
3748
4504
  */
3749
4505
  leads?: number;
4506
+ /**
4507
+ * Conversion metrics broken down by event type. Spend-derived metrics (ROAS, CPA) are only available at the package/totals level since spend cannot be attributed to individual event types.
4508
+ */
4509
+ by_event_type?: {
4510
+ event_type: EventType;
4511
+ /**
4512
+ * Event source that produced these conversions (for disambiguation when multiple event sources are configured)
4513
+ */
4514
+ event_source_id?: string;
4515
+ /**
4516
+ * Number of events of this type
4517
+ */
4518
+ count: number;
4519
+ /**
4520
+ * Total monetary value of events of this type
4521
+ */
4522
+ value?: number;
4523
+ [k: string]: unknown | undefined;
4524
+ }[];
3750
4525
  /**
3751
4526
  * Gross Rating Points delivered (for CPP)
3752
4527
  */
@@ -3836,6 +4611,55 @@ export interface DeliveryMetrics {
3836
4611
  }[];
3837
4612
  [k: string]: unknown | undefined;
3838
4613
  };
4614
+ /**
4615
+ * Viewability metrics. Viewable rate should be calculated as viewable_impressions / measurable_impressions (not total impressions), since some environments cannot measure viewability.
4616
+ */
4617
+ viewability?: {
4618
+ /**
4619
+ * Impressions where viewability could be measured. Excludes environments without measurement capability (e.g., non-Intersection Observer browsers, certain app environments).
4620
+ */
4621
+ measurable_impressions?: number;
4622
+ /**
4623
+ * Impressions that met the viewability threshold defined by the measurement standard.
4624
+ */
4625
+ viewable_impressions?: number;
4626
+ /**
4627
+ * Viewable impression rate (viewable_impressions / measurable_impressions). Range 0.0 to 1.0.
4628
+ */
4629
+ viewable_rate?: number;
4630
+ /**
4631
+ * Viewability measurement standard. 'mrc': 50% of pixels in view for 1 second (display) or 2 seconds (video), per MRC/IAB guidelines. 'groupm': 100% of pixels in view for the same durations. These are materially different thresholds and should not be compared across standards.
4632
+ */
4633
+ standard?: 'mrc' | 'groupm';
4634
+ [k: string]: unknown | undefined;
4635
+ };
4636
+ /**
4637
+ * Platform-specific engagement rate (0.0 to 1.0). Definition varies by platform (e.g., likes+comments+shares/impressions on social, interactions/impressions on rich media).
4638
+ */
4639
+ engagement_rate?: number;
4640
+ /**
4641
+ * Cost per click (spend / clicks)
4642
+ */
4643
+ cost_per_click?: number;
4644
+ /**
4645
+ * Conversion metrics broken down by action source (website, app, in_store, etc.). Useful for omnichannel sellers where conversions occur across digital and physical channels.
4646
+ */
4647
+ by_action_source?: {
4648
+ action_source: ActionSource;
4649
+ /**
4650
+ * Event source that produced these conversions (for disambiguation when multiple event sources are configured)
4651
+ */
4652
+ event_source_id?: string;
4653
+ /**
4654
+ * Number of conversions from this action source
4655
+ */
4656
+ count: number;
4657
+ /**
4658
+ * Total monetary value of conversions from this action source
4659
+ */
4660
+ value?: number;
4661
+ [k: string]: unknown | undefined;
4662
+ }[];
3839
4663
  [k: string]: unknown | undefined;
3840
4664
  }
3841
4665
  /**
@@ -3926,71 +4750,420 @@ export interface ProvidePerformanceFeedbackError {
3926
4750
  * Standard error structure for task-specific errors and warnings
3927
4751
  */
3928
4752
  /**
3929
- * VAST (Video Ad Serving Template) tag for third-party video ad serving
3930
- */
3931
- export type HTTPMethod = 'GET' | 'POST';
3932
- /**
3933
- * Expected content type of webhook response
3934
- */
3935
- export type WebhookResponseType = 'html' | 'json' | 'xml' | 'javascript';
3936
- /**
3937
- * Authentication method
3938
- */
3939
- export type WebhookSecurityMethod = 'hmac_sha256' | 'api_key' | 'none';
3940
- /**
3941
- * DAAST (Digital Audio Ad Serving Template) tag for third-party audio ad serving
4753
+ * Standard marketing event types for event logging, aligned with IAB ECAPI
3942
4754
  */
3943
- export interface BuildCreativeRequest {
4755
+ export interface SyncEventSourcesRequest {
3944
4756
  /**
3945
- * Natural language instructions for the transformation or generation. For pure generation, this is the creative brief. For transformation, this provides guidance on how to adapt the creative.
4757
+ * Account to configure event sources for
3946
4758
  */
3947
- message?: string;
3948
- creative_manifest?: CreativeManifest;
3949
- target_format_id: FormatID1;
3950
- context?: ContextObject;
3951
- ext?: ExtensionObject;
3952
- }
3953
- /**
3954
- * Creative manifest to transform or generate from. For pure generation, this should include the target format_id and any required input assets (e.g., promoted_offerings for generative formats). For transformation (e.g., resizing, reformatting), this is the complete creative to adapt.
3955
- */
3956
- export interface CreativeManifest {
3957
- format_id: FormatID;
4759
+ account_id: string;
3958
4760
  /**
3959
- * Product name or offering being advertised. Maps to promoted_offerings in create_media_buy request to associate creative with the product being promoted.
4761
+ * Event sources to sync (create or update). When omitted, the call is discovery-only and returns all existing event sources on the account without modification.
3960
4762
  */
3961
- promoted_offering?: string;
4763
+ event_sources?: {
4764
+ /**
4765
+ * Unique identifier for this event source
4766
+ */
4767
+ event_source_id: string;
4768
+ /**
4769
+ * Human-readable name for this event source
4770
+ */
4771
+ name?: string;
4772
+ /**
4773
+ * Event types this source handles (e.g. purchase, lead). If omitted, accepts all event types.
4774
+ */
4775
+ event_types?: EventType[];
4776
+ /**
4777
+ * Domains authorized to send events for this event source
4778
+ */
4779
+ allowed_domains?: string[];
4780
+ }[];
3962
4781
  /**
3963
- * Map of asset IDs to actual asset content. Each key MUST match an asset_id from the format's assets array (e.g., 'banner_image', 'clickthrough_url', 'video_file', 'vast_tag'). The asset_id is the technical identifier used to match assets to format requirements.
3964
- *
3965
- * IMPORTANT: Creative manifest validation MUST be performed in the context of the format specification. The format defines what type each asset_id should be, which eliminates any validation ambiguity.
4782
+ * When true, event sources not included in this sync will be removed
3966
4783
  */
3967
- assets: {
3968
- [k: string]: unknown | undefined;
3969
- };
4784
+ delete_missing?: boolean;
4785
+ context?: ContextObject;
3970
4786
  ext?: ExtensionObject;
3971
- [k: string]: unknown | undefined;
3972
4787
  }
3973
4788
  /**
3974
- * Format identifier this manifest is for. Can be a template format (id only) or a deterministic format (id + dimensions/duration). For dimension-specific creatives, include width/height/unit in the format_id to create a unique identifier (e.g., {id: 'display_static', width: 300, height: 250, unit: 'px'}).
4789
+ * Opaque correlation data that is echoed unchanged in responses. Used for internal tracking, UI session IDs, trace IDs, and other caller-specific identifiers that don't affect protocol behavior. Context data is never parsed by AdCP agents - it's simply preserved and returned.
3975
4790
  */
3976
- export interface WebhookAsset {
3977
- /**
3978
- * Webhook URL to call for dynamic content
3979
- */
3980
- url: string;
3981
- method?: HTTPMethod;
4791
+ /**
4792
+ * Response from event source sync operation. Returns either per-source results OR operation-level errors.
4793
+ */
4794
+ export type SyncEventSourcesResponse = SyncEventSourcesSuccess | SyncEventSourcesError;
4795
+ /**
4796
+ * Standard marketing event types for event logging, aligned with IAB ECAPI
4797
+ */
4798
+ export interface SyncEventSourcesSuccess {
3982
4799
  /**
3983
- * Maximum time to wait for response in milliseconds
4800
+ * Results for each event source, including both synced and seller-managed sources on the account
4801
+ */
4802
+ event_sources: {
4803
+ /**
4804
+ * Event source ID from the request
4805
+ */
4806
+ event_source_id: string;
4807
+ /**
4808
+ * Name of the event source
4809
+ */
4810
+ name?: string;
4811
+ /**
4812
+ * Seller-assigned identifier for this event source (the ID in the seller's ad platform)
4813
+ */
4814
+ seller_id?: string;
4815
+ /**
4816
+ * Event types this source handles
4817
+ */
4818
+ event_types?: EventType[];
4819
+ action_source?: ActionSource;
4820
+ /**
4821
+ * Who manages this event source. 'buyer' = configured via this sync. 'seller' = always-on, managed by the seller (e.g. Amazon sales attribution for Amazon advertisers).
4822
+ */
4823
+ managed_by?: 'buyer' | 'seller';
4824
+ /**
4825
+ * Implementation details for activating this event source (e.g. JavaScript tag, pixel URL)
4826
+ */
4827
+ setup?: {
4828
+ /**
4829
+ * Code snippet to place on the site (JavaScript, HTML pixel, etc.)
4830
+ */
4831
+ snippet?: string;
4832
+ /**
4833
+ * Type of implementation. 'server_only' means no client-side tag is needed.
4834
+ */
4835
+ snippet_type?: 'javascript' | 'html' | 'pixel_url' | 'server_only';
4836
+ /**
4837
+ * Human/agent-readable setup instructions
4838
+ */
4839
+ instructions?: string;
4840
+ };
4841
+ /**
4842
+ * Action taken for this event source
4843
+ */
4844
+ action: 'created' | 'updated' | 'unchanged' | 'deleted' | 'failed';
4845
+ /**
4846
+ * Errors for this event source (only present when action='failed')
4847
+ */
4848
+ errors?: string[];
4849
+ }[];
4850
+ context?: ContextObject;
4851
+ ext?: ExtensionObject;
4852
+ }
4853
+ /**
4854
+ * Opaque correlation data that is echoed unchanged in responses. Used for internal tracking, UI session IDs, trace IDs, and other caller-specific identifiers that don't affect protocol behavior. Context data is never parsed by AdCP agents - it's simply preserved and returned.
4855
+ */
4856
+ export interface SyncEventSourcesError {
4857
+ /**
4858
+ * Operation-level errors that prevented processing
4859
+ */
4860
+ errors: Error[];
4861
+ context?: ContextObject;
4862
+ ext?: ExtensionObject;
4863
+ }
4864
+ /**
4865
+ * Standard error structure for task-specific errors and warnings
4866
+ */
4867
+ /**
4868
+ * Standard event type
4869
+ */
4870
+ export type UserMatch = {
4871
+ [k: string]: unknown | undefined;
4872
+ } & {
4873
+ /**
4874
+ * Universal ID values for user matching
4875
+ *
4876
+ * @minItems 1
4877
+ */
4878
+ uids?: [
4879
+ {
4880
+ type: UIDType;
4881
+ /**
4882
+ * Universal ID value
4883
+ */
4884
+ value: string;
4885
+ [k: string]: unknown | undefined;
4886
+ },
4887
+ ...{
4888
+ type: UIDType;
4889
+ /**
4890
+ * Universal ID value
4891
+ */
4892
+ value: string;
4893
+ [k: string]: unknown | undefined;
4894
+ }[]
4895
+ ];
4896
+ /**
4897
+ * SHA-256 hash of lowercase, trimmed email address. Buyer must normalize before hashing: lowercase, trim whitespace.
4898
+ */
4899
+ hashed_email?: string;
4900
+ /**
4901
+ * SHA-256 hash of E.164-formatted phone number (e.g. +12065551234). Buyer must normalize to E.164 before hashing.
4902
+ */
4903
+ hashed_phone?: string;
4904
+ /**
4905
+ * Platform click identifier (fbclid, gclid, ttclid, ScCid, etc.)
4906
+ */
4907
+ click_id?: string;
4908
+ /**
4909
+ * Type of click identifier (e.g. fbclid, gclid, ttclid, msclkid, ScCid)
4910
+ */
4911
+ click_id_type?: string;
4912
+ /**
4913
+ * Client IP address for probabilistic matching
4914
+ */
4915
+ client_ip?: string;
4916
+ /**
4917
+ * Client user agent string for probabilistic matching
4918
+ */
4919
+ client_user_agent?: string;
4920
+ ext?: ExtensionObject;
4921
+ [k: string]: unknown | undefined;
4922
+ };
4923
+ /**
4924
+ * Universal ID type
4925
+ */
4926
+ export type UIDType = 'rampid' | 'id5' | 'uid2' | 'euid' | 'pairid' | 'external_id' | 'maid' | 'other';
4927
+ /**
4928
+ * Where the event originated
4929
+ */
4930
+ export interface LogEventRequest {
4931
+ /**
4932
+ * Event source configured on the account via sync_event_sources
4933
+ */
4934
+ event_source_id: string;
4935
+ /**
4936
+ * Test event code for validation without affecting production data. Events with this code appear in the platform's test events UI.
4937
+ */
4938
+ test_event_code?: string;
4939
+ /**
4940
+ * Events to log
4941
+ *
4942
+ * @maxItems 10000
4943
+ */
4944
+ events: Event[];
4945
+ context?: ContextObject;
4946
+ ext?: ExtensionObject;
4947
+ }
4948
+ /**
4949
+ * A marketing event (conversion, engagement, or custom) for attribution and optimization
4950
+ */
4951
+ export interface Event {
4952
+ /**
4953
+ * Unique identifier for deduplication (scoped to event_type + event_source_id)
4954
+ */
4955
+ event_id: string;
4956
+ event_type: EventType;
4957
+ /**
4958
+ * ISO 8601 timestamp when the event occurred
4959
+ */
4960
+ event_time: string;
4961
+ user_match?: UserMatch;
4962
+ custom_data?: EventCustomData;
4963
+ action_source?: ActionSource;
4964
+ /**
4965
+ * URL where the event occurred (required when action_source is 'website')
4966
+ */
4967
+ event_source_url?: string;
4968
+ /**
4969
+ * Name for custom events (used when event_type is 'custom')
4970
+ */
4971
+ custom_event_name?: string;
4972
+ ext?: ExtensionObject;
4973
+ [k: string]: unknown | undefined;
4974
+ }
4975
+ /**
4976
+ * 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.
4977
+ */
4978
+ export interface EventCustomData {
4979
+ /**
4980
+ * Monetary value of the event (should be accompanied by currency)
4981
+ */
4982
+ value?: number;
4983
+ /**
4984
+ * ISO 4217 currency code
4985
+ */
4986
+ currency?: string;
4987
+ /**
4988
+ * Unique order or transaction identifier
4989
+ */
4990
+ order_id?: string;
4991
+ /**
4992
+ * Product or content identifiers
4993
+ */
4994
+ content_ids?: string[];
4995
+ /**
4996
+ * Category of content (product, service, etc.)
4997
+ */
4998
+ content_type?: string;
4999
+ /**
5000
+ * Name of the product or content
5001
+ */
5002
+ content_name?: string;
5003
+ /**
5004
+ * Category of the product or content
5005
+ */
5006
+ content_category?: string;
5007
+ /**
5008
+ * Number of items in the event
5009
+ */
5010
+ num_items?: number;
5011
+ /**
5012
+ * Search query for search events
5013
+ */
5014
+ search_string?: string;
5015
+ /**
5016
+ * Per-item details for e-commerce events
5017
+ */
5018
+ contents?: {
5019
+ /**
5020
+ * Product or content identifier
5021
+ */
5022
+ id: string;
5023
+ /**
5024
+ * Quantity of this item
5025
+ */
5026
+ quantity?: number;
5027
+ /**
5028
+ * Price per unit of this item
5029
+ */
5030
+ price?: number;
5031
+ /**
5032
+ * Brand name of this item
5033
+ */
5034
+ brand?: string;
5035
+ [k: string]: unknown | undefined;
5036
+ }[];
5037
+ ext?: ExtensionObject;
5038
+ [k: string]: unknown | undefined;
5039
+ }
5040
+ /**
5041
+ * Opaque correlation data that is echoed unchanged in responses. Used for internal tracking, UI session IDs, trace IDs, and other caller-specific identifiers that don't affect protocol behavior. Context data is never parsed by AdCP agents - it's simply preserved and returned.
5042
+ */
5043
+ /**
5044
+ * Response from event logging operation. Returns either event processing results OR operation-level errors.
5045
+ */
5046
+ export type LogEventResponse = LogEventSuccess | LogEventError;
5047
+ /**
5048
+ * Success response - events received and queued for processing
5049
+ */
5050
+ export interface LogEventSuccess {
5051
+ /**
5052
+ * Number of events received
5053
+ */
5054
+ events_received: number;
5055
+ /**
5056
+ * Number of events successfully queued for processing
5057
+ */
5058
+ events_processed: number;
5059
+ /**
5060
+ * Events that failed validation
5061
+ */
5062
+ partial_failures?: {
5063
+ /**
5064
+ * ID of the failed event
5065
+ */
5066
+ event_id: string;
5067
+ /**
5068
+ * Error code
5069
+ */
5070
+ code: string;
5071
+ /**
5072
+ * Human-readable error message
5073
+ */
5074
+ message: string;
5075
+ }[];
5076
+ /**
5077
+ * Non-fatal issues (low match quality, missing recommended fields, deprecation notices)
5078
+ */
5079
+ warnings?: string[];
5080
+ /**
5081
+ * Overall match quality score for the batch (0.0 = no matches, 1.0 = all matched)
5082
+ */
5083
+ match_quality?: number;
5084
+ context?: ContextObject;
5085
+ ext?: ExtensionObject;
5086
+ }
5087
+ /**
5088
+ * Opaque correlation data that is echoed unchanged in responses. Used for internal tracking, UI session IDs, trace IDs, and other caller-specific identifiers that don't affect protocol behavior. Context data is never parsed by AdCP agents - it's simply preserved and returned.
5089
+ */
5090
+ export interface LogEventError {
5091
+ /**
5092
+ * Operation-level errors
5093
+ */
5094
+ errors: Error[];
5095
+ context?: ContextObject;
5096
+ ext?: ExtensionObject;
5097
+ }
5098
+ /**
5099
+ * Standard error structure for task-specific errors and warnings
5100
+ */
5101
+ /**
5102
+ * VAST (Video Ad Serving Template) tag for third-party video ad serving
5103
+ */
5104
+ export type HTTPMethod = 'GET' | 'POST';
5105
+ /**
5106
+ * Standardized macro placeholders for dynamic value substitution in creative tracking URLs. Macros are replaced with actual values at impression time. See docs/creative/universal-macros.mdx for detailed documentation.
5107
+ */
5108
+ export type WebhookResponseType = 'html' | 'json' | 'xml' | 'javascript';
5109
+ /**
5110
+ * Authentication method
5111
+ */
5112
+ export type WebhookSecurityMethod = 'hmac_sha256' | 'api_key' | 'none';
5113
+ /**
5114
+ * DAAST (Digital Audio Ad Serving Template) tag for third-party audio ad serving
5115
+ */
5116
+ export interface BuildCreativeRequest {
5117
+ /**
5118
+ * Natural language instructions for the transformation or generation. For pure generation, this is the creative brief. For transformation, this provides guidance on how to adapt the creative.
5119
+ */
5120
+ message?: string;
5121
+ creative_manifest?: CreativeManifest;
5122
+ target_format_id: FormatID1;
5123
+ context?: ContextObject;
5124
+ ext?: ExtensionObject;
5125
+ }
5126
+ /**
5127
+ * Creative manifest to transform or generate from. For pure generation, this should include the target format_id and any required input assets (e.g., promoted_offerings for generative formats). For transformation (e.g., resizing, reformatting), this is the complete creative to adapt.
5128
+ */
5129
+ export interface CreativeManifest {
5130
+ format_id: FormatID;
5131
+ /**
5132
+ * Product name or offering being advertised. Maps to promoted_offerings in create_media_buy request to associate creative with the product being promoted.
5133
+ */
5134
+ promoted_offering?: string;
5135
+ /**
5136
+ * Map of asset IDs to actual asset content. Each key MUST match an asset_id from the format's assets array (e.g., 'banner_image', 'clickthrough_url', 'video_file', 'vast_tag'). The asset_id is the technical identifier used to match assets to format requirements.
5137
+ *
5138
+ * IMPORTANT: Full validation requires format context. The format defines what type each asset_id should be. Standalone schema validation only checks structural conformance — each asset must match at least one valid asset type schema.
5139
+ */
5140
+ assets: {
5141
+ [k: string]: unknown | undefined;
5142
+ };
5143
+ ext?: ExtensionObject;
5144
+ [k: string]: unknown | undefined;
5145
+ }
5146
+ /**
5147
+ * Format identifier this manifest is for. Can be a template format (id only) or a deterministic format (id + dimensions/duration). For dimension-specific creatives, include width/height/unit in the format_id to create a unique identifier (e.g., {id: 'display_static', width: 300, height: 250, unit: 'px'}).
5148
+ */
5149
+ export interface WebhookAsset {
5150
+ /**
5151
+ * Webhook URL to call for dynamic content
5152
+ */
5153
+ url: string;
5154
+ method?: HTTPMethod;
5155
+ /**
5156
+ * Maximum time to wait for response in milliseconds
3984
5157
  */
3985
5158
  timeout_ms?: number;
3986
5159
  /**
3987
- * Universal macros that can be passed to webhook (e.g., {DEVICE_TYPE}, {COUNTRY})
5160
+ * Universal macros that can be passed to webhook (e.g., DEVICE_TYPE, COUNTRY). See docs/creative/universal-macros.mdx for full list.
3988
5161
  */
3989
- supported_macros?: string[];
5162
+ supported_macros?: (UniversalMacro | string)[];
3990
5163
  /**
3991
5164
  * Universal macros that must be provided for webhook to function
3992
5165
  */
3993
- required_macros?: string[];
5166
+ required_macros?: (UniversalMacro | string)[];
3994
5167
  response_type: WebhookResponseType;
3995
5168
  /**
3996
5169
  * Security configuration for webhook calls
@@ -4045,7 +5218,7 @@ export type PreviewCreativeRequest = {
4045
5218
  * Discriminator indicating this is a single preview request
4046
5219
  */
4047
5220
  request_type: 'single';
4048
- format_id: FormatID;
5221
+ format_id?: FormatID;
4049
5222
  creative_manifest: CreativeManifest;
4050
5223
  /**
4051
5224
  * Array of input sets for generating multiple preview variants. Each input set defines macros and context values for one preview rendering. If not provided, creative agent will generate default previews.
@@ -4084,7 +5257,7 @@ export type PreviewCreativeRequest = {
4084
5257
  * @maxItems 50
4085
5258
  */
4086
5259
  requests: {
4087
- format_id: FormatID2;
5260
+ format_id?: FormatID2;
4088
5261
  creative_manifest: CreativeManifest1;
4089
5262
  /**
4090
5263
  * Array of input sets for generating multiple preview variants
@@ -4114,6 +5287,22 @@ export type PreviewCreativeRequest = {
4114
5287
  output_format?: PreviewOutputFormat2;
4115
5288
  context?: ContextObject;
4116
5289
  ext?: ExtensionObject;
5290
+ } | {
5291
+ /**
5292
+ * Discriminator indicating this is a variant preview request
5293
+ */
5294
+ request_type: 'variant';
5295
+ /**
5296
+ * Platform-assigned variant identifier from get_creative_delivery response
5297
+ */
5298
+ variant_id: string;
5299
+ /**
5300
+ * Creative identifier for context
5301
+ */
5302
+ creative_id?: string;
5303
+ output_format?: PreviewOutputFormat3;
5304
+ context?: ContextObject;
5305
+ ext?: ExtensionObject;
4117
5306
  };
4118
5307
  /**
4119
5308
  * VAST (Video Ad Serving Template) tag for third-party video ad serving
@@ -4128,7 +5317,11 @@ export type PreviewOutputFormat1 = 'url' | 'html';
4128
5317
  */
4129
5318
  export type PreviewOutputFormat2 = 'url' | 'html';
4130
5319
  /**
4131
- * Format identifier for rendering the preview
5320
+ * Output format for the preview. 'url' returns preview_url (iframe-embeddable URL), 'html' returns preview_html (raw HTML for direct embedding).
5321
+ */
5322
+ export type PreviewOutputFormat3 = 'url' | 'html';
5323
+ /**
5324
+ * Format identifier for rendering the preview. Optional — defaults to creative_manifest.format_id if omitted.
4132
5325
  */
4133
5326
  export interface CreativeManifest1 {
4134
5327
  format_id: FormatID1;
@@ -4139,7 +5332,7 @@ export interface CreativeManifest1 {
4139
5332
  /**
4140
5333
  * Map of asset IDs to actual asset content. Each key MUST match an asset_id from the format's assets array (e.g., 'banner_image', 'clickthrough_url', 'video_file', 'vast_tag'). The asset_id is the technical identifier used to match assets to format requirements.
4141
5334
  *
4142
- * IMPORTANT: Creative manifest validation MUST be performed in the context of the format specification. The format defines what type each asset_id should be, which eliminates any validation ambiguity.
5335
+ * IMPORTANT: Full validation requires format context. The format defines what type each asset_id should be. Standalone schema validation only checks structural conformance — each asset must match at least one valid asset type schema.
4143
5336
  */
4144
5337
  assets: {
4145
5338
  [k: string]: unknown | undefined;
@@ -4150,7 +5343,7 @@ export interface CreativeManifest1 {
4150
5343
  /**
4151
5344
  * Response containing preview links for one or more creatives. Format matches the request: single preview response for single requests, batch results for batch requests.
4152
5345
  */
4153
- export type PreviewCreativeResponse = PreviewCreativeSingleResponse | PreviewCreativeBatchResponse;
5346
+ export type PreviewCreativeResponse = PreviewCreativeSingleResponse | PreviewCreativeBatchResponse | PreviewCreativeVariantResponse;
4154
5347
  /**
4155
5348
  * A single rendered piece of a creative preview with discriminated output format
4156
5349
  */
@@ -4298,7 +5491,7 @@ export type PreviewRender = {
4298
5491
  [k: string]: unknown | undefined;
4299
5492
  };
4300
5493
  /**
4301
- * Single preview response - each preview URL returns an HTML page that can be embedded in an iframe
5494
+ * VAST (Video Ad Serving Template) tag for third-party video ad serving
4302
5495
  */
4303
5496
  export interface PreviewCreativeSingleResponse {
4304
5497
  /**
@@ -4349,26 +5542,470 @@ export interface PreviewCreativeSingleResponse {
4349
5542
  ext?: ExtensionObject;
4350
5543
  }
4351
5544
  /**
4352
- * Opaque correlation data that is echoed unchanged in responses. Used for internal tracking, UI session IDs, trace IDs, and other caller-specific identifiers that don't affect protocol behavior. Context data is never parsed by AdCP agents - it's simply preserved and returned.
5545
+ * Opaque correlation data that is echoed unchanged in responses. Used for internal tracking, UI session IDs, trace IDs, and other caller-specific identifiers that don't affect protocol behavior. Context data is never parsed by AdCP agents - it's simply preserved and returned.
5546
+ */
5547
+ export interface PreviewCreativeBatchResponse {
5548
+ /**
5549
+ * Discriminator indicating this is a batch preview response
5550
+ */
5551
+ response_type: 'batch';
5552
+ /**
5553
+ * Array of preview results corresponding to each request in the same order. results[0] is the result for requests[0], results[1] for requests[1], etc. Order is guaranteed even when some requests fail. Each result contains either a successful preview response or an error.
5554
+ */
5555
+ results: (PreviewBatchResultSuccess | PreviewBatchResultError)[];
5556
+ context?: ContextObject;
5557
+ ext?: ExtensionObject;
5558
+ }
5559
+ export interface PreviewBatchResultSuccess {
5560
+ success?: true;
5561
+ }
5562
+ export interface PreviewBatchResultError {
5563
+ success?: false;
5564
+ }
5565
+ /**
5566
+ * Variant preview response - shows what a specific creative variant looked like when served during delivery
5567
+ */
5568
+ export interface PreviewCreativeVariantResponse {
5569
+ /**
5570
+ * Discriminator indicating this is a variant preview response
5571
+ */
5572
+ response_type: 'variant';
5573
+ /**
5574
+ * Platform-assigned variant identifier
5575
+ */
5576
+ variant_id: string;
5577
+ /**
5578
+ * Creative identifier this variant belongs to
5579
+ */
5580
+ creative_id?: string;
5581
+ /**
5582
+ * Array of rendered pieces for this variant. Most formats render as a single piece.
5583
+ */
5584
+ previews: {
5585
+ /**
5586
+ * Unique identifier for this preview
5587
+ */
5588
+ preview_id: string;
5589
+ /**
5590
+ * Rendered pieces for this variant
5591
+ */
5592
+ renders: PreviewRender[];
5593
+ }[];
5594
+ manifest?: CreativeManifest;
5595
+ /**
5596
+ * ISO 8601 timestamp when preview links expire
5597
+ */
5598
+ expires_at?: string;
5599
+ context?: ContextObject;
5600
+ ext?: ExtensionObject;
5601
+ }
5602
+ /**
5603
+ * The rendered creative manifest for this variant — the actual output that was served, not the input assets
5604
+ */
5605
+ /**
5606
+ * Request parameters for retrieving creative delivery data including variant-level metrics from a creative agent. At least one scoping filter (media_buy_ids, media_buy_buyer_refs, or creative_ids) is required.
5607
+ */
5608
+ export type GetCreativeDeliveryRequest = {
5609
+ [k: string]: unknown | undefined;
5610
+ } & {
5611
+ /**
5612
+ * Account context for routing and scoping. Limits results to creatives within this account. Optional if the agent has a single account or can determine routing from the media buy identifiers.
5613
+ */
5614
+ account_id?: string;
5615
+ /**
5616
+ * Filter to specific media buys by publisher ID. If omitted, returns creative delivery across all matching media buys.
5617
+ */
5618
+ media_buy_ids?: string[];
5619
+ /**
5620
+ * Filter to specific media buys by buyer reference ID. Alternative to media_buy_ids when the buyer doesn't have the publisher's identifiers.
5621
+ */
5622
+ media_buy_buyer_refs?: string[];
5623
+ /**
5624
+ * Filter to specific creatives by ID. If omitted, returns delivery for all creatives matching the other filters.
5625
+ */
5626
+ creative_ids?: string[];
5627
+ /**
5628
+ * Start date for delivery period (YYYY-MM-DD). Interpreted in the platform's reporting timezone.
5629
+ */
5630
+ start_date?: string;
5631
+ /**
5632
+ * End date for delivery period (YYYY-MM-DD). Interpreted in the platform's reporting timezone.
5633
+ */
5634
+ end_date?: string;
5635
+ /**
5636
+ * Maximum number of variants to return per creative. When omitted, the agent returns all variants. Use this to limit response size for generative creatives that may produce large numbers of variants.
5637
+ */
5638
+ max_variants?: number;
5639
+ /**
5640
+ * Pagination parameters for the creatives array in the response. When omitted, the agent returns all matching creatives.
5641
+ */
5642
+ pagination?: {
5643
+ /**
5644
+ * Maximum number of creatives to return
5645
+ */
5646
+ limit?: number;
5647
+ /**
5648
+ * Number of creatives to skip
5649
+ */
5650
+ offset?: number;
5651
+ };
5652
+ context?: ContextObject;
5653
+ ext?: ExtensionObject;
5654
+ };
5655
+ /**
5656
+ * Opaque correlation data that is echoed unchanged in responses. Used for internal tracking, UI session IDs, trace IDs, and other caller-specific identifiers that don't affect protocol behavior. Context data is never parsed by AdCP agents - it's simply preserved and returned.
5657
+ */
5658
+ /**
5659
+ * The event type
5660
+ */
5661
+ export type CreativeVariant = DeliveryMetrics1 & {
5662
+ /**
5663
+ * Platform-assigned identifier for this variant
5664
+ */
5665
+ variant_id: string;
5666
+ manifest?: CreativeManifest;
5667
+ /**
5668
+ * Input signals that triggered generation of this variant (Tier 3). Describes why the platform created this specific variant. Platforms should provide summarized or anonymized signals rather than raw user input. For web contexts, may include page topic or URL. For conversational contexts, an anonymized content signal. For search, query category or intent. When the content context is managed through AdCP content standards, reference the artifact directly via the artifact field.
5669
+ */
5670
+ generation_context?: {
5671
+ /**
5672
+ * Type of context that triggered generation (e.g., 'web_page', 'conversational', 'search', 'app', 'dooh')
5673
+ */
5674
+ context_type?: string;
5675
+ /**
5676
+ * Reference to the content-standards artifact that provided the generation context. Links this variant to the specific piece of content (article, video, podcast segment, etc.) where the ad was placed.
5677
+ */
5678
+ artifact?: {
5679
+ property_id: Identifier;
5680
+ /**
5681
+ * Artifact identifier within the property
5682
+ */
5683
+ artifact_id: string;
5684
+ };
5685
+ ext?: ExtensionObject;
5686
+ [k: string]: unknown | undefined;
5687
+ };
5688
+ };
5689
+ /**
5690
+ * VAST (Video Ad Serving Template) tag for third-party video ad serving
5691
+ */
5692
+ export type PropertyIdentifierTypes = 'domain' | 'subdomain' | 'network_id' | 'ios_bundle' | 'android_package' | 'apple_app_store_id' | 'google_play_id' | 'roku_store_id' | 'fire_tv_asin' | 'samsung_app_id' | 'apple_tv_bundle' | 'bundle_id' | 'venue_id' | 'screen_id' | 'openooh_venue_type' | 'rss_url' | 'apple_podcast_id' | 'spotify_show_id' | 'podcast_guid';
5693
+ /**
5694
+ * Response payload for get_creative_delivery task. Returns creative delivery data with variant-level breakdowns including manifests and metrics.
5695
+ */
5696
+ export interface GetCreativeDeliveryResponse {
5697
+ /**
5698
+ * Account identifier. Present when the response spans or is scoped to a specific account.
5699
+ */
5700
+ account_id?: string;
5701
+ /**
5702
+ * Publisher's media buy identifier. Present when the request was scoped to a single media buy.
5703
+ */
5704
+ media_buy_id?: string;
5705
+ /**
5706
+ * Buyer's reference identifier for the media buy. Echoed back so the buyer can correlate without mapping publisher IDs.
5707
+ */
5708
+ media_buy_buyer_ref?: string;
5709
+ /**
5710
+ * ISO 4217 currency code for monetary values in this response (e.g., 'USD', 'EUR')
5711
+ */
5712
+ currency: string;
5713
+ /**
5714
+ * Date range for the report.
5715
+ */
5716
+ reporting_period: {
5717
+ /**
5718
+ * ISO 8601 start timestamp
5719
+ */
5720
+ start: string;
5721
+ /**
5722
+ * ISO 8601 end timestamp
5723
+ */
5724
+ end: string;
5725
+ /**
5726
+ * IANA timezone identifier for the reporting period (e.g., 'America/New_York', 'UTC'). Platforms report in their native timezone.
5727
+ */
5728
+ timezone?: string;
5729
+ };
5730
+ /**
5731
+ * Creative delivery data with variant breakdowns
5732
+ */
5733
+ creatives: {
5734
+ /**
5735
+ * Creative identifier
5736
+ */
5737
+ creative_id: string;
5738
+ /**
5739
+ * Publisher's media buy identifier for this creative. Present when the request spanned multiple media buys, so the buyer can correlate each creative to its media buy.
5740
+ */
5741
+ media_buy_id?: string;
5742
+ format_id?: FormatID;
5743
+ totals?: DeliveryMetrics;
5744
+ /**
5745
+ * Total number of variants for this creative. When max_variants was specified in the request, this may exceed the number of items in the variants array.
5746
+ */
5747
+ variant_count?: number;
5748
+ /**
5749
+ * Variant-level delivery breakdown. Each variant includes the rendered manifest and delivery metrics. For standard creatives, contains a single variant. For asset group optimization, one per combination. For generative creative, one per generated execution. Empty when a creative has no variants yet.
5750
+ */
5751
+ variants: CreativeVariant[];
5752
+ }[];
5753
+ /**
5754
+ * Pagination information. Present when the request included pagination parameters.
5755
+ */
5756
+ pagination?: {
5757
+ /**
5758
+ * Maximum number of creatives requested
5759
+ */
5760
+ limit: number;
5761
+ /**
5762
+ * Number of creatives skipped
5763
+ */
5764
+ offset: number;
5765
+ /**
5766
+ * Whether more creatives are available beyond this page
5767
+ */
5768
+ has_more: boolean;
5769
+ /**
5770
+ * Total number of creatives matching the request filters
5771
+ */
5772
+ total?: number;
5773
+ };
5774
+ /**
5775
+ * Task-specific errors and warnings
5776
+ */
5777
+ errors?: Error[];
5778
+ context?: ContextObject;
5779
+ ext?: ExtensionObject;
5780
+ }
5781
+ /**
5782
+ * Format of this creative
5783
+ */
5784
+ export interface DeliveryMetrics1 {
5785
+ /**
5786
+ * Impressions delivered
5787
+ */
5788
+ impressions?: number;
5789
+ /**
5790
+ * Amount spent
5791
+ */
5792
+ spend?: number;
5793
+ /**
5794
+ * Total clicks
5795
+ */
5796
+ clicks?: number;
5797
+ /**
5798
+ * Click-through rate (clicks/impressions)
5799
+ */
5800
+ ctr?: number;
5801
+ /**
5802
+ * Views at threshold (for CPV)
5803
+ */
5804
+ views?: number;
5805
+ /**
5806
+ * 100% completions (for CPCV)
5807
+ */
5808
+ completed_views?: number;
5809
+ /**
5810
+ * Completion rate (completed_views/impressions)
5811
+ */
5812
+ completion_rate?: number;
5813
+ /**
5814
+ * Total conversions attributed to this delivery. When by_event_type is present, this equals the sum of all by_event_type[].count entries.
5815
+ */
5816
+ conversions?: number;
5817
+ /**
5818
+ * Total monetary value of attributed conversions (in the reporting currency)
5819
+ */
5820
+ conversion_value?: number;
5821
+ /**
5822
+ * Return on ad spend (conversion_value / spend)
5823
+ */
5824
+ roas?: number;
5825
+ /**
5826
+ * Cost per conversion (spend / conversions)
5827
+ */
5828
+ cost_per_acquisition?: number;
5829
+ /**
5830
+ * Fraction of conversions from first-time brand buyers (0 = none, 1 = all)
5831
+ */
5832
+ new_to_brand_rate?: number;
5833
+ /**
5834
+ * Leads generated (convenience alias for by_event_type where event_type='lead')
5835
+ */
5836
+ leads?: number;
5837
+ /**
5838
+ * Conversion metrics broken down by event type. Spend-derived metrics (ROAS, CPA) are only available at the package/totals level since spend cannot be attributed to individual event types.
5839
+ */
5840
+ by_event_type?: {
5841
+ event_type: EventType;
5842
+ /**
5843
+ * Event source that produced these conversions (for disambiguation when multiple event sources are configured)
5844
+ */
5845
+ event_source_id?: string;
5846
+ /**
5847
+ * Number of events of this type
5848
+ */
5849
+ count: number;
5850
+ /**
5851
+ * Total monetary value of events of this type
5852
+ */
5853
+ value?: number;
5854
+ [k: string]: unknown | undefined;
5855
+ }[];
5856
+ /**
5857
+ * Gross Rating Points delivered (for CPP)
5858
+ */
5859
+ grps?: number;
5860
+ /**
5861
+ * Unique reach - units depend on measurement provider (e.g., individuals, households, devices, cookies). See delivery_measurement.provider for methodology.
5862
+ */
5863
+ reach?: number;
5864
+ /**
5865
+ * Average frequency per individual (typically measured over campaign duration, but can vary by measurement provider)
5866
+ */
5867
+ frequency?: number;
5868
+ /**
5869
+ * Video quartile completion data
5870
+ */
5871
+ quartile_data?: {
5872
+ /**
5873
+ * 25% completion views
5874
+ */
5875
+ q1_views?: number;
5876
+ /**
5877
+ * 50% completion views
5878
+ */
5879
+ q2_views?: number;
5880
+ /**
5881
+ * 75% completion views
5882
+ */
5883
+ q3_views?: number;
5884
+ /**
5885
+ * 100% completion views
5886
+ */
5887
+ q4_views?: number;
5888
+ };
5889
+ /**
5890
+ * DOOH-specific metrics (only included for DOOH campaigns)
5891
+ */
5892
+ dooh_metrics?: {
5893
+ /**
5894
+ * Number of times ad played in rotation
5895
+ */
5896
+ loop_plays?: number;
5897
+ /**
5898
+ * Number of unique screens displaying the ad
5899
+ */
5900
+ screens_used?: number;
5901
+ /**
5902
+ * Total display time in seconds
5903
+ */
5904
+ screen_time_seconds?: number;
5905
+ /**
5906
+ * Actual share of voice delivered (0.0 to 1.0)
5907
+ */
5908
+ sov_achieved?: number;
5909
+ /**
5910
+ * Explanation of how DOOH impressions were calculated
5911
+ */
5912
+ calculation_notes?: string;
5913
+ /**
5914
+ * Per-venue performance breakdown
5915
+ */
5916
+ venue_breakdown?: {
5917
+ /**
5918
+ * Venue identifier
5919
+ */
5920
+ venue_id: string;
5921
+ /**
5922
+ * Human-readable venue name
5923
+ */
5924
+ venue_name?: string;
5925
+ /**
5926
+ * Venue type (e.g., 'airport', 'transit', 'retail', 'billboard')
5927
+ */
5928
+ venue_type?: string;
5929
+ /**
5930
+ * Impressions delivered at this venue
5931
+ */
5932
+ impressions: number;
5933
+ /**
5934
+ * Loop plays at this venue
5935
+ */
5936
+ loop_plays?: number;
5937
+ /**
5938
+ * Number of screens used at this venue
5939
+ */
5940
+ screens_used?: number;
5941
+ [k: string]: unknown | undefined;
5942
+ }[];
5943
+ [k: string]: unknown | undefined;
5944
+ };
5945
+ /**
5946
+ * Viewability metrics. Viewable rate should be calculated as viewable_impressions / measurable_impressions (not total impressions), since some environments cannot measure viewability.
5947
+ */
5948
+ viewability?: {
5949
+ /**
5950
+ * Impressions where viewability could be measured. Excludes environments without measurement capability (e.g., non-Intersection Observer browsers, certain app environments).
5951
+ */
5952
+ measurable_impressions?: number;
5953
+ /**
5954
+ * Impressions that met the viewability threshold defined by the measurement standard.
5955
+ */
5956
+ viewable_impressions?: number;
5957
+ /**
5958
+ * Viewable impression rate (viewable_impressions / measurable_impressions). Range 0.0 to 1.0.
5959
+ */
5960
+ viewable_rate?: number;
5961
+ /**
5962
+ * Viewability measurement standard. 'mrc': 50% of pixels in view for 1 second (display) or 2 seconds (video), per MRC/IAB guidelines. 'groupm': 100% of pixels in view for the same durations. These are materially different thresholds and should not be compared across standards.
5963
+ */
5964
+ standard?: 'mrc' | 'groupm';
5965
+ [k: string]: unknown | undefined;
5966
+ };
5967
+ /**
5968
+ * Platform-specific engagement rate (0.0 to 1.0). Definition varies by platform (e.g., likes+comments+shares/impressions on social, interactions/impressions on rich media).
5969
+ */
5970
+ engagement_rate?: number;
5971
+ /**
5972
+ * Cost per click (spend / clicks)
5973
+ */
5974
+ cost_per_click?: number;
5975
+ /**
5976
+ * Conversion metrics broken down by action source (website, app, in_store, etc.). Useful for omnichannel sellers where conversions occur across digital and physical channels.
5977
+ */
5978
+ by_action_source?: {
5979
+ action_source: ActionSource;
5980
+ /**
5981
+ * Event source that produced these conversions (for disambiguation when multiple event sources are configured)
5982
+ */
5983
+ event_source_id?: string;
5984
+ /**
5985
+ * Number of conversions from this action source
5986
+ */
5987
+ count: number;
5988
+ /**
5989
+ * Total monetary value of conversions from this action source
5990
+ */
5991
+ value?: number;
5992
+ [k: string]: unknown | undefined;
5993
+ }[];
5994
+ [k: string]: unknown | undefined;
5995
+ }
5996
+ /**
5997
+ * The rendered creative manifest for this variant — the actual output that was served, not the input assets. Contains format_id and the resolved assets (specific headline, image, video, etc. the platform selected or generated). For Tier 2, shows which asset combination was picked. For Tier 3, contains the generated assets which may differ entirely from the input brand manifest. Pass to preview_creative to re-render.
4353
5998
  */
4354
- export interface PreviewCreativeBatchResponse {
4355
- /**
4356
- * Discriminator indicating this is a batch preview response
4357
- */
4358
- response_type: 'batch';
5999
+ export interface Identifier {
6000
+ type: PropertyIdentifierTypes;
4359
6001
  /**
4360
- * Array of preview results corresponding to each request in the same order. results[0] is the result for requests[0], results[1] for requests[1], etc. Order is guaranteed even when some requests fail. Each result contains either a successful preview response or an error.
6002
+ * The identifier value. For domain type: 'example.com' matches base domain plus www and m subdomains; 'edition.example.com' matches that specific subdomain; '*.example.com' matches ALL subdomains but NOT base domain
4361
6003
  */
4362
- results: (PreviewBatchResultSuccess | PreviewBatchResultError)[];
4363
- context?: ContextObject;
4364
- ext?: ExtensionObject;
4365
- }
4366
- export interface PreviewBatchResultSuccess {
4367
- success?: true;
4368
- }
4369
- export interface PreviewBatchResultError {
4370
- success?: false;
6004
+ value: string;
4371
6005
  }
6006
+ /**
6007
+ * Standard error structure for task-specific errors and warnings
6008
+ */
4372
6009
  /**
4373
6010
  * Request parameters for discovering signals. Use signal_spec for natural language discovery, signal_ids for exact lookups, or both (signal_ids take precedence for exact matches, signal_spec provides additional discovery context).
4374
6011
  */
@@ -4401,6 +6038,7 @@ export type GetSignalsRequest = {
4401
6038
  * Maximum number of results to return
4402
6039
  */
4403
6040
  max_results?: number;
6041
+ pagination?: PaginationRequest;
4404
6042
  context?: ContextObject;
4405
6043
  ext?: ExtensionObject;
4406
6044
  };
@@ -4446,12 +6084,16 @@ export type SignalCatalogType = 'marketplace' | 'custom' | 'owned';
4446
6084
  export interface SignalFilters {
4447
6085
  /**
4448
6086
  * Filter by catalog type
6087
+ *
6088
+ * @minItems 1
4449
6089
  */
4450
- catalog_types?: SignalCatalogType[];
6090
+ catalog_types?: [SignalCatalogType, ...SignalCatalogType[]];
4451
6091
  /**
4452
6092
  * Filter by specific data providers
6093
+ *
6094
+ * @minItems 1
4453
6095
  */
4454
- data_providers?: string[];
6096
+ data_providers?: [string, ...string[]];
4455
6097
  /**
4456
6098
  * Maximum CPM price filter
4457
6099
  */
@@ -4463,7 +6105,7 @@ export interface SignalFilters {
4463
6105
  [k: string]: unknown | undefined;
4464
6106
  }
4465
6107
  /**
4466
- * Opaque correlation data that is echoed unchanged in responses. Used for internal tracking, UI session IDs, trace IDs, and other caller-specific identifiers that don't affect protocol behavior. Context data is never parsed by AdCP agents - it's simply preserved and returned.
6108
+ * Standard cursor-based pagination parameters for list operations
4467
6109
  */
4468
6110
  /**
4469
6111
  * Universal signal identifier referencing the data provider's catalog. Use this to verify authorization and look up signal definitions.
@@ -4636,6 +6278,7 @@ export interface GetSignalsResponse {
4636
6278
  * Task-specific errors and warnings (e.g., signal discovery or pricing issues)
4637
6279
  */
4638
6280
  errors?: Error[];
6281
+ pagination?: PaginationResponse;
4639
6282
  context?: ContextObject;
4640
6283
  ext?: ExtensionObject;
4641
6284
  }
@@ -4696,10 +6339,6 @@ export type BasePropertySource = PublisherTagsSource | PublisherPropertyIDsSourc
4696
6339
  /**
4697
6340
  * Tag for categorizing publisher properties. Must be lowercase alphanumeric with underscores only.
4698
6341
  */
4699
- export type PropertyIdentifierTypes = 'domain' | 'subdomain' | 'network_id' | 'ios_bundle' | 'android_package' | 'apple_app_store_id' | 'google_play_id' | 'roku_store_id' | 'fire_tv_asin' | 'samsung_app_id' | 'apple_tv_bundle' | 'bundle_id' | 'venue_id' | 'screen_id' | 'openooh_venue_type' | 'rss_url' | 'apple_podcast_id' | 'spotify_show_id' | 'podcast_guid';
4700
- /**
4701
- * Standardized advertising media channels describing how buyers allocate budget. Channels are planning abstractions, not technical substrates. See the Media Channel Taxonomy specification for detailed definitions.
4702
- */
4703
6342
  export type PropertyType = 'website' | 'mobile_app' | 'ctv_app' | 'desktop_app' | 'dooh' | 'podcast' | 'radio' | 'streaming_audio';
4704
6343
  /**
4705
6344
  * Type of asset. Note: Brand manifests typically contain basic media assets (image, video, audio, text). Code assets (html, javascript, css) and ad markup (vast, daast) are usually not part of brand asset libraries.
@@ -4778,37 +6417,37 @@ export interface DirectIdentifiersSource {
4778
6417
  /**
4779
6418
  * A property identifier with type and value. Used to identify properties across platforms (domains, app store IDs, etc.).
4780
6419
  */
4781
- export interface Identifier {
4782
- type: PropertyIdentifierTypes;
4783
- /**
4784
- * The identifier value. For domain type: 'example.com' matches base domain plus www and m subdomains; 'edition.example.com' matches that specific subdomain; '*.example.com' matches ALL subdomains but NOT base domain
4785
- */
4786
- value: string;
4787
- }
4788
- /**
4789
- * Dynamic filters to apply when resolving the list
4790
- */
4791
6420
  export interface PropertyListFilters {
4792
6421
  /**
4793
6422
  * Property must have feature data for ALL listed countries (ISO codes). Required.
6423
+ *
6424
+ * @minItems 1
4794
6425
  */
4795
- countries_all: string[];
6426
+ countries_all: [string, ...string[]];
4796
6427
  /**
4797
6428
  * Property must support ANY of the listed channels. Required.
6429
+ *
6430
+ * @minItems 1
4798
6431
  */
4799
- channels_any: MediaChannel[];
6432
+ channels_any: [MediaChannel, ...MediaChannel[]];
4800
6433
  /**
4801
6434
  * Filter to these property types
6435
+ *
6436
+ * @minItems 1
4802
6437
  */
4803
- property_types?: PropertyType[];
6438
+ property_types?: [PropertyType, ...PropertyType[]];
4804
6439
  /**
4805
6440
  * Feature-based requirements. Property must pass ALL requirements (AND logic).
6441
+ *
6442
+ * @minItems 1
4806
6443
  */
4807
- feature_requirements?: FeatureRequirement[];
6444
+ feature_requirements?: [FeatureRequirement, ...FeatureRequirement[]];
4808
6445
  /**
4809
6446
  * Identifiers to always exclude from results
6447
+ *
6448
+ * @minItems 1
4810
6449
  */
4811
- exclude_identifiers?: Identifier[];
6450
+ exclude_identifiers?: [Identifier, ...Identifier[]];
4812
6451
  }
4813
6452
  /**
4814
6453
  * A feature-based requirement for property filtering. Use min_value/max_value for quantitative features, allowed_values for binary/categorical features.
@@ -4828,8 +6467,10 @@ export interface FeatureRequirement {
4828
6467
  max_value?: number;
4829
6468
  /**
4830
6469
  * Values that pass the requirement (for binary/categorical features)
6470
+ *
6471
+ * @minItems 1
4831
6472
  */
4832
- allowed_values?: unknown[];
6473
+ allowed_values?: [unknown, ...unknown[]];
4833
6474
  /**
4834
6475
  * How to handle properties where this feature is not covered. 'exclude' (default): property is removed from the list. 'include': property passes this requirement (fail-open).
4835
6476
  */
@@ -4954,13 +6595,18 @@ export interface GetPropertyListRequest {
4954
6595
  */
4955
6596
  resolve?: boolean;
4956
6597
  /**
4957
- * Maximum identifiers to return (for large lists)
4958
- */
4959
- max_results?: number;
4960
- /**
4961
- * Pagination cursor for large result sets
6598
+ * Pagination parameters. Uses higher limits than standard pagination because property lists can contain tens of thousands of identifiers.
4962
6599
  */
4963
- cursor?: string;
6600
+ pagination?: {
6601
+ /**
6602
+ * Maximum number of identifiers to return per page
6603
+ */
6604
+ max_results?: number;
6605
+ /**
6606
+ * Opaque cursor from a previous response to fetch the next page
6607
+ */
6608
+ cursor?: string;
6609
+ };
4964
6610
  context?: ContextObject;
4965
6611
  ext?: ExtensionObject;
4966
6612
  }
@@ -4976,27 +6622,7 @@ export interface GetPropertyListResponse {
4976
6622
  * Resolved identifiers that passed filters (if resolve=true). Cache these locally for real-time use.
4977
6623
  */
4978
6624
  identifiers?: Identifier[];
4979
- /**
4980
- * Total number of identifiers in resolved list
4981
- */
4982
- total_count?: number;
4983
- /**
4984
- * Number of identifiers returned in this response
4985
- */
4986
- returned_count?: number;
4987
- /**
4988
- * Pagination information
4989
- */
4990
- pagination?: {
4991
- /**
4992
- * Whether more results are available
4993
- */
4994
- has_more?: boolean;
4995
- /**
4996
- * Cursor for next page
4997
- */
4998
- cursor?: string;
4999
- };
6625
+ pagination?: PaginationResponse;
5000
6626
  /**
5001
6627
  * When the list was resolved
5002
6628
  */
@@ -5028,19 +6654,12 @@ export interface ListPropertyListsRequest {
5028
6654
  * Filter to lists whose name contains this string
5029
6655
  */
5030
6656
  name_contains?: string;
5031
- /**
5032
- * Maximum lists to return
5033
- */
5034
- max_results?: number;
5035
- /**
5036
- * Pagination cursor
5037
- */
5038
- cursor?: string;
6657
+ pagination?: PaginationRequest;
5039
6658
  context?: ContextObject;
5040
6659
  ext?: ExtensionObject;
5041
6660
  }
5042
6661
  /**
5043
- * Opaque correlation data that is echoed unchanged in responses. Used for internal tracking, UI session IDs, trace IDs, and other caller-specific identifiers that don't affect protocol behavior. Context data is never parsed by AdCP agents - it's simply preserved and returned.
6662
+ * Standard cursor-based pagination parameters for list operations
5044
6663
  */
5045
6664
  /**
5046
6665
  * A source of properties for a property list. Supports three selection patterns: publisher with tags, publisher with property IDs, or direct identifiers.
@@ -5050,27 +6669,7 @@ export interface ListPropertyListsResponse {
5050
6669
  * Array of property lists (metadata only, not resolved properties)
5051
6670
  */
5052
6671
  lists: PropertyList[];
5053
- /**
5054
- * Total number of lists matching criteria
5055
- */
5056
- total_count?: number;
5057
- /**
5058
- * Number of lists returned in this response
5059
- */
5060
- returned_count?: number;
5061
- /**
5062
- * Pagination information
5063
- */
5064
- pagination?: {
5065
- /**
5066
- * Whether more results are available
5067
- */
5068
- has_more?: boolean;
5069
- /**
5070
- * Cursor for next page
5071
- */
5072
- cursor?: string;
5073
- };
6672
+ pagination?: PaginationResponse;
5074
6673
  ext?: ExtensionObject;
5075
6674
  }
5076
6675
  /**
@@ -5123,11 +6722,12 @@ export interface ListContentStandardsRequest {
5123
6722
  * Filter by ISO 3166-1 alpha-2 country codes
5124
6723
  */
5125
6724
  countries?: string[];
6725
+ pagination?: PaginationRequest;
5126
6726
  context?: ContextObject;
5127
6727
  ext?: ExtensionObject;
5128
6728
  }
5129
6729
  /**
5130
- * Opaque correlation data that is echoed unchanged in responses. Used for internal tracking, UI session IDs, trace IDs, and other caller-specific identifiers that don't affect protocol behavior. Context data is never parsed by AdCP agents - it's simply preserved and returned.
6730
+ * Standard cursor-based pagination parameters for list operations
5131
6731
  */
5132
6732
  /**
5133
6733
  * Response payload with list of content standards configurations
@@ -5143,6 +6743,7 @@ export type ListContentStandardsResponse = {
5143
6743
  errors?: {
5144
6744
  [k: string]: unknown | undefined;
5145
6745
  };
6746
+ pagination?: PaginationResponse;
5146
6747
  context?: ContextObject;
5147
6748
  ext?: ExtensionObject;
5148
6749
  } | {
@@ -5242,12 +6843,16 @@ export interface ContentStandards {
5242
6843
  name?: string;
5243
6844
  /**
5244
6845
  * ISO 3166-1 alpha-2 country codes. Standards apply in ALL listed countries (AND logic).
6846
+ *
6847
+ * @minItems 1
5245
6848
  */
5246
- countries_all?: string[];
6849
+ countries_all?: [string, ...string[]];
5247
6850
  /**
5248
6851
  * Advertising channels. Standards apply to ANY of the listed channels (OR logic).
6852
+ *
6853
+ * @minItems 1
5249
6854
  */
5250
- channels_any?: MediaChannel[];
6855
+ channels_any?: [MediaChannel, ...MediaChannel[]];
5251
6856
  /**
5252
6857
  * BCP 47 language tags (e.g., 'en', 'de', 'fr'). Standards apply to content in ANY of these languages (OR logic). Content in unlisted languages is not covered by these standards.
5253
6858
  *
@@ -6056,6 +7661,10 @@ export type ValidateContentDeliveryResponse = {
6056
7661
  * Request parameters for retrieving content artifacts from a media buy for validation
6057
7662
  */
6058
7663
  export interface GetMediaBuyArtifactsRequest {
7664
+ /**
7665
+ * Filter artifacts to a specific account. When provided, only returns artifacts for media buys belonging to this account. When omitted, returns artifacts across all accessible accounts. Optional if the agent has a single account.
7666
+ */
7667
+ account_id?: string;
6059
7668
  /**
6060
7669
  * Media buy to get artifacts from
6061
7670
  */
@@ -6091,13 +7700,18 @@ export interface GetMediaBuyArtifactsRequest {
6091
7700
  end?: string;
6092
7701
  };
6093
7702
  /**
6094
- * Maximum artifacts to return per request
6095
- */
6096
- limit?: number;
6097
- /**
6098
- * Pagination cursor for fetching subsequent pages
7703
+ * Pagination parameters. Uses higher limits than standard pagination because artifact result sets can be very large.
6099
7704
  */
6100
- cursor?: string;
7705
+ pagination?: {
7706
+ /**
7707
+ * Maximum number of artifacts to return per page
7708
+ */
7709
+ max_results?: number;
7710
+ /**
7711
+ * Opaque cursor from a previous response to fetch the next page
7712
+ */
7713
+ cursor?: string;
7714
+ };
6101
7715
  context?: ContextObject;
6102
7716
  ext?: ExtensionObject;
6103
7717
  }
@@ -6176,19 +7790,7 @@ export type GetMediaBuyArtifactsResponse = {
6176
7790
  */
6177
7791
  method?: 'random' | 'stratified' | 'recent' | 'failures_only';
6178
7792
  };
6179
- /**
6180
- * Pagination information for large result sets
6181
- */
6182
- pagination?: {
6183
- /**
6184
- * Cursor for fetching the next page
6185
- */
6186
- cursor?: string;
6187
- /**
6188
- * Whether more results are available
6189
- */
6190
- has_more?: boolean;
6191
- };
7793
+ pagination?: PaginationResponse;
6192
7794
  /**
6193
7795
  * Field must not be present in success response
6194
7796
  */
@@ -6862,6 +8464,10 @@ export interface GetAdCPCapabilitiesRequest {
6862
8464
  /**
6863
8465
  * Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.
6864
8466
  */
8467
+ export type EventType1 = 'page_view' | 'view_content' | 'select_content' | 'select_item' | 'search' | 'share' | 'add_to_cart' | 'remove_from_cart' | 'viewed_cart' | 'add_to_wishlist' | 'initiate_checkout' | 'add_payment_info' | 'purchase' | 'refund' | 'lead' | 'qualify_lead' | 'close_convert_lead' | 'disqualify_lead' | 'complete_registration' | 'subscribe' | 'start_trial' | 'app_install' | 'app_launch' | 'contact' | 'schedule' | 'donate' | 'submit_application' | 'custom';
8468
+ /**
8469
+ * Standardized advertising media channels describing how buyers allocate budget. Channels are planning abstractions, not technical substrates. See the Media Channel Taxonomy specification for detailed definitions.
8470
+ */
6865
8471
  export interface GetAdCPCapabilitiesResponse {
6866
8472
  /**
6867
8473
  * Core AdCP protocol information
@@ -6876,6 +8482,31 @@ export interface GetAdCPCapabilitiesResponse {
6876
8482
  * Which AdCP domain protocols this seller supports
6877
8483
  */
6878
8484
  supported_protocols: ('media_buy' | 'signals' | 'governance' | 'sponsored_intelligence' | 'creative')[];
8485
+ /**
8486
+ * Account management capabilities. Describes how accounts are established, what billing models are supported, and whether an account is required before browsing products.
8487
+ */
8488
+ account?: {
8489
+ /**
8490
+ * Whether the seller requires operator-level credentials. When false (default), the seller trusts the agent's identity claims — the agent authenticates once and declares brands/operators via sync_accounts. When true, each operator must authenticate independently with the seller, and the agent opens a per-operator session using the operator's credential.
8491
+ */
8492
+ require_operator_auth?: boolean;
8493
+ /**
8494
+ * OAuth authorization endpoint for obtaining operator-level credentials. Present when the seller supports OAuth for operator authentication. The agent directs the operator to this URL to authenticate and obtain a bearer token. If absent and require_operator_auth is true, operators obtain credentials out-of-band (e.g., seller portal, API key).
8495
+ */
8496
+ authorization_endpoint?: string;
8497
+ /**
8498
+ * Billing models this seller supports. brand: seller invoices the brand directly. operator: seller invoices the operator (agency). agent: agent consolidates billing.
8499
+ */
8500
+ supported_billing: ('brand' | 'operator' | 'agent')[];
8501
+ /**
8502
+ * The billing model applied when the agent omits billing from a sync_accounts request. Must be one of the values in supported_billing.
8503
+ */
8504
+ default_billing?: 'brand' | 'operator' | 'agent';
8505
+ /**
8506
+ * Whether an active account is required to call get_products. When true, the agent must establish an account via sync_accounts before browsing products. When false, get_products works without an account (account_id is optional for rate-card-specific pricing).
8507
+ */
8508
+ required_for_products?: boolean;
8509
+ };
6879
8510
  /**
6880
8511
  * Media-buy protocol capabilities. Only present if media_buy is in supported_protocols.
6881
8512
  */
@@ -6989,24 +8620,59 @@ export interface GetAdCPCapabilitiesResponse {
6989
8620
  */
6990
8621
  age_restriction?: {
6991
8622
  /**
6992
- * Whether platform supports age restrictions
8623
+ * Whether seller supports age restrictions
6993
8624
  */
6994
8625
  supported?: boolean;
6995
8626
  /**
6996
- * Age verification methods this platform supports
8627
+ * Age verification methods this seller supports
6997
8628
  */
6998
8629
  verification_methods?: AgeVerificationMethod[];
6999
8630
  };
7000
8631
  /**
7001
- * Whether platform supports device platform targeting (Sec-CH-UA-Platform values)
8632
+ * Whether seller supports device platform targeting (Sec-CH-UA-Platform values)
7002
8633
  */
7003
8634
  device_platform?: boolean;
7004
8635
  /**
7005
- * Whether platform supports language targeting (ISO 639-1 codes)
8636
+ * Whether seller supports language targeting (ISO 639-1 codes)
7006
8637
  */
7007
8638
  language?: boolean;
7008
8639
  };
7009
8640
  };
8641
+ /**
8642
+ * Seller-level conversion tracking capabilities. Only present when features.conversion_tracking is true.
8643
+ */
8644
+ conversion_tracking?: {
8645
+ /**
8646
+ * Event types this seller can track and attribute. If omitted, all standard event types are supported.
8647
+ */
8648
+ supported_event_types?: EventType[];
8649
+ /**
8650
+ * Universal ID types accepted for user matching
8651
+ */
8652
+ supported_uid_types?: UIDType[];
8653
+ /**
8654
+ * Hashed PII types accepted for user matching. Buyers must hash before sending (SHA-256, normalized).
8655
+ */
8656
+ supported_hashed_identifiers?: ('hashed_email' | 'hashed_phone')[];
8657
+ /**
8658
+ * Action sources this seller accepts events from
8659
+ */
8660
+ supported_action_sources?: ActionSource[];
8661
+ /**
8662
+ * Attribution windows available from this seller. Single-element arrays indicate fixed windows; multi-element arrays indicate configurable options the buyer can choose from via optimization_goal.attribution_window on packages.
8663
+ */
8664
+ attribution_windows?: {
8665
+ event_type?: EventType1;
8666
+ /**
8667
+ * Available click-through attribution windows (e.g. ["7d"], ["7d", "14d", "30d"])
8668
+ */
8669
+ click_through: string[];
8670
+ /**
8671
+ * Available view-through attribution windows (e.g. ["1d"], ["1d", "7d", "14d"])
8672
+ */
8673
+ view_through?: string[];
8674
+ }[];
8675
+ };
7010
8676
  /**
7011
8677
  * Information about the seller's media inventory portfolio
7012
8678
  */
@@ -7150,14 +8816,15 @@ export interface GetAdCPCapabilitiesResponse {
7150
8816
  */
7151
8817
  export interface ListAccountsRequest {
7152
8818
  /**
7153
- * Filter accounts by status
8819
+ * Filter accounts by status. Omit to return accounts in all statuses.
7154
8820
  */
7155
- status?: 'active' | 'suspended' | 'closed' | 'all';
8821
+ status?: 'active' | 'pending_approval' | 'payment_required' | 'suspended' | 'closed';
8822
+ pagination?: PaginationRequest;
7156
8823
  context?: ContextObject;
7157
8824
  ext?: ExtensionObject;
7158
8825
  }
7159
8826
  /**
7160
- * Opaque correlation data that is echoed unchanged in responses. Used for internal tracking, UI session IDs, trace IDs, and other caller-specific identifiers that don't affect protocol behavior. Context data is never parsed by AdCP agents - it's simply preserved and returned.
8827
+ * Standard cursor-based pagination parameters for list operations
7161
8828
  */
7162
8829
  /**
7163
8830
  * Response payload for list_accounts task
@@ -7171,10 +8838,157 @@ export interface ListAccountsResponse {
7171
8838
  * Task-specific errors and warnings
7172
8839
  */
7173
8840
  errors?: Error[];
8841
+ pagination?: PaginationResponse;
7174
8842
  context?: ContextObject;
7175
8843
  ext?: ExtensionObject;
7176
8844
  }
7177
8845
  /**
7178
8846
  * A billing account representing the relationship between a buyer and seller. The account determines rate cards, payment terms, and billing entity.
7179
8847
  */
8848
+ /**
8849
+ * Authentication schemes for push notification endpoints
8850
+ */
8851
+ export interface SyncAccountsRequest {
8852
+ /**
8853
+ * Advertiser accounts to sync
8854
+ *
8855
+ * @maxItems 1000
8856
+ */
8857
+ accounts: {
8858
+ /**
8859
+ * House domain where brand.json is hosted (e.g., 'unilever.com', 'acme-corp.com'). This is the canonical identity anchor for the brand, resolved via /.well-known/brand.json. For single-brand houses, this alone identifies the brand.
8860
+ */
8861
+ house: string;
8862
+ /**
8863
+ * Brand ID within the house portfolio (from brand.json). Required when the house has multiple brands (e.g., 'dove' under unilever.com, 'tide' under pg.com). Omit for single-brand houses.
8864
+ */
8865
+ brand_id?: string;
8866
+ /**
8867
+ * Domain of the entity operating the seat (e.g., 'groupm.com', 'mindshare.com'). Verified against the brand's authorized_operators in brand.json. Omit if the brand operates its own seat.
8868
+ */
8869
+ operator?: string;
8870
+ /**
8871
+ * Who should be invoiced. brand: seller invoices the brand directly. operator: seller invoices the operator (agency). agent: agent consolidates billing across brands. Omit to accept the seller's default.
8872
+ */
8873
+ billing?: 'brand' | 'operator' | 'agent';
8874
+ }[];
8875
+ /**
8876
+ * When true, accounts previously synced by this agent but not included in this request will be deactivated. Scoped to the authenticated agent — does not affect accounts managed by other agents. Use with caution.
8877
+ */
8878
+ delete_missing?: boolean;
8879
+ /**
8880
+ * When true, preview what would change without applying. Returns what would be created/updated/deactivated.
8881
+ */
8882
+ dry_run?: boolean;
8883
+ push_notification_config?: PushNotificationConfig;
8884
+ context?: ContextObject;
8885
+ ext?: ExtensionObject;
8886
+ }
8887
+ /**
8888
+ * Optional webhook for async notifications when account status changes (e.g., pending_approval transitions to active).
8889
+ */
8890
+ /**
8891
+ * Response from account sync operation. Returns per-account results with status and billing, or operation-level errors on complete failure.
8892
+ */
8893
+ export type SyncAccountsResponse = SyncAccountsSuccess | SyncAccountsError;
8894
+ /**
8895
+ * Sync operation processed accounts (individual accounts may be pending or have action=failed)
8896
+ */
8897
+ export interface SyncAccountsSuccess {
8898
+ /**
8899
+ * Whether this was a dry run (no actual changes made)
8900
+ */
8901
+ dry_run?: boolean;
8902
+ /**
8903
+ * Results for each account processed
8904
+ */
8905
+ accounts: {
8906
+ /**
8907
+ * Seller-assigned account identifier. When billing is 'agent', multiple brands may share the same account_id.
8908
+ */
8909
+ account_id?: string;
8910
+ /**
8911
+ * House domain, echoed from the request
8912
+ */
8913
+ house: string;
8914
+ /**
8915
+ * Brand ID within the house portfolio, echoed from request
8916
+ */
8917
+ brand_id?: string;
8918
+ /**
8919
+ * Operator domain, echoed from request
8920
+ */
8921
+ operator?: string;
8922
+ /**
8923
+ * Human-readable account name assigned by the seller
8924
+ */
8925
+ name?: string;
8926
+ /**
8927
+ * Action taken for this account. created: new account provisioned. updated: existing account modified. unchanged: no changes needed. failed: could not process (see errors).
8928
+ */
8929
+ action: 'created' | 'updated' | 'unchanged' | 'failed';
8930
+ /**
8931
+ * Account status. active: ready for use. pending_approval: seller reviewing (credit, legal). payment_required: credit limit reached or funds depleted. suspended: was active, now paused. closed: terminated.
8932
+ */
8933
+ status: 'active' | 'pending_approval' | 'payment_required' | 'suspended' | 'closed';
8934
+ /**
8935
+ * Who is invoiced on this account. May differ from the requested billing if the seller doesn't support it.
8936
+ */
8937
+ billing?: 'brand' | 'operator' | 'agent';
8938
+ /**
8939
+ * Parent account ID when this account is a sub-account under a shared billing account
8940
+ */
8941
+ parent_account_id?: string;
8942
+ /**
8943
+ * Setup information for pending accounts. Provides the agent (or human) with next steps to complete account activation.
8944
+ */
8945
+ setup?: {
8946
+ /**
8947
+ * URL where the human can complete the required action (credit application, legal agreement, add funds)
8948
+ */
8949
+ url?: string;
8950
+ /**
8951
+ * Human-readable description of what's needed
8952
+ */
8953
+ message: string;
8954
+ /**
8955
+ * When this setup link expires
8956
+ */
8957
+ expires_at?: string;
8958
+ };
8959
+ /**
8960
+ * Rate card applied to this account
8961
+ */
8962
+ rate_card?: string;
8963
+ /**
8964
+ * Payment terms (e.g., 'net_30', 'prepay')
8965
+ */
8966
+ payment_terms?: string;
8967
+ credit_limit?: {
8968
+ amount: number;
8969
+ currency: string;
8970
+ };
8971
+ /**
8972
+ * Per-account errors (only present when action is 'failed')
8973
+ */
8974
+ errors?: Error[];
8975
+ /**
8976
+ * Non-fatal warnings about this account
8977
+ */
8978
+ warnings?: string[];
8979
+ }[];
8980
+ context?: ContextObject;
8981
+ ext?: ExtensionObject;
8982
+ }
8983
+ /**
8984
+ * Standard error structure for task-specific errors and warnings
8985
+ */
8986
+ export interface SyncAccountsError {
8987
+ /**
8988
+ * Operation-level errors (e.g., authentication failure, service unavailable)
8989
+ */
8990
+ errors: Error[];
8991
+ context?: ContextObject;
8992
+ ext?: ExtensionObject;
8993
+ }
7180
8994
  //# sourceMappingURL=tools.generated.d.ts.map