@adcp/client 4.0.1 → 4.1.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 (57) hide show
  1. package/dist/lib/adapters/content-standards-adapter.d.ts.map +1 -1
  2. package/dist/lib/adapters/content-standards-adapter.js +2 -0
  3. package/dist/lib/adapters/content-standards-adapter.js.map +1 -1
  4. package/dist/lib/core/AgentClient.d.ts.map +1 -1
  5. package/dist/lib/core/SingleAgentClient.d.ts +0 -14
  6. package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
  7. package/dist/lib/core/SingleAgentClient.js +29 -72
  8. package/dist/lib/core/SingleAgentClient.js.map +1 -1
  9. package/dist/lib/index.d.ts +6 -2
  10. package/dist/lib/index.d.ts.map +1 -1
  11. package/dist/lib/index.js +12 -4
  12. package/dist/lib/index.js.map +1 -1
  13. package/dist/lib/types/adcp.d.ts +2 -5
  14. package/dist/lib/types/adcp.d.ts.map +1 -1
  15. package/dist/lib/types/compat.d.ts +3 -0
  16. package/dist/lib/types/compat.d.ts.map +1 -1
  17. package/dist/lib/types/compat.js.map +1 -1
  18. package/dist/lib/types/core.generated.d.ts +731 -226
  19. package/dist/lib/types/core.generated.d.ts.map +1 -1
  20. package/dist/lib/types/core.generated.js +1 -1
  21. package/dist/lib/types/error-codes.d.ts +32 -0
  22. package/dist/lib/types/error-codes.d.ts.map +1 -0
  23. package/dist/lib/types/error-codes.js +114 -0
  24. package/dist/lib/types/error-codes.js.map +1 -0
  25. package/dist/lib/types/index.d.ts +1 -1
  26. package/dist/lib/types/index.d.ts.map +1 -1
  27. package/dist/lib/types/index.js.map +1 -1
  28. package/dist/lib/types/schemas.generated.d.ts +23334 -8549
  29. package/dist/lib/types/schemas.generated.d.ts.map +1 -1
  30. package/dist/lib/types/schemas.generated.js +644 -462
  31. package/dist/lib/types/schemas.generated.js.map +1 -1
  32. package/dist/lib/types/tools.generated.d.ts +1360 -925
  33. package/dist/lib/types/tools.generated.d.ts.map +1 -1
  34. package/dist/lib/utils/creative-adapter.d.ts +1 -1
  35. package/dist/lib/utils/creative-adapter.js +2 -2
  36. package/dist/lib/utils/creative-adapter.js.map +1 -1
  37. package/dist/lib/utils/deprecation.d.ts +11 -0
  38. package/dist/lib/utils/deprecation.d.ts.map +1 -0
  39. package/dist/lib/utils/deprecation.js +23 -0
  40. package/dist/lib/utils/deprecation.js.map +1 -0
  41. package/dist/lib/utils/index.d.ts +1 -0
  42. package/dist/lib/utils/index.d.ts.map +1 -1
  43. package/dist/lib/utils/index.js +4 -1
  44. package/dist/lib/utils/index.js.map +1 -1
  45. package/dist/lib/utils/request-normalizer.d.ts +23 -0
  46. package/dist/lib/utils/request-normalizer.d.ts.map +1 -0
  47. package/dist/lib/utils/request-normalizer.js +119 -0
  48. package/dist/lib/utils/request-normalizer.js.map +1 -0
  49. package/dist/lib/utils/sync-creatives-adapter.d.ts +18 -0
  50. package/dist/lib/utils/sync-creatives-adapter.d.ts.map +1 -0
  51. package/dist/lib/utils/sync-creatives-adapter.js +46 -0
  52. package/dist/lib/utils/sync-creatives-adapter.js.map +1 -0
  53. package/dist/lib/version.d.ts +3 -3
  54. package/dist/lib/version.d.ts.map +1 -1
  55. package/dist/lib/version.js +3 -3
  56. package/dist/lib/version.js.map +1 -1
  57. package/package.json +1 -1
@@ -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.
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
  */
@@ -691,7 +768,11 @@ export interface Product {
691
768
  /**
692
769
  * Metric kinds this product can optimize for. Buyers should only request metric goals for kinds listed here.
693
770
  */
694
- supported_metrics: ('clicks' | 'views' | 'completed_views' | 'viewed_seconds' | 'attention_seconds' | 'attention_score' | 'engagements' | 'follows' | 'saves' | 'profile_visits')[];
771
+ supported_metrics: ('clicks' | 'views' | 'completed_views' | 'viewed_seconds' | 'attention_seconds' | 'attention_score' | 'engagements' | 'follows' | 'saves' | 'profile_visits' | 'reach')[];
772
+ /**
773
+ * Reach units this product can optimize for. Required when supported_metrics includes 'reach'. Buyers must set reach_unit to a value in this list on reach optimization goals — sellers reject unsupported values.
774
+ */
775
+ supported_reach_units?: ReachUnit[];
695
776
  /**
696
777
  * Video view duration thresholds (in seconds) this product supports for completed_views goals. Only relevant when supported_metrics includes 'completed_views'. When absent, the seller uses their platform default. Buyers must set view_duration_seconds to a value in this list — sellers reject unsupported values.
697
778
  */
@@ -1226,9 +1307,22 @@ export interface ForecastPoint {
1226
1307
  */
1227
1308
  budget: number;
1228
1309
  /**
1229
- * 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.).
1230
1311
  */
1231
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;
1232
1326
  [k: string]: ForecastRange | undefined;
1233
1327
  };
1234
1328
  }
@@ -1250,9 +1344,9 @@ export interface ForecastRange {
1250
1344
  high?: number;
1251
1345
  }
1252
1346
  /**
1253
- * 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.
1254
1348
  */
1255
- export interface Measurement {
1349
+ export interface OutcomeMeasurement {
1256
1350
  /**
1257
1351
  * Type of measurement
1258
1352
  */
@@ -1262,14 +1356,27 @@ export interface Measurement {
1262
1356
  */
1263
1357
  attribution: string;
1264
1358
  /**
1265
- * Attribution window
1359
+ * Attribution window as a structured duration (e.g., {"interval": 30, "unit": "days"}).
1266
1360
  */
1267
- window?: string;
1361
+ window?: Duration;
1268
1362
  /**
1269
1363
  * Reporting frequency and format
1270
1364
  */
1271
1365
  reporting: string;
1272
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
+ }
1273
1380
  /**
1274
1381
  * Reporting capabilities available for a product
1275
1382
  */
@@ -1298,11 +1405,57 @@ export interface ReportingCapabilities {
1298
1405
  * Whether this product supports creative-level metric breakdowns in delivery reporting (by_creative within by_package)
1299
1406
  */
1300
1407
  supports_creative_breakdown?: boolean;
1408
+ /**
1409
+ * Whether this product supports keyword-level metric breakdowns in delivery reporting (by_keyword within by_package)
1410
+ */
1411
+ supports_keyword_breakdown?: boolean;
1412
+ supports_geo_breakdown?: GeographicBreakdownSupport;
1413
+ /**
1414
+ * Whether this product supports device type breakdowns in delivery reporting (by_device_type within by_package)
1415
+ */
1416
+ supports_device_type_breakdown?: boolean;
1417
+ /**
1418
+ * Whether this product supports device platform breakdowns in delivery reporting (by_device_platform within by_package)
1419
+ */
1420
+ supports_device_platform_breakdown?: boolean;
1421
+ /**
1422
+ * Whether this product supports audience segment breakdowns in delivery reporting (by_audience within by_package)
1423
+ */
1424
+ supports_audience_breakdown?: boolean;
1425
+ /**
1426
+ * Whether this product supports placement breakdowns in delivery reporting (by_placement within by_package)
1427
+ */
1428
+ supports_placement_breakdown?: boolean;
1301
1429
  /**
1302
1430
  * Whether delivery data can be filtered to arbitrary date ranges. 'date_range' means the platform supports start_date/end_date parameters. 'lifetime_only' means the platform returns campaign lifetime totals and date range parameters are not accepted.
1303
1431
  */
1304
1432
  date_range_support: 'date_range' | 'lifetime_only';
1305
1433
  }
1434
+ /**
1435
+ * Geographic breakdown support for this product. Declares which geo levels and systems are available for by_geo reporting within by_package.
1436
+ */
1437
+ export interface GeographicBreakdownSupport {
1438
+ /**
1439
+ * Supports country-level geo breakdown (ISO 3166-1 alpha-2)
1440
+ */
1441
+ country?: boolean;
1442
+ /**
1443
+ * Supports region/state-level geo breakdown (ISO 3166-2)
1444
+ */
1445
+ region?: boolean;
1446
+ /**
1447
+ * Metro area breakdown support. Keys are metro-system enum values; true means supported.
1448
+ */
1449
+ metro?: {
1450
+ [k: string]: boolean | undefined;
1451
+ };
1452
+ /**
1453
+ * Postal area breakdown support. Keys are postal-system enum values; true means supported.
1454
+ */
1455
+ postal_area?: {
1456
+ [k: string]: boolean | undefined;
1457
+ };
1458
+ }
1306
1459
  /**
1307
1460
  * Creative requirements and restrictions for a product
1308
1461
  */
@@ -1313,6 +1466,10 @@ export interface CreativePolicy {
1313
1466
  * Whether creative templates are provided
1314
1467
  */
1315
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;
1316
1473
  }
1317
1474
  /**
1318
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.
@@ -1427,7 +1584,7 @@ export interface DaypartTarget {
1427
1584
  */
1428
1585
  export interface Error {
1429
1586
  /**
1430
- * 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.
1431
1588
  */
1432
1589
  code: string;
1433
1590
  /**
@@ -1450,6 +1607,10 @@ export interface Error {
1450
1607
  * Additional task-specific error details
1451
1608
  */
1452
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';
1453
1614
  }
1454
1615
  /**
1455
1616
  * Standard cursor-based pagination metadata for list responses
@@ -1471,11 +1632,15 @@ export interface PaginationResponse {
1471
1632
  /**
1472
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.
1473
1634
  */
1474
- 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';
1475
1636
  /**
1476
1637
  * Filter to formats that meet at least this WCAG conformance level (A < AA < AAA)
1477
1638
  */
1478
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';
1479
1644
  /**
1480
1645
  * Request parameters for discovering supported creative formats
1481
1646
  */
@@ -1514,6 +1679,10 @@ export interface ListCreativeFormatsRequest {
1514
1679
  */
1515
1680
  name_search?: string;
1516
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[];
1517
1686
  /**
1518
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.
1519
1688
  */
@@ -1534,29 +1703,6 @@ export type FormatIDParameter = 'dimensions' | 'duration';
1534
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.
1535
1704
  */
1536
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';
1537
- /**
1538
- * 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.
1539
- */
1540
- export type AssetRequirements = ImageAssetRequirements | VideoAssetRequirements | AudioAssetRequirements | TextAssetRequirements | MarkdownAssetRequirements | HTMLAssetRequirements | CSSAssetRequirements | JavaScriptAssetRequirements | VASTAssetRequirements | DAASTAssetRequirements | URLAssetRequirements | WebhookAssetRequirements;
1541
- /**
1542
- * 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.
1543
- */
1544
- export type CatalogFieldBinding = ScalarBinding | AssetPoolBinding | {
1545
- kind: 'catalog_group';
1546
- /**
1547
- * The asset_group_id of a repeatable_group in the format's assets array.
1548
- */
1549
- format_group_id: string;
1550
- /**
1551
- * Each repetition of the format's repeatable_group maps to one item from the catalog.
1552
- */
1553
- catalog_item: true;
1554
- /**
1555
- * Scalar and asset pool bindings that apply within each repetition of the group. Nested catalog_group bindings are not permitted.
1556
- */
1557
- per_item_bindings?: (ScalarBinding | AssetPoolBinding)[];
1558
- ext?: ExtensionObject;
1559
- };
1560
1706
  /**
1561
1707
  * Capabilities supported by creative agents for format handling
1562
1708
  */
@@ -1697,6 +1843,10 @@ export interface Format {
1697
1843
  */
1698
1844
  requires_accessible_assets?: boolean;
1699
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[];
1700
1850
  /**
1701
1851
  * Optional detailed card with carousel and full specifications. Provides rich format documentation similar to ad spec pages.
1702
1852
  */
@@ -1707,10 +1857,6 @@ export interface Format {
1707
1857
  */
1708
1858
  manifest: {};
1709
1859
  };
1710
- /**
1711
- * 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.
1712
- */
1713
- catalog_requirements?: CatalogRequirements[];
1714
1860
  /**
1715
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.
1716
1862
  */
@@ -1726,7 +1872,7 @@ export interface BaseIndividualAsset {
1726
1872
  */
1727
1873
  asset_id: string;
1728
1874
  /**
1729
- * 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.
1730
1876
  */
1731
1877
  asset_role?: string;
1732
1878
  /**
@@ -1799,7 +1945,7 @@ export interface BaseGroupAsset {
1799
1945
  */
1800
1946
  asset_id: string;
1801
1947
  /**
1802
- * 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.
1803
1949
  */
1804
1950
  asset_role?: string;
1805
1951
  /**
@@ -1812,562 +1958,253 @@ export interface BaseGroupAsset {
1812
1958
  overlays?: Overlay[];
1813
1959
  }
1814
1960
  /**
1815
- * 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.
1816
1966
  */
1817
- export interface CatalogRequirements {
1818
- catalog_type: CatalogType;
1967
+ export type OptimizationGoal = {
1968
+ kind: 'metric';
1819
1969
  /**
1820
- * 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').
1821
1971
  */
1822
- required?: boolean;
1972
+ metric: 'clicks' | 'views' | 'completed_views' | 'viewed_seconds' | 'attention_seconds' | 'attention_score' | 'engagements' | 'follows' | 'saves' | 'profile_visits' | 'reach';
1823
1973
  /**
1824
- * 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.
1825
1975
  */
1826
- min_items?: number;
1976
+ reach_unit?: ReachUnit;
1827
1977
  /**
1828
- * 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.
1829
1979
  */
1830
- required_fields?: string[];
1980
+ target_frequency?: {
1981
+ [k: string]: unknown | undefined;
1982
+ };
1831
1983
  /**
1832
- * 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.
1833
1985
  */
1834
- feed_formats?: FeedFormat[];
1986
+ view_duration_seconds?: number;
1835
1987
  /**
1836
- * 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.
1837
1989
  */
1838
- 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
+ };
1839
2003
  /**
1840
- * 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.
1841
2005
  */
1842
- field_bindings?: CatalogFieldBinding[];
1843
- }
1844
- /**
1845
- * 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.
1846
- */
1847
- export interface OfferingAssetConstraint {
2006
+ priority?: number;
2007
+ } | {
2008
+ kind: 'event';
1848
2009
  /**
1849
- * 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.
1850
2011
  */
1851
- asset_group_id: string;
1852
- 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
+ }[];
1853
2031
  /**
1854
- * 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.
1855
2033
  */
1856
- 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
+ };
1857
2049
  /**
1858
- * 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.
1859
2051
  */
1860
- 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
+ };
1861
2062
  /**
1862
- * 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.
1863
2064
  */
1864
- max_count?: number;
1865
- asset_requirements?: AssetRequirements;
1866
- ext?: ExtensionObject;
1867
- }
2065
+ priority?: number;
2066
+ };
1868
2067
  /**
1869
- * 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.
1870
2069
  */
1871
- export interface ImageAssetRequirements {
1872
- /**
1873
- * Minimum width in pixels. For exact dimensions, set min_width = max_width.
1874
- */
1875
- min_width?: number;
1876
- /**
1877
- * Maximum width in pixels. For exact dimensions, set min_width = max_width.
1878
- */
1879
- max_width?: number;
1880
- /**
1881
- * Minimum height in pixels. For exact dimensions, set min_height = max_height.
1882
- */
1883
- min_height?: number;
1884
- /**
1885
- * Maximum height in pixels. For exact dimensions, set min_height = max_height.
1886
- */
1887
- max_height?: number;
1888
- /**
1889
- * Required aspect ratio (e.g., '16:9', '1:1', '1.91:1')
1890
- */
1891
- 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
+ } & {
1892
2077
  /**
1893
- * 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.
1894
2079
  */
1895
- formats?: ('jpg' | 'jpeg' | 'png' | 'gif' | 'webp' | 'svg' | 'avif')[];
2080
+ suppress?: Duration;
1896
2081
  /**
1897
- * 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).
1898
2083
  */
1899
- max_file_size_kb?: number;
2084
+ suppress_minutes?: number;
1900
2085
  /**
1901
- * 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.
1902
2087
  */
1903
- transparency_required?: boolean;
2088
+ max_impressions?: number;
1904
2089
  /**
1905
- * Whether animated images (GIF, animated WebP) are accepted
2090
+ * Entity granularity for impression counting. Required when max_impressions is set.
1906
2091
  */
1907
- animation_allowed?: boolean;
2092
+ per?: ReachUnit;
1908
2093
  /**
1909
- * 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.
1910
2095
  */
1911
- max_animation_duration_ms?: number;
1912
- }
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';
1913
2110
  /**
1914
- * Requirements for video creative assets. These define the technical constraints for video files.
2111
+ * IPTC-aligned classification of AI involvement in producing this content
1915
2112
  */
1916
- export interface VideoAssetRequirements {
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';
2114
+ /**
2115
+ * VAST (Video Ad Serving Template) tag for third-party video ad serving
2116
+ */
2117
+ export type VASTAsset = {
1917
2118
  /**
1918
- * Minimum width in pixels
2119
+ * Discriminator indicating VAST is delivered via URL endpoint
1919
2120
  */
1920
- min_width?: number;
2121
+ delivery_type: 'url';
1921
2122
  /**
1922
- * Maximum width in pixels
2123
+ * URL endpoint that returns VAST XML
1923
2124
  */
1924
- max_width?: number;
2125
+ url: string;
2126
+ vast_version?: VASTVersion;
1925
2127
  /**
1926
- * Minimum height in pixels
2128
+ * Whether VPAID (Video Player-Ad Interface Definition) is supported
1927
2129
  */
1928
- min_height?: number;
2130
+ vpaid_enabled?: boolean;
1929
2131
  /**
1930
- * Maximum height in pixels
2132
+ * Expected video duration in milliseconds (if known)
1931
2133
  */
1932
- max_height?: number;
2134
+ duration_ms?: number;
1933
2135
  /**
1934
- * Required aspect ratio (e.g., '16:9', '9:16')
2136
+ * Tracking events supported by this VAST tag
1935
2137
  */
1936
- aspect_ratio?: string;
2138
+ tracking_events?: VASTTrackingEvent[];
1937
2139
  /**
1938
- * Minimum duration in milliseconds
2140
+ * URL to captions file (WebVTT, SRT, etc.)
1939
2141
  */
1940
- min_duration_ms?: number;
2142
+ captions_url?: string;
1941
2143
  /**
1942
- * Maximum duration in milliseconds
2144
+ * URL to audio description track for visually impaired users
1943
2145
  */
1944
- max_duration_ms?: number;
2146
+ audio_description_url?: string;
2147
+ provenance?: Provenance;
2148
+ } | {
1945
2149
  /**
1946
- * Accepted video container formats
2150
+ * Discriminator indicating VAST is delivered as inline XML content
1947
2151
  */
1948
- containers?: ('mp4' | 'webm' | 'mov' | 'avi' | 'mkv')[];
2152
+ delivery_type: 'inline';
1949
2153
  /**
1950
- * Accepted video codecs
2154
+ * Inline VAST XML content
1951
2155
  */
1952
- codecs?: ('h264' | 'h265' | 'vp8' | 'vp9' | 'av1')[];
2156
+ content: string;
2157
+ vast_version?: VASTVersion;
1953
2158
  /**
1954
- * Maximum file size in kilobytes
2159
+ * Whether VPAID (Video Player-Ad Interface Definition) is supported
1955
2160
  */
1956
- max_file_size_kb?: number;
2161
+ vpaid_enabled?: boolean;
1957
2162
  /**
1958
- * Minimum video bitrate in kilobits per second
2163
+ * Expected video duration in milliseconds (if known)
1959
2164
  */
1960
- min_bitrate_kbps?: number;
2165
+ duration_ms?: number;
1961
2166
  /**
1962
- * Maximum video bitrate in kilobits per second
2167
+ * Tracking events supported by this VAST tag
1963
2168
  */
1964
- max_bitrate_kbps?: number;
2169
+ tracking_events?: VASTTrackingEvent[];
1965
2170
  /**
1966
- * Accepted frame rates in frames per second (e.g., [24, 30, 60])
2171
+ * URL to captions file (WebVTT, SRT, etc.)
1967
2172
  */
1968
- frame_rates?: number[];
2173
+ captions_url?: string;
1969
2174
  /**
1970
- * Whether the video must include an audio track
2175
+ * URL to audio description track for visually impaired users
1971
2176
  */
1972
- audio_required?: boolean;
1973
- }
2177
+ audio_description_url?: string;
2178
+ provenance?: Provenance;
2179
+ };
1974
2180
  /**
1975
- * Requirements for audio creative assets.
2181
+ * VAST specification version
1976
2182
  */
1977
- export interface AudioAssetRequirements {
1978
- /**
1979
- * Minimum duration in milliseconds
1980
- */
1981
- min_duration_ms?: number;
1982
- /**
1983
- * Maximum duration in milliseconds
1984
- */
1985
- max_duration_ms?: number;
1986
- /**
1987
- * Accepted audio file formats
1988
- */
1989
- formats?: ('mp3' | 'aac' | 'wav' | 'ogg' | 'flac')[];
1990
- /**
1991
- * Maximum file size in kilobytes
1992
- */
1993
- max_file_size_kb?: number;
1994
- /**
1995
- * Accepted sample rates in Hz (e.g., [44100, 48000])
1996
- */
1997
- sample_rates?: number[];
1998
- /**
1999
- * Accepted audio channel configurations
2000
- */
2001
- channels?: ('mono' | 'stereo')[];
2002
- /**
2003
- * Minimum audio bitrate in kilobits per second
2004
- */
2005
- min_bitrate_kbps?: number;
2006
- /**
2007
- * Maximum audio bitrate in kilobits per second
2008
- */
2009
- max_bitrate_kbps?: number;
2010
- }
2011
- /**
2012
- * Requirements for text creative assets such as headlines, body copy, and CTAs.
2013
- */
2014
- export interface TextAssetRequirements {
2015
- /**
2016
- * Minimum character length
2017
- */
2018
- min_length?: number;
2019
- /**
2020
- * Maximum character length
2021
- */
2022
- max_length?: number;
2023
- /**
2024
- * Minimum number of lines
2025
- */
2026
- min_lines?: number;
2027
- /**
2028
- * Maximum number of lines
2029
- */
2030
- max_lines?: number;
2031
- /**
2032
- * Regex pattern defining allowed characters (e.g., '^[a-zA-Z0-9 .,!?-]+$')
2033
- */
2034
- character_pattern?: string;
2035
- /**
2036
- * List of prohibited words or phrases
2037
- */
2038
- prohibited_terms?: string[];
2039
- }
2040
- /**
2041
- * Requirements for markdown creative assets.
2042
- */
2043
- export interface MarkdownAssetRequirements {
2044
- /**
2045
- * Maximum character length
2046
- */
2047
- max_length?: number;
2048
- }
2049
- /**
2050
- * Requirements for HTML creative assets. These define the execution environment constraints that the HTML must be compatible with.
2051
- */
2052
- export interface HTMLAssetRequirements {
2053
- /**
2054
- * Maximum file size in kilobytes for the HTML asset
2055
- */
2056
- max_file_size_kb?: number;
2057
- /**
2058
- * 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
2059
- */
2060
- sandbox?: 'none' | 'iframe' | 'safeframe' | 'fencedframe';
2061
- /**
2062
- * Whether the HTML creative can load external resources (scripts, images, fonts, etc.). When false, all resources must be inlined or bundled.
2063
- */
2064
- external_resources_allowed?: boolean;
2065
- /**
2066
- * List of domains the HTML creative may reference for external resources. Only applicable when external_resources_allowed is true.
2067
- */
2068
- allowed_external_domains?: string[];
2069
- }
2070
- /**
2071
- * Requirements for CSS creative assets.
2072
- */
2073
- export interface CSSAssetRequirements {
2074
- /**
2075
- * Maximum file size in kilobytes
2076
- */
2077
- max_file_size_kb?: number;
2078
- }
2079
- /**
2080
- * Requirements for JavaScript creative assets. These define the execution environment constraints that the JavaScript must be compatible with.
2081
- */
2082
- export interface JavaScriptAssetRequirements {
2083
- /**
2084
- * Maximum file size in kilobytes for the JavaScript asset
2085
- */
2086
- max_file_size_kb?: number;
2087
- /**
2088
- * Required JavaScript module format. 'script' = classic script, 'module' = ES modules, 'iife' = immediately invoked function expression
2089
- */
2090
- module_type?: 'script' | 'module' | 'iife';
2091
- /**
2092
- * Whether the JavaScript must use strict mode
2093
- */
2094
- strict_mode_required?: boolean;
2095
- /**
2096
- * Whether the JavaScript can load external resources dynamically
2097
- */
2098
- external_resources_allowed?: boolean;
2099
- /**
2100
- * List of domains the JavaScript may reference for external resources. Only applicable when external_resources_allowed is true.
2101
- */
2102
- allowed_external_domains?: string[];
2103
- }
2104
- /**
2105
- * Requirements for VAST (Video Ad Serving Template) creative assets.
2106
- */
2107
- export interface VASTAssetRequirements {
2108
- /**
2109
- * Required VAST version
2110
- */
2111
- vast_version?: '2.0' | '3.0' | '4.0' | '4.1' | '4.2';
2112
- }
2113
- /**
2114
- * Requirements for DAAST (Digital Audio Ad Serving Template) creative assets.
2115
- */
2116
- export interface DAASTAssetRequirements {
2117
- /**
2118
- * Required DAAST version. DAAST 1.0 is the current IAB standard.
2119
- */
2120
- daast_version?: '1.0';
2121
- }
2122
- /**
2123
- * Requirements for URL assets such as click-through URLs, tracking pixels, and landing pages.
2124
- */
2125
- export interface URLAssetRequirements {
2126
- /**
2127
- * 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.
2128
- */
2129
- role?: 'clickthrough' | 'landing_page' | 'impression_tracker' | 'click_tracker' | 'viewability_tracker' | 'third_party_tracker';
2130
- /**
2131
- * Allowed URL protocols. HTTPS is recommended for all ad URLs.
2132
- */
2133
- protocols?: ('https' | 'http')[];
2134
- /**
2135
- * List of allowed domains for the URL
2136
- */
2137
- allowed_domains?: string[];
2138
- /**
2139
- * Maximum URL length in characters
2140
- */
2141
- max_length?: number;
2142
- /**
2143
- * Whether the URL supports macro substitution (e.g., ${CACHEBUSTER})
2144
- */
2145
- macro_support?: boolean;
2146
- }
2147
- /**
2148
- * Requirements for webhook creative assets.
2149
- */
2150
- export interface WebhookAssetRequirements {
2151
- /**
2152
- * Allowed HTTP methods
2153
- */
2154
- methods?: ('GET' | 'POST')[];
2155
- }
2156
- /**
2157
- * Maps an individual format asset to a catalog item field via dot-notation path.
2158
- */
2159
- export interface ScalarBinding {
2160
- kind: 'scalar';
2161
- /**
2162
- * The asset_id from the format's assets array. Identifies which individual template slot this binding applies to.
2163
- */
2164
- asset_id: string;
2165
- /**
2166
- * Dot-notation path to the field on the catalog item (e.g., 'name', 'price.amount', 'location.city').
2167
- */
2168
- catalog_field: string;
2169
- ext?: ExtensionObject;
2170
- }
2171
- /**
2172
- * 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.
2173
- */
2174
- export interface AssetPoolBinding {
2175
- kind: 'asset_pool';
2176
- /**
2177
- * The asset_id from the format's assets array. Identifies which individual template slot this binding applies to.
2178
- */
2179
- asset_id: string;
2180
- /**
2181
- * The asset_group_id on the catalog item's assets array to pull from (e.g., 'images_landscape', 'images_vertical', 'logo').
2182
- */
2183
- asset_group_id: string;
2184
- ext?: ExtensionObject;
2185
- }
2186
- /**
2187
- * Budget pacing strategy
2188
- */
2189
- export type Pacing = 'even' | 'asap' | 'front_loaded';
2190
- /**
2191
- * 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.
2192
- */
2193
- export type OptimizationGoal = {
2194
- kind: 'metric';
2195
- /**
2196
- * 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). 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').
2197
- */
2198
- metric: 'clicks' | 'views' | 'completed_views' | 'viewed_seconds' | 'attention_seconds' | 'attention_score' | 'engagements' | 'follows' | 'saves' | 'profile_visits';
2199
- /**
2200
- * 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.
2201
- */
2202
- view_duration_seconds?: number;
2203
- /**
2204
- * Target for this metric. When omitted, the seller optimizes for maximum metric volume within budget.
2205
- */
2206
- target?: {
2207
- kind: 'cost_per';
2208
- /**
2209
- * Target cost per metric unit in the buy currency
2210
- */
2211
- value: number;
2212
- } | {
2213
- kind: 'threshold_rate';
2214
- /**
2215
- * Minimum per-impression value. Units depend on the metric: proportion (clicks, views, completed_views), seconds (viewed_seconds, attention_seconds), or score (attention_score).
2216
- */
2217
- value: number;
2218
- };
2219
- /**
2220
- * 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.
2221
- */
2222
- priority?: number;
2223
- } | {
2224
- kind: 'event';
2225
- /**
2226
- * 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.
2227
- */
2228
- event_sources: {
2229
- /**
2230
- * Event source to include (must be configured on this account via sync_event_sources)
2231
- */
2232
- event_source_id: string;
2233
- event_type: EventType;
2234
- /**
2235
- * Required when event_type is 'custom'. Platform-specific name for the custom event.
2236
- */
2237
- custom_event_name?: string;
2238
- /**
2239
- * 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.
2240
- */
2241
- value_field?: string;
2242
- /**
2243
- * 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.
2244
- */
2245
- value_factor?: number;
2246
- }[];
2247
- /**
2248
- * Target cost or return for this event goal. When omitted, the seller optimizes for maximum conversions within budget.
2249
- */
2250
- target?: {
2251
- kind: 'cost_per';
2252
- /**
2253
- * Target cost per event in the buy currency
2254
- */
2255
- value: number;
2256
- } | {
2257
- kind: 'per_ad_spend';
2258
- /**
2259
- * Target return ratio (e.g., 4.0 means $4 of value per $1 spent)
2260
- */
2261
- value: number;
2262
- } | {
2263
- kind: 'maximize_value';
2264
- };
2265
- /**
2266
- * 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.
2267
- */
2268
- attribution_window?: {
2269
- /**
2270
- * Click-through attribution window (e.g. '7d', '28d', '30d')
2271
- */
2272
- click_through: string;
2273
- /**
2274
- * View-through attribution window (e.g. '1d', '7d')
2275
- */
2276
- view_through?: string;
2277
- };
2278
- /**
2279
- * 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.
2280
- */
2281
- priority?: number;
2282
- };
2283
- /**
2284
- * Postal code system (e.g., 'us_zip', 'gb_outward'). System name encodes country and precision.
2285
- */
2286
- 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';
2183
+ export type VASTVersion = '2.0' | '3.0' | '4.0' | '4.1' | '4.2';
2287
2184
  /**
2288
- * Methods for verifying user age for compliance. Does not include 'inferred' as it is not accepted for regulatory compliance.
2185
+ * Standard VAST tracking events for video ad playback and interaction
2289
2186
  */
2290
- export type AgeVerificationMethod = 'facial_age_estimation' | 'id_document' | 'digital_id' | 'credit_card' | 'world_id';
2187
+ export type VASTTrackingEvent = 'start' | 'firstQuartile' | 'midpoint' | 'thirdQuartile' | 'complete' | 'impression' | 'click' | 'pause' | 'resume' | 'skip' | 'mute' | 'unmute' | 'fullscreen' | 'exitFullscreen' | 'playerExpand' | 'playerCollapse';
2291
2188
  /**
2292
- * Operating system platforms for device targeting. Browser values from Sec-CH-UA-Platform standard, extended for CTV.
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)
2293
2190
  */
2294
- export type DevicePlatform = 'ios' | 'android' | 'windows' | 'macos' | 'linux' | 'chromeos' | 'tvos' | 'tizen' | 'webos' | 'fire_os' | 'roku_os' | 'unknown';
2191
+ export type URLAssetType = 'clickthrough' | 'tracker_pixel' | 'tracker_script';
2295
2192
  /**
2296
2193
  * JavaScript module type
2297
2194
  */
2298
2195
  export type JavaScriptModuleType = 'esm' | 'commonjs' | 'script';
2299
2196
  /**
2300
- * VAST (Video Ad Serving Template) tag for third-party video ad serving
2197
+ * HTTP method
2301
2198
  */
2302
- export type VASTAsset = {
2303
- /**
2304
- * Discriminator indicating VAST is delivered via URL endpoint
2305
- */
2306
- delivery_type: 'url';
2307
- /**
2308
- * URL endpoint that returns VAST XML
2309
- */
2310
- url: string;
2311
- vast_version?: VASTVersion;
2312
- /**
2313
- * Whether VPAID (Video Player-Ad Interface Definition) is supported
2314
- */
2315
- vpaid_enabled?: boolean;
2316
- /**
2317
- * Expected video duration in milliseconds (if known)
2318
- */
2319
- duration_ms?: number;
2320
- /**
2321
- * Tracking events supported by this VAST tag
2322
- */
2323
- tracking_events?: VASTTrackingEvent[];
2324
- /**
2325
- * URL to captions file (WebVTT, SRT, etc.)
2326
- */
2327
- captions_url?: string;
2328
- /**
2329
- * URL to audio description track for visually impaired users
2330
- */
2331
- audio_description_url?: string;
2332
- } | {
2333
- /**
2334
- * Discriminator indicating VAST is delivered as inline XML content
2335
- */
2336
- delivery_type: 'inline';
2337
- /**
2338
- * Inline VAST XML content
2339
- */
2340
- content: string;
2341
- vast_version?: VASTVersion;
2342
- /**
2343
- * Whether VPAID (Video Player-Ad Interface Definition) is supported
2344
- */
2345
- vpaid_enabled?: boolean;
2346
- /**
2347
- * Expected video duration in milliseconds (if known)
2348
- */
2349
- duration_ms?: number;
2350
- /**
2351
- * Tracking events supported by this VAST tag
2352
- */
2353
- tracking_events?: VASTTrackingEvent[];
2354
- /**
2355
- * URL to captions file (WebVTT, SRT, etc.)
2356
- */
2357
- captions_url?: string;
2358
- /**
2359
- * URL to audio description track for visually impaired users
2360
- */
2361
- audio_description_url?: string;
2362
- };
2199
+ export type HTTPMethod = 'GET' | 'POST';
2363
2200
  /**
2364
- * VAST specification version
2201
+ * Expected content type of webhook response
2365
2202
  */
2366
- export type VASTVersion = '2.0' | '3.0' | '4.0' | '4.1' | '4.2';
2203
+ export type WebhookResponseType = 'html' | 'json' | 'xml' | 'javascript';
2367
2204
  /**
2368
- * Standard VAST tracking events for video ad playback and interaction
2205
+ * Authentication method
2369
2206
  */
2370
- 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';
2371
2208
  /**
2372
2209
  * DAAST (Digital Audio Ad Serving Template) tag for third-party audio ad serving
2373
2210
  */
@@ -2397,6 +2234,7 @@ export type DAASTAsset = {
2397
2234
  * URL to text transcript of the audio content
2398
2235
  */
2399
2236
  transcript_url?: string;
2237
+ provenance?: Provenance;
2400
2238
  } | {
2401
2239
  /**
2402
2240
  * Discriminator indicating DAAST is delivered as inline XML content
@@ -2423,6 +2261,7 @@ export type DAASTAsset = {
2423
2261
  * URL to text transcript of the audio content
2424
2262
  */
2425
2263
  transcript_url?: string;
2264
+ provenance?: Provenance;
2426
2265
  };
2427
2266
  /**
2428
2267
  * DAAST specification version
@@ -2433,9 +2272,17 @@ export type DAASTVersion = '1.0' | '1.1';
2433
2272
  */
2434
2273
  export type DAASTTrackingEvent = 'start' | 'firstQuartile' | 'midpoint' | 'thirdQuartile' | 'complete' | 'impression' | 'pause' | 'resume' | 'skip' | 'mute' | 'unmute';
2435
2274
  /**
2436
- * 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.
2437
2276
  */
2438
- 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;
2439
2286
  /**
2440
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).
2441
2288
  */
@@ -2453,7 +2300,7 @@ export type AuthenticationScheme = 'Bearer' | 'HMAC-SHA256';
2453
2300
  */
2454
2301
  export interface CreateMediaBuyRequest {
2455
2302
  /**
2456
- * 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.
2457
2304
  */
2458
2305
  buyer_ref: string;
2459
2306
  /**
@@ -2542,7 +2389,7 @@ export interface CreateMediaBuyRequest {
2542
2389
  */
2543
2390
  export interface PackageRequest {
2544
2391
  /**
2545
- * 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.
2546
2393
  */
2547
2394
  buyer_ref: string;
2548
2395
  /**
@@ -2574,7 +2421,10 @@ export interface PackageRequest {
2574
2421
  * Whether this package should be created in a paused state. Paused packages do not deliver impressions. Defaults to false.
2575
2422
  */
2576
2423
  paused?: boolean;
2577
- 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[];
2578
2428
  /**
2579
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+.
2580
2430
  */
@@ -2593,7 +2443,7 @@ export interface PackageRequest {
2593
2443
  ext?: ExtensionObject;
2594
2444
  }
2595
2445
  /**
2596
- * Optional restriction overlays for media buys. Most targeting should be expressed in the brief and handled by the publisher. These fields are for functional restrictions: geographic (RCT testing, regulatory compliance), age verification (alcohol, gambling), device platform (app compatibility), and language (localization).
2446
+ * Optional restriction overlays for media buys. Most targeting should be expressed in the brief and handled by the publisher. These fields are for functional restrictions: geographic (RCT testing, regulatory compliance, proximity targeting), age verification (alcohol, gambling), device platform (app compatibility), language (localization), and keyword targeting (search/retail media).
2597
2447
  */
2598
2448
  export interface TargetingOverlay {
2599
2449
  /**
@@ -2695,6 +2545,14 @@ export interface TargetingOverlay {
2695
2545
  * Restrict to specific platforms. Use for technical compatibility (app only works on iOS). Values from Sec-CH-UA-Platform standard, extended for CTV.
2696
2546
  */
2697
2547
  device_platform?: DevicePlatform[];
2548
+ /**
2549
+ * Restrict to specific device form factors. Use for campaigns targeting hardware categories rather than operating systems (e.g., mobile-only promotions, CTV campaigns).
2550
+ */
2551
+ device_type?: DeviceType[];
2552
+ /**
2553
+ * Exclude specific device form factors from delivery (e.g., exclude CTV for app-install campaigns).
2554
+ */
2555
+ device_type_exclude?: DeviceType[];
2698
2556
  /**
2699
2557
  * Target users within store catchment areas from a synced store catalog. Each entry references a store-type catalog and optionally narrows to specific stores or catchment zones.
2700
2558
  */
@@ -2712,19 +2570,46 @@ export interface TargetingOverlay {
2712
2570
  */
2713
2571
  catchment_ids?: string[];
2714
2572
  }[];
2573
+ /**
2574
+ * Target users within travel time, distance, or a custom boundary around arbitrary geographic points. Multiple entries use OR semantics — a user within range of any listed point is eligible. For campaigns targeting 10+ locations, consider using store_catchments with a location catalog instead. Seller must declare support in get_adcp_capabilities.
2575
+ */
2576
+ geo_proximity?: {
2577
+ [k: string]: unknown | undefined;
2578
+ }[];
2715
2579
  /**
2716
2580
  * Restrict to users with specific language preferences. ISO 639-1 codes (e.g., 'en', 'es', 'fr').
2717
2581
  */
2718
2582
  language?: string[];
2719
- }
2720
- /**
2721
- * Frequency capping settings for package-level application
2722
- */
2723
- export interface FrequencyCap {
2724
2583
  /**
2725
- * Minutes to suppress after impression
2584
+ * Keyword targeting for search and retail media platforms. Restricts delivery to queries matching the specified keywords. Each keyword is identified by the tuple (keyword, match_type) — the same keyword string with different match types are distinct targets. Sellers SHOULD reject duplicate (keyword, match_type) pairs within a single request. Seller must declare support in get_adcp_capabilities.
2585
+ */
2586
+ keyword_targets?: {
2587
+ /**
2588
+ * The keyword to target
2589
+ */
2590
+ keyword: string;
2591
+ /**
2592
+ * Match type: broad matches related queries, phrase matches queries containing the keyword phrase, exact matches the query exactly
2593
+ */
2594
+ match_type: 'broad' | 'phrase' | 'exact';
2595
+ /**
2596
+ * Per-keyword bid price, denominated in the same currency as the package's pricing option. Overrides the package-level bid_price for this keyword. Inherits the max_bid interpretation from the pricing option: when max_bid is true, this is the keyword's bid ceiling; when false, this is the exact bid. If omitted, the package bid_price applies.
2597
+ */
2598
+ bid_price?: number;
2599
+ }[];
2600
+ /**
2601
+ * Keywords to exclude from delivery. Queries matching these keywords will not trigger the ad. Each negative keyword is identified by the tuple (keyword, match_type). Seller must declare support in get_adcp_capabilities.
2726
2602
  */
2727
- suppress_minutes: number;
2603
+ negative_keywords?: {
2604
+ /**
2605
+ * The keyword to exclude
2606
+ */
2607
+ keyword: string;
2608
+ /**
2609
+ * Match type for exclusion
2610
+ */
2611
+ match_type: 'broad' | 'phrase' | 'exact';
2612
+ }[];
2728
2613
  }
2729
2614
  /**
2730
2615
  * Assignment of a creative asset to a package with optional placement targeting. Used in create_media_buy and update_media_buy requests. Note: sync_creatives does not support placement_ids - use create/update_media_buy for placement-level targeting.
@@ -2735,7 +2620,7 @@ export interface CreativeAssignment {
2735
2620
  */
2736
2621
  creative_id: string;
2737
2622
  /**
2738
- * 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).
2739
2624
  */
2740
2625
  weight?: number;
2741
2626
  /**
@@ -2757,18 +2642,14 @@ export interface CreativeAsset {
2757
2642
  name: string;
2758
2643
  format_id: FormatID;
2759
2644
  /**
2760
- * 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.
2761
- */
2762
- catalogs?: Catalog[];
2763
- /**
2764
- * Assets required by the format, keyed by asset_role
2645
+ * Assets required by the format, keyed by asset_id
2765
2646
  */
2766
2647
  assets: {
2767
2648
  /**
2768
2649
  * This interface was referenced by `undefined`'s JSON-Schema definition
2769
- * via the `patternProperty` "^[a-zA-Z0-9_-]+$".
2650
+ * via the `patternProperty` "^[a-z0-9_]+$".
2770
2651
  */
2771
- [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;
2772
2653
  };
2773
2654
  /**
2774
2655
  * Preview contexts for generative formats - defines what scenarios to generate previews for
@@ -2802,6 +2683,7 @@ export interface CreativeAsset {
2802
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.
2803
2684
  */
2804
2685
  placement_ids?: string[];
2686
+ provenance?: Provenance;
2805
2687
  }
2806
2688
  /**
2807
2689
  * Image asset with URL and dimensions
@@ -2827,6 +2709,116 @@ export interface ImageAsset {
2827
2709
  * Alternative text for accessibility
2828
2710
  */
2829
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;
2830
2822
  }
2831
2823
  /**
2832
2824
  * Video asset with URL and technical specifications including audio track properties
@@ -2948,6 +2940,7 @@ export interface VideoAsset {
2948
2940
  * URL to audio description track for visually impaired users
2949
2941
  */
2950
2942
  audio_description_url?: string;
2943
+ provenance?: Provenance;
2951
2944
  }
2952
2945
  /**
2953
2946
  * Audio asset with URL and technical specifications
@@ -3001,6 +2994,7 @@ export interface AudioAsset {
3001
2994
  * URL to text transcript of the audio content
3002
2995
  */
3003
2996
  transcript_url?: string;
2997
+ provenance?: Provenance;
3004
2998
  }
3005
2999
  /**
3006
3000
  * Text content asset
@@ -3014,6 +3008,22 @@ export interface TextAsset {
3014
3008
  * Language code (e.g., 'en', 'es', 'fr')
3015
3009
  */
3016
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;
3017
3027
  }
3018
3028
  /**
3019
3029
  * HTML content asset
@@ -3048,19 +3058,7 @@ export interface HTMLAsset {
3048
3058
  */
3049
3059
  screen_reader_tested?: boolean;
3050
3060
  };
3051
- }
3052
- /**
3053
- * CSS stylesheet asset
3054
- */
3055
- export interface CSSAsset {
3056
- /**
3057
- * CSS content
3058
- */
3059
- content: string;
3060
- /**
3061
- * CSS media query context (e.g., 'screen', 'print')
3062
- */
3063
- media?: string;
3061
+ provenance?: Provenance;
3064
3062
  }
3065
3063
  /**
3066
3064
  * JavaScript code asset
@@ -3092,18 +3090,177 @@ export interface JavaScriptAsset {
3092
3090
  */
3093
3091
  screen_reader_tested?: boolean;
3094
3092
  };
3093
+ provenance?: Provenance;
3095
3094
  }
3096
3095
  /**
3097
- * URL reference asset
3096
+ * Webhook for server-side dynamic content rendering (DCO)
3098
3097
  */
3099
- export interface URLAsset {
3098
+ export interface WebhookAsset {
3100
3099
  /**
3101
- * URL reference
3100
+ * Webhook URL to call for dynamic content
3102
3101
  */
3103
3102
  url: string;
3104
- url_type?: URLAssetType;
3103
+ method?: HTTPMethod;
3105
3104
  /**
3106
- * 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
3260
+ */
3261
+ role: 'style_reference' | 'product_shot' | 'mood_board' | 'example_creative' | 'logo' | 'strategy_doc';
3262
+ /**
3263
+ * Human-readable description of the asset and how it should inform creative generation
3107
3264
  */
3108
3265
  description?: string;
3109
3266
  }
@@ -3291,7 +3448,7 @@ export interface Package {
3291
3448
  */
3292
3449
  package_id: string;
3293
3450
  /**
3294
- * 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.
3295
3452
  */
3296
3453
  buyer_ref?: string;
3297
3454
  /**
@@ -3315,6 +3472,14 @@ export interface Package {
3315
3472
  * Impression goal for this package
3316
3473
  */
3317
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[];
3318
3483
  targeting_overlay?: TargetingOverlay;
3319
3484
  /**
3320
3485
  * Creative assets assigned to this package
@@ -3367,17 +3532,30 @@ export interface SyncCreativesRequest {
3367
3532
  */
3368
3533
  creative_ids?: string[];
3369
3534
  /**
3370
- * 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.
3371
3536
  */
3372
3537
  assignments?: {
3373
3538
  /**
3374
- * Array of package IDs to assign this creative to
3375
- *
3376
- * This interface was referenced by `undefined`'s JSON-Schema definition
3377
- * via the `patternProperty` "^[a-zA-Z0-9_-]+$".
3539
+ * ID of the creative to assign
3378
3540
  */
3379
- [k: string]: string[];
3380
- };
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).
3548
+ */
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;
3381
3559
  /**
3382
3560
  * When true, creatives not included in this sync will be archived. Use with caution for full library replacement.
3383
3561
  */
@@ -3455,7 +3633,7 @@ export interface SyncCreativesSuccess {
3455
3633
  * This interface was referenced by `undefined`'s JSON-Schema definition
3456
3634
  * via the `patternProperty` "^[a-zA-Z0-9_-]+$".
3457
3635
  */
3458
- [k: string]: string;
3636
+ [k: string]: string | undefined;
3459
3637
  };
3460
3638
  }[];
3461
3639
  /**
@@ -3678,18 +3856,14 @@ export interface ListCreativesResponse {
3678
3856
  */
3679
3857
  updated_date: string;
3680
3858
  /**
3681
- * Catalogs this creative renders, if any
3682
- */
3683
- catalogs?: Catalog[];
3684
- /**
3685
- * Assets for this creative, keyed by asset_role
3859
+ * Assets for this creative, keyed by asset_id
3686
3860
  */
3687
3861
  assets?: {
3688
3862
  /**
3689
3863
  * This interface was referenced by `undefined`'s JSON-Schema definition
3690
- * via the `patternProperty` "^[a-zA-Z0-9_-]+$".
3864
+ * via the `patternProperty` "^[a-z0-9_]+$".
3691
3865
  */
3692
- [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;
3693
3867
  };
3694
3868
  /**
3695
3869
  * User-defined tags for organization and searchability
@@ -3765,7 +3939,7 @@ export interface ListCreativesResponse {
3765
3939
  * This interface was referenced by `undefined`'s JSON-Schema definition
3766
3940
  * via the `patternProperty` "^[a-zA-Z0-9_-]+$".
3767
3941
  */
3768
- [k: string]: number;
3942
+ [k: string]: number | undefined;
3769
3943
  };
3770
3944
  /**
3771
3945
  * Breakdown of creatives by status
@@ -3826,6 +4000,10 @@ export type UpdateMediaBuyRequest = {
3826
4000
  packages?: PackageUpdate[];
3827
4001
  reporting_webhook?: ReportingWebhook;
3828
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;
3829
4007
  context?: ContextObject;
3830
4008
  ext?: ExtensionObject;
3831
4009
  } & {
@@ -3860,12 +4038,71 @@ export type PackageUpdate = {
3860
4038
  * Pause/resume specific package (true = paused, false = active)
3861
4039
  */
3862
4040
  paused?: boolean;
3863
- 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[];
3864
4045
  /**
3865
4046
  * Replace all optimization goals for this package. Uses replacement semantics — omit to leave goals unchanged.
3866
4047
  */
3867
4048
  optimization_goals?: OptimizationGoal[];
3868
4049
  targeting_overlay?: TargetingOverlay;
4050
+ /**
4051
+ * Keyword targets to add or update on this package. Upserts by (keyword, match_type) identity: if the pair already exists, its bid_price is updated; if not, a new keyword target is added. Use targeting_overlay.keyword_targets in create_media_buy to set the initial list.
4052
+ */
4053
+ keyword_targets_add?: {
4054
+ /**
4055
+ * The keyword to target
4056
+ */
4057
+ keyword: string;
4058
+ /**
4059
+ * Match type for this keyword
4060
+ */
4061
+ match_type: 'broad' | 'phrase' | 'exact';
4062
+ /**
4063
+ * Per-keyword bid price. Inherits currency and max_bid interpretation from the package's pricing option.
4064
+ */
4065
+ bid_price?: number;
4066
+ }[];
4067
+ /**
4068
+ * Keyword targets to remove from this package. Removes matching (keyword, match_type) pairs. If a specified pair is not present, sellers SHOULD treat it as a no-op for that entry.
4069
+ */
4070
+ keyword_targets_remove?: {
4071
+ /**
4072
+ * The keyword to stop targeting
4073
+ */
4074
+ keyword: string;
4075
+ /**
4076
+ * Match type to remove
4077
+ */
4078
+ match_type: 'broad' | 'phrase' | 'exact';
4079
+ }[];
4080
+ /**
4081
+ * Negative keywords to add to this package. Appends to the existing negative keyword list — does not replace it. If a keyword+match_type pair already exists, sellers SHOULD treat it as a no-op for that entry. Use targeting_overlay.negative_keywords in create_media_buy to set the initial list.
4082
+ */
4083
+ negative_keywords_add?: {
4084
+ /**
4085
+ * The keyword to exclude
4086
+ */
4087
+ keyword: string;
4088
+ /**
4089
+ * Match type for exclusion
4090
+ */
4091
+ match_type: 'broad' | 'phrase' | 'exact';
4092
+ }[];
4093
+ /**
4094
+ * Negative keywords to remove from this package. Removes matching keyword+match_type pairs from the existing list. If a specified pair is not present, sellers SHOULD treat it as a no-op for that entry.
4095
+ */
4096
+ negative_keywords_remove?: {
4097
+ /**
4098
+ * The keyword to stop excluding
4099
+ */
4100
+ keyword: string;
4101
+ /**
4102
+ * Match type to remove
4103
+ */
4104
+ match_type: 'broad' | 'phrase' | 'exact';
4105
+ }[];
3869
4106
  /**
3870
4107
  * Replace creative assignments for this package with optional weights and placement targeting. Uses replacement semantics - omit to leave assignments unchanged.
3871
4108
  */
@@ -3923,9 +4160,9 @@ export interface UpdateMediaBuyError {
3923
4160
  ext?: ExtensionObject;
3924
4161
  }
3925
4162
  /**
3926
- * Status of a media buy
4163
+ * Status of a media buy.
3927
4164
  */
3928
- export type MediaBuyStatus = 'pending_activation' | 'active' | 'paused' | 'completed';
4165
+ export type MediaBuyStatus = 'pending_activation' | 'active' | 'paused' | 'completed' | 'rejected' | 'canceled';
3929
4166
  /**
3930
4167
  * Request parameters for retrieving media buy status, creative approval state, and optional delivery snapshots
3931
4168
  */
@@ -3985,6 +4222,14 @@ export interface GetMediaBuysResponse {
3985
4222
  * Total budget amount across all packages, denominated in media_buy.currency
3986
4223
  */
3987
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;
3988
4233
  /**
3989
4234
  * ISO 8601 timestamp for creative upload deadline
3990
4235
  */
@@ -4117,6 +4362,14 @@ export interface GetMediaBuysResponse {
4117
4362
  context?: ContextObject;
4118
4363
  ext?: ExtensionObject;
4119
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';
4369
+ /**
4370
+ * Metric to sort breakdown rows by (descending). Falls back to 'spend' if the seller does not report the requested metric.
4371
+ */
4372
+ export type SortMetric = 'impressions' | 'spend' | 'clicks' | 'ctr' | 'views' | 'completed_views' | 'completion_rate' | 'conversions' | 'conversion_value' | 'roas' | 'cost_per_acquisition' | 'new_to_brand_rate' | 'leads' | 'grps' | 'reach' | 'frequency' | 'engagements' | 'follows' | 'saves' | 'profile_visits' | 'engagement_rate' | 'cost_per_click';
4120
4373
  /**
4121
4374
  * Request parameters for retrieving comprehensive delivery metrics
4122
4375
  */
@@ -4139,20 +4392,98 @@ export interface GetMediaBuyDeliveryRequest {
4139
4392
  */
4140
4393
  start_date?: string;
4141
4394
  /**
4142
- * End date for reporting period (YYYY-MM-DD). When omitted along with start_date, returns campaign lifetime data. Only accepted when the product's reporting_capabilities.date_range_support is 'date_range'.
4395
+ * End date for reporting period (YYYY-MM-DD). When omitted along with start_date, returns campaign lifetime data. Only accepted when the product's reporting_capabilities.date_range_support is 'date_range'.
4396
+ */
4397
+ end_date?: string;
4398
+ /**
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.
4143
4418
  */
4144
- end_date?: string;
4419
+ reporting_dimensions?: {
4420
+ /**
4421
+ * Request geographic breakdown. Check reporting_capabilities.supports_geo_breakdown for available levels and systems.
4422
+ */
4423
+ geo?: {
4424
+ geo_level: GeographicTargetingLevel;
4425
+ /**
4426
+ * Classification system for metro or postal_area levels (e.g., 'nielsen_dma', 'us_zip'). Required when geo_level is 'metro' or 'postal_area'.
4427
+ */
4428
+ system?: MetroAreaSystem | PostalCodeSystem;
4429
+ /**
4430
+ * Maximum number of geo entries to return. Defaults to 25. When truncated, by_geo_truncated is true in the response.
4431
+ */
4432
+ limit?: number;
4433
+ sort_by?: SortMetric;
4434
+ };
4435
+ /**
4436
+ * Request device type breakdown.
4437
+ */
4438
+ device_type?: {
4439
+ /**
4440
+ * Maximum number of entries to return. When omitted, all entries are returned (the enum is small and bounded).
4441
+ */
4442
+ limit?: number;
4443
+ sort_by?: SortMetric;
4444
+ };
4445
+ /**
4446
+ * Request device platform breakdown.
4447
+ */
4448
+ device_platform?: {
4449
+ /**
4450
+ * Maximum number of entries to return. When omitted, all entries are returned (the enum is small and bounded).
4451
+ */
4452
+ limit?: number;
4453
+ sort_by?: SortMetric;
4454
+ };
4455
+ /**
4456
+ * Request audience segment breakdown.
4457
+ */
4458
+ audience?: {
4459
+ /**
4460
+ * Maximum number of entries to return. Defaults to 25.
4461
+ */
4462
+ limit?: number;
4463
+ sort_by?: SortMetric;
4464
+ };
4465
+ /**
4466
+ * Request placement breakdown.
4467
+ */
4468
+ placement?: {
4469
+ /**
4470
+ * Maximum number of entries to return. Defaults to 25.
4471
+ */
4472
+ limit?: number;
4473
+ sort_by?: SortMetric;
4474
+ };
4475
+ };
4145
4476
  context?: ContextObject;
4146
4477
  ext?: ExtensionObject;
4147
4478
  }
4148
- /**
4149
- * Attribution model used to assign credit when multiple touchpoints exist
4150
- */
4151
- export type AttributionModel = 'last_touch' | 'first_touch' | 'linear' | 'time_decay' | 'data_driven';
4152
4479
  /**
4153
4480
  * Pricing model used for this media buy
4154
4481
  */
4155
4482
  export type PricingModel = 'cpm' | 'vcpm' | 'cpc' | 'cpcv' | 'cpv' | 'cpp' | 'cpa' | 'flat_rate' | 'time';
4483
+ /**
4484
+ * Origin of the audience segment (synced, platform, third_party, lookalike, retargeting, unknown)
4485
+ */
4486
+ export type AudienceSource = 'synced' | 'platform' | 'third_party' | 'lookalike' | 'retargeting' | 'unknown';
4156
4487
  /**
4157
4488
  * Response payload for get_media_buy_delivery task
4158
4489
  */
@@ -4257,9 +4588,9 @@ export interface GetMediaBuyDeliveryResponse {
4257
4588
  */
4258
4589
  buyer_campaign_ref?: string;
4259
4590
  /**
4260
- * 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.
4261
4592
  */
4262
- status: 'pending_activation' | 'pending' | 'active' | 'paused' | 'completed' | 'failed' | 'reporting_delayed';
4593
+ status: 'pending_activation' | 'pending' | 'active' | 'paused' | 'completed' | 'rejected' | 'canceled' | 'failed' | 'reporting_delayed';
4263
4594
  /**
4264
4595
  * When delayed data is expected to be available (only present when status is reporting_delayed)
4265
4596
  */
@@ -4331,6 +4662,129 @@ export interface GetMediaBuyDeliveryResponse {
4331
4662
  */
4332
4663
  weight?: number;
4333
4664
  })[];
4665
+ /**
4666
+ * Metrics broken down by keyword within this package. One row per (keyword, match_type) pair — the same keyword with different match types appears as separate rows. Keyword-grain only: rows reflect aggregate performance of each targeted keyword, not individual search queries. Rows may not sum to package totals when a single impression is attributed to the triggering keyword only. Available for search and retail media packages when the seller supports keyword-level reporting.
4667
+ */
4668
+ by_keyword?: (DeliveryMetrics & {
4669
+ /**
4670
+ * The targeted keyword
4671
+ */
4672
+ keyword: string;
4673
+ /**
4674
+ * Match type for this keyword
4675
+ */
4676
+ match_type: 'broad' | 'phrase' | 'exact';
4677
+ })[];
4678
+ /**
4679
+ * Delivery by geographic area within this package. Available when the buyer requests geo breakdown via reporting_dimensions and the seller supports it. Each dimension's rows are independent slices that should sum to the package total.
4680
+ */
4681
+ by_geo?: (DeliveryMetrics & {
4682
+ geo_level: GeographicTargetingLevel;
4683
+ /**
4684
+ * Classification system for metro or postal_area levels (e.g., 'nielsen_dma', 'us_zip'). Present when geo_level is 'metro' or 'postal_area'.
4685
+ */
4686
+ system?: string;
4687
+ /**
4688
+ * Geographic code within the level and system. Country: ISO 3166-1 alpha-2 ('US'). Region: ISO 3166-2 with country prefix ('US-CA'). Metro/postal: system-specific code ('501', '10001').
4689
+ */
4690
+ geo_code: string;
4691
+ /**
4692
+ * Human-readable geographic name (e.g., 'United States', 'California', 'New York DMA')
4693
+ */
4694
+ geo_name?: string;
4695
+ })[];
4696
+ /**
4697
+ * Whether by_geo was truncated due to the requested limit or a seller-imposed maximum. Sellers MUST return this flag whenever by_geo is present (false means the list is complete).
4698
+ */
4699
+ by_geo_truncated?: boolean;
4700
+ /**
4701
+ * Delivery by device form factor within this package. Available when the buyer requests device_type breakdown via reporting_dimensions and the seller supports it.
4702
+ */
4703
+ by_device_type?: (DeliveryMetrics & {
4704
+ device_type: DeviceType;
4705
+ })[];
4706
+ /**
4707
+ * Whether by_device_type was truncated. Sellers MUST return this flag whenever by_device_type is present (false means the list is complete).
4708
+ */
4709
+ by_device_type_truncated?: boolean;
4710
+ /**
4711
+ * Delivery by operating system within this package. Available when the buyer requests device_platform breakdown via reporting_dimensions and the seller supports it. Useful for CTV campaigns where tvOS vs Roku OS vs Fire OS matters.
4712
+ */
4713
+ by_device_platform?: (DeliveryMetrics & {
4714
+ device_platform: DevicePlatform;
4715
+ })[];
4716
+ /**
4717
+ * Whether by_device_platform was truncated. Sellers MUST return this flag whenever by_device_platform is present (false means the list is complete).
4718
+ */
4719
+ by_device_platform_truncated?: boolean;
4720
+ /**
4721
+ * Delivery by audience segment within this package. Available when the buyer requests audience breakdown via reporting_dimensions and the seller supports it. Only 'synced' audiences are directly targetable via the targeting overlay; other sources are informational.
4722
+ */
4723
+ by_audience?: (DeliveryMetrics & {
4724
+ /**
4725
+ * Audience segment identifier. For 'synced' source, matches audience_id from sync_audiences. For other sources, seller-defined.
4726
+ */
4727
+ audience_id: string;
4728
+ audience_source: AudienceSource;
4729
+ /**
4730
+ * Human-readable audience segment name
4731
+ */
4732
+ audience_name?: string;
4733
+ })[];
4734
+ /**
4735
+ * Whether by_audience was truncated. Sellers MUST return this flag whenever by_audience is present (false means the list is complete).
4736
+ */
4737
+ by_audience_truncated?: boolean;
4738
+ /**
4739
+ * Delivery by placement within this package. Available when the buyer requests placement breakdown via reporting_dimensions and the seller supports it. Placement IDs reference the product's placements array.
4740
+ */
4741
+ by_placement?: (DeliveryMetrics & {
4742
+ /**
4743
+ * Placement identifier from the product's placements array
4744
+ */
4745
+ placement_id: string;
4746
+ /**
4747
+ * Human-readable placement name
4748
+ */
4749
+ placement_name?: string;
4750
+ })[];
4751
+ /**
4752
+ * Whether by_placement was truncated. Sellers MUST return this flag whenever by_placement is present (false means the list is complete).
4753
+ */
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
+ }[];
4334
4788
  })[];
4335
4789
  /**
4336
4790
  * Day-by-day delivery
@@ -4382,13 +4836,13 @@ export interface GetMediaBuyDeliveryResponse {
4382
4836
  */
4383
4837
  export interface AttributionWindow {
4384
4838
  /**
4385
- * 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.
4386
4840
  */
4387
- click_window_days?: number;
4841
+ post_click?: Duration;
4388
4842
  /**
4389
- * 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.
4390
4844
  */
4391
- view_window_days?: number;
4845
+ post_view?: Duration;
4392
4846
  model: AttributionModel;
4393
4847
  }
4394
4848
  /**
@@ -4628,19 +5082,7 @@ export type ProvidePerformanceFeedbackRequest = {
4628
5082
  * Buyer's reference for the media buy
4629
5083
  */
4630
5084
  buyer_ref?: string;
4631
- /**
4632
- * Time period for performance measurement
4633
- */
4634
- measurement_period?: {
4635
- /**
4636
- * ISO 8601 start timestamp for measurement period
4637
- */
4638
- start: string;
4639
- /**
4640
- * ISO 8601 end timestamp for measurement period
4641
- */
4642
- end: string;
4643
- };
5085
+ measurement_period?: DatetimeRange;
4644
5086
  /**
4645
5087
  * Normalized performance score (0.0 = no value, 1.0 = expected, >1.0 = above expected)
4646
5088
  */
@@ -4668,6 +5110,19 @@ export type MetricType = 'overall_performance' | 'conversion_rate' | 'brand_lift
4668
5110
  * Source of the performance data
4669
5111
  */
4670
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
+ }
4671
5126
  /**
4672
5127
  * Response payload for provide_performance_feedback task. Returns either success confirmation OR error information, never both.
4673
5128
  */
@@ -4853,7 +5308,7 @@ export type UserMatch = {
4853
5308
  /**
4854
5309
  * Universal ID type
4855
5310
  */
4856
- export type UIDType = 'rampid' | 'id5' | 'uid2' | 'euid' | 'pairid' | 'external_id' | 'maid' | 'other';
5311
+ export type UIDType = 'rampid' | 'id5' | 'uid2' | 'euid' | 'pairid' | 'maid' | 'other';
4857
5312
  /**
4858
5313
  * Request parameters for logging marketing events
4859
5314
  */
@@ -5024,11 +5479,15 @@ export interface LogEventError {
5024
5479
  ext?: ExtensionObject;
5025
5480
  }
5026
5481
  /**
5027
- * Hashed identifiers for a CRM audience member. All identifiers must be normalized before hashing: emails to lowercase+trim, phone numbers to E.164 format (e.g. +12065551234). At least one identifier is required. Providing multiple identifiers for the same person improves match rates. Composite identifiers (e.g. hashed first name + last name + zip for Google Customer Match) are not yet standardized — use the ext field for platform-specific extensions.
5482
+ * A CRM audience member identified by a buyer-assigned external_id and at least one matchable identifier. All identifiers must be normalized before hashing: emails to lowercase+trim, phone numbers to E.164 format (e.g. +12065551234). Providing multiple identifiers for the same person improves match rates. Composite identifiers (e.g. hashed first name + last name + zip for Google Customer Match) are not yet standardized — use the ext field for platform-specific extensions.
5028
5483
  */
5029
5484
  export type AudienceMember = {
5030
5485
  [k: string]: unknown | undefined;
5031
5486
  } & {
5487
+ /**
5488
+ * Buyer-assigned stable identifier for this audience member (e.g. CRM record ID, loyalty ID). Used for deduplication, removal, and cross-referencing with buyer systems. Adapters for CDPs that don't natively assign IDs can derive one (e.g. hash of the member's identifiers).
5489
+ */
5490
+ external_id: string;
5032
5491
  /**
5033
5492
  * SHA-256 hash of lowercase, trimmed email address.
5034
5493
  */
@@ -5049,6 +5508,10 @@ export type AudienceMember = {
5049
5508
  }[];
5050
5509
  ext?: ExtensionObject;
5051
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';
5052
5515
  /**
5053
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.
5054
5517
  */
@@ -5066,6 +5529,18 @@ export interface SyncAudiencesRequest {
5066
5529
  * Human-readable name for this audience
5067
5530
  */
5068
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[];
5069
5544
  /**
5070
5545
  * Members to add to this audience. Hashed before sending — normalize emails to lowercase+trim, phones to E.164.
5071
5546
  */
@@ -5078,10 +5553,7 @@ export interface SyncAudiencesRequest {
5078
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.
5079
5554
  */
5080
5555
  delete?: boolean;
5081
- /**
5082
- * 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.
5083
- */
5084
- consent_basis?: 'consent' | 'legitimate_interest' | 'contract' | 'legal_obligation';
5556
+ consent_basis?: ConsentBasis;
5085
5557
  }[];
5086
5558
  /**
5087
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.
@@ -5126,6 +5598,10 @@ export interface SyncAudiencesSuccess {
5126
5598
  * Number of members submitted in this sync operation (delta, not cumulative). In discovery-only calls (no audiences array), this is 0.
5127
5599
  */
5128
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;
5129
5605
  /**
5130
5606
  * Total members matched to platform users across all syncs (cumulative, not just this call). Populated when status is 'ready'.
5131
5607
  */
@@ -5293,163 +5769,39 @@ export interface SyncCatalogsError {
5293
5769
  context?: ContextObject;
5294
5770
  ext?: ExtensionObject;
5295
5771
  }
5296
- /**
5297
- * HTTP method
5298
- */
5299
- export type HTTPMethod = 'GET' | 'POST';
5300
- /**
5301
- * Expected content type of webhook response
5302
- */
5303
- export type WebhookResponseType = 'html' | 'json' | 'xml' | 'javascript';
5304
- /**
5305
- * Authentication method
5306
- */
5307
- export type WebhookSecurityMethod = 'hmac_sha256' | 'api_key' | 'none';
5308
- /**
5309
- * 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.
5310
- */
5311
- export type CreativeBriefReference = CreativeBrief | string;
5312
5772
  /**
5313
5773
  * 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.
5314
5774
  */
5315
5775
  export interface BuildCreativeRequest {
5316
5776
  /**
5317
- * 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.
5777
+ * 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.
5318
5778
  */
5319
5779
  message?: string;
5320
5780
  creative_manifest?: CreativeManifest;
5321
5781
  target_format_id: FormatID;
5322
5782
  brand?: BrandReference;
5323
- creative_brief?: CreativeBriefReference;
5324
5783
  context?: ContextObject;
5325
5784
  ext?: ExtensionObject;
5326
5785
  }
5327
5786
  /**
5328
5787
  * 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.
5329
5788
  */
5330
- export interface CreativeManifest {
5331
- format_id: FormatID;
5332
- /**
5333
- * 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.
5334
- */
5335
- catalogs?: Catalog[];
5336
- /**
5337
- * 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.
5338
- *
5339
- * 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.
5340
- */
5341
- assets: {
5342
- /**
5343
- * This interface was referenced by `undefined`'s JSON-Schema definition
5344
- * via the `patternProperty` "^[a-z0-9_]+$".
5345
- */
5346
- [k: string]: ImageAsset | VideoAsset | AudioAsset | VASTAsset | TextAsset | URLAsset | HTMLAsset | JavaScriptAsset | WebhookAsset | CSSAsset | DAASTAsset;
5347
- };
5348
- ext?: ExtensionObject;
5349
- }
5350
- /**
5351
- * Webhook for server-side dynamic content rendering (DCO)
5352
- */
5353
- export interface WebhookAsset {
5354
- /**
5355
- * Webhook URL to call for dynamic content
5356
- */
5357
- url: string;
5358
- method?: HTTPMethod;
5359
- /**
5360
- * Maximum time to wait for response in milliseconds
5361
- */
5362
- timeout_ms?: number;
5363
- /**
5364
- * Universal macros that can be passed to webhook (e.g., DEVICE_TYPE, COUNTRY). See docs/creative/universal-macros.mdx for full list.
5365
- */
5366
- supported_macros?: (UniversalMacro | string)[];
5367
- /**
5368
- * Universal macros that must be provided for webhook to function
5369
- */
5370
- required_macros?: (UniversalMacro | string)[];
5371
- response_type: WebhookResponseType;
5372
- /**
5373
- * Security configuration for webhook calls
5374
- */
5375
- security: {
5376
- method: WebhookSecurityMethod;
5377
- /**
5378
- * Header name for HMAC signature (e.g., 'X-Signature')
5379
- */
5380
- hmac_header?: string;
5381
- /**
5382
- * Header name for API key (e.g., 'X-API-Key')
5383
- */
5384
- api_key_header?: string;
5385
- };
5386
- }
5387
- /**
5388
- * Inline creative brief object
5389
- */
5390
- export interface CreativeBrief {
5391
- /**
5392
- * Campaign or flight name for identification
5393
- */
5394
- name: string;
5395
- /**
5396
- * Campaign objective that guides creative tone and call-to-action strategy
5397
- */
5398
- objective?: 'awareness' | 'consideration' | 'conversion' | 'retention' | 'engagement';
5399
- /**
5400
- * Desired tone for this campaign, modulating the brand's base tone (e.g., 'playful and festive', 'premium and aspirational')
5401
- */
5402
- tone?: string;
5403
- /**
5404
- * Target audience description for this campaign
5405
- */
5406
- audience?: string;
5407
- /**
5408
- * Creative territory or positioning the campaign should occupy
5409
- */
5410
- territory?: string;
5411
- /**
5412
- * Messaging framework for the campaign
5413
- */
5414
- messaging?: {
5415
- /**
5416
- * Primary headline
5417
- */
5418
- headline?: string;
5419
- /**
5420
- * Supporting tagline or sub-headline
5421
- */
5422
- tagline?: string;
5423
- /**
5424
- * Call-to-action text
5425
- */
5426
- cta?: string;
5427
- /**
5428
- * Key messages to communicate in priority order
5429
- */
5430
- key_messages?: string[];
5431
- };
5432
- /**
5433
- * Visual and strategic reference materials such as mood boards, product shots, example creatives, and strategy documents
5434
- */
5435
- reference_assets?: ReferenceAsset[];
5436
- }
5437
- /**
5438
- * 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.
5439
- */
5440
- export interface ReferenceAsset {
5441
- /**
5442
- * URL to the reference asset (image, video, or document)
5443
- */
5444
- url: string;
5445
- /**
5446
- * 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
5447
- */
5448
- role: 'style_reference' | 'product_shot' | 'mood_board' | 'example_creative' | 'logo' | 'strategy_doc';
5789
+ export interface CreativeManifest {
5790
+ format_id: FormatID;
5449
5791
  /**
5450
- * Human-readable description of the asset and how it should inform creative generation
5792
+ * 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.
5793
+ *
5794
+ * 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.
5451
5795
  */
5452
- description?: string;
5796
+ assets: {
5797
+ /**
5798
+ * This interface was referenced by `undefined`'s JSON-Schema definition
5799
+ * via the `patternProperty` "^[a-z0-9_]+$".
5800
+ */
5801
+ [k: string]: ImageAsset | VideoAsset | AudioAsset | VASTAsset | TextAsset | URLAsset | HTMLAsset | JavaScriptAsset | WebhookAsset | CSSAsset | DAASTAsset | MarkdownAsset | BriefAsset | CatalogAsset;
5802
+ };
5803
+ provenance?: Provenance;
5804
+ ext?: ExtensionObject;
5453
5805
  }
5454
5806
  /**
5455
5807
  * 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.
@@ -5577,14 +5929,10 @@ export type PreviewCreativeRequest = {
5577
5929
  */
5578
5930
  export type PreviewOutputFormat = 'url' | 'html';
5579
5931
  /**
5580
- * Complete creative manifest with all required assets
5932
+ * Complete creative manifest with all required assets.
5581
5933
  */
5582
5934
  export interface CreativeManifest1 {
5583
5935
  format_id: FormatID;
5584
- /**
5585
- * 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.
5586
- */
5587
- catalogs?: Catalog[];
5588
5936
  /**
5589
5937
  * 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.
5590
5938
  *
@@ -5595,8 +5943,9 @@ export interface CreativeManifest1 {
5595
5943
  * This interface was referenced by `undefined`'s JSON-Schema definition
5596
5944
  * via the `patternProperty` "^[a-z0-9_]+$".
5597
5945
  */
5598
- [k: string]: ImageAsset | VideoAsset | AudioAsset | VASTAsset | TextAsset | URLAsset | HTMLAsset | JavaScriptAsset | WebhookAsset | CSSAsset | DAASTAsset;
5946
+ [k: string]: ImageAsset | VideoAsset | AudioAsset | VASTAsset | TextAsset | URLAsset | HTMLAsset | JavaScriptAsset | WebhookAsset | CSSAsset | DAASTAsset | MarkdownAsset | BriefAsset | CatalogAsset;
5599
5947
  };
5948
+ provenance?: Provenance;
5600
5949
  ext?: ExtensionObject;
5601
5950
  }
5602
5951
  /**
@@ -5813,9 +6162,15 @@ export interface PreviewCreativeBatchResponse {
5813
6162
  ext?: ExtensionObject;
5814
6163
  }
5815
6164
  export interface PreviewBatchResultSuccess {
6165
+ /**
6166
+ * Indicates this preview request succeeded
6167
+ */
5816
6168
  success?: true;
5817
6169
  }
5818
6170
  export interface PreviewBatchResultError {
6171
+ /**
6172
+ * Indicates this preview request failed
6173
+ */
5819
6174
  success?: false;
5820
6175
  }
5821
6176
  /**
@@ -5886,19 +6241,7 @@ export type GetCreativeDeliveryRequest = {
5886
6241
  * 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.
5887
6242
  */
5888
6243
  max_variants?: number;
5889
- /**
5890
- * Pagination parameters for the creatives array in the response. When omitted, the agent returns all matching creatives.
5891
- */
5892
- pagination?: {
5893
- /**
5894
- * Maximum number of creatives to return
5895
- */
5896
- limit?: number;
5897
- /**
5898
- * Number of creatives to skip
5899
- */
5900
- offset?: number;
5901
- };
6244
+ pagination?: PaginationRequest;
5902
6245
  context?: ContextObject;
5903
6246
  ext?: ExtensionObject;
5904
6247
  };
@@ -6035,32 +6378,32 @@ export interface Identifier {
6035
6378
  value: string;
6036
6379
  }
6037
6380
  /**
6038
- * 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).
6381
+ * 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).
6039
6382
  */
6040
6383
  export type GetSignalsRequest = {
6041
6384
  [k: string]: unknown | undefined;
6042
6385
  } & {
6386
+ account?: AccountReference;
6387
+ /**
6388
+ * The buyer's campaign reference. Used to correlate signal discovery with subsequent report_usage calls.
6389
+ */
6390
+ buyer_campaign_ref?: string;
6043
6391
  /**
6044
6392
  * Natural language description of the desired signals. When used alone, enables semantic discovery. When combined with signal_ids, provides context for the agent but signal_ids matches are returned first.
6045
6393
  */
6046
6394
  signal_spec?: string;
6047
6395
  /**
6048
- * 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.
6396
+ * 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.
6049
6397
  */
6050
6398
  signal_ids?: SignalID[];
6051
6399
  /**
6052
- * Deployment targets where signals need to be activated
6400
+ * Filter signals to those activatable on specific agents/platforms. When omitted, returns all signals available on the current agent. If the authenticated caller matches one of these destinations, activation keys will be included in the response.
6053
6401
  */
6054
- deliver_to: {
6055
- /**
6056
- * List of deployment targets (DSPs, sales agents, etc.). If the authenticated caller matches one of these deployment targets, activation keys will be included in the response.
6057
- */
6058
- deployments: Destination[];
6059
- /**
6060
- * Countries where signals will be used (ISO codes)
6061
- */
6062
- countries: string[];
6063
- };
6402
+ destinations?: Destination[];
6403
+ /**
6404
+ * Countries where signals will be used (ISO 3166-1 alpha-2 codes). When omitted, no geographic filter is applied.
6405
+ */
6406
+ countries?: string[];
6064
6407
  filters?: SignalFilters;
6065
6408
  /**
6066
6409
  * Maximum number of results to return
@@ -6117,9 +6460,13 @@ export interface SignalFilters {
6117
6460
  */
6118
6461
  data_providers?: string[];
6119
6462
  /**
6120
- * Maximum CPM price filter
6463
+ * Maximum CPM filter. Applies only to signals with model='cpm'.
6121
6464
  */
6122
6465
  max_cpm?: number;
6466
+ /**
6467
+ * Maximum percent-of-media rate filter. Signals where all percent_of_media pricing options exceed this value are excluded. Does not account for max_cpm caps.
6468
+ */
6469
+ max_percent?: number;
6123
6470
  /**
6124
6471
  * Minimum coverage requirement
6125
6472
  */
@@ -6211,6 +6558,19 @@ export type ActivationKey = {
6211
6558
  */
6212
6559
  value: string;
6213
6560
  };
6561
+ /**
6562
+ * A pricing option offered by a signals agent. Combines pricing_option_id with the signal pricing model fields at the same level — pass pricing_option_id in report_usage for billing verification.
6563
+ */
6564
+ export type SignalPricingOption = {
6565
+ /**
6566
+ * Opaque identifier for this pricing option, unique within the signals agent. Pass this in report_usage to identify which pricing option was applied.
6567
+ */
6568
+ pricing_option_id: string;
6569
+ } & SignalPricing;
6570
+ /**
6571
+ * Pricing model for a signal. Discriminated by model: 'cpm' (fixed CPM), 'percent_of_media' (percentage of spend with optional CPM cap), or 'flat_fee' (fixed charge per reporting period, e.g. monthly licensed segments).
6572
+ */
6573
+ export type SignalPricing = CpmPricing | PercentOfMediaPricing | FlatFeePricing;
6214
6574
  /**
6215
6575
  * Response payload for get_signals task
6216
6576
  */
@@ -6233,6 +6593,23 @@ export interface GetSignalsResponse {
6233
6593
  */
6234
6594
  description: string;
6235
6595
  value_type?: SignalValueType;
6596
+ /**
6597
+ * Valid values for categorical signals. Present when value_type is 'categorical'. Buyers must use one of these values in SignalTargeting.values.
6598
+ */
6599
+ categories?: string[];
6600
+ /**
6601
+ * Valid range for numeric signals. Present when value_type is 'numeric'.
6602
+ */
6603
+ range?: {
6604
+ /**
6605
+ * Minimum value (inclusive)
6606
+ */
6607
+ min: number;
6608
+ /**
6609
+ * Maximum value (inclusive)
6610
+ */
6611
+ max: number;
6612
+ };
6236
6613
  signal_type: SignalCatalogType;
6237
6614
  /**
6238
6615
  * Human-readable name of the data provider
@@ -6249,7 +6626,7 @@ export interface GetSignalsResponse {
6249
6626
  /**
6250
6627
  * Pricing options available for this signal. The buyer selects one and passes its pricing_option_id in report_usage for billing verification.
6251
6628
  */
6252
- pricing_options: PricingOption[];
6629
+ pricing_options: SignalPricingOption[];
6253
6630
  }[];
6254
6631
  /**
6255
6632
  * Task-specific errors and warnings (e.g., signal discovery or pricing issues)
@@ -6264,21 +6641,83 @@ export interface GetSignalsResponse {
6264
6641
  ext?: ExtensionObject;
6265
6642
  }
6266
6643
  /**
6267
- * Request parameters for activating a signal on a specific deployment target
6644
+ * Fixed cost per thousand impressions
6645
+ */
6646
+ export interface CpmPricing {
6647
+ model: 'cpm';
6648
+ /**
6649
+ * Cost per thousand impressions
6650
+ */
6651
+ cpm: number;
6652
+ /**
6653
+ * ISO 4217 currency code
6654
+ */
6655
+ currency: string;
6656
+ ext?: ExtensionObject;
6657
+ }
6658
+ /**
6659
+ * Percentage of media spend charged for this signal. When max_cpm is set, the effective rate is capped at that CPM — useful for platforms like The Trade Desk that use percent-of-media pricing with a CPM ceiling.
6660
+ */
6661
+ export interface PercentOfMediaPricing {
6662
+ model: 'percent_of_media';
6663
+ /**
6664
+ * Percentage of media spend, e.g. 15 = 15%
6665
+ */
6666
+ percent: number;
6667
+ /**
6668
+ * Optional CPM cap. When set, the effective charge is min(percent × media_spend_per_mille, max_cpm).
6669
+ */
6670
+ max_cpm?: number;
6671
+ /**
6672
+ * ISO 4217 currency code for the resulting charge
6673
+ */
6674
+ currency: string;
6675
+ ext?: ExtensionObject;
6676
+ }
6677
+ /**
6678
+ * Fixed charge per billing period, regardless of impressions or spend. Used for licensed data bundles and audience subscriptions.
6679
+ */
6680
+ export interface FlatFeePricing {
6681
+ model: 'flat_fee';
6682
+ /**
6683
+ * Fixed charge for the billing period
6684
+ */
6685
+ amount: number;
6686
+ /**
6687
+ * Billing period for the flat fee.
6688
+ */
6689
+ period: 'monthly' | 'quarterly' | 'annual' | 'campaign';
6690
+ /**
6691
+ * ISO 4217 currency code
6692
+ */
6693
+ currency: string;
6694
+ ext?: ExtensionObject;
6695
+ }
6696
+ /**
6697
+ * Request parameters for activating or deactivating a signal on deployment targets
6268
6698
  */
6269
6699
  export interface ActivateSignalRequest {
6700
+ /**
6701
+ * 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.
6702
+ */
6703
+ action?: 'activate' | 'deactivate';
6270
6704
  /**
6271
6705
  * The universal identifier for the signal to activate
6272
6706
  */
6273
6707
  signal_agent_segment_id: string;
6274
6708
  /**
6275
- * Target deployment(s) for activation. If the authenticated caller matches one of these deployment targets, activation keys will be included in the response.
6709
+ * Target destination(s) for activation. If the authenticated caller matches one of these destinations, activation keys will be included in the response.
6276
6710
  */
6277
- deployments: Destination[];
6711
+ destinations: Destination[];
6278
6712
  /**
6279
- * 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 and is referenced in subsequent report_usage calls.
6713
+ * 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.
6280
6714
  */
6281
6715
  pricing_option_id?: string;
6716
+ account?: AccountReference;
6717
+ /**
6718
+ * The buyer's campaign reference for this activation. Enables the signals agent to correlate activations with subsequent report_usage calls.
6719
+ */
6720
+ buyer_campaign_ref?: string;
6282
6721
  context?: ContextObject;
6283
6722
  ext?: ExtensionObject;
6284
6723
  }
@@ -6393,13 +6832,13 @@ export interface DirectIdentifiersSource {
6393
6832
  */
6394
6833
  export interface PropertyListFilters {
6395
6834
  /**
6396
- * Property must have feature data for ALL listed countries (ISO codes). Required.
6835
+ * Property must have feature data for ALL listed countries (ISO codes). When omitted, no country restriction is applied.
6397
6836
  */
6398
- countries_all: string[];
6837
+ countries_all?: string[];
6399
6838
  /**
6400
- * Property must support ANY of the listed channels. Required.
6839
+ * Property must support ANY of the listed channels. When omitted, no channel restriction is applied.
6401
6840
  */
6402
- channels_any: MediaChannel[];
6841
+ channels_any?: MediaChannel[];
6403
6842
  /**
6404
6843
  * Filter to these property types
6405
6844
  */
@@ -6666,23 +7105,11 @@ export type ListContentStandardsResponse = {
6666
7105
  * Array of content standards configurations matching the filter criteria
6667
7106
  */
6668
7107
  standards: ContentStandards[];
6669
- /**
6670
- * Field must not be present in success response
6671
- */
6672
- errors?: {
6673
- [k: string]: unknown | undefined;
6674
- };
6675
7108
  pagination?: PaginationResponse;
6676
7109
  context?: ContextObject;
6677
7110
  ext?: ExtensionObject;
6678
7111
  } | {
6679
7112
  errors: Error[];
6680
- /**
6681
- * Field must not be present in error response
6682
- */
6683
- standards?: {
6684
- [k: string]: unknown | undefined;
6685
- };
6686
7113
  context?: ContextObject;
6687
7114
  ext?: ExtensionObject;
6688
7115
  };
@@ -6802,6 +7229,7 @@ export interface Artifact {
6802
7229
  * Heading level (1-6), only for role=heading
6803
7230
  */
6804
7231
  heading_level?: number;
7232
+ provenance?: Provenance;
6805
7233
  } | {
6806
7234
  type: 'image';
6807
7235
  /**
@@ -6825,6 +7253,7 @@ export interface Artifact {
6825
7253
  * Image height in pixels
6826
7254
  */
6827
7255
  height?: number;
7256
+ provenance?: Provenance;
6828
7257
  } | {
6829
7258
  type: 'video';
6830
7259
  /**
@@ -6848,6 +7277,7 @@ export interface Artifact {
6848
7277
  * Video thumbnail URL
6849
7278
  */
6850
7279
  thumbnail_url?: string;
7280
+ provenance?: Provenance;
6851
7281
  } | {
6852
7282
  type: 'audio';
6853
7283
  /**
@@ -6867,6 +7297,7 @@ export interface Artifact {
6867
7297
  * How the transcript was generated
6868
7298
  */
6869
7299
  transcript_source?: 'original_script' | 'closed_captions' | 'generated';
7300
+ provenance?: Provenance;
6870
7301
  })[];
6871
7302
  /**
6872
7303
  * Rich metadata extracted from the artifact
@@ -6897,6 +7328,7 @@ export interface Artifact {
6897
7328
  */
6898
7329
  json_ld?: {}[];
6899
7330
  };
7331
+ provenance?: Provenance;
6900
7332
  /**
6901
7333
  * Platform-specific identifiers for this artifact
6902
7334
  */
@@ -6939,12 +7371,6 @@ export interface GetContentStandardsRequest {
6939
7371
  */
6940
7372
  export type GetContentStandardsResponse = ContentStandards | {
6941
7373
  errors: Error[];
6942
- /**
6943
- * Field must not be present in error response
6944
- */
6945
- standards_id?: {
6946
- [k: string]: unknown | undefined;
6947
- };
6948
7374
  context?: ContextObject;
6949
7375
  ext?: ExtensionObject;
6950
7376
  };
@@ -7027,12 +7453,6 @@ export type CreateContentStandardsResponse = {
7027
7453
  * Unique identifier for the created standards configuration
7028
7454
  */
7029
7455
  standards_id: string;
7030
- /**
7031
- * Field must not be present in success response
7032
- */
7033
- errors?: {
7034
- [k: string]: unknown | undefined;
7035
- };
7036
7456
  context?: ContextObject;
7037
7457
  ext?: ExtensionObject;
7038
7458
  } | {
@@ -7041,12 +7461,6 @@ export type CreateContentStandardsResponse = {
7041
7461
  * If the error is a scope conflict, the ID of the existing standards that conflict
7042
7462
  */
7043
7463
  conflicting_standards_id?: string;
7044
- /**
7045
- * Field must not be present in error response
7046
- */
7047
- standards_id?: {
7048
- [k: string]: unknown | undefined;
7049
- };
7050
7464
  context?: ContextObject;
7051
7465
  ext?: ExtensionObject;
7052
7466
  };
@@ -7128,15 +7542,28 @@ export interface UpdateContentStandardsRequest {
7128
7542
  /**
7129
7543
  * Response from updating a content standards configuration
7130
7544
  */
7131
- export interface UpdateContentStandardsResponse {
7545
+ export type UpdateContentStandardsResponse = UpdateContentStandardsSuccess | UpdateContentStandardsError;
7546
+ export interface UpdateContentStandardsSuccess {
7547
+ /**
7548
+ * Indicates the update was applied successfully
7549
+ */
7550
+ success: true;
7132
7551
  /**
7133
7552
  * ID of the updated standards configuration
7134
7553
  */
7135
- standards_id?: string;
7554
+ standards_id: string;
7555
+ context?: ContextObject;
7556
+ ext?: ExtensionObject;
7557
+ }
7558
+ export interface UpdateContentStandardsError {
7559
+ /**
7560
+ * Indicates the update failed
7561
+ */
7562
+ success: false;
7136
7563
  /**
7137
7564
  * Errors that occurred during the update
7138
7565
  */
7139
- errors?: Error[];
7566
+ errors: Error[];
7140
7567
  /**
7141
7568
  * If scope change conflicts with another configuration, the ID of the conflicting standards
7142
7569
  */
@@ -7187,20 +7614,12 @@ export type CalibrateContentResponse = {
7187
7614
  */
7188
7615
  explanation?: string;
7189
7616
  }[];
7190
- /**
7191
- * Field must not be present in success response
7192
- */
7193
- errors?: {
7194
- [k: string]: unknown | undefined;
7195
- };
7617
+ context?: ContextObject;
7618
+ ext?: ExtensionObject;
7196
7619
  } | {
7197
7620
  errors: Error[];
7198
- /**
7199
- * Field must not be present in error response
7200
- */
7201
- verdict?: {
7202
- [k: string]: unknown | undefined;
7203
- };
7621
+ context?: ContextObject;
7622
+ ext?: ExtensionObject;
7204
7623
  };
7205
7624
  /**
7206
7625
  * Request parameters for batch validating delivery records against content safety policies
@@ -7300,22 +7719,10 @@ export type ValidateContentDeliveryResponse = {
7300
7719
  rule_id?: string;
7301
7720
  }[];
7302
7721
  }[];
7303
- /**
7304
- * Field must not be present in success response
7305
- */
7306
- errors?: {
7307
- [k: string]: unknown | undefined;
7308
- };
7309
7722
  context?: ContextObject;
7310
7723
  ext?: ExtensionObject;
7311
7724
  } | {
7312
7725
  errors: Error[];
7313
- /**
7314
- * Field must not be present in error response
7315
- */
7316
- summary?: {
7317
- [k: string]: unknown | undefined;
7318
- };
7319
7726
  context?: ContextObject;
7320
7727
  ext?: ExtensionObject;
7321
7728
  };
@@ -7447,27 +7854,15 @@ export type GetMediaBuyArtifactsResponse = {
7447
7854
  method?: 'random' | 'stratified' | 'recent' | 'failures_only';
7448
7855
  };
7449
7856
  pagination?: PaginationResponse;
7450
- /**
7451
- * Field must not be present in success response
7452
- */
7453
- errors?: {
7454
- [k: string]: unknown | undefined;
7455
- };
7456
7857
  context?: ContextObject;
7457
7858
  ext?: ExtensionObject;
7458
7859
  } | {
7459
7860
  errors: Error[];
7460
- /**
7461
- * Field must not be present in error response
7462
- */
7463
- media_buy_id?: {
7464
- [k: string]: unknown | undefined;
7465
- };
7466
7861
  context?: ContextObject;
7467
7862
  ext?: ExtensionObject;
7468
7863
  };
7469
7864
  /**
7470
- * Request payload for get_creative_features task. Evaluates a creative manifest and returns feature values from a creative governance agent.
7865
+ * 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.).
7471
7866
  */
7472
7867
  export interface GetCreativeFeaturesRequest {
7473
7868
  creative_manifest: CreativeManifest;
@@ -7475,11 +7870,12 @@ export interface GetCreativeFeaturesRequest {
7475
7870
  * Optional filter to specific features. If omitted, returns all available features.
7476
7871
  */
7477
7872
  feature_ids?: string[];
7873
+ account?: AccountReference;
7478
7874
  context?: ContextObject;
7479
7875
  ext?: ExtensionObject;
7480
7876
  }
7481
7877
  /**
7482
- * Response payload for get_creative_features task. Returns feature values for the evaluated creative.
7878
+ * Response payload for the get_creative_features task. Returns scored feature values from the governance agent's evaluation of the submitted creative manifest.
7483
7879
  */
7484
7880
  export type GetCreativeFeaturesResponse = {
7485
7881
  /**
@@ -7490,22 +7886,10 @@ export type GetCreativeFeaturesResponse = {
7490
7886
  * URL to the vendor's full assessment report. The vendor controls what information is disclosed and access control.
7491
7887
  */
7492
7888
  detail_url?: string;
7493
- /**
7494
- * Field must not be present in success response
7495
- */
7496
- errors?: {
7497
- [k: string]: unknown | undefined;
7498
- };
7499
7889
  context?: ContextObject;
7500
7890
  ext?: ExtensionObject;
7501
7891
  } | {
7502
7892
  errors: Error[];
7503
- /**
7504
- * Field must not be present in error response
7505
- */
7506
- results?: {
7507
- [k: string]: unknown | undefined;
7508
- };
7509
7893
  context?: ContextObject;
7510
7894
  ext?: ExtensionObject;
7511
7895
  };
@@ -8147,6 +8531,10 @@ export interface GetAdCPCapabilitiesRequest {
8147
8531
  context?: ContextObject;
8148
8532
  ext?: ExtensionObject;
8149
8533
  }
8534
+ /**
8535
+ * Transportation modes for isochrone-based catchment area calculations. Determines how travel time translates to geographic reach.
8536
+ */
8537
+ export type TransportMode = 'walking' | 'cycling' | 'driving' | 'public_transport';
8150
8538
  /**
8151
8539
  * Response payload for get_adcp_capabilities task. Protocol-level capability discovery across all AdCP protocols. Each domain protocol has its own capability section.
8152
8540
  */
@@ -8156,7 +8544,7 @@ export interface GetAdCPCapabilitiesResponse {
8156
8544
  */
8157
8545
  adcp: {
8158
8546
  /**
8159
- * AdCP major versions supported by this seller. Major versions indicate breaking changes.
8547
+ * 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.
8160
8548
  */
8161
8549
  major_versions: number[];
8162
8550
  };
@@ -8197,6 +8585,31 @@ export interface GetAdCPCapabilitiesResponse {
8197
8585
  * Media-buy protocol capabilities. Only present if media_buy is in supported_protocols.
8198
8586
  */
8199
8587
  media_buy?: {
8588
+ /**
8589
+ * 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.
8590
+ */
8591
+ supported_pricing_models?: PricingModel[];
8592
+ /**
8593
+ * 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.
8594
+ */
8595
+ reporting?: {
8596
+ /**
8597
+ * Whether any products support date range filtering (date_range_support: 'date_range'). When false, all products return lifetime-only data.
8598
+ */
8599
+ supports_date_range?: boolean;
8600
+ /**
8601
+ * Whether delivery reporting includes daily_breakdown at the media buy and/or package level.
8602
+ */
8603
+ supports_daily_breakdown?: boolean;
8604
+ /**
8605
+ * Whether any products support webhook-based reporting notifications.
8606
+ */
8607
+ supports_webhooks?: boolean;
8608
+ /**
8609
+ * 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).
8610
+ */
8611
+ available_dimensions?: ('geo' | 'device_type' | 'device_platform' | 'audience' | 'placement' | 'creative' | 'keyword' | 'catalog_item')[];
8612
+ };
8200
8613
  features?: MediaBuyFeatures;
8201
8614
  /**
8202
8615
  * Technical execution capabilities for media buying
@@ -8326,6 +8739,10 @@ export interface GetAdCPCapabilitiesResponse {
8326
8739
  * Whether seller supports device platform targeting (Sec-CH-UA-Platform values)
8327
8740
  */
8328
8741
  device_platform?: boolean;
8742
+ /**
8743
+ * Whether seller supports device type targeting (form factor: desktop, mobile, tablet, ctv, dooh, unknown). When true, seller supports both device_type (include) and device_type_exclude (exclude) in targeting overlays.
8744
+ */
8745
+ device_type?: boolean;
8329
8746
  /**
8330
8747
  * Whether seller supports language targeting (ISO 639-1 codes)
8331
8748
  */
@@ -8338,6 +8755,45 @@ export interface GetAdCPCapabilitiesResponse {
8338
8755
  * Whether seller supports audience_exclude in targeting overlays (requires features.audience_targeting)
8339
8756
  */
8340
8757
  audience_exclude?: boolean;
8758
+ /**
8759
+ * Keyword targeting capabilities. Presence indicates support for targeting_overlay.keyword_targets and keyword_targets_add/remove in update_media_buy.
8760
+ */
8761
+ keyword_targets?: {
8762
+ /**
8763
+ * Match types this seller supports for keyword targets. Sellers must reject goals with unsupported match types.
8764
+ */
8765
+ supported_match_types: ('broad' | 'phrase' | 'exact')[];
8766
+ };
8767
+ /**
8768
+ * Negative keyword capabilities. Presence indicates support for targeting_overlay.negative_keywords and negative_keywords_add/remove in update_media_buy.
8769
+ */
8770
+ negative_keywords?: {
8771
+ /**
8772
+ * Match types this seller supports for negative keywords. Sellers must reject goals with unsupported match types.
8773
+ */
8774
+ supported_match_types: ('broad' | 'phrase' | 'exact')[];
8775
+ };
8776
+ /**
8777
+ * Proximity targeting capabilities from arbitrary coordinates via targeting_overlay.geo_proximity.
8778
+ */
8779
+ geo_proximity?: {
8780
+ /**
8781
+ * Whether seller supports simple radius targeting (distance circle from a point)
8782
+ */
8783
+ radius?: boolean;
8784
+ /**
8785
+ * Whether seller supports travel time isochrone targeting (requires a routing engine)
8786
+ */
8787
+ travel_time?: boolean;
8788
+ /**
8789
+ * Whether seller supports pre-computed GeoJSON geometry (buyer provides the polygon)
8790
+ */
8791
+ geometry?: boolean;
8792
+ /**
8793
+ * Transport modes supported for travel_time isochrones. Only relevant when travel_time is true.
8794
+ */
8795
+ transport_modes?: TransportMode[];
8796
+ };
8341
8797
  };
8342
8798
  };
8343
8799
  /**
@@ -8345,9 +8801,13 @@ export interface GetAdCPCapabilitiesResponse {
8345
8801
  */
8346
8802
  audience_targeting?: {
8347
8803
  /**
8348
- * Hashed PII types accepted for audience matching. Buyers should only send identifiers the seller supports.
8804
+ * PII-derived identifier types accepted for audience matching. Buyers should only send identifiers the seller supports.
8349
8805
  */
8350
8806
  supported_identifier_types: ('hashed_email' | 'hashed_phone')[];
8807
+ /**
8808
+ * 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.
8809
+ */
8810
+ supports_platform_customer_id?: boolean;
8351
8811
  /**
8352
8812
  * 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.
8353
8813
  */
@@ -8394,13 +8854,13 @@ export interface GetAdCPCapabilitiesResponse {
8394
8854
  attribution_windows?: {
8395
8855
  event_type?: EventType;
8396
8856
  /**
8397
- * Available click-through attribution windows (e.g. ["7d"], ["7d", "14d", "30d"])
8857
+ * Available post-click attribution windows (e.g. [{"interval": 7, "unit": "days"}])
8398
8858
  */
8399
- click_through: string[];
8859
+ post_click: Duration[];
8400
8860
  /**
8401
- * Available view-through attribution windows (e.g. ["1d"], ["1d", "7d", "14d"])
8861
+ * Available post-view attribution windows (e.g. [{"interval": 1, "unit": "days"}])
8402
8862
  */
8403
- view_through?: string[];
8863
+ post_view?: Duration[];
8404
8864
  }[];
8405
8865
  };
8406
8866
  /**
@@ -8566,9 +9026,9 @@ export interface GetAdCPCapabilitiesResponse {
8566
9026
  */
8567
9027
  creative?: {
8568
9028
  /**
8569
- * Whether this creative agent accepts creative_brief in build_creative requests for structured campaign-level creative direction
9029
+ * 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.
8570
9030
  */
8571
- supports_brief?: boolean;
9031
+ supports_compliance?: boolean;
8572
9032
  };
8573
9033
  /**
8574
9034
  * 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.
@@ -8758,19 +9218,7 @@ export interface ReportUsageRequest {
8758
9218
  * 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.
8759
9219
  */
8760
9220
  idempotency_key?: string;
8761
- /**
8762
- * The time range covered by this usage report. Applies to all records in the request.
8763
- */
8764
- reporting_period: {
8765
- /**
8766
- * Start of the reporting period (inclusive), in UTC.
8767
- */
8768
- start: string;
8769
- /**
8770
- * End of the reporting period (inclusive), in UTC.
8771
- */
8772
- end: string;
8773
- };
9221
+ reporting_period: DatetimeRange;
8774
9222
  /**
8775
9223
  * 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.
8776
9224
  */
@@ -8836,22 +9284,23 @@ export interface ReportUsageResponse {
8836
9284
  */
8837
9285
  export interface GetAccountFinancialsRequest {
8838
9286
  account: AccountReference;
8839
- /**
8840
- * Date range for the spend summary. Defaults to the current billing cycle if omitted.
8841
- */
8842
- period?: {
8843
- /**
8844
- * Period start (ISO 8601 date)
8845
- */
8846
- start: string;
8847
- /**
8848
- * Period end (ISO 8601 date)
8849
- */
8850
- end: string;
8851
- };
9287
+ period?: DateRange;
8852
9288
  context?: ContextObject;
8853
9289
  ext?: ExtensionObject;
8854
9290
  }
9291
+ /**
9292
+ * Date range for the spend summary. Defaults to the current billing cycle if omitted.
9293
+ */
9294
+ export interface DateRange {
9295
+ /**
9296
+ * Start date (inclusive), ISO 8601
9297
+ */
9298
+ start: string;
9299
+ /**
9300
+ * End date (inclusive), ISO 8601
9301
+ */
9302
+ end: string;
9303
+ }
8855
9304
  /**
8856
9305
  * 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.
8857
9306
  */
@@ -8865,19 +9314,11 @@ export interface GetAccountFinancialsSuccess {
8865
9314
  * ISO 4217 currency code for all monetary amounts in this response
8866
9315
  */
8867
9316
  currency: string;
9317
+ period: DateRange;
8868
9318
  /**
8869
- * The actual period covered by spend data. May differ from the requested period if the seller adjusts to billing cycle boundaries.
9319
+ * 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.
8870
9320
  */
8871
- period: {
8872
- /**
8873
- * Period start (ISO 8601 date)
8874
- */
8875
- start: string;
8876
- /**
8877
- * Period end (ISO 8601 date)
8878
- */
8879
- end: string;
8880
- };
9321
+ timezone: string;
8881
9322
  /**
8882
9323
  * Spend summary for the period
8883
9324
  */
@@ -8946,13 +9387,7 @@ export interface GetAccountFinancialsSuccess {
8946
9387
  * Seller-assigned invoice identifier
8947
9388
  */
8948
9389
  invoice_id: string;
8949
- /**
8950
- * Billing period covered by this invoice
8951
- */
8952
- period?: {
8953
- start: string;
8954
- end: string;
8955
- };
9390
+ period?: DateRange;
8956
9391
  /**
8957
9392
  * Invoice total in currency
8958
9393
  */