Reelspan takes the same request shapes as Upload-Post: the same form fields (user, platform[], title, scheduled_date, async_upload, {platform}_title and the rest), the same per-network results in the answer, and webhooks with the same event names and payloads. Most integrations move by changing the base URL, the key and the paths.
1. Change the base URL and the key
| Upload-Post | Reelspan | |
|---|---|---|
| Base URL | https://api.upload-post.com/api |
https://api.reelspan.com/v1 |
| Auth header | Authorization: Apikey <key> |
Authorization: Apikey <key> or Authorization: Bearer <key> |
Reelspan reads both schemes, so the header can stay as it is: only the key changes. Create a key in the dashboard under Developers → API keys; see Authentication.
curl -X POST https://api.reelspan.com/v1/posts/video \
-H "Authorization: Bearer $REELSPAN_API_KEY" \
-F "user=my-brand" \
-F "platform[]=tiktok" \
-F "platform[]=youtube" \
-F "title=Launch day" \
-F "[email protected]"2. Change the paths
Paths drop the /uploadposts prefix and use /v1/... names. Bodies and query parameters stay the same unless a note says otherwise.
Publishing
| Upload-Post | Reelspan |
|---|---|
POST /api/upload |
POST /v1/posts/video |
POST /api/upload_photos |
POST /v1/posts/photos |
POST /api/upload_text |
POST /v1/posts/text |
POST /api/upload_document |
POST /v1/posts/document |
GET /api/uploadposts/status |
GET /v1/posts/status |
GET /api/uploadposts/history |
GET /v1/posts |
POST /api/uploadposts/posts/retry |
POST /v1/posts/retry |
POST /api/uploadposts/posts/unpublish |
POST /v1/posts/unpublish |
POST /api/uploadposts/posts/edit |
POST /v1/posts/edit |
POST /api/uploadposts/posts/repost |
POST /v1/posts/repost |
POST /api/uploadposts/posts/save |
POST /v1/posts/save (Pinterest) |
POST /api/uploadposts/youtube/thumbnail |
POST /v1/youtube/thumbnail |
Scheduling and the queue
| Upload-Post | Reelspan |
|---|---|
GET /api/uploadposts/schedule |
GET /v1/scheduled (pages of up to 200; 50 when you send no limit) |
GET /api/uploadposts/schedule/{job_id} |
GET /v1/scheduled/{job_id} |
PATCH /api/uploadposts/schedule/{job_id} |
PATCH /v1/scheduled/{job_id} |
GET /api/uploadposts/schedule/{job_id}/thumbnail |
GET /v1/scheduled/{job_id}/thumbnail (a 302 to the image; ?format=json for the link) |
GET /api/uploadposts/schedule/{job_id}/preview |
GET /v1/scheduled/{job_id}/preview |
DELETE /api/uploadposts/schedule/{job_id} |
DELETE /v1/scheduled/{job_id} |
GET / POST /api/uploadposts/queue/settings |
GET / POST /v1/queue/settings |
GET /api/uploadposts/queue/preview |
GET /v1/queue/preview |
GET /api/uploadposts/queue/next-slot |
GET /v1/queue/next-slot |
POST / DELETE /api/uploadposts/queue/slot-full |
POST / DELETE /v1/queue/slot-full |
Profiles and accounts
| Upload-Post | Reelspan |
|---|---|
GET /api/uploadposts/me |
GET /v1/me |
GET / POST /api/uploadposts/users/preferences |
GET / POST /v1/preferences (adds timezone) |
POST /api/uploadposts/users |
POST /v1/profiles |
GET /api/uploadposts/users |
GET /v1/profiles |
GET /api/uploadposts/users/{username} |
GET /v1/profiles/{username} |
PATCH /api/uploadposts/users/{username} |
PATCH /v1/profiles/{username} |
DELETE /api/uploadposts/users |
DELETE /v1/profiles |
DELETE /api/uploadposts/users/social |
DELETE /v1/accounts (same profile_username and social_platform) |
POST /api/uploadposts/users/generate-jwt |
POST /v1/connect-links (same body, same access_url, valid 48 hours) |
GET /api/uploadposts/users/validate-jwt |
GET /v1/connect-links/validate |
POST /api/uploadposts/users/discord/credentials, …/telegram/credentials |
POST /v1/accounts/{platform}, one route for every credential network |
POST /api/uploadposts/oauth/{platform}/start |
POST /v1/oauth/{platform}/start |
Lookups and analytics
| Upload-Post | Reelspan |
|---|---|
GET /api/uploadposts/facebook/pages |
GET /v1/facebook/pages (profile is required) |
POST / DELETE /api/uploadposts/users/facebook-page |
POST / DELETE /v1/facebook/page; the chosen Page is selected_page_id in GET /v1/facebook/pages |
GET /api/uploadposts/facebook/page-info |
GET /v1/facebook/page-info |
GET /api/uploadposts/google-business/locations |
GET /v1/google-business/locations |
POST / DELETE /api/uploadposts/users/google-business-location |
POST / DELETE /v1/google-business/location; the chosen location is selected_location_id in GET /v1/google-business/locations |
GET /api/uploadposts/pinterest/boards |
GET /v1/pinterest/boards |
POST /api/uploadposts/pinterest/boards |
POST /v1/pinterest/boards (name, description, privacy) |
GET / POST /api/uploadposts/pinterest/boards/{board_id}/sections |
GET / POST /v1/pinterest/boards/{board_id}/sections |
GET /api/uploadposts/tiktok/settings |
GET /v1/tiktok/creator-info (the list is privacy_options, not privacy_level_options) |
GET /api/uploadposts/instagram/publishing_limit, …/threads/publishing_limit |
GET /v1/publishing-limits (both networks in one call, or platform=) |
GET /api/uploadposts/reddit/detailed-posts |
GET /v1/reddit/posts |
GET /api/analytics/{profile_username} |
GET /v1/analytics/{profile_username} (days adds change) |
GET /api/uploadposts/total-impressions/{profile_username} |
GET /v1/analytics/{profile_username}/impressions |
GET /api/uploadposts/post-analytics/{request_id} |
GET /v1/post-analytics/{request_id} |
GET /api/uploadposts/post-analytics?platform_post_id=… |
GET /v1/post-analytics?platform_post_id=… (same platform and user) |
Webhooks
| Upload-Post | Reelspan |
|---|---|
GET / POST / DELETE /api/uploadposts/users/notifications |
GET / POST / DELETE /v1/webhook |
POST /api/uploadposts/users/webhook-secret |
POST /v1/webhook/secret |
GET / POST / DELETE /api/uploadposts/users/profile-webhook |
GET / POST / DELETE /v1/profile-webhook |
3. Fields and headers that differ
| Upload-Post | Reelspan |
|---|---|
flair_id (Reddit) |
reddit_flair_id. subreddit works as before, and so does reddit_subreddit. |
The rest carry over as they are: the X-Request-Id and X-External-Id headers (Retrying safely), the gbp_* Google Business fields including EVENT and OFFER posts, facebook_media_type=VIDEO, and PDF, PPT, PPTX, DOC and DOCX documents.
Network fields that Reelspan doesn't read are ignored, not refused, so check each network's page under Networks for the fields it takes.
4. Update your webhook receiver
Event names (upload_completed, social_account_connected, social_account_disconnected, social_account_reauth_required) and payloads are the same; dotted spellings such as social_account.connected are accepted when you subscribe. The headers are renamed, and the signature is built the same way, an HMAC-SHA256 of "{timestamp}.{raw body}":
| Upload-Post | Reelspan |
|---|---|
X-Upload-Post-Signature |
X-Reelspan-Signature |
X-Upload-Post-Timestamp |
X-Reelspan-Timestamp |
X-Upload-Post-Event |
X-Reelspan-Event |
X-Upload-Post-Delivery |
X-Reelspan-Delivery |
User-Agent Upload-Post-Webhooks/1.0 |
User-Agent Reelspan-Webhooks/1.0 |
Register the endpoint again on Reelspan: it gets a new signing secret (whsec_…). Reelspan sends webhooks only; there is no Telegram notification channel. See Webhooks.
What you get on top
- Test keys and a sandbox network. A
rs_test_key runs every check and publishes nothing; thesandboxnetwork needs no connected account. See Test mode. - Upload once, post many times. Upload media returns a
media_idto use asvideo_media_id,photo_media_ids[],thumbnail_media_idorcover_media_id, and files over 100 MB go straight to storage in parts. - Repeats.
repeat_every(day,week,month) andrepeat_timesschedule a whole series at once;DELETE /v1/scheduled/{job_id}?series=restcancels the rest of it. - Finer retries. Retry can send only some networks again, change their settings first, and run now or at a set time.
- Webhook deliveries you can see. Failed deliveries are retried with backoff, every delivery is in a log, and you can redeliver one or send a test event.
- Approval links. Send scheduled posts to a client, who approves each one from a link before it goes out. See Approval links.
- More analytics. Daily account history, best times to post and period reports.
- Official SDKs for Node.js and Python with retries and idempotent posts built in. See SDKs.
Not available yet
These Upload-Post endpoints have no Reelspan equivalent today: TikTok hashtag suggestions; comments, DMs and AutoDMs; cached bulk post analytics; Google Business location info and reviews. Editing or unpublishing YouTube videos and Threads posts isn't possible either: Unpublish and Edit a post list the networks that work. If your integration depends on one of these, tell us.