@adcp/client 4.0.2 → 4.2.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 (47) hide show
  1. package/.claude-plugin/plugin.json +12 -0
  2. package/dist/lib/adapters/content-standards-adapter.d.ts.map +1 -1
  3. package/dist/lib/adapters/content-standards-adapter.js +2 -0
  4. package/dist/lib/adapters/content-standards-adapter.js.map +1 -1
  5. package/dist/lib/core/AgentClient.d.ts.map +1 -1
  6. package/dist/lib/core/SingleAgentClient.d.ts +0 -7
  7. package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
  8. package/dist/lib/core/SingleAgentClient.js +3 -45
  9. package/dist/lib/core/SingleAgentClient.js.map +1 -1
  10. package/dist/lib/index.d.ts +6 -2
  11. package/dist/lib/index.d.ts.map +1 -1
  12. package/dist/lib/index.js +12 -4
  13. package/dist/lib/index.js.map +1 -1
  14. package/dist/lib/types/adcp.d.ts +2 -5
  15. package/dist/lib/types/adcp.d.ts.map +1 -1
  16. package/dist/lib/types/compat.d.ts +3 -0
  17. package/dist/lib/types/compat.d.ts.map +1 -1
  18. package/dist/lib/types/compat.js.map +1 -1
  19. package/dist/lib/types/core.generated.d.ts +616 -233
  20. package/dist/lib/types/core.generated.d.ts.map +1 -1
  21. package/dist/lib/types/core.generated.js +1 -1
  22. package/dist/lib/types/error-codes.d.ts +32 -0
  23. package/dist/lib/types/error-codes.d.ts.map +1 -0
  24. package/dist/lib/types/error-codes.js +114 -0
  25. package/dist/lib/types/error-codes.js.map +1 -0
  26. package/dist/lib/types/index.d.ts +1 -1
  27. package/dist/lib/types/index.d.ts.map +1 -1
  28. package/dist/lib/types/index.js.map +1 -1
  29. package/dist/lib/types/schemas.generated.d.ts +26019 -11997
  30. package/dist/lib/types/schemas.generated.d.ts.map +1 -1
  31. package/dist/lib/types/schemas.generated.js +467 -420
  32. package/dist/lib/types/schemas.generated.js.map +1 -1
  33. package/dist/lib/types/tools.generated.d.ts +1005 -1003
  34. package/dist/lib/types/tools.generated.d.ts.map +1 -1
  35. package/dist/lib/utils/creative-adapter.d.ts +1 -1
  36. package/dist/lib/utils/creative-adapter.js +2 -2
  37. package/dist/lib/utils/creative-adapter.js.map +1 -1
  38. package/dist/lib/utils/deprecation.d.ts +11 -0
  39. package/dist/lib/utils/deprecation.d.ts.map +1 -0
  40. package/dist/lib/utils/deprecation.js +23 -0
  41. package/dist/lib/utils/deprecation.js.map +1 -0
  42. package/dist/lib/utils/request-normalizer.d.ts +23 -0
  43. package/dist/lib/utils/request-normalizer.d.ts.map +1 -0
  44. package/dist/lib/utils/request-normalizer.js +119 -0
  45. package/dist/lib/utils/request-normalizer.js.map +1 -0
  46. package/package.json +3 -1
  47. package/skills/adcp/SKILL.md +230 -0
@@ -1,15 +1,62 @@
1
1
  /**
2
- * Request parameters for discovering available advertising products
2
+ * Request parameters for discovering or refining advertising products. buying_mode declares the buyer's intent: 'brief' for curated discovery, 'wholesale' for raw catalog access, or 'refine' to iterate on known products and proposals.
3
3
  */
4
4
  export type GetProductsRequest = {
5
5
  /**
6
- * Declares buyer intent for this request. 'brief': publisher curates product recommendations from the provided brief. 'wholesale': buyer requests raw inventory to apply their own audiences — brief must not be provided. When buying_mode is 'wholesale', publishers return only products that support buyer-directed targeting and omit proposals.
6
+ * Declares buyer intent for this request. 'brief': publisher curates product recommendations from the provided brief. 'wholesale': buyer requests raw inventory to apply their own audiences — brief must not be provided, and proposals are omitted. 'refine': iterate on products and proposals from a previous get_products response using the refine array of change requests. v3 clients MUST include buying_mode. Sellers receiving requests from pre-v3 clients without buying_mode SHOULD default to 'brief'.
7
7
  */
8
- buying_mode: 'brief' | 'wholesale';
8
+ buying_mode: 'brief' | 'wholesale' | 'refine';
9
9
  /**
10
- * Natural language description of campaign requirements. Required when buying_mode is 'brief'. Must not be provided when buying_mode is 'wholesale'.
10
+ * Natural language description of campaign requirements. Required when buying_mode is 'brief'. Must not be provided when buying_mode is 'wholesale' or 'refine'.
11
11
  */
12
12
  brief?: string;
13
+ /**
14
+ * Array of change requests for iterating on products and proposals from a previous get_products response. Each entry declares a scope (request, product, or proposal) and what the buyer is asking for. Only valid when buying_mode is 'refine'. The seller responds to each entry via refinement_applied in the response, matched by position.
15
+ */
16
+ refine?: ({
17
+ /**
18
+ * Change scoped to the overall request — direction for the selection as a whole.
19
+ */
20
+ scope: 'request';
21
+ /**
22
+ * What the buyer is asking for at the request level (e.g., 'more video options and less display', 'suggest how to combine these products').
23
+ */
24
+ ask: string;
25
+ } | {
26
+ /**
27
+ * Change scoped to a specific product.
28
+ */
29
+ scope: 'product';
30
+ /**
31
+ * Product ID from a previous get_products response.
32
+ */
33
+ id: string;
34
+ /**
35
+ * 'include': return this product with updated pricing and data. 'omit': exclude this product from the response. 'more_like_this': find additional products similar to this one (the original is also returned).
36
+ */
37
+ action: 'include' | 'omit' | 'more_like_this';
38
+ /**
39
+ * What the buyer is asking for on this product. For 'include': specific changes to request (e.g., 'add 16:9 format'). For 'more_like_this': what 'similar' means (e.g., 'same audience but video format'). Ignored when action is 'omit'.
40
+ */
41
+ ask?: string;
42
+ } | {
43
+ /**
44
+ * Change scoped to a specific proposal.
45
+ */
46
+ scope: 'proposal';
47
+ /**
48
+ * Proposal ID from a previous get_products response.
49
+ */
50
+ id: string;
51
+ /**
52
+ * 'include': return this proposal with updated allocations and pricing. 'omit': exclude this proposal from the response.
53
+ */
54
+ action: 'include' | 'omit';
55
+ /**
56
+ * What the buyer is asking for on this proposal (e.g., 'shift more budget toward video', 'reduce total by 10%'). Ignored when action is 'omit'.
57
+ */
58
+ ask?: string;
59
+ })[];
13
60
  brand?: BrandReference;
14
61
  catalog?: Catalog;
15
62
  account?: AccountReference;
@@ -19,14 +66,23 @@ export type GetProductsRequest = {
19
66
  buyer_campaign_ref?: string;
20
67
  filters?: ProductFilters;
21
68
  property_list?: PropertyListReference;
69
+ /**
70
+ * Specific product fields to include in the response. When omitted, all fields are returned. Use for lightweight discovery calls where only a subset of product data is needed (e.g., just IDs and pricing for comparison). Required fields (product_id, name) are always included regardless of selection.
71
+ */
72
+ fields?: ('product_id' | 'name' | 'description' | 'publisher_properties' | 'channels' | 'format_ids' | 'placements' | 'delivery_type' | 'pricing_options' | 'forecast' | 'outcome_measurement' | 'delivery_measurement' | 'reporting_capabilities' | 'creative_policy' | 'catalog_types' | 'metric_optimization' | 'conversion_tracking' | 'data_provider_signals' | 'max_optimization_goals' | 'catalog_match' | 'brief_relevance' | 'expires_at' | 'product_card' | 'product_card_detailed')[];
22
73
  pagination?: PaginationRequest;
23
74
  context?: ContextObject;
24
75
  ext?: ExtensionObject;
25
76
  } & ({
26
77
  buying_mode: 'brief';
78
+ refine?: never;
27
79
  } | {
28
80
  buying_mode: 'wholesale';
29
81
  brief?: never;
82
+ refine?: never;
83
+ } | {
84
+ buying_mode: 'refine';
85
+ brief?: never;
30
86
  });
31
87
  /**
32
88
  * Brand identifier within the house portfolio. Optional for single-brand domains.
@@ -602,6 +658,27 @@ export interface GetProductsResponse {
602
658
  * Whether the seller filtered results based on the provided catalog. True if the seller matched catalog items against its inventory. Absent or false if no catalog was provided or the seller does not support catalog matching.
603
659
  */
604
660
  catalog_applied?: boolean;
661
+ /**
662
+ * Seller's response to each change request in the refine array, matched by position. Each entry acknowledges whether the corresponding ask was applied, partially applied, or unable to be fulfilled. MUST contain the same number of entries in the same order as the request's refine array. Only present when the request used buying_mode: 'refine'.
663
+ */
664
+ refinement_applied?: {
665
+ /**
666
+ * Echoes the scope from the corresponding refine entry. Allows orchestrators to cross-validate alignment.
667
+ */
668
+ scope?: 'request' | 'product' | 'proposal';
669
+ /**
670
+ * Echoes the id from the corresponding refine entry (for product and proposal scopes).
671
+ */
672
+ id?: string;
673
+ /**
674
+ * 'applied': the ask was fulfilled. 'partial': the ask was partially fulfilled — see notes for details. 'unable': the seller could not fulfill the ask — see notes for why.
675
+ */
676
+ status: 'applied' | 'partial' | 'unable';
677
+ /**
678
+ * Seller explanation of what was done, what couldn't be done, or why. Recommended when status is 'partial' or 'unable'.
679
+ */
680
+ notes?: string;
681
+ }[];
605
682
  pagination?: PaginationResponse;
606
683
  /**
607
684
  * When true, this response contains simulated data from sandbox mode.
@@ -648,7 +725,7 @@ export interface Product {
648
725
  */
649
726
  pricing_options: PricingOption[];
650
727
  forecast?: DeliveryForecast;
651
- measurement?: Measurement;
728
+ outcome_measurement?: OutcomeMeasurement;
652
729
  /**
653
730
  * Measurement provider and methodology for delivery metrics. The buyer accepts the declared provider as the source of truth for the buy. REQUIRED for all products.
654
731
  */
@@ -1230,9 +1307,22 @@ export interface ForecastPoint {
1230
1307
  */
1231
1308
  budget: number;
1232
1309
  /**
1233
- * Forecasted metric values at this budget level. Keys are either forecastable-metric values for delivery/engagement (impressions, reach, spend, etc.) or event-type values for outcomes (purchase, lead, app_install, etc.). Values are ForecastRange objects (low/mid/high). Use { "mid": value } for point estimates. Include spend when the platform predicts it will differ from budget.
1310
+ * Forecasted metric values at this budget level. Keys are forecastable-metric enum values for delivery/engagement or event-type enum values for outcomes. Values are ForecastRange objects (low/mid/high). Use { "mid": value } for point estimates. Include spend when the platform predicts it will differ from budget. Additional keys beyond the documented properties are allowed for event-type values (purchase, lead, app_install, etc.).
1234
1311
  */
1235
1312
  metrics: {
1313
+ audience_size?: ForecastRange;
1314
+ reach?: ForecastRange;
1315
+ frequency?: ForecastRange;
1316
+ impressions?: ForecastRange;
1317
+ clicks?: ForecastRange;
1318
+ spend?: ForecastRange;
1319
+ views?: ForecastRange;
1320
+ completed_views?: ForecastRange;
1321
+ grps?: ForecastRange;
1322
+ engagements?: ForecastRange;
1323
+ follows?: ForecastRange;
1324
+ saves?: ForecastRange;
1325
+ profile_visits?: ForecastRange;
1236
1326
  [k: string]: ForecastRange | undefined;
1237
1327
  };
1238
1328
  }
@@ -1254,9 +1344,9 @@ export interface ForecastRange {
1254
1344
  high?: number;
1255
1345
  }
1256
1346
  /**
1257
- * Measurement capabilities included with a product
1347
+ * Business outcome measurement capabilities included with a product (e.g., incremental sales lift, brand lift, foot traffic). Distinct from delivery_measurement, which declares who counts ad impressions.
1258
1348
  */
1259
- export interface Measurement {
1349
+ export interface OutcomeMeasurement {
1260
1350
  /**
1261
1351
  * Type of measurement
1262
1352
  */
@@ -1266,14 +1356,27 @@ export interface Measurement {
1266
1356
  */
1267
1357
  attribution: string;
1268
1358
  /**
1269
- * Attribution window
1359
+ * Attribution window as a structured duration (e.g., {"interval": 30, "unit": "days"}).
1270
1360
  */
1271
- window?: string;
1361
+ window?: Duration;
1272
1362
  /**
1273
1363
  * Reporting frequency and format
1274
1364
  */
1275
1365
  reporting: string;
1276
1366
  }
1367
+ /**
1368
+ * A time duration expressed as an interval and unit. Used for frequency cap windows, attribution windows, reach optimization windows, and other time-based settings. When unit is 'campaign', interval must be 1 — the window spans the full campaign flight.
1369
+ */
1370
+ export interface Duration {
1371
+ /**
1372
+ * Number of time units. Must be 1 when unit is 'campaign'.
1373
+ */
1374
+ interval: number;
1375
+ /**
1376
+ * Time unit. 'campaign' spans the full campaign flight.
1377
+ */
1378
+ unit: 'minutes' | 'hours' | 'days' | 'campaign';
1379
+ }
1277
1380
  /**
1278
1381
  * Reporting capabilities available for a product
1279
1382
  */
@@ -1363,6 +1466,10 @@ export interface CreativePolicy {
1363
1466
  * Whether creative templates are provided
1364
1467
  */
1365
1468
  templates_available: boolean;
1469
+ /**
1470
+ * Whether creatives must include provenance metadata. When true, the seller requires buyers to attach provenance declarations to creative submissions. The seller may independently verify claims via get_creative_features.
1471
+ */
1472
+ provenance_required?: boolean;
1366
1473
  }
1367
1474
  /**
1368
1475
  * A proposed media plan with budget allocations across products. Represents the publisher's strategic recommendation for how to structure a campaign based on the brief. Proposals are actionable - buyers can execute them directly via create_media_buy by providing the proposal_id.
@@ -1477,7 +1584,7 @@ export interface DaypartTarget {
1477
1584
  */
1478
1585
  export interface Error {
1479
1586
  /**
1480
- * Error code for programmatic handling
1587
+ * Error code for programmatic handling. Standard codes are defined in error-code.json and enable autonomous agent recovery. Sellers MAY use codes not in the standard vocabulary for platform-specific errors; agents MUST handle unknown codes gracefully by falling back to the recovery classification.
1481
1588
  */
1482
1589
  code: string;
1483
1590
  /**
@@ -1500,6 +1607,10 @@ export interface Error {
1500
1607
  * Additional task-specific error details
1501
1608
  */
1502
1609
  details?: {};
1610
+ /**
1611
+ * Agent recovery classification. transient: retry after delay (rate limit, service unavailable, timeout). correctable: fix the request and resend (invalid field, budget too low, creative rejected). terminal: requires human action (account suspended, payment required, account not found).
1612
+ */
1613
+ recovery?: 'transient' | 'correctable' | 'terminal';
1503
1614
  }
1504
1615
  /**
1505
1616
  * Standard cursor-based pagination metadata for list responses
@@ -1521,11 +1632,15 @@ export interface PaginationResponse {
1521
1632
  /**
1522
1633
  * Types of content that can be used as creative assets. Describes what KIND of content an asset contains (image, video, code, etc.), not where it displays.
1523
1634
  */
1524
- export type AssetContentType = 'image' | 'video' | 'audio' | 'text' | 'markdown' | 'html' | 'css' | 'javascript' | 'vast' | 'daast' | 'url' | 'webhook';
1635
+ export type AssetContentType = 'image' | 'video' | 'audio' | 'text' | 'markdown' | 'html' | 'css' | 'javascript' | 'vast' | 'daast' | 'url' | 'webhook' | 'brief' | 'catalog';
1525
1636
  /**
1526
1637
  * Filter to formats that meet at least this WCAG conformance level (A < AA < AAA)
1527
1638
  */
1528
1639
  export type WCAGLevel = 'A' | 'AA' | 'AAA';
1640
+ /**
1641
+ * Where a required disclosure should appear within a creative. Used by creative briefs to specify disclosure placement and by formats to declare which positions they can render.
1642
+ */
1643
+ export type DisclosurePosition = 'prominent' | 'footer' | 'audio' | 'subtitle' | 'overlay' | 'end_card' | 'pre_roll' | 'companion';
1529
1644
  /**
1530
1645
  * Request parameters for discovering supported creative formats
1531
1646
  */
@@ -1564,6 +1679,10 @@ export interface ListCreativeFormatsRequest {
1564
1679
  */
1565
1680
  name_search?: string;
1566
1681
  wcag_level?: WCAGLevel;
1682
+ /**
1683
+ * Filter to formats whose supported_disclosure_positions include all of these positions. Use to find formats compatible with a brief's compliance requirements.
1684
+ */
1685
+ disclosure_positions?: DisclosurePosition[];
1567
1686
  /**
1568
1687
  * Filter to formats whose output_format_ids includes any of these format IDs. Returns formats that can produce these outputs — inspect each result's input_format_ids to see what inputs they accept.
1569
1688
  */
@@ -1584,29 +1703,6 @@ export type FormatIDParameter = 'dimensions' | 'duration';
1584
1703
  * 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.
1585
1704
  */
1586
1705
  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' | 'CATALOG_ID' | 'SKU' | 'GTIN' | 'OFFERING_ID' | 'JOB_ID' | 'HOTEL_ID' | 'FLIGHT_ID' | 'VEHICLE_ID' | 'LISTING_ID' | 'STORE_ID' | 'PROGRAM_ID' | 'DESTINATION_ID' | 'CREATIVE_VARIANT_ID' | 'APP_ITEM_ID';
1587
- /**
1588
- * Technical requirements for each item in this group (e.g., max_length for text, min_width/aspect_ratio for images). Applies uniformly to all items in the group.
1589
- */
1590
- export type AssetRequirements = ImageAssetRequirements | VideoAssetRequirements | AudioAssetRequirements | TextAssetRequirements | MarkdownAssetRequirements | HTMLAssetRequirements | CSSAssetRequirements | JavaScriptAssetRequirements | VASTAssetRequirements | DAASTAssetRequirements | URLAssetRequirements | WebhookAssetRequirements;
1591
- /**
1592
- * Maps a format template slot to a catalog item field or typed asset pool. The 'kind' field identifies the binding variant. All bindings are optional — agents can still infer mappings without them.
1593
- */
1594
- export type CatalogFieldBinding = ScalarBinding | AssetPoolBinding | {
1595
- kind: 'catalog_group';
1596
- /**
1597
- * The asset_group_id of a repeatable_group in the format's assets array.
1598
- */
1599
- format_group_id: string;
1600
- /**
1601
- * Each repetition of the format's repeatable_group maps to one item from the catalog.
1602
- */
1603
- catalog_item: true;
1604
- /**
1605
- * Scalar and asset pool bindings that apply within each repetition of the group. Nested catalog_group bindings are not permitted.
1606
- */
1607
- per_item_bindings?: (ScalarBinding | AssetPoolBinding)[];
1608
- ext?: ExtensionObject;
1609
- };
1610
1706
  /**
1611
1707
  * Capabilities supported by creative agents for format handling
1612
1708
  */
@@ -1747,6 +1843,10 @@ export interface Format {
1747
1843
  */
1748
1844
  requires_accessible_assets?: boolean;
1749
1845
  };
1846
+ /**
1847
+ * Disclosure positions this format can render. Buyers use this to determine whether a format can satisfy their compliance requirements before submitting a creative. When omitted, the format makes no disclosure rendering guarantees — creative agents SHOULD treat this as incompatible with briefs that require specific disclosure positions. Values correspond to positions on creative-brief.json required_disclosures.
1848
+ */
1849
+ supported_disclosure_positions?: DisclosurePosition[];
1750
1850
  /**
1751
1851
  * Optional detailed card with carousel and full specifications. Provides rich format documentation similar to ad spec pages.
1752
1852
  */
@@ -1757,10 +1857,6 @@ export interface Format {
1757
1857
  */
1758
1858
  manifest: {};
1759
1859
  };
1760
- /**
1761
- * Catalog feeds this format requires for rendering. Formats that display product listings, store locators, inventory availability, or promotional pricing declare what catalog types must be synced to the account. Buyers ensure the required catalogs are synced via sync_catalogs before submitting creatives in this format.
1762
- */
1763
- catalog_requirements?: CatalogRequirements[];
1764
1860
  /**
1765
1861
  * 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.
1766
1862
  */
@@ -1776,7 +1872,7 @@ export interface BaseIndividualAsset {
1776
1872
  */
1777
1873
  asset_id: string;
1778
1874
  /**
1779
- * Optional descriptive label for this asset's purpose (e.g., 'hero_image', 'logo', 'third_party_tracking'). Not used for referencing assets in manifestsuse asset_id instead. This field is for human-readable documentation and UI display only.
1875
+ * Descriptive label for this asset's purpose (e.g., 'hero_image', 'logo', 'third_party_tracking'). For documentation and UI display onlymanifests key assets by asset_id, not asset_role.
1780
1876
  */
1781
1877
  asset_role?: string;
1782
1878
  /**
@@ -1849,7 +1945,7 @@ export interface BaseGroupAsset {
1849
1945
  */
1850
1946
  asset_id: string;
1851
1947
  /**
1852
- * Optional descriptive label for this asset's purpose. Not used for referencing assets in manifestsuse asset_id instead. This field is for human-readable documentation and UI display only.
1948
+ * Descriptive label for this asset's purpose. For documentation and UI display onlymanifests key assets by asset_id, not asset_role.
1853
1949
  */
1854
1950
  asset_role?: string;
1855
1951
  /**
@@ -1862,599 +1958,253 @@ export interface BaseGroupAsset {
1862
1958
  overlays?: Overlay[];
1863
1959
  }
1864
1960
  /**
1865
- * Format-level declaration of what catalog feeds a creative needs. Formats that render product listings, store locators, or promotional content declare which catalog types must be synced and what fields each catalog must provide. Buyers use this to ensure the right catalogs are synced before submitting creatives.
1961
+ * Budget pacing strategy
1962
+ */
1963
+ export type Pacing = 'even' | 'asap' | 'front_loaded';
1964
+ /**
1965
+ * A single optimization target for a package. Packages accept an array of optimization_goals. When multiple goals are present, priority determines which the seller focuses on — 1 is highest priority (primary goal); higher numbers are secondary. Duplicate priority values result in undefined seller behavior.
1866
1966
  */
1867
- export interface CatalogRequirements {
1868
- catalog_type: CatalogType;
1967
+ export type OptimizationGoal = {
1968
+ kind: 'metric';
1869
1969
  /**
1870
- * Whether this catalog type must be present. When true, creatives using this format must reference a synced catalog of this type.
1970
+ * Seller-native metric to optimize for. Delivery metrics: clicks (link clicks, swipe-throughs, CTA taps that navigate away), views (viewable impressions), completed_views (video/audio completions — see view_duration_seconds), reach (unique audience reach — see reach_unit and target_frequency). Duration/score metrics: viewed_seconds (time in view per impression), attention_seconds (attention time per impression), attention_score (vendor-specific attention score). Audience action metrics: engagements (any direct interaction with the ad unit beyond viewing — social reactions/comments/shares, story/unit opens, interactive overlay taps, companion banner interactions on audio and CTV), follows (new followers, page likes, artist/podcast/channel subscribes), saves (saves, bookmarks, playlist adds, pins — signals of intent to return), profile_visits (visits to the brand's in-platform page — profile, artist page, channel, or storefront. Does not include external website clicks, which are covered by 'clicks').
1871
1971
  */
1872
- required?: boolean;
1972
+ metric: 'clicks' | 'views' | 'completed_views' | 'viewed_seconds' | 'attention_seconds' | 'attention_score' | 'engagements' | 'follows' | 'saves' | 'profile_visits' | 'reach';
1873
1973
  /**
1874
- * Minimum number of items the catalog must contain for this format to render properly (e.g., a carousel might require at least 3 products)
1974
+ * Unit for reach measurement. Required when metric is 'reach'. Must be a value declared in the product's metric_optimization.supported_reach_units.
1875
1975
  */
1876
- min_items?: number;
1976
+ reach_unit?: ReachUnit;
1877
1977
  /**
1878
- * Fields that must be present and non-empty on every item in the catalog. Field names are catalog-type-specific (e.g., 'title', 'price', 'image_url' for product catalogs; 'store_id', 'quantity' for inventory feeds).
1978
+ * Target frequency band for reach optimization. Only applicable when metric is 'reach'. Frames frequency as an optimization signal: the seller should treat impressions toward entities already within the [min, max] band as lower-value, and impressions toward unreached entities as higher-value. This shifts budget toward fresh reach rather than re-reaching known users. When omitted, the seller maximizes unique reach without a frequency constraint. A hard cap can still be layered via targeting_overlay.frequency_cap if a ceiling is needed.
1879
1979
  */
1880
- required_fields?: string[];
1980
+ target_frequency?: {
1981
+ [k: string]: unknown | undefined;
1982
+ };
1881
1983
  /**
1882
- * Accepted feed formats for this catalog type. When specified, the synced catalog must use one of these formats. When omitted, any format is accepted.
1984
+ * Minimum video view duration in seconds that qualifies as a completed_view for this goal. Only applicable when metric is 'completed_views'. When omitted, the seller uses their platform default (typically 2–15 seconds). Common values: 2 (Snap/LinkedIn default), 6 (TikTok), 15 (Snap 15-second views, Meta ThruPlay). Sellers declare which durations they support in metric_optimization.supported_view_durations. Sellers must reject goals with unsupported values — silent rounding would create measurement discrepancies.
1883
1985
  */
1884
- feed_formats?: FeedFormat[];
1986
+ view_duration_seconds?: number;
1885
1987
  /**
1886
- * Per-item creative asset requirements. Declares what asset groups (headlines, images, videos) each catalog item must provide in its assets array, along with count bounds and per-asset technical constraints. Applicable to 'offering' and all vertical catalog types (hotel, flight, job, etc.) whose items carry typed assets.
1988
+ * Target for this metric. When omitted, the seller optimizes for maximum metric volume within budget.
1887
1989
  */
1888
- offering_asset_constraints?: OfferingAssetConstraint[];
1990
+ target?: {
1991
+ kind: 'cost_per';
1992
+ /**
1993
+ * Target cost per metric unit in the buy currency
1994
+ */
1995
+ value: number;
1996
+ } | {
1997
+ kind: 'threshold_rate';
1998
+ /**
1999
+ * Minimum per-impression value. Units depend on the metric: proportion (clicks, views, completed_views), seconds (viewed_seconds, attention_seconds), or score (attention_score).
2000
+ */
2001
+ value: number;
2002
+ };
1889
2003
  /**
1890
- * Explicit mappings from format template slots to catalog item fields or typed asset pools. Optional creative agents can infer mappings without them, but bindings make the relationship self-describing and enable validation. Covers scalar fields (asset_id → catalog_field), asset pools (asset_id → asset_group_id on the catalog item), and repeatable groups that iterate over catalog items.
2004
+ * Relative priority among all optimization goals on this package. 1 = highest priority (primary goal); higher numbers are lower priority (secondary signals). When omitted, sellers may use array position as priority.
1891
2005
  */
1892
- field_bindings?: CatalogFieldBinding[];
1893
- }
1894
- /**
1895
- * Declares per-group creative requirements that each offering must satisfy. Allows formats to specify what asset groups (headlines, images, videos) offerings must provide, along with count and per-asset technical constraints.
1896
- */
1897
- export interface OfferingAssetConstraint {
2006
+ priority?: number;
2007
+ } | {
2008
+ kind: 'event';
1898
2009
  /**
1899
- * The asset group this constraint applies to. Values are format-defined vocabularyeach format chooses its own group IDs (e.g., 'headlines', 'images', 'videos'). Buyers discover them via list_creative_formats.
2010
+ * Event source and type pairs that feed this goal. Each entry identifies a source and event type to include. When the seller supports multi_source_event_dedup (declared in get_adcp_capabilities), they deduplicate by event_id across all entries the same business event from multiple sources counts once, using value_field and value_factor from the first matching entry. When multi_source_event_dedup is false or absent, buyers should use a single entry per goal; the seller will use only the first entry. All event sources must be configured via sync_event_sources.
1900
2011
  */
1901
- asset_group_id: string;
1902
- asset_type: AssetContentType;
2012
+ event_sources: {
2013
+ /**
2014
+ * Event source to include (must be configured on this account via sync_event_sources)
2015
+ */
2016
+ event_source_id: string;
2017
+ event_type: EventType;
2018
+ /**
2019
+ * Required when event_type is 'custom'. Platform-specific name for the custom event.
2020
+ */
2021
+ custom_event_name?: string;
2022
+ /**
2023
+ * Which field in the event's custom_data carries the monetary value. The seller must use this field for value extraction and aggregation when computing ROAS and conversion value metrics. Required on at least one entry when target.kind is 'per_ad_spend' or 'maximize_value'. Common values: 'value', 'order_total', 'profit_margin'. This is not passed as a parameter to underlying platform APIs — the seller maps it to their platform's value ingestion mechanism.
2024
+ */
2025
+ value_field?: string;
2026
+ /**
2027
+ * Multiplier the seller must apply to value_field before aggregation. Use -1 for refund events (negate the value), 0.01 for values in cents, -0.01 for refunds in cents. A value of 0 zeroes out this source's value contribution (the source still counts for event dedup). Defaults to 1. This is not passed as a parameter to underlying platform APIs — the seller applies it when computing aggregated value metrics.
2028
+ */
2029
+ value_factor?: number;
2030
+ }[];
1903
2031
  /**
1904
- * Whether this asset group must be present in each offering. Defaults to true.
2032
+ * Target cost or return for this event goal. When omitted, the seller optimizes for maximum conversions within budget.
1905
2033
  */
1906
- required?: boolean;
2034
+ target?: {
2035
+ kind: 'cost_per';
2036
+ /**
2037
+ * Target cost per event in the buy currency
2038
+ */
2039
+ value: number;
2040
+ } | {
2041
+ kind: 'per_ad_spend';
2042
+ /**
2043
+ * Target return ratio (e.g., 4.0 means $4 of value per $1 spent)
2044
+ */
2045
+ value: number;
2046
+ } | {
2047
+ kind: 'maximize_value';
2048
+ };
1907
2049
  /**
1908
- * Minimum number of items required in this group.
2050
+ * Attribution window for this optimization goal. Values must match an option declared in the seller's conversion_tracking.attribution_windows capability. Sellers must reject windows not in their declared capabilities. When omitted, the seller uses their default window.
1909
2051
  */
1910
- min_count?: number;
2052
+ attribution_window?: {
2053
+ /**
2054
+ * Post-click attribution window. Conversions within this duration after a click are attributed to the ad (e.g. {"interval": 7, "unit": "days"}).
2055
+ */
2056
+ post_click: Duration;
2057
+ /**
2058
+ * Post-view attribution window. Conversions within this duration after an ad impression (without click) are attributed to the ad (e.g. {"interval": 1, "unit": "days"}).
2059
+ */
2060
+ post_view?: Duration;
2061
+ };
1911
2062
  /**
1912
- * Maximum number of items allowed in this group.
2063
+ * Relative priority among all optimization goals on this package. 1 = highest priority (primary goal); higher numbers are lower priority (secondary signals). When omitted, sellers may use array position as priority.
1913
2064
  */
1914
- max_count?: number;
1915
- asset_requirements?: AssetRequirements;
1916
- ext?: ExtensionObject;
1917
- }
2065
+ priority?: number;
2066
+ };
1918
2067
  /**
1919
- * Requirements for image creative assets. These define the technical constraints for image files.
2068
+ * Postal code system (e.g., 'us_zip', 'gb_outward'). System name encodes country and precision.
1920
2069
  */
1921
- export interface ImageAssetRequirements {
1922
- /**
1923
- * Minimum width in pixels. For exact dimensions, set min_width = max_width.
1924
- */
1925
- min_width?: number;
1926
- /**
1927
- * Maximum width in pixels. For exact dimensions, set min_width = max_width.
1928
- */
1929
- max_width?: number;
1930
- /**
1931
- * Minimum height in pixels. For exact dimensions, set min_height = max_height.
1932
- */
1933
- min_height?: number;
1934
- /**
1935
- * Maximum height in pixels. For exact dimensions, set min_height = max_height.
1936
- */
1937
- max_height?: number;
1938
- /**
1939
- * Required aspect ratio (e.g., '16:9', '1:1', '1.91:1')
1940
- */
1941
- aspect_ratio?: string;
2070
+ export type PostalCodeSystem = 'us_zip' | 'us_zip_plus_four' | 'gb_outward' | 'gb_full' | 'ca_fsa' | 'ca_full' | 'de_plz' | 'fr_code_postal' | 'au_postcode' | 'ch_plz' | 'at_plz';
2071
+ /**
2072
+ * Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. When both suppress and max_impressions are set, an impression is delivered only if both constraints permit it (AND semantics). At least one of suppress, suppress_minutes, or max_impressions must be set.
2073
+ */
2074
+ export type FrequencyCap = {
2075
+ [k: string]: unknown | undefined;
2076
+ } & {
1942
2077
  /**
1943
- * Accepted image file formats
2078
+ * Cooldown period between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g. {"interval": 60, "unit": "minutes"} for a 1-hour cooldown). Preferred over suppress_minutes.
1944
2079
  */
1945
- formats?: ('jpg' | 'jpeg' | 'png' | 'gif' | 'webp' | 'svg' | 'avif')[];
2080
+ suppress?: Duration;
1946
2081
  /**
1947
- * Maximum file size in kilobytes
2082
+ * Deprecated use suppress instead. Cooldown period in minutes between consecutive exposures to the same entity (e.g. 60 for a 1-hour cooldown).
1948
2083
  */
1949
- max_file_size_kb?: number;
2084
+ suppress_minutes?: number;
1950
2085
  /**
1951
- * Whether the image must support transparency (requires PNG, WebP, or GIF)
2086
+ * Maximum number of impressions per entity per window. For duration windows, implementations typically use a rolling window; 'campaign' applies a fixed cap across the full flight.
1952
2087
  */
1953
- transparency_required?: boolean;
2088
+ max_impressions?: number;
1954
2089
  /**
1955
- * Whether animated images (GIF, animated WebP) are accepted
2090
+ * Entity granularity for impression counting. Required when max_impressions is set.
1956
2091
  */
1957
- animation_allowed?: boolean;
2092
+ per?: ReachUnit;
1958
2093
  /**
1959
- * Maximum animation duration in milliseconds (if animation_allowed is true)
2094
+ * Time window for the max_impressions cap (e.g. {"interval": 7, "unit": "days"} or {"interval": 1, "unit": "campaign"} for the full flight). Required when max_impressions is set.
1960
2095
  */
1961
- max_animation_duration_ms?: number;
1962
- }
2096
+ window?: Duration;
2097
+ };
2098
+ /**
2099
+ * Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.
2100
+ */
2101
+ export type AgeVerificationMethod = 'facial_age_estimation' | 'id_document' | 'digital_id' | 'credit_card' | 'world_id';
2102
+ /**
2103
+ * Operating system platforms for device targeting. Browser values from Sec-CH-UA-Platform standard, extended for CTV.
2104
+ */
2105
+ export type DevicePlatform = 'ios' | 'android' | 'windows' | 'macos' | 'linux' | 'chromeos' | 'tvos' | 'tizen' | 'webos' | 'fire_os' | 'roku_os' | 'unknown';
2106
+ /**
2107
+ * Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) → mobile, 2 (PC) → desktop, 4 (Phone) → mobile, 5 (Tablet) → tablet, 6 (Connected Device) → ctv, 7 (Set Top Box) → ctv. DOOH inventory uses dooh.
2108
+ */
2109
+ export type DeviceType = 'desktop' | 'mobile' | 'tablet' | 'ctv' | 'dooh' | 'unknown';
2110
+ /**
2111
+ * IPTC-aligned classification of AI involvement in producing this content
2112
+ */
2113
+ export type DigitalSourceType = 'digital_capture' | 'digital_creation' | 'trained_algorithmic_media' | 'composite_with_trained_algorithmic_media' | 'algorithmic_media' | 'composite_capture' | 'composite_synthetic' | 'human_edits' | 'data_driven_media';
1963
2114
  /**
1964
- * Requirements for video creative assets. These define the technical constraints for video files.
2115
+ * VAST (Video Ad Serving Template) tag for third-party video ad serving
1965
2116
  */
1966
- export interface VideoAssetRequirements {
2117
+ export type VASTAsset = {
1967
2118
  /**
1968
- * Minimum width in pixels
2119
+ * Discriminator indicating VAST is delivered via URL endpoint
1969
2120
  */
1970
- min_width?: number;
2121
+ delivery_type: 'url';
1971
2122
  /**
1972
- * Maximum width in pixels
2123
+ * URL endpoint that returns VAST XML
1973
2124
  */
1974
- max_width?: number;
2125
+ url: string;
2126
+ vast_version?: VASTVersion;
1975
2127
  /**
1976
- * Minimum height in pixels
2128
+ * Whether VPAID (Video Player-Ad Interface Definition) is supported
1977
2129
  */
1978
- min_height?: number;
2130
+ vpaid_enabled?: boolean;
1979
2131
  /**
1980
- * Maximum height in pixels
2132
+ * Expected video duration in milliseconds (if known)
1981
2133
  */
1982
- max_height?: number;
2134
+ duration_ms?: number;
1983
2135
  /**
1984
- * Required aspect ratio (e.g., '16:9', '9:16')
2136
+ * Tracking events supported by this VAST tag
1985
2137
  */
1986
- aspect_ratio?: string;
2138
+ tracking_events?: VASTTrackingEvent[];
1987
2139
  /**
1988
- * Minimum duration in milliseconds
2140
+ * URL to captions file (WebVTT, SRT, etc.)
1989
2141
  */
1990
- min_duration_ms?: number;
2142
+ captions_url?: string;
1991
2143
  /**
1992
- * Maximum duration in milliseconds
2144
+ * URL to audio description track for visually impaired users
1993
2145
  */
1994
- max_duration_ms?: number;
2146
+ audio_description_url?: string;
2147
+ provenance?: Provenance;
2148
+ } | {
1995
2149
  /**
1996
- * Accepted video container formats
2150
+ * Discriminator indicating VAST is delivered as inline XML content
1997
2151
  */
1998
- containers?: ('mp4' | 'webm' | 'mov' | 'avi' | 'mkv')[];
2152
+ delivery_type: 'inline';
1999
2153
  /**
2000
- * Accepted video codecs
2154
+ * Inline VAST XML content
2001
2155
  */
2002
- codecs?: ('h264' | 'h265' | 'vp8' | 'vp9' | 'av1')[];
2156
+ content: string;
2157
+ vast_version?: VASTVersion;
2003
2158
  /**
2004
- * Maximum file size in kilobytes
2159
+ * Whether VPAID (Video Player-Ad Interface Definition) is supported
2005
2160
  */
2006
- max_file_size_kb?: number;
2161
+ vpaid_enabled?: boolean;
2007
2162
  /**
2008
- * Minimum video bitrate in kilobits per second
2163
+ * Expected video duration in milliseconds (if known)
2009
2164
  */
2010
- min_bitrate_kbps?: number;
2165
+ duration_ms?: number;
2011
2166
  /**
2012
- * Maximum video bitrate in kilobits per second
2167
+ * Tracking events supported by this VAST tag
2013
2168
  */
2014
- max_bitrate_kbps?: number;
2169
+ tracking_events?: VASTTrackingEvent[];
2015
2170
  /**
2016
- * Accepted frame rates in frames per second (e.g., [24, 30, 60])
2171
+ * URL to captions file (WebVTT, SRT, etc.)
2017
2172
  */
2018
- frame_rates?: number[];
2173
+ captions_url?: string;
2019
2174
  /**
2020
- * Whether the video must include an audio track
2175
+ * URL to audio description track for visually impaired users
2021
2176
  */
2022
- audio_required?: boolean;
2023
- }
2177
+ audio_description_url?: string;
2178
+ provenance?: Provenance;
2179
+ };
2024
2180
  /**
2025
- * Requirements for audio creative assets.
2181
+ * VAST specification version
2026
2182
  */
2027
- export interface AudioAssetRequirements {
2028
- /**
2029
- * Minimum duration in milliseconds
2030
- */
2031
- min_duration_ms?: number;
2032
- /**
2033
- * Maximum duration in milliseconds
2034
- */
2035
- max_duration_ms?: number;
2036
- /**
2037
- * Accepted audio file formats
2038
- */
2039
- formats?: ('mp3' | 'aac' | 'wav' | 'ogg' | 'flac')[];
2040
- /**
2041
- * Maximum file size in kilobytes
2042
- */
2043
- max_file_size_kb?: number;
2044
- /**
2045
- * Accepted sample rates in Hz (e.g., [44100, 48000])
2046
- */
2047
- sample_rates?: number[];
2048
- /**
2049
- * Accepted audio channel configurations
2050
- */
2051
- channels?: ('mono' | 'stereo')[];
2052
- /**
2053
- * Minimum audio bitrate in kilobits per second
2054
- */
2055
- min_bitrate_kbps?: number;
2056
- /**
2057
- * Maximum audio bitrate in kilobits per second
2058
- */
2059
- max_bitrate_kbps?: number;
2060
- }
2061
- /**
2062
- * Requirements for text creative assets such as headlines, body copy, and CTAs.
2063
- */
2064
- export interface TextAssetRequirements {
2065
- /**
2066
- * Minimum character length
2067
- */
2068
- min_length?: number;
2069
- /**
2070
- * Maximum character length
2071
- */
2072
- max_length?: number;
2073
- /**
2074
- * Minimum number of lines
2075
- */
2076
- min_lines?: number;
2077
- /**
2078
- * Maximum number of lines
2079
- */
2080
- max_lines?: number;
2081
- /**
2082
- * Regex pattern defining allowed characters (e.g., '^[a-zA-Z0-9 .,!?-]+$')
2083
- */
2084
- character_pattern?: string;
2085
- /**
2086
- * List of prohibited words or phrases
2087
- */
2088
- prohibited_terms?: string[];
2089
- }
2090
- /**
2091
- * Requirements for markdown creative assets.
2092
- */
2093
- export interface MarkdownAssetRequirements {
2094
- /**
2095
- * Maximum character length
2096
- */
2097
- max_length?: number;
2098
- }
2099
- /**
2100
- * Requirements for HTML creative assets. These define the execution environment constraints that the HTML must be compatible with.
2101
- */
2102
- export interface HTMLAssetRequirements {
2103
- /**
2104
- * Maximum file size in kilobytes for the HTML asset
2105
- */
2106
- max_file_size_kb?: number;
2107
- /**
2108
- * Sandbox environment the HTML must be compatible with. 'none' = direct DOM access, 'iframe' = standard iframe isolation, 'safeframe' = IAB SafeFrame container, 'fencedframe' = Privacy Sandbox fenced frame
2109
- */
2110
- sandbox?: 'none' | 'iframe' | 'safeframe' | 'fencedframe';
2111
- /**
2112
- * Whether the HTML creative can load external resources (scripts, images, fonts, etc.). When false, all resources must be inlined or bundled.
2113
- */
2114
- external_resources_allowed?: boolean;
2115
- /**
2116
- * List of domains the HTML creative may reference for external resources. Only applicable when external_resources_allowed is true.
2117
- */
2118
- allowed_external_domains?: string[];
2119
- }
2120
- /**
2121
- * Requirements for CSS creative assets.
2122
- */
2123
- export interface CSSAssetRequirements {
2124
- /**
2125
- * Maximum file size in kilobytes
2126
- */
2127
- max_file_size_kb?: number;
2128
- }
2129
- /**
2130
- * Requirements for JavaScript creative assets. These define the execution environment constraints that the JavaScript must be compatible with.
2131
- */
2132
- export interface JavaScriptAssetRequirements {
2133
- /**
2134
- * Maximum file size in kilobytes for the JavaScript asset
2135
- */
2136
- max_file_size_kb?: number;
2137
- /**
2138
- * Required JavaScript module format. 'script' = classic script, 'module' = ES modules, 'iife' = immediately invoked function expression
2139
- */
2140
- module_type?: 'script' | 'module' | 'iife';
2141
- /**
2142
- * Whether the JavaScript must use strict mode
2143
- */
2144
- strict_mode_required?: boolean;
2145
- /**
2146
- * Whether the JavaScript can load external resources dynamically
2147
- */
2148
- external_resources_allowed?: boolean;
2149
- /**
2150
- * List of domains the JavaScript may reference for external resources. Only applicable when external_resources_allowed is true.
2151
- */
2152
- allowed_external_domains?: string[];
2153
- }
2154
- /**
2155
- * Requirements for VAST (Video Ad Serving Template) creative assets.
2156
- */
2157
- export interface VASTAssetRequirements {
2158
- /**
2159
- * Required VAST version
2160
- */
2161
- vast_version?: '2.0' | '3.0' | '4.0' | '4.1' | '4.2';
2162
- }
2163
- /**
2164
- * Requirements for DAAST (Digital Audio Ad Serving Template) creative assets.
2165
- */
2166
- export interface DAASTAssetRequirements {
2167
- /**
2168
- * Required DAAST version. DAAST 1.0 is the current IAB standard.
2169
- */
2170
- daast_version?: '1.0';
2171
- }
2172
- /**
2173
- * Requirements for URL assets such as click-through URLs, tracking pixels, and landing pages.
2174
- */
2175
- export interface URLAssetRequirements {
2176
- /**
2177
- * Standard role for this URL asset. Use this to constrain which purposes are valid for this URL slot. Complements asset_role (which is a human-readable label) by providing a machine-readable enum.
2178
- */
2179
- role?: 'clickthrough' | 'landing_page' | 'impression_tracker' | 'click_tracker' | 'viewability_tracker' | 'third_party_tracker';
2180
- /**
2181
- * Allowed URL protocols. HTTPS is recommended for all ad URLs.
2182
- */
2183
- protocols?: ('https' | 'http')[];
2184
- /**
2185
- * List of allowed domains for the URL
2186
- */
2187
- allowed_domains?: string[];
2188
- /**
2189
- * Maximum URL length in characters
2190
- */
2191
- max_length?: number;
2192
- /**
2193
- * Whether the URL supports macro substitution (e.g., ${CACHEBUSTER})
2194
- */
2195
- macro_support?: boolean;
2196
- }
2197
- /**
2198
- * Requirements for webhook creative assets.
2199
- */
2200
- export interface WebhookAssetRequirements {
2201
- /**
2202
- * Allowed HTTP methods
2203
- */
2204
- methods?: ('GET' | 'POST')[];
2205
- }
2206
- /**
2207
- * Maps an individual format asset to a catalog item field via dot-notation path.
2208
- */
2209
- export interface ScalarBinding {
2210
- kind: 'scalar';
2211
- /**
2212
- * The asset_id from the format's assets array. Identifies which individual template slot this binding applies to.
2213
- */
2214
- asset_id: string;
2215
- /**
2216
- * Dot-notation path to the field on the catalog item (e.g., 'name', 'price.amount', 'location.city').
2217
- */
2218
- catalog_field: string;
2219
- ext?: ExtensionObject;
2220
- }
2221
- /**
2222
- * Maps an individual format asset to a typed asset pool on the catalog item (e.g., images_landscape, images_vertical, logo). The format slot receives the first item in the pool.
2223
- */
2224
- export interface AssetPoolBinding {
2225
- kind: 'asset_pool';
2226
- /**
2227
- * The asset_id from the format's assets array. Identifies which individual template slot this binding applies to.
2228
- */
2229
- asset_id: string;
2230
- /**
2231
- * The asset_group_id on the catalog item's assets array to pull from (e.g., 'images_landscape', 'images_vertical', 'logo').
2232
- */
2233
- asset_group_id: string;
2234
- ext?: ExtensionObject;
2235
- }
2236
- /**
2237
- * Budget pacing strategy
2238
- */
2239
- export type Pacing = 'even' | 'asap' | 'front_loaded';
2240
- /**
2241
- * A single optimization target for a package. Packages accept an array of optimization_goals. When multiple goals are present, priority determines which the seller focuses on — 1 is highest priority (primary goal); higher numbers are secondary. Duplicate priority values result in undefined seller behavior.
2242
- */
2243
- export type OptimizationGoal = {
2244
- kind: 'metric';
2245
- /**
2246
- * Seller-native metric to optimize for. Delivery metrics: clicks (link clicks, swipe-throughs, CTA taps that navigate away), views (viewable impressions), completed_views (video/audio completions — see view_duration_seconds), reach (unique audience reach — see reach_unit and target_frequency). Duration/score metrics: viewed_seconds (time in view per impression), attention_seconds (attention time per impression), attention_score (vendor-specific attention score). Audience action metrics: engagements (any direct interaction with the ad unit beyond viewing — social reactions/comments/shares, story/unit opens, interactive overlay taps, companion banner interactions on audio and CTV), follows (new followers, page likes, artist/podcast/channel subscribes), saves (saves, bookmarks, playlist adds, pins — signals of intent to return), profile_visits (visits to the brand's in-platform page — profile, artist page, channel, or storefront. Does not include external website clicks, which are covered by 'clicks').
2247
- */
2248
- metric: 'clicks' | 'views' | 'completed_views' | 'viewed_seconds' | 'attention_seconds' | 'attention_score' | 'engagements' | 'follows' | 'saves' | 'profile_visits' | 'reach';
2249
- /**
2250
- * Unit for reach measurement. Required when metric is 'reach'. Must be a value declared in the product's metric_optimization.supported_reach_units.
2251
- */
2252
- reach_unit?: ReachUnit;
2253
- /**
2254
- * Target frequency band for reach optimization. Only applicable when metric is 'reach'. Frames frequency as an optimization signal: the seller should treat impressions toward entities already within the [min, max] band as lower-value, and impressions toward unreached entities as higher-value. This shifts budget toward fresh reach rather than re-reaching known users. When omitted, the seller maximizes unique reach without a frequency constraint. A hard cap can still be layered via targeting_overlay.frequency_cap if a ceiling is needed.
2255
- */
2256
- target_frequency?: {
2257
- [k: string]: unknown | undefined;
2258
- };
2259
- /**
2260
- * Minimum video view duration in seconds that qualifies as a completed_view for this goal. Only applicable when metric is 'completed_views'. When omitted, the seller uses their platform default (typically 2–15 seconds). Common values: 2 (Snap/LinkedIn default), 6 (TikTok), 15 (Snap 15-second views, Meta ThruPlay). Sellers declare which durations they support in metric_optimization.supported_view_durations. Sellers must reject goals with unsupported values — silent rounding would create measurement discrepancies.
2261
- */
2262
- view_duration_seconds?: number;
2263
- /**
2264
- * Target for this metric. When omitted, the seller optimizes for maximum metric volume within budget.
2265
- */
2266
- target?: {
2267
- kind: 'cost_per';
2268
- /**
2269
- * Target cost per metric unit in the buy currency
2270
- */
2271
- value: number;
2272
- } | {
2273
- kind: 'threshold_rate';
2274
- /**
2275
- * Minimum per-impression value. Units depend on the metric: proportion (clicks, views, completed_views), seconds (viewed_seconds, attention_seconds), or score (attention_score).
2276
- */
2277
- value: number;
2278
- };
2279
- /**
2280
- * Relative priority among all optimization goals on this package. 1 = highest priority (primary goal); higher numbers are lower priority (secondary signals). When omitted, sellers may use array position as priority.
2281
- */
2282
- priority?: number;
2283
- } | {
2284
- kind: 'event';
2285
- /**
2286
- * Event source and type pairs that feed this goal. Each entry identifies a source and event type to include. When the seller supports multi_source_event_dedup (declared in get_adcp_capabilities), they deduplicate by event_id across all entries — the same business event from multiple sources counts once, using value_field and value_factor from the first matching entry. When multi_source_event_dedup is false or absent, buyers should use a single entry per goal; the seller will use only the first entry. All event sources must be configured via sync_event_sources.
2287
- */
2288
- event_sources: {
2289
- /**
2290
- * Event source to include (must be configured on this account via sync_event_sources)
2291
- */
2292
- event_source_id: string;
2293
- event_type: EventType;
2294
- /**
2295
- * Required when event_type is 'custom'. Platform-specific name for the custom event.
2296
- */
2297
- custom_event_name?: string;
2298
- /**
2299
- * Which field in the event's custom_data carries the monetary value. The seller must use this field for value extraction and aggregation when computing ROAS and conversion value metrics. Required on at least one entry when target.kind is 'per_ad_spend' or 'maximize_value'. Common values: 'value', 'order_total', 'profit_margin'. This is not passed as a parameter to underlying platform APIs — the seller maps it to their platform's value ingestion mechanism.
2300
- */
2301
- value_field?: string;
2302
- /**
2303
- * Multiplier the seller must apply to value_field before aggregation. Use -1 for refund events (negate the value), 0.01 for values in cents, -0.01 for refunds in cents. A value of 0 zeroes out this source's value contribution (the source still counts for event dedup). Defaults to 1. This is not passed as a parameter to underlying platform APIs — the seller applies it when computing aggregated value metrics.
2304
- */
2305
- value_factor?: number;
2306
- }[];
2307
- /**
2308
- * Target cost or return for this event goal. When omitted, the seller optimizes for maximum conversions within budget.
2309
- */
2310
- target?: {
2311
- kind: 'cost_per';
2312
- /**
2313
- * Target cost per event in the buy currency
2314
- */
2315
- value: number;
2316
- } | {
2317
- kind: 'per_ad_spend';
2318
- /**
2319
- * Target return ratio (e.g., 4.0 means $4 of value per $1 spent)
2320
- */
2321
- value: number;
2322
- } | {
2323
- kind: 'maximize_value';
2324
- };
2325
- /**
2326
- * Attribution window for this optimization goal. Values must match an option declared in the seller's conversion_tracking.attribution_windows capability. Sellers must reject windows not in their declared capabilities. When omitted, the seller uses their default window.
2327
- */
2328
- attribution_window?: {
2329
- /**
2330
- * Click-through attribution window (e.g. '7d', '28d', '30d')
2331
- */
2332
- click_through: string;
2333
- /**
2334
- * View-through attribution window (e.g. '1d', '7d')
2335
- */
2336
- view_through?: string;
2337
- };
2338
- /**
2339
- * Relative priority among all optimization goals on this package. 1 = highest priority (primary goal); higher numbers are lower priority (secondary signals). When omitted, sellers may use array position as priority.
2340
- */
2341
- priority?: number;
2342
- };
2343
- /**
2344
- * Postal code system (e.g., 'us_zip', 'gb_outward'). System name encodes country and precision.
2345
- */
2346
- export type PostalCodeSystem = 'us_zip' | 'us_zip_plus_four' | 'gb_outward' | 'gb_full' | 'ca_fsa' | 'ca_full' | 'de_plz' | 'fr_code_postal' | 'au_postcode' | 'ch_plz' | 'at_plz';
2347
- /**
2348
- * Frequency capping settings for package-level application. Two types of frequency control can be used independently or together: suppress_minutes enforces a cooldown between consecutive exposures; max_impressions + per + window caps total exposures per entity in a time window. At least one of suppress_minutes or max_impressions must be set.
2349
- */
2350
- export type FrequencyCap = {
2351
- [k: string]: unknown | undefined;
2352
- } & {
2353
- /**
2354
- * Cooldown period in minutes between consecutive exposures to the same entity. Prevents back-to-back ad delivery (e.g., 60 = at least 1 hour between impressions).
2355
- */
2356
- suppress_minutes?: number;
2357
- /**
2358
- * Maximum number of impressions per entity per window. For duration windows (e.g., '1d', '7d'), implementations typically use a rolling window; 'campaign' applies a fixed cap across the full flight.
2359
- */
2360
- max_impressions?: number;
2361
- /**
2362
- * Entity granularity for impression counting. Required when max_impressions is set.
2363
- */
2364
- per?: ReachUnit;
2365
- /**
2366
- * Time window for the max_impressions cap. Duration string (e.g., '1h', '6h', '1d', '7d', '30d', 'campaign'). 'campaign' applies the cap across the full campaign flight. Required when max_impressions is set.
2367
- */
2368
- window?: string;
2369
- };
2370
- /**
2371
- * Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.
2372
- */
2373
- export type AgeVerificationMethod = 'facial_age_estimation' | 'id_document' | 'digital_id' | 'credit_card' | 'world_id';
2183
+ export type VASTVersion = '2.0' | '3.0' | '4.0' | '4.1' | '4.2';
2374
2184
  /**
2375
- * Operating system platforms for device targeting. Browser values from Sec-CH-UA-Platform standard, extended for CTV.
2185
+ * Standard VAST tracking events for video ad playback and interaction
2376
2186
  */
2377
- export type DevicePlatform = 'ios' | 'android' | 'windows' | 'macos' | 'linux' | 'chromeos' | 'tvos' | 'tizen' | 'webos' | 'fire_os' | 'roku_os' | 'unknown';
2187
+ export type VASTTrackingEvent = 'start' | 'firstQuartile' | 'midpoint' | 'thirdQuartile' | 'complete' | 'impression' | 'click' | 'pause' | 'resume' | 'skip' | 'mute' | 'unmute' | 'fullscreen' | 'exitFullscreen' | 'playerExpand' | 'playerCollapse';
2378
2188
  /**
2379
- * Device form factor categories for targeting and reporting. Complements device-platform (operating system) with hardware classification. OpenRTB mapping: 1 (Mobile/Tablet General) mobile, 2 (PC) → desktop, 4 (Phone) → mobile, 5 (Tablet) tablet, 6 (Connected Device) ctv, 7 (Set Top Box) ctv. DOOH inventory uses dooh.
2189
+ * Type of URL asset: 'clickthrough' for user click destination (landing page), 'tracker_pixel' for impression/event tracking via HTTP request (fires GET, expects pixel/204 response), 'tracker_script' for measurement SDKs that must load as <script> tag (OMID verification, native event trackers using method:2)
2380
2190
  */
2381
- export type DeviceType = 'desktop' | 'mobile' | 'tablet' | 'ctv' | 'dooh' | 'unknown';
2191
+ export type URLAssetType = 'clickthrough' | 'tracker_pixel' | 'tracker_script';
2382
2192
  /**
2383
2193
  * JavaScript module type
2384
2194
  */
2385
2195
  export type JavaScriptModuleType = 'esm' | 'commonjs' | 'script';
2386
2196
  /**
2387
- * VAST (Video Ad Serving Template) tag for third-party video ad serving
2197
+ * HTTP method
2388
2198
  */
2389
- export type VASTAsset = {
2390
- /**
2391
- * Discriminator indicating VAST is delivered via URL endpoint
2392
- */
2393
- delivery_type: 'url';
2394
- /**
2395
- * URL endpoint that returns VAST XML
2396
- */
2397
- url: string;
2398
- vast_version?: VASTVersion;
2399
- /**
2400
- * Whether VPAID (Video Player-Ad Interface Definition) is supported
2401
- */
2402
- vpaid_enabled?: boolean;
2403
- /**
2404
- * Expected video duration in milliseconds (if known)
2405
- */
2406
- duration_ms?: number;
2407
- /**
2408
- * Tracking events supported by this VAST tag
2409
- */
2410
- tracking_events?: VASTTrackingEvent[];
2411
- /**
2412
- * URL to captions file (WebVTT, SRT, etc.)
2413
- */
2414
- captions_url?: string;
2415
- /**
2416
- * URL to audio description track for visually impaired users
2417
- */
2418
- audio_description_url?: string;
2419
- } | {
2420
- /**
2421
- * Discriminator indicating VAST is delivered as inline XML content
2422
- */
2423
- delivery_type: 'inline';
2424
- /**
2425
- * Inline VAST XML content
2426
- */
2427
- content: string;
2428
- vast_version?: VASTVersion;
2429
- /**
2430
- * Whether VPAID (Video Player-Ad Interface Definition) is supported
2431
- */
2432
- vpaid_enabled?: boolean;
2433
- /**
2434
- * Expected video duration in milliseconds (if known)
2435
- */
2436
- duration_ms?: number;
2437
- /**
2438
- * Tracking events supported by this VAST tag
2439
- */
2440
- tracking_events?: VASTTrackingEvent[];
2441
- /**
2442
- * URL to captions file (WebVTT, SRT, etc.)
2443
- */
2444
- captions_url?: string;
2445
- /**
2446
- * URL to audio description track for visually impaired users
2447
- */
2448
- audio_description_url?: string;
2449
- };
2199
+ export type HTTPMethod = 'GET' | 'POST';
2450
2200
  /**
2451
- * VAST specification version
2201
+ * Expected content type of webhook response
2452
2202
  */
2453
- export type VASTVersion = '2.0' | '3.0' | '4.0' | '4.1' | '4.2';
2203
+ export type WebhookResponseType = 'html' | 'json' | 'xml' | 'javascript';
2454
2204
  /**
2455
- * Standard VAST tracking events for video ad playback and interaction
2205
+ * Authentication method
2456
2206
  */
2457
- export type VASTTrackingEvent = 'start' | 'firstQuartile' | 'midpoint' | 'thirdQuartile' | 'complete' | 'impression' | 'click' | 'pause' | 'resume' | 'skip' | 'mute' | 'unmute' | 'fullscreen' | 'exitFullscreen' | 'playerExpand' | 'playerCollapse';
2207
+ export type WebhookSecurityMethod = 'hmac_sha256' | 'api_key' | 'none';
2458
2208
  /**
2459
2209
  * DAAST (Digital Audio Ad Serving Template) tag for third-party audio ad serving
2460
2210
  */
@@ -2484,6 +2234,7 @@ export type DAASTAsset = {
2484
2234
  * URL to text transcript of the audio content
2485
2235
  */
2486
2236
  transcript_url?: string;
2237
+ provenance?: Provenance;
2487
2238
  } | {
2488
2239
  /**
2489
2240
  * Discriminator indicating DAAST is delivered as inline XML content
@@ -2510,6 +2261,7 @@ export type DAASTAsset = {
2510
2261
  * URL to text transcript of the audio content
2511
2262
  */
2512
2263
  transcript_url?: string;
2264
+ provenance?: Provenance;
2513
2265
  };
2514
2266
  /**
2515
2267
  * DAAST specification version
@@ -2520,9 +2272,17 @@ export type DAASTVersion = '1.0' | '1.1';
2520
2272
  */
2521
2273
  export type DAASTTrackingEvent = 'start' | 'firstQuartile' | 'midpoint' | 'thirdQuartile' | 'complete' | 'impression' | 'pause' | 'resume' | 'skip' | 'mute' | 'unmute';
2522
2274
  /**
2523
- * Type of URL asset: 'clickthrough' for user click destination (landing page), 'tracker_pixel' for impression/event tracking via HTTP request (fires GET, expects pixel/204 response), 'tracker_script' for measurement SDKs that must load as <script> tag (OMID verification, native event trackers using method:2)
2275
+ * Markdown flavor used. CommonMark for strict compatibility, GFM for tables/task lists/strikethrough.
2524
2276
  */
2525
- export type URLAssetType = 'clickthrough' | 'tracker_pixel' | 'tracker_script';
2277
+ export type MarkdownFlavor = 'commonmark' | 'gfm';
2278
+ /**
2279
+ * Campaign-level creative context as an asset. Carries the creative brief through the manifest so it travels with the creative through regeneration, resizing, and auditing.
2280
+ */
2281
+ export type BriefAsset = CreativeBrief;
2282
+ /**
2283
+ * A typed data feed as a creative asset. Carries catalog context (products, stores, jobs, etc.) within the manifest's assets map.
2284
+ */
2285
+ export type CatalogAsset = Catalog;
2526
2286
  /**
2527
2287
  * For generative creatives: set to 'approved' to finalize, 'rejected' to request regeneration with updated assets/message. Omit for non-generative creatives (system will set based on processing state).
2528
2288
  */
@@ -2540,7 +2300,7 @@ export type AuthenticationScheme = 'Bearer' | 'HMAC-SHA256';
2540
2300
  */
2541
2301
  export interface CreateMediaBuyRequest {
2542
2302
  /**
2543
- * Buyer's reference identifier for this media buy
2303
+ * Buyer's reference identifier for this media buy. Sellers SHOULD deduplicate requests with the same buyer_ref and account, returning the existing media buy rather than creating a duplicate.
2544
2304
  */
2545
2305
  buyer_ref: string;
2546
2306
  /**
@@ -2629,7 +2389,7 @@ export interface CreateMediaBuyRequest {
2629
2389
  */
2630
2390
  export interface PackageRequest {
2631
2391
  /**
2632
- * Buyer's reference identifier for this package
2392
+ * Buyer's reference identifier for this package. Sellers SHOULD deduplicate requests with the same buyer_ref within a media buy, returning the existing package rather than creating a duplicate.
2633
2393
  */
2634
2394
  buyer_ref: string;
2635
2395
  /**
@@ -2661,7 +2421,10 @@ export interface PackageRequest {
2661
2421
  * Whether this package should be created in a paused state. Paused packages do not deliver impressions. Defaults to false.
2662
2422
  */
2663
2423
  paused?: boolean;
2664
- catalog?: Catalog;
2424
+ /**
2425
+ * Catalogs this package promotes. Each catalog MUST have a distinct type (e.g., one product catalog, one store catalog). This constraint is enforced at the application level — sellers MUST reject requests containing multiple catalogs of the same type with a validation_error. Makes the package catalog-driven: one budget envelope, platform optimizes across items.
2426
+ */
2427
+ catalogs?: Catalog[];
2665
2428
  /**
2666
2429
  * Optimization targets for this package. The seller optimizes delivery toward these goals in priority order. Common pattern: event goals (purchase, install) as primary targets at priority 1; metric goals (clicks, views) as secondary proxy signals at priority 2+.
2667
2430
  */
@@ -2857,7 +2620,7 @@ export interface CreativeAssignment {
2857
2620
  */
2858
2621
  creative_id: string;
2859
2622
  /**
2860
- * Delivery weight for this creative
2623
+ * Relative delivery weight for this creative (0–100). When multiple creatives are assigned to the same package, weights determine impression distribution proportionally — a creative with weight 2 gets twice the delivery of weight 1. When omitted, the creative receives equal rotation with other unweighted creatives. A weight of 0 means the creative is assigned but paused (receives no delivery).
2861
2624
  */
2862
2625
  weight?: number;
2863
2626
  /**
@@ -2879,18 +2642,14 @@ export interface CreativeAsset {
2879
2642
  name: string;
2880
2643
  format_id: FormatID;
2881
2644
  /**
2882
- * Catalogs this creative renders. Each entry satisfies one of the format's catalog_requirements, matched by type. Each catalog can be inline (with items), a reference to a synced catalog (by catalog_id), or a URL to an external feed.
2883
- */
2884
- catalogs?: Catalog[];
2885
- /**
2886
- * Assets required by the format, keyed by asset_role
2645
+ * Assets required by the format, keyed by asset_id
2887
2646
  */
2888
2647
  assets: {
2889
2648
  /**
2890
2649
  * This interface was referenced by `undefined`'s JSON-Schema definition
2891
- * via the `patternProperty` "^[a-zA-Z0-9_-]+$".
2650
+ * via the `patternProperty` "^[a-z0-9_]+$".
2892
2651
  */
2893
- [k: string]: ImageAsset | VideoAsset | AudioAsset | TextAsset | HTMLAsset | CSSAsset | JavaScriptAsset | VASTAsset | DAASTAsset | URLAsset;
2652
+ [k: string]: ImageAsset | VideoAsset | AudioAsset | VASTAsset | TextAsset | URLAsset | HTMLAsset | JavaScriptAsset | WebhookAsset | CSSAsset | DAASTAsset | MarkdownAsset | BriefAsset | CatalogAsset;
2894
2653
  };
2895
2654
  /**
2896
2655
  * Preview contexts for generative formats - defines what scenarios to generate previews for
@@ -2924,6 +2683,7 @@ export interface CreativeAsset {
2924
2683
  * Optional array of placement IDs where this creative should run when uploading via create_media_buy or update_media_buy. References placement_id values from the product's placements array. If omitted, creative runs on all placements. Only used during upload to media buy - not stored in creative library.
2925
2684
  */
2926
2685
  placement_ids?: string[];
2686
+ provenance?: Provenance;
2927
2687
  }
2928
2688
  /**
2929
2689
  * Image asset with URL and dimensions
@@ -2949,6 +2709,116 @@ export interface ImageAsset {
2949
2709
  * Alternative text for accessibility
2950
2710
  */
2951
2711
  alt_text?: string;
2712
+ provenance?: Provenance;
2713
+ }
2714
+ /**
2715
+ * Provenance metadata for this asset, overrides manifest-level provenance
2716
+ */
2717
+ export interface Provenance {
2718
+ digital_source_type?: DigitalSourceType;
2719
+ /**
2720
+ * AI system used to generate or modify this content. Aligns with IPTC 2025.1 AI metadata fields and C2PA claim_generator.
2721
+ */
2722
+ ai_tool?: {
2723
+ /**
2724
+ * Name of the AI tool or model (e.g., 'DALL-E 3', 'Stable Diffusion XL', 'Gemini')
2725
+ */
2726
+ name: string;
2727
+ /**
2728
+ * Version identifier for the AI tool or model (e.g., '25.1', '0125', '2.1'). For generative models, use the model version rather than the API version.
2729
+ */
2730
+ version?: string;
2731
+ /**
2732
+ * Organization that provides the AI tool (e.g., 'OpenAI', 'Stability AI', 'Google')
2733
+ */
2734
+ provider?: string;
2735
+ };
2736
+ /**
2737
+ * Level of human involvement in the AI-assisted creation process
2738
+ */
2739
+ human_oversight?: 'none' | 'prompt_only' | 'selected' | 'edited' | 'directed';
2740
+ /**
2741
+ * Party declaring this provenance. Identifies who attached the provenance claim, enabling receiving parties to assess trust.
2742
+ */
2743
+ declared_by?: {
2744
+ /**
2745
+ * URL of the agent or service that declared this provenance
2746
+ */
2747
+ agent_url?: string;
2748
+ /**
2749
+ * Role of the declaring party in the supply chain
2750
+ */
2751
+ role: 'creator' | 'advertiser' | 'agency' | 'platform' | 'tool';
2752
+ };
2753
+ /**
2754
+ * When this content was created or generated (ISO 8601)
2755
+ */
2756
+ created_time?: string;
2757
+ /**
2758
+ * C2PA Content Credentials reference. Links to the cryptographic provenance manifest for this content. Because file-level C2PA bindings break during ad-tech transcoding, this URL reference preserves the chain of provenance through the supply chain.
2759
+ */
2760
+ c2pa?: {
2761
+ /**
2762
+ * URL to the C2PA manifest store for this content
2763
+ */
2764
+ manifest_url: string;
2765
+ };
2766
+ /**
2767
+ * Regulatory disclosure requirements for this content. Indicates whether AI disclosure is required and under which jurisdictions.
2768
+ */
2769
+ disclosure?: {
2770
+ /**
2771
+ * Whether AI disclosure is required for this content based on applicable regulations
2772
+ */
2773
+ required: boolean;
2774
+ /**
2775
+ * Jurisdictions where disclosure obligations apply
2776
+ */
2777
+ jurisdictions?: {
2778
+ /**
2779
+ * ISO 3166-1 alpha-2 country code (e.g., 'US', 'DE', 'CN')
2780
+ */
2781
+ country: string;
2782
+ /**
2783
+ * Sub-national region code (e.g., 'CA' for California, 'BY' for Bavaria)
2784
+ */
2785
+ region?: string;
2786
+ /**
2787
+ * Regulation identifier (e.g., 'eu_ai_act_article_50', 'ca_sb_942', 'cn_deep_synthesis')
2788
+ */
2789
+ regulation: string;
2790
+ /**
2791
+ * Required disclosure label text for this jurisdiction, in the local language
2792
+ */
2793
+ label_text?: string;
2794
+ }[];
2795
+ };
2796
+ /**
2797
+ * Third-party verification or detection results for this content. Multiple services may independently evaluate the same content. Provenance is a claim — verification results attached by the declaring party are supplementary. The enforcing party (e.g., seller/publisher) should run its own verification via get_creative_features or calibrate_content.
2798
+ */
2799
+ verification?: {
2800
+ /**
2801
+ * Name of the verification service (e.g., 'DoubleVerify', 'Hive Moderation', 'Reality Defender')
2802
+ */
2803
+ verified_by: string;
2804
+ /**
2805
+ * When the verification was performed (ISO 8601)
2806
+ */
2807
+ verified_time?: string;
2808
+ /**
2809
+ * Verification outcome
2810
+ */
2811
+ result: 'authentic' | 'ai_generated' | 'ai_modified' | 'inconclusive';
2812
+ /**
2813
+ * Confidence score of the verification result (0.0 to 1.0)
2814
+ */
2815
+ confidence?: number;
2816
+ /**
2817
+ * URL to the full verification report
2818
+ */
2819
+ details_url?: string;
2820
+ }[];
2821
+ ext?: ExtensionObject;
2952
2822
  }
2953
2823
  /**
2954
2824
  * Video asset with URL and technical specifications including audio track properties
@@ -3070,6 +2940,7 @@ export interface VideoAsset {
3070
2940
  * URL to audio description track for visually impaired users
3071
2941
  */
3072
2942
  audio_description_url?: string;
2943
+ provenance?: Provenance;
3073
2944
  }
3074
2945
  /**
3075
2946
  * Audio asset with URL and technical specifications
@@ -3123,6 +2994,7 @@ export interface AudioAsset {
3123
2994
  * URL to text transcript of the audio content
3124
2995
  */
3125
2996
  transcript_url?: string;
2997
+ provenance?: Provenance;
3126
2998
  }
3127
2999
  /**
3128
3000
  * Text content asset
@@ -3136,6 +3008,22 @@ export interface TextAsset {
3136
3008
  * Language code (e.g., 'en', 'es', 'fr')
3137
3009
  */
3138
3010
  language?: string;
3011
+ provenance?: Provenance;
3012
+ }
3013
+ /**
3014
+ * URL reference asset
3015
+ */
3016
+ export interface URLAsset {
3017
+ /**
3018
+ * URL reference
3019
+ */
3020
+ url: string;
3021
+ url_type?: URLAssetType;
3022
+ /**
3023
+ * Description of what this URL points to
3024
+ */
3025
+ description?: string;
3026
+ provenance?: Provenance;
3139
3027
  }
3140
3028
  /**
3141
3029
  * HTML content asset
@@ -3170,19 +3058,7 @@ export interface HTMLAsset {
3170
3058
  */
3171
3059
  screen_reader_tested?: boolean;
3172
3060
  };
3173
- }
3174
- /**
3175
- * CSS stylesheet asset
3176
- */
3177
- export interface CSSAsset {
3178
- /**
3179
- * CSS content
3180
- */
3181
- content: string;
3182
- /**
3183
- * CSS media query context (e.g., 'screen', 'print')
3184
- */
3185
- media?: string;
3061
+ provenance?: Provenance;
3186
3062
  }
3187
3063
  /**
3188
3064
  * JavaScript code asset
@@ -3214,18 +3090,177 @@ export interface JavaScriptAsset {
3214
3090
  */
3215
3091
  screen_reader_tested?: boolean;
3216
3092
  };
3093
+ provenance?: Provenance;
3217
3094
  }
3218
3095
  /**
3219
- * URL reference asset
3096
+ * Webhook for server-side dynamic content rendering (DCO)
3220
3097
  */
3221
- export interface URLAsset {
3098
+ export interface WebhookAsset {
3222
3099
  /**
3223
- * URL reference
3100
+ * Webhook URL to call for dynamic content
3224
3101
  */
3225
3102
  url: string;
3226
- url_type?: URLAssetType;
3103
+ method?: HTTPMethod;
3227
3104
  /**
3228
- * Description of what this URL points to
3105
+ * Maximum time to wait for response in milliseconds
3106
+ */
3107
+ timeout_ms?: number;
3108
+ /**
3109
+ * Universal macros that can be passed to webhook (e.g., DEVICE_TYPE, COUNTRY). See docs/creative/universal-macros.mdx for full list.
3110
+ */
3111
+ supported_macros?: (UniversalMacro | string)[];
3112
+ /**
3113
+ * Universal macros that must be provided for webhook to function
3114
+ */
3115
+ required_macros?: (UniversalMacro | string)[];
3116
+ response_type: WebhookResponseType;
3117
+ /**
3118
+ * Security configuration for webhook calls
3119
+ */
3120
+ security: {
3121
+ method: WebhookSecurityMethod;
3122
+ /**
3123
+ * Header name for HMAC signature (e.g., 'X-Signature')
3124
+ */
3125
+ hmac_header?: string;
3126
+ /**
3127
+ * Header name for API key (e.g., 'X-API-Key')
3128
+ */
3129
+ api_key_header?: string;
3130
+ };
3131
+ provenance?: Provenance;
3132
+ }
3133
+ /**
3134
+ * CSS stylesheet asset
3135
+ */
3136
+ export interface CSSAsset {
3137
+ /**
3138
+ * CSS content
3139
+ */
3140
+ content: string;
3141
+ /**
3142
+ * CSS media query context (e.g., 'screen', 'print')
3143
+ */
3144
+ media?: string;
3145
+ provenance?: Provenance;
3146
+ }
3147
+ /**
3148
+ * Markdown-formatted text content following CommonMark specification
3149
+ */
3150
+ export interface MarkdownAsset {
3151
+ /**
3152
+ * Markdown content following CommonMark spec with optional GitHub Flavored Markdown extensions
3153
+ */
3154
+ content: string;
3155
+ /**
3156
+ * Language code (e.g., 'en', 'es', 'fr')
3157
+ */
3158
+ language?: string;
3159
+ markdown_flavor?: MarkdownFlavor;
3160
+ /**
3161
+ * Whether raw HTML blocks are allowed in the markdown. False recommended for security.
3162
+ */
3163
+ allow_raw_html?: boolean;
3164
+ }
3165
+ /**
3166
+ * Campaign-level creative context for AI-powered creative generation. Provides the layer between brand identity (stable across campaigns) and individual creative execution (per-request). A brand has one identity (defined in brand.json) but different creative briefs for each campaign or flight.
3167
+ */
3168
+ export interface CreativeBrief {
3169
+ /**
3170
+ * Campaign or flight name for identification
3171
+ */
3172
+ name: string;
3173
+ /**
3174
+ * Campaign objective that guides creative tone and call-to-action strategy
3175
+ */
3176
+ objective?: 'awareness' | 'consideration' | 'conversion' | 'retention' | 'engagement';
3177
+ /**
3178
+ * Desired tone for this campaign, modulating the brand's base tone (e.g., 'playful and festive', 'premium and aspirational')
3179
+ */
3180
+ tone?: string;
3181
+ /**
3182
+ * Target audience description for this campaign
3183
+ */
3184
+ audience?: string;
3185
+ /**
3186
+ * Creative territory or positioning the campaign should occupy
3187
+ */
3188
+ territory?: string;
3189
+ /**
3190
+ * Messaging framework for the campaign
3191
+ */
3192
+ messaging?: {
3193
+ /**
3194
+ * Primary headline
3195
+ */
3196
+ headline?: string;
3197
+ /**
3198
+ * Supporting tagline or sub-headline
3199
+ */
3200
+ tagline?: string;
3201
+ /**
3202
+ * Call-to-action text
3203
+ */
3204
+ cta?: string;
3205
+ /**
3206
+ * Key messages to communicate in priority order
3207
+ */
3208
+ key_messages?: string[];
3209
+ };
3210
+ /**
3211
+ * Visual and strategic reference materials such as mood boards, product shots, example creatives, and strategy documents
3212
+ */
3213
+ reference_assets?: ReferenceAsset[];
3214
+ /**
3215
+ * Regulatory and legal compliance requirements for this campaign. Campaign-specific, regional, and product-based — distinct from brand-level disclaimers in brand.json.
3216
+ */
3217
+ compliance?: {
3218
+ /**
3219
+ * Disclosures that must appear in creatives for this campaign. Each disclosure specifies the text, where it should appear, and which jurisdictions require it.
3220
+ */
3221
+ required_disclosures?: {
3222
+ /**
3223
+ * The disclosure text that must appear in the creative
3224
+ */
3225
+ text: string;
3226
+ position?: DisclosurePosition;
3227
+ /**
3228
+ * Jurisdictions where this disclosure is required. ISO 3166-1 alpha-2 country codes or ISO 3166-2 subdivision codes (e.g., 'US', 'GB', 'US-NJ', 'CA-QC'). If omitted, the disclosure applies to all jurisdictions in the campaign.
3229
+ */
3230
+ jurisdictions?: string[];
3231
+ /**
3232
+ * The regulation or legal authority requiring this disclosure (e.g., 'SEC Rule 156', 'FCA COBS 4.5', 'FDA 21 CFR 202')
3233
+ */
3234
+ regulation?: string;
3235
+ /**
3236
+ * Minimum display duration in milliseconds. For video/audio disclosures, how long the disclosure must be visible or audible. For static formats, how long the disclosure must remain on screen before any auto-advance.
3237
+ */
3238
+ min_duration_ms?: number;
3239
+ /**
3240
+ * Language of the disclosure text as a BCP 47 language tag (e.g., 'en', 'fr-CA', 'es'). When omitted, the disclosure is assumed to match the creative's language.
3241
+ */
3242
+ language?: string;
3243
+ }[];
3244
+ /**
3245
+ * Claims that must not appear in creatives for this campaign. Creative agents should ensure generated content avoids these claims.
3246
+ */
3247
+ prohibited_claims?: string[];
3248
+ };
3249
+ }
3250
+ /**
3251
+ * A reference asset that provides creative context. Carries visual materials (mood boards, product shots, example creatives) with semantic roles that tell creative agents how to use them.
3252
+ */
3253
+ export interface ReferenceAsset {
3254
+ /**
3255
+ * URL to the reference asset (image, video, or document)
3256
+ */
3257
+ url: string;
3258
+ /**
3259
+ * How the creative agent should use this asset. style_reference: match the visual style; product_shot: include this product; mood_board: overall look and feel; example_creative: example of a similar execution; logo: logo to use; strategy_doc: strategy or planning document for context; storyboard: sequential visual direction for video or multi-scene creative
3260
+ */
3261
+ role: 'style_reference' | 'product_shot' | 'mood_board' | 'example_creative' | 'logo' | 'strategy_doc' | 'storyboard';
3262
+ /**
3263
+ * Human-readable description of the asset and how it should inform creative generation
3229
3264
  */
3230
3265
  description?: string;
3231
3266
  }
@@ -3413,7 +3448,7 @@ export interface Package {
3413
3448
  */
3414
3449
  package_id: string;
3415
3450
  /**
3416
- * Buyer's reference identifier for this package
3451
+ * Buyer's reference identifier for this package. Sellers SHOULD deduplicate requests with the same buyer_ref within a media buy, returning the existing package rather than creating a duplicate.
3417
3452
  */
3418
3453
  buyer_ref?: string;
3419
3454
  /**
@@ -3437,6 +3472,14 @@ export interface Package {
3437
3472
  * Impression goal for this package
3438
3473
  */
3439
3474
  impressions?: number;
3475
+ /**
3476
+ * Catalogs this package promotes. Each catalog MUST have a distinct type (e.g., one product catalog, one store catalog). This constraint is enforced at the application level — sellers MUST reject requests containing multiple catalogs of the same type with a validation_error. Echoed from the create_media_buy request.
3477
+ */
3478
+ catalogs?: Catalog[];
3479
+ /**
3480
+ * Format IDs active for this package. Echoed from the create_media_buy request; omitted means all formats for the product are active.
3481
+ */
3482
+ format_ids?: FormatID[];
3440
3483
  targeting_overlay?: TargetingOverlay;
3441
3484
  /**
3442
3485
  * Creative assets assigned to this package
@@ -3489,17 +3532,30 @@ export interface SyncCreativesRequest {
3489
3532
  */
3490
3533
  creative_ids?: string[];
3491
3534
  /**
3492
- * Optional bulk assignment of creatives to packages
3535
+ * Optional bulk assignment of creatives to packages. Each entry maps one creative to one package with optional weight and placement targeting.
3493
3536
  */
3494
3537
  assignments?: {
3495
3538
  /**
3496
- * Array of package IDs to assign this creative to
3497
- *
3498
- * This interface was referenced by `undefined`'s JSON-Schema definition
3499
- * via the `patternProperty` "^[a-zA-Z0-9_-]+$".
3539
+ * ID of the creative to assign
3540
+ */
3541
+ creative_id: string;
3542
+ /**
3543
+ * ID of the package to assign the creative to
3544
+ */
3545
+ package_id: string;
3546
+ /**
3547
+ * Relative delivery weight (0–100). When multiple creatives are assigned to the same package, weights determine impression distribution proportionally — a creative with weight 2 gets twice the delivery of weight 1. When omitted, the creative receives equal rotation with other unweighted creatives. A weight of 0 means the creative is assigned but paused (receives no delivery).
3500
3548
  */
3501
- [k: string]: string[];
3502
- };
3549
+ weight?: number;
3550
+ /**
3551
+ * Restrict this creative to specific placements within the package. When omitted, the creative is eligible for all placements.
3552
+ */
3553
+ placement_ids?: string[];
3554
+ }[];
3555
+ /**
3556
+ * Client-generated idempotency key for safe retries. If a sync fails without a response, resending with the same idempotency_key guarantees at-most-once execution.
3557
+ */
3558
+ idempotency_key?: string;
3503
3559
  /**
3504
3560
  * When true, creatives not included in this sync will be archived. Use with caution for full library replacement.
3505
3561
  */
@@ -3577,7 +3633,7 @@ export interface SyncCreativesSuccess {
3577
3633
  * This interface was referenced by `undefined`'s JSON-Schema definition
3578
3634
  * via the `patternProperty` "^[a-zA-Z0-9_-]+$".
3579
3635
  */
3580
- [k: string]: string;
3636
+ [k: string]: string | undefined;
3581
3637
  };
3582
3638
  }[];
3583
3639
  /**
@@ -3800,18 +3856,14 @@ export interface ListCreativesResponse {
3800
3856
  */
3801
3857
  updated_date: string;
3802
3858
  /**
3803
- * Catalogs this creative renders, if any
3804
- */
3805
- catalogs?: Catalog[];
3806
- /**
3807
- * Assets for this creative, keyed by asset_role
3859
+ * Assets for this creative, keyed by asset_id
3808
3860
  */
3809
3861
  assets?: {
3810
3862
  /**
3811
3863
  * This interface was referenced by `undefined`'s JSON-Schema definition
3812
- * via the `patternProperty` "^[a-zA-Z0-9_-]+$".
3864
+ * via the `patternProperty` "^[a-z0-9_]+$".
3813
3865
  */
3814
- [k: string]: ImageAsset | VideoAsset | AudioAsset | TextAsset | HTMLAsset | CSSAsset | JavaScriptAsset | VASTAsset | DAASTAsset | URLAsset;
3866
+ [k: string]: ImageAsset | VideoAsset | AudioAsset | VASTAsset | TextAsset | URLAsset | HTMLAsset | JavaScriptAsset | WebhookAsset | CSSAsset | DAASTAsset | MarkdownAsset | BriefAsset | CatalogAsset;
3815
3867
  };
3816
3868
  /**
3817
3869
  * User-defined tags for organization and searchability
@@ -3887,7 +3939,7 @@ export interface ListCreativesResponse {
3887
3939
  * This interface was referenced by `undefined`'s JSON-Schema definition
3888
3940
  * via the `patternProperty` "^[a-zA-Z0-9_-]+$".
3889
3941
  */
3890
- [k: string]: number;
3942
+ [k: string]: number | undefined;
3891
3943
  };
3892
3944
  /**
3893
3945
  * Breakdown of creatives by status
@@ -3948,6 +4000,10 @@ export type UpdateMediaBuyRequest = {
3948
4000
  packages?: PackageUpdate[];
3949
4001
  reporting_webhook?: ReportingWebhook;
3950
4002
  push_notification_config?: PushNotificationConfig;
4003
+ /**
4004
+ * Client-generated idempotency key for safe retries. If an update fails without a response, resending with the same idempotency_key guarantees the update is applied at most once.
4005
+ */
4006
+ idempotency_key?: string;
3951
4007
  context?: ContextObject;
3952
4008
  ext?: ExtensionObject;
3953
4009
  } & {
@@ -3982,7 +4038,10 @@ export type PackageUpdate = {
3982
4038
  * Pause/resume specific package (true = paused, false = active)
3983
4039
  */
3984
4040
  paused?: boolean;
3985
- catalog?: Catalog;
4041
+ /**
4042
+ * Replace the catalogs this package promotes. Uses replacement semantics — the provided array replaces the current list. Omit to leave catalogs unchanged.
4043
+ */
4044
+ catalogs?: Catalog[];
3986
4045
  /**
3987
4046
  * Replace all optimization goals for this package. Uses replacement semantics — omit to leave goals unchanged.
3988
4047
  */
@@ -4101,14 +4160,14 @@ export interface UpdateMediaBuyError {
4101
4160
  ext?: ExtensionObject;
4102
4161
  }
4103
4162
  /**
4104
- * Status of a media buy
4163
+ * Status of a media buy.
4105
4164
  */
4106
- export type MediaBuyStatus = 'pending_activation' | 'active' | 'paused' | 'completed';
4165
+ export type MediaBuyStatus = 'pending_activation' | 'active' | 'paused' | 'completed' | 'rejected' | 'canceled';
4107
4166
  /**
4108
4167
  * Request parameters for retrieving media buy status, creative approval state, and optional delivery snapshots
4109
4168
  */
4110
4169
  export interface GetMediaBuysRequest {
4111
- account: AccountReference;
4170
+ account?: AccountReference;
4112
4171
  /**
4113
4172
  * Array of publisher media buy IDs to retrieve. When omitted along with buyer_refs, returns a paginated set of accessible media buys matching status_filter.
4114
4173
  */
@@ -4163,6 +4222,14 @@ export interface GetMediaBuysResponse {
4163
4222
  * Total budget amount across all packages, denominated in media_buy.currency
4164
4223
  */
4165
4224
  total_budget: number;
4225
+ /**
4226
+ * ISO 8601 flight start time for this media buy (earliest package start_time). Avoids requiring buyers to compute min(packages[].start_time).
4227
+ */
4228
+ start_time?: string;
4229
+ /**
4230
+ * ISO 8601 flight end time for this media buy (latest package end_time). Avoids requiring buyers to compute max(packages[].end_time).
4231
+ */
4232
+ end_time?: string;
4166
4233
  /**
4167
4234
  * ISO 8601 timestamp for creative upload deadline
4168
4235
  */
@@ -4295,6 +4362,10 @@ export interface GetMediaBuysResponse {
4295
4362
  context?: ContextObject;
4296
4363
  ext?: ExtensionObject;
4297
4364
  }
4365
+ /**
4366
+ * Attribution model to use. When omitted, the seller applies their default model.
4367
+ */
4368
+ export type AttributionModel = 'last_touch' | 'first_touch' | 'linear' | 'time_decay' | 'data_driven';
4298
4369
  /**
4299
4370
  * Metric to sort breakdown rows by (descending). Falls back to 'spend' if the seller does not report the requested metric.
4300
4371
  */
@@ -4325,7 +4396,25 @@ export interface GetMediaBuyDeliveryRequest {
4325
4396
  */
4326
4397
  end_date?: string;
4327
4398
  /**
4328
- * Request dimensional breakdowns in delivery reporting. Each key enables a specific breakdown dimension within by_package include as an empty object (e.g., "device_type": {}) to activate with defaults. Omit entirely for no breakdowns (backward compatible). Unsupported dimensions are silently omitted from the response.
4399
+ * When true, include daily_breakdown arrays within each package in by_package. Useful for per-package pacing analysis and line-item monitoring. Omit or set false to reduce response size package daily data can be large for multi-package buys over long flights.
4400
+ */
4401
+ include_package_daily_breakdown?: boolean;
4402
+ /**
4403
+ * Attribution window to apply for conversion metrics. When provided, the seller returns conversion data using the requested lookback windows instead of their platform default. The seller echoes the applied window in the response. Sellers that do not support configurable windows ignore this field and return their default. Check get_adcp_capabilities conversion_tracking.attribution_windows for available options.
4404
+ */
4405
+ attribution_window?: {
4406
+ /**
4407
+ * Post-click attribution window to apply.
4408
+ */
4409
+ post_click?: Duration;
4410
+ /**
4411
+ * Post-view attribution window to apply.
4412
+ */
4413
+ post_view?: Duration;
4414
+ model?: AttributionModel;
4415
+ };
4416
+ /**
4417
+ * Request dimensional breakdowns in delivery reporting. Each key enables a specific breakdown dimension within by_package — include as an empty object (e.g., "device_type": {}) to activate with defaults. Omit entirely for no breakdowns (backward compatible). Unsupported dimensions are silently omitted from the response. Note: keyword, catalog_item, and creative breakdowns are returned automatically when the seller supports them and are not controlled by this object.
4329
4418
  */
4330
4419
  reporting_dimensions?: {
4331
4420
  /**
@@ -4387,10 +4476,6 @@ export interface GetMediaBuyDeliveryRequest {
4387
4476
  context?: ContextObject;
4388
4477
  ext?: ExtensionObject;
4389
4478
  }
4390
- /**
4391
- * Attribution model used to assign credit when multiple touchpoints exist
4392
- */
4393
- export type AttributionModel = 'last_touch' | 'first_touch' | 'linear' | 'time_decay' | 'data_driven';
4394
4479
  /**
4395
4480
  * Pricing model used for this media buy
4396
4481
  */
@@ -4503,9 +4588,9 @@ export interface GetMediaBuyDeliveryResponse {
4503
4588
  */
4504
4589
  buyer_campaign_ref?: string;
4505
4590
  /**
4506
- * Current media buy status. Lifecycle states use the same taxonomy as media-buy-status (`pending_activation`, `active`, `paused`, `completed`). In webhook context, reporting_delayed indicates data temporarily unavailable. `pending` is accepted as a legacy alias for pending_activation.
4591
+ * Current media buy status. Lifecycle states use the same taxonomy as media-buy-status (`pending_activation`, `active`, `paused`, `completed`, `rejected`, `canceled`). In webhook context, reporting_delayed indicates data temporarily unavailable. `pending` is accepted as a legacy alias for pending_activation.
4507
4592
  */
4508
- status: 'pending_activation' | 'pending' | 'active' | 'paused' | 'completed' | 'failed' | 'reporting_delayed';
4593
+ status: 'pending_activation' | 'pending' | 'active' | 'paused' | 'completed' | 'rejected' | 'canceled' | 'failed' | 'reporting_delayed';
4509
4594
  /**
4510
4595
  * When delayed data is expected to be available (only present when status is reporting_delayed)
4511
4596
  */
@@ -4667,6 +4752,39 @@ export interface GetMediaBuyDeliveryResponse {
4667
4752
  * Whether by_placement was truncated. Sellers MUST return this flag whenever by_placement is present (false means the list is complete).
4668
4753
  */
4669
4754
  by_placement_truncated?: boolean;
4755
+ /**
4756
+ * Day-by-day delivery for this package. Only present when include_package_daily_breakdown is true in the request. Enables per-package pacing analysis and line-item monitoring.
4757
+ */
4758
+ daily_breakdown?: {
4759
+ /**
4760
+ * Date (YYYY-MM-DD)
4761
+ */
4762
+ date: string;
4763
+ /**
4764
+ * Daily impressions for this package
4765
+ */
4766
+ impressions: number;
4767
+ /**
4768
+ * Daily spend for this package
4769
+ */
4770
+ spend: number;
4771
+ /**
4772
+ * Daily conversions for this package
4773
+ */
4774
+ conversions?: number;
4775
+ /**
4776
+ * Daily conversion value for this package
4777
+ */
4778
+ conversion_value?: number;
4779
+ /**
4780
+ * Daily return on ad spend (conversion_value / spend)
4781
+ */
4782
+ roas?: number;
4783
+ /**
4784
+ * Daily fraction of conversions from first-time brand buyers (0 = none, 1 = all)
4785
+ */
4786
+ new_to_brand_rate?: number;
4787
+ }[];
4670
4788
  })[];
4671
4789
  /**
4672
4790
  * Day-by-day delivery
@@ -4718,13 +4836,13 @@ export interface GetMediaBuyDeliveryResponse {
4718
4836
  */
4719
4837
  export interface AttributionWindow {
4720
4838
  /**
4721
- * Click-through attribution window in days. Conversions occurring within this many days after a click are attributed to the ad.
4839
+ * Post-click attribution window. Conversions occurring within this duration after a click are attributed to the ad.
4722
4840
  */
4723
- click_window_days?: number;
4841
+ post_click?: Duration;
4724
4842
  /**
4725
- * View-through attribution window in days. Conversions occurring within this many days after an ad impression (without click) are attributed to the ad.
4843
+ * Post-view attribution window. Conversions occurring within this duration after an ad impression (without click) are attributed to the ad.
4726
4844
  */
4727
- view_window_days?: number;
4845
+ post_view?: Duration;
4728
4846
  model: AttributionModel;
4729
4847
  }
4730
4848
  /**
@@ -4964,19 +5082,7 @@ export type ProvidePerformanceFeedbackRequest = {
4964
5082
  * Buyer's reference for the media buy
4965
5083
  */
4966
5084
  buyer_ref?: string;
4967
- /**
4968
- * Time period for performance measurement
4969
- */
4970
- measurement_period?: {
4971
- /**
4972
- * ISO 8601 start timestamp for measurement period
4973
- */
4974
- start: string;
4975
- /**
4976
- * ISO 8601 end timestamp for measurement period
4977
- */
4978
- end: string;
4979
- };
5085
+ measurement_period?: DatetimeRange;
4980
5086
  /**
4981
5087
  * Normalized performance score (0.0 = no value, 1.0 = expected, >1.0 = above expected)
4982
5088
  */
@@ -5004,6 +5110,19 @@ export type MetricType = 'overall_performance' | 'conversion_rate' | 'brand_lift
5004
5110
  * Source of the performance data
5005
5111
  */
5006
5112
  export type FeedbackSource = 'buyer_attribution' | 'third_party_measurement' | 'platform_analytics' | 'verification_partner';
5113
+ /**
5114
+ * Time period for performance measurement
5115
+ */
5116
+ export interface DatetimeRange {
5117
+ /**
5118
+ * Start timestamp (inclusive), ISO 8601
5119
+ */
5120
+ start: string;
5121
+ /**
5122
+ * End timestamp (inclusive), ISO 8601
5123
+ */
5124
+ end: string;
5125
+ }
5007
5126
  /**
5008
5127
  * Response payload for provide_performance_feedback task. Returns either success confirmation OR error information, never both.
5009
5128
  */
@@ -5389,6 +5508,10 @@ export type AudienceMember = {
5389
5508
  }[];
5390
5509
  ext?: ExtensionObject;
5391
5510
  };
5511
+ /**
5512
+ * GDPR lawful basis for processing this audience list. Informational — not validated by the protocol, but required by some sellers operating in regulated markets (e.g. EU). When omitted, the buyer asserts they have a lawful basis appropriate to their jurisdiction.
5513
+ */
5514
+ export type ConsentBasis = 'consent' | 'legitimate_interest' | 'contract' | 'legal_obligation';
5392
5515
  /**
5393
5516
  * Request parameters for managing CRM-based audiences on an account with upsert semantics. Existing audiences matched by audience_id are updated, new ones are created. Members are specified as delta operations: add appends new members, remove drops existing ones. Recommend no more than 100,000 members per call; for larger lists, chunk and call incrementally using add/remove deltas. When delete_missing is true, buyer-managed audiences on the account not in this request are removed — do not combine with omitted audiences or all buyer-managed audiences will be deleted. When audiences is omitted, the call is discovery-only: it returns all audiences on the account without modification.
5394
5517
  */
@@ -5406,6 +5529,18 @@ export interface SyncAudiencesRequest {
5406
5529
  * Human-readable name for this audience
5407
5530
  */
5408
5531
  name?: string;
5532
+ /**
5533
+ * Human-readable description of this audience's composition or purpose (e.g., 'High-value customers who purchased in the last 90 days').
5534
+ */
5535
+ description?: string;
5536
+ /**
5537
+ * Intended use for this audience. 'crm': target these users. 'suppression': exclude these users from delivery. 'lookalike_seed': use as a seed for the seller's lookalike modeling. Sellers may handle audiences differently based on type (e.g., suppression lists bypass minimum size requirements on some platforms).
5538
+ */
5539
+ audience_type?: 'crm' | 'suppression' | 'lookalike_seed';
5540
+ /**
5541
+ * Buyer-defined tags for organizing and filtering audiences (e.g., 'holiday_2026', 'high_ltv'). Tags are stored by the seller and returned in discovery-only calls.
5542
+ */
5543
+ tags?: string[];
5409
5544
  /**
5410
5545
  * Members to add to this audience. Hashed before sending — normalize emails to lowercase+trim, phones to E.164.
5411
5546
  */
@@ -5418,10 +5553,7 @@ export interface SyncAudiencesRequest {
5418
5553
  * When true, delete this audience from the account entirely. All other fields on this audience object are ignored. Use this to delete a specific audience without affecting others.
5419
5554
  */
5420
5555
  delete?: boolean;
5421
- /**
5422
- * GDPR lawful basis for processing this audience list. Informational — not validated by the protocol, but required by some sellers operating in regulated markets (e.g. EU). When omitted, the buyer asserts they have a lawful basis appropriate to their jurisdiction.
5423
- */
5424
- consent_basis?: 'consent' | 'legitimate_interest' | 'contract' | 'legal_obligation';
5556
+ consent_basis?: ConsentBasis;
5425
5557
  }[];
5426
5558
  /**
5427
5559
  * When true, buyer-managed audiences on the account not included in this sync will be removed. Does not affect seller-managed audiences. Do not combine with an omitted audiences array or all buyer-managed audiences will be deleted.
@@ -5466,6 +5598,10 @@ export interface SyncAudiencesSuccess {
5466
5598
  * Number of members submitted in this sync operation (delta, not cumulative). In discovery-only calls (no audiences array), this is 0.
5467
5599
  */
5468
5600
  uploaded_count?: number;
5601
+ /**
5602
+ * Cumulative number of members uploaded across all syncs for this audience. Compare with matched_count to calculate match rate (matched_count / total_uploaded_count). Populated when the seller tracks cumulative upload counts.
5603
+ */
5604
+ total_uploaded_count?: number;
5469
5605
  /**
5470
5606
  * Total members matched to platform users across all syncs (cumulative, not just this call). Populated when status is 'ready'.
5471
5607
  */
@@ -5581,215 +5717,100 @@ export interface SyncCatalogsSuccess {
5581
5717
  */
5582
5718
  items_rejected?: number;
5583
5719
  /**
5584
- * Per-item issues reported by the platform (rejections, warnings). Only present when the platform performs item-level review.
5585
- */
5586
- item_issues?: {
5587
- /**
5588
- * ID of the catalog item with an issue
5589
- */
5590
- item_id: string;
5591
- status: CatalogItemStatus;
5592
- /**
5593
- * Reasons for rejection or warning
5594
- */
5595
- reasons?: string[];
5596
- }[];
5597
- /**
5598
- * ISO 8601 timestamp of when the most recent sync was accepted by the platform
5599
- */
5600
- last_synced_at?: string;
5601
- /**
5602
- * ISO 8601 timestamp of when the platform will next fetch the feed URL. Only present for URL-based catalogs with update_frequency.
5603
- */
5604
- next_fetch_at?: string;
5605
- /**
5606
- * Field names that were modified (only present when action='updated')
5607
- */
5608
- changes?: string[];
5609
- /**
5610
- * Validation or processing errors (only present when action='failed')
5611
- */
5612
- errors?: string[];
5613
- /**
5614
- * Non-fatal warnings about this catalog
5615
- */
5616
- warnings?: string[];
5617
- }[];
5618
- /**
5619
- * When true, this response contains simulated data from sandbox mode.
5620
- */
5621
- sandbox?: boolean;
5622
- context?: ContextObject;
5623
- ext?: ExtensionObject;
5624
- }
5625
- /**
5626
- * Error response - operation failed completely, no catalogs were processed
5627
- */
5628
- export interface SyncCatalogsError {
5629
- /**
5630
- * Operation-level errors that prevented processing any catalogs (e.g., authentication failure, service unavailable, invalid request format)
5631
- */
5632
- errors: Error[];
5633
- context?: ContextObject;
5634
- ext?: ExtensionObject;
5635
- }
5636
- /**
5637
- * HTTP method
5638
- */
5639
- export type HTTPMethod = 'GET' | 'POST';
5640
- /**
5641
- * Expected content type of webhook response
5642
- */
5643
- export type WebhookResponseType = 'html' | 'json' | 'xml' | 'javascript';
5644
- /**
5645
- * Authentication method
5646
- */
5647
- export type WebhookSecurityMethod = 'hmac_sha256' | 'api_key' | 'none';
5648
- /**
5649
- * Campaign-level creative brief with objective, audience, messaging, and reference assets. Can be an inline brief object or a URL to a hosted brief. Supplements the natural language message with structured creative direction.
5650
- */
5651
- export type CreativeBriefReference = CreativeBrief | string;
5652
- /**
5653
- * Request to transform or generate a creative manifest. Takes a source manifest (which may be minimal for pure generation) and produces a target manifest in the specified format.
5654
- */
5655
- export interface BuildCreativeRequest {
5656
- /**
5657
- * Natural language instructions for the transformation or generation. For pure generation, this is the creative brief. For transformation, this provides guidance on how to adapt the creative.
5658
- */
5659
- message?: string;
5660
- creative_manifest?: CreativeManifest;
5661
- target_format_id: FormatID;
5662
- brand?: BrandReference;
5663
- creative_brief?: CreativeBriefReference;
5664
- context?: ContextObject;
5665
- ext?: ExtensionObject;
5666
- }
5667
- /**
5668
- * Creative manifest to transform or generate from. For pure generation, this should include the target format_id and any required input assets. For transformation (e.g., resizing, reformatting), this is the complete creative to adapt.
5669
- */
5670
- export interface CreativeManifest {
5671
- format_id: FormatID;
5672
- /**
5673
- * Catalogs this creative renders. Each entry satisfies one of the format's catalog_requirements, matched by type. Tells the creative what data to display — product listings for a carousel, job vacancies for a recruitment ad, store locations for a locator. This is a data reference, not a campaign expansion directive; campaign structure and budget allocation are handled by create_media_buy packages. Each catalog can be inline (with items), a reference to a synced catalog (by catalog_id), or a URL to an external feed.
5674
- */
5675
- catalogs?: Catalog[];
5676
- /**
5677
- * 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.
5678
- *
5679
- * 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.
5680
- */
5681
- assets: {
5682
- /**
5683
- * This interface was referenced by `undefined`'s JSON-Schema definition
5684
- * via the `patternProperty` "^[a-z0-9_]+$".
5685
- */
5686
- [k: string]: ImageAsset | VideoAsset | AudioAsset | VASTAsset | TextAsset | URLAsset | HTMLAsset | JavaScriptAsset | WebhookAsset | CSSAsset | DAASTAsset;
5687
- };
5688
- ext?: ExtensionObject;
5689
- }
5690
- /**
5691
- * Webhook for server-side dynamic content rendering (DCO)
5692
- */
5693
- export interface WebhookAsset {
5694
- /**
5695
- * Webhook URL to call for dynamic content
5696
- */
5697
- url: string;
5698
- method?: HTTPMethod;
5699
- /**
5700
- * Maximum time to wait for response in milliseconds
5701
- */
5702
- timeout_ms?: number;
5703
- /**
5704
- * Universal macros that can be passed to webhook (e.g., DEVICE_TYPE, COUNTRY). See docs/creative/universal-macros.mdx for full list.
5705
- */
5706
- supported_macros?: (UniversalMacro | string)[];
5707
- /**
5708
- * Universal macros that must be provided for webhook to function
5709
- */
5710
- required_macros?: (UniversalMacro | string)[];
5711
- response_type: WebhookResponseType;
5712
- /**
5713
- * Security configuration for webhook calls
5714
- */
5715
- security: {
5716
- method: WebhookSecurityMethod;
5717
- /**
5718
- * Header name for HMAC signature (e.g., 'X-Signature')
5719
- */
5720
- hmac_header?: string;
5721
- /**
5722
- * Header name for API key (e.g., 'X-API-Key')
5723
- */
5724
- api_key_header?: string;
5725
- };
5726
- }
5727
- /**
5728
- * Inline creative brief object
5729
- */
5730
- export interface CreativeBrief {
5731
- /**
5732
- * Campaign or flight name for identification
5733
- */
5734
- name: string;
5735
- /**
5736
- * Campaign objective that guides creative tone and call-to-action strategy
5737
- */
5738
- objective?: 'awareness' | 'consideration' | 'conversion' | 'retention' | 'engagement';
5739
- /**
5740
- * Desired tone for this campaign, modulating the brand's base tone (e.g., 'playful and festive', 'premium and aspirational')
5741
- */
5742
- tone?: string;
5743
- /**
5744
- * Target audience description for this campaign
5745
- */
5746
- audience?: string;
5747
- /**
5748
- * Creative territory or positioning the campaign should occupy
5749
- */
5750
- territory?: string;
5751
- /**
5752
- * Messaging framework for the campaign
5753
- */
5754
- messaging?: {
5720
+ * Per-item issues reported by the platform (rejections, warnings). Only present when the platform performs item-level review.
5721
+ */
5722
+ item_issues?: {
5723
+ /**
5724
+ * ID of the catalog item with an issue
5725
+ */
5726
+ item_id: string;
5727
+ status: CatalogItemStatus;
5728
+ /**
5729
+ * Reasons for rejection or warning
5730
+ */
5731
+ reasons?: string[];
5732
+ }[];
5755
5733
  /**
5756
- * Primary headline
5734
+ * ISO 8601 timestamp of when the most recent sync was accepted by the platform
5757
5735
  */
5758
- headline?: string;
5736
+ last_synced_at?: string;
5759
5737
  /**
5760
- * Supporting tagline or sub-headline
5738
+ * ISO 8601 timestamp of when the platform will next fetch the feed URL. Only present for URL-based catalogs with update_frequency.
5761
5739
  */
5762
- tagline?: string;
5740
+ next_fetch_at?: string;
5763
5741
  /**
5764
- * Call-to-action text
5742
+ * Field names that were modified (only present when action='updated')
5765
5743
  */
5766
- cta?: string;
5744
+ changes?: string[];
5767
5745
  /**
5768
- * Key messages to communicate in priority order
5746
+ * Validation or processing errors (only present when action='failed')
5769
5747
  */
5770
- key_messages?: string[];
5771
- };
5748
+ errors?: string[];
5749
+ /**
5750
+ * Non-fatal warnings about this catalog
5751
+ */
5752
+ warnings?: string[];
5753
+ }[];
5772
5754
  /**
5773
- * Visual and strategic reference materials such as mood boards, product shots, example creatives, and strategy documents
5755
+ * When true, this response contains simulated data from sandbox mode.
5774
5756
  */
5775
- reference_assets?: ReferenceAsset[];
5757
+ sandbox?: boolean;
5758
+ context?: ContextObject;
5759
+ ext?: ExtensionObject;
5776
5760
  }
5777
5761
  /**
5778
- * A reference asset that provides creative context. Carries visual materials (mood boards, product shots, example creatives) with semantic roles that tell creative agents how to use them.
5762
+ * Error response - operation failed completely, no catalogs were processed
5779
5763
  */
5780
- export interface ReferenceAsset {
5764
+ export interface SyncCatalogsError {
5781
5765
  /**
5782
- * URL to the reference asset (image, video, or document)
5766
+ * Operation-level errors that prevented processing any catalogs (e.g., authentication failure, service unavailable, invalid request format)
5783
5767
  */
5784
- url: string;
5768
+ errors: Error[];
5769
+ context?: ContextObject;
5770
+ ext?: ExtensionObject;
5771
+ }
5772
+ /**
5773
+ * Quality tier for generation. 'draft' produces fast, lower-fidelity output for iteration and review. 'production' produces full-quality output for final delivery. If omitted, the creative agent uses its own default. For non-generative transforms (e.g., format resizing), creative agents MAY ignore this field.
5774
+ */
5775
+ export type CreativeQuality = 'draft' | 'production';
5776
+ /**
5777
+ * Request to transform or generate a creative manifest. Takes a source manifest (which may be minimal for pure generation) and produces a target manifest in the specified format.
5778
+ */
5779
+ export interface BuildCreativeRequest {
5785
5780
  /**
5786
- * How the creative agent should use this asset. style_reference: match the visual style; product_shot: include this product; mood_board: overall look and feel; example_creative: example of a similar execution; logo: logo to use; strategy_doc: strategy or planning document for context
5781
+ * Natural language instructions for the transformation or generation. For pure generation, this is the creative brief. For transformation, this provides guidance on how to adapt the creative. For refinement, this describes the desired changes.
5787
5782
  */
5788
- role: 'style_reference' | 'product_shot' | 'mood_board' | 'example_creative' | 'logo' | 'strategy_doc';
5783
+ message?: string;
5784
+ creative_manifest?: CreativeManifest;
5785
+ target_format_id: FormatID;
5786
+ brand?: BrandReference;
5787
+ quality?: CreativeQuality;
5789
5788
  /**
5790
- * Human-readable description of the asset and how it should inform creative generation
5789
+ * Maximum number of catalog items to use when generating. When a catalog asset contains more items than this limit, the creative agent selects the top items based on relevance or catalog ordering. When item_limit exceeds the format's max_items, the creative agent SHOULD use the lesser of the two. Ignored when the manifest contains no catalog assets.
5791
5790
  */
5792
- description?: string;
5791
+ item_limit?: number;
5792
+ context?: ContextObject;
5793
+ ext?: ExtensionObject;
5794
+ }
5795
+ /**
5796
+ * Creative manifest to transform or generate from. For pure generation, this should include the target format_id and any required input assets. For transformation (e.g., resizing, reformatting), this is the complete creative to adapt.
5797
+ */
5798
+ export interface CreativeManifest {
5799
+ format_id: FormatID;
5800
+ /**
5801
+ * 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.
5802
+ *
5803
+ * 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.
5804
+ */
5805
+ assets: {
5806
+ /**
5807
+ * This interface was referenced by `undefined`'s JSON-Schema definition
5808
+ * via the `patternProperty` "^[a-z0-9_]+$".
5809
+ */
5810
+ [k: string]: ImageAsset | VideoAsset | AudioAsset | VASTAsset | TextAsset | URLAsset | HTMLAsset | JavaScriptAsset | WebhookAsset | CSSAsset | DAASTAsset | MarkdownAsset | BriefAsset | CatalogAsset;
5811
+ };
5812
+ provenance?: Provenance;
5813
+ ext?: ExtensionObject;
5793
5814
  }
5794
5815
  /**
5795
5816
  * Response containing the transformed or generated creative manifest, ready for use with preview_creative or sync_creatives. Returns either the complete creative manifest OR error information, never both.
@@ -5804,6 +5825,10 @@ export interface BuildCreativeSuccess {
5804
5825
  * When true, this response contains simulated data from sandbox mode.
5805
5826
  */
5806
5827
  sandbox?: boolean;
5828
+ /**
5829
+ * ISO 8601 timestamp when generated asset URLs in the manifest expire. Set to the earliest expiration across all generated assets. Re-build the creative after this time to get fresh URLs.
5830
+ */
5831
+ expires_at?: string;
5807
5832
  context?: ContextObject;
5808
5833
  ext?: ExtensionObject;
5809
5834
  }
@@ -5852,6 +5877,10 @@ export type PreviewCreativeRequest = {
5852
5877
  */
5853
5878
  template_id?: string;
5854
5879
  output_format?: PreviewOutputFormat;
5880
+ /**
5881
+ * Maximum number of catalog items to render in the preview. For catalog-driven generative formats, caps how many items are rendered per preview variant. When item_limit exceeds the format's max_items, the creative agent SHOULD use the lesser of the two. Ignored when the manifest contains no catalog assets. Creative agents SHOULD default to a reasonable sample when omitted and the catalog is large.
5882
+ */
5883
+ item_limit?: number;
5855
5884
  context?: ContextObject;
5856
5885
  ext?: ExtensionObject;
5857
5886
  } | {
@@ -5891,6 +5920,10 @@ export type PreviewCreativeRequest = {
5891
5920
  */
5892
5921
  template_id?: string;
5893
5922
  output_format?: PreviewOutputFormat;
5923
+ /**
5924
+ * Maximum number of catalog items to render in this preview.
5925
+ */
5926
+ item_limit?: number;
5894
5927
  }[];
5895
5928
  output_format?: PreviewOutputFormat;
5896
5929
  context?: ContextObject;
@@ -5917,14 +5950,10 @@ export type PreviewCreativeRequest = {
5917
5950
  */
5918
5951
  export type PreviewOutputFormat = 'url' | 'html';
5919
5952
  /**
5920
- * Complete creative manifest with all required assets
5953
+ * Complete creative manifest with all required assets.
5921
5954
  */
5922
5955
  export interface CreativeManifest1 {
5923
5956
  format_id: FormatID;
5924
- /**
5925
- * Catalogs this creative renders. Each entry satisfies one of the format's catalog_requirements, matched by type. Tells the creative what data to display — product listings for a carousel, job vacancies for a recruitment ad, store locations for a locator. This is a data reference, not a campaign expansion directive; campaign structure and budget allocation are handled by create_media_buy packages. Each catalog can be inline (with items), a reference to a synced catalog (by catalog_id), or a URL to an external feed.
5926
- */
5927
- catalogs?: Catalog[];
5928
5957
  /**
5929
5958
  * 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.
5930
5959
  *
@@ -5935,8 +5964,9 @@ export interface CreativeManifest1 {
5935
5964
  * This interface was referenced by `undefined`'s JSON-Schema definition
5936
5965
  * via the `patternProperty` "^[a-z0-9_]+$".
5937
5966
  */
5938
- [k: string]: ImageAsset | VideoAsset | AudioAsset | VASTAsset | TextAsset | URLAsset | HTMLAsset | JavaScriptAsset | WebhookAsset | CSSAsset | DAASTAsset;
5967
+ [k: string]: ImageAsset | VideoAsset | AudioAsset | VASTAsset | TextAsset | URLAsset | HTMLAsset | JavaScriptAsset | WebhookAsset | CSSAsset | DAASTAsset | MarkdownAsset | BriefAsset | CatalogAsset;
5939
5968
  };
5969
+ provenance?: Provenance;
5940
5970
  ext?: ExtensionObject;
5941
5971
  }
5942
5972
  /**
@@ -6153,9 +6183,15 @@ export interface PreviewCreativeBatchResponse {
6153
6183
  ext?: ExtensionObject;
6154
6184
  }
6155
6185
  export interface PreviewBatchResultSuccess {
6186
+ /**
6187
+ * Indicates this preview request succeeded
6188
+ */
6156
6189
  success?: true;
6157
6190
  }
6158
6191
  export interface PreviewBatchResultError {
6192
+ /**
6193
+ * Indicates this preview request failed
6194
+ */
6159
6195
  success?: false;
6160
6196
  }
6161
6197
  /**
@@ -6226,19 +6262,7 @@ export type GetCreativeDeliveryRequest = {
6226
6262
  * 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.
6227
6263
  */
6228
6264
  max_variants?: number;
6229
- /**
6230
- * Pagination parameters for the creatives array in the response. When omitted, the agent returns all matching creatives.
6231
- */
6232
- pagination?: {
6233
- /**
6234
- * Maximum number of creatives to return
6235
- */
6236
- limit?: number;
6237
- /**
6238
- * Number of creatives to skip
6239
- */
6240
- offset?: number;
6241
- };
6265
+ pagination?: PaginationRequest;
6242
6266
  context?: ContextObject;
6243
6267
  ext?: ExtensionObject;
6244
6268
  };
@@ -6375,15 +6399,12 @@ export interface Identifier {
6375
6399
  value: string;
6376
6400
  }
6377
6401
  /**
6378
- * 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).
6402
+ * Request parameters for discovering and refining signals. Use signal_spec for natural language discovery, signal_ids for exact lookups, or both to refine previous results (signal_ids anchor the starting set, signal_spec guides adjustments).
6379
6403
  */
6380
6404
  export type GetSignalsRequest = {
6381
6405
  [k: string]: unknown | undefined;
6382
6406
  } & {
6383
- /**
6384
- * The caller's account with this signals agent. When provided, the signals agent returns per-account pricing options if configured.
6385
- */
6386
- account_id?: string;
6407
+ account?: AccountReference;
6387
6408
  /**
6388
6409
  * The buyer's campaign reference. Used to correlate signal discovery with subsequent report_usage calls.
6389
6410
  */
@@ -6393,7 +6414,7 @@ export type GetSignalsRequest = {
6393
6414
  */
6394
6415
  signal_spec?: string;
6395
6416
  /**
6396
- * Specific signals to look up by data provider and ID. Returns exact matches from the data provider's catalog. Takes precedence over signal_spec when both are provided.
6417
+ * Specific signals to look up by data provider and ID. Returns exact matches from the data provider's catalog. When combined with signal_spec, these signals anchor the starting set and signal_spec guides adjustments.
6397
6418
  */
6398
6419
  signal_ids?: SignalID[];
6399
6420
  /**
@@ -6593,6 +6614,23 @@ export interface GetSignalsResponse {
6593
6614
  */
6594
6615
  description: string;
6595
6616
  value_type?: SignalValueType;
6617
+ /**
6618
+ * Valid values for categorical signals. Present when value_type is 'categorical'. Buyers must use one of these values in SignalTargeting.values.
6619
+ */
6620
+ categories?: string[];
6621
+ /**
6622
+ * Valid range for numeric signals. Present when value_type is 'numeric'.
6623
+ */
6624
+ range?: {
6625
+ /**
6626
+ * Minimum value (inclusive)
6627
+ */
6628
+ min: number;
6629
+ /**
6630
+ * Maximum value (inclusive)
6631
+ */
6632
+ max: number;
6633
+ };
6596
6634
  signal_type: SignalCatalogType;
6597
6635
  /**
6598
6636
  * Human-readable name of the data provider
@@ -6658,14 +6696,18 @@ export interface PercentOfMediaPricing {
6658
6696
  ext?: ExtensionObject;
6659
6697
  }
6660
6698
  /**
6661
- * Fixed charge per reporting period, regardless of impressions or spend. Used for licensed data bundles and monthly audience subscriptions.
6699
+ * Fixed charge per billing period, regardless of impressions or spend. Used for licensed data bundles and audience subscriptions.
6662
6700
  */
6663
6701
  export interface FlatFeePricing {
6664
6702
  model: 'flat_fee';
6665
6703
  /**
6666
- * Fixed charge for the reporting period
6704
+ * Fixed charge for the billing period
6667
6705
  */
6668
6706
  amount: number;
6707
+ /**
6708
+ * Billing period for the flat fee.
6709
+ */
6710
+ period: 'monthly' | 'quarterly' | 'annual' | 'campaign';
6669
6711
  /**
6670
6712
  * ISO 4217 currency code
6671
6713
  */
@@ -6673,25 +6715,26 @@ export interface FlatFeePricing {
6673
6715
  ext?: ExtensionObject;
6674
6716
  }
6675
6717
  /**
6676
- * Request parameters for activating a signal on a specific deployment target
6718
+ * Request parameters for activating or deactivating a signal on deployment targets
6677
6719
  */
6678
6720
  export interface ActivateSignalRequest {
6721
+ /**
6722
+ * Whether to activate or deactivate the signal. Deactivating removes the segment from downstream platforms, required when campaigns end to comply with data governance policies (GDPR, CCPA). Defaults to 'activate' when omitted.
6723
+ */
6724
+ action?: 'activate' | 'deactivate';
6679
6725
  /**
6680
6726
  * The universal identifier for the signal to activate
6681
6727
  */
6682
6728
  signal_agent_segment_id: string;
6683
6729
  /**
6684
- * Target deployment(s) for activation. If the authenticated caller matches one of these deployment targets, activation keys will be included in the response.
6730
+ * Target destination(s) for activation. If the authenticated caller matches one of these destinations, activation keys will be included in the response.
6685
6731
  */
6686
- deployments: Destination[];
6732
+ destinations: Destination[];
6687
6733
  /**
6688
6734
  * The pricing option selected from the signal's pricing_options in the get_signals response. Required when the signal has pricing options. Records the buyer's pricing commitment at activation time; pass this same value in report_usage for billing verification.
6689
6735
  */
6690
6736
  pricing_option_id?: string;
6691
- /**
6692
- * The caller's account with the signals agent. Associates this activation with a commercial relationship established via sync_accounts.
6693
- */
6694
- account_id?: string;
6737
+ account?: AccountReference;
6695
6738
  /**
6696
6739
  * The buyer's campaign reference for this activation. Enables the signals agent to correlate activations with subsequent report_usage calls.
6697
6740
  */
@@ -6810,13 +6853,13 @@ export interface DirectIdentifiersSource {
6810
6853
  */
6811
6854
  export interface PropertyListFilters {
6812
6855
  /**
6813
- * Property must have feature data for ALL listed countries (ISO codes). Required.
6856
+ * Property must have feature data for ALL listed countries (ISO codes). When omitted, no country restriction is applied.
6814
6857
  */
6815
- countries_all: string[];
6858
+ countries_all?: string[];
6816
6859
  /**
6817
- * Property must support ANY of the listed channels. Required.
6860
+ * Property must support ANY of the listed channels. When omitted, no channel restriction is applied.
6818
6861
  */
6819
- channels_any: MediaChannel[];
6862
+ channels_any?: MediaChannel[];
6820
6863
  /**
6821
6864
  * Filter to these property types
6822
6865
  */
@@ -7083,23 +7126,11 @@ export type ListContentStandardsResponse = {
7083
7126
  * Array of content standards configurations matching the filter criteria
7084
7127
  */
7085
7128
  standards: ContentStandards[];
7086
- /**
7087
- * Field must not be present in success response
7088
- */
7089
- errors?: {
7090
- [k: string]: unknown | undefined;
7091
- };
7092
7129
  pagination?: PaginationResponse;
7093
7130
  context?: ContextObject;
7094
7131
  ext?: ExtensionObject;
7095
7132
  } | {
7096
7133
  errors: Error[];
7097
- /**
7098
- * Field must not be present in error response
7099
- */
7100
- standards?: {
7101
- [k: string]: unknown | undefined;
7102
- };
7103
7134
  context?: ContextObject;
7104
7135
  ext?: ExtensionObject;
7105
7136
  };
@@ -7219,6 +7250,7 @@ export interface Artifact {
7219
7250
  * Heading level (1-6), only for role=heading
7220
7251
  */
7221
7252
  heading_level?: number;
7253
+ provenance?: Provenance;
7222
7254
  } | {
7223
7255
  type: 'image';
7224
7256
  /**
@@ -7242,6 +7274,7 @@ export interface Artifact {
7242
7274
  * Image height in pixels
7243
7275
  */
7244
7276
  height?: number;
7277
+ provenance?: Provenance;
7245
7278
  } | {
7246
7279
  type: 'video';
7247
7280
  /**
@@ -7265,6 +7298,7 @@ export interface Artifact {
7265
7298
  * Video thumbnail URL
7266
7299
  */
7267
7300
  thumbnail_url?: string;
7301
+ provenance?: Provenance;
7268
7302
  } | {
7269
7303
  type: 'audio';
7270
7304
  /**
@@ -7284,6 +7318,7 @@ export interface Artifact {
7284
7318
  * How the transcript was generated
7285
7319
  */
7286
7320
  transcript_source?: 'original_script' | 'closed_captions' | 'generated';
7321
+ provenance?: Provenance;
7287
7322
  })[];
7288
7323
  /**
7289
7324
  * Rich metadata extracted from the artifact
@@ -7314,6 +7349,7 @@ export interface Artifact {
7314
7349
  */
7315
7350
  json_ld?: {}[];
7316
7351
  };
7352
+ provenance?: Provenance;
7317
7353
  /**
7318
7354
  * Platform-specific identifiers for this artifact
7319
7355
  */
@@ -7356,12 +7392,6 @@ export interface GetContentStandardsRequest {
7356
7392
  */
7357
7393
  export type GetContentStandardsResponse = ContentStandards | {
7358
7394
  errors: Error[];
7359
- /**
7360
- * Field must not be present in error response
7361
- */
7362
- standards_id?: {
7363
- [k: string]: unknown | undefined;
7364
- };
7365
7395
  context?: ContextObject;
7366
7396
  ext?: ExtensionObject;
7367
7397
  };
@@ -7444,12 +7474,6 @@ export type CreateContentStandardsResponse = {
7444
7474
  * Unique identifier for the created standards configuration
7445
7475
  */
7446
7476
  standards_id: string;
7447
- /**
7448
- * Field must not be present in success response
7449
- */
7450
- errors?: {
7451
- [k: string]: unknown | undefined;
7452
- };
7453
7477
  context?: ContextObject;
7454
7478
  ext?: ExtensionObject;
7455
7479
  } | {
@@ -7458,12 +7482,6 @@ export type CreateContentStandardsResponse = {
7458
7482
  * If the error is a scope conflict, the ID of the existing standards that conflict
7459
7483
  */
7460
7484
  conflicting_standards_id?: string;
7461
- /**
7462
- * Field must not be present in error response
7463
- */
7464
- standards_id?: {
7465
- [k: string]: unknown | undefined;
7466
- };
7467
7485
  context?: ContextObject;
7468
7486
  ext?: ExtensionObject;
7469
7487
  };
@@ -7545,15 +7563,28 @@ export interface UpdateContentStandardsRequest {
7545
7563
  /**
7546
7564
  * Response from updating a content standards configuration
7547
7565
  */
7548
- export interface UpdateContentStandardsResponse {
7566
+ export type UpdateContentStandardsResponse = UpdateContentStandardsSuccess | UpdateContentStandardsError;
7567
+ export interface UpdateContentStandardsSuccess {
7568
+ /**
7569
+ * Indicates the update was applied successfully
7570
+ */
7571
+ success: true;
7549
7572
  /**
7550
7573
  * ID of the updated standards configuration
7551
7574
  */
7552
- standards_id?: string;
7575
+ standards_id: string;
7576
+ context?: ContextObject;
7577
+ ext?: ExtensionObject;
7578
+ }
7579
+ export interface UpdateContentStandardsError {
7580
+ /**
7581
+ * Indicates the update failed
7582
+ */
7583
+ success: false;
7553
7584
  /**
7554
7585
  * Errors that occurred during the update
7555
7586
  */
7556
- errors?: Error[];
7587
+ errors: Error[];
7557
7588
  /**
7558
7589
  * If scope change conflicts with another configuration, the ID of the conflicting standards
7559
7590
  */
@@ -7604,20 +7635,12 @@ export type CalibrateContentResponse = {
7604
7635
  */
7605
7636
  explanation?: string;
7606
7637
  }[];
7607
- /**
7608
- * Field must not be present in success response
7609
- */
7610
- errors?: {
7611
- [k: string]: unknown | undefined;
7612
- };
7638
+ context?: ContextObject;
7639
+ ext?: ExtensionObject;
7613
7640
  } | {
7614
7641
  errors: Error[];
7615
- /**
7616
- * Field must not be present in error response
7617
- */
7618
- verdict?: {
7619
- [k: string]: unknown | undefined;
7620
- };
7642
+ context?: ContextObject;
7643
+ ext?: ExtensionObject;
7621
7644
  };
7622
7645
  /**
7623
7646
  * Request parameters for batch validating delivery records against content safety policies
@@ -7717,22 +7740,10 @@ export type ValidateContentDeliveryResponse = {
7717
7740
  rule_id?: string;
7718
7741
  }[];
7719
7742
  }[];
7720
- /**
7721
- * Field must not be present in success response
7722
- */
7723
- errors?: {
7724
- [k: string]: unknown | undefined;
7725
- };
7726
7743
  context?: ContextObject;
7727
7744
  ext?: ExtensionObject;
7728
7745
  } | {
7729
7746
  errors: Error[];
7730
- /**
7731
- * Field must not be present in error response
7732
- */
7733
- summary?: {
7734
- [k: string]: unknown | undefined;
7735
- };
7736
7747
  context?: ContextObject;
7737
7748
  ext?: ExtensionObject;
7738
7749
  };
@@ -7864,27 +7875,15 @@ export type GetMediaBuyArtifactsResponse = {
7864
7875
  method?: 'random' | 'stratified' | 'recent' | 'failures_only';
7865
7876
  };
7866
7877
  pagination?: PaginationResponse;
7867
- /**
7868
- * Field must not be present in success response
7869
- */
7870
- errors?: {
7871
- [k: string]: unknown | undefined;
7872
- };
7873
7878
  context?: ContextObject;
7874
7879
  ext?: ExtensionObject;
7875
7880
  } | {
7876
7881
  errors: Error[];
7877
- /**
7878
- * Field must not be present in error response
7879
- */
7880
- media_buy_id?: {
7881
- [k: string]: unknown | undefined;
7882
- };
7883
7882
  context?: ContextObject;
7884
7883
  ext?: ExtensionObject;
7885
7884
  };
7886
7885
  /**
7887
- * Request payload for get_creative_features task. Evaluates a creative manifest and returns feature values from a creative governance agent.
7886
+ * Request payload for the get_creative_features task. Submits a creative manifest for evaluation by a governance agent, which analyzes the creative and returns scored feature values (brand safety, content categorization, quality metrics, etc.).
7888
7887
  */
7889
7888
  export interface GetCreativeFeaturesRequest {
7890
7889
  creative_manifest: CreativeManifest;
@@ -7892,11 +7891,12 @@ export interface GetCreativeFeaturesRequest {
7892
7891
  * Optional filter to specific features. If omitted, returns all available features.
7893
7892
  */
7894
7893
  feature_ids?: string[];
7894
+ account?: AccountReference;
7895
7895
  context?: ContextObject;
7896
7896
  ext?: ExtensionObject;
7897
7897
  }
7898
7898
  /**
7899
- * Response payload for get_creative_features task. Returns feature values for the evaluated creative.
7899
+ * Response payload for the get_creative_features task. Returns scored feature values from the governance agent's evaluation of the submitted creative manifest.
7900
7900
  */
7901
7901
  export type GetCreativeFeaturesResponse = {
7902
7902
  /**
@@ -7907,22 +7907,10 @@ export type GetCreativeFeaturesResponse = {
7907
7907
  * URL to the vendor's full assessment report. The vendor controls what information is disclosed and access control.
7908
7908
  */
7909
7909
  detail_url?: string;
7910
- /**
7911
- * Field must not be present in success response
7912
- */
7913
- errors?: {
7914
- [k: string]: unknown | undefined;
7915
- };
7916
7910
  context?: ContextObject;
7917
7911
  ext?: ExtensionObject;
7918
7912
  } | {
7919
7913
  errors: Error[];
7920
- /**
7921
- * Field must not be present in error response
7922
- */
7923
- results?: {
7924
- [k: string]: unknown | undefined;
7925
- };
7926
7914
  context?: ContextObject;
7927
7915
  ext?: ExtensionObject;
7928
7916
  };
@@ -8577,7 +8565,7 @@ export interface GetAdCPCapabilitiesResponse {
8577
8565
  */
8578
8566
  adcp: {
8579
8567
  /**
8580
- * AdCP major versions supported by this seller. Major versions indicate breaking changes.
8568
+ * AdCP major versions supported by this seller. Major versions indicate breaking changes. When multiple versions are listed, the buyer declares its version during the capabilities handshake or via the adcp_version field on requests.
8581
8569
  */
8582
8570
  major_versions: number[];
8583
8571
  };
@@ -8618,6 +8606,31 @@ export interface GetAdCPCapabilitiesResponse {
8618
8606
  * Media-buy protocol capabilities. Only present if media_buy is in supported_protocols.
8619
8607
  */
8620
8608
  media_buy?: {
8609
+ /**
8610
+ * Pricing models this seller supports across its product portfolio. Buyers can use this for pre-flight filtering before querying individual products. Individual products may support a subset of these models.
8611
+ */
8612
+ supported_pricing_models?: PricingModel[];
8613
+ /**
8614
+ * Seller-level reporting capabilities. Summarizes what reporting features are available across the seller's product portfolio. Individual products may vary — check product-level reporting_capabilities for specifics.
8615
+ */
8616
+ reporting?: {
8617
+ /**
8618
+ * Whether any products support date range filtering (date_range_support: 'date_range'). When false, all products return lifetime-only data.
8619
+ */
8620
+ supports_date_range?: boolean;
8621
+ /**
8622
+ * Whether delivery reporting includes daily_breakdown at the media buy and/or package level.
8623
+ */
8624
+ supports_daily_breakdown?: boolean;
8625
+ /**
8626
+ * Whether any products support webhook-based reporting notifications.
8627
+ */
8628
+ supports_webhooks?: boolean;
8629
+ /**
8630
+ * Reporting dimensions available across the seller's portfolio. Individual products may support a subset. Dimensions geo, device_type, device_platform, audience, and placement are opt-in via reporting_dimensions on the delivery request. Dimensions creative, keyword, and catalog_item are included automatically when the seller supports them (not controlled by reporting_dimensions).
8631
+ */
8632
+ available_dimensions?: ('geo' | 'device_type' | 'device_platform' | 'audience' | 'placement' | 'creative' | 'keyword' | 'catalog_item')[];
8633
+ };
8621
8634
  features?: MediaBuyFeatures;
8622
8635
  /**
8623
8636
  * Technical execution capabilities for media buying
@@ -8764,13 +8777,23 @@ export interface GetAdCPCapabilitiesResponse {
8764
8777
  */
8765
8778
  audience_exclude?: boolean;
8766
8779
  /**
8767
- * Whether seller supports keyword targeting via targeting_overlay.keyword_targets and keyword_targets_add/remove in update_media_buy
8780
+ * Keyword targeting capabilities. Presence indicates support for targeting_overlay.keyword_targets and keyword_targets_add/remove in update_media_buy.
8768
8781
  */
8769
- keyword_targets?: boolean;
8782
+ keyword_targets?: {
8783
+ /**
8784
+ * Match types this seller supports for keyword targets. Sellers must reject goals with unsupported match types.
8785
+ */
8786
+ supported_match_types: ('broad' | 'phrase' | 'exact')[];
8787
+ };
8770
8788
  /**
8771
- * Whether seller supports negative keyword targeting via targeting_overlay.negative_keywords and negative_keywords_add/remove in update_media_buy
8789
+ * Negative keyword capabilities. Presence indicates support for targeting_overlay.negative_keywords and negative_keywords_add/remove in update_media_buy.
8772
8790
  */
8773
- negative_keywords?: boolean;
8791
+ negative_keywords?: {
8792
+ /**
8793
+ * Match types this seller supports for negative keywords. Sellers must reject goals with unsupported match types.
8794
+ */
8795
+ supported_match_types: ('broad' | 'phrase' | 'exact')[];
8796
+ };
8774
8797
  /**
8775
8798
  * Proximity targeting capabilities from arbitrary coordinates via targeting_overlay.geo_proximity.
8776
8799
  */
@@ -8799,9 +8822,13 @@ export interface GetAdCPCapabilitiesResponse {
8799
8822
  */
8800
8823
  audience_targeting?: {
8801
8824
  /**
8802
- * Identifier types accepted for audience matching. Buyers should only send identifiers the seller supports.
8825
+ * PII-derived identifier types accepted for audience matching. Buyers should only send identifiers the seller supports.
8826
+ */
8827
+ supported_identifier_types: ('hashed_email' | 'hashed_phone')[];
8828
+ /**
8829
+ * Whether the seller accepts the buyer's CRM/loyalty ID as a matchable identifier. Only applicable when the seller operates a closed ecosystem with a shared ID namespace (e.g., a retailer matching against their loyalty program). When true, buyers can include platform_customer_id values in AudienceMember.identifiers for matching against the seller's identity graph. Reporting on matched platform_customer_ids typically requires a clean room or the seller's own reporting surface.
8803
8830
  */
8804
- supported_identifier_types: ('hashed_email' | 'hashed_phone' | 'external_id')[];
8831
+ supports_platform_customer_id?: boolean;
8805
8832
  /**
8806
8833
  * Universal ID types accepted for audience matching (MAIDs, RampID, UID2, etc.). MAID support varies significantly by platform — check this field before sending uids with type: maid.
8807
8834
  */
@@ -8848,13 +8875,13 @@ export interface GetAdCPCapabilitiesResponse {
8848
8875
  attribution_windows?: {
8849
8876
  event_type?: EventType;
8850
8877
  /**
8851
- * Available click-through attribution windows (e.g. ["7d"], ["7d", "14d", "30d"])
8878
+ * Available post-click attribution windows (e.g. [{"interval": 7, "unit": "days"}])
8852
8879
  */
8853
- click_through: string[];
8880
+ post_click: Duration[];
8854
8881
  /**
8855
- * Available view-through attribution windows (e.g. ["1d"], ["1d", "7d", "14d"])
8882
+ * Available post-view attribution windows (e.g. [{"interval": 1, "unit": "days"}])
8856
8883
  */
8857
- view_through?: string[];
8884
+ post_view?: Duration[];
8858
8885
  }[];
8859
8886
  };
8860
8887
  /**
@@ -9020,9 +9047,9 @@ export interface GetAdCPCapabilitiesResponse {
9020
9047
  */
9021
9048
  creative?: {
9022
9049
  /**
9023
- * Whether this creative agent accepts creative_brief in build_creative requests for structured campaign-level creative direction
9050
+ * When true, this creative agent can process briefs with compliance requirements (required_disclosures, prohibited_claims) and will validate that disclosures can be satisfied by the target format.
9024
9051
  */
9025
- supports_brief?: boolean;
9052
+ supports_compliance?: boolean;
9026
9053
  };
9027
9054
  /**
9028
9055
  * Extension namespaces this agent supports. Buyers can expect meaningful data in ext.{namespace} fields on responses from this agent. Extension schemas are published in the AdCP extension registry.
@@ -9212,19 +9239,7 @@ export interface ReportUsageRequest {
9212
9239
  * Client-generated unique key for this request. If a request with the same key has already been accepted, the server returns the original response without re-processing. Use a UUID or other unique identifier. Prevents duplicate billing on retries.
9213
9240
  */
9214
9241
  idempotency_key?: string;
9215
- /**
9216
- * The time range covered by this usage report. Applies to all records in the request.
9217
- */
9218
- reporting_period: {
9219
- /**
9220
- * Start of the reporting period (inclusive), in UTC.
9221
- */
9222
- start: string;
9223
- /**
9224
- * End of the reporting period (inclusive), in UTC.
9225
- */
9226
- end: string;
9227
- };
9242
+ reporting_period: DatetimeRange;
9228
9243
  /**
9229
9244
  * One or more usage records. Each record is self-contained: it carries its own account and buyer_campaign_ref, allowing a single request to span multiple accounts and campaigns.
9230
9245
  */
@@ -9290,22 +9305,23 @@ export interface ReportUsageResponse {
9290
9305
  */
9291
9306
  export interface GetAccountFinancialsRequest {
9292
9307
  account: AccountReference;
9293
- /**
9294
- * Date range for the spend summary. Defaults to the current billing cycle if omitted.
9295
- */
9296
- period?: {
9297
- /**
9298
- * Period start (ISO 8601 date)
9299
- */
9300
- start: string;
9301
- /**
9302
- * Period end (ISO 8601 date)
9303
- */
9304
- end: string;
9305
- };
9308
+ period?: DateRange;
9306
9309
  context?: ContextObject;
9307
9310
  ext?: ExtensionObject;
9308
9311
  }
9312
+ /**
9313
+ * Date range for the spend summary. Defaults to the current billing cycle if omitted.
9314
+ */
9315
+ export interface DateRange {
9316
+ /**
9317
+ * Start date (inclusive), ISO 8601
9318
+ */
9319
+ start: string;
9320
+ /**
9321
+ * End date (inclusive), ISO 8601
9322
+ */
9323
+ end: string;
9324
+ }
9309
9325
  /**
9310
9326
  * Financial status for an operator-billed account. Returns spend summary, credit/balance status, payment status, and invoice history. The level of detail varies by seller — only account, currency, and period are guaranteed on success.
9311
9327
  */
@@ -9319,19 +9335,11 @@ export interface GetAccountFinancialsSuccess {
9319
9335
  * ISO 4217 currency code for all monetary amounts in this response
9320
9336
  */
9321
9337
  currency: string;
9338
+ period: DateRange;
9322
9339
  /**
9323
- * The actual period covered by spend data. May differ from the requested period if the seller adjusts to billing cycle boundaries.
9340
+ * IANA timezone of the seller's billing day boundaries (e.g., 'America/New_York'). All dates in this response — period, invoice periods, due dates — are calendar dates in this timezone. Buyers in a different timezone should expect spend boundaries to differ from their own calendar day.
9324
9341
  */
9325
- period: {
9326
- /**
9327
- * Period start (ISO 8601 date)
9328
- */
9329
- start: string;
9330
- /**
9331
- * Period end (ISO 8601 date)
9332
- */
9333
- end: string;
9334
- };
9342
+ timezone: string;
9335
9343
  /**
9336
9344
  * Spend summary for the period
9337
9345
  */
@@ -9400,13 +9408,7 @@ export interface GetAccountFinancialsSuccess {
9400
9408
  * Seller-assigned invoice identifier
9401
9409
  */
9402
9410
  invoice_id: string;
9403
- /**
9404
- * Billing period covered by this invoice
9405
- */
9406
- period?: {
9407
- start: string;
9408
- end: string;
9409
- };
9411
+ period?: DateRange;
9410
9412
  /**
9411
9413
  * Invoice total in currency
9412
9414
  */