upload-post 2.12.0 → 2.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. package/README.md +111 -9
  2. package/index.d.ts +368 -17
  3. package/index.js +375 -16
  4. package/package.json +2 -2
package/index.d.ts CHANGED
@@ -56,6 +56,8 @@ declare module 'upload-post' {
56
56
  user: string;
57
57
  /** First comment to post after publishing */
58
58
  firstComment?: string;
59
+ /** Reply to an existing post (X: tweet ID; Bluesky: post URL or AT-URI). */
60
+ replyToId?: string;
59
61
  /** Alt text for accessibility */
60
62
  altText?: string;
61
63
  /** ISO date for scheduling (e.g., "2024-12-25T10:00:00Z") */
@@ -136,12 +138,23 @@ declare module 'upload-post' {
136
138
  tiktokCoverTimestamp?: number;
137
139
  /** AI-generated content flag */
138
140
  tiktokIsAigc?: boolean;
139
- /** Post mode */
141
+ /**
142
+ * Post mode. `MEDIA_UPLOAD` is the same draft as {@link TikTokVideoOptions.tiktokUploadToDraft}.
143
+ * Alias: `postMode` / `post_mode`.
144
+ */
140
145
  tiktokPostMode?: TikTokPostMode;
146
+ /** Alias of {@link TikTokVideoOptions.tiktokPostMode}. */
147
+ postMode?: TikTokPostMode;
148
+ /** Alias of {@link TikTokVideoOptions.tiktokPostMode}. */
149
+ post_mode?: TikTokPostMode;
141
150
  /** Branded content toggle */
142
151
  brandContentToggle?: boolean;
143
152
  /** Brand organic toggle */
144
153
  brandOrganicToggle?: boolean;
154
+ /** Only show the video in ads */
155
+ tiktokIsAdsOnly?: boolean;
156
+ /** TikTok One invite link. Requires branded content. */
157
+ tiktokTtoInviteLink?: string;
145
158
 
146
159
  // ---- Music, location, cover and draft ----
147
160
  // Available on connections that declare the matching capability (`music`,
@@ -169,8 +182,18 @@ declare module 'upload-post' {
169
182
  tiktokCoverImageUrl?: string;
170
183
  /** AI-generated content disclosure */
171
184
  tiktokIsAiGenerated?: boolean;
172
- /** Publish to drafts. When true TikTok ignores the rest of the post settings */
185
+ /**
186
+ * Publish to drafts. Same draft as `tiktokPostMode: 'MEDIA_UPLOAD'` /
187
+ * `postMode: 'MEDIA_UPLOAD'`. Aliases: `uploadToDraft`, `tiktok_upload_to_draft`,
188
+ * `upload_to_draft`. When true TikTok ignores the rest of the post settings.
189
+ */
173
190
  tiktokUploadToDraft?: boolean;
191
+ /** Alias of {@link TikTokVideoOptions.tiktokUploadToDraft}. */
192
+ uploadToDraft?: boolean;
193
+ /** Alias of {@link TikTokVideoOptions.tiktokUploadToDraft}. */
194
+ tiktok_upload_to_draft?: boolean;
195
+ /** Alias of {@link TikTokVideoOptions.tiktokUploadToDraft}. */
196
+ upload_to_draft?: boolean;
174
197
  }
175
198
 
176
199
  export interface TikTokPhotoOptions {
@@ -188,20 +211,27 @@ declare module 'upload-post' {
188
211
  * ones.
189
212
  */
190
213
  tiktokPrivacyLevel?: TikTokPrivacyLevel;
191
- /** Post mode, e.g. DIRECT_POST or MEDIA_UPLOAD (inbox) */
192
- tiktokPostMode?: string;
214
+ /**
215
+ * Post mode. `MEDIA_UPLOAD` is the same draft as {@link TikTokPhotoOptions.tiktokUploadToDraft}.
216
+ * Alias: `postMode` / `post_mode`.
217
+ */
218
+ tiktokPostMode?: TikTokPostMode;
219
+ /** Alias of {@link TikTokPhotoOptions.tiktokPostMode}. */
220
+ postMode?: TikTokPostMode;
221
+ /** Alias of {@link TikTokPhotoOptions.tiktokPostMode}. */
222
+ post_mode?: TikTokPostMode;
193
223
  /** Branded content toggle */
194
224
  brandContentToggle?: boolean;
195
225
  /** Brand organic toggle */
196
226
  brandOrganicToggle?: boolean;
197
227
 
198
- // ---- Music, location and AI disclosure ----
199
- // Photo posts accept the track id, the location pair and the AI disclosure —
200
- // not the volume/trim, cover-image or draft fields, which are video-only.
201
- // Available on connections that declare the matching capability (`music`,
202
- // `location`) — see `capabilities` on the TikTok account returned by
203
- // listUsers(). Without it the field is ignored, the post still publishes, and
204
- // the response includes a per-field `warnings` entry.
228
+ // ---- Music, location, AI disclosure and draft ----
229
+ // Photo posts accept the track id, the location pair, the AI disclosure and
230
+ // the draft switch — not the volume/trim or cover-image fields, which are
231
+ // video-only. Available on connections that declare the matching capability
232
+ // (`music`, `location`, `draft`) — see `capabilities` on the TikTok account
233
+ // returned by listUsers(). Without it the field is ignored, the post still
234
+ // publishes, and the response includes a per-field `warnings` entry.
205
235
 
206
236
  /** Commercial Music Library track id (see getTiktokTrendingMusic) */
207
237
  tiktokMusicId?: string;
@@ -211,6 +241,18 @@ declare module 'upload-post' {
211
241
  tiktokLocationName?: string;
212
242
  /** AI-generated content disclosure */
213
243
  tiktokIsAiGenerated?: boolean;
244
+ /**
245
+ * Publish to drafts. Same draft as `tiktokPostMode: 'MEDIA_UPLOAD'` /
246
+ * `postMode: 'MEDIA_UPLOAD'`. Aliases: `uploadToDraft`, `tiktok_upload_to_draft`,
247
+ * `upload_to_draft`.
248
+ */
249
+ tiktokUploadToDraft?: boolean;
250
+ /** Alias of {@link TikTokPhotoOptions.tiktokUploadToDraft}. */
251
+ uploadToDraft?: boolean;
252
+ /** Alias of {@link TikTokPhotoOptions.tiktokUploadToDraft}. */
253
+ tiktok_upload_to_draft?: boolean;
254
+ /** Alias of {@link TikTokPhotoOptions.tiktokUploadToDraft}. */
255
+ upload_to_draft?: boolean;
214
256
  }
215
257
 
216
258
  // ==================== Instagram Options ====================
@@ -243,6 +285,8 @@ declare module 'upload-post' {
243
285
  instagramUserTags?: string;
244
286
  /** Location ID */
245
287
  instagramLocationId?: string;
288
+ /** Alt text: string (applied to every item) or list of strings, ≤1000 chars each */
289
+ instagramAltText?: string | string[];
246
290
  }
247
291
 
248
292
  // ==================== YouTube Options ====================
@@ -278,6 +322,10 @@ declare module 'upload-post' {
278
322
  youtubeHasPaidProductPlacement?: boolean;
279
323
  /** Recording date (ISO 8601) */
280
324
  youtubeRecordingDate?: string;
325
+ /** Notify subscribers. Default true; send false to suppress the notification */
326
+ youtubeNotifySubscribers?: boolean;
327
+ /** RFC3339 time. Uploads the video as private until this instant (Studio: Scheduled) */
328
+ youtubePublishAt?: string;
281
329
  /** Playlist ID(s) to add the uploaded video to — one ID, an array, or a comma-separated list */
282
330
  youtubePlaylistId?: string | string[];
283
331
  /** Subtitle/caption files to upload. Each entry needs a language code and either a file path or URL. */
@@ -300,6 +348,36 @@ declare module 'upload-post' {
300
348
  linkedinVisibility?: LinkedInVisibility;
301
349
  /** Page ID for organization posts */
302
350
  targetLinkedinPageId?: string;
351
+ /** Alt text per image (string, JSON list, or repeated). Default = title */
352
+ linkedinAltText?: string | string[];
353
+ /** Disable reshare by others */
354
+ linkedinDisableReshare?: boolean;
355
+ /** Override the scraped link-share title (< 400 chars) */
356
+ linkedinLinkTitle?: string;
357
+ /** Override the scraped link-share description (< 4086 chars) */
358
+ linkedinLinkDescription?: string;
359
+ /** Alt text for the link-share thumbnail */
360
+ linkedinThumbnailAltText?: string;
361
+ /** Organic Page targeting: geo locations (CSV, JSON list, URN or numeric id) */
362
+ linkedinTargetGeoLocations?: string | string[];
363
+ linkedinTargetIndustries?: string | string[];
364
+ linkedinTargetSeniorities?: string | string[];
365
+ linkedinTargetJobFunctions?: string | string[];
366
+ linkedinTargetStaffCountRanges?: string | string[];
367
+ linkedinTargetInterfaceLocales?: string | string[];
368
+ linkedinTargetDegrees?: string | string[];
369
+ linkedinTargetFieldsOfStudy?: string | string[];
370
+ linkedinTargetOrganizations?: string | string[];
371
+ /** Raw LinkedIn targetEntities facets JSON */
372
+ linkedinTargetEntities?: Record<string, unknown> | string;
373
+ /** Reject the post if LinkedIn reports audience < 300 */
374
+ linkedinTargetCheckAudience?: boolean;
375
+ /** English SRT captions: local path, stream, or file */
376
+ linkedinSubtitles?: string | Buffer | NodeJS.ReadableStream;
377
+ /** Public URL of an English SRT file */
378
+ linkedinSubtitlesUrl?: string;
379
+ /** Inline English SRT text */
380
+ linkedinSubtitlesText?: string;
303
381
  }
304
382
 
305
383
  // ==================== Facebook Options ====================
@@ -313,11 +391,35 @@ declare module 'upload-post' {
313
391
  facebookMediaType?: FacebookMediaType;
314
392
  /** Thumbnail URL for normal page videos (only when facebookMediaType is 'VIDEO') */
315
393
  thumbnailUrl?: string;
394
+ /** Facebook Place ID */
395
+ facebookPlaceId?: string;
396
+ /** Geographic/age/language targeting */
397
+ facebookTargeting?: Record<string, unknown> | string;
398
+ /** Feed targeting */
399
+ facebookFeedTargeting?: Record<string, unknown> | string;
400
+ /** AI-generated disclosure on Reels */
401
+ facebookIsAiGenerated?: boolean;
402
+ /** Unpublished type for page video: DRAFT, INLINE_CREATED, ADS_POST, PUBLISHED. Do not send SCHEDULED — use scheduledDate. */
403
+ facebookUnpublishedContentType?: 'DRAFT' | 'INLINE_CREATED' | 'ADS_POST' | 'PUBLISHED' | string;
404
+ /** Hide the video from the Page story */
405
+ facebookNoStory?: boolean;
406
+ /** Secret/unpublished video */
407
+ facebookSecret?: boolean;
408
+ /** Page IDs to invite as Reel collaborators (max 10 / 24h) */
409
+ facebookCollaborators?: string | string[];
316
410
  }
317
411
 
318
412
  export interface FacebookPhotoOptions {
319
413
  /** Facebook Page ID */
320
414
  facebookPageId?: string;
415
+ /** Alt text per photo */
416
+ facebookAltText?: string | string[];
417
+ /** Facebook Place ID */
418
+ facebookPlaceId?: string;
419
+ /** Geographic/age/language targeting */
420
+ facebookTargeting?: Record<string, unknown> | string;
421
+ /** Feed targeting */
422
+ facebookFeedTargeting?: Record<string, unknown> | string;
321
423
  }
322
424
 
323
425
  export interface FacebookTextOptions {
@@ -325,6 +427,18 @@ declare module 'upload-post' {
325
427
  facebookPageId?: string;
326
428
  /** URL to attach as link preview */
327
429
  facebookLinkUrl?: string;
430
+ /** Facebook Place ID */
431
+ facebookPlaceId?: string;
432
+ /** Geographic/age/language targeting */
433
+ facebookTargeting?: Record<string, unknown> | string;
434
+ /** Feed targeting */
435
+ facebookFeedTargeting?: Record<string, unknown> | string;
436
+ /** Link-post CTA, e.g. { type: 'LEARN_MORE', link: 'https://…' } */
437
+ facebookCallToAction?: Record<string, unknown> | string;
438
+ /** Link carousel (2–5 objects with `link`) */
439
+ facebookChildAttachments?: Array<Record<string, unknown>> | string;
440
+ /** Show the multi-share end card (requires child attachments) */
441
+ facebookMultiShareEndCard?: boolean;
328
442
  }
329
443
 
330
444
  // ==================== Pinterest Options ====================
@@ -340,8 +454,12 @@ declare module 'upload-post' {
340
454
  pinterestCoverImageContentType?: string;
341
455
  /** Base64-encoded cover image data */
342
456
  pinterestCoverImageData?: string;
343
- /** Key frame time in ms for cover */
457
+ /** Key frame time in seconds (values larger than the video duration are treated as milliseconds) */
344
458
  pinterestCoverImageKeyFrameTime?: number;
459
+ /** Board section ID */
460
+ pinterestBoardSectionId?: string;
461
+ /** AI disclosures: AI_MODIFIED and/or SYNTHETIC_PERFORMER */
462
+ pinterestAiDisclosures?: string | string[];
345
463
  }
346
464
 
347
465
  export interface PinterestPhotoOptions {
@@ -351,6 +469,18 @@ declare module 'upload-post' {
351
469
  pinterestAltText?: string;
352
470
  /** Destination link */
353
471
  pinterestLink?: string;
472
+ /** Board section ID */
473
+ pinterestBoardSectionId?: string;
474
+ /** AI disclosures: AI_MODIFIED and/or SYNTHETIC_PERFORMER */
475
+ pinterestAiDisclosures?: string | string[];
476
+ /** Per-slide titles on a 2–5 photo carousel */
477
+ pinterestCarouselTitles?: string | string[];
478
+ /** Per-slide descriptions on a 2–5 photo carousel */
479
+ pinterestCarouselDescriptions?: string | string[];
480
+ /** Per-slide links on a 2–5 photo carousel */
481
+ pinterestCarouselLinks?: string | string[];
482
+ /** 0-based cover index on a carousel */
483
+ pinterestCarouselIndex?: number;
354
484
  }
355
485
 
356
486
  // ==================== X (Twitter) Options ====================
@@ -372,6 +502,10 @@ declare module 'upload-post' {
372
502
  xDirectMessageDeepLink?: string;
373
503
  /** Post long text as single post */
374
504
  xLongTextAsPost?: boolean;
505
+ /** Paid partnership label on the first post */
506
+ xPaidPartnership?: boolean;
507
+ /** ID of the tweet to reply to (alias of the generic replyToId). */
508
+ xReplyToId?: string;
375
509
  }
376
510
 
377
511
  export interface XMediaOptions extends XBaseOptions {
@@ -381,12 +515,22 @@ declare module 'upload-post' {
381
515
  xPlaceId?: string;
382
516
  /** Comma-separated image layout for thread (e.g. "4,4" or "2,3,1"). Each value 1-4, total must equal image count. */
383
517
  xThreadImageLayout?: string;
518
+ /** Alt text (≤1000 chars). String for video; string, list or `x_alt_text[]` for photos */
519
+ xAltText?: string | string[];
520
+ /** Public URL of a .srt file (≤1 MB) */
521
+ xSubtitlesUrl?: string;
522
+ /** Inline SRT text, or a URL if the value starts with http(s) */
523
+ xSubtitles?: string;
524
+ /** 2-letter language code (default EN) */
525
+ xSubtitlesLanguage?: string;
526
+ /** Subtitle track name shown on X (≤150 chars) */
527
+ xSubtitlesName?: string;
384
528
  }
385
529
 
386
530
  export interface XTextOptions extends XBaseOptions {
387
531
  /** URL to attach */
388
532
  xPostUrl?: string;
389
- /** Tweet ID to quote */
533
+ /** Tweet ID to quote. Quote posts require an X API Enterprise plan. */
390
534
  xQuoteTweetId?: string;
391
535
  /** Poll options (2-4 options) */
392
536
  xPollOptions?: string | string[];
@@ -396,6 +540,16 @@ declare module 'upload-post' {
396
540
  xPollReplySettings?: XReplySettings;
397
541
  /** Card URI for Twitter Cards */
398
542
  xCardUri?: string;
543
+ /** X Article title (≤100 chars, Premium) */
544
+ xArticleTitle?: string;
545
+ /** X Article body (plain text / light Markdown) */
546
+ xArticleBody?: string;
547
+ /** DraftJS content_state JSON */
548
+ xArticleContentState?: Record<string, unknown> | string;
549
+ /** Create the Article as a draft only */
550
+ xArticleDraft?: boolean;
551
+ /** Article cover: local file, public URL, or X media_id */
552
+ xArticleCoverMedia?: string | Buffer | NodeJS.ReadableStream;
399
553
  }
400
554
 
401
555
  // ==================== Threads Options ====================
@@ -403,19 +557,182 @@ declare module 'upload-post' {
403
557
  export interface ThreadsOptions {
404
558
  /** Post long text as single post (vs thread) */
405
559
  threadsLongTextAsPost?: boolean;
406
- /** Comma-separated list of how many media items per Threads post (e.g. "5,5"). Each value 1-10, total must equal file count. */
560
+ /** Comma-separated list of how many media items per Threads post (e.g. "5,5"). Each value 1-20, total must equal file count. */
407
561
  threadsThreadMediaLayout?: string;
408
562
  /** Topic tag for the Threads post */
409
563
  threadsTopicTag?: string;
564
+ /** Who can reply: everyone, accounts_you_follow, mentioned_only, parent_post_author_only, followers_only */
565
+ threadsReplyControl?: 'everyone' | 'accounts_you_follow' | 'mentioned_only' | 'parent_post_author_only' | 'followers_only' | 'followers' | string;
566
+ /** Alt text per image/video (≤1000 chars) */
567
+ threadsAltText?: string | string[];
568
+ /** Publish as a reply to this Threads post id */
569
+ threadsReplyToId?: string;
570
+ /** Quote this Threads post id */
571
+ threadsQuotePostId?: string;
572
+ /** Force a link preview (text posts) */
573
+ threadsLinkAttachment?: string;
574
+ /** Poll options, 2–4 strings of 1–25 chars (text posts) */
575
+ threadsPollOptions?: string | string[];
576
+ /** Publish a text container without the second threads_publish call */
577
+ threadsAutoPublishText?: boolean;
410
578
  }
411
579
 
412
580
  // ==================== Reddit Options ====================
413
581
 
582
+ /**
583
+ * Reddit is currently unavailable. Uploads, OAuth and comments return HTTP 503
584
+ * with `error_code=reddit_unavailable`. Fields are still accepted and forwarded.
585
+ */
414
586
  export interface RedditOptions {
415
587
  /** Subreddit name (without r/) */
416
588
  redditSubreddit?: string;
417
589
  /** Flair template ID */
418
590
  redditFlairId?: string;
591
+ redditNsfw?: boolean;
592
+ redditSpoiler?: boolean;
593
+ redditResubmit?: boolean;
594
+ redditSendReplies?: boolean;
595
+ /** Custom text for editable flairs */
596
+ redditFlairText?: string;
597
+ /** Per-image captions (JSON array or `||`-separated) */
598
+ redditGalleryCaptions?: string | string[];
599
+ /** Per-image outbound URLs (JSON array or `||`-separated) */
600
+ redditGalleryUrls?: string | string[];
601
+ }
602
+
603
+ // ==================== Bluesky Options ====================
604
+
605
+ export interface BlueskyOptions {
606
+ /** Alt text per image/video (string, JSON array or `||`-separated) */
607
+ blueskyAltText?: string | string[];
608
+ /** Up to 3 BCP-47 language codes, comma-separated */
609
+ blueskyLangs?: string | string[];
610
+ /** Content labels: porn, sexual, nudity, graphic-media */
611
+ blueskyLabels?: string | string[];
612
+ /** Publish up to 20 images as a gallery (default: first 4) */
613
+ blueskyGallery?: boolean;
614
+ /** Who can reply: everyone, nobody, mention, following, followers, list:<at://uri> */
615
+ blueskyThreadgate?: string;
616
+ /** Alias of blueskyThreadgate */
617
+ blueskyReplySettings?: string;
618
+ /** `disable_quotes` or `true` to block quotes */
619
+ blueskyPostgate?: string | boolean;
620
+ /** Alias of blueskyPostgate */
621
+ blueskyQuoteSettings?: string | boolean;
622
+ /** Quote a post (bsky.app URL or at:// URI) */
623
+ blueskyQuoteUri?: string;
624
+ blueskyQuoteId?: string;
625
+ blueskyQuoteUrl?: string;
626
+ }
627
+
628
+ export interface DiscordOptions {
629
+ discordThreadId?: string;
630
+ discordThreadName?: string;
631
+ discordAppliedTags?: string | string[];
632
+ discordEmbeds?: Array<Record<string, unknown>> | string;
633
+ discordUsername?: string;
634
+ discordAvatarUrl?: string;
635
+ discordAllowedMentions?: Record<string, unknown> | string;
636
+ discordAltText?: string | string[];
637
+ discordFlags?: number;
638
+ discordTts?: boolean;
639
+ discordPoll?: Record<string, unknown> | string;
640
+ discordMaxFileMb?: number;
641
+ }
642
+
643
+ export interface TelegramOptions {
644
+ telegramParseMode?: 'MarkdownV2' | 'HTML' | string;
645
+ telegramMessageThreadId?: number | string;
646
+ telegramDisableNotification?: boolean;
647
+ telegramProtectContent?: boolean;
648
+ telegramHasSpoiler?: boolean;
649
+ telegramLinkPreview?: boolean;
650
+ telegramReplyMarkup?: Record<string, unknown> | string;
651
+ telegramCaptionOverflow?: 'truncate' | 'split';
652
+ telegramAsDocument?: boolean;
653
+ telegramMediaUrls?: string | string[];
654
+ }
655
+
656
+ export interface MastodonOptions {
657
+ mastodonVisibility?: 'public' | 'unlisted' | 'private' | 'direct';
658
+ mastodonSensitive?: boolean;
659
+ mastodonSpoilerText?: string;
660
+ mastodonLanguage?: string;
661
+ mastodonAltText?: string | string[];
662
+ mastodonPollOptions?: string | string[];
663
+ mastodonPollExpiresIn?: number;
664
+ mastodonPollMultiple?: boolean;
665
+ mastodonScheduledAt?: string;
666
+ }
667
+
668
+ export interface WordpressOptions {
669
+ wordpressStatus?: 'publish' | 'draft' | 'pending' | 'future';
670
+ wordpressDate?: string;
671
+ wordpressCategories?: string | string[];
672
+ wordpressTags?: string | string[];
673
+ wordpressExcerpt?: string;
674
+ wordpressSlug?: string;
675
+ wordpressAltText?: string;
676
+ wordpressMediaCaption?: string;
677
+ wordpressBlockFormat?: boolean;
678
+ }
679
+
680
+ export interface LemmyOptions {
681
+ lemmyUrl?: string;
682
+ lemmyCommunity?: string;
683
+ lemmyNsfw?: boolean;
684
+ lemmyLanguageId?: number | string;
685
+ lemmyAltText?: string;
686
+ }
687
+
688
+ export interface SlackOptions {
689
+ slackMarkdown?: boolean;
690
+ slackBlocks?: Array<Record<string, unknown>> | string;
691
+ slackMrkdwn?: boolean;
692
+ slackAltText?: string;
693
+ slackFirstCommentMode?: 'separate' | 'inline';
694
+ }
695
+
696
+ export interface NostrOptions {
697
+ nostrKind?: 1 | 20 | 22 | 34235 | 30023 | number;
698
+ nostrLongForm?: boolean;
699
+ }
700
+
701
+ export interface DevtoOptions {
702
+ devtoTags?: string | string[];
703
+ devtoCanonicalUrl?: string;
704
+ devtoDescription?: string;
705
+ devtoMainImage?: string;
706
+ devtoSeries?: string;
707
+ devtoPublished?: boolean;
708
+ }
709
+
710
+ export interface HashnodeOptions {
711
+ hashnodeTags?: string | string[];
712
+ hashnodeOriginalArticleUrl?: string;
713
+ hashnodeSubtitle?: string;
714
+ hashnodeCoverImageUrl?: string;
715
+ hashnodeDraft?: boolean;
716
+ hashnodeBody?: string;
717
+ /** Alias of hashnodeBody */
718
+ content?: string;
719
+ }
720
+
721
+ export interface WhopOptions {
722
+ whopBody?: string;
723
+ whopPinned?: boolean;
724
+ whopIsMention?: boolean;
725
+ whopPaywallAmount?: number;
726
+ whopPaywallCurrency?: string;
727
+ whopAttachmentIds?: string | string[];
728
+ }
729
+
730
+ export interface ListmonkOptions {
731
+ listmonkContentType?: 'richtext' | 'markdown' | 'html' | 'plain';
732
+ listmonkSendAt?: string;
733
+ listmonkLists?: string | string[];
734
+ listmonkTemplateId?: string | number;
735
+ listmonkMediaIds?: string | string[];
419
736
  }
420
737
 
421
738
  // ==================== Combined Upload Options ====================
@@ -468,6 +785,14 @@ declare module 'upload-post' {
468
785
  gbpOfferRedeemUrl?: string;
469
786
  /** Offer terms and conditions */
470
787
  gbpOfferTerms?: string;
788
+ /** BCP-47 language code. Default "en" */
789
+ gbpLanguageCode?: string;
790
+ /** Alias of gbpOfferCoupon */
791
+ gbpCouponCode?: string;
792
+ /** Alias of gbpOfferRedeemUrl */
793
+ gbpRedeemUrl?: string;
794
+ /** Alias of gbpOfferTerms */
795
+ gbpTerms?: string;
471
796
  }
472
797
 
473
798
  export interface UploadVideoOptions extends CommonUploadOptions,
@@ -480,7 +805,12 @@ declare module 'upload-post' {
480
805
  XMediaOptions,
481
806
  ThreadsOptions,
482
807
  RedditOptions,
483
- GoogleBusinessOptions {
808
+ GoogleBusinessOptions,
809
+ BlueskyOptions,
810
+ DiscordOptions,
811
+ TelegramOptions,
812
+ MastodonOptions,
813
+ WordpressOptions {
484
814
  /** Target platforms */
485
815
  platforms: VideoPlatform[];
486
816
  }
@@ -494,7 +824,13 @@ declare module 'upload-post' {
494
824
  XMediaOptions,
495
825
  ThreadsOptions,
496
826
  RedditOptions,
497
- GoogleBusinessOptions {
827
+ GoogleBusinessOptions,
828
+ BlueskyOptions,
829
+ DiscordOptions,
830
+ TelegramOptions,
831
+ MastodonOptions,
832
+ LemmyOptions,
833
+ WordpressOptions {
498
834
  /** Target platforms */
499
835
  platforms: PhotoPlatform[];
500
836
  }
@@ -515,7 +851,19 @@ declare module 'upload-post' {
515
851
  ThreadsOptions,
516
852
  RedditOptions,
517
853
  LinkPreviewOptions,
518
- GoogleBusinessOptions {
854
+ GoogleBusinessOptions,
855
+ BlueskyOptions,
856
+ DiscordOptions,
857
+ TelegramOptions,
858
+ SlackOptions,
859
+ MastodonOptions,
860
+ NostrOptions,
861
+ LemmyOptions,
862
+ DevtoOptions,
863
+ HashnodeOptions,
864
+ WordpressOptions,
865
+ WhopOptions,
866
+ ListmonkOptions {
519
867
  /** Target platforms */
520
868
  platforms: TextPlatform[];
521
869
  }
@@ -531,6 +879,9 @@ declare module 'upload-post' {
531
879
  linkedinVisibility?: LinkedInVisibility;
532
880
  /** Page ID for organization posts */
533
881
  targetLinkedinPageId?: string;
882
+ linkedinAltText?: string | string[];
883
+ linkedinDisableReshare?: boolean;
884
+ linkedinTargetCheckAudience?: boolean;
534
885
  /** ISO date for scheduling */
535
886
  scheduledDate?: string;
536
887
  /** Timezone for scheduled date */