Cross-platform social media upload for TikTok, Instagram, YouTube, LinkedIn, Facebook, Pinterest, Threads, Reddit, Bluesky, and X (Twitter)
Project description
Upload-Post SDK for Python
Official Python client for the Upload-Post API - Cross-platform social media upload.
Upload videos, photos, text posts, and documents to TikTok, Instagram, YouTube, LinkedIn, Facebook, Pinterest, Threads, Reddit, Bluesky, and X (Twitter) with a single API.
Installation
pip install upload-post
Quick Start
from upload_post import UploadPostClient
client = UploadPostClient("YOUR_API_KEY")
# Upload a video to multiple platforms
response = client.upload_video(
"video.mp4",
title="Check out this awesome video! 🎬",
user="my-profile",
platforms=["tiktok", "instagram", "youtube"]
)
print(response)
Features
- ✅ Video Upload - TikTok, Instagram, YouTube, LinkedIn, Facebook, Pinterest, Threads, Bluesky, X
- ✅ Photo Upload - TikTok, Instagram, LinkedIn, Facebook, Pinterest, Threads, Reddit, Bluesky, X
- ✅ Text Posts - X, LinkedIn, Facebook, Threads, Reddit, Bluesky
- ✅ Document Upload - LinkedIn (PDF, PPT, PPTX, DOC, DOCX)
- ✅ Scheduling - Schedule posts for later
- ✅ Posting Queue - Add posts to your configured queue
- ✅ First Comments - Auto-post first comment after publishing
- ✅ Analytics - Get engagement metrics
- ✅ Full Type Hints
API Reference
Upload Video
response = client.upload_video(
"video.mp4",
title="My awesome video",
user="my-profile",
platforms=["tiktok", "instagram", "youtube"],
# Optional: Schedule for later
scheduled_date="2024-12-25T10:00:00Z",
timezone="Europe/Madrid",
# Optional: Add first comment
first_comment="Thanks for watching! 🙏",
# Optional: Platform-specific settings
privacy_level="PUBLIC_TO_EVERYONE", # TikTok
media_type="REELS", # Instagram
privacyStatus="public", # YouTube
tags=["tutorial", "coding"], # YouTube
)
Upload Photos
# Upload single or multiple photos
response = client.upload_photos(
["photo1.jpg", "photo2.jpg", "https://example.com/photo3.jpg"],
title="Check out these photos! 📸",
user="my-profile",
platforms=["instagram", "facebook", "x"],
# Optional: Add to queue instead of posting immediately
add_to_queue=True,
# Platform-specific
media_type="IMAGE", # Instagram: IMAGE or STORIES
facebook_page_id="your-page-id",
)
Upload Text Posts
response = client.upload_text(
title="Just shipped a new feature! 🚀 Check it out at example.com",
user="my-profile",
platforms=["x", "linkedin", "threads"],
# Optional: Create a poll on X
poll_options=["Option A", "Option B", "Option C"],
poll_duration=1440, # 24 hours in minutes
# Optional: Post to a LinkedIn company page
target_linkedin_page_id="company-page-id",
)
Upload Documents (LinkedIn)
response = client.upload_document(
"presentation.pdf",
title="Q4 2024 Report",
user="my-profile",
description="Check out our latest quarterly results!",
visibility="PUBLIC",
target_linkedin_page_id="company-page-id", # Optional: post to company page
)
Check Upload Status
For async uploads, check the status using the request_id:
status = client.get_status("request_id_from_upload")
print(status)
For scheduled or queued posts, check the status using the job_id:
status = client.get_job_status("job_id_from_scheduled_post")
print(status)
Get Upload History
history = client.get_history(page=1, limit=20)
print(history)
Scheduled Posts
# List all scheduled posts
scheduled = client.list_scheduled()
# Edit a scheduled post
client.edit_scheduled(
"job-id",
scheduled_date="2024-12-26T15:00:00Z",
timezone="America/New_York",
)
# Cancel a scheduled post
client.cancel_scheduled("job-id")
User Management
# List all profiles
users = client.list_users()
# Create a new profile
client.create_user("new-profile")
# Delete a profile
client.delete_user("old-profile")
# Generate JWT for platform integration (white-label)
jwt = client.generate_jwt(
"my-profile",
redirect_url="https://yourapp.com/callback",
platforms=["tiktok", "instagram"],
)
Get Analytics
analytics = client.get_analytics(
"my-profile",
platforms=["instagram", "tiktok"],
)
print(analytics)
Helper Methods
# Get Facebook pages for a profile
fb_pages = client.get_facebook_pages("my-profile")
# Get LinkedIn pages for a profile
li_pages = client.get_linkedin_pages("my-profile")
# Get Pinterest boards for a profile
boards = client.get_pinterest_boards("my-profile")
Platform-Specific Options
TikTok (Video)
privacy_level- PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, SELF_ONLYdisable_duet- Disable duetdisable_comment- Disable commentsdisable_stitch- Disable stitchcover_timestamp- Timestamp in ms for coveris_aigc- AI-generated content flagpost_mode- DIRECT_POST or MEDIA_UPLOADbrand_content_toggle- Branded content togglebrand_organic_toggle- Brand organic toggle
TikTok (Photos)
auto_add_music- Auto add musicphoto_cover_index- Index of photo for cover (0-based)disable_comment- Disable comments
media_type- REELS, STORIES, IMAGEshare_to_feed- Share to feed (for Reels/Stories)collaborators- Comma-separated collaborator usernamescover_url- Custom cover URLaudio_name- Audio track nameuser_tags- Comma-separated user tagslocation_id- Location IDthumb_offset- Thumbnail offset
YouTube
tags- List or comma-separated tagscategoryId- Category ID (default: "22" People & Blogs)privacyStatus- public, unlisted, privateembeddable- Allow embeddinglicense- youtube, creativeCommonpublicStatsViewable- Show public statsthumbnail_url- Custom thumbnail URLselfDeclaredMadeForKids- Made for kids (COPPA)containsSyntheticMedia- AI/synthetic content flagdefaultLanguage- Title/description language (BCP-47)defaultAudioLanguage- Audio language (BCP-47)allowedCountries/blockedCountries- Country restrictionshasPaidProductPlacement- Paid placement flagrecordingDate- Recording date (ISO 8601)
visibility- PUBLIC, CONNECTIONS, LOGGED_IN, CONTAINERtarget_linkedin_page_id- Page ID for organization posts
facebook_page_id- Facebook Page ID (required)video_state- PUBLISHED, DRAFTfacebook_media_type- REELS, STORIES, or VIDEO (normal page video)thumbnail_url- Thumbnail URL for normal page videos (only whenfacebook_media_typeis VIDEO)facebook_link_url- URL for text posts
pinterest_board_id- Board IDpinterest_link- Destination linkpinterest_alt_text- Alt text for photospinterest_cover_image_url- Cover image URL (video)pinterest_cover_image_key_frame_time- Key frame time in ms
X (Twitter)
reply_settings- everyone, following, mentionedUsers, subscribers, verifiednullcast- Promoted-only posttagged_user_ids- User IDs to tagplace_id/geo_place_id- Location place IDquote_tweet_id- Tweet ID to quotepoll_options- Poll options (2-4)poll_duration- Poll duration in minutes (5-10080)for_super_followers_only- Exclusive for super followerscommunity_id- Community IDshare_with_followers- Share community post with followerscard_uri- Card URI for Twitter Cardsx_long_text_as_post- Post long text as single postx_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.
Threads
threads_long_text_as_post- Post long text as single post (vs thread)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.threads_topic_tag- Topic tag for the Threads post (1-50 characters, no periods or ampersands). One tag per post. Helps increase reach.
subreddit- Subreddit name (without r/)flair_id- Flair template ID
Common Options
These options work across all upload methods:
| Option | Description |
|---|---|
title |
Post title/caption (required) |
user |
Profile name (required) |
platforms |
Target platforms list (required) |
first_comment |
First comment to post |
alt_text |
Alt text for accessibility |
scheduled_date |
ISO date for scheduling |
timezone |
Timezone for scheduled date |
add_to_queue |
Add to posting queue |
max_posts_per_slot |
Max posts per queue slot (overrides profile setting) |
async_upload |
Process asynchronously (default: True) |
Error Handling
from upload_post import UploadPostClient, UploadPostError
client = UploadPostClient("YOUR_API_KEY")
try:
response = client.upload_video("video.mp4", **options)
print("Upload successful:", response)
except UploadPostError as e:
print("Upload failed:", str(e))
Links
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file upload_post-2.1.0.tar.gz.
File metadata
- Download URL: upload_post-2.1.0.tar.gz
- Upload date:
- Size: 18.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
168f5f6780de70c2d9309d20372c6a385b7e32aa145c10c53be99ce49c4e17aa
|
|
| MD5 |
03da7e9c7387a9f38300dc0c34744bbb
|
|
| BLAKE2b-256 |
e23b7128708712aebb5db038e90447a935cbc5dcf8c0203306baf5a3da322234
|
Provenance
The following attestation bundles were made for upload_post-2.1.0.tar.gz:
Publisher:
publish.yml on Upload-Post/upload-post-pip
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
upload_post-2.1.0.tar.gz -
Subject digest:
168f5f6780de70c2d9309d20372c6a385b7e32aa145c10c53be99ce49c4e17aa - Sigstore transparency entry: 1203523492
- Sigstore integration time:
-
Permalink:
Upload-Post/upload-post-pip@9d05693def2dce1b7a5ee5ceeee1bd7d9fa2947f -
Branch / Tag:
refs/heads/main - Owner: https://github.com/Upload-Post
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@9d05693def2dce1b7a5ee5ceeee1bd7d9fa2947f -
Trigger Event:
push
-
Statement type:
File details
Details for the file upload_post-2.1.0-py3-none-any.whl.
File metadata
- Download URL: upload_post-2.1.0-py3-none-any.whl
- Upload date:
- Size: 15.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
399267ea8a265eea47c059941ee8a458aae7acfdf58ae99a31efa31a2e1f624c
|
|
| MD5 |
37f5a017e4aab2212ea59024db9eb0b0
|
|
| BLAKE2b-256 |
3d67ab51b1c0c547e2b0cc5e3d7325de35e101143fb59a68c9e9dd12cd23aa9d
|
Provenance
The following attestation bundles were made for upload_post-2.1.0-py3-none-any.whl:
Publisher:
publish.yml on Upload-Post/upload-post-pip
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
upload_post-2.1.0-py3-none-any.whl -
Subject digest:
399267ea8a265eea47c059941ee8a458aae7acfdf58ae99a31efa31a2e1f624c - Sigstore transparency entry: 1203523495
- Sigstore integration time:
-
Permalink:
Upload-Post/upload-post-pip@9d05693def2dce1b7a5ee5ceeee1bd7d9fa2947f -
Branch / Tag:
refs/heads/main - Owner: https://github.com/Upload-Post
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@9d05693def2dce1b7a5ee5ceeee1bd7d9fa2947f -
Trigger Event:
push
-
Statement type: