@zernio/node 0.2.1169 → 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.ts 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
  /**
@@ -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
  /**
@@ -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
  /**
@@ -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
  */
@@ -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,7 +41122,7 @@ type UpdateAdCampaignResponse = ({
41066
41122
  type UpdateAdCampaignError = (unknown | ErrorResponse);
41067
41123
  type DeleteAdCampaignData = {
41068
41124
  body: {
41069
- platform: 'facebook' | 'instagram' | 'google' | 'twitter';
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
  */
@@ -41102,7 +41158,7 @@ type ListCampaignNegativeKeywordsData = {
41102
41158
  /**
41103
41159
  * Optional and NOT authoritative: the resolved campaign's own platform decides 200 vs 501, never this hint.
41104
41160
  */
41105
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
41161
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
41106
41162
  };
41107
41163
  };
41108
41164
  type ListCampaignNegativeKeywordsResponse = ({
@@ -41126,7 +41182,7 @@ type ReplaceCampaignNegativeKeywordsData = {
41126
41182
  /**
41127
41183
  * Optional and NOT authoritative: the resolved campaign's own platform decides 200 vs 501, never this hint.
41128
41184
  */
41129
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
41185
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
41130
41186
  keywords: Array<KeywordEntry>;
41131
41187
  };
41132
41188
  path: {
@@ -41166,7 +41222,7 @@ type BulkUpdateAdCampaignStatusData = {
41166
41222
  /**
41167
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`.
41168
41224
  */
41169
- 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';
41170
41226
  }>;
41171
41227
  };
41172
41228
  };
@@ -41509,7 +41565,7 @@ type ListAdSetsData = {
41509
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`.
41510
41566
  */
41511
41567
  live?: boolean;
41512
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
41568
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
41513
41569
  };
41514
41570
  };
41515
41571
  type ListAdSetsResponse = ({
@@ -41655,7 +41711,7 @@ type CreateAdSetData = {
41655
41711
  /**
41656
41712
  * Only "google" is implemented today; every other value returns 501.
41657
41713
  */
41658
- platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
41714
+ platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
41659
41715
  /**
41660
41716
  * Google platform campaign ID (numeric) the ad group is created under.
41661
41717
  */
@@ -41830,7 +41886,7 @@ type GetAdSetDetailsResponse = ({
41830
41886
  type GetAdSetDetailsError = (unknown | ErrorResponse);
41831
41887
  type UpdateAdSetData = {
41832
41888
  body: {
41833
- platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
41889
+ platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
41834
41890
  /**
41835
41891
  * Omit if not updating budget
41836
41892
  */
@@ -41858,7 +41914,8 @@ type UpdateAdSetData = {
41858
41914
  * COST_CAP = TARGET, with `bidAmount` as `bid_amount_local_micro`;
41859
41915
  * LOWEST_COST_WITH_MIN_ROAS is rejected with 422. X decides which strategy
41860
41916
  * the line item's objective allows (TARGET only on REACH, FOLLOWERS and
41861
- * WEBSITE_CLICKS, MAX not on REACH or FOLLOWERS). Other platforms
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
41862
41919
  * (linkedin, pinterest, google) return 501 Not Implemented when bidStrategy is set.
41863
41920
  *
41864
41921
  */
@@ -42037,7 +42094,7 @@ type DeleteAdSetError = (ErrorResponse | unknown);
42037
42094
  type UpdateAdSetStatusData = {
42038
42095
  body: {
42039
42096
  status: 'active' | 'paused';
42040
- platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
42097
+ platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
42041
42098
  };
42042
42099
  path: {
42043
42100
  /**
@@ -42052,7 +42109,7 @@ type UpdateAdSetStatusResponse = ({
42052
42109
  */
42053
42110
  status?: 'active' | 'paused';
42054
42111
  /**
42055
- * 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.
42056
42113
  */
42057
42114
  platformAdSetStatus?: (string) | null;
42058
42115
  /**
@@ -42119,7 +42176,7 @@ type GetAdTreeData = {
42119
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.
42120
42177
  */
42121
42178
  pageId?: string;
42122
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
42179
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
42123
42180
  /**
42124
42181
  * Profile ID
42125
42182
  */
@@ -42178,7 +42235,7 @@ type GetAdsTimelineData = {
42178
42235
  /**
42179
42236
  * Restrict to one platform.
42180
42237
  */
42181
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
42238
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
42182
42239
  /**
42183
42240
  * Inclusive end of metrics range (YYYY-MM-DD). Defaults to today. Max 730-day range.
42184
42241
  */
@@ -44962,7 +45019,7 @@ type ListAdNegativeKeywordListsData = {
44962
45019
  * @deprecated
44963
45020
  */
44964
45021
  customerId?: string;
44965
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45022
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
44966
45023
  };
44967
45024
  };
44968
45025
  type ListAdNegativeKeywordListsResponse = ({
@@ -44999,7 +45056,7 @@ type CreateAdNegativeKeywordListData = {
44999
45056
  /**
45000
45057
  * Optional courtesy field. The resolved account or campaign determines support; other platforms return 501.
45001
45058
  */
45002
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45059
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
45003
45060
  /**
45004
45061
  * Nonempty list name, trimmed before use.
45005
45062
  */
@@ -45040,7 +45097,7 @@ type GetAdNegativeKeywordListData = {
45040
45097
  * @deprecated
45041
45098
  */
45042
45099
  customerId?: string;
45043
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45100
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
45044
45101
  };
45045
45102
  };
45046
45103
  type GetAdNegativeKeywordListResponse = ({
@@ -45079,7 +45136,7 @@ type UpdateAdNegativeKeywordListData = {
45079
45136
  /**
45080
45137
  * Optional courtesy field. The resolved account or campaign determines support; other platforms return 501.
45081
45138
  */
45082
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45139
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
45083
45140
  /**
45084
45141
  * Nonempty list name, trimmed before use.
45085
45142
  */
@@ -45108,7 +45165,7 @@ type DeleteAdNegativeKeywordListData = {
45108
45165
  * @deprecated
45109
45166
  */
45110
45167
  customerId?: string;
45111
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45168
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
45112
45169
  };
45113
45170
  };
45114
45171
  type DeleteAdNegativeKeywordListResponse = ({
@@ -45137,7 +45194,7 @@ type ReplaceAdNegativeKeywordListKeywordsData = {
45137
45194
  /**
45138
45195
  * Optional courtesy field. The resolved account or campaign determines support; other platforms return 501.
45139
45196
  */
45140
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45197
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
45141
45198
  /**
45142
45199
  * Full desired keyword set. Bare strings use broad match. Send [] to clear the list.
45143
45200
  */
@@ -45167,7 +45224,7 @@ type ListCampaignNegativeKeywordListsData = {
45167
45224
  campaignId: string;
45168
45225
  };
45169
45226
  query?: {
45170
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45227
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
45171
45228
  };
45172
45229
  };
45173
45230
  type ListCampaignNegativeKeywordListsResponse = ({
@@ -45191,7 +45248,7 @@ type ReplaceCampaignNegativeKeywordListsData = {
45191
45248
  /**
45192
45249
  * Optional courtesy field. The resolved account or campaign determines support; other platforms return 501.
45193
45250
  */
45194
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45251
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
45195
45252
  listIds: Array<(string)>;
45196
45253
  };
45197
45254
  path: {
@@ -46139,9 +46196,17 @@ type ListAdAccountsResponse = ({
46139
46196
  */
46140
46197
  accountStatus?: unknown;
46141
46198
  /**
46142
- * 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.
46143
46200
  */
46144
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;
46145
46210
  /**
46146
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.
46147
46212
  */
@@ -46346,11 +46411,11 @@ type BoostPostData = {
46346
46411
  */
46347
46412
  postId?: string;
46348
46413
  /**
46349
- * 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.
46350
46415
  */
46351
46416
  platformPostId?: string;
46352
46417
  /**
46353
- * 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.
46354
46419
  */
46355
46420
  accountId: string;
46356
46421
  /**
@@ -46367,7 +46432,7 @@ type BoostPostData = {
46367
46432
  */
46368
46433
  adSetName?: string;
46369
46434
  /**
46370
- * 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.
46371
46436
  */
46372
46437
  goal: 'engagement' | 'traffic' | 'awareness' | 'video_views' | 'lead_generation' | 'conversions' | 'app_promotion';
46373
46438
  /**
@@ -46430,11 +46495,11 @@ type BoostPostData = {
46430
46495
  */
46431
46496
  currency?: string;
46432
46497
  /**
46433
- * 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.
46434
46499
  */
46435
46500
  startDate?: string;
46436
46501
  /**
46437
- * 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 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.
46438
46503
  */
46439
46504
  endDate?: string;
46440
46505
  /**
@@ -46458,18 +46523,22 @@ type BoostPostData = {
46458
46523
  * Geo keys (`regions`/`cities`/`zips`/`metros`) resolve via
46459
46524
  * GET /v1/ads/targeting/search?dimension=geo. City radius and lat/lng
46460
46525
  * `customLocations` are Meta-only and preserve the boosted post's
46461
- * 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.
46462
46531
  *
46463
46532
  */
46464
46533
  targeting?: {
46465
46534
  ageMin?: number;
46466
46535
  ageMax?: number;
46467
46536
  /**
46468
- * 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.
46469
46538
  */
46470
46539
  gender?: 'all' | 'male' | 'female';
46471
46540
  /**
46472
- * Meta locale ids (numeric), passed through as given.
46541
+ * Meta locale ids (numeric), passed through as given. Reddit: language codes (e.g. `en`).
46473
46542
  */
46474
46543
  languages?: Array<(string)>;
46475
46544
  /**
@@ -46568,7 +46637,9 @@ type BoostPostData = {
46568
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.
46569
46638
  *
46570
46639
  * Meta bid strategy applied to the ad set. On TikTok, mapped to
46571
- * `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).
46572
46643
  *
46573
46644
  * @deprecated
46574
46645
  */
@@ -46607,7 +46678,7 @@ type BoostPostData = {
46607
46678
  */
46608
46679
  platformSpecificData?: (LinkedInAdsPlatformData | MetaAdsPlatformData);
46609
46680
  /**
46610
- * 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).
46611
46682
  */
46612
46683
  tracking?: {
46613
46684
  pixelId?: string;
@@ -46650,6 +46721,8 @@ type BoostPostData = {
46650
46721
  * (`AdcreateCreatives.landing_page_url`); Spark Ads have no clickable
46651
46722
  * destination without it.
46652
46723
  *
46724
+ * **Reddit**: the ad's `click_url`, where a click on the promoted post lands.
46725
+ *
46653
46726
  * Ignored on LinkedIn / Pinterest / X / Google, which infer the destination
46654
46727
  * from the boosted post.
46655
46728
  *
@@ -46725,7 +46798,7 @@ type BoostPostData = {
46725
46798
  minimumPurchaseCurrency?: string;
46726
46799
  }>;
46727
46800
  /**
46728
- * 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
46729
46802
  * of an existing organic post can run for a conversion instead of only
46730
46803
  * engagement or traffic. Required when `goal` is `conversions` (Meta also
46731
46804
  * `lead_conversion`); ignored on goals that do not optimize for a conversion.
@@ -46744,10 +46817,17 @@ type BoostPostData = {
46744
46817
  * `platformPostId` + `sparkAuthCode`: the pixel lives on the ad group and
46745
46818
  * the Spark item on the creative.
46746
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
+ *
46747
46827
  */
46748
46828
  promotedObject?: {
46749
46829
  /**
46750
- * 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.
46751
46831
  */
46752
46832
  pixelId?: string;
46753
46833
  /**
@@ -46780,7 +46860,7 @@ type BoostPostData = {
46780
46860
  */
46781
46861
  dsaPayor?: string;
46782
46862
  /**
46783
- * 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).
46784
46864
  */
46785
46865
  leadGenFormId?: string;
46786
46866
  /**
@@ -47054,11 +47134,11 @@ type CreateStandaloneAdData = {
47054
47134
  adAccountId: string;
47055
47135
  name: string;
47056
47136
  /**
47057
- * Meta only. Exact campaign name. Overrides the default `<name> - Campaign`.
47137
+ * Meta and Reddit. Exact campaign name. Overrides the default `<name> - Campaign`.
47058
47138
  */
47059
47139
  campaignName?: string;
47060
47140
  /**
47061
- * 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.)
47062
47142
  */
47063
47143
  adSetName?: string;
47064
47144
  /**
@@ -47090,6 +47170,12 @@ type CreateStandaloneAdData = {
47090
47170
  * **OpenAI Ads**
47091
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.
47092
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
+ *
47093
47179
  */
47094
47180
  goal?: 'engagement' | 'traffic' | 'awareness' | 'video_views' | 'lead_generation' | 'lead_conversion' | 'conversions' | 'app_promotion' | 'catalog_sales' | 'page_likes' | 'page_visits' | 'job_applicants';
47095
47181
  /**
@@ -47113,7 +47199,7 @@ type CreateStandaloneAdData = {
47113
47199
  interestsBehaviors?: boolean;
47114
47200
  };
47115
47201
  /**
47116
- * 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.
47117
47203
  */
47118
47204
  optimizationGoal?: string;
47119
47205
  /**
@@ -47153,7 +47239,7 @@ type CreateStandaloneAdData = {
47153
47239
  */
47154
47240
  budgetAmount?: number;
47155
47241
  /**
47156
- * 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`.
47157
47243
  */
47158
47244
  budgetType?: 'daily' | 'lifetime';
47159
47245
  /**
@@ -47201,7 +47287,7 @@ type CreateStandaloneAdData = {
47201
47287
  */
47202
47288
  currency?: string;
47203
47289
  /**
47204
- * 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.
47205
47291
  */
47206
47292
  headline?: string;
47207
47293
  /**
@@ -47209,7 +47295,7 @@ type CreateStandaloneAdData = {
47209
47295
  */
47210
47296
  longHeadline?: string;
47211
47297
  /**
47212
- * 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.
47213
47299
  */
47214
47300
  body?: string;
47215
47301
  /**
@@ -47246,19 +47332,19 @@ type CreateStandaloneAdData = {
47246
47332
  */
47247
47333
  descriptions?: Array<(string)>;
47248
47334
  /**
47249
- * 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.
47250
47336
  */
47251
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';
47252
47338
  /**
47253
- * 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.
47254
47340
  */
47255
47341
  linkUrl?: string;
47256
47342
  /**
47257
- * 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).
47258
47344
  */
47259
47345
  leadGenFormId?: string;
47260
47346
  /**
47261
- * 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`.
47262
47348
  */
47263
47349
  imageUrl?: string;
47264
47350
  /**
@@ -47275,7 +47361,7 @@ type CreateStandaloneAdData = {
47275
47361
  square?: string;
47276
47362
  };
47277
47363
  /**
47278
- * 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.
47279
47365
  */
47280
47366
  video?: {
47281
47367
  /**
@@ -47452,6 +47538,8 @@ type CreateStandaloneAdData = {
47452
47538
  * UNDER the flat inline targeting fields below: `savedTargetingId` < `targeting` <
47453
47539
  * flat fields (a flat field present on the body replaces the nested value entirely).
47454
47540
  * Both forms are equivalent; use whichever your integration already builds.
47541
+ * Reddit-only targeting (`communities`, `excludedCommunities`,
47542
+ * `conversationKeywords`, `excludedConversationKeywords`) is sent here.
47455
47543
  *
47456
47544
  */
47457
47545
  targeting?: (TargetingSpec);
@@ -47662,14 +47750,14 @@ type CreateStandaloneAdData = {
47662
47750
  [key: string]: (number);
47663
47751
  };
47664
47752
  /**
47665
- * 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.
47666
47754
  */
47667
47755
  endDate?: string;
47668
47756
  /**
47669
47757
  * Ad-set start time (ISO 8601, e.g. "2026-06-10T09:00:00Z"), mapped to the ad set's
47670
47758
  * start (Meta `start_time`, TikTok ad group `schedule_start_time`, LinkedIn / Pinterest / X
47671
47759
  * / Google campaign start). When omitted the ad starts delivering immediately. For lifetime
47672
- * 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
47673
47761
  * without an offset (`YYYY-MM-DD`, `YYYY-MM-DD HH:MM:SS` or `YYYY-MM-DDTHH:MM:SS`) is read
47674
47762
  * in the ad account timezone (Meta itself would read it as UTC). Google runs whole days in
47675
47763
  * the customer account timezone and takes the value's calendar date as written. LinkedIn
@@ -47746,6 +47834,11 @@ type CreateStandaloneAdData = {
47746
47834
  adFormat?: 'SINGLE_IMAGE' | 'CAROUSEL_IMAGE' | 'SINGLE_VIDEO';
47747
47835
  };
47748
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
+ *
47749
47842
  * Meta only. Hand-built carousel: 2-10 authored cards in DETERMINISTIC order, mapped to
47750
47843
  * the creative's `link_data.child_attachments`. Unlike `dynamicCreative`,
47751
47844
  * you control the card order and per-card copy/link. Requires top-level `body`
@@ -47991,7 +48084,7 @@ type CreateStandaloneAdData = {
47991
48084
  windowDays: 1 | 7 | 28;
47992
48085
  }>;
47993
48086
  /**
47994
- * 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.
47995
48088
  */
47996
48089
  gender?: 'all' | 'male' | 'female';
47997
48090
  /**
@@ -48001,6 +48094,8 @@ type CreateStandaloneAdData = {
48001
48094
  *
48002
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.
48003
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
+ *
48004
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.
48005
48100
  *
48006
48101
  * @deprecated
@@ -48883,7 +48978,7 @@ type SearchAdTargetingData = {
48883
48978
  /**
48884
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.
48885
48980
  */
48886
- 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';
48887
48982
  /**
48888
48983
  * Only used when `dimension=geo`. The kind of location to resolve. `all` searches every type in one relevance-ranked call. Defaults to `city`.
48889
48984
  */
@@ -48909,7 +49004,7 @@ type SearchAdTargetingResponse = ({
48909
49004
  */
48910
49005
  name: string;
48911
49006
  /**
48912
- * 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, ...).
48913
49008
  */
48914
49009
  type: string;
48915
49010
  /**
@@ -48929,7 +49024,7 @@ type SearchAdTargetingResponse = ({
48929
49024
  */
48930
49025
  countryCode?: string;
48931
49026
  /**
48932
- * 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.
48933
49028
  */
48934
49029
  platformId?: string;
48935
49030
  }>;
@@ -50191,7 +50286,7 @@ type GetConversionsQualityError = (ErrorResponse | unknown);
50191
50286
  type SendConversionsData = {
50192
50287
  body: {
50193
50288
  /**
50194
- * SocialAccount ID (metaads, googleads, linkedinads, tiktokads, openaiads, or pinterestads).
50289
+ * SocialAccount ID (metaads, googleads, linkedinads, tiktokads, openaiads, pinterestads, or redditads).
50195
50290
  */
50196
50291
  accountId: string;
50197
50292
  /**
@@ -50199,13 +50294,14 @@ type SendConversionsData = {
50199
50294
  * ID. For Google, the conversion action resource name. For
50200
50295
  * LinkedIn, the conversion rule ID or full
50201
50296
  * `urn:lla:llaPartnerConversion:{id}` URN. For OpenAI Ads, the
50202
- * 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_...`).
50203
50299
  *
50204
50300
  */
50205
50301
  destinationId: string;
50206
50302
  events: Array<ConversionEvent>;
50207
50303
  /**
50208
- * 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.
50209
50305
  */
50210
50306
  testCode?: string;
50211
50307
  /**
@@ -50215,7 +50311,8 @@ type SendConversionsData = {
50215
50311
  * the batch (data_processing_options ["LDU"] with
50216
50312
  * geolocation, country 0 / state 0); GRANTED or absent
50217
50313
  * consent sends events with Meta's default processing.
50218
- * Ignored by LinkedIn.
50314
+ * On Reddit, `adUserData: DENIED` drops every user field
50315
+ * from the events. Ignored by LinkedIn.
50219
50316
  *
50220
50317
  */
50221
50318
  consent?: {
@@ -50225,7 +50322,7 @@ type SendConversionsData = {
50225
50322
  };
50226
50323
  };
50227
50324
  type SendConversionsResponse = ({
50228
- platform?: 'metaads' | 'googleads' | 'linkedinads' | 'tiktokads' | 'openaiads' | 'pinterestads';
50325
+ platform?: 'metaads' | 'googleads' | 'linkedinads' | 'tiktokads' | 'openaiads' | 'pinterestads' | 'redditads';
50229
50326
  /**
50230
50327
  * Events accepted by the platform.
50231
50328
  */
@@ -50249,8 +50346,8 @@ type SendConversionsResponse = ({
50249
50346
  /**
50250
50347
  * Platform trace ID for debugging. fbtrace_id for Meta,
50251
50348
  * requestId for Google. Absent for LinkedIn (LinkedIn's
50252
- * conversionEvents endpoint does not surface a trace ID)
50253
- * 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).
50254
50351
  *
50255
50352
  */
50256
50353
  traceId?: string;
@@ -50694,19 +50791,19 @@ type UpdateCampaignConversionGoalsError = (ErrorResponse | unknown);
50694
50791
  type ListConversionDestinationsData = {
50695
50792
  path: {
50696
50793
  /**
50697
- * SocialAccount ID (metaads, googleads, linkedinads, tiktokads, openaiads, or pinterestads).
50794
+ * SocialAccount ID (metaads, googleads, linkedinads, tiktokads, openaiads, pinterestads, or redditads).
50698
50795
  */
50699
50796
  accountId: string;
50700
50797
  };
50701
50798
  };
50702
50799
  type ListConversionDestinationsResponse = ({
50703
- platform?: 'metaads' | 'googleads' | 'linkedinads' | 'tiktokads' | 'openaiads' | 'pinterestads';
50800
+ platform?: 'metaads' | 'googleads' | 'linkedinads' | 'tiktokads' | 'openaiads' | 'pinterestads' | 'redditads';
50704
50801
  destinations?: Array<{
50705
50802
  /**
50706
50803
  * Destination identifier. Meta: pixel ID. Google:
50707
50804
  * conversion action resource name. LinkedIn:
50708
50805
  * numeric conversion rule ID. OpenAI Ads: pixel wire
50709
- * id.
50806
+ * id. Reddit: pixel id (`a2_...`).
50710
50807
  *
50711
50808
  */
50712
50809
  id?: string;
@@ -50721,8 +50818,8 @@ type ListConversionDestinationsResponse = ({
50721
50818
  status?: 'active' | 'inactive';
50722
50819
  /**
50723
50820
  * Set by adapters whose destinations are scoped to a
50724
- * specific ad account (LinkedIn). Pass back on
50725
- * subsequent CRUD calls.
50821
+ * specific ad account (LinkedIn, Reddit). On LinkedIn,
50822
+ * pass it back on subsequent CRUD calls.
50726
50823
  *
50727
50824
  */
50728
50825
  adAccountId?: string;