@zernio/node 0.2.1169 → 0.2.1171

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.
@@ -105,13 +105,13 @@ export type AccountWithFollowerStats = SocialAccount & {
105
105
  export type Ad = {
106
106
  _id?: string;
107
107
  name?: string;
108
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
108
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
109
109
  /**
110
110
  * 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`.
111
111
  */
112
112
  status?: (AdStatus);
113
113
  /**
114
- * 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.
114
+ * 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.
115
115
  */
116
116
  configuredStatus?: (string) | null;
117
117
  /**
@@ -481,7 +481,7 @@ export type Ad = {
481
481
  updatedAt?: string;
482
482
  };
483
483
 
484
- export type platform = 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
484
+ export type platform = 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
485
485
 
486
486
  export type adType = 'boost' | 'standalone';
487
487
 
@@ -558,7 +558,7 @@ export type AdBudget = {
558
558
 
559
559
  export type AdCampaign = {
560
560
  platformCampaignId?: string;
561
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
561
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
562
562
  campaignName?: string;
563
563
  /**
564
564
  * Delivery status derived from child ad statuses. Distinct from `reviewStatus`.
@@ -569,7 +569,7 @@ export type AdCampaign = {
569
569
  */
570
570
  reviewStatus?: (AdReviewStatus | null);
571
571
  /**
572
- * 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).
572
+ * 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).
573
573
  */
574
574
  platformCampaignStatus?: (string) | null;
575
575
  /**
@@ -1157,8 +1157,17 @@ export type matchType2 = 'broad' | 'phrase' | 'exact';
1157
1157
  * optimizes for (sent as the campaign's `conversion_event_setting_ids`); every other
1158
1158
  * `promotedObject` field is rejected with a 400. See `customEventType` below.
1159
1159
  *
1160
+ * **Reddit Ads**: Reddit puts a pixel on every ad group, whatever the goal. `pixelId`
1161
+ * (or `tracking.pixelId`) picks it; when omitted the ad account's first pixel is used,
1162
+ * and an ad account with no pixel returns 422 (create the pixel in Reddit Ads Manager).
1163
+ * A `pixelId` that is not a pixel of the ad account returns 400. `goal: conversions`
1164
+ * requires `customEventType` (see below). `goal: lead_generation` optimizes toward the
1165
+ * pixel's Lead event. Reddit only optimizes toward an event the pixel has already
1166
+ * received: when it never fired, the request returns 422 `invalid_resource_state`.
1167
+ * Fire it from your site or send it with POST /v1/ads/conversions first.
1168
+ *
1160
1169
  * The remaining `promotedObject.*` fields are Meta-only. Platforms other than
1161
- * Meta, TikTok and OpenAI ignore `promotedObject` entirely.
1170
+ * Meta, TikTok, OpenAI and Reddit ignore `promotedObject` entirely.
1162
1171
  *
1163
1172
  */
1164
1173
  export type AdPromotedObject = {
@@ -1168,6 +1177,7 @@ export type AdPromotedObject = {
1168
1177
  * carrying `pixel_id` without `custom_event_type` (error_subcode 1885014),
1169
1178
  * even when `customConversionId` is also present.
1170
1179
  * **TikTok:** TikTok Pixel ID, required for `goal: conversions`.
1180
+ * **Reddit:** Reddit pixel ID (e.g. `a2_abc123`), optional on every goal (see above).
1171
1181
  * To discover the pixels an ad account can use, call
1172
1182
  * `GET /v1/accounts/{accountId}/tracking-tags?adAccountId=act_...` (each entry
1173
1183
  * carries `kind` and `ownerAdAccountId`), or
@@ -1205,6 +1215,11 @@ export type AdPromotedObject = {
1205
1215
  * the campaign optimizes for the first optimizable event in OpenAI's own list
1206
1216
  * order, which is the most recently created one.
1207
1217
  *
1218
+ * **Reddit:** required for `goal: conversions` (400 without it). One of `PURCHASE`,
1219
+ * `LEAD`, `COMPLETE_REGISTRATION` or `SIGN_UP` (both sent as Reddit's SIGN_UP),
1220
+ * `ADD_TO_CART`, `PAGE_VISIT`, `VIEW_CONTENT` or `CONTENT_VIEW` (both sent as
1221
+ * PAGE_VISIT), any case. The pixel must already have received the event (422 otherwise).
1222
+ *
1208
1223
  */
1209
1224
  customEventType?: string;
1210
1225
  /**
@@ -1367,11 +1382,11 @@ export type AdsTimelineResponse = {
1367
1382
  };
1368
1383
 
1369
1384
  /**
1370
- * 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.
1385
+ * 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).
1371
1386
  */
1372
1387
  export type AdTracking = {
1373
1388
  /**
1374
- * Meta Pixel ID to attach for offsite-conversion measurement.
1389
+ * Meta Pixel ID to attach for offsite-conversion measurement, or the Reddit pixel of the new ad group.
1375
1390
  */
1376
1391
  pixelId?: string;
1377
1392
  /**
@@ -1484,7 +1499,7 @@ export type AdTreeAdSet = {
1484
1499
  */
1485
1500
  export type AdTreeCampaign = {
1486
1501
  platformCampaignId?: string;
1487
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
1502
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
1488
1503
  campaignName?: string;
1489
1504
  /**
1490
1505
  * 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`.
@@ -1505,7 +1520,7 @@ export type AdTreeCampaign = {
1505
1520
  */
1506
1521
  reviewStatus?: (AdReviewStatus | null);
1507
1522
  /**
1508
- * 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`.
1523
+ * 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`.
1509
1524
  */
1510
1525
  platformCampaignStatus?: (string) | null;
1511
1526
  /**
@@ -4128,14 +4143,15 @@ export type ConversionEvent = {
4128
4143
  * Standard event name (Purchase, Lead, CompleteRegistration, AddToCart,
4129
4144
  * InitiateCheckout, AddPaymentInfo, Subscribe, StartTrial, ViewContent,
4130
4145
  * Search, Contact, SubmitApplication, Schedule) or a custom string
4131
- * (only supported on platforms that accept custom events: Meta and
4132
- * OpenAI Ads).
4146
+ * (only supported on platforms that accept custom events: Meta,
4147
+ * OpenAI Ads and Reddit).
4133
4148
  *
4134
4149
  * Per-platform behavior:
4135
4150
  * - Meta: free-form; standard names match Meta's built-ins.
4136
4151
  * - Google: ignored. The conversion action's category determines the type.
4137
4152
  * - LinkedIn: ignored. The conversion rule's `type` is locked to the destination.
4138
4153
  * - 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.
4154
+ * - 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.
4139
4155
  *
4140
4156
  */
4141
4157
  eventName: string;
@@ -4148,7 +4164,8 @@ export type ConversionEvent = {
4148
4164
  * to prevent double-counting. Mapped to event_id on Meta,
4149
4165
  * transactionId on Google, eventId on LinkedIn (LinkedIn deduplicates
4150
4166
  * against Insight Tag events with the same eventId; the Insight Tag
4151
- * event wins when both arrive).
4167
+ * event wins when both arrive), and `metadata.conversion_id` on Reddit
4168
+ * (Reddit's dedup key against Reddit Pixel events).
4152
4169
  *
4153
4170
  */
4154
4171
  eventId: string;
@@ -4267,6 +4284,14 @@ export type ConversionEvent = {
4267
4284
  * Pinterest click ID (the `epik` URL param or `_epik` cookie). Sent to Pinterest as `click_id`, not hashed.
4268
4285
  */
4269
4286
  epik?: string;
4287
+ /**
4288
+ * Reddit click ID (the `rdt_cid` URL param Reddit adds to ad clicks). Sent to Reddit as `click_id`, not hashed.
4289
+ */
4290
+ rdt_cid?: string;
4291
+ /**
4292
+ * Reddit Pixel browser id (the `_rdt_uuid` first-party cookie). Sent to Reddit as `user.uuid`, not hashed.
4293
+ */
4294
+ rdt_uuid?: string;
4270
4295
  };
4271
4296
  };
4272
4297
  /**
@@ -10524,7 +10549,7 @@ export type contentType3 = 'story' | 'saved_story' | 'spotlight';
10524
10549
 
10525
10550
  export type SocialAccount = {
10526
10551
  _id: string;
10527
- 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';
10552
+ 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';
10528
10553
  profileId: (string | Profile);
10529
10554
  username?: string;
10530
10555
  displayName?: string;
@@ -10618,7 +10643,7 @@ export type SocialAccount = {
10618
10643
  };
10619
10644
  };
10620
10645
 
10621
- export 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';
10646
+ export 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';
10622
10647
 
10623
10648
  /**
10624
10649
  * 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.
@@ -10920,7 +10945,7 @@ export type TargetingSpec = {
10920
10945
  }>;
10921
10946
  };
10922
10947
  /**
10923
- * 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.
10948
+ * 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.
10924
10949
  */
10925
10950
  ageMin?: number;
10926
10951
  /**
@@ -10928,7 +10953,7 @@ export type TargetingSpec = {
10928
10953
  */
10929
10954
  ageMax?: number;
10930
10955
  /**
10931
- * 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.
10956
+ * 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.
10932
10957
  */
10933
10958
  gender?: 'all' | 'male' | 'female';
10934
10959
  /**
@@ -10941,7 +10966,7 @@ export type TargetingSpec = {
10941
10966
  */
10942
10967
  incomeTier?: 'top_5' | 'top_10' | 'top_10_25' | 'top_25_50';
10943
10968
  /**
10944
- * 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.
10969
+ * 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.
10945
10970
  */
10946
10971
  languages?: Array<(string)>;
10947
10972
  /**
@@ -10996,13 +11021,29 @@ export type TargetingSpec = {
10996
11021
  */
10997
11022
  jobFunctions?: Array<(string)>;
10998
11023
  /**
10999
- * 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).
11024
+ * 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).
11000
11025
  */
11001
11026
  audienceInclude?: Array<(string)>;
11002
11027
  /**
11003
11028
  * Platform audience IDs to exclude; same ID formats as audienceInclude. Not supported on OpenAI (400).
11004
11029
  */
11005
11030
  audienceExclude?: Array<(string)>;
11031
+ /**
11032
+ * 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.
11033
+ */
11034
+ communities?: Array<(string)>;
11035
+ /**
11036
+ * Reddit only (400 elsewhere). Subreddits to exclude, named like `communities`.
11037
+ */
11038
+ excludedCommunities?: Array<(string)>;
11039
+ /**
11040
+ * Reddit only (400 elsewhere). Keywords that place the ad in Reddit conversations about them, as returned by /v1/ads/targeting/search?dimension=conversationKeyword.
11041
+ */
11042
+ conversationKeywords?: Array<(string)>;
11043
+ /**
11044
+ * Reddit only (400 elsewhere). Conversation keywords to keep the ad away from.
11045
+ */
11046
+ excludedConversationKeywords?: Array<(string)>;
11006
11047
  };
11007
11048
 
11008
11049
  /**
@@ -18765,6 +18806,10 @@ export type ListPostsData = {
18765
18806
  */
18766
18807
  source?: 'zernio' | 'external';
18767
18808
  status?: 'draft' | 'scheduled' | 'publishing' | 'published' | 'partial' | 'failed' | 'cancelled';
18809
+ /**
18810
+ * Comma-separated tags (at most 20). Returns only posts carrying every listed tag, matched exactly and case-sensitively against the tags set when the post was created. An empty value means no tag filter. `tag` is accepted as an alias.
18811
+ */
18812
+ tags?: string;
18768
18813
  /**
18769
18814
  * Zero-padded YYYY-MM-DD, or a full ISO 8601 datetime. An empty value means no date filter; any other malformed value returns 400. The same name the other date-window filters use (ads, analytics).
18770
18815
  */
@@ -19448,7 +19493,7 @@ export type DeleteProfileError = (unknown | ErrorResponse | {
19448
19493
  export type ListAccountsData = {
19449
19494
  query?: {
19450
19495
  /**
19451
- * 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.
19496
+ * 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.
19452
19497
  */
19453
19498
  category?: 'social' | 'ads' | 'communication' | 'blogs';
19454
19499
  /**
@@ -19656,7 +19701,7 @@ export type GetAllAccountsHealthData = {
19656
19701
  /**
19657
19702
  * Filter by platform
19658
19703
  */
19659
- 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';
19704
+ 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';
19660
19705
  /**
19661
19706
  * Filter by profile ID
19662
19707
  */
@@ -20652,6 +20697,10 @@ export type GetConnectUrlData = {
20652
20697
  * x_ads_denied, x_ads_auth_failed, x_ads_config_error, x_ads_account_not_found,
20653
20698
  * x_ads_state_error, x_ads_token_failed, x_ads_token_missing, x_ads_callback_error
20654
20699
  *
20700
+ * Reddit Ads (platform=redditads):
20701
+ * reddit_ads_auth_failed, reddit_ads_invalid_state, reddit_ads_access_denied,
20702
+ * reddit_ads_scope_not_granted, reddit_ads_no_ad_accounts, reddit_ads_callback_error
20703
+ *
20655
20704
  * Shopify (platform=shopify):
20656
20705
  * shopify_auth_failed, shopify_config_error, shopify_invalid_state, shopify_invalid_hmac,
20657
20706
  * shopify_invalid_shop, shopify_missing_scopes, shopify_callback_error
@@ -20662,8 +20711,8 @@ export type GetConnectUrlData = {
20662
20711
  * and `tiktok_ads_auth_failed` may carry the provider's raw error string in `error_message`.
20663
20712
  *
20664
20713
  * 2. On the tiktok and twitter ads flows `platform` carries the ads platform id
20665
- * (`tiktokads`, `xads`), not the value used in the request path. The googleads and shopify
20666
- * flows report `googleads` and `shopify`.
20714
+ * (`tiktokads`, `xads`), not the value used in the request path. The googleads, redditads and
20715
+ * shopify flows report `googleads`, `redditads` and `shopify`.
20667
20716
  *
20668
20717
  * 3. `missing_tiktok_permissions` means the TikTok authorization left out a permission the
20669
20718
  * already-connected account needs, so nothing was changed and it keeps working as before.
@@ -20887,7 +20936,7 @@ export type ConnectAdsData = {
20887
20936
  * instagram_login flow no ads account can be created; do not use this value for those accounts.
20888
20937
  *
20889
20938
  */
20890
- platform: 'facebook' | 'instagram' | 'linkedin' | 'tiktok' | 'twitter' | 'pinterest' | 'googleads';
20939
+ platform: 'facebook' | 'instagram' | 'linkedin' | 'tiktok' | 'twitter' | 'pinterest' | 'googleads' | 'redditads';
20891
20940
  };
20892
20941
  query: {
20893
20942
  /**
@@ -20901,7 +20950,7 @@ export type ConnectAdsData = {
20901
20950
  * profile's ads connection hangs off: that account is no longer connected, so the
20902
20951
  * call returns 409 `reconnect_required` instead of reconnecting another account.
20903
20952
  * Reconnect it via GET /v1/connect/{platform} first. Ignored for standalone
20904
- * platforms (`googleads`).
20953
+ * platforms (`googleads`, `redditads`).
20905
20954
  *
20906
20955
  */
20907
20956
  accountId?: string;
@@ -20911,7 +20960,8 @@ export type ConnectAdsData = {
20911
20960
  * preserve the existing scope; supplied IDs are checked against the new grant. To change
20912
20961
  * that scope after migration, call this endpoint with the IDs and omit loginMode. Supported
20913
20962
  * on `facebook`/`instagram` (Meta, `act_<digits>`), `linkedin` (bare
20914
- * numeric sponsored-account id), `googleads` (bare customer id digits)
20963
+ * numeric sponsored-account id), `googleads` (bare customer id digits),
20964
+ * `redditads` (Reddit ad account id, `a2_<id>` or `t2_<id>`)
20915
20965
  * and `twitter` (X Ads, base36 account id). `tiktok` scopes advertisers
20916
20966
  * at OAuth and `pinterest` has no ads discovery, so both ignore it.
20917
20967
  * Meta ids are additionally validated against the connected token:
@@ -20927,9 +20977,9 @@ export type ConnectAdsData = {
20927
20977
  * scoped ones, instead of every ad account the login can reach. The scope
20928
20978
  * is kept when this call returns an `authUrl`, so the Meta Ads account
20929
20979
  * created after OAuth is scoped (and only its scoped ad accounts synced and
20930
- * subscribed) from the start. On `googleads` the scope is kept through
20931
- * OAuth when `redirect_url` is set, so the Google Ads connection created
20932
- * after OAuth syncs only its scoped customers from the first sync.
20980
+ * subscribed) from the start. On `googleads` and `redditads` the scope is kept through
20981
+ * OAuth when `redirect_url` is set, so the connection created after OAuth
20982
+ * syncs only its scoped ad accounts from the first sync.
20933
20983
  * For multiple accounts use `adAccountIds` instead.
20934
20984
  *
20935
20985
  */
@@ -20986,17 +21036,19 @@ export type ConnectAdsData = {
20986
21036
  /**
20987
21037
  * Custom URL the browser is sent to once the OAuth flow finishes. Honored on
20988
21038
  * every ads platform, including the separate-token (`tiktok`, `twitter`) and
20989
- * standalone (`googleads`) flows. MUST be an absolute http(s) URL or a custom
21039
+ * standalone (`googleads`, `redditads`) flows. MUST be an absolute http(s) URL or a custom
20990
21040
  * app scheme for mobile deeplinks (e.g. myapp://callback); a relative path is
20991
21041
  * rejected with 400 INVALID_REDIRECT_URL. On success
20992
- * `tiktok`, `twitter` and `googleads` land on the URL unchanged, while the
21042
+ * `tiktok` lands on the URL unchanged; `twitter`, `googleads` and `redditads`
21043
+ * append `connected` (the ads platform id: `xads`, `googleads` or `redditads`),
21044
+ * `profileId`, `accountId` (the ads connection) and `username`; and the
20993
21045
  * same-token platforms (`facebook`, `instagram`, `linkedin`, `pinterest`)
20994
21046
  * append `connected`, `profileId`, `accountId`, `username` and, on API-key
20995
21047
  * calls, `connect_token`. On failure the same error contract applies as on
20996
21048
  * GET /v1/connect/{platform}: `error` and `platform` are always appended,
20997
21049
  * other params are optional, and the value list there is not exhaustive.
20998
- * On the tiktok, twitter and googleads flows `platform` carries
20999
- * the ads platform id (`tiktokads`, `xads`, `googleads`), not the value
21050
+ * On the tiktok, twitter, googleads and redditads flows `platform` carries
21051
+ * the ads platform id (`tiktokads`, `xads`, `googleads`, `redditads`), not the value
21000
21052
  * used in the request path. When omitted, the browser lands on
21001
21053
  * the Zernio dashboard.
21002
21054
  *
@@ -40303,7 +40355,7 @@ export type ListAdsData = {
40303
40355
  * 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.
40304
40356
  */
40305
40357
  pageId?: string;
40306
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
40358
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
40307
40359
  /**
40308
40360
  * Meta ad ID. Returns the ad with this platform-side ad ID.
40309
40361
  */
@@ -41043,7 +41095,7 @@ export type ListAdCampaignsData = {
41043
41095
  * 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.
41044
41096
  */
41045
41097
  pageId?: string;
41046
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
41098
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
41047
41099
  /**
41048
41100
  * Profile ID
41049
41101
  */
@@ -41105,6 +41157,14 @@ export type CreateAdCampaignData = {
41105
41157
  budgetAmount?: number;
41106
41158
  budgetType?: 'daily' | 'lifetime';
41107
41159
  status?: 'ACTIVE' | 'PAUSED';
41160
+ /**
41161
+ * 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.
41162
+ */
41163
+ startDate?: string;
41164
+ /**
41165
+ * 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`.
41166
+ */
41167
+ endDate?: string;
41108
41168
  /**
41109
41169
  * Google only (400 elsewhere). Written on the new campaign.
41110
41170
  */
@@ -41170,7 +41230,7 @@ export type CreateAdCampaignError = (unknown | ErrorResponse);
41170
41230
  export type UpdateAdCampaignStatusData = {
41171
41231
  body: {
41172
41232
  status: 'active' | 'paused';
41173
- platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
41233
+ platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
41174
41234
  };
41175
41235
  path: {
41176
41236
  /**
@@ -41186,7 +41246,7 @@ export type UpdateAdCampaignStatusResponse = ({
41186
41246
  */
41187
41247
  status?: 'active' | 'paused';
41188
41248
  /**
41189
- * 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).
41249
+ * 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).
41190
41250
  */
41191
41251
  platformCampaignStatus?: (string) | null;
41192
41252
  /**
@@ -41402,7 +41462,7 @@ export type UpdateAdCampaignData = {
41402
41462
  /**
41403
41463
  * Required: platform campaign IDs are not globally unique.
41404
41464
  */
41405
- platform: 'facebook' | 'instagram' | 'google';
41465
+ platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
41406
41466
  /**
41407
41467
  * **Meta only.** Zernio SocialAccount id owning the ad account. Needed only for an EMPTY campaign (zero ads); ignored otherwise.
41408
41468
  */
@@ -41446,7 +41506,7 @@ export type UpdateAdCampaignData = {
41446
41506
  */
41447
41507
  sharedBudgetId?: (string) | null;
41448
41508
  /**
41449
- * Meta CBO, Google daily, or OpenAI Ads daily or lifetime campaign budget, in whole currency units.
41509
+ * Meta CBO, Google daily, or OpenAI Ads or Reddit Ads daily or lifetime campaign budget, in whole currency units.
41450
41510
  */
41451
41511
  budget?: {
41452
41512
  /**
@@ -41456,7 +41516,7 @@ export type UpdateAdCampaignData = {
41456
41516
  type: 'daily' | 'lifetime';
41457
41517
  };
41458
41518
  /**
41459
- * **Meta only.** Rename the campaign.
41519
+ * **Meta and Reddit.** Rename the campaign.
41460
41520
  */
41461
41521
  name?: string;
41462
41522
  /**
@@ -41509,7 +41569,7 @@ export type UpdateAdCampaignError = (unknown | ErrorResponse);
41509
41569
 
41510
41570
  export type DeleteAdCampaignData = {
41511
41571
  body: {
41512
- platform: 'facebook' | 'instagram' | 'google' | 'twitter';
41572
+ platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
41513
41573
  /**
41514
41574
  * 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.
41515
41575
  */
@@ -41548,7 +41608,7 @@ export type ListCampaignNegativeKeywordsData = {
41548
41608
  /**
41549
41609
  * Optional and NOT authoritative: the resolved campaign's own platform decides 200 vs 501, never this hint.
41550
41610
  */
41551
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
41611
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
41552
41612
  };
41553
41613
  };
41554
41614
 
@@ -41575,7 +41635,7 @@ export type ReplaceCampaignNegativeKeywordsData = {
41575
41635
  /**
41576
41636
  * Optional and NOT authoritative: the resolved campaign's own platform decides 200 vs 501, never this hint.
41577
41637
  */
41578
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
41638
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
41579
41639
  keywords: Array<KeywordEntry>;
41580
41640
  };
41581
41641
  path: {
@@ -41618,7 +41678,7 @@ export type BulkUpdateAdCampaignStatusData = {
41618
41678
  /**
41619
41679
  * 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`.
41620
41680
  */
41621
- platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'googleads' | 'tiktokads' | 'linkedinads' | 'pinterestads' | 'xads' | 'openaiads';
41681
+ platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit' | 'googleads' | 'tiktokads' | 'linkedinads' | 'pinterestads' | 'xads' | 'openaiads' | 'redditads';
41622
41682
  }>;
41623
41683
  };
41624
41684
  };
@@ -41973,7 +42033,7 @@ export type ListAdSetsData = {
41973
42033
  * 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`.
41974
42034
  */
41975
42035
  live?: boolean;
41976
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
42036
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
41977
42037
  };
41978
42038
  };
41979
42039
 
@@ -42122,7 +42182,7 @@ export type CreateAdSetData = {
42122
42182
  /**
42123
42183
  * Only "google" is implemented today; every other value returns 501.
42124
42184
  */
42125
- platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
42185
+ platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
42126
42186
  /**
42127
42187
  * Google platform campaign ID (numeric) the ad group is created under.
42128
42188
  */
@@ -42309,7 +42369,7 @@ export type GetAdSetDetailsError = (unknown | ErrorResponse);
42309
42369
 
42310
42370
  export type UpdateAdSetData = {
42311
42371
  body: {
42312
- platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
42372
+ platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
42313
42373
  /**
42314
42374
  * Omit if not updating budget
42315
42375
  */
@@ -42337,7 +42397,8 @@ export type UpdateAdSetData = {
42337
42397
  * COST_CAP = TARGET, with `bidAmount` as `bid_amount_local_micro`;
42338
42398
  * LOWEST_COST_WITH_MIN_ROAS is rejected with 422. X decides which strategy
42339
42399
  * the line item's objective allows (TARGET only on REACH, FOLLOWERS and
42340
- * WEBSITE_CLICKS, MAX not on REACH or FOLLOWERS). Other platforms
42400
+ * WEBSITE_CLICKS, MAX not on REACH or FOLLOWERS). On Reddit, see the mapping in the
42401
+ * description above (LOWEST_COST_WITH_MIN_ROAS returns 422). Other platforms
42341
42402
  * (linkedin, pinterest, google) return 501 Not Implemented when bidStrategy is set.
42342
42403
  *
42343
42404
  */
@@ -42522,7 +42583,7 @@ export type DeleteAdSetError = (ErrorResponse | unknown);
42522
42583
  export type UpdateAdSetStatusData = {
42523
42584
  body: {
42524
42585
  status: 'active' | 'paused';
42525
- platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
42586
+ platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
42526
42587
  };
42527
42588
  path: {
42528
42589
  /**
@@ -42538,7 +42599,7 @@ export type UpdateAdSetStatusResponse = ({
42538
42599
  */
42539
42600
  status?: 'active' | 'paused';
42540
42601
  /**
42541
- * 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.
42602
+ * 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.
42542
42603
  */
42543
42604
  platformAdSetStatus?: (string) | null;
42544
42605
  /**
@@ -42607,7 +42668,7 @@ export type GetAdTreeData = {
42607
42668
  * 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.
42608
42669
  */
42609
42670
  pageId?: string;
42610
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
42671
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
42611
42672
  /**
42612
42673
  * Profile ID
42613
42674
  */
@@ -42669,7 +42730,7 @@ export type GetAdsTimelineData = {
42669
42730
  /**
42670
42731
  * Restrict to one platform.
42671
42732
  */
42672
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
42733
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
42673
42734
  /**
42674
42735
  * Inclusive end of metrics range (YYYY-MM-DD). Defaults to today. Max 730-day range.
42675
42736
  */
@@ -45651,7 +45712,7 @@ export type ListAdNegativeKeywordListsData = {
45651
45712
  * @deprecated
45652
45713
  */
45653
45714
  customerId?: string;
45654
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45715
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
45655
45716
  };
45656
45717
  };
45657
45718
 
@@ -45691,7 +45752,7 @@ export type CreateAdNegativeKeywordListData = {
45691
45752
  /**
45692
45753
  * Optional courtesy field. The resolved account or campaign determines support; other platforms return 501.
45693
45754
  */
45694
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45755
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
45695
45756
  /**
45696
45757
  * Nonempty list name, trimmed before use.
45697
45758
  */
@@ -45735,7 +45796,7 @@ export type GetAdNegativeKeywordListData = {
45735
45796
  * @deprecated
45736
45797
  */
45737
45798
  customerId?: string;
45738
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45799
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
45739
45800
  };
45740
45801
  };
45741
45802
 
@@ -45777,7 +45838,7 @@ export type UpdateAdNegativeKeywordListData = {
45777
45838
  /**
45778
45839
  * Optional courtesy field. The resolved account or campaign determines support; other platforms return 501.
45779
45840
  */
45780
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45841
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
45781
45842
  /**
45782
45843
  * Nonempty list name, trimmed before use.
45783
45844
  */
@@ -45809,7 +45870,7 @@ export type DeleteAdNegativeKeywordListData = {
45809
45870
  * @deprecated
45810
45871
  */
45811
45872
  customerId?: string;
45812
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45873
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
45813
45874
  };
45814
45875
  };
45815
45876
 
@@ -45841,7 +45902,7 @@ export type ReplaceAdNegativeKeywordListKeywordsData = {
45841
45902
  /**
45842
45903
  * Optional courtesy field. The resolved account or campaign determines support; other platforms return 501.
45843
45904
  */
45844
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45905
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
45845
45906
  /**
45846
45907
  * Full desired keyword set. Bare strings use broad match. Send [] to clear the list.
45847
45908
  */
@@ -45874,7 +45935,7 @@ export type ListCampaignNegativeKeywordListsData = {
45874
45935
  campaignId: string;
45875
45936
  };
45876
45937
  query?: {
45877
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45938
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
45878
45939
  };
45879
45940
  };
45880
45941
 
@@ -45901,7 +45962,7 @@ export type ReplaceCampaignNegativeKeywordListsData = {
45901
45962
  /**
45902
45963
  * Optional courtesy field. The resolved account or campaign determines support; other platforms return 501.
45903
45964
  */
45904
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45965
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
45905
45966
  listIds: Array<(string)>;
45906
45967
  };
45907
45968
  path: {
@@ -46916,9 +46977,17 @@ export type ListAdAccountsResponse = ({
46916
46977
  */
46917
46978
  accountStatus?: unknown;
46918
46979
  /**
46919
- * 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.
46980
+ * 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.
46920
46981
  */
46921
46982
  approvalStatus?: string;
46983
+ /**
46984
+ * Reddit only. The ad account's time zone as Reddit reports it (`time_zone_id`). Schedules on Reddit ads are read in this zone.
46985
+ */
46986
+ timezone?: string;
46987
+ /**
46988
+ * Reddit only. Reddit's ad account type, forwarded unchanged.
46989
+ */
46990
+ type?: string;
46922
46991
  /**
46923
46992
  * 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.
46924
46993
  */
@@ -47134,11 +47203,11 @@ export type BoostPostData = {
47134
47203
  */
47135
47204
  postId?: string;
47136
47205
  /**
47137
- * 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.
47206
+ * 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.
47138
47207
  */
47139
47208
  platformPostId?: string;
47140
47209
  /**
47141
- * 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.
47210
+ * 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.
47142
47211
  */
47143
47212
  accountId: string;
47144
47213
  /**
@@ -47155,7 +47224,7 @@ export type BoostPostData = {
47155
47224
  */
47156
47225
  adSetName?: string;
47157
47226
  /**
47158
- * 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.
47227
+ * 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.
47159
47228
  */
47160
47229
  goal: 'engagement' | 'traffic' | 'awareness' | 'video_views' | 'lead_generation' | 'conversions' | 'app_promotion';
47161
47230
  /**
@@ -47218,11 +47287,11 @@ export type BoostPostData = {
47218
47287
  */
47219
47288
  currency?: string;
47220
47289
  /**
47221
- * 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.
47290
+ * 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.
47222
47291
  */
47223
47292
  startDate?: string;
47224
47293
  /**
47225
- * 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.
47294
+ * 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.
47226
47295
  */
47227
47296
  endDate?: string;
47228
47297
  /**
@@ -47246,18 +47315,22 @@ export type BoostPostData = {
47246
47315
  * Geo keys (`regions`/`cities`/`zips`/`metros`) resolve via
47247
47316
  * GET /v1/ads/targeting/search?dimension=geo. City radius and lat/lng
47248
47317
  * `customLocations` are Meta-only and preserve the boosted post's
47249
- * social proof (the ad references the existing post).
47318
+ * social proof (the ad references the existing post). On Reddit the whole
47319
+ * `TargetingSpec` applies, including `communities`, `excludedCommunities`,
47320
+ * `conversationKeywords`, `excludedConversationKeywords`, `interests`,
47321
+ * `audienceInclude` / `audienceExclude` and `excludedLocations`; without
47322
+ * any geo the ad targets the US.
47250
47323
  *
47251
47324
  */
47252
47325
  targeting?: {
47253
47326
  ageMin?: number;
47254
47327
  ageMax?: number;
47255
47328
  /**
47256
- * Applied on Meta, TikTok and Pinterest. Ignored on Google, LinkedIn and X.
47329
+ * Applied on Meta, TikTok, Pinterest and Reddit. Ignored on Google, LinkedIn and X.
47257
47330
  */
47258
47331
  gender?: 'all' | 'male' | 'female';
47259
47332
  /**
47260
- * Meta locale ids (numeric), passed through as given.
47333
+ * Meta locale ids (numeric), passed through as given. Reddit: language codes (e.g. `en`).
47261
47334
  */
47262
47335
  languages?: Array<(string)>;
47263
47336
  /**
@@ -47356,7 +47429,9 @@ export type BoostPostData = {
47356
47429
  * 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.
47357
47430
  *
47358
47431
  * Meta bid strategy applied to the ad set. On TikTok, mapped to
47359
- * `bid_type` / `bid_price` / `deep_bid_type` automatically.
47432
+ * `bid_type` / `bid_price` / `deep_bid_type` automatically. On Reddit,
47433
+ * applied to the new ad group (see the Reddit section above; 422 for
47434
+ * LOWEST_COST_WITH_MIN_ROAS).
47360
47435
  *
47361
47436
  * @deprecated
47362
47437
  */
@@ -47395,7 +47470,7 @@ export type BoostPostData = {
47395
47470
  */
47396
47471
  platformSpecificData?: (LinkedInAdsPlatformData | MetaAdsPlatformData);
47397
47472
  /**
47398
- * Meta only. Tracking specs (pixel, URL tags).
47473
+ * 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).
47399
47474
  */
47400
47475
  tracking?: {
47401
47476
  pixelId?: string;
@@ -47438,6 +47513,8 @@ export type BoostPostData = {
47438
47513
  * (`AdcreateCreatives.landing_page_url`); Spark Ads have no clickable
47439
47514
  * destination without it.
47440
47515
  *
47516
+ * **Reddit**: the ad's `click_url`, where a click on the promoted post lands.
47517
+ *
47441
47518
  * Ignored on LinkedIn / Pinterest / X / Google, which infer the destination
47442
47519
  * from the boosted post.
47443
47520
  *
@@ -47513,7 +47590,7 @@ export type BoostPostData = {
47513
47590
  minimumPurchaseCurrency?: string;
47514
47591
  }>;
47515
47592
  /**
47516
- * Meta and TikTok. What the conversion ad set optimizes toward, so a boost
47593
+ * Meta, TikTok and Reddit. What the conversion ad set optimizes toward, so a boost
47517
47594
  * of an existing organic post can run for a conversion instead of only
47518
47595
  * engagement or traffic. Required when `goal` is `conversions` (Meta also
47519
47596
  * `lead_conversion`); ignored on goals that do not optimize for a conversion.
@@ -47532,10 +47609,17 @@ export type BoostPostData = {
47532
47609
  * `platformPostId` + `sparkAuthCode`: the pixel lives on the ad group and
47533
47610
  * the Spark item on the creative.
47534
47611
  *
47612
+ * Reddit: every ad group carries a pixel, whatever the goal. `pixelId` picks
47613
+ * it (default: the ad account's first pixel; 422 when the account has none).
47614
+ * `conversions` requires `customEventType` (PURCHASE, LEAD,
47615
+ * COMPLETE_REGISTRATION, SIGN_UP, ADD_TO_CART, PAGE_VISIT, VIEW_CONTENT or
47616
+ * CONTENT_VIEW), and the pixel must already have received that event (422
47617
+ * otherwise); `lead_generation` needs the pixel to have received Lead.
47618
+ *
47535
47619
  */
47536
47620
  promotedObject?: {
47537
47621
  /**
47538
- * Meta Pixel id, or TikTok Pixel (numeric id or the alphanumeric pixel code from Events Manager, resolved for you).
47622
+ * Meta Pixel id, TikTok Pixel (numeric id or the alphanumeric pixel code from Events Manager, resolved for you), or Reddit pixel id.
47539
47623
  */
47540
47624
  pixelId?: string;
47541
47625
  /**
@@ -47568,7 +47652,7 @@ export type BoostPostData = {
47568
47652
  */
47569
47653
  dsaPayor?: string;
47570
47654
  /**
47571
- * 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.
47655
+ * 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).
47572
47656
  */
47573
47657
  leadGenFormId?: string;
47574
47658
  /**
@@ -47866,11 +47950,11 @@ export type CreateStandaloneAdData = {
47866
47950
  adAccountId: string;
47867
47951
  name: string;
47868
47952
  /**
47869
- * Meta only. Exact campaign name. Overrides the default `<name> - Campaign`.
47953
+ * Meta and Reddit. Exact campaign name. Overrides the default `<name> - Campaign`.
47870
47954
  */
47871
47955
  campaignName?: string;
47872
47956
  /**
47873
- * 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.)
47957
+ * 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.)
47874
47958
  */
47875
47959
  adSetName?: string;
47876
47960
  /**
@@ -47902,6 +47986,12 @@ export type CreateStandaloneAdData = {
47902
47986
  * **OpenAI Ads**
47903
47987
  * - 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.
47904
47988
  *
47989
+ * **Reddit Ads**
47990
+ * - `traffic` (CLICKS), `awareness` (BRAND_AWARENESS), `conversions`, `video_views` (VIDEO_VIEWABLE_IMPRESSIONS) and `lead_generation` (LEAD_GENERATION); any other goal returns 400.
47991
+ * - `conversions` requires `promotedObject.customEventType`; the pixel must already have received that event (see AdPromotedObject).
47992
+ * - `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.
47993
+ * - `video_views` needs a `video` (422 otherwise); `optimizationGoal` picks VIDEO_VIEW_6S (default) or VIDEO_VIEW_15S.
47994
+ *
47905
47995
  */
47906
47996
  goal?: 'engagement' | 'traffic' | 'awareness' | 'video_views' | 'lead_generation' | 'lead_conversion' | 'conversions' | 'app_promotion' | 'catalog_sales' | 'page_likes' | 'page_visits' | 'job_applicants';
47907
47997
  /**
@@ -47925,7 +48015,7 @@ export type CreateStandaloneAdData = {
47925
48015
  interestsBehaviors?: boolean;
47926
48016
  };
47927
48017
  /**
47928
- * 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.
48018
+ * 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.
47929
48019
  */
47930
48020
  optimizationGoal?: string;
47931
48021
  /**
@@ -47965,7 +48055,7 @@ export type CreateStandaloneAdData = {
47965
48055
  */
47966
48056
  budgetAmount?: number;
47967
48057
  /**
47968
- * 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.
48058
+ * 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`.
47969
48059
  */
47970
48060
  budgetType?: 'daily' | 'lifetime';
47971
48061
  /**
@@ -48013,7 +48103,7 @@ export type CreateStandaloneAdData = {
48013
48103
  */
48014
48104
  currency?: string;
48015
48105
  /**
48016
- * 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.
48106
+ * 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.
48017
48107
  */
48018
48108
  headline?: string;
48019
48109
  /**
@@ -48021,7 +48111,7 @@ export type CreateStandaloneAdData = {
48021
48111
  */
48022
48112
  longHeadline?: string;
48023
48113
  /**
48024
- * 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.
48114
+ * 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.
48025
48115
  */
48026
48116
  body?: string;
48027
48117
  /**
@@ -48058,19 +48148,19 @@ export type CreateStandaloneAdData = {
48058
48148
  */
48059
48149
  descriptions?: Array<(string)>;
48060
48150
  /**
48061
- * 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.
48151
+ * 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.
48062
48152
  */
48063
48153
  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';
48064
48154
  /**
48065
- * 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).
48155
+ * 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.
48066
48156
  */
48067
48157
  linkUrl?: string;
48068
48158
  /**
48069
- * 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.
48159
+ * 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).
48070
48160
  */
48071
48161
  leadGenFormId?: string;
48072
48162
  /**
48073
- * 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).
48163
+ * 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`.
48074
48164
  */
48075
48165
  imageUrl?: string;
48076
48166
  /**
@@ -48087,7 +48177,7 @@ export type CreateStandaloneAdData = {
48087
48177
  square?: string;
48088
48178
  };
48089
48179
  /**
48090
- * 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.
48180
+ * 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.
48091
48181
  */
48092
48182
  video?: {
48093
48183
  /**
@@ -48264,6 +48354,8 @@ export type CreateStandaloneAdData = {
48264
48354
  * UNDER the flat inline targeting fields below: `savedTargetingId` < `targeting` <
48265
48355
  * flat fields (a flat field present on the body replaces the nested value entirely).
48266
48356
  * Both forms are equivalent; use whichever your integration already builds.
48357
+ * Reddit-only targeting (`communities`, `excludedCommunities`,
48358
+ * `conversationKeywords`, `excludedConversationKeywords`) is sent here.
48267
48359
  *
48268
48360
  */
48269
48361
  targeting?: (TargetingSpec);
@@ -48474,14 +48566,14 @@ export type CreateStandaloneAdData = {
48474
48566
  [key: string]: (number);
48475
48567
  };
48476
48568
  /**
48477
- * 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.
48569
+ * 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.
48478
48570
  */
48479
48571
  endDate?: string;
48480
48572
  /**
48481
48573
  * Ad-set start time (ISO 8601, e.g. "2026-06-10T09:00:00Z"), mapped to the ad set's
48482
48574
  * start (Meta `start_time`, TikTok ad group `schedule_start_time`, LinkedIn / Pinterest / X
48483
48575
  * / Google campaign start). When omitted the ad starts delivering immediately. For lifetime
48484
- * budgets Meta also requires `endDate`. On Meta, TikTok, X, Pinterest and OpenAI a value
48576
+ * budgets Meta also requires `endDate`. On Meta, TikTok, X, Pinterest, OpenAI and Reddit a value
48485
48577
  * without an offset (`YYYY-MM-DD`, `YYYY-MM-DD HH:MM:SS` or `YYYY-MM-DDTHH:MM:SS`) is read
48486
48578
  * in the ad account timezone (Meta itself would read it as UTC). Google runs whole days in
48487
48579
  * the customer account timezone and takes the value's calendar date as written. LinkedIn
@@ -48558,6 +48650,11 @@ export type CreateStandaloneAdData = {
48558
48650
  adFormat?: 'SINGLE_IMAGE' | 'CAROUSEL_IMAGE' | 'SINGLE_VIDEO';
48559
48651
  };
48560
48652
  /**
48653
+ * Reddit: builds a carousel ad, each card with its image, destination (card `linkUrl`,
48654
+ * falling back to the top-level `linkUrl`, 400 when neither is set), call to action
48655
+ * (card `callToAction`, falling back to the top-level one) and caption (card
48656
+ * `headline`, else `description`). `headline` is still required.
48657
+ *
48561
48658
  * Meta only. Hand-built carousel: 2-10 authored cards in DETERMINISTIC order, mapped to
48562
48659
  * the creative's `link_data.child_attachments`. Unlike `dynamicCreative`,
48563
48660
  * you control the card order and per-card copy/link. Requires top-level `body`
@@ -48803,7 +48900,7 @@ export type CreateStandaloneAdData = {
48803
48900
  windowDays: 1 | 7 | 28;
48804
48901
  }>;
48805
48902
  /**
48806
- * 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.
48903
+ * 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.
48807
48904
  */
48808
48905
  gender?: 'all' | 'male' | 'female';
48809
48906
  /**
@@ -48813,6 +48910,8 @@ export type CreateStandaloneAdData = {
48813
48910
  *
48814
48911
  * 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.
48815
48912
  *
48913
+ * 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.
48914
+ *
48816
48915
  * 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.
48817
48916
  *
48818
48917
  * @deprecated
@@ -49743,7 +49842,7 @@ export type SearchAdTargetingData = {
49743
49842
  /**
49744
49843
  * 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.
49745
49844
  */
49746
- dimension?: 'geo' | 'interest' | 'interestKeyword' | 'behavior' | 'hashtag' | 'income' | 'language' | 'workPosition' | 'workEmployer' | 'workIndustry' | 'industry' | 'jobFunction' | 'seniority' | 'companySize';
49845
+ dimension?: 'geo' | 'interest' | 'interestKeyword' | 'behavior' | 'hashtag' | 'income' | 'language' | 'workPosition' | 'workEmployer' | 'workIndustry' | 'industry' | 'jobFunction' | 'seniority' | 'companySize' | 'community' | 'conversationKeyword';
49747
49846
  /**
49748
49847
  * Only used when `dimension=geo`. The kind of location to resolve. `all` searches every type in one relevance-ranked call. Defaults to `city`.
49749
49848
  */
@@ -49770,7 +49869,7 @@ export type SearchAdTargetingResponse = ({
49770
49869
  */
49771
49870
  name: string;
49772
49871
  /**
49773
- * 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, ...).
49872
+ * 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, ...).
49774
49873
  */
49775
49874
  type: string;
49776
49875
  /**
@@ -49790,7 +49889,7 @@ export type SearchAdTargetingResponse = ({
49790
49889
  */
49791
49890
  countryCode?: string;
49792
49891
  /**
49793
- * 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.
49892
+ * 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.
49794
49893
  */
49795
49894
  platformId?: string;
49796
49895
  }>;
@@ -51150,7 +51249,7 @@ export type GetConversionsQualityError = (ErrorResponse | unknown);
51150
51249
  export type SendConversionsData = {
51151
51250
  body: {
51152
51251
  /**
51153
- * SocialAccount ID (metaads, googleads, linkedinads, tiktokads, openaiads, or pinterestads).
51252
+ * SocialAccount ID (metaads, googleads, linkedinads, tiktokads, openaiads, pinterestads, or redditads).
51154
51253
  */
51155
51254
  accountId: string;
51156
51255
  /**
@@ -51158,13 +51257,14 @@ export type SendConversionsData = {
51158
51257
  * ID. For Google, the conversion action resource name. For
51159
51258
  * LinkedIn, the conversion rule ID or full
51160
51259
  * `urn:lla:llaPartnerConversion:{id}` URN. For OpenAI Ads, the
51161
- * pixel wire id. For Pinterest, the numeric ad account id.
51260
+ * pixel wire id. For Pinterest, the numeric ad account id. For
51261
+ * Reddit, the pixel id (`a2_...`).
51162
51262
  *
51163
51263
  */
51164
51264
  destinationId: string;
51165
51265
  events: Array<ConversionEvent>;
51166
51266
  /**
51167
- * 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.
51267
+ * 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.
51168
51268
  */
51169
51269
  testCode?: string;
51170
51270
  /**
@@ -51174,7 +51274,8 @@ export type SendConversionsData = {
51174
51274
  * the batch (data_processing_options ["LDU"] with
51175
51275
  * geolocation, country 0 / state 0); GRANTED or absent
51176
51276
  * consent sends events with Meta's default processing.
51177
- * Ignored by LinkedIn.
51277
+ * On Reddit, `adUserData: DENIED` drops every user field
51278
+ * from the events. Ignored by LinkedIn.
51178
51279
  *
51179
51280
  */
51180
51281
  consent?: {
@@ -51185,7 +51286,7 @@ export type SendConversionsData = {
51185
51286
  };
51186
51287
 
51187
51288
  export type SendConversionsResponse = ({
51188
- platform?: 'metaads' | 'googleads' | 'linkedinads' | 'tiktokads' | 'openaiads' | 'pinterestads';
51289
+ platform?: 'metaads' | 'googleads' | 'linkedinads' | 'tiktokads' | 'openaiads' | 'pinterestads' | 'redditads';
51189
51290
  /**
51190
51291
  * Events accepted by the platform.
51191
51292
  */
@@ -51209,8 +51310,8 @@ export type SendConversionsResponse = ({
51209
51310
  /**
51210
51311
  * Platform trace ID for debugging. fbtrace_id for Meta,
51211
51312
  * requestId for Google. Absent for LinkedIn (LinkedIn's
51212
- * conversionEvents endpoint does not surface a trace ID)
51213
- * and OpenAI Ads (no trace ID surfaced).
51313
+ * conversionEvents endpoint does not surface a trace ID),
51314
+ * OpenAI Ads and Reddit (no trace ID surfaced).
51214
51315
  *
51215
51316
  */
51216
51317
  traceId?: string;
@@ -51692,20 +51793,20 @@ export type UpdateCampaignConversionGoalsError = (ErrorResponse | unknown);
51692
51793
  export type ListConversionDestinationsData = {
51693
51794
  path: {
51694
51795
  /**
51695
- * SocialAccount ID (metaads, googleads, linkedinads, tiktokads, openaiads, or pinterestads).
51796
+ * SocialAccount ID (metaads, googleads, linkedinads, tiktokads, openaiads, pinterestads, or redditads).
51696
51797
  */
51697
51798
  accountId: string;
51698
51799
  };
51699
51800
  };
51700
51801
 
51701
51802
  export type ListConversionDestinationsResponse = ({
51702
- platform?: 'metaads' | 'googleads' | 'linkedinads' | 'tiktokads' | 'openaiads' | 'pinterestads';
51803
+ platform?: 'metaads' | 'googleads' | 'linkedinads' | 'tiktokads' | 'openaiads' | 'pinterestads' | 'redditads';
51703
51804
  destinations?: Array<{
51704
51805
  /**
51705
51806
  * Destination identifier. Meta: pixel ID. Google:
51706
51807
  * conversion action resource name. LinkedIn:
51707
51808
  * numeric conversion rule ID. OpenAI Ads: pixel wire
51708
- * id.
51809
+ * id. Reddit: pixel id (`a2_...`).
51709
51810
  *
51710
51811
  */
51711
51812
  id?: string;
@@ -51720,8 +51821,8 @@ export type ListConversionDestinationsResponse = ({
51720
51821
  status?: 'active' | 'inactive';
51721
51822
  /**
51722
51823
  * Set by adapters whose destinations are scoped to a
51723
- * specific ad account (LinkedIn). Pass back on
51724
- * subsequent CRUD calls.
51824
+ * specific ad account (LinkedIn, Reddit). On LinkedIn,
51825
+ * pass it back on subsequent CRUD calls.
51725
51826
  *
51726
51827
  */
51727
51828
  adAccountId?: string;