@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.
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.
@@ -19936,6 +19977,10 @@ type ListPostsData = {
19936
19977
  */
19937
19978
  source?: 'zernio' | 'external';
19938
19979
  status?: 'draft' | 'scheduled' | 'publishing' | 'published' | 'partial' | 'failed' | 'cancelled';
19980
+ /**
19981
+ * 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.
19982
+ */
19983
+ tags?: string;
19939
19984
  /**
19940
19985
  * 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).
19941
19986
  */
@@ -20566,7 +20611,7 @@ type DeleteProfileError = (unknown | ErrorResponse | {
20566
20611
  type ListAccountsData = {
20567
20612
  query?: {
20568
20613
  /**
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.
20614
+ * 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
20615
  */
20571
20616
  category?: 'social' | 'ads' | 'communication' | 'blogs';
20572
20617
  /**
@@ -20759,7 +20804,7 @@ type GetAllAccountsHealthData = {
20759
20804
  /**
20760
20805
  * Filter by platform
20761
20806
  */
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';
20807
+ 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
20808
  /**
20764
20809
  * Filter by profile ID
20765
20810
  */
@@ -21704,6 +21749,10 @@ type GetConnectUrlData = {
21704
21749
  * x_ads_denied, x_ads_auth_failed, x_ads_config_error, x_ads_account_not_found,
21705
21750
  * x_ads_state_error, x_ads_token_failed, x_ads_token_missing, x_ads_callback_error
21706
21751
  *
21752
+ * Reddit Ads (platform=redditads):
21753
+ * reddit_ads_auth_failed, reddit_ads_invalid_state, reddit_ads_access_denied,
21754
+ * reddit_ads_scope_not_granted, reddit_ads_no_ad_accounts, reddit_ads_callback_error
21755
+ *
21707
21756
  * Shopify (platform=shopify):
21708
21757
  * shopify_auth_failed, shopify_config_error, shopify_invalid_state, shopify_invalid_hmac,
21709
21758
  * shopify_invalid_shop, shopify_missing_scopes, shopify_callback_error
@@ -21714,8 +21763,8 @@ type GetConnectUrlData = {
21714
21763
  * and `tiktok_ads_auth_failed` may carry the provider's raw error string in `error_message`.
21715
21764
  *
21716
21765
  * 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`.
21766
+ * (`tiktokads`, `xads`), not the value used in the request path. The googleads, redditads and
21767
+ * shopify flows report `googleads`, `redditads` and `shopify`.
21719
21768
  *
21720
21769
  * 3. `missing_tiktok_permissions` means the TikTok authorization left out a permission the
21721
21770
  * already-connected account needs, so nothing was changed and it keeps working as before.
@@ -21933,7 +21982,7 @@ type ConnectAdsData = {
21933
21982
  * instagram_login flow no ads account can be created; do not use this value for those accounts.
21934
21983
  *
21935
21984
  */
21936
- platform: 'facebook' | 'instagram' | 'linkedin' | 'tiktok' | 'twitter' | 'pinterest' | 'googleads';
21985
+ platform: 'facebook' | 'instagram' | 'linkedin' | 'tiktok' | 'twitter' | 'pinterest' | 'googleads' | 'redditads';
21937
21986
  };
21938
21987
  query: {
21939
21988
  /**
@@ -21947,7 +21996,7 @@ type ConnectAdsData = {
21947
21996
  * profile's ads connection hangs off: that account is no longer connected, so the
21948
21997
  * call returns 409 `reconnect_required` instead of reconnecting another account.
21949
21998
  * Reconnect it via GET /v1/connect/{platform} first. Ignored for standalone
21950
- * platforms (`googleads`).
21999
+ * platforms (`googleads`, `redditads`).
21951
22000
  *
21952
22001
  */
21953
22002
  accountId?: string;
@@ -21957,7 +22006,8 @@ type ConnectAdsData = {
21957
22006
  * preserve the existing scope; supplied IDs are checked against the new grant. To change
21958
22007
  * that scope after migration, call this endpoint with the IDs and omit loginMode. Supported
21959
22008
  * on `facebook`/`instagram` (Meta, `act_<digits>`), `linkedin` (bare
21960
- * numeric sponsored-account id), `googleads` (bare customer id digits)
22009
+ * numeric sponsored-account id), `googleads` (bare customer id digits),
22010
+ * `redditads` (Reddit ad account id, `a2_<id>` or `t2_<id>`)
21961
22011
  * and `twitter` (X Ads, base36 account id). `tiktok` scopes advertisers
21962
22012
  * at OAuth and `pinterest` has no ads discovery, so both ignore it.
21963
22013
  * Meta ids are additionally validated against the connected token:
@@ -21973,9 +22023,9 @@ type ConnectAdsData = {
21973
22023
  * scoped ones, instead of every ad account the login can reach. The scope
21974
22024
  * is kept when this call returns an `authUrl`, so the Meta Ads account
21975
22025
  * 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.
22026
+ * subscribed) from the start. On `googleads` and `redditads` the scope is kept through
22027
+ * OAuth when `redirect_url` is set, so the connection created after OAuth
22028
+ * syncs only its scoped ad accounts from the first sync.
21979
22029
  * For multiple accounts use `adAccountIds` instead.
21980
22030
  *
21981
22031
  */
@@ -22032,17 +22082,19 @@ type ConnectAdsData = {
22032
22082
  /**
22033
22083
  * Custom URL the browser is sent to once the OAuth flow finishes. Honored on
22034
22084
  * every ads platform, including the separate-token (`tiktok`, `twitter`) and
22035
- * standalone (`googleads`) flows. MUST be an absolute http(s) URL or a custom
22085
+ * standalone (`googleads`, `redditads`) flows. MUST be an absolute http(s) URL or a custom
22036
22086
  * app scheme for mobile deeplinks (e.g. myapp://callback); a relative path is
22037
22087
  * rejected with 400 INVALID_REDIRECT_URL. On success
22038
- * `tiktok`, `twitter` and `googleads` land on the URL unchanged, while the
22088
+ * `tiktok` lands on the URL unchanged; `twitter`, `googleads` and `redditads`
22089
+ * append `connected` (the ads platform id: `xads`, `googleads` or `redditads`),
22090
+ * `profileId`, `accountId` (the ads connection) and `username`; and the
22039
22091
  * same-token platforms (`facebook`, `instagram`, `linkedin`, `pinterest`)
22040
22092
  * append `connected`, `profileId`, `accountId`, `username` and, on API-key
22041
22093
  * calls, `connect_token`. On failure the same error contract applies as on
22042
22094
  * GET /v1/connect/{platform}: `error` and `platform` are always appended,
22043
22095
  * 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
22096
+ * On the tiktok, twitter, googleads and redditads flows `platform` carries
22097
+ * the ads platform id (`tiktokads`, `xads`, `googleads`, `redditads`), not the value
22046
22098
  * used in the request path. When omitted, the browser lands on
22047
22099
  * the Zernio dashboard.
22048
22100
  *
@@ -39932,7 +39984,7 @@ type ListAdsData = {
39932
39984
  * 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
39985
  */
39934
39986
  pageId?: string;
39935
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
39987
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
39936
39988
  /**
39937
39989
  * Meta ad ID. Returns the ad with this platform-side ad ID.
39938
39990
  */
@@ -40624,7 +40676,7 @@ type ListAdCampaignsData = {
40624
40676
  * 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
40677
  */
40626
40678
  pageId?: string;
40627
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
40679
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
40628
40680
  /**
40629
40681
  * Profile ID
40630
40682
  */
@@ -40683,6 +40735,14 @@ type CreateAdCampaignData = {
40683
40735
  budgetAmount?: number;
40684
40736
  budgetType?: 'daily' | 'lifetime';
40685
40737
  status?: 'ACTIVE' | 'PAUSED';
40738
+ /**
40739
+ * 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.
40740
+ */
40741
+ startDate?: string;
40742
+ /**
40743
+ * 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`.
40744
+ */
40745
+ endDate?: string;
40686
40746
  /**
40687
40747
  * Google only (400 elsewhere). Written on the new campaign.
40688
40748
  */
@@ -40745,7 +40805,7 @@ type CreateAdCampaignError = (unknown | ErrorResponse);
40745
40805
  type UpdateAdCampaignStatusData = {
40746
40806
  body: {
40747
40807
  status: 'active' | 'paused';
40748
- platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
40808
+ platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
40749
40809
  };
40750
40810
  path: {
40751
40811
  /**
@@ -40760,7 +40820,7 @@ type UpdateAdCampaignStatusResponse = ({
40760
40820
  */
40761
40821
  status?: 'active' | 'paused';
40762
40822
  /**
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).
40823
+ * 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
40824
  */
40765
40825
  platformCampaignStatus?: (string) | null;
40766
40826
  /**
@@ -40962,7 +41022,7 @@ type UpdateAdCampaignData = {
40962
41022
  /**
40963
41023
  * Required: platform campaign IDs are not globally unique.
40964
41024
  */
40965
- platform: 'facebook' | 'instagram' | 'google';
41025
+ platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
40966
41026
  /**
40967
41027
  * **Meta only.** Zernio SocialAccount id owning the ad account. Needed only for an EMPTY campaign (zero ads); ignored otherwise.
40968
41028
  */
@@ -41006,7 +41066,7 @@ type UpdateAdCampaignData = {
41006
41066
  */
41007
41067
  sharedBudgetId?: (string) | null;
41008
41068
  /**
41009
- * Meta CBO, Google daily, or OpenAI Ads daily or lifetime campaign budget, in whole currency units.
41069
+ * Meta CBO, Google daily, or OpenAI Ads or Reddit Ads daily or lifetime campaign budget, in whole currency units.
41010
41070
  */
41011
41071
  budget?: {
41012
41072
  /**
@@ -41016,7 +41076,7 @@ type UpdateAdCampaignData = {
41016
41076
  type: 'daily' | 'lifetime';
41017
41077
  };
41018
41078
  /**
41019
- * **Meta only.** Rename the campaign.
41079
+ * **Meta and Reddit.** Rename the campaign.
41020
41080
  */
41021
41081
  name?: string;
41022
41082
  /**
@@ -41066,7 +41126,7 @@ type UpdateAdCampaignResponse = ({
41066
41126
  type UpdateAdCampaignError = (unknown | ErrorResponse);
41067
41127
  type DeleteAdCampaignData = {
41068
41128
  body: {
41069
- platform: 'facebook' | 'instagram' | 'google' | 'twitter';
41129
+ platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
41070
41130
  /**
41071
41131
  * 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
41132
  */
@@ -41102,7 +41162,7 @@ type ListCampaignNegativeKeywordsData = {
41102
41162
  /**
41103
41163
  * Optional and NOT authoritative: the resolved campaign's own platform decides 200 vs 501, never this hint.
41104
41164
  */
41105
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
41165
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
41106
41166
  };
41107
41167
  };
41108
41168
  type ListCampaignNegativeKeywordsResponse = ({
@@ -41126,7 +41186,7 @@ type ReplaceCampaignNegativeKeywordsData = {
41126
41186
  /**
41127
41187
  * Optional and NOT authoritative: the resolved campaign's own platform decides 200 vs 501, never this hint.
41128
41188
  */
41129
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
41189
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
41130
41190
  keywords: Array<KeywordEntry>;
41131
41191
  };
41132
41192
  path: {
@@ -41166,7 +41226,7 @@ type BulkUpdateAdCampaignStatusData = {
41166
41226
  /**
41167
41227
  * 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
41228
  */
41169
- platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'googleads' | 'tiktokads' | 'linkedinads' | 'pinterestads' | 'xads' | 'openaiads';
41229
+ platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit' | 'googleads' | 'tiktokads' | 'linkedinads' | 'pinterestads' | 'xads' | 'openaiads' | 'redditads';
41170
41230
  }>;
41171
41231
  };
41172
41232
  };
@@ -41509,7 +41569,7 @@ type ListAdSetsData = {
41509
41569
  * 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
41570
  */
41511
41571
  live?: boolean;
41512
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
41572
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
41513
41573
  };
41514
41574
  };
41515
41575
  type ListAdSetsResponse = ({
@@ -41655,7 +41715,7 @@ type CreateAdSetData = {
41655
41715
  /**
41656
41716
  * Only "google" is implemented today; every other value returns 501.
41657
41717
  */
41658
- platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
41718
+ platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
41659
41719
  /**
41660
41720
  * Google platform campaign ID (numeric) the ad group is created under.
41661
41721
  */
@@ -41830,7 +41890,7 @@ type GetAdSetDetailsResponse = ({
41830
41890
  type GetAdSetDetailsError = (unknown | ErrorResponse);
41831
41891
  type UpdateAdSetData = {
41832
41892
  body: {
41833
- platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
41893
+ platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
41834
41894
  /**
41835
41895
  * Omit if not updating budget
41836
41896
  */
@@ -41858,7 +41918,8 @@ type UpdateAdSetData = {
41858
41918
  * COST_CAP = TARGET, with `bidAmount` as `bid_amount_local_micro`;
41859
41919
  * LOWEST_COST_WITH_MIN_ROAS is rejected with 422. X decides which strategy
41860
41920
  * the line item's objective allows (TARGET only on REACH, FOLLOWERS and
41861
- * WEBSITE_CLICKS, MAX not on REACH or FOLLOWERS). Other platforms
41921
+ * WEBSITE_CLICKS, MAX not on REACH or FOLLOWERS). On Reddit, see the mapping in the
41922
+ * description above (LOWEST_COST_WITH_MIN_ROAS returns 422). Other platforms
41862
41923
  * (linkedin, pinterest, google) return 501 Not Implemented when bidStrategy is set.
41863
41924
  *
41864
41925
  */
@@ -42037,7 +42098,7 @@ type DeleteAdSetError = (ErrorResponse | unknown);
42037
42098
  type UpdateAdSetStatusData = {
42038
42099
  body: {
42039
42100
  status: 'active' | 'paused';
42040
- platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
42101
+ platform: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
42041
42102
  };
42042
42103
  path: {
42043
42104
  /**
@@ -42052,7 +42113,7 @@ type UpdateAdSetStatusResponse = ({
42052
42113
  */
42053
42114
  status?: 'active' | 'paused';
42054
42115
  /**
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.
42116
+ * 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
42117
  */
42057
42118
  platformAdSetStatus?: (string) | null;
42058
42119
  /**
@@ -42119,7 +42180,7 @@ type GetAdTreeData = {
42119
42180
  * 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
42181
  */
42121
42182
  pageId?: string;
42122
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
42183
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
42123
42184
  /**
42124
42185
  * Profile ID
42125
42186
  */
@@ -42178,7 +42239,7 @@ type GetAdsTimelineData = {
42178
42239
  /**
42179
42240
  * Restrict to one platform.
42180
42241
  */
42181
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
42242
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
42182
42243
  /**
42183
42244
  * Inclusive end of metrics range (YYYY-MM-DD). Defaults to today. Max 730-day range.
42184
42245
  */
@@ -44962,7 +45023,7 @@ type ListAdNegativeKeywordListsData = {
44962
45023
  * @deprecated
44963
45024
  */
44964
45025
  customerId?: string;
44965
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45026
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
44966
45027
  };
44967
45028
  };
44968
45029
  type ListAdNegativeKeywordListsResponse = ({
@@ -44999,7 +45060,7 @@ type CreateAdNegativeKeywordListData = {
44999
45060
  /**
45000
45061
  * Optional courtesy field. The resolved account or campaign determines support; other platforms return 501.
45001
45062
  */
45002
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45063
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
45003
45064
  /**
45004
45065
  * Nonempty list name, trimmed before use.
45005
45066
  */
@@ -45040,7 +45101,7 @@ type GetAdNegativeKeywordListData = {
45040
45101
  * @deprecated
45041
45102
  */
45042
45103
  customerId?: string;
45043
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45104
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
45044
45105
  };
45045
45106
  };
45046
45107
  type GetAdNegativeKeywordListResponse = ({
@@ -45079,7 +45140,7 @@ type UpdateAdNegativeKeywordListData = {
45079
45140
  /**
45080
45141
  * Optional courtesy field. The resolved account or campaign determines support; other platforms return 501.
45081
45142
  */
45082
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45143
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
45083
45144
  /**
45084
45145
  * Nonempty list name, trimmed before use.
45085
45146
  */
@@ -45108,7 +45169,7 @@ type DeleteAdNegativeKeywordListData = {
45108
45169
  * @deprecated
45109
45170
  */
45110
45171
  customerId?: string;
45111
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45172
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
45112
45173
  };
45113
45174
  };
45114
45175
  type DeleteAdNegativeKeywordListResponse = ({
@@ -45137,7 +45198,7 @@ type ReplaceAdNegativeKeywordListKeywordsData = {
45137
45198
  /**
45138
45199
  * Optional courtesy field. The resolved account or campaign determines support; other platforms return 501.
45139
45200
  */
45140
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45201
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
45141
45202
  /**
45142
45203
  * Full desired keyword set. Bare strings use broad match. Send [] to clear the list.
45143
45204
  */
@@ -45167,7 +45228,7 @@ type ListCampaignNegativeKeywordListsData = {
45167
45228
  campaignId: string;
45168
45229
  };
45169
45230
  query?: {
45170
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45231
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
45171
45232
  };
45172
45233
  };
45173
45234
  type ListCampaignNegativeKeywordListsResponse = ({
@@ -45191,7 +45252,7 @@ type ReplaceCampaignNegativeKeywordListsData = {
45191
45252
  /**
45192
45253
  * Optional courtesy field. The resolved account or campaign determines support; other platforms return 501.
45193
45254
  */
45194
- platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
45255
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai' | 'reddit';
45195
45256
  listIds: Array<(string)>;
45196
45257
  };
45197
45258
  path: {
@@ -46139,9 +46200,17 @@ type ListAdAccountsResponse = ({
46139
46200
  */
46140
46201
  accountStatus?: unknown;
46141
46202
  /**
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.
46203
+ * 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
46204
  */
46144
46205
  approvalStatus?: string;
46206
+ /**
46207
+ * Reddit only. The ad account's time zone as Reddit reports it (`time_zone_id`). Schedules on Reddit ads are read in this zone.
46208
+ */
46209
+ timezone?: string;
46210
+ /**
46211
+ * Reddit only. Reddit's ad account type, forwarded unchanged.
46212
+ */
46213
+ type?: string;
46145
46214
  /**
46146
46215
  * 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
46216
  */
@@ -46346,11 +46415,11 @@ type BoostPostData = {
46346
46415
  */
46347
46416
  postId?: string;
46348
46417
  /**
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.
46418
+ * 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
46419
  */
46351
46420
  platformPostId?: string;
46352
46421
  /**
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.
46422
+ * 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
46423
  */
46355
46424
  accountId: string;
46356
46425
  /**
@@ -46367,7 +46436,7 @@ type BoostPostData = {
46367
46436
  */
46368
46437
  adSetName?: string;
46369
46438
  /**
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.
46439
+ * 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
46440
  */
46372
46441
  goal: 'engagement' | 'traffic' | 'awareness' | 'video_views' | 'lead_generation' | 'conversions' | 'app_promotion';
46373
46442
  /**
@@ -46430,11 +46499,11 @@ type BoostPostData = {
46430
46499
  */
46431
46500
  currency?: string;
46432
46501
  /**
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.
46502
+ * 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
46503
  */
46435
46504
  startDate?: string;
46436
46505
  /**
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.
46506
+ * 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
46507
  */
46439
46508
  endDate?: string;
46440
46509
  /**
@@ -46458,18 +46527,22 @@ type BoostPostData = {
46458
46527
  * Geo keys (`regions`/`cities`/`zips`/`metros`) resolve via
46459
46528
  * GET /v1/ads/targeting/search?dimension=geo. City radius and lat/lng
46460
46529
  * `customLocations` are Meta-only and preserve the boosted post's
46461
- * social proof (the ad references the existing post).
46530
+ * social proof (the ad references the existing post). On Reddit the whole
46531
+ * `TargetingSpec` applies, including `communities`, `excludedCommunities`,
46532
+ * `conversationKeywords`, `excludedConversationKeywords`, `interests`,
46533
+ * `audienceInclude` / `audienceExclude` and `excludedLocations`; without
46534
+ * any geo the ad targets the US.
46462
46535
  *
46463
46536
  */
46464
46537
  targeting?: {
46465
46538
  ageMin?: number;
46466
46539
  ageMax?: number;
46467
46540
  /**
46468
- * Applied on Meta, TikTok and Pinterest. Ignored on Google, LinkedIn and X.
46541
+ * Applied on Meta, TikTok, Pinterest and Reddit. Ignored on Google, LinkedIn and X.
46469
46542
  */
46470
46543
  gender?: 'all' | 'male' | 'female';
46471
46544
  /**
46472
- * Meta locale ids (numeric), passed through as given.
46545
+ * Meta locale ids (numeric), passed through as given. Reddit: language codes (e.g. `en`).
46473
46546
  */
46474
46547
  languages?: Array<(string)>;
46475
46548
  /**
@@ -46568,7 +46641,9 @@ type BoostPostData = {
46568
46641
  * 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
46642
  *
46570
46643
  * Meta bid strategy applied to the ad set. On TikTok, mapped to
46571
- * `bid_type` / `bid_price` / `deep_bid_type` automatically.
46644
+ * `bid_type` / `bid_price` / `deep_bid_type` automatically. On Reddit,
46645
+ * applied to the new ad group (see the Reddit section above; 422 for
46646
+ * LOWEST_COST_WITH_MIN_ROAS).
46572
46647
  *
46573
46648
  * @deprecated
46574
46649
  */
@@ -46607,7 +46682,7 @@ type BoostPostData = {
46607
46682
  */
46608
46683
  platformSpecificData?: (LinkedInAdsPlatformData | MetaAdsPlatformData);
46609
46684
  /**
46610
- * Meta only. Tracking specs (pixel, URL tags).
46685
+ * 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
46686
  */
46612
46687
  tracking?: {
46613
46688
  pixelId?: string;
@@ -46650,6 +46725,8 @@ type BoostPostData = {
46650
46725
  * (`AdcreateCreatives.landing_page_url`); Spark Ads have no clickable
46651
46726
  * destination without it.
46652
46727
  *
46728
+ * **Reddit**: the ad's `click_url`, where a click on the promoted post lands.
46729
+ *
46653
46730
  * Ignored on LinkedIn / Pinterest / X / Google, which infer the destination
46654
46731
  * from the boosted post.
46655
46732
  *
@@ -46725,7 +46802,7 @@ type BoostPostData = {
46725
46802
  minimumPurchaseCurrency?: string;
46726
46803
  }>;
46727
46804
  /**
46728
- * Meta and TikTok. What the conversion ad set optimizes toward, so a boost
46805
+ * Meta, TikTok and Reddit. What the conversion ad set optimizes toward, so a boost
46729
46806
  * of an existing organic post can run for a conversion instead of only
46730
46807
  * engagement or traffic. Required when `goal` is `conversions` (Meta also
46731
46808
  * `lead_conversion`); ignored on goals that do not optimize for a conversion.
@@ -46744,10 +46821,17 @@ type BoostPostData = {
46744
46821
  * `platformPostId` + `sparkAuthCode`: the pixel lives on the ad group and
46745
46822
  * the Spark item on the creative.
46746
46823
  *
46824
+ * Reddit: every ad group carries a pixel, whatever the goal. `pixelId` picks
46825
+ * it (default: the ad account's first pixel; 422 when the account has none).
46826
+ * `conversions` requires `customEventType` (PURCHASE, LEAD,
46827
+ * COMPLETE_REGISTRATION, SIGN_UP, ADD_TO_CART, PAGE_VISIT, VIEW_CONTENT or
46828
+ * CONTENT_VIEW), and the pixel must already have received that event (422
46829
+ * otherwise); `lead_generation` needs the pixel to have received Lead.
46830
+ *
46747
46831
  */
46748
46832
  promotedObject?: {
46749
46833
  /**
46750
- * Meta Pixel id, or TikTok Pixel (numeric id or the alphanumeric pixel code from Events Manager, resolved for you).
46834
+ * Meta Pixel id, TikTok Pixel (numeric id or the alphanumeric pixel code from Events Manager, resolved for you), or Reddit pixel id.
46751
46835
  */
46752
46836
  pixelId?: string;
46753
46837
  /**
@@ -46780,7 +46864,7 @@ type BoostPostData = {
46780
46864
  */
46781
46865
  dsaPayor?: string;
46782
46866
  /**
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.
46867
+ * 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
46868
  */
46785
46869
  leadGenFormId?: string;
46786
46870
  /**
@@ -47054,11 +47138,11 @@ type CreateStandaloneAdData = {
47054
47138
  adAccountId: string;
47055
47139
  name: string;
47056
47140
  /**
47057
- * Meta only. Exact campaign name. Overrides the default `<name> - Campaign`.
47141
+ * Meta and Reddit. Exact campaign name. Overrides the default `<name> - Campaign`.
47058
47142
  */
47059
47143
  campaignName?: string;
47060
47144
  /**
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.)
47145
+ * 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
47146
  */
47063
47147
  adSetName?: string;
47064
47148
  /**
@@ -47090,6 +47174,12 @@ type CreateStandaloneAdData = {
47090
47174
  * **OpenAI Ads**
47091
47175
  * - 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
47176
  *
47177
+ * **Reddit Ads**
47178
+ * - `traffic` (CLICKS), `awareness` (BRAND_AWARENESS), `conversions`, `video_views` (VIDEO_VIEWABLE_IMPRESSIONS) and `lead_generation` (LEAD_GENERATION); any other goal returns 400.
47179
+ * - `conversions` requires `promotedObject.customEventType`; the pixel must already have received that event (see AdPromotedObject).
47180
+ * - `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.
47181
+ * - `video_views` needs a `video` (422 otherwise); `optimizationGoal` picks VIDEO_VIEW_6S (default) or VIDEO_VIEW_15S.
47182
+ *
47093
47183
  */
47094
47184
  goal?: 'engagement' | 'traffic' | 'awareness' | 'video_views' | 'lead_generation' | 'lead_conversion' | 'conversions' | 'app_promotion' | 'catalog_sales' | 'page_likes' | 'page_visits' | 'job_applicants';
47095
47185
  /**
@@ -47113,7 +47203,7 @@ type CreateStandaloneAdData = {
47113
47203
  interestsBehaviors?: boolean;
47114
47204
  };
47115
47205
  /**
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.
47206
+ * 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
47207
  */
47118
47208
  optimizationGoal?: string;
47119
47209
  /**
@@ -47153,7 +47243,7 @@ type CreateStandaloneAdData = {
47153
47243
  */
47154
47244
  budgetAmount?: number;
47155
47245
  /**
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.
47246
+ * 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
47247
  */
47158
47248
  budgetType?: 'daily' | 'lifetime';
47159
47249
  /**
@@ -47201,7 +47291,7 @@ type CreateStandaloneAdData = {
47201
47291
  */
47202
47292
  currency?: string;
47203
47293
  /**
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.
47294
+ * 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
47295
  */
47206
47296
  headline?: string;
47207
47297
  /**
@@ -47209,7 +47299,7 @@ type CreateStandaloneAdData = {
47209
47299
  */
47210
47300
  longHeadline?: string;
47211
47301
  /**
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.
47302
+ * 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
47303
  */
47214
47304
  body?: string;
47215
47305
  /**
@@ -47246,19 +47336,19 @@ type CreateStandaloneAdData = {
47246
47336
  */
47247
47337
  descriptions?: Array<(string)>;
47248
47338
  /**
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.
47339
+ * 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
47340
  */
47251
47341
  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
47342
  /**
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).
47343
+ * 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
47344
  */
47255
47345
  linkUrl?: string;
47256
47346
  /**
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.
47347
+ * 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
47348
  */
47259
47349
  leadGenFormId?: string;
47260
47350
  /**
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).
47351
+ * 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
47352
  */
47263
47353
  imageUrl?: string;
47264
47354
  /**
@@ -47275,7 +47365,7 @@ type CreateStandaloneAdData = {
47275
47365
  square?: string;
47276
47366
  };
47277
47367
  /**
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.
47368
+ * 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
47369
  */
47280
47370
  video?: {
47281
47371
  /**
@@ -47452,6 +47542,8 @@ type CreateStandaloneAdData = {
47452
47542
  * UNDER the flat inline targeting fields below: `savedTargetingId` < `targeting` <
47453
47543
  * flat fields (a flat field present on the body replaces the nested value entirely).
47454
47544
  * Both forms are equivalent; use whichever your integration already builds.
47545
+ * Reddit-only targeting (`communities`, `excludedCommunities`,
47546
+ * `conversationKeywords`, `excludedConversationKeywords`) is sent here.
47455
47547
  *
47456
47548
  */
47457
47549
  targeting?: (TargetingSpec);
@@ -47662,14 +47754,14 @@ type CreateStandaloneAdData = {
47662
47754
  [key: string]: (number);
47663
47755
  };
47664
47756
  /**
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.
47757
+ * 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
47758
  */
47667
47759
  endDate?: string;
47668
47760
  /**
47669
47761
  * Ad-set start time (ISO 8601, e.g. "2026-06-10T09:00:00Z"), mapped to the ad set's
47670
47762
  * start (Meta `start_time`, TikTok ad group `schedule_start_time`, LinkedIn / Pinterest / X
47671
47763
  * / 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
47764
+ * budgets Meta also requires `endDate`. On Meta, TikTok, X, Pinterest, OpenAI and Reddit a value
47673
47765
  * without an offset (`YYYY-MM-DD`, `YYYY-MM-DD HH:MM:SS` or `YYYY-MM-DDTHH:MM:SS`) is read
47674
47766
  * in the ad account timezone (Meta itself would read it as UTC). Google runs whole days in
47675
47767
  * the customer account timezone and takes the value's calendar date as written. LinkedIn
@@ -47746,6 +47838,11 @@ type CreateStandaloneAdData = {
47746
47838
  adFormat?: 'SINGLE_IMAGE' | 'CAROUSEL_IMAGE' | 'SINGLE_VIDEO';
47747
47839
  };
47748
47840
  /**
47841
+ * Reddit: builds a carousel ad, each card with its image, destination (card `linkUrl`,
47842
+ * falling back to the top-level `linkUrl`, 400 when neither is set), call to action
47843
+ * (card `callToAction`, falling back to the top-level one) and caption (card
47844
+ * `headline`, else `description`). `headline` is still required.
47845
+ *
47749
47846
  * Meta only. Hand-built carousel: 2-10 authored cards in DETERMINISTIC order, mapped to
47750
47847
  * the creative's `link_data.child_attachments`. Unlike `dynamicCreative`,
47751
47848
  * you control the card order and per-card copy/link. Requires top-level `body`
@@ -47991,7 +48088,7 @@ type CreateStandaloneAdData = {
47991
48088
  windowDays: 1 | 7 | 28;
47992
48089
  }>;
47993
48090
  /**
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.
48091
+ * 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
48092
  */
47996
48093
  gender?: 'all' | 'male' | 'female';
47997
48094
  /**
@@ -48001,6 +48098,8 @@ type CreateStandaloneAdData = {
48001
48098
  *
48002
48099
  * 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
48100
  *
48101
+ * 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.
48102
+ *
48004
48103
  * 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
48104
  *
48006
48105
  * @deprecated
@@ -48883,7 +48982,7 @@ type SearchAdTargetingData = {
48883
48982
  /**
48884
48983
  * 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
48984
  */
48886
- dimension?: 'geo' | 'interest' | 'interestKeyword' | 'behavior' | 'hashtag' | 'income' | 'language' | 'workPosition' | 'workEmployer' | 'workIndustry' | 'industry' | 'jobFunction' | 'seniority' | 'companySize';
48985
+ dimension?: 'geo' | 'interest' | 'interestKeyword' | 'behavior' | 'hashtag' | 'income' | 'language' | 'workPosition' | 'workEmployer' | 'workIndustry' | 'industry' | 'jobFunction' | 'seniority' | 'companySize' | 'community' | 'conversationKeyword';
48887
48986
  /**
48888
48987
  * Only used when `dimension=geo`. The kind of location to resolve. `all` searches every type in one relevance-ranked call. Defaults to `city`.
48889
48988
  */
@@ -48909,7 +49008,7 @@ type SearchAdTargetingResponse = ({
48909
49008
  */
48910
49009
  name: string;
48911
49010
  /**
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, ...).
49011
+ * 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
49012
  */
48914
49013
  type: string;
48915
49014
  /**
@@ -48929,7 +49028,7 @@ type SearchAdTargetingResponse = ({
48929
49028
  */
48930
49029
  countryCode?: string;
48931
49030
  /**
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.
49031
+ * 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
49032
  */
48934
49033
  platformId?: string;
48935
49034
  }>;
@@ -50191,7 +50290,7 @@ type GetConversionsQualityError = (ErrorResponse | unknown);
50191
50290
  type SendConversionsData = {
50192
50291
  body: {
50193
50292
  /**
50194
- * SocialAccount ID (metaads, googleads, linkedinads, tiktokads, openaiads, or pinterestads).
50293
+ * SocialAccount ID (metaads, googleads, linkedinads, tiktokads, openaiads, pinterestads, or redditads).
50195
50294
  */
50196
50295
  accountId: string;
50197
50296
  /**
@@ -50199,13 +50298,14 @@ type SendConversionsData = {
50199
50298
  * ID. For Google, the conversion action resource name. For
50200
50299
  * LinkedIn, the conversion rule ID or full
50201
50300
  * `urn:lla:llaPartnerConversion:{id}` URN. For OpenAI Ads, the
50202
- * pixel wire id. For Pinterest, the numeric ad account id.
50301
+ * pixel wire id. For Pinterest, the numeric ad account id. For
50302
+ * Reddit, the pixel id (`a2_...`).
50203
50303
  *
50204
50304
  */
50205
50305
  destinationId: string;
50206
50306
  events: Array<ConversionEvent>;
50207
50307
  /**
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.
50308
+ * 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
50309
  */
50210
50310
  testCode?: string;
50211
50311
  /**
@@ -50215,7 +50315,8 @@ type SendConversionsData = {
50215
50315
  * the batch (data_processing_options ["LDU"] with
50216
50316
  * geolocation, country 0 / state 0); GRANTED or absent
50217
50317
  * consent sends events with Meta's default processing.
50218
- * Ignored by LinkedIn.
50318
+ * On Reddit, `adUserData: DENIED` drops every user field
50319
+ * from the events. Ignored by LinkedIn.
50219
50320
  *
50220
50321
  */
50221
50322
  consent?: {
@@ -50225,7 +50326,7 @@ type SendConversionsData = {
50225
50326
  };
50226
50327
  };
50227
50328
  type SendConversionsResponse = ({
50228
- platform?: 'metaads' | 'googleads' | 'linkedinads' | 'tiktokads' | 'openaiads' | 'pinterestads';
50329
+ platform?: 'metaads' | 'googleads' | 'linkedinads' | 'tiktokads' | 'openaiads' | 'pinterestads' | 'redditads';
50229
50330
  /**
50230
50331
  * Events accepted by the platform.
50231
50332
  */
@@ -50249,8 +50350,8 @@ type SendConversionsResponse = ({
50249
50350
  /**
50250
50351
  * Platform trace ID for debugging. fbtrace_id for Meta,
50251
50352
  * 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).
50353
+ * conversionEvents endpoint does not surface a trace ID),
50354
+ * OpenAI Ads and Reddit (no trace ID surfaced).
50254
50355
  *
50255
50356
  */
50256
50357
  traceId?: string;
@@ -50694,19 +50795,19 @@ type UpdateCampaignConversionGoalsError = (ErrorResponse | unknown);
50694
50795
  type ListConversionDestinationsData = {
50695
50796
  path: {
50696
50797
  /**
50697
- * SocialAccount ID (metaads, googleads, linkedinads, tiktokads, openaiads, or pinterestads).
50798
+ * SocialAccount ID (metaads, googleads, linkedinads, tiktokads, openaiads, pinterestads, or redditads).
50698
50799
  */
50699
50800
  accountId: string;
50700
50801
  };
50701
50802
  };
50702
50803
  type ListConversionDestinationsResponse = ({
50703
- platform?: 'metaads' | 'googleads' | 'linkedinads' | 'tiktokads' | 'openaiads' | 'pinterestads';
50804
+ platform?: 'metaads' | 'googleads' | 'linkedinads' | 'tiktokads' | 'openaiads' | 'pinterestads' | 'redditads';
50704
50805
  destinations?: Array<{
50705
50806
  /**
50706
50807
  * Destination identifier. Meta: pixel ID. Google:
50707
50808
  * conversion action resource name. LinkedIn:
50708
50809
  * numeric conversion rule ID. OpenAI Ads: pixel wire
50709
- * id.
50810
+ * id. Reddit: pixel id (`a2_...`).
50710
50811
  *
50711
50812
  */
50712
50813
  id?: string;
@@ -50721,8 +50822,8 @@ type ListConversionDestinationsResponse = ({
50721
50822
  status?: 'active' | 'inactive';
50722
50823
  /**
50723
50824
  * Set by adapters whose destinations are scoped to a
50724
- * specific ad account (LinkedIn). Pass back on
50725
- * subsequent CRUD calls.
50825
+ * specific ad account (LinkedIn, Reddit). On LinkedIn,
50826
+ * pass it back on subsequent CRUD calls.
50726
50827
  *
50727
50828
  */
50728
50829
  adAccountId?: string;