@adcp/client 3.11.2 → 3.12.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 (49) hide show
  1. package/dist/lib/adapters/property-list-adapter.d.ts.map +1 -1
  2. package/dist/lib/adapters/property-list-adapter.js +10 -5
  3. package/dist/lib/adapters/property-list-adapter.js.map +1 -1
  4. package/dist/lib/agents/index.generated.d.ts +33 -1
  5. package/dist/lib/agents/index.generated.d.ts.map +1 -1
  6. package/dist/lib/agents/index.generated.js +48 -0
  7. package/dist/lib/agents/index.generated.js.map +1 -1
  8. package/dist/lib/index.d.ts +4 -2
  9. package/dist/lib/index.d.ts.map +1 -1
  10. package/dist/lib/index.js +14 -3
  11. package/dist/lib/index.js.map +1 -1
  12. package/dist/lib/testing/scenarios/creative.js +11 -1
  13. package/dist/lib/testing/scenarios/creative.js.map +1 -1
  14. package/dist/lib/testing/types.d.ts +12 -0
  15. package/dist/lib/testing/types.d.ts.map +1 -1
  16. package/dist/lib/types/adcp.d.ts +1 -0
  17. package/dist/lib/types/adcp.d.ts.map +1 -1
  18. package/dist/lib/types/core.generated.d.ts +478 -42
  19. package/dist/lib/types/core.generated.d.ts.map +1 -1
  20. package/dist/lib/types/core.generated.js +1 -1
  21. package/dist/lib/types/schemas.generated.d.ts +3031 -1004
  22. package/dist/lib/types/schemas.generated.d.ts.map +1 -1
  23. package/dist/lib/types/schemas.generated.js +623 -138
  24. package/dist/lib/types/schemas.generated.js.map +1 -1
  25. package/dist/lib/types/tools.generated.d.ts +1940 -305
  26. package/dist/lib/types/tools.generated.d.ts.map +1 -1
  27. package/dist/lib/types/tools.generated.js +0 -3
  28. package/dist/lib/types/tools.generated.js.map +1 -1
  29. package/dist/lib/utils/capabilities.d.ts +4 -0
  30. package/dist/lib/utils/capabilities.d.ts.map +1 -1
  31. package/dist/lib/utils/capabilities.js +6 -1
  32. package/dist/lib/utils/capabilities.js.map +1 -1
  33. package/dist/lib/utils/index.d.ts +2 -1
  34. package/dist/lib/utils/index.d.ts.map +1 -1
  35. package/dist/lib/utils/index.js +6 -1
  36. package/dist/lib/utils/index.js.map +1 -1
  37. package/dist/lib/utils/pagination.d.ts +31 -0
  38. package/dist/lib/utils/pagination.d.ts.map +1 -0
  39. package/dist/lib/utils/pagination.js +51 -0
  40. package/dist/lib/utils/pagination.js.map +1 -0
  41. package/dist/lib/utils/pricing-adapter.d.ts +4 -0
  42. package/dist/lib/utils/pricing-adapter.d.ts.map +1 -1
  43. package/dist/lib/utils/pricing-adapter.js +7 -0
  44. package/dist/lib/utils/pricing-adapter.js.map +1 -1
  45. package/dist/lib/version.d.ts +3 -3
  46. package/dist/lib/version.d.ts.map +1 -1
  47. package/dist/lib/version.js +3 -3
  48. package/dist/lib/version.js.map +1 -1
  49. package/package.json +1 -1
@@ -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,13 @@ 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
+ * Standard marketing event types for event logging, aligned with IAB ECAPI
712
797
  */
713
- export type PricingOption = CPMPricingOption | VCPMPricingOption | CPCPricingOption | CPCVPricingOption | CPVPricingOption | CPPPricingOption | FlatRatePricingOption;
798
+ 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
799
  /**
715
800
  * Available frequencies for delivery reports and metrics updates
716
801
  */
@@ -718,7 +803,7 @@ export type ReportingFrequency = 'hourly' | 'daily' | 'monthly';
718
803
  /**
719
804
  * Standard delivery and performance metrics available for reporting
720
805
  */
721
- export type AvailableMetric = 'impressions' | 'spend' | 'clicks' | 'ctr' | 'video_completions' | 'completion_rate' | 'conversions' | 'viewability' | 'engagement_rate';
806
+ 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
807
  /**
723
808
  * Co-branding requirement
724
809
  */
@@ -773,6 +858,10 @@ export type DataProviderSignalSelector = {
773
858
  signal_tags: [string, ...string[]];
774
859
  [k: string]: unknown | undefined;
775
860
  };
861
+ /**
862
+ * Where the conversion event originated
863
+ */
864
+ export type ActionSource = 'website' | 'app' | 'offline' | 'phone_call' | 'chat' | 'email' | 'in_store' | 'system_generated' | 'other';
776
865
  /**
777
866
  * Response payload for get_products task
778
867
  */
@@ -793,6 +882,11 @@ export interface GetProductsResponse {
793
882
  * [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
883
  */
795
884
  property_list_applied?: boolean;
885
+ /**
886
+ * 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.
887
+ */
888
+ product_selectors_applied?: boolean;
889
+ pagination?: PaginationResponse;
796
890
  context?: ContextObject;
797
891
  ext?: ExtensionObject;
798
892
  }
@@ -818,6 +912,10 @@ export interface Product {
818
912
  * @minItems 1
819
913
  */
820
914
  publisher_properties: [PublisherPropertySelector, ...PublisherPropertySelector[]];
915
+ /**
916
+ * 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'].
917
+ */
918
+ channels?: MediaChannel[];
821
919
  /**
822
920
  * Array of supported creative format IDs - structured format_id objects with agent_url and id
823
921
  */
@@ -871,6 +969,31 @@ export interface Product {
871
969
  * 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
970
  */
873
971
  signal_targeting_allowed?: boolean;
972
+ /**
973
+ * 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.
974
+ */
975
+ conversion_tracking?: {
976
+ /**
977
+ * 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')
978
+ *
979
+ * @minItems 1
980
+ */
981
+ action_sources?: [ActionSource, ...ActionSource[]];
982
+ /**
983
+ * Optimization strategies this product supports when an optimization_goal is set on a package
984
+ *
985
+ * @minItems 1
986
+ */
987
+ supported_optimization_strategies?: [
988
+ 'maximize_conversions' | 'target_cpa' | 'target_roas',
989
+ ...('maximize_conversions' | 'target_cpa' | 'target_roas')[]
990
+ ];
991
+ /**
992
+ * 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'.
993
+ */
994
+ platform_managed?: boolean;
995
+ [k: string]: unknown | undefined;
996
+ };
874
997
  /**
875
998
  * Explanation of why this product matches the brief (only included when brief is provided)
876
999
  */
@@ -1277,6 +1400,44 @@ export interface PriceGuidance5 {
1277
1400
  p90?: number;
1278
1401
  [k: string]: unknown | undefined;
1279
1402
  }
1403
+ /**
1404
+ * 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).
1405
+ */
1406
+ export interface CPAPricingOption {
1407
+ /**
1408
+ * Unique identifier for this pricing option within the product
1409
+ */
1410
+ pricing_option_id: string;
1411
+ /**
1412
+ * Cost per acquisition (conversion event)
1413
+ */
1414
+ pricing_model: 'cpa';
1415
+ /**
1416
+ * The conversion event type that triggers billing (e.g., purchase, lead, app_install)
1417
+ */
1418
+ event_type: EventType;
1419
+ /**
1420
+ * Name of the custom event when event_type is 'custom'. Required when event_type is 'custom', ignored otherwise.
1421
+ */
1422
+ custom_event_name?: string;
1423
+ /**
1424
+ * 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.
1425
+ */
1426
+ event_source_id?: string;
1427
+ /**
1428
+ * ISO 4217 currency code
1429
+ */
1430
+ currency: string;
1431
+ /**
1432
+ * Fixed price per acquisition in the specified currency
1433
+ */
1434
+ fixed_price: number;
1435
+ /**
1436
+ * Minimum spend requirement per package using this pricing option, in the specified currency
1437
+ */
1438
+ min_spend_per_package?: number;
1439
+ [k: string]: unknown | undefined;
1440
+ }
1280
1441
  /**
1281
1442
  * 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
1443
  */
@@ -1364,6 +1525,77 @@ export interface PriceGuidance6 {
1364
1525
  p90?: number;
1365
1526
  [k: string]: unknown | undefined;
1366
1527
  }
1528
+ /**
1529
+ * 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.
1530
+ */
1531
+ export interface TimeBasedPricingOption {
1532
+ /**
1533
+ * Unique identifier for this pricing option within the product
1534
+ */
1535
+ pricing_option_id: string;
1536
+ /**
1537
+ * Cost per time unit - rate scales with campaign duration
1538
+ */
1539
+ pricing_model: 'time';
1540
+ /**
1541
+ * ISO 4217 currency code
1542
+ */
1543
+ currency: string;
1544
+ /**
1545
+ * Cost per time unit. If present, this is fixed pricing. If absent, auction-based.
1546
+ */
1547
+ fixed_price?: number;
1548
+ /**
1549
+ * Minimum acceptable bid per time unit for auction pricing (mutually exclusive with fixed_price). Bids below this value will be rejected.
1550
+ */
1551
+ floor_price?: number;
1552
+ price_guidance?: PriceGuidance7;
1553
+ /**
1554
+ * Time-based pricing parameters
1555
+ */
1556
+ parameters: {
1557
+ /**
1558
+ * The time unit for pricing. Total cost = fixed_price × number of time_units in the campaign flight.
1559
+ */
1560
+ time_unit: 'hour' | 'day' | 'week' | 'month';
1561
+ /**
1562
+ * Minimum booking duration in time_units
1563
+ */
1564
+ min_duration?: number;
1565
+ /**
1566
+ * Maximum booking duration in time_units. Must be >= min_duration when both are present.
1567
+ */
1568
+ max_duration?: number;
1569
+ [k: string]: unknown | undefined;
1570
+ };
1571
+ /**
1572
+ * Minimum spend requirement per package using this pricing option, in the specified currency
1573
+ */
1574
+ min_spend_per_package?: number;
1575
+ [k: string]: unknown | undefined;
1576
+ }
1577
+ /**
1578
+ * Optional pricing guidance for auction-based bidding
1579
+ */
1580
+ export interface PriceGuidance7 {
1581
+ /**
1582
+ * 25th percentile of recent winning bids
1583
+ */
1584
+ p25?: number;
1585
+ /**
1586
+ * Median of recent winning bids
1587
+ */
1588
+ p50?: number;
1589
+ /**
1590
+ * 75th percentile of recent winning bids
1591
+ */
1592
+ p75?: number;
1593
+ /**
1594
+ * 90th percentile of recent winning bids
1595
+ */
1596
+ p90?: number;
1597
+ [k: string]: unknown | undefined;
1598
+ }
1367
1599
  /**
1368
1600
  * Measurement capabilities included with a product
1369
1601
  */
@@ -1409,9 +1641,17 @@ export interface ReportingCapabilities {
1409
1641
  */
1410
1642
  supports_webhooks: boolean;
1411
1643
  /**
1412
- * Metrics available in reporting. Impressions and spend are always implicitly included.
1644
+ * 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
1645
  */
1414
1646
  available_metrics: AvailableMetric[];
1647
+ /**
1648
+ * Whether this product supports creative-level metric breakdowns in delivery reporting (by_creative within by_package)
1649
+ */
1650
+ supports_creative_breakdown?: boolean;
1651
+ /**
1652
+ * 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.
1653
+ */
1654
+ date_range_support: 'date_range' | 'lifetime_only';
1415
1655
  [k: string]: unknown | undefined;
1416
1656
  }
1417
1657
  /**
@@ -1596,12 +1836,33 @@ export interface Error {
1596
1836
  };
1597
1837
  [k: string]: unknown | undefined;
1598
1838
  }
1839
+ /**
1840
+ * Standard cursor-based pagination metadata for list responses
1841
+ */
1842
+ export interface PaginationResponse {
1843
+ /**
1844
+ * Whether more results are available beyond this page
1845
+ */
1846
+ has_more: boolean;
1847
+ /**
1848
+ * Opaque cursor to pass in the next request to fetch the next page. Only present when has_more is true.
1849
+ */
1850
+ cursor?: string;
1851
+ /**
1852
+ * Total number of items matching the query across all pages. Optional because not all backends can efficiently compute this.
1853
+ */
1854
+ total_count?: number;
1855
+ }
1599
1856
  /**
1600
1857
  * 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
1858
  */
1602
1859
  /**
1603
1860
  * Filter by format type (technical categories with distinct requirements)
1604
1861
  */
1862
+ export type WCAGLevel = 'A' | 'AA' | 'AAA';
1863
+ /**
1864
+ * Request parameters for discovering supported creative formats
1865
+ */
1605
1866
  export interface ListCreativeFormatsRequest {
1606
1867
  /**
1607
1868
  * Return only these specific format IDs (e.g., from get_products response)
@@ -1636,6 +1897,8 @@ export interface ListCreativeFormatsRequest {
1636
1897
  * Search for formats by name (case-insensitive partial match)
1637
1898
  */
1638
1899
  name_search?: string;
1900
+ wcag_level?: WCAGLevel;
1901
+ pagination?: PaginationRequest;
1639
1902
  context?: ContextObject;
1640
1903
  ext?: ExtensionObject;
1641
1904
  }
@@ -1643,13 +1906,17 @@ export interface ListCreativeFormatsRequest {
1643
1906
  * 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
1907
  */
1645
1908
  /**
1646
- * Media type of this format - determines rendering method and asset requirements
1909
+ * 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
1910
  */
1648
1911
  export type FormatIDParameter = 'dimensions' | 'duration';
1649
1912
  /**
1650
- * Capabilities supported by creative agents for format handling
1913
+ * 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
1914
  */
1652
- export type CreativeAgentCapability = 'validation' | 'assembly' | 'generation' | 'preview';
1915
+ 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';
1916
+ /**
1917
+ * 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.
1918
+ */
1919
+ export type CreativeAgentCapability = 'validation' | 'assembly' | 'generation' | 'preview' | 'delivery';
1653
1920
  /**
1654
1921
  * Response payload for list_creative_formats task
1655
1922
  */
@@ -1679,6 +1946,7 @@ export interface ListCreativeFormatsResponse {
1679
1946
  * Task-specific errors and warnings (e.g., format availability issues)
1680
1947
  */
1681
1948
  errors?: Error[];
1949
+ pagination?: PaginationResponse;
1682
1950
  context?: ContextObject;
1683
1951
  ext?: ExtensionObject;
1684
1952
  }
@@ -1699,7 +1967,7 @@ export interface Format {
1699
1967
  * Optional URL to showcase page with examples and interactive demos of this format
1700
1968
  */
1701
1969
  example_url?: string;
1702
- type: FormatCategory;
1970
+ type?: FormatCategory;
1703
1971
  /**
1704
1972
  * 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
1973
  */
@@ -1745,6 +2013,10 @@ export interface Format {
1745
2013
  * Maximum number of repetitions allowed
1746
2014
  */
1747
2015
  max_count: number;
2016
+ /**
2017
+ * 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).
2018
+ */
2019
+ selection_mode?: 'sequential' | 'optimize';
1748
2020
  /**
1749
2021
  * Assets within each repetition of this group
1750
2022
  */
@@ -1757,9 +2029,9 @@ export interface Format {
1757
2029
  [k: string]: unknown | undefined;
1758
2030
  };
1759
2031
  /**
1760
- * List of universal macros supported by this format (e.g., MEDIA_BUY_ID, CACHEBUSTER, DEVICE_ID). Used for validation and developer tooling.
2032
+ * 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
2033
  */
1762
- supported_macros?: string[];
2034
+ supported_macros?: (UniversalMacro | string)[];
1763
2035
  /**
1764
2036
  * 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
2037
  */
@@ -1777,6 +2049,16 @@ export interface Format {
1777
2049
  };
1778
2050
  [k: string]: unknown | undefined;
1779
2051
  };
2052
+ /**
2053
+ * Accessibility posture of this format. Declares the WCAG conformance level that creatives produced by this format will meet.
2054
+ */
2055
+ accessibility?: {
2056
+ wcag_level: WCAGLevel;
2057
+ /**
2058
+ * 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.
2059
+ */
2060
+ requires_accessible_assets?: boolean;
2061
+ };
1780
2062
  /**
1781
2063
  * Optional detailed card with carousel and full specifications. Provides rich format documentation similar to ad spec pages.
1782
2064
  */
@@ -1790,6 +2072,12 @@ export interface Format {
1790
2072
  };
1791
2073
  [k: string]: unknown | undefined;
1792
2074
  };
2075
+ /**
2076
+ * 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.
2077
+ *
2078
+ * @minItems 1
2079
+ */
2080
+ reported_metrics?: [AvailableMetric, ...AvailableMetric[]];
1793
2081
  [k: string]: unknown | undefined;
1794
2082
  }
1795
2083
  /**
@@ -1861,9 +2149,17 @@ export interface FormatID3 {
1861
2149
  */
1862
2150
  export type Pacing = 'even' | 'asap' | 'front_loaded';
1863
2151
  /**
1864
- * Metro area classification system (e.g., 'nielsen_dma', 'uk_itl2')
2152
+ * Event type to optimize for (e.g. purchase, lead)
2153
+ */
2154
+ export type MetroAreaSystem1 = 'nielsen_dma' | 'uk_itl1' | 'uk_itl2' | 'eurostat_nuts2' | 'custom';
2155
+ /**
2156
+ * Postal code system (e.g., 'us_zip', 'gb_outward'). System name encodes country and precision.
1865
2157
  */
1866
2158
  export type PostalCodeSystem = 'us_zip' | 'us_zip_plus_four' | 'gb_outward' | 'gb_full' | 'ca_fsa' | 'ca_full' | 'de_plz' | 'fr_code_postal' | 'au_postcode';
2159
+ /**
2160
+ * Postal code system (e.g., 'us_zip', 'gb_outward'). System name encodes country and precision.
2161
+ */
2162
+ export type PostalCodeSystem1 = 'us_zip' | 'us_zip_plus_four' | 'gb_outward' | 'gb_full' | 'ca_fsa' | 'ca_full' | 'de_plz' | 'fr_code_postal' | 'au_postcode';
1867
2163
  /**
1868
2164
  * Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.
1869
2165
  */
@@ -1901,6 +2197,14 @@ export type VASTAsset = {
1901
2197
  * Tracking events supported by this VAST tag
1902
2198
  */
1903
2199
  tracking_events?: VASTTrackingEvent[];
2200
+ /**
2201
+ * URL to captions file (WebVTT, SRT, etc.)
2202
+ */
2203
+ captions_url?: string;
2204
+ /**
2205
+ * URL to audio description track for visually impaired users
2206
+ */
2207
+ audio_description_url?: string;
1904
2208
  [k: string]: unknown | undefined;
1905
2209
  } | {
1906
2210
  /**
@@ -1924,6 +2228,14 @@ export type VASTAsset = {
1924
2228
  * Tracking events supported by this VAST tag
1925
2229
  */
1926
2230
  tracking_events?: VASTTrackingEvent[];
2231
+ /**
2232
+ * URL to captions file (WebVTT, SRT, etc.)
2233
+ */
2234
+ captions_url?: string;
2235
+ /**
2236
+ * URL to audio description track for visually impaired users
2237
+ */
2238
+ audio_description_url?: string;
1927
2239
  [k: string]: unknown | undefined;
1928
2240
  };
1929
2241
  /**
@@ -1963,6 +2275,10 @@ export type DAASTAsset = {
1963
2275
  * Whether companion display ads are included
1964
2276
  */
1965
2277
  companion_ads?: boolean;
2278
+ /**
2279
+ * URL to text transcript of the audio content
2280
+ */
2281
+ transcript_url?: string;
1966
2282
  [k: string]: unknown | undefined;
1967
2283
  } | {
1968
2284
  /**
@@ -1986,6 +2302,10 @@ export type DAASTAsset = {
1986
2302
  * Whether companion display ads are included
1987
2303
  */
1988
2304
  companion_ads?: boolean;
2305
+ /**
2306
+ * URL to text transcript of the audio content
2307
+ */
2308
+ transcript_url?: string;
1989
2309
  [k: string]: unknown | undefined;
1990
2310
  };
1991
2311
  /**
@@ -2029,9 +2349,9 @@ export interface CreateMediaBuyRequest {
2029
2349
  */
2030
2350
  buyer_ref: string;
2031
2351
  /**
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.
2352
+ * Account to bill for this media buy. The seller maps the agent's brand + operator to an account during sync_accounts; the agent passes that account_id here.
2033
2353
  */
2034
- account_id?: string;
2354
+ account_id: string;
2035
2355
  /**
2036
2356
  * ID of a proposal from get_products to execute. When provided with total_budget, the publisher converts the proposal's allocation percentages into packages automatically. Alternative to providing packages array.
2037
2357
  */
@@ -2146,63 +2466,192 @@ export interface PackageRequest {
2146
2466
  * Whether this package should be created in a paused state. Paused packages do not deliver impressions. Defaults to false.
2147
2467
  */
2148
2468
  paused?: boolean;
2469
+ optimization_goal?: OptimizationGoal;
2149
2470
  targeting_overlay?: TargetingOverlay;
2150
2471
  /**
2151
2472
  * Assign existing library creatives to this package with optional weights and placement targeting
2473
+ *
2474
+ * @minItems 1
2152
2475
  */
2153
- creative_assignments?: CreativeAssignment[];
2476
+ creative_assignments?: [CreativeAssignment, ...CreativeAssignment[]];
2154
2477
  /**
2155
2478
  * Upload new creative assets and assign to this package (creatives will be added to library). Use creative_assignments instead for existing library creatives.
2156
2479
  *
2480
+ * @minItems 1
2157
2481
  * @maxItems 100
2158
2482
  */
2159
- creatives?: CreativeAsset[];
2483
+ creatives?: [CreativeAsset, ...CreativeAsset[]];
2160
2484
  ext?: ExtensionObject;
2161
2485
  [k: string]: unknown | undefined;
2162
2486
  }
2163
2487
  /**
2164
2488
  * 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
2489
  */
2166
- export interface TargetingOverlay {
2490
+ export interface OptimizationGoal {
2167
2491
  /**
2168
- * Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').
2492
+ * Event source to optimize against (must be configured on this account via sync_event_sources)
2169
2493
  */
2170
- geo_countries?: string[];
2494
+ event_source_id: string;
2495
+ event_type: EventType;
2171
2496
  /**
2172
- * Restrict delivery to specific regions/states. ISO 3166-2 subdivision codes (e.g., 'US-CA', 'GB-SCT').
2497
+ * Target return on ad spend (e.g. 4.0 = $4 conversion value per $1 spent). Mutually exclusive with target_cpa.
2173
2498
  */
2174
- geo_regions?: string[];
2499
+ target_roas?: number;
2175
2500
  /**
2176
- * Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.
2501
+ * Target cost per acquisition in the buy currency. Mutually exclusive with target_roas.
2177
2502
  */
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
- }[];
2503
+ target_cpa?: number;
2187
2504
  /**
2188
- * Restrict delivery to specific postal areas. Each entry specifies the postal system and target values. Seller must declare supported systems in get_adcp_capabilities.
2505
+ * 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.
2189
2506
  */
2190
- geo_postal_areas?: {
2191
- system: PostalCodeSystem;
2507
+ attribution_window?: {
2192
2508
  /**
2193
- * Postal codes within the system (e.g., ['10001', '10002'] for us_zip)
2194
- *
2195
- * @minItems 1
2509
+ * Click-through attribution window (e.g. '7d', '28d', '30d')
2196
2510
  */
2197
- values: [string, ...string[]];
2198
- }[];
2199
- /**
2200
- * AXE segment ID to include for targeting
2201
- */
2202
- axe_include_segment?: string;
2203
- /**
2204
- * AXE segment ID to exclude from targeting
2205
- */
2511
+ click_through: string;
2512
+ /**
2513
+ * View-through attribution window (e.g. '1d', '7d')
2514
+ */
2515
+ view_through?: string;
2516
+ [k: string]: unknown | undefined;
2517
+ };
2518
+ [k: string]: unknown | undefined;
2519
+ }
2520
+ /**
2521
+ * 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).
2522
+ */
2523
+ export interface TargetingOverlay {
2524
+ /**
2525
+ * Restrict delivery to specific countries. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').
2526
+ *
2527
+ * @minItems 1
2528
+ */
2529
+ geo_countries?: [string, ...string[]];
2530
+ /**
2531
+ * Exclude specific countries from delivery. ISO 3166-1 alpha-2 codes (e.g., 'US', 'GB', 'DE').
2532
+ *
2533
+ * @minItems 1
2534
+ */
2535
+ geo_countries_exclude?: [string, ...string[]];
2536
+ /**
2537
+ * Restrict delivery to specific regions/states. ISO 3166-2 subdivision codes (e.g., 'US-CA', 'GB-SCT').
2538
+ *
2539
+ * @minItems 1
2540
+ */
2541
+ geo_regions?: [string, ...string[]];
2542
+ /**
2543
+ * Exclude specific regions/states from delivery. ISO 3166-2 subdivision codes (e.g., 'US-CA', 'GB-SCT').
2544
+ *
2545
+ * @minItems 1
2546
+ */
2547
+ geo_regions_exclude?: [string, ...string[]];
2548
+ /**
2549
+ * Restrict delivery to specific metro areas. Each entry specifies the classification system and target values. Seller must declare supported systems in get_adcp_capabilities.
2550
+ *
2551
+ * @minItems 1
2552
+ */
2553
+ geo_metros?: [
2554
+ {
2555
+ system: MetroAreaSystem;
2556
+ /**
2557
+ * Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)
2558
+ *
2559
+ * @minItems 1
2560
+ */
2561
+ values: [string, ...string[]];
2562
+ },
2563
+ ...{
2564
+ system: MetroAreaSystem;
2565
+ /**
2566
+ * Metro codes within the system (e.g., ['501', '602'] for Nielsen DMAs)
2567
+ *
2568
+ * @minItems 1
2569
+ */
2570
+ values: [string, ...string[]];
2571
+ }[]
2572
+ ];
2573
+ /**
2574
+ * Exclude specific metro areas from delivery. Each entry specifies the classification system and excluded values. Seller must declare supported systems in get_adcp_capabilities.
2575
+ *
2576
+ * @minItems 1
2577
+ */
2578
+ geo_metros_exclude?: [
2579
+ {
2580
+ system: MetroAreaSystem1;
2581
+ /**
2582
+ * Metro codes to exclude within the system (e.g., ['501', '602'] for Nielsen DMAs)
2583
+ *
2584
+ * @minItems 1
2585
+ */
2586
+ values: [string, ...string[]];
2587
+ },
2588
+ ...{
2589
+ system: MetroAreaSystem1;
2590
+ /**
2591
+ * Metro codes to exclude within the system (e.g., ['501', '602'] for Nielsen DMAs)
2592
+ *
2593
+ * @minItems 1
2594
+ */
2595
+ values: [string, ...string[]];
2596
+ }[]
2597
+ ];
2598
+ /**
2599
+ * Restrict delivery to specific postal areas. Each entry specifies the postal system and target values. Seller must declare supported systems in get_adcp_capabilities.
2600
+ *
2601
+ * @minItems 1
2602
+ */
2603
+ geo_postal_areas?: [
2604
+ {
2605
+ system: PostalCodeSystem;
2606
+ /**
2607
+ * Postal codes within the system (e.g., ['10001', '10002'] for us_zip)
2608
+ *
2609
+ * @minItems 1
2610
+ */
2611
+ values: [string, ...string[]];
2612
+ },
2613
+ ...{
2614
+ system: PostalCodeSystem;
2615
+ /**
2616
+ * Postal codes within the system (e.g., ['10001', '10002'] for us_zip)
2617
+ *
2618
+ * @minItems 1
2619
+ */
2620
+ values: [string, ...string[]];
2621
+ }[]
2622
+ ];
2623
+ /**
2624
+ * Exclude specific postal areas from delivery. Each entry specifies the postal system and excluded values. Seller must declare supported systems in get_adcp_capabilities.
2625
+ *
2626
+ * @minItems 1
2627
+ */
2628
+ geo_postal_areas_exclude?: [
2629
+ {
2630
+ system: PostalCodeSystem1;
2631
+ /**
2632
+ * Postal codes to exclude within the system (e.g., ['10001', '10002'] for us_zip)
2633
+ *
2634
+ * @minItems 1
2635
+ */
2636
+ values: [string, ...string[]];
2637
+ },
2638
+ ...{
2639
+ system: PostalCodeSystem1;
2640
+ /**
2641
+ * Postal codes to exclude within the system (e.g., ['10001', '10002'] for us_zip)
2642
+ *
2643
+ * @minItems 1
2644
+ */
2645
+ values: [string, ...string[]];
2646
+ }[]
2647
+ ];
2648
+ /**
2649
+ * AXE segment ID to include for targeting
2650
+ */
2651
+ axe_include_segment?: string;
2652
+ /**
2653
+ * AXE segment ID to exclude from targeting
2654
+ */
2206
2655
  axe_exclude_segment?: string;
2207
2656
  frequency_cap?: FrequencyCap;
2208
2657
  property_list?: PropertyListReference;
@@ -2220,8 +2669,10 @@ export interface TargetingOverlay {
2220
2669
  verification_required?: boolean;
2221
2670
  /**
2222
2671
  * Accepted verification methods. If omitted, any method the platform supports is acceptable.
2672
+ *
2673
+ * @minItems 1
2223
2674
  */
2224
- accepted_methods?: AgeVerificationMethod[];
2675
+ accepted_methods?: [AgeVerificationMethod, ...AgeVerificationMethod[]];
2225
2676
  };
2226
2677
  /**
2227
2678
  * Restrict to specific platforms. Use for technical compatibility (app only works on iOS). Values from Sec-CH-UA-Platform standard, extended for CTV.
@@ -2457,6 +2908,18 @@ export interface VideoAsset {
2457
2908
  * True peak level in dBFS
2458
2909
  */
2459
2910
  audio_true_peak_dbfs?: number;
2911
+ /**
2912
+ * URL to captions file (WebVTT, SRT, etc.)
2913
+ */
2914
+ captions_url?: string;
2915
+ /**
2916
+ * URL to text transcript of the video content
2917
+ */
2918
+ transcript_url?: string;
2919
+ /**
2920
+ * URL to audio description track for visually impaired users
2921
+ */
2922
+ audio_description_url?: string;
2460
2923
  [k: string]: unknown | undefined;
2461
2924
  }
2462
2925
  /**
@@ -2507,6 +2970,10 @@ export interface AudioAsset {
2507
2970
  * True peak level in dBFS
2508
2971
  */
2509
2972
  true_peak_dbfs?: number;
2973
+ /**
2974
+ * URL to text transcript of the audio content
2975
+ */
2976
+ transcript_url?: string;
2510
2977
  [k: string]: unknown | undefined;
2511
2978
  }
2512
2979
  /**
@@ -2535,6 +3002,27 @@ export interface HTMLAsset {
2535
3002
  * HTML version (e.g., 'HTML5')
2536
3003
  */
2537
3004
  version?: string;
3005
+ /**
3006
+ * Self-declared accessibility properties for this opaque creative
3007
+ */
3008
+ accessibility?: {
3009
+ /**
3010
+ * Text alternative describing the creative content
3011
+ */
3012
+ alt_text?: string;
3013
+ /**
3014
+ * Whether the creative can be fully operated via keyboard
3015
+ */
3016
+ keyboard_navigable?: boolean;
3017
+ /**
3018
+ * Whether the creative respects prefers-reduced-motion or provides pause/stop controls
3019
+ */
3020
+ motion_control?: boolean;
3021
+ /**
3022
+ * Whether the creative has been tested with screen readers
3023
+ */
3024
+ screen_reader_tested?: boolean;
3025
+ };
2538
3026
  [k: string]: unknown | undefined;
2539
3027
  }
2540
3028
  /**
@@ -2560,6 +3048,27 @@ export interface JavaScriptAsset {
2560
3048
  */
2561
3049
  content: string;
2562
3050
  module_type?: JavaScriptModuleType;
3051
+ /**
3052
+ * Self-declared accessibility properties for this opaque creative
3053
+ */
3054
+ accessibility?: {
3055
+ /**
3056
+ * Text alternative describing the creative content
3057
+ */
3058
+ alt_text?: string;
3059
+ /**
3060
+ * Whether the creative can be fully operated via keyboard
3061
+ */
3062
+ keyboard_navigable?: boolean;
3063
+ /**
3064
+ * Whether the creative respects prefers-reduced-motion or provides pause/stop controls
3065
+ */
3066
+ motion_control?: boolean;
3067
+ /**
3068
+ * Whether the creative has been tested with screen readers
3069
+ */
3070
+ screen_reader_tested?: boolean;
3071
+ };
2563
3072
  [k: string]: unknown | undefined;
2564
3073
  }
2565
3074
  /**
@@ -2599,28 +3108,6 @@ export interface PromotedOfferings {
2599
3108
  /**
2600
3109
  * Inline brand manifest object
2601
3110
  */
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
3111
  export interface Offering {
2625
3112
  /**
2626
3113
  * Unique identifier for this offering. Used by hosts to reference specific offerings in si_get_offering calls.
@@ -2780,9 +3267,25 @@ export interface Account {
2780
3267
  */
2781
3268
  billing_proxy?: string;
2782
3269
  /**
2783
- * Account status
3270
+ * Account status. pending_approval: seller reviewing (credit, contracts). payment_required: credit limit reached or funds depleted. suspended: was active, now paused. closed: terminated.
3271
+ */
3272
+ status: 'active' | 'pending_approval' | 'payment_required' | 'suspended' | 'closed';
3273
+ /**
3274
+ * House domain where brand.json is hosted. Canonical identity anchor for the brand.
3275
+ */
3276
+ house?: string;
3277
+ /**
3278
+ * Brand ID within the house portfolio (from brand.json)
3279
+ */
3280
+ brand_id?: string;
3281
+ /**
3282
+ * Domain of the entity operating this account
3283
+ */
3284
+ operator?: string;
3285
+ /**
3286
+ * Who is invoiced on this account. brand: seller invoices the brand directly. operator: seller invoices the operator (agency). agent: agent consolidates billing.
2784
3287
  */
2785
- status: 'active' | 'suspended' | 'closed';
3288
+ billing?: 'brand' | 'operator' | 'agent';
2786
3289
  /**
2787
3290
  * Identifier for the rate card applied to this account
2788
3291
  */
@@ -2799,6 +3302,7 @@ export interface Account {
2799
3302
  currency: string;
2800
3303
  };
2801
3304
  ext?: ExtensionObject;
3305
+ [k: string]: unknown | undefined;
2802
3306
  }
2803
3307
  /**
2804
3308
  * 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 +3346,7 @@ export interface Package {
2842
3346
  * Format IDs that creative assets will be provided for this package
2843
3347
  */
2844
3348
  format_ids_to_provide?: FormatID[];
3349
+ optimization_goal?: OptimizationGoal;
2845
3350
  /**
2846
3351
  * Whether this package is paused by the buyer. Paused packages do not deliver impressions. Defaults to false.
2847
3352
  */
@@ -3048,19 +3553,7 @@ export interface ListCreativesRequest {
3048
3553
  field?: CreativeSortField;
3049
3554
  direction?: SortDirection;
3050
3555
  };
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
- };
3556
+ pagination?: PaginationRequest;
3064
3557
  /**
3065
3558
  * Include package assignment information in response
3066
3559
  */
@@ -3086,24 +3579,34 @@ export interface ListCreativesRequest {
3086
3579
  export interface CreativeFilters {
3087
3580
  /**
3088
3581
  * Filter creatives by owning accounts. Useful for agencies managing multiple client accounts.
3582
+ *
3583
+ * @minItems 1
3089
3584
  */
3090
- account_ids?: string[];
3585
+ account_ids?: [string, ...string[]];
3091
3586
  /**
3092
3587
  * Filter by creative format types (e.g., video, audio, display)
3588
+ *
3589
+ * @minItems 1
3093
3590
  */
3094
- formats?: string[];
3591
+ formats?: [string, ...string[]];
3095
3592
  /**
3096
3593
  * Filter by creative approval statuses
3594
+ *
3595
+ * @minItems 1
3097
3596
  */
3098
- statuses?: CreativeStatus[];
3597
+ statuses?: [CreativeStatus, ...CreativeStatus[]];
3099
3598
  /**
3100
3599
  * Filter by creative tags (all tags must match)
3600
+ *
3601
+ * @minItems 1
3101
3602
  */
3102
- tags?: string[];
3603
+ tags?: [string, ...string[]];
3103
3604
  /**
3104
3605
  * Filter by creative tags (any tag must match)
3606
+ *
3607
+ * @minItems 1
3105
3608
  */
3106
- tags_any?: string[];
3609
+ tags_any?: [string, ...string[]];
3107
3610
  /**
3108
3611
  * Filter by creative names containing this text (case-insensitive)
3109
3612
  */
@@ -3111,9 +3614,10 @@ export interface CreativeFilters {
3111
3614
  /**
3112
3615
  * Filter by specific creative IDs
3113
3616
  *
3617
+ * @minItems 1
3114
3618
  * @maxItems 100
3115
3619
  */
3116
- creative_ids?: string[];
3620
+ creative_ids?: [string, ...string[]];
3117
3621
  /**
3118
3622
  * Filter creatives created after this date (ISO 8601)
3119
3623
  */
@@ -3132,16 +3636,22 @@ export interface CreativeFilters {
3132
3636
  updated_before?: string;
3133
3637
  /**
3134
3638
  * Filter creatives assigned to any of these packages
3639
+ *
3640
+ * @minItems 1
3135
3641
  */
3136
- assigned_to_packages?: string[];
3642
+ assigned_to_packages?: [string, ...string[]];
3137
3643
  /**
3138
3644
  * Filter creatives assigned to any of these media buys
3645
+ *
3646
+ * @minItems 1
3139
3647
  */
3140
- media_buy_ids?: string[];
3648
+ media_buy_ids?: [string, ...string[]];
3141
3649
  /**
3142
3650
  * Filter creatives assigned to media buys with any of these buyer references
3651
+ *
3652
+ * @minItems 1
3143
3653
  */
3144
- buyer_refs?: string[];
3654
+ buyer_refs?: [string, ...string[]];
3145
3655
  /**
3146
3656
  * Filter for unassigned creatives when true, assigned creatives when false
3147
3657
  */
@@ -3153,7 +3663,7 @@ export interface CreativeFilters {
3153
3663
  [k: string]: unknown | undefined;
3154
3664
  }
3155
3665
  /**
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.
3666
+ * Standard cursor-based pagination parameters for list operations
3157
3667
  */
3158
3668
  /**
3159
3669
  * Sort direction for list queries
@@ -3206,11 +3716,11 @@ export interface ListCreativesResponse {
3206
3716
  /**
3207
3717
  * Total number of creatives matching filters (across all pages)
3208
3718
  */
3209
- total_matching: number;
3719
+ total_matching?: number;
3210
3720
  /**
3211
3721
  * Number of creatives returned in this response
3212
3722
  */
3213
- returned: number;
3723
+ returned?: number;
3214
3724
  /**
3215
3725
  * List of filters that were applied to the query
3216
3726
  */
@@ -3223,31 +3733,7 @@ export interface ListCreativesResponse {
3223
3733
  direction?: SortDirection;
3224
3734
  };
3225
3735
  };
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
- };
3736
+ pagination: PaginationResponse;
3251
3737
  /**
3252
3738
  * Array of creative assets matching the query
3253
3739
  */
@@ -3386,7 +3872,7 @@ export interface ListCreativesResponse {
3386
3872
  ext?: ExtensionObject;
3387
3873
  }
3388
3874
  /**
3389
- * Account that owns this creative
3875
+ * Standard cursor-based pagination metadata for list responses
3390
3876
  */
3391
3877
  /**
3392
3878
  * Request parameters for updating campaign and package settings
@@ -3449,6 +3935,7 @@ export type PackageUpdate = {
3449
3935
  * Pause/resume specific package (true = paused, false = active)
3450
3936
  */
3451
3937
  paused?: boolean;
3938
+ optimization_goal?: OptimizationGoal;
3452
3939
  targeting_overlay?: TargetingOverlay;
3453
3940
  /**
3454
3941
  * Replace creative assignments for this package with optional weights and placement targeting. Uses replacement semantics - omit to leave assignments unchanged.
@@ -3457,9 +3944,10 @@ export type PackageUpdate = {
3457
3944
  /**
3458
3945
  * Upload new creative assets and assign to this package (creatives will be added to library). Use creative_assignments instead for existing library creatives.
3459
3946
  *
3947
+ * @minItems 1
3460
3948
  * @maxItems 100
3461
3949
  */
3462
- creatives?: CreativeAsset[];
3950
+ creatives?: [CreativeAsset, ...CreativeAsset[]];
3463
3951
  ext?: ExtensionObject;
3464
3952
  [k: string]: unknown | undefined;
3465
3953
  } & {
@@ -3517,6 +4005,10 @@ export type MediaBuyStatus = 'pending_activation' | 'active' | 'paused' | 'compl
3517
4005
  * Request parameters for retrieving comprehensive delivery metrics
3518
4006
  */
3519
4007
  export interface GetMediaBuyDeliveryRequest {
4008
+ /**
4009
+ * 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.
4010
+ */
4011
+ account_id?: string;
3520
4012
  /**
3521
4013
  * Array of publisher media buy IDs to get delivery data for
3522
4014
  */
@@ -3530,11 +4022,11 @@ export interface GetMediaBuyDeliveryRequest {
3530
4022
  */
3531
4023
  status_filter?: MediaBuyStatus | MediaBuyStatus[];
3532
4024
  /**
3533
- * Start date for reporting period (YYYY-MM-DD)
4025
+ * 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
4026
  */
3535
4027
  start_date?: string;
3536
4028
  /**
3537
- * End date for reporting period (YYYY-MM-DD)
4029
+ * 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
4030
  */
3539
4031
  end_date?: string;
3540
4032
  context?: ContextObject;
@@ -3543,14 +4035,18 @@ export interface GetMediaBuyDeliveryRequest {
3543
4035
  /**
3544
4036
  * 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
4037
  */
4038
+ /**
4039
+ * Attribution model used to assign credit when multiple touchpoints exist
4040
+ */
4041
+ export type AttributionModel = 'last_touch' | 'first_touch' | 'linear' | 'time_decay' | 'data_driven';
3546
4042
  /**
3547
4043
  * Pricing model used for this media buy
3548
4044
  */
3549
- export type PricingModel = 'cpm' | 'vcpm' | 'cpc' | 'cpcv' | 'cpv' | 'cpp' | 'flat_rate';
4045
+ export type PricingModel = 'cpm' | 'vcpm' | 'cpc' | 'cpcv' | 'cpv' | 'cpp' | 'cpa' | 'flat_rate' | 'time';
3550
4046
  /**
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.
4047
+ * The event type
3552
4048
  */
3553
- export type PricingModel1 = 'cpm' | 'vcpm' | 'cpc' | 'cpcv' | 'cpv' | 'cpp' | 'flat_rate';
4049
+ export type PricingModel1 = 'cpm' | 'vcpm' | 'cpc' | 'cpcv' | 'cpv' | 'cpp' | 'cpa' | 'flat_rate' | 'time';
3554
4050
  /**
3555
4051
  * Response payload for get_media_buy_delivery task
3556
4052
  */
@@ -3592,6 +4088,7 @@ export interface GetMediaBuyDeliveryResponse {
3592
4088
  * ISO 4217 currency code
3593
4089
  */
3594
4090
  currency: string;
4091
+ attribution_window?: AttributionWindow;
3595
4092
  /**
3596
4093
  * Combined metrics across all returned media buys. Only included in API responses (get_media_buy_delivery), not in webhook notifications.
3597
4094
  */
@@ -3612,6 +4109,26 @@ export interface GetMediaBuyDeliveryResponse {
3612
4109
  * Total video completions across all media buys (if applicable)
3613
4110
  */
3614
4111
  video_completions?: number;
4112
+ /**
4113
+ * Total conversions across all media buys (if applicable)
4114
+ */
4115
+ conversions?: number;
4116
+ /**
4117
+ * Total conversion value across all media buys (if applicable)
4118
+ */
4119
+ conversion_value?: number;
4120
+ /**
4121
+ * Aggregate return on ad spend across all media buys (total conversion_value / total spend)
4122
+ */
4123
+ roas?: number;
4124
+ /**
4125
+ * 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)
4126
+ */
4127
+ new_to_brand_rate?: number;
4128
+ /**
4129
+ * Aggregate cost per conversion across all media buys (total spend / total conversions)
4130
+ */
4131
+ cost_per_acquisition?: number;
3615
4132
  /**
3616
4133
  * Number of media buys included in the response
3617
4134
  */
@@ -3681,6 +4198,19 @@ export interface GetMediaBuyDeliveryResponse {
3681
4198
  * Whether this package is currently paused by the buyer
3682
4199
  */
3683
4200
  paused?: boolean;
4201
+ /**
4202
+ * Metrics broken down by creative within this package. Available when the seller supports creative-level reporting.
4203
+ */
4204
+ by_creative?: (DeliveryMetrics & {
4205
+ /**
4206
+ * Creative identifier matching the creative assignment
4207
+ */
4208
+ creative_id: string;
4209
+ /**
4210
+ * 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.
4211
+ */
4212
+ weight?: number;
4213
+ })[];
3684
4214
  })[];
3685
4215
  /**
3686
4216
  * Day-by-day delivery
@@ -3698,6 +4228,22 @@ export interface GetMediaBuyDeliveryResponse {
3698
4228
  * Daily spend
3699
4229
  */
3700
4230
  spend: number;
4231
+ /**
4232
+ * Daily conversions
4233
+ */
4234
+ conversions?: number;
4235
+ /**
4236
+ * Daily conversion value
4237
+ */
4238
+ conversion_value?: number;
4239
+ /**
4240
+ * Daily return on ad spend (conversion_value / spend)
4241
+ */
4242
+ roas?: number;
4243
+ /**
4244
+ * Daily fraction of conversions from first-time brand buyers (0 = none, 1 = all)
4245
+ */
4246
+ new_to_brand_rate?: number;
3701
4247
  }[];
3702
4248
  }[];
3703
4249
  /**
@@ -3707,6 +4253,21 @@ export interface GetMediaBuyDeliveryResponse {
3707
4253
  context?: ContextObject;
3708
4254
  ext?: ExtensionObject;
3709
4255
  }
4256
+ /**
4257
+ * 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).
4258
+ */
4259
+ export interface AttributionWindow {
4260
+ /**
4261
+ * Click-through attribution window in days. Conversions occurring within this many days after a click are attributed to the ad.
4262
+ */
4263
+ click_window_days?: number;
4264
+ /**
4265
+ * View-through attribution window in days. Conversions occurring within this many days after an ad impression (without click) are attributed to the ad.
4266
+ */
4267
+ view_window_days?: number;
4268
+ model: AttributionModel;
4269
+ [k: string]: unknown | undefined;
4270
+ }
3710
4271
  /**
3711
4272
  * Standard delivery metrics that can be reported at media buy, package, or creative level
3712
4273
  */
@@ -3740,13 +4301,48 @@ export interface DeliveryMetrics {
3740
4301
  */
3741
4302
  completion_rate?: number;
3742
4303
  /**
3743
- * Conversions (reserved for future CPA pricing support)
4304
+ * Total conversions attributed to this delivery. When by_event_type is present, this equals the sum of all by_event_type[].count entries.
3744
4305
  */
3745
4306
  conversions?: number;
3746
4307
  /**
3747
- * Leads generated (reserved for future CPL pricing support)
4308
+ * Total monetary value of attributed conversions (in the reporting currency)
4309
+ */
4310
+ conversion_value?: number;
4311
+ /**
4312
+ * Return on ad spend (conversion_value / spend)
4313
+ */
4314
+ roas?: number;
4315
+ /**
4316
+ * Cost per conversion (spend / conversions)
4317
+ */
4318
+ cost_per_acquisition?: number;
4319
+ /**
4320
+ * Fraction of conversions from first-time brand buyers (0 = none, 1 = all)
4321
+ */
4322
+ new_to_brand_rate?: number;
4323
+ /**
4324
+ * Leads generated (convenience alias for by_event_type where event_type='lead')
3748
4325
  */
3749
4326
  leads?: number;
4327
+ /**
4328
+ * 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.
4329
+ */
4330
+ by_event_type?: {
4331
+ event_type: EventType;
4332
+ /**
4333
+ * Event source that produced these conversions (for disambiguation when multiple event sources are configured)
4334
+ */
4335
+ event_source_id?: string;
4336
+ /**
4337
+ * Number of events of this type
4338
+ */
4339
+ count: number;
4340
+ /**
4341
+ * Total monetary value of events of this type
4342
+ */
4343
+ value?: number;
4344
+ [k: string]: unknown | undefined;
4345
+ }[];
3750
4346
  /**
3751
4347
  * Gross Rating Points delivered (for CPP)
3752
4348
  */
@@ -3836,10 +4432,59 @@ export interface DeliveryMetrics {
3836
4432
  }[];
3837
4433
  [k: string]: unknown | undefined;
3838
4434
  };
3839
- [k: string]: unknown | undefined;
3840
- }
3841
- /**
3842
- * Standard error structure for task-specific errors and warnings
4435
+ /**
4436
+ * Viewability metrics. Viewable rate should be calculated as viewable_impressions / measurable_impressions (not total impressions), since some environments cannot measure viewability.
4437
+ */
4438
+ viewability?: {
4439
+ /**
4440
+ * Impressions where viewability could be measured. Excludes environments without measurement capability (e.g., non-Intersection Observer browsers, certain app environments).
4441
+ */
4442
+ measurable_impressions?: number;
4443
+ /**
4444
+ * Impressions that met the viewability threshold defined by the measurement standard.
4445
+ */
4446
+ viewable_impressions?: number;
4447
+ /**
4448
+ * Viewable impression rate (viewable_impressions / measurable_impressions). Range 0.0 to 1.0.
4449
+ */
4450
+ viewable_rate?: number;
4451
+ /**
4452
+ * 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.
4453
+ */
4454
+ standard?: 'mrc' | 'groupm';
4455
+ [k: string]: unknown | undefined;
4456
+ };
4457
+ /**
4458
+ * 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).
4459
+ */
4460
+ engagement_rate?: number;
4461
+ /**
4462
+ * Cost per click (spend / clicks)
4463
+ */
4464
+ cost_per_click?: number;
4465
+ /**
4466
+ * Conversion metrics broken down by action source (website, app, in_store, etc.). Useful for omnichannel sellers where conversions occur across digital and physical channels.
4467
+ */
4468
+ by_action_source?: {
4469
+ action_source: ActionSource;
4470
+ /**
4471
+ * Event source that produced these conversions (for disambiguation when multiple event sources are configured)
4472
+ */
4473
+ event_source_id?: string;
4474
+ /**
4475
+ * Number of conversions from this action source
4476
+ */
4477
+ count: number;
4478
+ /**
4479
+ * Total monetary value of conversions from this action source
4480
+ */
4481
+ value?: number;
4482
+ [k: string]: unknown | undefined;
4483
+ }[];
4484
+ [k: string]: unknown | undefined;
4485
+ }
4486
+ /**
4487
+ * Standard error structure for task-specific errors and warnings
3843
4488
  */
3844
4489
  /**
3845
4490
  * Request payload for provide_performance_feedback task
@@ -3922,6 +4567,355 @@ export interface ProvidePerformanceFeedbackError {
3922
4567
  context?: ContextObject;
3923
4568
  ext?: ExtensionObject;
3924
4569
  }
4570
+ /**
4571
+ * Standard error structure for task-specific errors and warnings
4572
+ */
4573
+ /**
4574
+ * Standard marketing event types for event logging, aligned with IAB ECAPI
4575
+ */
4576
+ export interface SyncEventSourcesRequest {
4577
+ /**
4578
+ * Account to configure event sources for
4579
+ */
4580
+ account_id: string;
4581
+ /**
4582
+ * 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.
4583
+ */
4584
+ event_sources?: {
4585
+ /**
4586
+ * Unique identifier for this event source
4587
+ */
4588
+ event_source_id: string;
4589
+ /**
4590
+ * Human-readable name for this event source
4591
+ */
4592
+ name?: string;
4593
+ /**
4594
+ * Event types this source handles (e.g. purchase, lead). If omitted, accepts all event types.
4595
+ */
4596
+ event_types?: EventType[];
4597
+ /**
4598
+ * Domains authorized to send events for this event source
4599
+ */
4600
+ allowed_domains?: string[];
4601
+ }[];
4602
+ /**
4603
+ * When true, event sources not included in this sync will be removed
4604
+ */
4605
+ delete_missing?: boolean;
4606
+ context?: ContextObject;
4607
+ ext?: ExtensionObject;
4608
+ }
4609
+ /**
4610
+ * 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.
4611
+ */
4612
+ /**
4613
+ * Response from event source sync operation. Returns either per-source results OR operation-level errors.
4614
+ */
4615
+ export type SyncEventSourcesResponse = SyncEventSourcesSuccess | SyncEventSourcesError;
4616
+ /**
4617
+ * Standard marketing event types for event logging, aligned with IAB ECAPI
4618
+ */
4619
+ export interface SyncEventSourcesSuccess {
4620
+ /**
4621
+ * Results for each event source, including both synced and seller-managed sources on the account
4622
+ */
4623
+ event_sources: {
4624
+ /**
4625
+ * Event source ID from the request
4626
+ */
4627
+ event_source_id: string;
4628
+ /**
4629
+ * Name of the event source
4630
+ */
4631
+ name?: string;
4632
+ /**
4633
+ * Seller-assigned identifier for this event source (the ID in the seller's ad platform)
4634
+ */
4635
+ seller_id?: string;
4636
+ /**
4637
+ * Event types this source handles
4638
+ */
4639
+ event_types?: EventType[];
4640
+ action_source?: ActionSource;
4641
+ /**
4642
+ * 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).
4643
+ */
4644
+ managed_by?: 'buyer' | 'seller';
4645
+ /**
4646
+ * Implementation details for activating this event source (e.g. JavaScript tag, pixel URL)
4647
+ */
4648
+ setup?: {
4649
+ /**
4650
+ * Code snippet to place on the site (JavaScript, HTML pixel, etc.)
4651
+ */
4652
+ snippet?: string;
4653
+ /**
4654
+ * Type of implementation. 'server_only' means no client-side tag is needed.
4655
+ */
4656
+ snippet_type?: 'javascript' | 'html' | 'pixel_url' | 'server_only';
4657
+ /**
4658
+ * Human/agent-readable setup instructions
4659
+ */
4660
+ instructions?: string;
4661
+ };
4662
+ /**
4663
+ * Action taken for this event source
4664
+ */
4665
+ action: 'created' | 'updated' | 'unchanged' | 'deleted' | 'failed';
4666
+ /**
4667
+ * Errors for this event source (only present when action='failed')
4668
+ */
4669
+ errors?: string[];
4670
+ }[];
4671
+ context?: ContextObject;
4672
+ ext?: ExtensionObject;
4673
+ }
4674
+ /**
4675
+ * 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.
4676
+ */
4677
+ export interface SyncEventSourcesError {
4678
+ /**
4679
+ * Operation-level errors that prevented processing
4680
+ */
4681
+ errors: Error[];
4682
+ context?: ContextObject;
4683
+ ext?: ExtensionObject;
4684
+ }
4685
+ /**
4686
+ * Standard error structure for task-specific errors and warnings
4687
+ */
4688
+ /**
4689
+ * Standard event type
4690
+ */
4691
+ export type UserMatch = {
4692
+ [k: string]: unknown | undefined;
4693
+ } & {
4694
+ /**
4695
+ * Universal ID values for user matching
4696
+ *
4697
+ * @minItems 1
4698
+ */
4699
+ uids?: [
4700
+ {
4701
+ type: UIDType;
4702
+ /**
4703
+ * Universal ID value
4704
+ */
4705
+ value: string;
4706
+ [k: string]: unknown | undefined;
4707
+ },
4708
+ ...{
4709
+ type: UIDType;
4710
+ /**
4711
+ * Universal ID value
4712
+ */
4713
+ value: string;
4714
+ [k: string]: unknown | undefined;
4715
+ }[]
4716
+ ];
4717
+ /**
4718
+ * SHA-256 hash of lowercase, trimmed email address. Buyer must normalize before hashing: lowercase, trim whitespace.
4719
+ */
4720
+ hashed_email?: string;
4721
+ /**
4722
+ * SHA-256 hash of E.164-formatted phone number (e.g. +12065551234). Buyer must normalize to E.164 before hashing.
4723
+ */
4724
+ hashed_phone?: string;
4725
+ /**
4726
+ * Platform click identifier (fbclid, gclid, ttclid, ScCid, etc.)
4727
+ */
4728
+ click_id?: string;
4729
+ /**
4730
+ * Type of click identifier (e.g. fbclid, gclid, ttclid, msclkid, ScCid)
4731
+ */
4732
+ click_id_type?: string;
4733
+ /**
4734
+ * Client IP address for probabilistic matching
4735
+ */
4736
+ client_ip?: string;
4737
+ /**
4738
+ * Client user agent string for probabilistic matching
4739
+ */
4740
+ client_user_agent?: string;
4741
+ ext?: ExtensionObject;
4742
+ [k: string]: unknown | undefined;
4743
+ };
4744
+ /**
4745
+ * Universal ID type
4746
+ */
4747
+ export type UIDType = 'rampid' | 'id5' | 'uid2' | 'euid' | 'pairid' | 'external_id' | 'maid' | 'other';
4748
+ /**
4749
+ * Where the event originated
4750
+ */
4751
+ export interface LogEventRequest {
4752
+ /**
4753
+ * Event source configured on the account via sync_event_sources
4754
+ */
4755
+ event_source_id: string;
4756
+ /**
4757
+ * Test event code for validation without affecting production data. Events with this code appear in the platform's test events UI.
4758
+ */
4759
+ test_event_code?: string;
4760
+ /**
4761
+ * Events to log
4762
+ *
4763
+ * @maxItems 10000
4764
+ */
4765
+ events: Event[];
4766
+ context?: ContextObject;
4767
+ ext?: ExtensionObject;
4768
+ }
4769
+ /**
4770
+ * A marketing event (conversion, engagement, or custom) for attribution and optimization
4771
+ */
4772
+ export interface Event {
4773
+ /**
4774
+ * Unique identifier for deduplication (scoped to event_type + event_source_id)
4775
+ */
4776
+ event_id: string;
4777
+ event_type: EventType;
4778
+ /**
4779
+ * ISO 8601 timestamp when the event occurred
4780
+ */
4781
+ event_time: string;
4782
+ user_match?: UserMatch;
4783
+ custom_data?: EventCustomData;
4784
+ action_source?: ActionSource;
4785
+ /**
4786
+ * URL where the event occurred (required when action_source is 'website')
4787
+ */
4788
+ event_source_url?: string;
4789
+ /**
4790
+ * Name for custom events (used when event_type is 'custom')
4791
+ */
4792
+ custom_event_name?: string;
4793
+ ext?: ExtensionObject;
4794
+ [k: string]: unknown | undefined;
4795
+ }
4796
+ /**
4797
+ * 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.
4798
+ */
4799
+ export interface EventCustomData {
4800
+ /**
4801
+ * Monetary value of the event (should be accompanied by currency)
4802
+ */
4803
+ value?: number;
4804
+ /**
4805
+ * ISO 4217 currency code
4806
+ */
4807
+ currency?: string;
4808
+ /**
4809
+ * Unique order or transaction identifier
4810
+ */
4811
+ order_id?: string;
4812
+ /**
4813
+ * Product or content identifiers
4814
+ */
4815
+ content_ids?: string[];
4816
+ /**
4817
+ * Category of content (product, service, etc.)
4818
+ */
4819
+ content_type?: string;
4820
+ /**
4821
+ * Name of the product or content
4822
+ */
4823
+ content_name?: string;
4824
+ /**
4825
+ * Category of the product or content
4826
+ */
4827
+ content_category?: string;
4828
+ /**
4829
+ * Number of items in the event
4830
+ */
4831
+ num_items?: number;
4832
+ /**
4833
+ * Search query for search events
4834
+ */
4835
+ search_string?: string;
4836
+ /**
4837
+ * Per-item details for e-commerce events
4838
+ */
4839
+ contents?: {
4840
+ /**
4841
+ * Product or content identifier
4842
+ */
4843
+ id: string;
4844
+ /**
4845
+ * Quantity of this item
4846
+ */
4847
+ quantity?: number;
4848
+ /**
4849
+ * Price per unit of this item
4850
+ */
4851
+ price?: number;
4852
+ /**
4853
+ * Brand name of this item
4854
+ */
4855
+ brand?: string;
4856
+ [k: string]: unknown | undefined;
4857
+ }[];
4858
+ ext?: ExtensionObject;
4859
+ [k: string]: unknown | undefined;
4860
+ }
4861
+ /**
4862
+ * 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.
4863
+ */
4864
+ /**
4865
+ * Response from event logging operation. Returns either event processing results OR operation-level errors.
4866
+ */
4867
+ export type LogEventResponse = LogEventSuccess | LogEventError;
4868
+ /**
4869
+ * Success response - events received and queued for processing
4870
+ */
4871
+ export interface LogEventSuccess {
4872
+ /**
4873
+ * Number of events received
4874
+ */
4875
+ events_received: number;
4876
+ /**
4877
+ * Number of events successfully queued for processing
4878
+ */
4879
+ events_processed: number;
4880
+ /**
4881
+ * Events that failed validation
4882
+ */
4883
+ partial_failures?: {
4884
+ /**
4885
+ * ID of the failed event
4886
+ */
4887
+ event_id: string;
4888
+ /**
4889
+ * Error code
4890
+ */
4891
+ code: string;
4892
+ /**
4893
+ * Human-readable error message
4894
+ */
4895
+ message: string;
4896
+ }[];
4897
+ /**
4898
+ * Non-fatal issues (low match quality, missing recommended fields, deprecation notices)
4899
+ */
4900
+ warnings?: string[];
4901
+ /**
4902
+ * Overall match quality score for the batch (0.0 = no matches, 1.0 = all matched)
4903
+ */
4904
+ match_quality?: number;
4905
+ context?: ContextObject;
4906
+ ext?: ExtensionObject;
4907
+ }
4908
+ /**
4909
+ * 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.
4910
+ */
4911
+ export interface LogEventError {
4912
+ /**
4913
+ * Operation-level errors
4914
+ */
4915
+ errors: Error[];
4916
+ context?: ContextObject;
4917
+ ext?: ExtensionObject;
4918
+ }
3925
4919
  /**
3926
4920
  * Standard error structure for task-specific errors and warnings
3927
4921
  */
@@ -3930,7 +4924,7 @@ export interface ProvidePerformanceFeedbackError {
3930
4924
  */
3931
4925
  export type HTTPMethod = 'GET' | 'POST';
3932
4926
  /**
3933
- * Expected content type of webhook response
4927
+ * 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.
3934
4928
  */
3935
4929
  export type WebhookResponseType = 'html' | 'json' | 'xml' | 'javascript';
3936
4930
  /**
@@ -3962,7 +4956,7 @@ export interface CreativeManifest {
3962
4956
  /**
3963
4957
  * 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
4958
  *
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.
4959
+ * 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.
3966
4960
  */
3967
4961
  assets: {
3968
4962
  [k: string]: unknown | undefined;
@@ -3984,13 +4978,13 @@ export interface WebhookAsset {
3984
4978
  */
3985
4979
  timeout_ms?: number;
3986
4980
  /**
3987
- * Universal macros that can be passed to webhook (e.g., {DEVICE_TYPE}, {COUNTRY})
4981
+ * Universal macros that can be passed to webhook (e.g., DEVICE_TYPE, COUNTRY). See docs/creative/universal-macros.mdx for full list.
3988
4982
  */
3989
- supported_macros?: string[];
4983
+ supported_macros?: (UniversalMacro | string)[];
3990
4984
  /**
3991
4985
  * Universal macros that must be provided for webhook to function
3992
4986
  */
3993
- required_macros?: string[];
4987
+ required_macros?: (UniversalMacro | string)[];
3994
4988
  response_type: WebhookResponseType;
3995
4989
  /**
3996
4990
  * Security configuration for webhook calls
@@ -4045,7 +5039,7 @@ export type PreviewCreativeRequest = {
4045
5039
  * Discriminator indicating this is a single preview request
4046
5040
  */
4047
5041
  request_type: 'single';
4048
- format_id: FormatID;
5042
+ format_id?: FormatID;
4049
5043
  creative_manifest: CreativeManifest;
4050
5044
  /**
4051
5045
  * 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 +5078,7 @@ export type PreviewCreativeRequest = {
4084
5078
  * @maxItems 50
4085
5079
  */
4086
5080
  requests: {
4087
- format_id: FormatID2;
5081
+ format_id?: FormatID2;
4088
5082
  creative_manifest: CreativeManifest1;
4089
5083
  /**
4090
5084
  * Array of input sets for generating multiple preview variants
@@ -4114,6 +5108,22 @@ export type PreviewCreativeRequest = {
4114
5108
  output_format?: PreviewOutputFormat2;
4115
5109
  context?: ContextObject;
4116
5110
  ext?: ExtensionObject;
5111
+ } | {
5112
+ /**
5113
+ * Discriminator indicating this is a variant preview request
5114
+ */
5115
+ request_type: 'variant';
5116
+ /**
5117
+ * Platform-assigned variant identifier from get_creative_delivery response
5118
+ */
5119
+ variant_id: string;
5120
+ /**
5121
+ * Creative identifier for context
5122
+ */
5123
+ creative_id?: string;
5124
+ output_format?: PreviewOutputFormat3;
5125
+ context?: ContextObject;
5126
+ ext?: ExtensionObject;
4117
5127
  };
4118
5128
  /**
4119
5129
  * VAST (Video Ad Serving Template) tag for third-party video ad serving
@@ -4128,7 +5138,11 @@ export type PreviewOutputFormat1 = 'url' | 'html';
4128
5138
  */
4129
5139
  export type PreviewOutputFormat2 = 'url' | 'html';
4130
5140
  /**
4131
- * Format identifier for rendering the preview
5141
+ * Output format for the preview. 'url' returns preview_url (iframe-embeddable URL), 'html' returns preview_html (raw HTML for direct embedding).
5142
+ */
5143
+ export type PreviewOutputFormat3 = 'url' | 'html';
5144
+ /**
5145
+ * Format identifier for rendering the preview. Optional — defaults to creative_manifest.format_id if omitted.
4132
5146
  */
4133
5147
  export interface CreativeManifest1 {
4134
5148
  format_id: FormatID1;
@@ -4139,7 +5153,7 @@ export interface CreativeManifest1 {
4139
5153
  /**
4140
5154
  * 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
5155
  *
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.
5156
+ * 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
5157
  */
4144
5158
  assets: {
4145
5159
  [k: string]: unknown | undefined;
@@ -4150,7 +5164,7 @@ export interface CreativeManifest1 {
4150
5164
  /**
4151
5165
  * 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
5166
  */
4153
- export type PreviewCreativeResponse = PreviewCreativeSingleResponse | PreviewCreativeBatchResponse;
5167
+ export type PreviewCreativeResponse = PreviewCreativeSingleResponse | PreviewCreativeBatchResponse | PreviewCreativeVariantResponse;
4154
5168
  /**
4155
5169
  * A single rendered piece of a creative preview with discriminated output format
4156
5170
  */
@@ -4298,7 +5312,7 @@ export type PreviewRender = {
4298
5312
  [k: string]: unknown | undefined;
4299
5313
  };
4300
5314
  /**
4301
- * Single preview response - each preview URL returns an HTML page that can be embedded in an iframe
5315
+ * VAST (Video Ad Serving Template) tag for third-party video ad serving
4302
5316
  */
4303
5317
  export interface PreviewCreativeSingleResponse {
4304
5318
  /**
@@ -4349,26 +5363,470 @@ export interface PreviewCreativeSingleResponse {
4349
5363
  ext?: ExtensionObject;
4350
5364
  }
4351
5365
  /**
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.
5366
+ * 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.
5367
+ */
5368
+ export interface PreviewCreativeBatchResponse {
5369
+ /**
5370
+ * Discriminator indicating this is a batch preview response
5371
+ */
5372
+ response_type: 'batch';
5373
+ /**
5374
+ * 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.
5375
+ */
5376
+ results: (PreviewBatchResultSuccess | PreviewBatchResultError)[];
5377
+ context?: ContextObject;
5378
+ ext?: ExtensionObject;
5379
+ }
5380
+ export interface PreviewBatchResultSuccess {
5381
+ success?: true;
5382
+ }
5383
+ export interface PreviewBatchResultError {
5384
+ success?: false;
5385
+ }
5386
+ /**
5387
+ * Variant preview response - shows what a specific creative variant looked like when served during delivery
5388
+ */
5389
+ export interface PreviewCreativeVariantResponse {
5390
+ /**
5391
+ * Discriminator indicating this is a variant preview response
5392
+ */
5393
+ response_type: 'variant';
5394
+ /**
5395
+ * Platform-assigned variant identifier
5396
+ */
5397
+ variant_id: string;
5398
+ /**
5399
+ * Creative identifier this variant belongs to
5400
+ */
5401
+ creative_id?: string;
5402
+ /**
5403
+ * Array of rendered pieces for this variant. Most formats render as a single piece.
5404
+ */
5405
+ previews: {
5406
+ /**
5407
+ * Unique identifier for this preview
5408
+ */
5409
+ preview_id: string;
5410
+ /**
5411
+ * Rendered pieces for this variant
5412
+ */
5413
+ renders: PreviewRender[];
5414
+ }[];
5415
+ manifest?: CreativeManifest;
5416
+ /**
5417
+ * ISO 8601 timestamp when preview links expire
5418
+ */
5419
+ expires_at?: string;
5420
+ context?: ContextObject;
5421
+ ext?: ExtensionObject;
5422
+ }
5423
+ /**
5424
+ * The rendered creative manifest for this variant — the actual output that was served, not the input assets
5425
+ */
5426
+ /**
5427
+ * 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.
5428
+ */
5429
+ export type GetCreativeDeliveryRequest = {
5430
+ [k: string]: unknown | undefined;
5431
+ } & {
5432
+ /**
5433
+ * 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.
5434
+ */
5435
+ account_id?: string;
5436
+ /**
5437
+ * Filter to specific media buys by publisher ID. If omitted, returns creative delivery across all matching media buys.
5438
+ */
5439
+ media_buy_ids?: string[];
5440
+ /**
5441
+ * Filter to specific media buys by buyer reference ID. Alternative to media_buy_ids when the buyer doesn't have the publisher's identifiers.
5442
+ */
5443
+ media_buy_buyer_refs?: string[];
5444
+ /**
5445
+ * Filter to specific creatives by ID. If omitted, returns delivery for all creatives matching the other filters.
5446
+ */
5447
+ creative_ids?: string[];
5448
+ /**
5449
+ * Start date for delivery period (YYYY-MM-DD). Interpreted in the platform's reporting timezone.
5450
+ */
5451
+ start_date?: string;
5452
+ /**
5453
+ * End date for delivery period (YYYY-MM-DD). Interpreted in the platform's reporting timezone.
5454
+ */
5455
+ end_date?: string;
5456
+ /**
5457
+ * 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.
5458
+ */
5459
+ max_variants?: number;
5460
+ /**
5461
+ * Pagination parameters for the creatives array in the response. When omitted, the agent returns all matching creatives.
5462
+ */
5463
+ pagination?: {
5464
+ /**
5465
+ * Maximum number of creatives to return
5466
+ */
5467
+ limit?: number;
5468
+ /**
5469
+ * Number of creatives to skip
5470
+ */
5471
+ offset?: number;
5472
+ };
5473
+ context?: ContextObject;
5474
+ ext?: ExtensionObject;
5475
+ };
5476
+ /**
5477
+ * 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.
5478
+ */
5479
+ /**
5480
+ * The event type
5481
+ */
5482
+ export type CreativeVariant = DeliveryMetrics1 & {
5483
+ /**
5484
+ * Platform-assigned identifier for this variant
5485
+ */
5486
+ variant_id: string;
5487
+ manifest?: CreativeManifest;
5488
+ /**
5489
+ * 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.
5490
+ */
5491
+ generation_context?: {
5492
+ /**
5493
+ * Type of context that triggered generation (e.g., 'web_page', 'conversational', 'search', 'app', 'dooh')
5494
+ */
5495
+ context_type?: string;
5496
+ /**
5497
+ * 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.
5498
+ */
5499
+ artifact?: {
5500
+ property_id: Identifier;
5501
+ /**
5502
+ * Artifact identifier within the property
5503
+ */
5504
+ artifact_id: string;
5505
+ };
5506
+ ext?: ExtensionObject;
5507
+ [k: string]: unknown | undefined;
5508
+ };
5509
+ };
5510
+ /**
5511
+ * VAST (Video Ad Serving Template) tag for third-party video ad serving
5512
+ */
5513
+ 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';
5514
+ /**
5515
+ * Response payload for get_creative_delivery task. Returns creative delivery data with variant-level breakdowns including manifests and metrics.
5516
+ */
5517
+ export interface GetCreativeDeliveryResponse {
5518
+ /**
5519
+ * Account identifier. Present when the response spans or is scoped to a specific account.
5520
+ */
5521
+ account_id?: string;
5522
+ /**
5523
+ * Publisher's media buy identifier. Present when the request was scoped to a single media buy.
5524
+ */
5525
+ media_buy_id?: string;
5526
+ /**
5527
+ * Buyer's reference identifier for the media buy. Echoed back so the buyer can correlate without mapping publisher IDs.
5528
+ */
5529
+ media_buy_buyer_ref?: string;
5530
+ /**
5531
+ * ISO 4217 currency code for monetary values in this response (e.g., 'USD', 'EUR')
5532
+ */
5533
+ currency: string;
5534
+ /**
5535
+ * Date range for the report.
5536
+ */
5537
+ reporting_period: {
5538
+ /**
5539
+ * ISO 8601 start timestamp
5540
+ */
5541
+ start: string;
5542
+ /**
5543
+ * ISO 8601 end timestamp
5544
+ */
5545
+ end: string;
5546
+ /**
5547
+ * IANA timezone identifier for the reporting period (e.g., 'America/New_York', 'UTC'). Platforms report in their native timezone.
5548
+ */
5549
+ timezone?: string;
5550
+ };
5551
+ /**
5552
+ * Creative delivery data with variant breakdowns
5553
+ */
5554
+ creatives: {
5555
+ /**
5556
+ * Creative identifier
5557
+ */
5558
+ creative_id: string;
5559
+ /**
5560
+ * 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.
5561
+ */
5562
+ media_buy_id?: string;
5563
+ format_id?: FormatID;
5564
+ totals?: DeliveryMetrics;
5565
+ /**
5566
+ * 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.
5567
+ */
5568
+ variant_count?: number;
5569
+ /**
5570
+ * 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.
5571
+ */
5572
+ variants: CreativeVariant[];
5573
+ }[];
5574
+ /**
5575
+ * Pagination information. Present when the request included pagination parameters.
5576
+ */
5577
+ pagination?: {
5578
+ /**
5579
+ * Maximum number of creatives requested
5580
+ */
5581
+ limit: number;
5582
+ /**
5583
+ * Number of creatives skipped
5584
+ */
5585
+ offset: number;
5586
+ /**
5587
+ * Whether more creatives are available beyond this page
5588
+ */
5589
+ has_more: boolean;
5590
+ /**
5591
+ * Total number of creatives matching the request filters
5592
+ */
5593
+ total?: number;
5594
+ };
5595
+ /**
5596
+ * Task-specific errors and warnings
5597
+ */
5598
+ errors?: Error[];
5599
+ context?: ContextObject;
5600
+ ext?: ExtensionObject;
5601
+ }
5602
+ /**
5603
+ * Format of this creative
5604
+ */
5605
+ export interface DeliveryMetrics1 {
5606
+ /**
5607
+ * Impressions delivered
5608
+ */
5609
+ impressions?: number;
5610
+ /**
5611
+ * Amount spent
5612
+ */
5613
+ spend?: number;
5614
+ /**
5615
+ * Total clicks
5616
+ */
5617
+ clicks?: number;
5618
+ /**
5619
+ * Click-through rate (clicks/impressions)
5620
+ */
5621
+ ctr?: number;
5622
+ /**
5623
+ * Views at threshold (for CPV)
5624
+ */
5625
+ views?: number;
5626
+ /**
5627
+ * 100% completions (for CPCV)
5628
+ */
5629
+ completed_views?: number;
5630
+ /**
5631
+ * Completion rate (completed_views/impressions)
5632
+ */
5633
+ completion_rate?: number;
5634
+ /**
5635
+ * Total conversions attributed to this delivery. When by_event_type is present, this equals the sum of all by_event_type[].count entries.
5636
+ */
5637
+ conversions?: number;
5638
+ /**
5639
+ * Total monetary value of attributed conversions (in the reporting currency)
5640
+ */
5641
+ conversion_value?: number;
5642
+ /**
5643
+ * Return on ad spend (conversion_value / spend)
5644
+ */
5645
+ roas?: number;
5646
+ /**
5647
+ * Cost per conversion (spend / conversions)
5648
+ */
5649
+ cost_per_acquisition?: number;
5650
+ /**
5651
+ * Fraction of conversions from first-time brand buyers (0 = none, 1 = all)
5652
+ */
5653
+ new_to_brand_rate?: number;
5654
+ /**
5655
+ * Leads generated (convenience alias for by_event_type where event_type='lead')
5656
+ */
5657
+ leads?: number;
5658
+ /**
5659
+ * 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.
5660
+ */
5661
+ by_event_type?: {
5662
+ event_type: EventType;
5663
+ /**
5664
+ * Event source that produced these conversions (for disambiguation when multiple event sources are configured)
5665
+ */
5666
+ event_source_id?: string;
5667
+ /**
5668
+ * Number of events of this type
5669
+ */
5670
+ count: number;
5671
+ /**
5672
+ * Total monetary value of events of this type
5673
+ */
5674
+ value?: number;
5675
+ [k: string]: unknown | undefined;
5676
+ }[];
5677
+ /**
5678
+ * Gross Rating Points delivered (for CPP)
5679
+ */
5680
+ grps?: number;
5681
+ /**
5682
+ * Unique reach - units depend on measurement provider (e.g., individuals, households, devices, cookies). See delivery_measurement.provider for methodology.
5683
+ */
5684
+ reach?: number;
5685
+ /**
5686
+ * Average frequency per individual (typically measured over campaign duration, but can vary by measurement provider)
5687
+ */
5688
+ frequency?: number;
5689
+ /**
5690
+ * Video quartile completion data
5691
+ */
5692
+ quartile_data?: {
5693
+ /**
5694
+ * 25% completion views
5695
+ */
5696
+ q1_views?: number;
5697
+ /**
5698
+ * 50% completion views
5699
+ */
5700
+ q2_views?: number;
5701
+ /**
5702
+ * 75% completion views
5703
+ */
5704
+ q3_views?: number;
5705
+ /**
5706
+ * 100% completion views
5707
+ */
5708
+ q4_views?: number;
5709
+ };
5710
+ /**
5711
+ * DOOH-specific metrics (only included for DOOH campaigns)
5712
+ */
5713
+ dooh_metrics?: {
5714
+ /**
5715
+ * Number of times ad played in rotation
5716
+ */
5717
+ loop_plays?: number;
5718
+ /**
5719
+ * Number of unique screens displaying the ad
5720
+ */
5721
+ screens_used?: number;
5722
+ /**
5723
+ * Total display time in seconds
5724
+ */
5725
+ screen_time_seconds?: number;
5726
+ /**
5727
+ * Actual share of voice delivered (0.0 to 1.0)
5728
+ */
5729
+ sov_achieved?: number;
5730
+ /**
5731
+ * Explanation of how DOOH impressions were calculated
5732
+ */
5733
+ calculation_notes?: string;
5734
+ /**
5735
+ * Per-venue performance breakdown
5736
+ */
5737
+ venue_breakdown?: {
5738
+ /**
5739
+ * Venue identifier
5740
+ */
5741
+ venue_id: string;
5742
+ /**
5743
+ * Human-readable venue name
5744
+ */
5745
+ venue_name?: string;
5746
+ /**
5747
+ * Venue type (e.g., 'airport', 'transit', 'retail', 'billboard')
5748
+ */
5749
+ venue_type?: string;
5750
+ /**
5751
+ * Impressions delivered at this venue
5752
+ */
5753
+ impressions: number;
5754
+ /**
5755
+ * Loop plays at this venue
5756
+ */
5757
+ loop_plays?: number;
5758
+ /**
5759
+ * Number of screens used at this venue
5760
+ */
5761
+ screens_used?: number;
5762
+ [k: string]: unknown | undefined;
5763
+ }[];
5764
+ [k: string]: unknown | undefined;
5765
+ };
5766
+ /**
5767
+ * Viewability metrics. Viewable rate should be calculated as viewable_impressions / measurable_impressions (not total impressions), since some environments cannot measure viewability.
5768
+ */
5769
+ viewability?: {
5770
+ /**
5771
+ * Impressions where viewability could be measured. Excludes environments without measurement capability (e.g., non-Intersection Observer browsers, certain app environments).
5772
+ */
5773
+ measurable_impressions?: number;
5774
+ /**
5775
+ * Impressions that met the viewability threshold defined by the measurement standard.
5776
+ */
5777
+ viewable_impressions?: number;
5778
+ /**
5779
+ * Viewable impression rate (viewable_impressions / measurable_impressions). Range 0.0 to 1.0.
5780
+ */
5781
+ viewable_rate?: number;
5782
+ /**
5783
+ * 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.
5784
+ */
5785
+ standard?: 'mrc' | 'groupm';
5786
+ [k: string]: unknown | undefined;
5787
+ };
5788
+ /**
5789
+ * 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).
5790
+ */
5791
+ engagement_rate?: number;
5792
+ /**
5793
+ * Cost per click (spend / clicks)
5794
+ */
5795
+ cost_per_click?: number;
5796
+ /**
5797
+ * Conversion metrics broken down by action source (website, app, in_store, etc.). Useful for omnichannel sellers where conversions occur across digital and physical channels.
5798
+ */
5799
+ by_action_source?: {
5800
+ action_source: ActionSource;
5801
+ /**
5802
+ * Event source that produced these conversions (for disambiguation when multiple event sources are configured)
5803
+ */
5804
+ event_source_id?: string;
5805
+ /**
5806
+ * Number of conversions from this action source
5807
+ */
5808
+ count: number;
5809
+ /**
5810
+ * Total monetary value of conversions from this action source
5811
+ */
5812
+ value?: number;
5813
+ [k: string]: unknown | undefined;
5814
+ }[];
5815
+ [k: string]: unknown | undefined;
5816
+ }
5817
+ /**
5818
+ * 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
5819
  */
4354
- export interface PreviewCreativeBatchResponse {
4355
- /**
4356
- * Discriminator indicating this is a batch preview response
4357
- */
4358
- response_type: 'batch';
5820
+ export interface Identifier {
5821
+ type: PropertyIdentifierTypes;
4359
5822
  /**
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.
5823
+ * 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
5824
  */
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;
5825
+ value: string;
4371
5826
  }
5827
+ /**
5828
+ * Standard error structure for task-specific errors and warnings
5829
+ */
4372
5830
  /**
4373
5831
  * 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
5832
  */
@@ -4401,6 +5859,7 @@ export type GetSignalsRequest = {
4401
5859
  * Maximum number of results to return
4402
5860
  */
4403
5861
  max_results?: number;
5862
+ pagination?: PaginationRequest;
4404
5863
  context?: ContextObject;
4405
5864
  ext?: ExtensionObject;
4406
5865
  };
@@ -4446,12 +5905,16 @@ export type SignalCatalogType = 'marketplace' | 'custom' | 'owned';
4446
5905
  export interface SignalFilters {
4447
5906
  /**
4448
5907
  * Filter by catalog type
5908
+ *
5909
+ * @minItems 1
4449
5910
  */
4450
- catalog_types?: SignalCatalogType[];
5911
+ catalog_types?: [SignalCatalogType, ...SignalCatalogType[]];
4451
5912
  /**
4452
5913
  * Filter by specific data providers
5914
+ *
5915
+ * @minItems 1
4453
5916
  */
4454
- data_providers?: string[];
5917
+ data_providers?: [string, ...string[]];
4455
5918
  /**
4456
5919
  * Maximum CPM price filter
4457
5920
  */
@@ -4463,7 +5926,7 @@ export interface SignalFilters {
4463
5926
  [k: string]: unknown | undefined;
4464
5927
  }
4465
5928
  /**
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.
5929
+ * Standard cursor-based pagination parameters for list operations
4467
5930
  */
4468
5931
  /**
4469
5932
  * Universal signal identifier referencing the data provider's catalog. Use this to verify authorization and look up signal definitions.
@@ -4636,6 +6099,7 @@ export interface GetSignalsResponse {
4636
6099
  * Task-specific errors and warnings (e.g., signal discovery or pricing issues)
4637
6100
  */
4638
6101
  errors?: Error[];
6102
+ pagination?: PaginationResponse;
4639
6103
  context?: ContextObject;
4640
6104
  ext?: ExtensionObject;
4641
6105
  }
@@ -4696,10 +6160,6 @@ export type BasePropertySource = PublisherTagsSource | PublisherPropertyIDsSourc
4696
6160
  /**
4697
6161
  * Tag for categorizing publisher properties. Must be lowercase alphanumeric with underscores only.
4698
6162
  */
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
6163
  export type PropertyType = 'website' | 'mobile_app' | 'ctv_app' | 'desktop_app' | 'dooh' | 'podcast' | 'radio' | 'streaming_audio';
4704
6164
  /**
4705
6165
  * 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 +6238,37 @@ export interface DirectIdentifiersSource {
4778
6238
  /**
4779
6239
  * A property identifier with type and value. Used to identify properties across platforms (domains, app store IDs, etc.).
4780
6240
  */
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
6241
  export interface PropertyListFilters {
4792
6242
  /**
4793
6243
  * Property must have feature data for ALL listed countries (ISO codes). Required.
6244
+ *
6245
+ * @minItems 1
4794
6246
  */
4795
- countries_all: string[];
6247
+ countries_all: [string, ...string[]];
4796
6248
  /**
4797
6249
  * Property must support ANY of the listed channels. Required.
6250
+ *
6251
+ * @minItems 1
4798
6252
  */
4799
- channels_any: MediaChannel[];
6253
+ channels_any: [MediaChannel, ...MediaChannel[]];
4800
6254
  /**
4801
6255
  * Filter to these property types
6256
+ *
6257
+ * @minItems 1
4802
6258
  */
4803
- property_types?: PropertyType[];
6259
+ property_types?: [PropertyType, ...PropertyType[]];
4804
6260
  /**
4805
6261
  * Feature-based requirements. Property must pass ALL requirements (AND logic).
6262
+ *
6263
+ * @minItems 1
4806
6264
  */
4807
- feature_requirements?: FeatureRequirement[];
6265
+ feature_requirements?: [FeatureRequirement, ...FeatureRequirement[]];
4808
6266
  /**
4809
6267
  * Identifiers to always exclude from results
6268
+ *
6269
+ * @minItems 1
4810
6270
  */
4811
- exclude_identifiers?: Identifier[];
6271
+ exclude_identifiers?: [Identifier, ...Identifier[]];
4812
6272
  }
4813
6273
  /**
4814
6274
  * A feature-based requirement for property filtering. Use min_value/max_value for quantitative features, allowed_values for binary/categorical features.
@@ -4828,8 +6288,10 @@ export interface FeatureRequirement {
4828
6288
  max_value?: number;
4829
6289
  /**
4830
6290
  * Values that pass the requirement (for binary/categorical features)
6291
+ *
6292
+ * @minItems 1
4831
6293
  */
4832
- allowed_values?: unknown[];
6294
+ allowed_values?: [unknown, ...unknown[]];
4833
6295
  /**
4834
6296
  * 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
6297
  */
@@ -4954,13 +6416,18 @@ export interface GetPropertyListRequest {
4954
6416
  */
4955
6417
  resolve?: boolean;
4956
6418
  /**
4957
- * Maximum identifiers to return (for large lists)
4958
- */
4959
- max_results?: number;
4960
- /**
4961
- * Pagination cursor for large result sets
6419
+ * Pagination parameters. Uses higher limits than standard pagination because property lists can contain tens of thousands of identifiers.
4962
6420
  */
4963
- cursor?: string;
6421
+ pagination?: {
6422
+ /**
6423
+ * Maximum number of identifiers to return per page
6424
+ */
6425
+ max_results?: number;
6426
+ /**
6427
+ * Opaque cursor from a previous response to fetch the next page
6428
+ */
6429
+ cursor?: string;
6430
+ };
4964
6431
  context?: ContextObject;
4965
6432
  ext?: ExtensionObject;
4966
6433
  }
@@ -4976,27 +6443,7 @@ export interface GetPropertyListResponse {
4976
6443
  * Resolved identifiers that passed filters (if resolve=true). Cache these locally for real-time use.
4977
6444
  */
4978
6445
  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
- };
6446
+ pagination?: PaginationResponse;
5000
6447
  /**
5001
6448
  * When the list was resolved
5002
6449
  */
@@ -5028,19 +6475,12 @@ export interface ListPropertyListsRequest {
5028
6475
  * Filter to lists whose name contains this string
5029
6476
  */
5030
6477
  name_contains?: string;
5031
- /**
5032
- * Maximum lists to return
5033
- */
5034
- max_results?: number;
5035
- /**
5036
- * Pagination cursor
5037
- */
5038
- cursor?: string;
6478
+ pagination?: PaginationRequest;
5039
6479
  context?: ContextObject;
5040
6480
  ext?: ExtensionObject;
5041
6481
  }
5042
6482
  /**
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.
6483
+ * Standard cursor-based pagination parameters for list operations
5044
6484
  */
5045
6485
  /**
5046
6486
  * A source of properties for a property list. Supports three selection patterns: publisher with tags, publisher with property IDs, or direct identifiers.
@@ -5050,27 +6490,7 @@ export interface ListPropertyListsResponse {
5050
6490
  * Array of property lists (metadata only, not resolved properties)
5051
6491
  */
5052
6492
  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
- };
6493
+ pagination?: PaginationResponse;
5074
6494
  ext?: ExtensionObject;
5075
6495
  }
5076
6496
  /**
@@ -5123,11 +6543,12 @@ export interface ListContentStandardsRequest {
5123
6543
  * Filter by ISO 3166-1 alpha-2 country codes
5124
6544
  */
5125
6545
  countries?: string[];
6546
+ pagination?: PaginationRequest;
5126
6547
  context?: ContextObject;
5127
6548
  ext?: ExtensionObject;
5128
6549
  }
5129
6550
  /**
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.
6551
+ * Standard cursor-based pagination parameters for list operations
5131
6552
  */
5132
6553
  /**
5133
6554
  * Response payload with list of content standards configurations
@@ -5143,6 +6564,7 @@ export type ListContentStandardsResponse = {
5143
6564
  errors?: {
5144
6565
  [k: string]: unknown | undefined;
5145
6566
  };
6567
+ pagination?: PaginationResponse;
5146
6568
  context?: ContextObject;
5147
6569
  ext?: ExtensionObject;
5148
6570
  } | {
@@ -5242,12 +6664,16 @@ export interface ContentStandards {
5242
6664
  name?: string;
5243
6665
  /**
5244
6666
  * ISO 3166-1 alpha-2 country codes. Standards apply in ALL listed countries (AND logic).
6667
+ *
6668
+ * @minItems 1
5245
6669
  */
5246
- countries_all?: string[];
6670
+ countries_all?: [string, ...string[]];
5247
6671
  /**
5248
6672
  * Advertising channels. Standards apply to ANY of the listed channels (OR logic).
6673
+ *
6674
+ * @minItems 1
5249
6675
  */
5250
- channels_any?: MediaChannel[];
6676
+ channels_any?: [MediaChannel, ...MediaChannel[]];
5251
6677
  /**
5252
6678
  * 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
6679
  *
@@ -6056,6 +7482,10 @@ export type ValidateContentDeliveryResponse = {
6056
7482
  * Request parameters for retrieving content artifacts from a media buy for validation
6057
7483
  */
6058
7484
  export interface GetMediaBuyArtifactsRequest {
7485
+ /**
7486
+ * 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.
7487
+ */
7488
+ account_id?: string;
6059
7489
  /**
6060
7490
  * Media buy to get artifacts from
6061
7491
  */
@@ -6091,13 +7521,18 @@ export interface GetMediaBuyArtifactsRequest {
6091
7521
  end?: string;
6092
7522
  };
6093
7523
  /**
6094
- * Maximum artifacts to return per request
6095
- */
6096
- limit?: number;
6097
- /**
6098
- * Pagination cursor for fetching subsequent pages
7524
+ * Pagination parameters. Uses higher limits than standard pagination because artifact result sets can be very large.
6099
7525
  */
6100
- cursor?: string;
7526
+ pagination?: {
7527
+ /**
7528
+ * Maximum number of artifacts to return per page
7529
+ */
7530
+ max_results?: number;
7531
+ /**
7532
+ * Opaque cursor from a previous response to fetch the next page
7533
+ */
7534
+ cursor?: string;
7535
+ };
6101
7536
  context?: ContextObject;
6102
7537
  ext?: ExtensionObject;
6103
7538
  }
@@ -6176,19 +7611,7 @@ export type GetMediaBuyArtifactsResponse = {
6176
7611
  */
6177
7612
  method?: 'random' | 'stratified' | 'recent' | 'failures_only';
6178
7613
  };
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
- };
7614
+ pagination?: PaginationResponse;
6192
7615
  /**
6193
7616
  * Field must not be present in success response
6194
7617
  */
@@ -6862,6 +8285,10 @@ export interface GetAdCPCapabilitiesRequest {
6862
8285
  /**
6863
8286
  * Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.
6864
8287
  */
8288
+ 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';
8289
+ /**
8290
+ * 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.
8291
+ */
6865
8292
  export interface GetAdCPCapabilitiesResponse {
6866
8293
  /**
6867
8294
  * Core AdCP protocol information
@@ -6876,6 +8303,31 @@ export interface GetAdCPCapabilitiesResponse {
6876
8303
  * Which AdCP domain protocols this seller supports
6877
8304
  */
6878
8305
  supported_protocols: ('media_buy' | 'signals' | 'governance' | 'sponsored_intelligence' | 'creative')[];
8306
+ /**
8307
+ * Account management capabilities. Describes how accounts are established, what billing models are supported, and whether an account is required before browsing products.
8308
+ */
8309
+ account?: {
8310
+ /**
8311
+ * 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.
8312
+ */
8313
+ require_operator_auth?: boolean;
8314
+ /**
8315
+ * 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).
8316
+ */
8317
+ authorization_endpoint?: string;
8318
+ /**
8319
+ * Billing models this seller supports. brand: seller invoices the brand directly. operator: seller invoices the operator (agency). agent: agent consolidates billing.
8320
+ */
8321
+ supported_billing: ('brand' | 'operator' | 'agent')[];
8322
+ /**
8323
+ * The billing model applied when the agent omits billing from a sync_accounts request. Must be one of the values in supported_billing.
8324
+ */
8325
+ default_billing?: 'brand' | 'operator' | 'agent';
8326
+ /**
8327
+ * 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).
8328
+ */
8329
+ required_for_products?: boolean;
8330
+ };
6879
8331
  /**
6880
8332
  * Media-buy protocol capabilities. Only present if media_buy is in supported_protocols.
6881
8333
  */
@@ -6989,24 +8441,59 @@ export interface GetAdCPCapabilitiesResponse {
6989
8441
  */
6990
8442
  age_restriction?: {
6991
8443
  /**
6992
- * Whether platform supports age restrictions
8444
+ * Whether seller supports age restrictions
6993
8445
  */
6994
8446
  supported?: boolean;
6995
8447
  /**
6996
- * Age verification methods this platform supports
8448
+ * Age verification methods this seller supports
6997
8449
  */
6998
8450
  verification_methods?: AgeVerificationMethod[];
6999
8451
  };
7000
8452
  /**
7001
- * Whether platform supports device platform targeting (Sec-CH-UA-Platform values)
8453
+ * Whether seller supports device platform targeting (Sec-CH-UA-Platform values)
7002
8454
  */
7003
8455
  device_platform?: boolean;
7004
8456
  /**
7005
- * Whether platform supports language targeting (ISO 639-1 codes)
8457
+ * Whether seller supports language targeting (ISO 639-1 codes)
7006
8458
  */
7007
8459
  language?: boolean;
7008
8460
  };
7009
8461
  };
8462
+ /**
8463
+ * Seller-level conversion tracking capabilities. Only present when features.conversion_tracking is true.
8464
+ */
8465
+ conversion_tracking?: {
8466
+ /**
8467
+ * Event types this seller can track and attribute. If omitted, all standard event types are supported.
8468
+ */
8469
+ supported_event_types?: EventType[];
8470
+ /**
8471
+ * Universal ID types accepted for user matching
8472
+ */
8473
+ supported_uid_types?: UIDType[];
8474
+ /**
8475
+ * Hashed PII types accepted for user matching. Buyers must hash before sending (SHA-256, normalized).
8476
+ */
8477
+ supported_hashed_identifiers?: ('hashed_email' | 'hashed_phone')[];
8478
+ /**
8479
+ * Action sources this seller accepts events from
8480
+ */
8481
+ supported_action_sources?: ActionSource[];
8482
+ /**
8483
+ * 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.
8484
+ */
8485
+ attribution_windows?: {
8486
+ event_type?: EventType1;
8487
+ /**
8488
+ * Available click-through attribution windows (e.g. ["7d"], ["7d", "14d", "30d"])
8489
+ */
8490
+ click_through: string[];
8491
+ /**
8492
+ * Available view-through attribution windows (e.g. ["1d"], ["1d", "7d", "14d"])
8493
+ */
8494
+ view_through?: string[];
8495
+ }[];
8496
+ };
7010
8497
  /**
7011
8498
  * Information about the seller's media inventory portfolio
7012
8499
  */
@@ -7150,14 +8637,15 @@ export interface GetAdCPCapabilitiesResponse {
7150
8637
  */
7151
8638
  export interface ListAccountsRequest {
7152
8639
  /**
7153
- * Filter accounts by status
8640
+ * Filter accounts by status. Omit to return accounts in all statuses.
7154
8641
  */
7155
- status?: 'active' | 'suspended' | 'closed' | 'all';
8642
+ status?: 'active' | 'pending_approval' | 'payment_required' | 'suspended' | 'closed';
8643
+ pagination?: PaginationRequest;
7156
8644
  context?: ContextObject;
7157
8645
  ext?: ExtensionObject;
7158
8646
  }
7159
8647
  /**
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.
8648
+ * Standard cursor-based pagination parameters for list operations
7161
8649
  */
7162
8650
  /**
7163
8651
  * Response payload for list_accounts task
@@ -7171,10 +8659,157 @@ export interface ListAccountsResponse {
7171
8659
  * Task-specific errors and warnings
7172
8660
  */
7173
8661
  errors?: Error[];
8662
+ pagination?: PaginationResponse;
7174
8663
  context?: ContextObject;
7175
8664
  ext?: ExtensionObject;
7176
8665
  }
7177
8666
  /**
7178
8667
  * A billing account representing the relationship between a buyer and seller. The account determines rate cards, payment terms, and billing entity.
7179
8668
  */
8669
+ /**
8670
+ * Authentication schemes for push notification endpoints
8671
+ */
8672
+ export interface SyncAccountsRequest {
8673
+ /**
8674
+ * Advertiser accounts to sync
8675
+ *
8676
+ * @maxItems 1000
8677
+ */
8678
+ accounts: {
8679
+ /**
8680
+ * House domain where brand.json is hosted (e.g., 'unilever.com', 'coca-cola.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.
8681
+ */
8682
+ house: string;
8683
+ /**
8684
+ * 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.
8685
+ */
8686
+ brand_id?: string;
8687
+ /**
8688
+ * 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.
8689
+ */
8690
+ operator?: string;
8691
+ /**
8692
+ * 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.
8693
+ */
8694
+ billing?: 'brand' | 'operator' | 'agent';
8695
+ }[];
8696
+ /**
8697
+ * 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.
8698
+ */
8699
+ delete_missing?: boolean;
8700
+ /**
8701
+ * When true, preview what would change without applying. Returns what would be created/updated/deactivated.
8702
+ */
8703
+ dry_run?: boolean;
8704
+ push_notification_config?: PushNotificationConfig;
8705
+ context?: ContextObject;
8706
+ ext?: ExtensionObject;
8707
+ }
8708
+ /**
8709
+ * Optional webhook for async notifications when account status changes (e.g., pending_approval transitions to active).
8710
+ */
8711
+ /**
8712
+ * Response from account sync operation. Returns per-account results with status and billing, or operation-level errors on complete failure.
8713
+ */
8714
+ export type SyncAccountsResponse = SyncAccountsSuccess | SyncAccountsError;
8715
+ /**
8716
+ * Sync operation processed accounts (individual accounts may be pending or have action=failed)
8717
+ */
8718
+ export interface SyncAccountsSuccess {
8719
+ /**
8720
+ * Whether this was a dry run (no actual changes made)
8721
+ */
8722
+ dry_run?: boolean;
8723
+ /**
8724
+ * Results for each account processed
8725
+ */
8726
+ accounts: {
8727
+ /**
8728
+ * Seller-assigned account identifier. When billing is 'agent', multiple brands may share the same account_id.
8729
+ */
8730
+ account_id?: string;
8731
+ /**
8732
+ * House domain, echoed from the request
8733
+ */
8734
+ house: string;
8735
+ /**
8736
+ * Brand ID within the house portfolio, echoed from request
8737
+ */
8738
+ brand_id?: string;
8739
+ /**
8740
+ * Operator domain, echoed from request
8741
+ */
8742
+ operator?: string;
8743
+ /**
8744
+ * Human-readable account name assigned by the seller
8745
+ */
8746
+ name?: string;
8747
+ /**
8748
+ * Action taken for this account. created: new account provisioned. updated: existing account modified. unchanged: no changes needed. failed: could not process (see errors).
8749
+ */
8750
+ action: 'created' | 'updated' | 'unchanged' | 'failed';
8751
+ /**
8752
+ * 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.
8753
+ */
8754
+ status: 'active' | 'pending_approval' | 'payment_required' | 'suspended' | 'closed';
8755
+ /**
8756
+ * Who is invoiced on this account. May differ from the requested billing if the seller doesn't support it.
8757
+ */
8758
+ billing?: 'brand' | 'operator' | 'agent';
8759
+ /**
8760
+ * Parent account ID when this account is a sub-account under a shared billing account
8761
+ */
8762
+ parent_account_id?: string;
8763
+ /**
8764
+ * Setup information for pending accounts. Provides the agent (or human) with next steps to complete account activation.
8765
+ */
8766
+ setup?: {
8767
+ /**
8768
+ * URL where the human can complete the required action (credit application, legal agreement, add funds)
8769
+ */
8770
+ url?: string;
8771
+ /**
8772
+ * Human-readable description of what's needed
8773
+ */
8774
+ message: string;
8775
+ /**
8776
+ * When this setup link expires
8777
+ */
8778
+ expires_at?: string;
8779
+ };
8780
+ /**
8781
+ * Rate card applied to this account
8782
+ */
8783
+ rate_card?: string;
8784
+ /**
8785
+ * Payment terms (e.g., 'net_30', 'prepay')
8786
+ */
8787
+ payment_terms?: string;
8788
+ credit_limit?: {
8789
+ amount: number;
8790
+ currency: string;
8791
+ };
8792
+ /**
8793
+ * Per-account errors (only present when action is 'failed')
8794
+ */
8795
+ errors?: Error[];
8796
+ /**
8797
+ * Non-fatal warnings about this account
8798
+ */
8799
+ warnings?: string[];
8800
+ }[];
8801
+ context?: ContextObject;
8802
+ ext?: ExtensionObject;
8803
+ }
8804
+ /**
8805
+ * Standard error structure for task-specific errors and warnings
8806
+ */
8807
+ export interface SyncAccountsError {
8808
+ /**
8809
+ * Operation-level errors (e.g., authentication failure, service unavailable)
8810
+ */
8811
+ errors: Error[];
8812
+ context?: ContextObject;
8813
+ ext?: ExtensionObject;
8814
+ }
7180
8815
  //# sourceMappingURL=tools.generated.d.ts.map