Imported from davepoon/buildwithclaude (
plugins/all-skills/skills/upload-post/SKILL.md). Install upstream withnpx skills add davepoon/buildwithclaude --skill upload-post. Copyright stays with the author (MIT).
Upload-Post
Publish one piece of content to many social platforms in a single API call.
Accounts are connected once through OAuth in the Upload-Post dashboard, so there is no per-platform developer app, review process, or token refresh to maintain. A single API key covers every platform.
When to Use This Skill
- The user wants the same video, carousel, or post published to several platforms at once
- The user wants a post scheduled for a future date, or added to a posting queue
- The user asks for per-post or per-platform analytics (views, likes, impressions)
- The user wants to check whether an upload finished, or retry the platforms that failed
- The user wants Instagram comment-to-DM automation (keyword triggers → private DMs)
What This Skill Does
- Authenticates with
Authorization: Apikey $UPLOAD_POST_API_KEY - Posts video, photos, text, or documents to one or more platforms in one request
- Optionally schedules the post instead of publishing immediately
- Polls upload status and reports the per-platform result
- Reads analytics and upload history
Prerequisites
- An account at upload-post.com (free tier: 10 uploads/month)
- Social accounts connected in the dashboard
- A profile name (e.g.
mybrand) — this groups the connected accounts and is what theuserparameter refers to. It is not a social handle. UPLOAD_POST_API_KEYin the environment
How to Use
Base URL: https://api.upload-post.com/api
Auth uses the Apikey scheme, not Bearer. Sending Bearer returns a misleading
401 Invalid or expired token even when the key is valid.
Publish a video to several platforms
curl -X POST "https://api.upload-post.com/api/upload" \
-H "Authorization: Apikey $UPLOAD_POST_API_KEY" \
-F "user=mybrand" \
-F "platform[]=tiktok" \
-F "platform[]=instagram" \
-F "platform[]=youtube" \
-F "video=@clip.mp4" \
-F "title=How to build better habits" \
-F "async_upload=true"
platform[] is repeated once per target. title is required for YouTube and Reddit and
optional everywhere else.
Publish a photo carousel
curl -X POST "https://api.upload-post.com/api/upload_photos" \
-H "Authorization: Apikey $UPLOAD_POST_API_KEY" \
-F "user=mybrand" \
-F "platform[]=instagram" \
-F "photos[]=@slide1.jpg" \
-F "photos[]=@slide2.jpg" \
-F "title=Five lessons from year one"
Schedule instead of publishing now
Add scheduled_date (ISO-8601) and optionally timezone (IANA):
-F "scheduled_date=2026-12-31T18:00:00Z" -F "timezone=Europe/Madrid"
Per-platform captions
title is the fallback. Override per platform with <platform>_title:
-F "title=New video out now" \
-F "tiktok_title=new vid 🔥 #fyp" \
-F "linkedin_title=A short breakdown of what we learned shipping this."
Check the result
Long uploads run in the background and return a request_id:
curl "https://api.upload-post.com/api/uploadposts/status?request_id=REQ_ID" \
-H "Authorization: Apikey $UPLOAD_POST_API_KEY"
Other endpoints
| Endpoint | Method | Description |
|---|---|---|
/upload |
POST | Videos |
/upload_photos |
POST | Photos and carousels |
/upload_text |
POST | Text-only posts |
/upload_document |
POST | Documents (LinkedIn) |
/uploadposts/status?request_id=X |
GET | Async upload status |
/uploadposts/history |
GET | Upload history |
/uploadposts/schedule |
GET | List scheduled posts |
/uploadposts/schedule/<job_id> |
PATCH / DELETE | Edit or cancel a scheduled post |
/uploadposts/me |
GET | Validate the API key |
/analytics/<profile> |
GET | Analytics |
/uploadposts/facebook/pages |
GET | List Facebook pages |
/uploadposts/linkedin/pages |
GET | List LinkedIn pages |
/uploadposts/pinterest/boards |
GET | List Pinterest boards |
Example
User: "Post this clip to TikTok, Reels and Shorts with the caption 'Day 1 of building in public'"
Output:
Publishing clip.mp4 to tiktok, instagram, youtube...
request_id: req_8f21c04a
Status: completed
tiktok ✅ https://tiktok.com/@mybrand/video/7412...
instagram ✅ https://instagram.com/reel/C8xY2...
youtube ✅ https://youtu.be/dQw4w9Wg...
Error Handling
401 Invalid or expired tokenwith a key you know is good — you sentBearer. UseAuthorization: Apikey <key>.- A platform fails while others succeed — the status response reports per-platform
results. Retry only the failed ones by passing
retry_request_idrather than re-uploading everything. reached_active_user_capon TikTok — TikTok's daily cap for the app was hit. The upload falls back to the TikTok inbox as a draft; the video is waiting in the app, not live.- Upload takes longer than 59 seconds — it switches to async automatically. Do not treat
a timeout as a failure; poll
/uploadposts/statuswith therequest_id. - Missing title on YouTube or Reddit — both reject the upload. Every other platform accepts an empty title.
Tips
- Send an
Idempotency-Keyheader when retrying a request that may have already been accepted — it returns the existing job instead of double-posting. - For TikTok,
post_mode=MEDIA_UPLOADputs the video in the app's drafts instead of publishing directly, which tends to get better organic reach. - Use
first_commentto drop a link or hashtags into the first comment automatically. - The full parameter reference lives at docs.upload-post.com,
with an LLM-friendly dump at
https://docs.upload-post.com/llm.txt.
Resources
- API documentation: https://docs.upload-post.com
- Dashboard: https://upload-post.com
- Official skills repo: https://github.com/Upload-Post/upload-post-skills
- MCP connector: https://mcp.upload-post.com/mcp