upload-post 2.12.0__tar.gz → 2.13.0__tar.gz

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: upload-post
3
- Version: 2.12.0
3
+ Version: 2.13.0
4
4
  Summary: Cross-platform social media upload for TikTok, Instagram, YouTube, LinkedIn, Facebook, Pinterest, Threads, Reddit, Bluesky, Discord, Telegram, and X (Twitter)
5
5
  Home-page: https://www.upload-post.com/
6
6
  Author: Upload-Post
@@ -481,7 +481,7 @@ TikTok account; check it before offering a feature.
481
481
  | `location` | `tiktok_location_id` / `tiktok_location_name`, plus `get_tiktok_locations()` |
482
482
  | `cover_image` | `tiktok_cover_image_url` |
483
483
  | `cover_timestamp` | `cover_timestamp` |
484
- | `draft` | `tiktok_upload_to_draft` |
484
+ | `draft` | `tiktok_upload_to_draft` or `post_mode="MEDIA_UPLOAD"` (same draft) |
485
485
  | `video_privacy` | `privacy_level` on video |
486
486
  | `photo_privacy` | `privacy_level` on photo posts |
487
487
  | `profile_analytics` | `get_audience()` and `get_suggestions(type="hashtags")` with `platform="tiktok"` |
@@ -528,7 +528,7 @@ client.upload_video(
528
528
 
529
529
  tiktok_cover_image_url="https://example.com/cover.jpg",
530
530
  tiktok_is_ai_generated=False,
531
- tiktok_upload_to_draft=False, # True sends it to drafts and ignores the rest
531
+ tiktok_upload_to_draft=False, # same draft as post_mode="MEDIA_UPLOAD"
532
532
  )
533
533
  ```
534
534
 
@@ -544,10 +544,13 @@ client.upload_video(
544
544
  | `tiktok_location_id` | str | `location` | Video + photos. `location_id` from `get_tiktok_locations()` |
545
545
  | `tiktok_location_name` | str | `location` | Required whenever `tiktok_location_id` is set |
546
546
  | `tiktok_cover_image_url` | str | `cover_image` | Video only. Custom cover image URL |
547
- | `tiktok_is_ai_generated` | bool | — | Video + photos. AI-generated content disclosure |
548
- | `tiktok_upload_to_draft` | bool | `draft` | Video only. Publish to drafts; TikTok ignores the rest of the post settings |
547
+ | `tiktok_is_ai_generated` | bool | — | Video + photos. AI-generated content disclosure (aliases: `is_ai_generated`) |
548
+ | `tiktok_upload_to_draft` | bool | `draft` | Video + photos. Same draft as `post_mode="MEDIA_UPLOAD"` (aliases: `upload_to_draft`, `is_draft`). TikTok ignores the rest of the post settings |
549
+ | `tiktok_is_ads_only` | bool | — | Video. Only show in ads (alias: `is_ads_only`) |
550
+ | `tiktok_tto_invite_link` | str | — | Video. TikTok One invite link; needs branded content (alias: `tto_invite_link`) |
549
551
  | `photo_cover_index` | int | — | Cover photo index for photo posts (0-based) |
550
552
  | `privacy_level` | str | `photo_privacy` / `video_privacy` | Accepted on video and photo posts alike; which values the account may use is decided by TikTok, see the note below |
553
+ | `post_mode` | str | `draft` | `DIRECT_POST` or `MEDIA_UPLOAD`. `MEDIA_UPLOAD` is the same draft as `tiktok_upload_to_draft=True` |
551
554
 
552
555
  ## Platform-Specific Options
553
556
 
@@ -557,9 +560,11 @@ client.upload_video(
557
560
  - `disable_stitch` - Disable stitch
558
561
  - `cover_timestamp` - Timestamp in ms for cover
559
562
  - `is_aigc` - AI-generated content flag
560
- - `post_mode` - DIRECT_POST or MEDIA_UPLOAD
563
+ - `post_mode` - DIRECT_POST or MEDIA_UPLOAD. `MEDIA_UPLOAD` is the same draft as `tiktok_upload_to_draft=True`
561
564
  - `brand_content_toggle` - Branded content toggle
562
565
  - `brand_organic_toggle` - Brand organic toggle
566
+ - `tiktok_is_ads_only` - Only show the video in ads (alias: `is_ads_only`)
567
+ - `tiktok_tto_invite_link` - TikTok One invite link; needs branded content (alias: `tto_invite_link`)
563
568
 
564
569
  > **TikTok particularity:** `privacy_level` works on video and photo posts
565
570
  > alike, but **TikTok decides per account which values are available**. A
@@ -578,17 +583,19 @@ for the music, location, cover and draft options.
578
583
 
579
584
  ### TikTok (Photos)
580
585
  - `privacy_level` - PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, SELF_ONLY
581
- - `post_mode` - DIRECT_POST or MEDIA_UPLOAD
586
+ - `post_mode` - DIRECT_POST or MEDIA_UPLOAD. `MEDIA_UPLOAD` is the same draft as `tiktok_upload_to_draft=True`
582
587
  - `auto_add_music` - Auto add music
583
588
  - `photo_cover_index` - Index of photo for cover (0-based)
584
589
  - `disable_comment` - Disable comments
585
590
  - `tiktok_music_id` - Commercial Music Library track id
586
591
  - `tiktok_location_id` / `tiktok_location_name` - Location tag, both required together
587
592
  - `tiktok_is_ai_generated` - AI-generated content disclosure
593
+ - `tiktok_upload_to_draft` - Same draft as `post_mode="MEDIA_UPLOAD"` (aliases: `upload_to_draft`, `is_draft`)
588
594
 
589
595
  > TikTok's photo contract takes the music track id alone: `tiktok_music_volume`,
590
- > `tiktok_music_start`, `tiktok_music_end`, `tiktok_original_sound_volume`,
591
- > `tiktok_cover_image_url` and `tiktok_upload_to_draft` are video-only.
596
+ > `tiktok_music_start`, `tiktok_music_end`, `tiktok_original_sound_volume` and
597
+ > `tiktok_cover_image_url` are video-only. `post_mode="MEDIA_UPLOAD"` and
598
+ > `tiktok_upload_to_draft=True` are aliases of the same draft.
592
599
 
593
600
  ### Instagram
594
601
  - `media_type` - REELS, STORIES, IMAGE
@@ -599,6 +606,7 @@ for the music, location, cover and draft options.
599
606
  - `user_tags` - Comma-separated user tags
600
607
  - `location_id` - Location ID
601
608
  - `thumb_offset` - Thumbnail offset
609
+ - `instagram_alt_text` - Alt text (string, or JSON list / one per carousel item)
602
610
 
603
611
  ### YouTube
604
612
  - `tags` - List or comma-separated tags
@@ -616,10 +624,19 @@ for the music, location, cover and draft options.
616
624
  - `hasPaidProductPlacement` - Paid placement flag
617
625
  - `recordingDate` - Recording date (ISO 8601)
618
626
  - `youtube_playlist_id` - Playlist ID (single string, list, or comma-separated) to add the uploaded video to after publishing
627
+ - `youtube_notify_subscribers` - Notify subscribers (default `true`; send `false` to skip)
628
+ - `youtube_publish_at` - RFC3339 time; uploads as private and schedules on YouTube
619
629
 
620
630
  ### LinkedIn
621
- - `visibility` - PUBLIC, CONNECTIONS, LOGGED_IN, CONTAINER
631
+ - `visibility` / `linkedin_visibility` - PUBLIC, CONNECTIONS, LOGGED_IN, CONTAINER
622
632
  - `target_linkedin_page_id` - Page ID for organization posts
633
+ - `linkedin_alt_text` - Alt text per image (string, JSON list, or repeated)
634
+ - `linkedin_disable_reshare` - Disable reshare by others
635
+ - `linkedin_link_title` / `linkedin_link_description` / `linkedin_thumbnail_alt_text` - Article/link-share overrides
636
+ - `linkedin_target_geo_locations` / `linkedin_target_industries` / `linkedin_target_seniorities` / `linkedin_target_job_functions` / `linkedin_target_staff_count_ranges` / `linkedin_target_interface_locales` / `linkedin_target_degrees` / `linkedin_target_fields_of_study` / `linkedin_target_organizations` - Page targeting (needs `target_linkedin_page_id`)
637
+ - `linkedin_target_entities` - Raw targeting JSON instead of the fields above
638
+ - `linkedin_target_check_audience` - Reject if LinkedIn reports fewer than 300 followers in the segment
639
+ - `linkedin_subtitles` / `linkedin_subtitles_url` / `linkedin_subtitles_text` - English SRT captions on video
623
640
 
624
641
  ### Facebook
625
642
  - `facebook_page_id` - Facebook Page ID (required)
@@ -627,13 +644,25 @@ for the music, location, cover and draft options.
627
644
  - `facebook_media_type` - REELS, STORIES, or VIDEO (normal page video)
628
645
  - `thumbnail_url` - Thumbnail URL for normal page videos (only when `facebook_media_type` is VIDEO)
629
646
  - `facebook_link_url` - URL for text posts
647
+ - `facebook_alt_text` - Alt text per photo (string, `facebook_alt_text[]`, or JSON array)
648
+ - `facebook_place_id` - Place id on feed/photos/videos/reels
649
+ - `facebook_targeting` / `facebook_feed_targeting` - JSON audience objects
650
+ - `facebook_call_to_action` / `facebook_child_attachments` / `facebook_multi_share_end_card` - Link post CTA and carousel
651
+ - `facebook_is_ai_generated` - AI-generated flag on Reels
652
+ - `facebook_collaborators` - Page ids to invite on Reels
653
+ - `facebook_unpublished_content_type` - DRAFT / INLINE_CREATED / ADS_POST on page video (`SCHEDULED` is rejected; use `scheduled_date`)
654
+ - `facebook_no_story` / `facebook_secret` - Page video flags
630
655
 
631
656
  ### Pinterest
632
657
  - `pinterest_board_id` - Board ID
633
658
  - `pinterest_link` - Destination link
634
659
  - `pinterest_alt_text` - Alt text for photos
635
660
  - `pinterest_cover_image_url` - Cover image URL (video)
636
- - `pinterest_cover_image_key_frame_time` - Key frame time in ms
661
+ - `pinterest_cover_image_key_frame_time` - Key frame time in seconds (values larger than the video duration are treated as milliseconds)
662
+ - `pinterest_board_section_id` - Board section id
663
+ - `pinterest_ai_disclosures` - `AI_MODIFIED` and/or `SYNTHETIC_PERFORMER`
664
+ - `pinterest_carousel_titles` / `pinterest_carousel_descriptions` / `pinterest_carousel_links` - Per-slide carousel fields (2–5 photos)
665
+ - `pinterest_carousel_index` - 0-based cover slide
637
666
 
638
667
  ### X (Twitter)
639
668
  - `reply_settings` - everyone, following, mentionedUsers, subscribers, verified
@@ -649,15 +678,30 @@ for the music, location, cover and draft options.
649
678
  - `card_uri` - Card URI for Twitter Cards
650
679
  - `x_long_text_as_post` - Post long text as single post
651
680
  - `x_thread_image_layout` - Comma-separated image layout for thread (e.g. "4,4" or "2,3,1"). Each value 1-4, total must equal image count. Auto-chunks into groups of 4 when >4 images.
681
+ - `x_alt_text` - Alt text (string, `x_alt_text[]`, or JSON array; ≤1000 chars)
682
+ - `x_subtitles` / `x_subtitles_url` / `x_subtitles_language` / `x_subtitles_name` - Video SRT captions
683
+ - `x_paid_partnership` - Paid partnership flag on the first post
684
+ - `x_article_title` / `x_article_body` / `x_article_content_state` / `x_article_draft` / `x_article_cover_media` - X Articles (text; Premium)
652
685
 
653
686
  ### Threads
654
- - `threads_long_text_as_post` - Post long text as single post (vs thread)
655
- - `threads_thread_media_layout` - Comma-separated list of how many media items to include in each Threads post (e.g. "5,5" or "3,4,3"). Each value 1-10, total must equal media count. Auto-chunks into groups of 10 when >10 items.
687
+ - `threads_long_text_as_post` - Post long text as single post (vs thread). Over 500 UTF-8 bytes this sends an official long post instead of truncating.
688
+ - `threads_thread_media_layout` - Comma-separated list of how many media items to include in each Threads post (e.g. "5,5" or "3,4,3"). Each value 0-20, total must equal media count. Auto-chunks into groups of 20 when >20 items.
656
689
  - `threads_topic_tag` - Topic tag for the Threads post (1-50 characters, no periods or ampersands). One tag per post. Helps increase reach.
690
+ - `threads_reply_control` - Who can reply: `everyone`, `accounts_you_follow`, `mentioned_only`, `parent_post_author_only`, `followers_only`
691
+ - `threads_alt_text` - Alt text per image/video (`threads_alt_text[]`)
692
+ - `threads_reply_to_id` / `threads_quote_post_id` - Reply or quote
693
+ - `threads_link_attachment` - Force link preview (text)
694
+ - `threads_poll_options` - 2–4 poll options (text)
695
+ - `threads_auto_publish_text` - Skip the second publish call on text posts
657
696
 
658
697
  ### Reddit
698
+ Reddit uploads currently return `error_code=reddit_unavailable` until the Reddit app is restored.
699
+
659
700
  - `subreddit` - Subreddit name (without r/)
660
701
  - `flair_id` - Flair template ID
702
+ - `reddit_nsfw` / `reddit_spoiler` / `reddit_resubmit` / `reddit_send_replies` - Booleans
703
+ - `reddit_flair_text` - Custom text for editable flairs
704
+ - `reddit_gallery_captions` / `reddit_gallery_urls` - Per-image gallery caption and outbound URL
661
705
 
662
706
  ### Google Business
663
707
  - `gbp_location_id` - Location, e.g. `"accounts/123/locations/456"` (list them with `get_google_business_locations`). Required when the account has more than one location; the API only auto-selects when exactly one exists.
@@ -668,6 +712,8 @@ for the music, location, cover and draft options.
668
712
  - `gbp_cta_type` / `gbp_cta_url` - Call-to-action button
669
713
  - `gbp_event_title` / `gbp_event_start_date` / `gbp_event_start_time` / `gbp_event_end_date` / `gbp_event_end_time` - Used with `gbp_topic_type="EVENT"`
670
714
  - `gbp_offer_coupon` / `gbp_offer_redeem_url` / `gbp_offer_terms` - Used with `gbp_topic_type="OFFER"`
715
+ - `gbp_coupon_code` / `gbp_redeem_url` / `gbp_terms` - Aliases of the offer fields above (legacy names still win if both are sent)
716
+ - `gbp_language_code` - BCP-47 language (default `en`)
671
717
 
672
718
  ```python
673
719
  locations = client.get_google_business_locations("my-profile")
@@ -683,6 +729,66 @@ client.upload_photos(
683
729
  )
684
730
  ```
685
731
 
732
+ ### Bluesky
733
+ - `bluesky_link_url` - External embed link preview (text)
734
+ - `bluesky_alt_text` - Alt text per image/video (JSON array, `||`-separated, or string)
735
+ - `bluesky_langs` - Comma list, max 3 BCP-47 codes
736
+ - `bluesky_labels` - `porn`, `sexual`, `nudity`, `graphic-media`
737
+ - `bluesky_gallery` - Publish up to 20 images as a gallery (`false` keeps the first 4)
738
+ - `bluesky_threadgate` / `bluesky_reply_settings` - Who can reply
739
+ - `bluesky_postgate` / `bluesky_quote_settings` - `disable_quotes` to block quotes
740
+ - `bluesky_quote_uri` / `bluesky_quote_id` / `bluesky_quote_url` - Quote another post
741
+
742
+ ### Discord
743
+ - `discord_thread_id` / `discord_thread_name` / `discord_applied_tags` - Thread or forum post
744
+ - `discord_embeds` / `discord_poll` / `discord_allowed_mentions` - JSON
745
+ - `discord_username` / `discord_avatar_url` - Per-post webhook identity
746
+ - `discord_alt_text` / `discord_flags` / `discord_tts` / `discord_max_file_mb`
747
+
748
+ ### Telegram
749
+ - `telegram_parse_mode` - `MarkdownV2` or `HTML`
750
+ - `telegram_message_thread_id` - Forum topic
751
+ - `telegram_disable_notification` / `telegram_protect_content` / `telegram_has_spoiler` / `telegram_pin`
752
+ - `telegram_link_preview` / `telegram_reply_markup` / `telegram_as_document`
753
+ - `telegram_caption_overflow` - `truncate` (default) or `split`
754
+ - `telegram_media_urls` - Comma-separated public URLs for a mixed album
755
+
756
+ ### Mastodon
757
+ - `mastodon_visibility` / `mastodon_sensitive` / `mastodon_spoiler_text` / `mastodon_language`
758
+ - `mastodon_alt_text` - `|`-separated for albums
759
+ - `mastodon_poll_options` / `mastodon_poll_expires_in` / `mastodon_poll_multiple`
760
+ - `mastodon_scheduled_at` - ISO 8601, at least 5 minutes ahead
761
+
762
+ ### WordPress
763
+ - `wordpress_status` / `wordpress_date` - `publish`, `draft`, `pending`, `future` (`date` required for `future`)
764
+ - `wordpress_categories` / `wordpress_tags` / `wordpress_excerpt` / `wordpress_slug`
765
+ - `wordpress_alt_text` / `wordpress_media_caption` / `wordpress_block_format`
766
+
767
+ ### Lemmy
768
+ - `lemmy_url` / `lemmy_community` / `lemmy_nsfw` / `lemmy_language_id` / `lemmy_alt_text`
769
+
770
+ ### Slack
771
+ - `slack_markdown` / `slack_mrkdwn` / `slack_blocks` / `slack_alt_text`
772
+ - `slack_first_comment_mode` - `separate` (default) or `inline`
773
+
774
+ ### Nostr
775
+ - `nostr_kind` - `1` default, `20` picture, `22` short video, `34235` video, `30023` long-form
776
+ - `nostr_long_form` - Shorthand for kind 30023
777
+
778
+ ### Dev.to
779
+ - `devto_tags` / `devto_canonical_url` / `devto_description` / `devto_main_image` / `devto_series` / `devto_published`
780
+
781
+ ### Hashnode
782
+ - `hashnode_body` / `content` - Article body
783
+ - `hashnode_tags` / `hashnode_original_article_url` / `hashnode_subtitle` / `hashnode_cover_image_url` / `hashnode_draft`
784
+
785
+ ### Whop
786
+ - `whop_body` / `whop_pinned` / `whop_is_mention` / `whop_paywall_amount` / `whop_paywall_currency` / `whop_attachment_ids`
787
+
788
+ ### Listmonk
789
+ - `listmonk_content_type` - `richtext` (default), `markdown`, `html`, `plain`
790
+ - `listmonk_send_at` / `listmonk_lists` / `listmonk_template_id` / `listmonk_media_ids`
791
+
686
792
  ## Common Options
687
793
 
688
794
  These options work across all upload methods:
@@ -443,7 +443,7 @@ TikTok account; check it before offering a feature.
443
443
  | `location` | `tiktok_location_id` / `tiktok_location_name`, plus `get_tiktok_locations()` |
444
444
  | `cover_image` | `tiktok_cover_image_url` |
445
445
  | `cover_timestamp` | `cover_timestamp` |
446
- | `draft` | `tiktok_upload_to_draft` |
446
+ | `draft` | `tiktok_upload_to_draft` or `post_mode="MEDIA_UPLOAD"` (same draft) |
447
447
  | `video_privacy` | `privacy_level` on video |
448
448
  | `photo_privacy` | `privacy_level` on photo posts |
449
449
  | `profile_analytics` | `get_audience()` and `get_suggestions(type="hashtags")` with `platform="tiktok"` |
@@ -490,7 +490,7 @@ client.upload_video(
490
490
 
491
491
  tiktok_cover_image_url="https://example.com/cover.jpg",
492
492
  tiktok_is_ai_generated=False,
493
- tiktok_upload_to_draft=False, # True sends it to drafts and ignores the rest
493
+ tiktok_upload_to_draft=False, # same draft as post_mode="MEDIA_UPLOAD"
494
494
  )
495
495
  ```
496
496
 
@@ -506,10 +506,13 @@ client.upload_video(
506
506
  | `tiktok_location_id` | str | `location` | Video + photos. `location_id` from `get_tiktok_locations()` |
507
507
  | `tiktok_location_name` | str | `location` | Required whenever `tiktok_location_id` is set |
508
508
  | `tiktok_cover_image_url` | str | `cover_image` | Video only. Custom cover image URL |
509
- | `tiktok_is_ai_generated` | bool | — | Video + photos. AI-generated content disclosure |
510
- | `tiktok_upload_to_draft` | bool | `draft` | Video only. Publish to drafts; TikTok ignores the rest of the post settings |
509
+ | `tiktok_is_ai_generated` | bool | — | Video + photos. AI-generated content disclosure (aliases: `is_ai_generated`) |
510
+ | `tiktok_upload_to_draft` | bool | `draft` | Video + photos. Same draft as `post_mode="MEDIA_UPLOAD"` (aliases: `upload_to_draft`, `is_draft`). TikTok ignores the rest of the post settings |
511
+ | `tiktok_is_ads_only` | bool | — | Video. Only show in ads (alias: `is_ads_only`) |
512
+ | `tiktok_tto_invite_link` | str | — | Video. TikTok One invite link; needs branded content (alias: `tto_invite_link`) |
511
513
  | `photo_cover_index` | int | — | Cover photo index for photo posts (0-based) |
512
514
  | `privacy_level` | str | `photo_privacy` / `video_privacy` | Accepted on video and photo posts alike; which values the account may use is decided by TikTok, see the note below |
515
+ | `post_mode` | str | `draft` | `DIRECT_POST` or `MEDIA_UPLOAD`. `MEDIA_UPLOAD` is the same draft as `tiktok_upload_to_draft=True` |
513
516
 
514
517
  ## Platform-Specific Options
515
518
 
@@ -519,9 +522,11 @@ client.upload_video(
519
522
  - `disable_stitch` - Disable stitch
520
523
  - `cover_timestamp` - Timestamp in ms for cover
521
524
  - `is_aigc` - AI-generated content flag
522
- - `post_mode` - DIRECT_POST or MEDIA_UPLOAD
525
+ - `post_mode` - DIRECT_POST or MEDIA_UPLOAD. `MEDIA_UPLOAD` is the same draft as `tiktok_upload_to_draft=True`
523
526
  - `brand_content_toggle` - Branded content toggle
524
527
  - `brand_organic_toggle` - Brand organic toggle
528
+ - `tiktok_is_ads_only` - Only show the video in ads (alias: `is_ads_only`)
529
+ - `tiktok_tto_invite_link` - TikTok One invite link; needs branded content (alias: `tto_invite_link`)
525
530
 
526
531
  > **TikTok particularity:** `privacy_level` works on video and photo posts
527
532
  > alike, but **TikTok decides per account which values are available**. A
@@ -540,17 +545,19 @@ for the music, location, cover and draft options.
540
545
 
541
546
  ### TikTok (Photos)
542
547
  - `privacy_level` - PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, SELF_ONLY
543
- - `post_mode` - DIRECT_POST or MEDIA_UPLOAD
548
+ - `post_mode` - DIRECT_POST or MEDIA_UPLOAD. `MEDIA_UPLOAD` is the same draft as `tiktok_upload_to_draft=True`
544
549
  - `auto_add_music` - Auto add music
545
550
  - `photo_cover_index` - Index of photo for cover (0-based)
546
551
  - `disable_comment` - Disable comments
547
552
  - `tiktok_music_id` - Commercial Music Library track id
548
553
  - `tiktok_location_id` / `tiktok_location_name` - Location tag, both required together
549
554
  - `tiktok_is_ai_generated` - AI-generated content disclosure
555
+ - `tiktok_upload_to_draft` - Same draft as `post_mode="MEDIA_UPLOAD"` (aliases: `upload_to_draft`, `is_draft`)
550
556
 
551
557
  > TikTok's photo contract takes the music track id alone: `tiktok_music_volume`,
552
- > `tiktok_music_start`, `tiktok_music_end`, `tiktok_original_sound_volume`,
553
- > `tiktok_cover_image_url` and `tiktok_upload_to_draft` are video-only.
558
+ > `tiktok_music_start`, `tiktok_music_end`, `tiktok_original_sound_volume` and
559
+ > `tiktok_cover_image_url` are video-only. `post_mode="MEDIA_UPLOAD"` and
560
+ > `tiktok_upload_to_draft=True` are aliases of the same draft.
554
561
 
555
562
  ### Instagram
556
563
  - `media_type` - REELS, STORIES, IMAGE
@@ -561,6 +568,7 @@ for the music, location, cover and draft options.
561
568
  - `user_tags` - Comma-separated user tags
562
569
  - `location_id` - Location ID
563
570
  - `thumb_offset` - Thumbnail offset
571
+ - `instagram_alt_text` - Alt text (string, or JSON list / one per carousel item)
564
572
 
565
573
  ### YouTube
566
574
  - `tags` - List or comma-separated tags
@@ -578,10 +586,19 @@ for the music, location, cover and draft options.
578
586
  - `hasPaidProductPlacement` - Paid placement flag
579
587
  - `recordingDate` - Recording date (ISO 8601)
580
588
  - `youtube_playlist_id` - Playlist ID (single string, list, or comma-separated) to add the uploaded video to after publishing
589
+ - `youtube_notify_subscribers` - Notify subscribers (default `true`; send `false` to skip)
590
+ - `youtube_publish_at` - RFC3339 time; uploads as private and schedules on YouTube
581
591
 
582
592
  ### LinkedIn
583
- - `visibility` - PUBLIC, CONNECTIONS, LOGGED_IN, CONTAINER
593
+ - `visibility` / `linkedin_visibility` - PUBLIC, CONNECTIONS, LOGGED_IN, CONTAINER
584
594
  - `target_linkedin_page_id` - Page ID for organization posts
595
+ - `linkedin_alt_text` - Alt text per image (string, JSON list, or repeated)
596
+ - `linkedin_disable_reshare` - Disable reshare by others
597
+ - `linkedin_link_title` / `linkedin_link_description` / `linkedin_thumbnail_alt_text` - Article/link-share overrides
598
+ - `linkedin_target_geo_locations` / `linkedin_target_industries` / `linkedin_target_seniorities` / `linkedin_target_job_functions` / `linkedin_target_staff_count_ranges` / `linkedin_target_interface_locales` / `linkedin_target_degrees` / `linkedin_target_fields_of_study` / `linkedin_target_organizations` - Page targeting (needs `target_linkedin_page_id`)
599
+ - `linkedin_target_entities` - Raw targeting JSON instead of the fields above
600
+ - `linkedin_target_check_audience` - Reject if LinkedIn reports fewer than 300 followers in the segment
601
+ - `linkedin_subtitles` / `linkedin_subtitles_url` / `linkedin_subtitles_text` - English SRT captions on video
585
602
 
586
603
  ### Facebook
587
604
  - `facebook_page_id` - Facebook Page ID (required)
@@ -589,13 +606,25 @@ for the music, location, cover and draft options.
589
606
  - `facebook_media_type` - REELS, STORIES, or VIDEO (normal page video)
590
607
  - `thumbnail_url` - Thumbnail URL for normal page videos (only when `facebook_media_type` is VIDEO)
591
608
  - `facebook_link_url` - URL for text posts
609
+ - `facebook_alt_text` - Alt text per photo (string, `facebook_alt_text[]`, or JSON array)
610
+ - `facebook_place_id` - Place id on feed/photos/videos/reels
611
+ - `facebook_targeting` / `facebook_feed_targeting` - JSON audience objects
612
+ - `facebook_call_to_action` / `facebook_child_attachments` / `facebook_multi_share_end_card` - Link post CTA and carousel
613
+ - `facebook_is_ai_generated` - AI-generated flag on Reels
614
+ - `facebook_collaborators` - Page ids to invite on Reels
615
+ - `facebook_unpublished_content_type` - DRAFT / INLINE_CREATED / ADS_POST on page video (`SCHEDULED` is rejected; use `scheduled_date`)
616
+ - `facebook_no_story` / `facebook_secret` - Page video flags
592
617
 
593
618
  ### Pinterest
594
619
  - `pinterest_board_id` - Board ID
595
620
  - `pinterest_link` - Destination link
596
621
  - `pinterest_alt_text` - Alt text for photos
597
622
  - `pinterest_cover_image_url` - Cover image URL (video)
598
- - `pinterest_cover_image_key_frame_time` - Key frame time in ms
623
+ - `pinterest_cover_image_key_frame_time` - Key frame time in seconds (values larger than the video duration are treated as milliseconds)
624
+ - `pinterest_board_section_id` - Board section id
625
+ - `pinterest_ai_disclosures` - `AI_MODIFIED` and/or `SYNTHETIC_PERFORMER`
626
+ - `pinterest_carousel_titles` / `pinterest_carousel_descriptions` / `pinterest_carousel_links` - Per-slide carousel fields (2–5 photos)
627
+ - `pinterest_carousel_index` - 0-based cover slide
599
628
 
600
629
  ### X (Twitter)
601
630
  - `reply_settings` - everyone, following, mentionedUsers, subscribers, verified
@@ -611,15 +640,30 @@ for the music, location, cover and draft options.
611
640
  - `card_uri` - Card URI for Twitter Cards
612
641
  - `x_long_text_as_post` - Post long text as single post
613
642
  - `x_thread_image_layout` - Comma-separated image layout for thread (e.g. "4,4" or "2,3,1"). Each value 1-4, total must equal image count. Auto-chunks into groups of 4 when >4 images.
643
+ - `x_alt_text` - Alt text (string, `x_alt_text[]`, or JSON array; ≤1000 chars)
644
+ - `x_subtitles` / `x_subtitles_url` / `x_subtitles_language` / `x_subtitles_name` - Video SRT captions
645
+ - `x_paid_partnership` - Paid partnership flag on the first post
646
+ - `x_article_title` / `x_article_body` / `x_article_content_state` / `x_article_draft` / `x_article_cover_media` - X Articles (text; Premium)
614
647
 
615
648
  ### Threads
616
- - `threads_long_text_as_post` - Post long text as single post (vs thread)
617
- - `threads_thread_media_layout` - Comma-separated list of how many media items to include in each Threads post (e.g. "5,5" or "3,4,3"). Each value 1-10, total must equal media count. Auto-chunks into groups of 10 when >10 items.
649
+ - `threads_long_text_as_post` - Post long text as single post (vs thread). Over 500 UTF-8 bytes this sends an official long post instead of truncating.
650
+ - `threads_thread_media_layout` - Comma-separated list of how many media items to include in each Threads post (e.g. "5,5" or "3,4,3"). Each value 0-20, total must equal media count. Auto-chunks into groups of 20 when >20 items.
618
651
  - `threads_topic_tag` - Topic tag for the Threads post (1-50 characters, no periods or ampersands). One tag per post. Helps increase reach.
652
+ - `threads_reply_control` - Who can reply: `everyone`, `accounts_you_follow`, `mentioned_only`, `parent_post_author_only`, `followers_only`
653
+ - `threads_alt_text` - Alt text per image/video (`threads_alt_text[]`)
654
+ - `threads_reply_to_id` / `threads_quote_post_id` - Reply or quote
655
+ - `threads_link_attachment` - Force link preview (text)
656
+ - `threads_poll_options` - 2–4 poll options (text)
657
+ - `threads_auto_publish_text` - Skip the second publish call on text posts
619
658
 
620
659
  ### Reddit
660
+ Reddit uploads currently return `error_code=reddit_unavailable` until the Reddit app is restored.
661
+
621
662
  - `subreddit` - Subreddit name (without r/)
622
663
  - `flair_id` - Flair template ID
664
+ - `reddit_nsfw` / `reddit_spoiler` / `reddit_resubmit` / `reddit_send_replies` - Booleans
665
+ - `reddit_flair_text` - Custom text for editable flairs
666
+ - `reddit_gallery_captions` / `reddit_gallery_urls` - Per-image gallery caption and outbound URL
623
667
 
624
668
  ### Google Business
625
669
  - `gbp_location_id` - Location, e.g. `"accounts/123/locations/456"` (list them with `get_google_business_locations`). Required when the account has more than one location; the API only auto-selects when exactly one exists.
@@ -630,6 +674,8 @@ for the music, location, cover and draft options.
630
674
  - `gbp_cta_type` / `gbp_cta_url` - Call-to-action button
631
675
  - `gbp_event_title` / `gbp_event_start_date` / `gbp_event_start_time` / `gbp_event_end_date` / `gbp_event_end_time` - Used with `gbp_topic_type="EVENT"`
632
676
  - `gbp_offer_coupon` / `gbp_offer_redeem_url` / `gbp_offer_terms` - Used with `gbp_topic_type="OFFER"`
677
+ - `gbp_coupon_code` / `gbp_redeem_url` / `gbp_terms` - Aliases of the offer fields above (legacy names still win if both are sent)
678
+ - `gbp_language_code` - BCP-47 language (default `en`)
633
679
 
634
680
  ```python
635
681
  locations = client.get_google_business_locations("my-profile")
@@ -645,6 +691,66 @@ client.upload_photos(
645
691
  )
646
692
  ```
647
693
 
694
+ ### Bluesky
695
+ - `bluesky_link_url` - External embed link preview (text)
696
+ - `bluesky_alt_text` - Alt text per image/video (JSON array, `||`-separated, or string)
697
+ - `bluesky_langs` - Comma list, max 3 BCP-47 codes
698
+ - `bluesky_labels` - `porn`, `sexual`, `nudity`, `graphic-media`
699
+ - `bluesky_gallery` - Publish up to 20 images as a gallery (`false` keeps the first 4)
700
+ - `bluesky_threadgate` / `bluesky_reply_settings` - Who can reply
701
+ - `bluesky_postgate` / `bluesky_quote_settings` - `disable_quotes` to block quotes
702
+ - `bluesky_quote_uri` / `bluesky_quote_id` / `bluesky_quote_url` - Quote another post
703
+
704
+ ### Discord
705
+ - `discord_thread_id` / `discord_thread_name` / `discord_applied_tags` - Thread or forum post
706
+ - `discord_embeds` / `discord_poll` / `discord_allowed_mentions` - JSON
707
+ - `discord_username` / `discord_avatar_url` - Per-post webhook identity
708
+ - `discord_alt_text` / `discord_flags` / `discord_tts` / `discord_max_file_mb`
709
+
710
+ ### Telegram
711
+ - `telegram_parse_mode` - `MarkdownV2` or `HTML`
712
+ - `telegram_message_thread_id` - Forum topic
713
+ - `telegram_disable_notification` / `telegram_protect_content` / `telegram_has_spoiler` / `telegram_pin`
714
+ - `telegram_link_preview` / `telegram_reply_markup` / `telegram_as_document`
715
+ - `telegram_caption_overflow` - `truncate` (default) or `split`
716
+ - `telegram_media_urls` - Comma-separated public URLs for a mixed album
717
+
718
+ ### Mastodon
719
+ - `mastodon_visibility` / `mastodon_sensitive` / `mastodon_spoiler_text` / `mastodon_language`
720
+ - `mastodon_alt_text` - `|`-separated for albums
721
+ - `mastodon_poll_options` / `mastodon_poll_expires_in` / `mastodon_poll_multiple`
722
+ - `mastodon_scheduled_at` - ISO 8601, at least 5 minutes ahead
723
+
724
+ ### WordPress
725
+ - `wordpress_status` / `wordpress_date` - `publish`, `draft`, `pending`, `future` (`date` required for `future`)
726
+ - `wordpress_categories` / `wordpress_tags` / `wordpress_excerpt` / `wordpress_slug`
727
+ - `wordpress_alt_text` / `wordpress_media_caption` / `wordpress_block_format`
728
+
729
+ ### Lemmy
730
+ - `lemmy_url` / `lemmy_community` / `lemmy_nsfw` / `lemmy_language_id` / `lemmy_alt_text`
731
+
732
+ ### Slack
733
+ - `slack_markdown` / `slack_mrkdwn` / `slack_blocks` / `slack_alt_text`
734
+ - `slack_first_comment_mode` - `separate` (default) or `inline`
735
+
736
+ ### Nostr
737
+ - `nostr_kind` - `1` default, `20` picture, `22` short video, `34235` video, `30023` long-form
738
+ - `nostr_long_form` - Shorthand for kind 30023
739
+
740
+ ### Dev.to
741
+ - `devto_tags` / `devto_canonical_url` / `devto_description` / `devto_main_image` / `devto_series` / `devto_published`
742
+
743
+ ### Hashnode
744
+ - `hashnode_body` / `content` - Article body
745
+ - `hashnode_tags` / `hashnode_original_article_url` / `hashnode_subtitle` / `hashnode_cover_image_url` / `hashnode_draft`
746
+
747
+ ### Whop
748
+ - `whop_body` / `whop_pinned` / `whop_is_mention` / `whop_paywall_amount` / `whop_paywall_currency` / `whop_attachment_ids`
749
+
750
+ ### Listmonk
751
+ - `listmonk_content_type` - `richtext` (default), `markdown`, `html`, `plain`
752
+ - `listmonk_send_at` / `listmonk_lists` / `listmonk_template_id` / `listmonk_media_ids`
753
+
648
754
  ## Common Options
649
755
 
650
756
  These options work across all upload methods:
@@ -5,7 +5,7 @@ with open("README.md", "r", encoding="utf-8") as fh:
5
5
 
6
6
  setup(
7
7
  name="upload-post",
8
- version="2.12.0",
8
+ version="2.13.0",
9
9
  author="Upload-Post",
10
10
  author_email="hi@img2html.com",
11
11
  description="Cross-platform social media upload for TikTok, Instagram, YouTube, LinkedIn, Facebook, Pinterest, Threads, Reddit, Bluesky, Discord, Telegram, and X (Twitter)",