@zernio/node 0.2.1168 → 0.2.1170

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.
package/dist/index.d.mts CHANGED
@@ -2109,13 +2109,13 @@ type AccountWithFollowerStats = SocialAccount & {
2109
2109
  type Ad = {
2110
2110
  _id?: string;
2111
2111
  name?: string;
2112
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
2112
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
2113
2113
  /**
2114
2114
  * Delivery status. Derived from the platform `effective_status`, so it inherits ancestor pauses (an ACTIVE ad under a PAUSED campaign reads `paused`). For the ad's own on/off toggle use `configuredStatus`; for the review state use `reviewStatus`.
2115
2115
  */
2116
2116
  status?: (AdStatus);
2117
2117
  /**
2118
- * The ad's own on/off switch as configured on the platform, independent of its parents: an ACTIVE ad under a paused ad set or campaign still reads ACTIVE here while `status` reads `paused`. Sources: Meta `configured_status`, TikTok ad `operation_status` (ENABLE -> ACTIVE, DISABLE -> PAUSED), ChatGPT (OpenAI) ad `status` (ACTIVE / PAUSED, plus ARCHIVED on OpenAI). On create it is read back from the platform, not copied from the request: a `PAUSED` create pauses only the top-most object it creates, so an ad under a new paused campaign or ad set reads ACTIVE here with `status: paused`, and only an ad attached to an existing ad set reads PAUSED. Distinct from `status`, which is the ancestor-cascaded delivery status. Only present for Meta, TikTok and OpenAI ads created or synced after the field was added for that platform; null otherwise.
2118
+ * The ad's own on/off switch as configured on the platform, independent of its parents: an ACTIVE ad under a paused ad set or campaign still reads ACTIVE here while `status` reads `paused`. Sources: Meta `configured_status`, TikTok ad `operation_status` (ENABLE -> ACTIVE, DISABLE -> PAUSED), ChatGPT (OpenAI) ad `status` (ACTIVE / PAUSED, plus ARCHIVED on OpenAI), Reddit `configured_status` (ACTIVE / PAUSED / ARCHIVED). On create it is read back from the platform, not copied from the request: a `PAUSED` create pauses only the top-most object it creates, so an ad under a new paused campaign or ad set reads ACTIVE here with `status: paused`, and only an ad attached to an existing ad set reads PAUSED. Distinct from `status`, which is the ancestor-cascaded delivery status. Only present for Meta, TikTok, OpenAI and Reddit ads created or synced after the field was added for that platform; null otherwise.
2119
2119
  */
2120
2120
  configuredStatus?: (string) | null;
2121
2121
  /**
@@ -2139,11 +2139,11 @@ type Ad = {
2139
2139
  amount?: number;
2140
2140
  type?: 'daily' | 'lifetime';
2141
2141
  /**
2142
- * LinkedIn only. The parent campaign's `dailyBudget`. LinkedIn allows a daily AND a lifetime budget on the same campaign, which `amount`/`type` cannot express (daily wins there); read `daily` and `lifetime` to see both.
2142
+ * LinkedIn and X only. The daily budget (LinkedIn: the parent campaign's `dailyBudget`; X: the line item's, or the campaign's when the line item has none). Both allow a daily AND a lifetime budget together, which `amount`/`type` cannot express (daily wins there); read `daily` and `lifetime` to see both.
2143
2143
  */
2144
2144
  daily?: number;
2145
2145
  /**
2146
- * LinkedIn only. The parent campaign's `totalBudget`, readable even when a daily budget is also set.
2146
+ * LinkedIn and X only. The lifetime total (LinkedIn: the parent campaign's `totalBudget`; X: `total_budget_amount_local_micro`, for example the `lifetimeBudgetCap` of a boost), readable even when a daily budget is also set.
2147
2147
  */
2148
2148
  lifetime?: number;
2149
2149
  /**
@@ -2484,7 +2484,7 @@ type Ad = {
2484
2484
  createdAt?: string;
2485
2485
  updatedAt?: string;
2486
2486
  };
2487
- type platform = 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
2487
+ type platform = 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
2488
2488
  type adType = 'boost' | 'standalone';
2489
2489
  /**
2490
2490
  * Creative format, classified from the media the creative carries. `null` when the creative carries no media to classify. An unsynced creative and a genuine text-only ad are indistinguishable, so neither is guessed at. Returned by `GET /v1/ads`, `GET /v1/ads/{adId}` and the ad nodes of `GET /v1/ads/tree`.
@@ -2553,7 +2553,7 @@ type AdBudget = {
2553
2553
  };
2554
2554
  type AdCampaign = {
2555
2555
  platformCampaignId?: string;
2556
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
2556
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
2557
2557
  campaignName?: string;
2558
2558
  /**
2559
2559
  * Delivery status derived from child ad statuses. Distinct from `reviewStatus`.
@@ -2564,7 +2564,7 @@ type AdCampaign = {
2564
2564
  */
2565
2565
  reviewStatus?: (AdReviewStatus | null);
2566
2566
  /**
2567
- * Raw platform-level campaign status (Meta `effective_status`; ChatGPT (OpenAI): the campaign's own switch, active / paused / archived; TikTok: the campaign's own switch `operation_status`, ENABLE / DISABLE).
2567
+ * Raw platform-level campaign status (Meta `effective_status`; ChatGPT (OpenAI): the campaign's own switch, active / paused / archived; TikTok: the campaign's own switch `operation_status`, ENABLE / DISABLE; Reddit: the campaign's `configured_status`, ACTIVE / PAUSED / ARCHIVED).
2568
2568
  */
2569
2569
  platformCampaignStatus?: (string) | null;
2570
2570
  /**
@@ -3135,8 +3135,17 @@ type matchType2 = 'broad' | 'phrase' | 'exact';
3135
3135
  * optimizes for (sent as the campaign's `conversion_event_setting_ids`); every other
3136
3136
  * `promotedObject` field is rejected with a 400. See `customEventType` below.
3137
3137
  *
3138
+ * **Reddit Ads**: Reddit puts a pixel on every ad group, whatever the goal. `pixelId`
3139
+ * (or `tracking.pixelId`) picks it; when omitted the ad account's first pixel is used,
3140
+ * and an ad account with no pixel returns 422 (create the pixel in Reddit Ads Manager).
3141
+ * A `pixelId` that is not a pixel of the ad account returns 400. `goal: conversions`
3142
+ * requires `customEventType` (see below). `goal: lead_generation` optimizes toward the
3143
+ * pixel's Lead event. Reddit only optimizes toward an event the pixel has already
3144
+ * received: when it never fired, the request returns 422 `invalid_resource_state`.
3145
+ * Fire it from your site or send it with POST /v1/ads/conversions first.
3146
+ *
3138
3147
  * The remaining `promotedObject.*` fields are Meta-only. Platforms other than
3139
- * Meta, TikTok and OpenAI ignore `promotedObject` entirely.
3148
+ * Meta, TikTok, OpenAI and Reddit ignore `promotedObject` entirely.
3140
3149
  *
3141
3150
  */
3142
3151
  type AdPromotedObject = {
@@ -3146,6 +3155,7 @@ type AdPromotedObject = {
3146
3155
  * carrying `pixel_id` without `custom_event_type` (error_subcode 1885014),
3147
3156
  * even when `customConversionId` is also present.
3148
3157
  * **TikTok:** TikTok Pixel ID, required for `goal: conversions`.
3158
+ * **Reddit:** Reddit pixel ID (e.g. `a2_abc123`), optional on every goal (see above).
3149
3159
  * To discover the pixels an ad account can use, call
3150
3160
  * `GET /v1/accounts/{accountId}/tracking-tags?adAccountId=act_...` (each entry
3151
3161
  * carries `kind` and `ownerAdAccountId`), or
@@ -3183,6 +3193,11 @@ type AdPromotedObject = {
3183
3193
  * the campaign optimizes for the first optimizable event in OpenAI's own list
3184
3194
  * order, which is the most recently created one.
3185
3195
  *
3196
+ * **Reddit:** required for `goal: conversions` (400 without it). One of `PURCHASE`,
3197
+ * `LEAD`, `COMPLETE_REGISTRATION` or `SIGN_UP` (both sent as Reddit's SIGN_UP),
3198
+ * `ADD_TO_CART`, `PAGE_VISIT`, `VIEW_CONTENT` or `CONTENT_VIEW` (both sent as
3199
+ * PAGE_VISIT), any case. The pixel must already have received the event (422 otherwise).
3200
+ *
3186
3201
  */
3187
3202
  customEventType?: string;
3188
3203
  /**
@@ -3336,11 +3351,11 @@ type AdsTimelineResponse = {
3336
3351
  }>;
3337
3352
  };
3338
3353
  /**
3339
- * Meta, plus `urlTags` on ChatGPT (OpenAI). Meta: attaches pixel measurement to the ad regardless of the optimization goal (the "Website events" tracking row in Ads Manager). `pixelId` becomes the ad's `tracking_specs` (offsite_conversion + fb_pixel); `urlTags` is stored on the new creative as `url_tags` and retained on the ad for compatibility. Applied on the legacy single-creative shape, every ad of the multi-creative shape, and the attach shape. NOTE: tracking lives on the AD object and is not inherited from the ad set, so pass it on EVERY attach call that should carry the pixel. ChatGPT (OpenAI): `urlTags` becomes the ad's `landing_page_configuration.query_string_template`, which OpenAI appends to `linkUrl` on click.
3354
+ * Meta, plus `urlTags` on ChatGPT (OpenAI) and `pixelId` on Reddit. Meta: attaches pixel measurement to the ad regardless of the optimization goal (the "Website events" tracking row in Ads Manager). `pixelId` becomes the ad's `tracking_specs` (offsite_conversion + fb_pixel); `urlTags` is stored on the new creative as `url_tags` and retained on the ad for compatibility. Applied on the legacy single-creative shape, every ad of the multi-creative shape, and the attach shape. NOTE: tracking lives on the AD object and is not inherited from the ad set, so pass it on EVERY attach call that should carry the pixel. ChatGPT (OpenAI): `urlTags` becomes the ad's `landing_page_configuration.query_string_template`, which OpenAI appends to `linkUrl` on click. Reddit: `pixelId` picks the pixel of the new ad group, like `promotedObject.pixelId` (which wins when both are sent).
3340
3355
  */
3341
3356
  type AdTracking = {
3342
3357
  /**
3343
- * Meta Pixel ID to attach for offsite-conversion measurement.
3358
+ * Meta Pixel ID to attach for offsite-conversion measurement, or the Reddit pixel of the new ad group.
3344
3359
  */
3345
3360
  pixelId?: string;
3346
3361
  /**
@@ -3373,11 +3388,11 @@ type AdTreeAdSet = {
3373
3388
  amount?: number;
3374
3389
  type?: 'daily' | 'lifetime';
3375
3390
  /**
3376
- * LinkedIn only. The campaign's `dailyBudget`. LinkedIn allows a daily AND a lifetime budget on the same campaign, which `amount`/`type` cannot express (daily wins there); read `daily` and `lifetime` to see both.
3391
+ * LinkedIn and X only. The daily budget (LinkedIn: the campaign's `dailyBudget`; X: the line item's `daily_budget_amount_local_micro`). Both allow a daily AND a lifetime budget together, which `amount`/`type` cannot express (daily wins there); read `daily` and `lifetime` to see both.
3377
3392
  */
3378
3393
  daily?: number;
3379
3394
  /**
3380
- * LinkedIn only. The campaign's `totalBudget`, readable even when a daily budget is also set.
3395
+ * LinkedIn and X only. The lifetime total (LinkedIn: the campaign's `totalBudget`; X: the line item's `total_budget_amount_local_micro`), readable even when a daily budget is also set.
3381
3396
  */
3382
3397
  lifetime?: number;
3383
3398
  /**
@@ -3451,7 +3466,7 @@ type AdTreeAdSet = {
3451
3466
  */
3452
3467
  type AdTreeCampaign = {
3453
3468
  platformCampaignId?: string;
3454
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
3469
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
3455
3470
  campaignName?: string;
3456
3471
  /**
3457
3472
  * Earliest `platformCreatedAt` (platform ad creation time; falls back to `createdAt`, Zernio's sync time, for ads synced before that field existed) across every ad in the campaign. Not the platform campaign's own creation time (Meta's `Campaign.created_time` etc. is not synced). A campaign created empty and populated later will show its first ad's time, not the campaign's. Usable for sorting "most recently created" without the numeric-campaign-id heuristic. Same source as `AdTreeAdSet.createdTime` and `Ad.platformCreatedAt`; mirrors `AdCampaign.earliestAd`.
@@ -3472,7 +3487,7 @@ type AdTreeCampaign = {
3472
3487
  */
3473
3488
  reviewStatus?: (AdReviewStatus | null);
3474
3489
  /**
3475
- * Raw platform-level campaign status (Meta `effective_status`: ACTIVE, PAUSED, DELETED, ARCHIVED, IN_PROCESS, WITH_ISSUES; ChatGPT (OpenAI): the campaign's own switch, active / paused / archived, independent of the delivery `status`; TikTok: the campaign's own switch `operation_status`, ENABLE / DISABLE). Distinct from per-ad `platformStatus`.
3490
+ * Raw platform-level campaign status (Meta `effective_status`: ACTIVE, PAUSED, DELETED, ARCHIVED, IN_PROCESS, WITH_ISSUES; ChatGPT (OpenAI): the campaign's own switch, active / paused / archived, independent of the delivery `status`; TikTok: the campaign's own switch `operation_status`, ENABLE / DISABLE; Reddit: the campaign's `configured_status`, ACTIVE / PAUSED / ARCHIVED). Distinct from per-ad `platformStatus`.
3476
3491
  */
3477
3492
  platformCampaignStatus?: (string) | null;
3478
3493
  /**
@@ -5951,14 +5966,15 @@ type ConversionEvent = {
5951
5966
  * Standard event name (Purchase, Lead, CompleteRegistration, AddToCart,
5952
5967
  * InitiateCheckout, AddPaymentInfo, Subscribe, StartTrial, ViewContent,
5953
5968
  * Search, Contact, SubmitApplication, Schedule) or a custom string
5954
- * (only supported on platforms that accept custom events: Meta and
5955
- * OpenAI Ads).
5969
+ * (only supported on platforms that accept custom events: Meta,
5970
+ * OpenAI Ads and Reddit).
5956
5971
  *
5957
5972
  * Per-platform behavior:
5958
5973
  * - Meta: free-form; standard names match Meta's built-ins.
5959
5974
  * - Google: ignored. The conversion action's category determines the type.
5960
5975
  * - LinkedIn: ignored. The conversion rule's `type` is locked to the destination.
5961
5976
  * - OpenAI Ads: a fixed subset of standard names (Purchase, Lead, AddToCart, ViewContent, InitiateCheckout, CompleteRegistration, Subscribe, StartTrial, Schedule) maps 1:1 onto OpenAI's own event-type enum; anything else is sent as a custom event with the name preserved.
5977
+ * - Reddit: Purchase, Lead, CompleteRegistration (SIGN_UP), AddToCart, AddToWishlist, ViewContent, Search and PageView (PAGE_VISIT) map onto Reddit's tracking types; anything else is sent as a CUSTOM event with the name preserved.
5962
5978
  *
5963
5979
  */
5964
5980
  eventName: string;
@@ -5971,7 +5987,8 @@ type ConversionEvent = {
5971
5987
  * to prevent double-counting. Mapped to event_id on Meta,
5972
5988
  * transactionId on Google, eventId on LinkedIn (LinkedIn deduplicates
5973
5989
  * against Insight Tag events with the same eventId; the Insight Tag
5974
- * event wins when both arrive).
5990
+ * event wins when both arrive), and `metadata.conversion_id` on Reddit
5991
+ * (Reddit's dedup key against Reddit Pixel events).
5975
5992
  *
5976
5993
  */
5977
5994
  eventId: string;
@@ -6090,6 +6107,14 @@ type ConversionEvent = {
6090
6107
  * Pinterest click ID (the `epik` URL param or `_epik` cookie). Sent to Pinterest as `click_id`, not hashed.
6091
6108
  */
6092
6109
  epik?: string;
6110
+ /**
6111
+ * Reddit click ID (the `rdt_cid` URL param Reddit adds to ad clicks). Sent to Reddit as `click_id`, not hashed.
6112
+ */
6113
+ rdt_cid?: string;
6114
+ /**
6115
+ * Reddit Pixel browser id (the `_rdt_uuid` first-party cookie). Sent to Reddit as `user.uuid`, not hashed.
6116
+ */
6117
+ rdt_uuid?: string;
6093
6118
  };
6094
6119
  };
6095
6120
  /**
@@ -10696,7 +10721,7 @@ type ParameterCatalogTokenAccountId = string;
10696
10721
  */
10697
10722
  type ParameterIdempotencyKeyHeader = string;
10698
10723
  /**
10699
- * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description.
10724
+ * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description. On X the budget is read live in the same read: on GET /v1/ads/{adId} `budget`, `adSetBudget`, `campaignBudget` and `budgetLevel` are the line item and campaign budgets X holds now (stored like the switches); on the ad set and campaign listings `budget` is the one that line item or campaign holds now (returned, not stored); a row whose budget the other level holds keeps its synced `budget`.
10700
10725
  */
10701
10726
  type ParameterLiveStatusRead = boolean;
10702
10727
  /**
@@ -12067,7 +12092,7 @@ type SnapchatPlatformData = {
12067
12092
  type contentType3 = 'story' | 'saved_story' | 'spotlight';
12068
12093
  type SocialAccount = {
12069
12094
  _id: string;
12070
- platform: 'tiktok' | 'instagram' | 'facebook' | 'youtube' | 'linkedin' | 'twitter' | 'threads' | 'pinterest' | 'reddit' | 'bluesky' | 'googlebusiness' | 'telegram' | 'snapchat' | 'discord' | 'slack' | 'whatsapp' | 'shopify' | 'wordpress' | 'linkedinads' | 'metaads' | 'pinterestads' | 'tiktokads' | 'xads' | 'googleads' | 'openaiads' | 'sms' | 'phone' | 'rcs' | 'whopads';
12095
+ platform: 'tiktok' | 'instagram' | 'facebook' | 'youtube' | 'linkedin' | 'twitter' | 'threads' | 'pinterest' | 'reddit' | 'bluesky' | 'googlebusiness' | 'telegram' | 'snapchat' | 'discord' | 'slack' | 'whatsapp' | 'shopify' | 'wordpress' | 'linkedinads' | 'metaads' | 'pinterestads' | 'tiktokads' | 'xads' | 'googleads' | 'openaiads' | 'redditads' | 'sms' | 'phone' | 'rcs' | 'whopads';
12071
12096
  profileId: (string | Profile);
12072
12097
  username?: string;
12073
12098
  displayName?: string;
@@ -12160,7 +12185,7 @@ type SocialAccount = {
12160
12185
  [key: string]: unknown;
12161
12186
  };
12162
12187
  };
12163
- type platform11 = 'tiktok' | 'instagram' | 'facebook' | 'youtube' | 'linkedin' | 'twitter' | 'threads' | 'pinterest' | 'reddit' | 'bluesky' | 'googlebusiness' | 'telegram' | 'snapchat' | 'discord' | 'slack' | 'whatsapp' | 'shopify' | 'wordpress' | 'linkedinads' | 'metaads' | 'pinterestads' | 'tiktokads' | 'xads' | 'googleads' | 'openaiads' | 'sms' | 'phone' | 'rcs' | 'whopads';
12188
+ type platform11 = 'tiktok' | 'instagram' | 'facebook' | 'youtube' | 'linkedin' | 'twitter' | 'threads' | 'pinterest' | 'reddit' | 'bluesky' | 'googlebusiness' | 'telegram' | 'snapchat' | 'discord' | 'slack' | 'whatsapp' | 'shopify' | 'wordpress' | 'linkedinads' | 'metaads' | 'pinterestads' | 'tiktokads' | 'xads' | 'googleads' | 'openaiads' | 'redditads' | 'sms' | 'phone' | 'rcs' | 'whopads';
12164
12189
  /**
12165
12190
  * TikTok accounts only. The account type TikTok reported when the account was connected. `personal` accounts cannot use TikTok direct messages through the API (TikTok limits Business Messaging to Business Accounts): skip the inbox for them and tell the user to switch to a Business Account in the TikTok app, then reconnect. `business` is the prerequisite, not a guarantee; messaging also needs the messaging scopes granted and TikTok's regional availability. `unknown` on accounts connected before this was captured or whose grant left out the account-type scope.
12166
12191
  */
@@ -12454,7 +12479,7 @@ type TargetingSpec = {
12454
12479
  }>;
12455
12480
  };
12456
12481
  /**
12457
- * Minimum age. Applied on Meta, TikTok, Pinterest, LinkedIn, X and Google Search/Display (Google excludes the age ranges outside the request); rejected with 400 on OpenAI and on Google Performance Max / Demand Gen. Each platform clamps to its own range: Meta and Pinterest effectively cap at 65 (65 = 65+), TikTok maps up to 100. LinkedIn rounds out to its buckets (18-24, 25-34, 35-54, 55+) and has no under-18 audience; X rounds out to the narrowest of its fixed ranges (e.g. 25-34 becomes 25-49, 18-65 becomes 18+). Pinterest has no under-18 bucket, so an ageMin below 18 starts at 18 there.
12482
+ * Minimum age. Applied on Meta, TikTok, Pinterest, LinkedIn, X and Google Search/Display (Google excludes the age ranges outside the request); rejected with 400 on OpenAI, Reddit and on Google Performance Max / Demand Gen. Each platform clamps to its own range: Meta and Pinterest effectively cap at 65 (65 = 65+), TikTok maps up to 100. LinkedIn rounds out to its buckets (18-24, 25-34, 35-54, 55+) and has no under-18 audience; X rounds out to the narrowest of its fixed ranges (e.g. 25-34 becomes 25-49, 18-65 becomes 18+). Pinterest has no under-18 bucket, so an ageMin below 18 starts at 18 there.
12458
12483
  */
12459
12484
  ageMin?: number;
12460
12485
  /**
@@ -12462,7 +12487,7 @@ type TargetingSpec = {
12462
12487
  */
12463
12488
  ageMax?: number;
12464
12489
  /**
12465
- * Restrict by gender. 'all' (default) targets everyone. Applied on Meta, TikTok, Pinterest, LinkedIn, X and Google Search/Display (Google excludes the other gender); rejected with 400 on OpenAI and on Google Performance Max / Demand Gen.
12490
+ * Restrict by gender. 'all' (default) targets everyone. Applied on Meta, TikTok, Pinterest, LinkedIn, X, Reddit and Google Search/Display (Google excludes the other gender); rejected with 400 on OpenAI and on Google Performance Max / Demand Gen.
12466
12491
  */
12467
12492
  gender?: 'all' | 'male' | 'female';
12468
12493
  /**
@@ -12475,7 +12500,7 @@ type TargetingSpec = {
12475
12500
  */
12476
12501
  incomeTier?: 'top_5' | 'top_10' | 'top_10_25' | 'top_25_50';
12477
12502
  /**
12478
- * Language codes restricting the audience by language. Applied on Meta, Google, TikTok, LinkedIn, X and Pinterest; rejected with 400 on OpenAI. A code the platform cannot target returns 400 listing the ones it can. On Meta, ISO 639-1 codes (e.g. ['en']); a bare code targets all regional variants ("en" = all English), or use a region-qualified code ("en_GB", "pt_BR") for a specific one. Unknown codes are rejected.
12503
+ * Language codes restricting the audience by language. Applied on Meta, Google, TikTok, LinkedIn, X, Pinterest and Reddit; rejected with 400 on OpenAI. A code the platform cannot target returns 400 listing the ones it can. On Meta, ISO 639-1 codes (e.g. ['en']); a bare code targets all regional variants ("en" = all English), or use a region-qualified code ("en_GB", "pt_BR") for a specific one. Unknown codes are rejected.
12479
12504
  */
12480
12505
  languages?: Array<(string)>;
12481
12506
  /**
@@ -12530,13 +12555,29 @@ type TargetingSpec = {
12530
12555
  */
12531
12556
  jobFunctions?: Array<(string)>;
12532
12557
  /**
12533
- * Platform audience IDs to include, as returned by GET /v1/ads/audiences (Meta custom audience ids, TikTok audience ids, Pinterest customer list ids, LinkedIn segment ids (the platformAudienceId from GET /v1/ads/audiences; Zernio resolves it to the targetable LinkedIn ad segment, an unknown id returns 400), Google user list ids, X custom audience ids). Not supported on OpenAI (400).
12558
+ * Platform audience IDs to include, as returned by GET /v1/ads/audiences (Meta custom audience ids, TikTok audience ids, Pinterest customer list ids, LinkedIn segment ids (the platformAudienceId from GET /v1/ads/audiences; Zernio resolves it to the targetable LinkedIn ad segment, an unknown id returns 400), Google user list ids, X custom audience ids). On Reddit, the ids of custom audiences built in Reddit Ads Manager (GET /v1/ads/audiences does not list Reddit audiences). Not supported on OpenAI (400).
12534
12559
  */
12535
12560
  audienceInclude?: Array<(string)>;
12536
12561
  /**
12537
12562
  * Platform audience IDs to exclude; same ID formats as audienceInclude. Not supported on OpenAI (400).
12538
12563
  */
12539
12564
  audienceExclude?: Array<(string)>;
12565
+ /**
12566
+ * Reddit only (400 elsewhere). Subreddits to target, by name, with or without the `r/` prefix (e.g. `['marketing', 'r/startups']`), as returned by /v1/ads/targeting/search?dimension=community.
12567
+ */
12568
+ communities?: Array<(string)>;
12569
+ /**
12570
+ * Reddit only (400 elsewhere). Subreddits to exclude, named like `communities`.
12571
+ */
12572
+ excludedCommunities?: Array<(string)>;
12573
+ /**
12574
+ * Reddit only (400 elsewhere). Keywords that place the ad in Reddit conversations about them, as returned by /v1/ads/targeting/search?dimension=conversationKeyword.
12575
+ */
12576
+ conversationKeywords?: Array<(string)>;
12577
+ /**
12578
+ * Reddit only (400 elsewhere). Conversation keywords to keep the ad away from.
12579
+ */
12580
+ excludedConversationKeywords?: Array<(string)>;
12540
12581
  };
12541
12582
  /**
12542
12583
  * Text, images (up to 10), videos (up to 10), and mixed media albums. Captions up to 1024 chars for media, 4096 for text-only.
@@ -20566,7 +20607,7 @@ type DeleteProfileError = (unknown | ErrorResponse | {
20566
20607
  type ListAccountsData = {
20567
20608
  query?: {
20568
20609
  /**
20569
- * Only accounts of this kind. ads = ad accounts (Meta, Google, LinkedIn, Pinterest, TikTok, X, OpenAI), communication = WhatsApp, Telegram, Discord, Slack and iMessage, blogs = Shopify and WordPress, social = every other platform.
20610
+ * Only accounts of this kind. ads = ad accounts (Meta, Google, LinkedIn, Pinterest, TikTok, X, OpenAI, Reddit), communication = WhatsApp, Telegram, Discord, Slack and iMessage, blogs = Shopify and WordPress, social = every other platform.
20570
20611
  */
20571
20612
  category?: 'social' | 'ads' | 'communication' | 'blogs';
20572
20613
  /**
@@ -20759,7 +20800,7 @@ type GetAllAccountsHealthData = {
20759
20800
  /**
20760
20801
  * Filter by platform
20761
20802
  */
20762
- platform?: 'facebook' | 'instagram' | 'linkedin' | 'twitter' | 'tiktok' | 'youtube' | 'threads' | 'pinterest' | 'reddit' | 'bluesky' | 'googlebusiness' | 'telegram' | 'snapchat' | 'discord' | 'slack' | 'whatsapp' | 'shopify' | 'wordpress' | 'linkedinads' | 'metaads' | 'pinterestads' | 'tiktokads' | 'xads' | 'googleads' | 'openaiads' | 'whopads';
20803
+ platform?: 'facebook' | 'instagram' | 'linkedin' | 'twitter' | 'tiktok' | 'youtube' | 'threads' | 'pinterest' | 'reddit' | 'bluesky' | 'googlebusiness' | 'telegram' | 'snapchat' | 'discord' | 'slack' | 'whatsapp' | 'shopify' | 'wordpress' | 'linkedinads' | 'metaads' | 'pinterestads' | 'tiktokads' | 'xads' | 'googleads' | 'openaiads' | 'redditads' | 'whopads';
20763
20804
  /**
20764
20805
  * Filter by profile ID
20765
20806
  */
@@ -21704,6 +21745,10 @@ type GetConnectUrlData = {
21704
21745
  * x_ads_denied, x_ads_auth_failed, x_ads_config_error, x_ads_account_not_found,
21705
21746
  * x_ads_state_error, x_ads_token_failed, x_ads_token_missing, x_ads_callback_error
21706
21747
  *
21748
+ * Reddit Ads (platform=redditads):
21749
+ * reddit_ads_auth_failed, reddit_ads_invalid_state, reddit_ads_access_denied,
21750
+ * reddit_ads_scope_not_granted, reddit_ads_no_ad_accounts, reddit_ads_callback_error
21751
+ *
21707
21752
  * Shopify (platform=shopify):
21708
21753
  * shopify_auth_failed, shopify_config_error, shopify_invalid_state, shopify_invalid_hmac,
21709
21754
  * shopify_invalid_shop, shopify_missing_scopes, shopify_callback_error
@@ -21714,8 +21759,8 @@ type GetConnectUrlData = {
21714
21759
  * and `tiktok_ads_auth_failed` may carry the provider's raw error string in `error_message`.
21715
21760
  *
21716
21761
  * 2. On the tiktok and twitter ads flows `platform` carries the ads platform id
21717
- * (`tiktokads`, `xads`), not the value used in the request path. The googleads and shopify
21718
- * flows report `googleads` and `shopify`.
21762
+ * (`tiktokads`, `xads`), not the value used in the request path. The googleads, redditads and
21763
+ * shopify flows report `googleads`, `redditads` and `shopify`.
21719
21764
  *
21720
21765
  * 3. `missing_tiktok_permissions` means the TikTok authorization left out a permission the
21721
21766
  * already-connected account needs, so nothing was changed and it keeps working as before.
@@ -21933,7 +21978,7 @@ type ConnectAdsData = {
21933
21978
  * instagram_login flow no ads account can be created; do not use this value for those accounts.
21934
21979
  *
21935
21980
  */
21936
- platform: 'facebook' | 'instagram' | 'linkedin' | 'tiktok' | 'twitter' | 'pinterest' | 'googleads';
21981
+ platform: 'facebook' | 'instagram' | 'linkedin' | 'tiktok' | 'twitter' | 'pinterest' | 'googleads' | 'redditads';
21937
21982
  };
21938
21983
  query: {
21939
21984
  /**
@@ -21947,7 +21992,7 @@ type ConnectAdsData = {
21947
21992
  * profile's ads connection hangs off: that account is no longer connected, so the
21948
21993
  * call returns 409 `reconnect_required` instead of reconnecting another account.
21949
21994
  * Reconnect it via GET /v1/connect/{platform} first. Ignored for standalone
21950
- * platforms (`googleads`).
21995
+ * platforms (`googleads`, `redditads`).
21951
21996
  *
21952
21997
  */
21953
21998
  accountId?: string;
@@ -21957,7 +22002,8 @@ type ConnectAdsData = {
21957
22002
  * preserve the existing scope; supplied IDs are checked against the new grant. To change
21958
22003
  * that scope after migration, call this endpoint with the IDs and omit loginMode. Supported
21959
22004
  * on `facebook`/`instagram` (Meta, `act_<digits>`), `linkedin` (bare
21960
- * numeric sponsored-account id), `googleads` (bare customer id digits)
22005
+ * numeric sponsored-account id), `googleads` (bare customer id digits),
22006
+ * `redditads` (Reddit ad account id, `a2_<id>` or `t2_<id>`)
21961
22007
  * and `twitter` (X Ads, base36 account id). `tiktok` scopes advertisers
21962
22008
  * at OAuth and `pinterest` has no ads discovery, so both ignore it.
21963
22009
  * Meta ids are additionally validated against the connected token:
@@ -21973,9 +22019,9 @@ type ConnectAdsData = {
21973
22019
  * scoped ones, instead of every ad account the login can reach. The scope
21974
22020
  * is kept when this call returns an `authUrl`, so the Meta Ads account
21975
22021
  * created after OAuth is scoped (and only its scoped ad accounts synced and
21976
- * subscribed) from the start. On `googleads` the scope is kept through
21977
- * OAuth when `redirect_url` is set, so the Google Ads connection created
21978
- * after OAuth syncs only its scoped customers from the first sync.
22022
+ * subscribed) from the start. On `googleads` and `redditads` the scope is kept through
22023
+ * OAuth when `redirect_url` is set, so the connection created after OAuth
22024
+ * syncs only its scoped ad accounts from the first sync.
21979
22025
  * For multiple accounts use `adAccountIds` instead.
21980
22026
  *
21981
22027
  */
@@ -22032,17 +22078,19 @@ type ConnectAdsData = {
22032
22078
  /**
22033
22079
  * Custom URL the browser is sent to once the OAuth flow finishes. Honored on
22034
22080
  * every ads platform, including the separate-token (`tiktok`, `twitter`) and
22035
- * standalone (`googleads`) flows. MUST be an absolute http(s) URL or a custom
22081
+ * standalone (`googleads`, `redditads`) flows. MUST be an absolute http(s) URL or a custom
22036
22082
  * app scheme for mobile deeplinks (e.g. myapp://callback); a relative path is
22037
22083
  * rejected with 400 INVALID_REDIRECT_URL. On success
22038
- * `tiktok`, `twitter` and `googleads` land on the URL unchanged, while the
22084
+ * `tiktok` lands on the URL unchanged; `twitter`, `googleads` and `redditads`
22085
+ * append `connected` (the ads platform id: `xads`, `googleads` or `redditads`),
22086
+ * `profileId`, `accountId` (the ads connection) and `username`; and the
22039
22087
  * same-token platforms (`facebook`, `instagram`, `linkedin`, `pinterest`)
22040
22088
  * append `connected`, `profileId`, `accountId`, `username` and, on API-key
22041
22089
  * calls, `connect_token`. On failure the same error contract applies as on
22042
22090
  * GET /v1/connect/{platform}: `error` and `platform` are always appended,
22043
22091
  * other params are optional, and the value list there is not exhaustive.
22044
- * On the tiktok, twitter and googleads flows `platform` carries
22045
- * the ads platform id (`tiktokads`, `xads`, `googleads`), not the value
22092
+ * On the tiktok, twitter, googleads and redditads flows `platform` carries
22093
+ * the ads platform id (`tiktokads`, `xads`, `googleads`, `redditads`), not the value
22046
22094
  * used in the request path. When omitted, the browser lands on
22047
22095
  * the Zernio dashboard.
22048
22096
  *
@@ -39932,7 +39980,7 @@ type ListAdsData = {
39932
39980
  * Meta only: Facebook Page ID. Returns only ads whose creative is backed by this Page (a Meta ad account serves ads for every Page in the Business Manager). Matches each ad's `creative.pageId`; ads with no page signal (rare IG-only creatives) never match. Mirrors the same filter on /v1/ads/campaigns and /v1/ads/tree.
39933
39981
  */
39934
39982
  pageId?: string;
39935
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
39983
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
39936
39984
  /**
39937
39985
  * Meta ad ID. Returns the ad with this platform-side ad ID.
39938
39986
  */
@@ -40609,7 +40657,7 @@ type ListAdCampaignsData = {
40609
40657
  includeEmpty?: boolean;
40610
40658
  limit?: number;
40611
40659
  /**
40612
- * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description.
40660
+ * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description. On X the budget is read live in the same read: on GET /v1/ads/{adId} `budget`, `adSetBudget`, `campaignBudget` and `budgetLevel` are the line item and campaign budgets X holds now (stored like the switches); on the ad set and campaign listings `budget` is the one that line item or campaign holds now (returned, not stored); a row whose budget the other level holds keeps its synced `budget`.
40613
40661
  */
40614
40662
  live?: boolean;
40615
40663
  /**
@@ -40624,7 +40672,7 @@ type ListAdCampaignsData = {
40624
40672
  * Meta only: Facebook Page ID. Campaigns have no Page of their own, so this keeps campaigns having at least one ad backed by this Page, with adCount and metrics computed over those ads only. Mirrors the same filter on /v1/ads and /v1/ads/tree.
40625
40673
  */
40626
40674
  pageId?: string;
40627
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
40675
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
40628
40676
  /**
40629
40677
  * Profile ID
40630
40678
  */
@@ -40683,6 +40731,14 @@ type CreateAdCampaignData = {
40683
40731
  budgetAmount?: number;
40684
40732
  budgetType?: 'daily' | 'lifetime';
40685
40733
  status?: 'ACTIVE' | 'PAUSED';
40734
+ /**
40735
+ * Reddit only (400 elsewhere). Campaign start (ISO 8601); a value without an offset is read in the ad account time zone. Requires a campaign budget (`budgetAmount` + `budgetType`, 400 otherwise). Defaults to now.
40736
+ */
40737
+ startDate?: string;
40738
+ /**
40739
+ * Reddit only (400 elsewhere). Campaign end (ISO 8601); a value without an offset is read in the ad account time zone. Requires a campaign budget (400 otherwise), and is required for `budgetType: lifetime`.
40740
+ */
40741
+ endDate?: string;
40686
40742
  /**
40687
40743
  * Google only (400 elsewhere). Written on the new campaign.
40688
40744
  */
@@ -40745,7 +40801,7 @@ type CreateAdCampaignError = (unknown | ErrorResponse);
40745
40801
  type UpdateAdCampaignStatusData = {
40746
40802
  body: {
40747
40803
  status: 'active' | 'paused';
40748
- platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
40804
+ platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
40749
40805
  };
40750
40806
  path: {
40751
40807
  /**
@@ -40760,7 +40816,7 @@ type UpdateAdCampaignStatusResponse = ({
40760
40816
  */
40761
40817
  status?: 'active' | 'paused';
40762
40818
  /**
40763
- * The campaign's own switch as read back from the platform, in the raw platform vocabulary (Meta effective_status, TikTok ENABLE / DISABLE, Google ENABLED / PAUSED, ChatGPT (OpenAI) status). Null when the platform could not be read, which is always the case on Pinterest, LinkedIn and X (no single-campaign read).
40819
+ * The campaign's own switch as read back from the platform, in the raw platform vocabulary (Meta effective_status, TikTok ENABLE / DISABLE, Google ENABLED / PAUSED, ChatGPT (OpenAI) status, Reddit configured_status). Null when the platform could not be read, which is always the case on Pinterest, LinkedIn and X (no single-campaign read).
40764
40820
  */
40765
40821
  platformCampaignStatus?: (string) | null;
40766
40822
  /**
@@ -40962,7 +41018,7 @@ type UpdateAdCampaignData = {
40962
41018
  /**
40963
41019
  * Required: platform campaign IDs are not globally unique.
40964
41020
  */
40965
- platform: 'facebook' | 'instagram' | 'google';
41021
+ platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
40966
41022
  /**
40967
41023
  * **Meta only.** Zernio SocialAccount id owning the ad account. Needed only for an EMPTY campaign (zero ads); ignored otherwise.
40968
41024
  */
@@ -41006,7 +41062,7 @@ type UpdateAdCampaignData = {
41006
41062
  */
41007
41063
  sharedBudgetId?: (string) | null;
41008
41064
  /**
41009
- * Meta CBO, Google daily, or OpenAI Ads daily or lifetime campaign budget, in whole currency units.
41065
+ * Meta CBO, Google daily, or OpenAI Ads or Reddit Ads daily or lifetime campaign budget, in whole currency units.
41010
41066
  */
41011
41067
  budget?: {
41012
41068
  /**
@@ -41016,7 +41072,7 @@ type UpdateAdCampaignData = {
41016
41072
  type: 'daily' | 'lifetime';
41017
41073
  };
41018
41074
  /**
41019
- * **Meta only.** Rename the campaign.
41075
+ * **Meta and Reddit.** Rename the campaign.
41020
41076
  */
41021
41077
  name?: string;
41022
41078
  /**
@@ -41066,11 +41122,15 @@ type UpdateAdCampaignResponse = ({
41066
41122
  type UpdateAdCampaignError = (unknown | ErrorResponse);
41067
41123
  type DeleteAdCampaignData = {
41068
41124
  body: {
41069
- platform: 'facebook' | 'instagram' | 'google';
41125
+ platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
41070
41126
  /**
41071
41127
  * Zernio SocialAccount id owning the ad account. Required only to delete an EMPTY campaign (zero ads), which has no local Ad documents to resolve a token from.
41072
41128
  */
41073
41129
  accountId?: string;
41130
+ /**
41131
+ * X only, for an EMPTY campaign that was never synced: the X ad account id the campaign belongs to (lowercase letters and digits). The synced campaign's ad account wins when there is one. Also accepted on the query string.
41132
+ */
41133
+ adAccountId?: string;
41074
41134
  };
41075
41135
  path: {
41076
41136
  /**
@@ -41098,7 +41158,7 @@ type ListCampaignNegativeKeywordsData = {
41098
41158
  /**
41099
41159
  * Optional and NOT authoritative: the resolved campaign's own platform decides 200 vs 501, never this hint.
41100
41160
  */
41101
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
41161
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
41102
41162
  };
41103
41163
  };
41104
41164
  type ListCampaignNegativeKeywordsResponse = ({
@@ -41122,7 +41182,7 @@ type ReplaceCampaignNegativeKeywordsData = {
41122
41182
  /**
41123
41183
  * Optional and NOT authoritative: the resolved campaign's own platform decides 200 vs 501, never this hint.
41124
41184
  */
41125
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
41185
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
41126
41186
  keywords: Array<KeywordEntry>;
41127
41187
  };
41128
41188
  path: {
@@ -41162,7 +41222,7 @@ type BulkUpdateAdCampaignStatusData = {
41162
41222
  /**
41163
41223
  * The ad platform, e.g. `google` for Google Ads. The ads connection slug (`googleads`, `tiktokads`, ...) is accepted as an alias. `metaads` is not: send `facebook` or `instagram`.
41164
41224
  */
41165
- platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'googleads' | 'tiktokads' | 'linkedinads' | 'pinterestads' | 'xads' | 'openaiads';
41225
+ platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit' | 'googleads' | 'tiktokads' | 'linkedinads' | 'pinterestads' | 'xads' | 'openaiads' | 'redditads';
41166
41226
  }>;
41167
41227
  };
41168
41228
  };
@@ -41502,10 +41562,10 @@ type ListAdSetsData = {
41502
41562
  */
41503
41563
  campaignId?: string;
41504
41564
  /**
41505
- * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description.
41565
+ * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description. On X the budget is read live in the same read: on GET /v1/ads/{adId} `budget`, `adSetBudget`, `campaignBudget` and `budgetLevel` are the line item and campaign budgets X holds now (stored like the switches); on the ad set and campaign listings `budget` is the one that line item or campaign holds now (returned, not stored); a row whose budget the other level holds keeps its synced `budget`.
41506
41566
  */
41507
41567
  live?: boolean;
41508
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
41568
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
41509
41569
  };
41510
41570
  };
41511
41571
  type ListAdSetsResponse = ({
@@ -41527,11 +41587,11 @@ type ListAdSetsResponse = ({
41527
41587
  amount?: number;
41528
41588
  type?: 'daily' | 'lifetime';
41529
41589
  /**
41530
- * LinkedIn only. The campaign's `dailyBudget`. LinkedIn allows a daily AND a lifetime budget on the same campaign, which `amount`/`type` cannot express (daily wins there); read `daily` and `lifetime` to see both.
41590
+ * LinkedIn and X only. The daily budget (LinkedIn: the campaign's `dailyBudget`; X: the line item's `daily_budget_amount_local_micro`). Both allow a daily AND a lifetime budget together, which `amount`/`type` cannot express (daily wins there); read `daily` and `lifetime` to see both.
41531
41591
  */
41532
41592
  daily?: number;
41533
41593
  /**
41534
- * LinkedIn only. The campaign's `totalBudget`, readable even when a daily budget is also set.
41594
+ * LinkedIn and X only. The lifetime total (LinkedIn: the campaign's `totalBudget`; X: the line item's `total_budget_amount_local_micro`), readable even when a daily budget is also set.
41535
41595
  */
41536
41596
  lifetime?: number;
41537
41597
  /**
@@ -41651,7 +41711,7 @@ type CreateAdSetData = {
41651
41711
  /**
41652
41712
  * Only "google" is implemented today; every other value returns 501.
41653
41713
  */
41654
- platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
41714
+ platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
41655
41715
  /**
41656
41716
  * Google platform campaign ID (numeric) the ad group is created under.
41657
41717
  */
@@ -41826,7 +41886,7 @@ type GetAdSetDetailsResponse = ({
41826
41886
  type GetAdSetDetailsError = (unknown | ErrorResponse);
41827
41887
  type UpdateAdSetData = {
41828
41888
  body: {
41829
- platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
41889
+ platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
41830
41890
  /**
41831
41891
  * Omit if not updating budget
41832
41892
  */
@@ -41835,11 +41895,11 @@ type UpdateAdSetData = {
41835
41895
  type?: 'daily' | 'lifetime';
41836
41896
  };
41837
41897
  /**
41838
- * Writes the ad set's own on/off switch (Meta: `configured_status`) on Meta and LinkedIn, whatever delivery status its ads report. Omit if not toggling delivery state.
41898
+ * Writes the ad set's own on/off switch (Meta: `configured_status`; X: the line item's `entity_status` ACTIVE / PAUSED), whatever delivery status its ads report. Omit if not toggling delivery state.
41839
41899
  */
41840
41900
  status?: 'active' | 'paused';
41841
41901
  /**
41842
- * Rename the ad set (Meta only; other platforms return 501). At least one of budget/status/bidStrategy/name is required.
41902
+ * Rename the ad set (on X, the line item `name`). Platforms without a rename return 501. At least one of budget/status/bidStrategy/name is required.
41843
41903
  */
41844
41904
  name?: string;
41845
41905
  /**
@@ -41849,8 +41909,14 @@ type UpdateAdSetData = {
41849
41909
  * automatically. On OpenAI, LOWEST_COST_WITH_BID_CAP and COST_CAP both map to
41850
41910
  * the ad group's `bidding_config.max_bid_micros` (one knob covers both);
41851
41911
  * LOWEST_COST_WITH_MIN_ROAS is rejected with 422 (OpenAI has no ROAS-based
41852
- * bidding). Other platforms (linkedin, pinterest, google, twitter) return 501
41853
- * Not Implemented when bidStrategy is set.
41912
+ * bidding). On X it writes the line item's `bid_strategy`:
41913
+ * LOWEST_COST_WITHOUT_CAP = AUTO, LOWEST_COST_WITH_BID_CAP = MAX and
41914
+ * COST_CAP = TARGET, with `bidAmount` as `bid_amount_local_micro`;
41915
+ * LOWEST_COST_WITH_MIN_ROAS is rejected with 422. X decides which strategy
41916
+ * the line item's objective allows (TARGET only on REACH, FOLLOWERS and
41917
+ * WEBSITE_CLICKS, MAX not on REACH or FOLLOWERS). On Reddit, see the mapping in the
41918
+ * description above (LOWEST_COST_WITH_MIN_ROAS returns 422). Other platforms
41919
+ * (linkedin, pinterest, google) return 501 Not Implemented when bidStrategy is set.
41854
41920
  *
41855
41921
  */
41856
41922
  bidStrategy?: (BidStrategy);
@@ -41877,7 +41943,7 @@ type UpdateAdSetData = {
41877
41943
  /**
41878
41944
  * Bid cap in WHOLE currency units (USD: 5 = $5.00; JPY: 100 = ¥100). Required when
41879
41945
  * bidStrategy is LOWEST_COST_WITH_BID_CAP or COST_CAP. Internally converted to Meta's
41880
- * smallest-denomination integer, or (on OpenAI) to micros (× 1,000,000). Meta only:
41946
+ * smallest-denomination integer, or (on OpenAI and X) to micros (× 1,000,000). Meta only:
41881
41947
  * may be sent alone, WITHOUT bidStrategy, to update the cap amount on an ad set whose
41882
41948
  * parent campaign is COST_CAP or LOWEST_COST_WITH_BID_CAP (the strategy is inherited
41883
41949
  * from the campaign and is left untouched).
@@ -42028,7 +42094,7 @@ type DeleteAdSetError = (ErrorResponse | unknown);
42028
42094
  type UpdateAdSetStatusData = {
42029
42095
  body: {
42030
42096
  status: 'active' | 'paused';
42031
- platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
42097
+ platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
42032
42098
  };
42033
42099
  path: {
42034
42100
  /**
@@ -42043,7 +42109,7 @@ type UpdateAdSetStatusResponse = ({
42043
42109
  */
42044
42110
  status?: 'active' | 'paused';
42045
42111
  /**
42046
- * The ad set's own switch as read back from the platform, in the raw platform vocabulary (Meta effective_status, TikTok ENABLE / DISABLE, Google ENABLED / PAUSED, LinkedIn and Pinterest ACTIVE / PAUSED, ChatGPT (OpenAI) status). Null when the platform could not be read, which is always the case on X.
42112
+ * The ad set's own switch as read back from the platform, in the raw platform vocabulary (Meta effective_status, TikTok ENABLE / DISABLE, Google ENABLED / PAUSED, LinkedIn and Pinterest ACTIVE / PAUSED, ChatGPT (OpenAI) status, Reddit configured_status). Null when the platform could not be read, which is always the case on X.
42047
42113
  */
42048
42114
  platformAdSetStatus?: (string) | null;
42049
42115
  /**
@@ -42110,7 +42176,7 @@ type GetAdTreeData = {
42110
42176
  * Meta only: Facebook Page ID. Prunes the tree to ads whose creative is backed by this Page: campaigns and ad sets with no ad on the Page drop out, and rolled-up metrics cover only the Page's ads. Mirrors the same filter on /v1/ads and /v1/ads/campaigns.
42111
42177
  */
42112
42178
  pageId?: string;
42113
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
42179
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
42114
42180
  /**
42115
42181
  * Profile ID
42116
42182
  */
@@ -42169,7 +42235,7 @@ type GetAdsTimelineData = {
42169
42235
  /**
42170
42236
  * Restrict to one platform.
42171
42237
  */
42172
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
42238
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
42173
42239
  /**
42174
42240
  * Inclusive end of metrics range (YYYY-MM-DD). Defaults to today. Max 730-day range.
42175
42241
  */
@@ -42193,7 +42259,7 @@ type GetAdData = {
42193
42259
  };
42194
42260
  query?: {
42195
42261
  /**
42196
- * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description.
42262
+ * Read the on/off switches live from the platform instead of returning the synced values. The fresh values are stored (so later reads return them too) and the response carries `statusReadAt`, the time of the read. At most 20 platform objects are read per request. Where a read fails (credentials, platform error, no reader on that platform), the stored values come back with `statusReadAt: null`. See "Status freshness" in the operation description. On X the budget is read live in the same read: on GET /v1/ads/{adId} `budget`, `adSetBudget`, `campaignBudget` and `budgetLevel` are the line item and campaign budgets X holds now (stored like the switches); on the ad set and campaign listings `budget` is the one that line item or campaign holds now (returned, not stored); a row whose budget the other level holds keeps its synced `budget`.
42197
42263
  */
42198
42264
  live?: boolean;
42199
42265
  };
@@ -44953,7 +45019,7 @@ type ListAdNegativeKeywordListsData = {
44953
45019
  * @deprecated
44954
45020
  */
44955
45021
  customerId?: string;
44956
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45022
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
44957
45023
  };
44958
45024
  };
44959
45025
  type ListAdNegativeKeywordListsResponse = ({
@@ -44990,7 +45056,7 @@ type CreateAdNegativeKeywordListData = {
44990
45056
  /**
44991
45057
  * Optional courtesy field. The resolved account or campaign determines support; other platforms return 501.
44992
45058
  */
44993
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45059
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
44994
45060
  /**
44995
45061
  * Nonempty list name, trimmed before use.
44996
45062
  */
@@ -45031,7 +45097,7 @@ type GetAdNegativeKeywordListData = {
45031
45097
  * @deprecated
45032
45098
  */
45033
45099
  customerId?: string;
45034
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45100
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
45035
45101
  };
45036
45102
  };
45037
45103
  type GetAdNegativeKeywordListResponse = ({
@@ -45070,7 +45136,7 @@ type UpdateAdNegativeKeywordListData = {
45070
45136
  /**
45071
45137
  * Optional courtesy field. The resolved account or campaign determines support; other platforms return 501.
45072
45138
  */
45073
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45139
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
45074
45140
  /**
45075
45141
  * Nonempty list name, trimmed before use.
45076
45142
  */
@@ -45099,7 +45165,7 @@ type DeleteAdNegativeKeywordListData = {
45099
45165
  * @deprecated
45100
45166
  */
45101
45167
  customerId?: string;
45102
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45168
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
45103
45169
  };
45104
45170
  };
45105
45171
  type DeleteAdNegativeKeywordListResponse = ({
@@ -45128,7 +45194,7 @@ type ReplaceAdNegativeKeywordListKeywordsData = {
45128
45194
  /**
45129
45195
  * Optional courtesy field. The resolved account or campaign determines support; other platforms return 501.
45130
45196
  */
45131
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45197
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
45132
45198
  /**
45133
45199
  * Full desired keyword set. Bare strings use broad match. Send [] to clear the list.
45134
45200
  */
@@ -45158,7 +45224,7 @@ type ListCampaignNegativeKeywordListsData = {
45158
45224
  campaignId: string;
45159
45225
  };
45160
45226
  query?: {
45161
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45227
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
45162
45228
  };
45163
45229
  };
45164
45230
  type ListCampaignNegativeKeywordListsResponse = ({
@@ -45182,7 +45248,7 @@ type ReplaceCampaignNegativeKeywordListsData = {
45182
45248
  /**
45183
45249
  * Optional courtesy field. The resolved account or campaign determines support; other platforms return 501.
45184
45250
  */
45185
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45251
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
45186
45252
  listIds: Array<(string)>;
45187
45253
  };
45188
45254
  path: {
@@ -46130,9 +46196,17 @@ type ListAdAccountsResponse = ({
46130
46196
  */
46131
46197
  accountStatus?: unknown;
46132
46198
  /**
46133
- * X only. X's own ad account approval status. Observed values are `ACCEPTED`, `PENDING` and `REJECTED`, but X does not publish the full vocabulary, so treat an unrecognised value as not usable. Other platforms report `accountStatus` or `status` instead.
46199
+ * X and Reddit only. X's own ad account approval status, or Reddit's `admin_approval`. Observed X values are `ACCEPTED`, `PENDING` and `REJECTED`, but X does not publish the full vocabulary, so treat an unrecognised value as not usable. Other platforms report `accountStatus` or `status` instead.
46134
46200
  */
46135
46201
  approvalStatus?: string;
46202
+ /**
46203
+ * Reddit only. The ad account's time zone as Reddit reports it (`time_zone_id`). Schedules on Reddit ads are read in this zone.
46204
+ */
46205
+ timezone?: string;
46206
+ /**
46207
+ * Reddit only. Reddit's ad account type, forwarded unchanged.
46208
+ */
46209
+ type?: string;
46136
46210
  /**
46137
46211
  * Meta only. Meta's `disable_reason` code, forwarded unchanged. Present when `accountStatus` is `2` (DISABLED) and Meta gives a reason, which is what separates a policy action from a payment problem. Meta does not publish a stable list of values for this field, so none are enumerated here: resolve the code against Meta's own ad account reference. Absent when Meta reports no reason, or when the connected token cannot read the field.
46138
46212
  */
@@ -46337,11 +46411,11 @@ type BoostPostData = {
46337
46411
  */
46338
46412
  postId?: string;
46339
46413
  /**
46340
- * Platform post ID (alternative to postId). Meta: a Page post id (`<pageId>_<postId>` or the bare post id) or an Instagram media id. On a Meta Ads business-login connection (platform metaads) the id is resolved live: an Instagram media id is boosted as that media, running as the Instagram account that owns it.
46414
+ * Platform post ID (alternative to postId). Reddit: the post id, with or without the `t3_` prefix. Meta: a Page post id (`<pageId>_<postId>` or the bare post id) or an Instagram media id. On a Meta Ads business-login connection (platform metaads) the id is resolved live: an Instagram media id is boosted as that media, running as the Instagram account that owns it.
46341
46415
  */
46342
46416
  platformPostId?: string;
46343
46417
  /**
46344
- * Zernio account id. Normally the connected posting account (facebook, instagram, tiktok, linkedin, pinterest, twitter) or a googleads account. TikTok: the TikTok Ads connection (platform tiktokads) is accepted too when the post brings its own authorization (sparkAuthCode or sparkPosts), so Spark ads need no organic TikTok account connected; such a call must use platformPostId, not postId.
46418
+ * Zernio account id. Normally the connected posting account (facebook, instagram, tiktok, linkedin, pinterest, twitter), a googleads account or a redditads account. TikTok: the TikTok Ads connection (platform tiktokads) is accepted too when the post brings its own authorization (sparkAuthCode or sparkPosts), so Spark ads need no organic TikTok account connected; such a call must use platformPostId, not postId.
46345
46419
  */
46346
46420
  accountId: string;
46347
46421
  /**
@@ -46358,7 +46432,7 @@ type BoostPostData = {
46358
46432
  */
46359
46433
  adSetName?: string;
46360
46434
  /**
46361
- * Available goals vary by platform. Meta (Facebook/Instagram) and TikTok support all 7. LinkedIn supports all except app_promotion. X supports engagement, traffic, awareness, video_views, app_promotion. Pinterest and Google Ads support only engagement, traffic, awareness, video_views.
46435
+ * Available goals vary by platform. Meta (Facebook/Instagram) and TikTok support all 7. LinkedIn supports all except app_promotion. X supports engagement, traffic, awareness, video_views, app_promotion. Pinterest and Google Ads support only engagement, traffic, awareness, video_views. Reddit supports traffic, awareness, video_views, lead_generation and conversions.
46362
46436
  */
46363
46437
  goal: 'engagement' | 'traffic' | 'awareness' | 'video_views' | 'lead_generation' | 'conversions' | 'app_promotion';
46364
46438
  /**
@@ -46385,6 +46459,10 @@ type BoostPostData = {
46385
46459
  * Goes together with budgetAmount. lifetime requires schedule.endDate.
46386
46460
  */
46387
46461
  budgetType?: 'daily' | 'lifetime';
46462
+ /**
46463
+ * X only. A lifetime total, in whole currency units, that caps a daily budget (budgetType daily): the line item gets both daily_budget_amount_local_micro and total_budget_amount_local_micro, and stops spending once the total is reached. Must be at least budgetAmount. Read back as budget.daily and budget.lifetime. 400 on a lifetime budget or on another platform.
46464
+ */
46465
+ lifetimeBudgetCap?: number;
46388
46466
  /**
46389
46467
  * Alias of budgetAmount + budgetType, kept for existing callers
46390
46468
  * @deprecated
@@ -46417,11 +46495,11 @@ type BoostPostData = {
46417
46495
  */
46418
46496
  currency?: string;
46419
46497
  /**
46420
- * Ad-set start time (ISO 8601, e.g. "2026-06-10T09:00:00Z"), mapped to the ad set's `start_time`. When omitted the ad starts delivering immediately. On Meta, TikTok, X and Pinterest a value without an offset (`YYYY-MM-DD`, `YYYY-MM-DD HH:MM:SS` or `YYYY-MM-DDTHH:MM:SS`) is read in the ad account timezone. Same field as on POST /v1/ads/create.
46498
+ * Ad-set start time (ISO 8601, e.g. "2026-06-10T09:00:00Z"), mapped to the ad set's `start_time`. When omitted the ad starts delivering immediately. On Meta, TikTok, X, Pinterest and Reddit a value without an offset (`YYYY-MM-DD`, `YYYY-MM-DD HH:MM:SS` or `YYYY-MM-DDTHH:MM:SS`) is read in the ad account timezone. Same field as on POST /v1/ads/create.
46421
46499
  */
46422
46500
  startDate?: string;
46423
46501
  /**
46424
- * Ad-set end time (ISO 8601), mapped to the ad set's `end_time`. Required for lifetime budgets. On Meta, TikTok, X and Pinterest a value without an offset (`YYYY-MM-DD`, `YYYY-MM-DD HH:MM:SS` or `YYYY-MM-DDTHH:MM:SS`) is read in the ad account timezone, and a date-only end runs to 23:59:59 local. Same field as on POST /v1/ads/create.
46502
+ * Ad-set end time (ISO 8601), mapped to the ad set's `end_time` (on X, the line item's `end_time`; X campaigns carry no flight dates). Required for lifetime budgets. On Meta, TikTok, X, Pinterest and Reddit a value without an offset (`YYYY-MM-DD`, `YYYY-MM-DD HH:MM:SS` or `YYYY-MM-DDTHH:MM:SS`) is read in the ad account timezone, and a date-only end runs to 23:59:59 local. Same field as on POST /v1/ads/create.
46425
46503
  */
46426
46504
  endDate?: string;
46427
46505
  /**
@@ -46445,18 +46523,22 @@ type BoostPostData = {
46445
46523
  * Geo keys (`regions`/`cities`/`zips`/`metros`) resolve via
46446
46524
  * GET /v1/ads/targeting/search?dimension=geo. City radius and lat/lng
46447
46525
  * `customLocations` are Meta-only and preserve the boosted post's
46448
- * social proof (the ad references the existing post).
46526
+ * social proof (the ad references the existing post). On Reddit the whole
46527
+ * `TargetingSpec` applies, including `communities`, `excludedCommunities`,
46528
+ * `conversationKeywords`, `excludedConversationKeywords`, `interests`,
46529
+ * `audienceInclude` / `audienceExclude` and `excludedLocations`; without
46530
+ * any geo the ad targets the US.
46449
46531
  *
46450
46532
  */
46451
46533
  targeting?: {
46452
46534
  ageMin?: number;
46453
46535
  ageMax?: number;
46454
46536
  /**
46455
- * Applied on Meta, TikTok and Pinterest. Ignored on Google, LinkedIn and X.
46537
+ * Applied on Meta, TikTok, Pinterest and Reddit. Ignored on Google, LinkedIn and X.
46456
46538
  */
46457
46539
  gender?: 'all' | 'male' | 'female';
46458
46540
  /**
46459
- * Meta locale ids (numeric), passed through as given.
46541
+ * Meta locale ids (numeric), passed through as given. Reddit: language codes (e.g. `en`).
46460
46542
  */
46461
46543
  languages?: Array<(string)>;
46462
46544
  /**
@@ -46555,7 +46637,9 @@ type BoostPostData = {
46555
46637
  * Deprecated: send it inside `platformSpecificData` instead (Meta today; TikTok's nested shape is planned). The flat field keeps working during the deprecation window; sending both shapes returns a 400.
46556
46638
  *
46557
46639
  * Meta bid strategy applied to the ad set. On TikTok, mapped to
46558
- * `bid_type` / `bid_price` / `deep_bid_type` automatically.
46640
+ * `bid_type` / `bid_price` / `deep_bid_type` automatically. On Reddit,
46641
+ * applied to the new ad group (see the Reddit section above; 422 for
46642
+ * LOWEST_COST_WITH_MIN_ROAS).
46559
46643
  *
46560
46644
  * @deprecated
46561
46645
  */
@@ -46594,7 +46678,7 @@ type BoostPostData = {
46594
46678
  */
46595
46679
  platformSpecificData?: (LinkedInAdsPlatformData | MetaAdsPlatformData);
46596
46680
  /**
46597
- * Meta only. Tracking specs (pixel, URL tags).
46681
+ * Meta only, except `pixelId`, which also picks the Reddit pixel of the new ad group (`promotedObject.pixelId` wins when both are sent). Tracking specs (pixel, URL tags).
46598
46682
  */
46599
46683
  tracking?: {
46600
46684
  pixelId?: string;
@@ -46637,6 +46721,8 @@ type BoostPostData = {
46637
46721
  * (`AdcreateCreatives.landing_page_url`); Spark Ads have no clickable
46638
46722
  * destination without it.
46639
46723
  *
46724
+ * **Reddit**: the ad's `click_url`, where a click on the promoted post lands.
46725
+ *
46640
46726
  * Ignored on LinkedIn / Pinterest / X / Google, which infer the destination
46641
46727
  * from the boosted post.
46642
46728
  *
@@ -46712,7 +46798,7 @@ type BoostPostData = {
46712
46798
  minimumPurchaseCurrency?: string;
46713
46799
  }>;
46714
46800
  /**
46715
- * Meta and TikTok. What the conversion ad set optimizes toward, so a boost
46801
+ * Meta, TikTok and Reddit. What the conversion ad set optimizes toward, so a boost
46716
46802
  * of an existing organic post can run for a conversion instead of only
46717
46803
  * engagement or traffic. Required when `goal` is `conversions` (Meta also
46718
46804
  * `lead_conversion`); ignored on goals that do not optimize for a conversion.
@@ -46731,10 +46817,17 @@ type BoostPostData = {
46731
46817
  * `platformPostId` + `sparkAuthCode`: the pixel lives on the ad group and
46732
46818
  * the Spark item on the creative.
46733
46819
  *
46820
+ * Reddit: every ad group carries a pixel, whatever the goal. `pixelId` picks
46821
+ * it (default: the ad account's first pixel; 422 when the account has none).
46822
+ * `conversions` requires `customEventType` (PURCHASE, LEAD,
46823
+ * COMPLETE_REGISTRATION, SIGN_UP, ADD_TO_CART, PAGE_VISIT, VIEW_CONTENT or
46824
+ * CONTENT_VIEW), and the pixel must already have received that event (422
46825
+ * otherwise); `lead_generation` needs the pixel to have received Lead.
46826
+ *
46734
46827
  */
46735
46828
  promotedObject?: {
46736
46829
  /**
46737
- * Meta Pixel id, or TikTok Pixel (numeric id or the alphanumeric pixel code from Events Manager, resolved for you).
46830
+ * Meta Pixel id, TikTok Pixel (numeric id or the alphanumeric pixel code from Events Manager, resolved for you), or Reddit pixel id.
46738
46831
  */
46739
46832
  pixelId?: string;
46740
46833
  /**
@@ -46767,7 +46860,7 @@ type BoostPostData = {
46767
46860
  */
46768
46861
  dsaPayor?: string;
46769
46862
  /**
46770
- * Lead Gen form ID to attach to the boosted ad's creative. REQUIRED when `goal` is `lead_generation`. On Meta this is the leadgen_forms ID (create one via POST /v1/ads/lead-forms). On LinkedIn this is the adForm ID (create one via POST /v1/ads/lead-forms with a LinkedIn account); the creative's `leadgenCallToAction.destination` is set to `urn:li:adForm:{id}`. Ignored for other goals.
46863
+ * Lead Gen form ID to attach to the boosted ad's creative. REQUIRED when `goal` is `lead_generation`. On Meta this is the leadgen_forms ID (create one via POST /v1/ads/lead-forms). On LinkedIn this is the adForm ID (create one via POST /v1/ads/lead-forms with a LinkedIn account); the creative's `leadgenCallToAction.destination` is set to `urn:li:adForm:{id}`. Ignored for other goals. Reddit: rejected with 400 on every goal (Reddit retired its native lead forms).
46771
46864
  */
46772
46865
  leadGenFormId?: string;
46773
46866
  /**
@@ -47041,11 +47134,11 @@ type CreateStandaloneAdData = {
47041
47134
  adAccountId: string;
47042
47135
  name: string;
47043
47136
  /**
47044
- * Meta only. Exact campaign name. Overrides the default `<name> - Campaign`.
47137
+ * Meta and Reddit. Exact campaign name. Overrides the default `<name> - Campaign`.
47045
47138
  */
47046
47139
  campaignName?: string;
47047
47140
  /**
47048
- * Meta only. Exact ad set name. Overrides the default `<name> - Ad Set`. (For per-ad names on the multi-creative shape, set `name` on each `creatives[]` entry.)
47141
+ * Meta and Reddit (the ad group). Exact ad set name. Overrides the default `<name> - Ad Set`. (For per-ad names on the multi-creative shape, set `name` on each `creatives[]` entry.)
47049
47142
  */
47050
47143
  adSetName?: string;
47051
47144
  /**
@@ -47077,6 +47170,12 @@ type CreateStandaloneAdData = {
47077
47170
  * **OpenAI Ads**
47078
47171
  * - Only `traffic`, `awareness`, and `conversions` are supported (other goals return 400). Maps to OpenAI's `bidding_type` (clicks, impressions, conversions respectively). `conversions` requires an active conversion event setting on the account; create a tracking tag with `defaultEventType` via the tracking-tags API (`POST /v1/accounts/{accountId}/tracking-tags`), or configure a conversion event in OpenAI Ads Manager, or the request returns 400. Pick the event with `promotedObject.customEventType` (see AdPromotedObject); without it the most recently created optimizable event is used.
47079
47172
  *
47173
+ * **Reddit Ads**
47174
+ * - `traffic` (CLICKS), `awareness` (BRAND_AWARENESS), `conversions`, `video_views` (VIDEO_VIEWABLE_IMPRESSIONS) and `lead_generation` (LEAD_GENERATION); any other goal returns 400.
47175
+ * - `conversions` requires `promotedObject.customEventType`; the pixel must already have received that event (see AdPromotedObject).
47176
+ * - `lead_generation` sends people to `linkUrl` and optimizes toward the pixel's Lead event, which the pixel must already have received. Reddit retired its native lead forms on September 30, 2026, so `leadGenFormId` returns 400.
47177
+ * - `video_views` needs a `video` (422 otherwise); `optimizationGoal` picks VIDEO_VIEW_6S (default) or VIDEO_VIEW_15S.
47178
+ *
47080
47179
  */
47081
47180
  goal?: 'engagement' | 'traffic' | 'awareness' | 'video_views' | 'lead_generation' | 'lead_conversion' | 'conversions' | 'app_promotion' | 'catalog_sales' | 'page_likes' | 'page_visits' | 'job_applicants';
47082
47181
  /**
@@ -47100,7 +47199,7 @@ type CreateStandaloneAdData = {
47100
47199
  interestsBehaviors?: boolean;
47101
47200
  };
47102
47201
  /**
47103
- * Meta, or TikTok with goal video_views (ENGAGED_VIEW, the 6-second default, or ENGAGED_VIEW_FIFTEEN; both bill per view). Meta: Explicit ad-set `optimization_goal` (e.g. `LANDING_PAGE_VIEWS`, `LINK_CLICKS`, `REACH`, `IMPRESSIONS`, `OFFSITE_CONVERSIONS`, `THRUPLAY`, `LEAD_GENERATION`). Overrides the default derived from `goal` (e.g. `traffic` defaults to `LINK_CLICKS`). Forwarded verbatim to Meta, which validates compatibility with the campaign objective and rejects incompatible combinations.
47202
+ * Meta, TikTok with goal video_views (ENGAGED_VIEW, the 6-second default, or ENGAGED_VIEW_FIFTEEN; both bill per view), or Reddit with goal video_views (VIDEO_VIEW_6S, the default, or VIDEO_VIEW_15S; other values return 400). Meta: Explicit ad-set `optimization_goal` (e.g. `LANDING_PAGE_VIEWS`, `LINK_CLICKS`, `REACH`, `IMPRESSIONS`, `OFFSITE_CONVERSIONS`, `THRUPLAY`, `LEAD_GENERATION`). Overrides the default derived from `goal` (e.g. `traffic` defaults to `LINK_CLICKS`). Forwarded verbatim to Meta, which validates compatibility with the campaign objective and rejects incompatible combinations.
47104
47203
  */
47105
47204
  optimizationGoal?: string;
47106
47205
  /**
@@ -47140,7 +47239,7 @@ type CreateStandaloneAdData = {
47140
47239
  */
47141
47240
  budgetAmount?: number;
47142
47241
  /**
47143
- * Required on legacy, multi-creative and Performance Max shapes. Inherited on attach. OpenAI Ads accepts both as the campaign's single spend cap. A lifetime cap can later switch to daily with PUT /v1/ads/campaigns/{campaignId}, but OpenAI never switches a daily cap back to lifetime (422). Automatic bidding (Maximize Results) needs a daily budget.
47242
+ * Required on legacy, multi-creative and Performance Max shapes. Inherited on attach. OpenAI Ads accepts both as the campaign's single spend cap. A lifetime cap can later switch to daily with PUT /v1/ads/campaigns/{campaignId}, but OpenAI never switches a daily cap back to lifetime (422). Automatic bidding (Maximize Results) needs a daily budget. Reddit Ads: the ad group's daily or lifetime spend goal; lifetime needs `endDate`.
47144
47243
  */
47145
47244
  budgetType?: 'daily' | 'lifetime';
47146
47245
  /**
@@ -47188,7 +47287,7 @@ type CreateStandaloneAdData = {
47188
47287
  */
47189
47288
  currency?: string;
47190
47289
  /**
47191
- * Required for Meta, Google, Pinterest, LinkedIn, and OpenAI Ads on legacy + attach shapes (skip for multi-creative; use `creatives[].headline`). Ignored for TikTok. On X, the website card title (needs imageUrl and linkUrl, max 70). Max: Meta=255, Google=30, Pinterest=100, LinkedIn=400, OpenAI=50 (min 3). On LinkedIn this is the ad's headline (the bold text on the creative); for traffic ads it's the link card title. On OpenAI Ads this is the chat card's title.
47290
+ * Required for Meta, Google, Pinterest, LinkedIn, OpenAI Ads and Reddit Ads on legacy + attach shapes (skip for multi-creative; use `creatives[].headline`). Ignored for TikTok. On X, the website card title (needs imageUrl and linkUrl, max 70). Max: Meta=255, Google=30, Pinterest=100, LinkedIn=400, OpenAI=50 (min 3), Reddit=300 (the promoted post's title). On LinkedIn this is the ad's headline (the bold text on the creative); for traffic ads it's the link card title. On OpenAI Ads this is the chat card's title.
47192
47291
  */
47193
47292
  headline?: string;
47194
47293
  /**
@@ -47196,7 +47295,7 @@ type CreateStandaloneAdData = {
47196
47295
  */
47197
47296
  longHeadline?: string;
47198
47297
  /**
47199
- * Required on legacy + attach shapes. For X this is the tweet text (max 280 chars including a ~24-char URL when `linkUrl` is set). On LinkedIn this is the post commentary (the intro text shown above the ad). On OpenAI Ads this is the chat card's body text. Max: Google=90, Pinterest=500, OpenAI=100.
47298
+ * Required on legacy + attach shapes. For X this is the tweet text (max 280 chars including a ~24-char URL when `linkUrl` is set). On LinkedIn this is the post commentary (the intro text shown above the ad). On OpenAI Ads this is the chat card's body text. On Reddit it is the promoted post's body: optional on image, video and carousel ads, required on text ads. Max: Google=90, Pinterest=500, OpenAI=100.
47200
47299
  */
47201
47300
  body?: string;
47202
47301
  /**
@@ -47233,19 +47332,19 @@ type CreateStandaloneAdData = {
47233
47332
  */
47234
47333
  descriptions?: Array<(string)>;
47235
47334
  /**
47236
- * Required on legacy + attach shapes for Meta. Honoured on TikTok (passes through to the Spark Ad creative's `call_to_action`) and on LinkedIn (the CTA button on the ad; defaults to LEARN_MORE when `linkUrl` is set). LinkedIn accepts: LEARN_MORE, SIGN_UP, DOWNLOAD, SUBSCRIBE, REGISTER, JOIN, ATTEND, REQUEST_DEMO, VIEW_QUOTE, APPLY, SEE_MORE, SHOP_NOW, BUY_NOW. Ignored by Google, Pinterest, and X.
47335
+ * Required on legacy + attach shapes for Meta. Honoured on TikTok (passes through to the Spark Ad creative's `call_to_action`) and on LinkedIn (the CTA button on the ad; defaults to LEARN_MORE when `linkUrl` is set). LinkedIn accepts: LEARN_MORE, SIGN_UP, DOWNLOAD, SUBSCRIBE, REGISTER, JOIN, ATTEND, REQUEST_DEMO, VIEW_QUOTE, APPLY, SEE_MORE, SHOP_NOW, BUY_NOW. Reddit (image, video and carousel ads) accepts: LEARN_MORE, SHOP_NOW, SIGN_UP, CONTACT_US, DOWNLOAD, GET_QUOTE, SUBSCRIBE, APPLY_NOW, BOOK_NOW, BUY_TICKETS, DONATE_NOW, GET_DIRECTIONS, GET_SHOWTIMES, LISTEN_NOW, ORDER_NOW, SEE_MENU, INSTALL_MOBILE_APP (other values return 400). Ignored by Google, Pinterest, and X.
47237
47336
  */
47238
47337
  callToAction?: 'LEARN_MORE' | 'SHOP_NOW' | 'SIGN_UP' | 'BOOK_TRAVEL' | 'CONTACT_US' | 'DOWNLOAD' | 'GET_OFFER' | 'GET_QUOTE' | 'SUBSCRIBE' | 'WATCH_MORE' | 'ADD_TO_CART' | 'APPLY_NOW' | 'BOOK_NOW' | 'BUY_TICKETS' | 'DONATE' | 'DONATE_NOW' | 'GET_DIRECTIONS' | 'GET_SHOWTIMES' | 'LISTEN_NOW' | 'ORDER_NOW' | 'PLAY_GAME' | 'REQUEST_TIME' | 'SEE_MENU' | 'START_ORDER' | 'INSTALL_MOBILE_APP' | 'USE_APP' | 'REGISTER' | 'JOIN' | 'ATTEND' | 'REQUEST_DEMO' | 'VIEW_QUOTE' | 'APPLY' | 'SEE_MORE' | 'BUY_NOW';
47239
47338
  /**
47240
- * Required on legacy + attach shapes (skip for multi-creative). On LinkedIn it's the ad's destination URL; required for `traffic` ads, optional for `engagement` / `awareness`. NOT required when `goal` is `lead_generation` (the ad opens a Lead Gen form instead of a destination). On LinkedIn, `imageUrl` + `linkUrl` publishes an ARTICLE-content creative; this is LinkedIn's article ad format, with the image as thumbnail and `longHeadline` as description. Required for OpenAI Ads (the chat card's target_url).
47339
+ * Required on legacy + attach shapes (skip for multi-creative). On LinkedIn it's the ad's destination URL; required for `traffic` ads, optional for `engagement` / `awareness`. NOT required when `goal` is `lead_generation` (the ad opens a Lead Gen form instead of a destination). On LinkedIn, `imageUrl` + `linkUrl` publishes an ARTICLE-content creative; this is LinkedIn's article ad format, with the image as thumbnail and `longHeadline` as description. Required for OpenAI Ads (the chat card's target_url). Reddit: required on image and video ads (the post's destination and the ad's click URL), the fallback for carousel cards without their own, and refused with 400 on text ads.
47241
47340
  */
47242
47341
  linkUrl?: string;
47243
47342
  /**
47244
- * Lead Gen form ID to attach to the ad's creative. REQUIRED when `goal` is `lead_generation`. Create one via POST /v1/ads/lead-forms. On Meta (facebook/instagram) this is the leadgen_forms ID; the ad set's promoted_object.page_id + LEAD_GENERATION optimization + destination_type ON_AD are derived automatically from the goal. On LinkedIn this is the adForm ID; the creative's `leadgenCallToAction.destination` is set to `urn:li:adForm:{id}` and the campaign objective is set to MAX_LEAD. Forms must be owned by the sponsoredAccount (not the organization) for the URN to resolve. Also required on every Meta ATTACH (`adSetId`) call that targets a lead ad set (the form attaches per-ad; Meta rejects a formless ad in a lead ad set). `placementAssets`, `dynamicCreative` and `carouselCards` (Meta multi-card Instant-Form lead ad; `linkUrl` and per-card `linkUrl` are optional and forwarded as real destinations when sent, falling back to Meta's lead-form link when omitted) ARE supported on Meta instant-form lead ads.
47343
+ * Lead Gen form ID to attach to the ad's creative. REQUIRED when `goal` is `lead_generation`. Create one via POST /v1/ads/lead-forms. On Meta (facebook/instagram) this is the leadgen_forms ID; the ad set's promoted_object.page_id + LEAD_GENERATION optimization + destination_type ON_AD are derived automatically from the goal. On LinkedIn this is the adForm ID; the creative's `leadgenCallToAction.destination` is set to `urn:li:adForm:{id}` and the campaign objective is set to MAX_LEAD. Forms must be owned by the sponsoredAccount (not the organization) for the URN to resolve. Also required on every Meta ATTACH (`adSetId`) call that targets a lead ad set (the form attaches per-ad; Meta rejects a formless ad in a lead ad set). `placementAssets`, `dynamicCreative` and `carouselCards` (Meta multi-card Instant-Form lead ad; `linkUrl` and per-card `linkUrl` are optional and forwarded as real destinations when sent, falling back to Meta's lead-form link when omitted) ARE supported on Meta instant-form lead ads. Reddit: rejected with 400 on every goal (Reddit retired its native lead forms).
47245
47344
  */
47246
47345
  leadGenFormId?: string;
47247
47346
  /**
47248
- * Image creative for Meta/Google/Pinterest/LinkedIn on legacy + attach shapes (mutually exclusive with `video`). Required for LinkedIn ads unless `video` is set. Not required for Google Search campaigns. For TikTok, this field carries the VIDEO URL (the TikTok ads endpoint is video-only; the field retains the `imageUrl` name for cross-platform consistency). On X, imageUrl + headline + linkUrl together build a website card (image, title and destination under the post; the URL is not added to the post text); sending only some of them is a 400. description, video and callToAction are rejected with 400 on X (promote a post that carries a video with POST /v1/ads/boost). For Google Display, treated as the landscape image (alias of `images.landscape`); supply `images.square` alongside or the request is rejected. For LinkedIn the image is uploaded to LinkedIn under the authoring Company Page (see `organizationId`); recommended ratio 1.91:1 (e.g. 1200×627). Required for OpenAI Ads (uploaded as the chat card's image; OpenAI has no video ad format).
47347
+ * Image creative for Meta/Google/Pinterest/LinkedIn on legacy + attach shapes (mutually exclusive with `video`). Required for LinkedIn ads unless `video` is set. Not required for Google Search campaigns. For TikTok, this field carries the VIDEO URL (the TikTok ads endpoint is video-only; the field retains the `imageUrl` name for cross-platform consistency). On X, imageUrl + headline + linkUrl together build a website card (image, title and destination under the post; the URL is not added to the post text); sending only some of them is a 400. description, video and callToAction are rejected with 400 on X (promote a post that carries a video with POST /v1/ads/boost). For Google Display, treated as the landscape image (alias of `images.landscape`); supply `images.square` alongside or the request is rejected. For LinkedIn the image is uploaded to LinkedIn under the authoring Company Page (see `organizationId`); recommended ratio 1.91:1 (e.g. 1200×627). Required for OpenAI Ads (uploaded as the chat card's image; OpenAI has no video ad format). Reddit: builds an image ad (requires `linkUrl`); on a Reddit video ad it is the fallback for `video.thumbnailUrl`.
47249
47348
  */
47250
47349
  imageUrl?: string;
47251
47350
  /**
@@ -47262,7 +47361,7 @@ type CreateStandaloneAdData = {
47262
47361
  square?: string;
47263
47362
  };
47264
47363
  /**
47265
- * Meta (facebook, instagram) and LinkedIn. Creates a single VIDEO ad. Mutually exclusive with `imageUrl`. Supply `url` to upload a file, or `id` to reuse a video already on the ad account (list them with GET /v1/ads/videos). Works on the single-ad and attach (`adSetId`) shapes; for Meta multi-creative, set `video` per entry inside `creatives[]` instead. For LinkedIn the video is uploaded to LinkedIn under the authoring Company Page (see `organizationId`) and the campaign format is set to SINGLE_VIDEO; LinkedIn ignores `thumbnailUrl` (it auto-generates the poster frame). Supply MP4 H.264/AAC, 3s-30min, 75KB-500MB.
47364
+ * Meta (facebook, instagram), LinkedIn and Reddit. On Reddit `url`, `linkUrl` and a thumbnail (`thumbnailUrl`, or `imageUrl`) are all required. Creates a single VIDEO ad. Mutually exclusive with `imageUrl`. Supply `url` to upload a file, or `id` to reuse a video already on the ad account (list them with GET /v1/ads/videos). Works on the single-ad and attach (`adSetId`) shapes; for Meta multi-creative, set `video` per entry inside `creatives[]` instead. For LinkedIn the video is uploaded to LinkedIn under the authoring Company Page (see `organizationId`) and the campaign format is set to SINGLE_VIDEO; LinkedIn ignores `thumbnailUrl` (it auto-generates the poster frame). Supply MP4 H.264/AAC, 3s-30min, 75KB-500MB.
47266
47365
  */
47267
47366
  video?: {
47268
47367
  /**
@@ -47439,6 +47538,8 @@ type CreateStandaloneAdData = {
47439
47538
  * UNDER the flat inline targeting fields below: `savedTargetingId` < `targeting` <
47440
47539
  * flat fields (a flat field present on the body replaces the nested value entirely).
47441
47540
  * Both forms are equivalent; use whichever your integration already builds.
47541
+ * Reddit-only targeting (`communities`, `excludedCommunities`,
47542
+ * `conversationKeywords`, `excludedConversationKeywords`) is sent here.
47442
47543
  *
47443
47544
  */
47444
47545
  targeting?: (TargetingSpec);
@@ -47649,14 +47750,14 @@ type CreateStandaloneAdData = {
47649
47750
  [key: string]: (number);
47650
47751
  };
47651
47752
  /**
47652
- * Required for lifetime budgets. Read like `startDate` (account timezone on Meta, TikTok, X, Pinterest and OpenAI; whole account-local days on Google; UTC on LinkedIn), and a date-only end runs to 23:59:59 local.
47753
+ * Required for lifetime budgets. Read like `startDate` (account timezone on Meta, TikTok, X, Pinterest, OpenAI and Reddit; whole account-local days on Google; UTC on LinkedIn), and a date-only end runs to 23:59:59 local.
47653
47754
  */
47654
47755
  endDate?: string;
47655
47756
  /**
47656
47757
  * Ad-set start time (ISO 8601, e.g. "2026-06-10T09:00:00Z"), mapped to the ad set's
47657
47758
  * start (Meta `start_time`, TikTok ad group `schedule_start_time`, LinkedIn / Pinterest / X
47658
47759
  * / Google campaign start). When omitted the ad starts delivering immediately. For lifetime
47659
- * budgets Meta also requires `endDate`. On Meta, TikTok, X, Pinterest and OpenAI a value
47760
+ * budgets Meta also requires `endDate`. On Meta, TikTok, X, Pinterest, OpenAI and Reddit a value
47660
47761
  * without an offset (`YYYY-MM-DD`, `YYYY-MM-DD HH:MM:SS` or `YYYY-MM-DDTHH:MM:SS`) is read
47661
47762
  * in the ad account timezone (Meta itself would read it as UTC). Google runs whole days in
47662
47763
  * the customer account timezone and takes the value's calendar date as written. LinkedIn
@@ -47733,6 +47834,11 @@ type CreateStandaloneAdData = {
47733
47834
  adFormat?: 'SINGLE_IMAGE' | 'CAROUSEL_IMAGE' | 'SINGLE_VIDEO';
47734
47835
  };
47735
47836
  /**
47837
+ * Reddit: builds a carousel ad, each card with its image, destination (card `linkUrl`,
47838
+ * falling back to the top-level `linkUrl`, 400 when neither is set), call to action
47839
+ * (card `callToAction`, falling back to the top-level one) and caption (card
47840
+ * `headline`, else `description`). `headline` is still required.
47841
+ *
47736
47842
  * Meta only. Hand-built carousel: 2-10 authored cards in DETERMINISTIC order, mapped to
47737
47843
  * the creative's `link_data.child_attachments`. Unlike `dynamicCreative`,
47738
47844
  * you control the card order and per-card copy/link. Requires top-level `body`
@@ -47978,7 +48084,7 @@ type CreateStandaloneAdData = {
47978
48084
  windowDays: 1 | 7 | 28;
47979
48085
  }>;
47980
48086
  /**
47981
- * Restrict the audience by gender. 'male' targets men only, 'female' targets women only, 'all' (default) targets everyone. Applied on Meta, TikTok and Pinterest. Ignored on Google, LinkedIn and X.
48087
+ * Restrict the audience by gender. 'male' targets men only, 'female' targets women only, 'all' (default) targets everyone. Applied on Meta, TikTok, Pinterest and Reddit. Ignored on Google, LinkedIn and X.
47982
48088
  */
47983
48089
  gender?: 'all' | 'male' | 'female';
47984
48090
  /**
@@ -47988,6 +48094,8 @@ type CreateStandaloneAdData = {
47988
48094
  *
47989
48095
  * OpenAI Ads: sent via this flat field, the only channel it supports (`platformSpecificData` is Meta/LinkedIn-only and returns 400 for OpenAI). `LOWEST_COST_WITH_BID_CAP` or `COST_CAP` with `bidAmount` sets a fixed bid (`fixed_bid`, the CPA bid on `conversions`). Omitted or `LOWEST_COST_WITHOUT_CAP` bids automatically with OpenAI's Maximize Results (`maximize_clicks` for `traffic`, `maximize_conversions` for `conversions`), which needs `budgetType: daily`; on a lifetime budget or the `awareness` goal it returns 400.
47990
48096
  *
48097
+ * Reddit Ads: sent via this flat field and applied to the new ad group. LOWEST_COST_WITHOUT_CAP or omitted = automatic bidding (BIDLESS), LOWEST_COST_WITH_BID_CAP + `bidAmount` = MANUAL_BIDDING with that bid, COST_CAP + `bidAmount` = MAXIMIZE_VOLUME with that cap. Any other strategy returns 422 before anything is created.
48098
+ *
47991
48099
  * Google (not deprecated there, this shared flat field is Google's only shape): applied to the campaign this call creates. On Google: LOWEST_COST_WITHOUT_CAP = Maximize Conversions, COST_CAP + bidAmount = Target CPA, LOWEST_COST_WITH_MIN_ROAS + roasAverageFloor = Target ROAS, LOWEST_COST_WITH_BID_CAP + bidAmount = Maximize Clicks with a CPC ceiling; portfolioBidStrategyId attaches a portfolio strategy instead. Omitted, the campaign falls back to a goal-based default.
47992
48100
  *
47993
48101
  * @deprecated
@@ -48870,7 +48978,7 @@ type SearchAdTargetingData = {
48870
48978
  /**
48871
48979
  * What to search. `geo` resolves locations (scope further with `geoType`), `interest`/`behavior` resolve audience entities (`behavior` on Meta, TikTok and LinkedIn), `interestKeyword`/`hashtag` resolve TikTok additional interests and hashtags (TikTok only), `income` resolves the normalized income tiers, `language` resolves Google's targetable language_constant table (Google only), `workPosition`/`workEmployer`/`workIndustry` resolve Meta work demographics, `industry`/`jobFunction`/`seniority`/`companySize` resolve LinkedIn B2B facets (LinkedIn only). Defaults to `interest` for backward compatibility with the deprecated /v1/ads/interests alias.
48872
48980
  */
48873
- dimension?: 'geo' | 'interest' | 'interestKeyword' | 'behavior' | 'hashtag' | 'income' | 'language' | 'workPosition' | 'workEmployer' | 'workIndustry' | 'industry' | 'jobFunction' | 'seniority' | 'companySize';
48981
+ dimension?: 'geo' | 'interest' | 'interestKeyword' | 'behavior' | 'hashtag' | 'income' | 'language' | 'workPosition' | 'workEmployer' | 'workIndustry' | 'industry' | 'jobFunction' | 'seniority' | 'companySize' | 'community' | 'conversationKeyword';
48874
48982
  /**
48875
48983
  * Only used when `dimension=geo`. The kind of location to resolve. `all` searches every type in one relevance-ranked call. Defaults to `city`.
48876
48984
  */
@@ -48896,7 +49004,7 @@ type SearchAdTargetingResponse = ({
48896
49004
  */
48897
49005
  name: string;
48898
49006
  /**
48899
- * What the result is. Equals the requested dimension (interest, interestKeyword, behavior, hashtag, income, language, workPosition, workEmployer, workIndustry, industry, jobFunction, seniority, companySize), or the location level for geo (country, region, city, zip, metro, ...).
49007
+ * What the result is. Equals the requested dimension (interest, interestKeyword, behavior, hashtag, income, language, workPosition, workEmployer, workIndustry, industry, jobFunction, seniority, companySize, community, conversationKeyword), or the location level for geo (country, region, city, zip, metro, ...).
48900
49008
  */
48901
49009
  type: string;
48902
49010
  /**
@@ -48916,7 +49024,7 @@ type SearchAdTargetingResponse = ({
48916
49024
  */
48917
49025
  countryCode?: string;
48918
49026
  /**
48919
- * Only on `country` results: the platform's own id for the country, which `id` replaced with the ISO code (TikTok's native location_id, a GeoNames id such as 2635167 for GB; Meta's country key; Google's geo target constant id; X's targeting value; LinkedIn's geo URN). Use it to match a country against what the platform reports back, e.g. `location_ids` in a TikTok `nativeSettings` read.
49027
+ * On Reddit `community` results: Reddit's own subreddit id (the `id` is the name). Otherwise only on `country` results: the platform's own id for the country, which `id` replaced with the ISO code (TikTok's native location_id, a GeoNames id such as 2635167 for GB; Meta's country key; Google's geo target constant id; X's targeting value; LinkedIn's geo URN). Use it to match a country against what the platform reports back, e.g. `location_ids` in a TikTok `nativeSettings` read.
48920
49028
  */
48921
49029
  platformId?: string;
48922
49030
  }>;
@@ -50178,7 +50286,7 @@ type GetConversionsQualityError = (ErrorResponse | unknown);
50178
50286
  type SendConversionsData = {
50179
50287
  body: {
50180
50288
  /**
50181
- * SocialAccount ID (metaads, googleads, linkedinads, tiktokads, openaiads, or pinterestads).
50289
+ * SocialAccount ID (metaads, googleads, linkedinads, tiktokads, openaiads, pinterestads, or redditads).
50182
50290
  */
50183
50291
  accountId: string;
50184
50292
  /**
@@ -50186,13 +50294,14 @@ type SendConversionsData = {
50186
50294
  * ID. For Google, the conversion action resource name. For
50187
50295
  * LinkedIn, the conversion rule ID or full
50188
50296
  * `urn:lla:llaPartnerConversion:{id}` URN. For OpenAI Ads, the
50189
- * pixel wire id. For Pinterest, the numeric ad account id.
50297
+ * pixel wire id. For Pinterest, the numeric ad account id. For
50298
+ * Reddit, the pixel id (`a2_...`).
50190
50299
  *
50191
50300
  */
50192
50301
  destinationId: string;
50193
50302
  events: Array<ConversionEvent>;
50194
50303
  /**
50195
- * Meta `test_event_code` passthrough. On Pinterest any value sends the batch with `test=true` (validated, not recorded). Ignored by Google, LinkedIn, and OpenAI Ads.
50304
+ * Meta `test_event_code` passthrough. On Pinterest any value sends the batch with `test=true` (validated, not recorded). On Reddit, sent as `test_id` so the events show in the pixel's test view. Ignored by Google, LinkedIn, and OpenAI Ads.
50196
50305
  */
50197
50306
  testCode?: string;
50198
50307
  /**
@@ -50202,7 +50311,8 @@ type SendConversionsData = {
50202
50311
  * the batch (data_processing_options ["LDU"] with
50203
50312
  * geolocation, country 0 / state 0); GRANTED or absent
50204
50313
  * consent sends events with Meta's default processing.
50205
- * Ignored by LinkedIn.
50314
+ * On Reddit, `adUserData: DENIED` drops every user field
50315
+ * from the events. Ignored by LinkedIn.
50206
50316
  *
50207
50317
  */
50208
50318
  consent?: {
@@ -50212,7 +50322,7 @@ type SendConversionsData = {
50212
50322
  };
50213
50323
  };
50214
50324
  type SendConversionsResponse = ({
50215
- platform?: 'metaads' | 'googleads' | 'linkedinads' | 'tiktokads' | 'openaiads' | 'pinterestads';
50325
+ platform?: 'metaads' | 'googleads' | 'linkedinads' | 'tiktokads' | 'openaiads' | 'pinterestads' | 'redditads';
50216
50326
  /**
50217
50327
  * Events accepted by the platform.
50218
50328
  */
@@ -50236,8 +50346,8 @@ type SendConversionsResponse = ({
50236
50346
  /**
50237
50347
  * Platform trace ID for debugging. fbtrace_id for Meta,
50238
50348
  * requestId for Google. Absent for LinkedIn (LinkedIn's
50239
- * conversionEvents endpoint does not surface a trace ID)
50240
- * and OpenAI Ads (no trace ID surfaced).
50349
+ * conversionEvents endpoint does not surface a trace ID),
50350
+ * OpenAI Ads and Reddit (no trace ID surfaced).
50241
50351
  *
50242
50352
  */
50243
50353
  traceId?: string;
@@ -50681,19 +50791,19 @@ type UpdateCampaignConversionGoalsError = (ErrorResponse | unknown);
50681
50791
  type ListConversionDestinationsData = {
50682
50792
  path: {
50683
50793
  /**
50684
- * SocialAccount ID (metaads, googleads, linkedinads, tiktokads, openaiads, or pinterestads).
50794
+ * SocialAccount ID (metaads, googleads, linkedinads, tiktokads, openaiads, pinterestads, or redditads).
50685
50795
  */
50686
50796
  accountId: string;
50687
50797
  };
50688
50798
  };
50689
50799
  type ListConversionDestinationsResponse = ({
50690
- platform?: 'metaads' | 'googleads' | 'linkedinads' | 'tiktokads' | 'openaiads' | 'pinterestads';
50800
+ platform?: 'metaads' | 'googleads' | 'linkedinads' | 'tiktokads' | 'openaiads' | 'pinterestads' | 'redditads';
50691
50801
  destinations?: Array<{
50692
50802
  /**
50693
50803
  * Destination identifier. Meta: pixel ID. Google:
50694
50804
  * conversion action resource name. LinkedIn:
50695
50805
  * numeric conversion rule ID. OpenAI Ads: pixel wire
50696
- * id.
50806
+ * id. Reddit: pixel id (`a2_...`).
50697
50807
  *
50698
50808
  */
50699
50809
  id?: string;
@@ -50708,8 +50818,8 @@ type ListConversionDestinationsResponse = ({
50708
50818
  status?: 'active' | 'inactive';
50709
50819
  /**
50710
50820
  * Set by adapters whose destinations are scoped to a
50711
- * specific ad account (LinkedIn). Pass back on
50712
- * subsequent CRUD calls.
50821
+ * specific ad account (LinkedIn, Reddit). On LinkedIn,
50822
+ * pass it back on subsequent CRUD calls.
50713
50823
  *
50714
50824
  */
50715
50825
  adAccountId?: string;