Send the video once as multipart/form-data. Name the profile in user and each network in a repeated platform[] field. Reelspan converts and uploads it to every network, then answers with one result per network.
A first video
curl -X POST https://api.reelspan.com/v1/posts/video \
-H "Authorization: Bearer $REELSPAN_API_KEY" \
-H "Idempotency-Key: launch-2026-12-01" \
-F "user=my-brand" \
-F "platform[]=tiktok" \
-F "platform[]=youtube" \
-F "platform[]=instagram" \
-F "title=Launch day" \
-F "[email protected]"import { Reelspan } from 'reelspan';
import { readFile } from 'node:fs/promises';
const reelspan = new Reelspan();
const post = await reelspan.posts.video({
user: 'my-brand',
platforms: ['tiktok', 'youtube', 'instagram'],
title: 'Launch day',
video: { data: await readFile('launch.mp4'), name: 'launch.mp4', type: 'video/mp4' },
});from reelspan import Reelspan
reelspan = Reelspan()
post = reelspan.posts.video("my-brand", ["tiktok", "youtube", "instagram"], "launch.mp4", "Launch day")video can also be a public https URL instead of a file; Google Drive and Dropbox share links work. To post the same file more than once, upload it first with Upload media and send video_media_id.
The response
The request waits up to 59 seconds for every network. Most finish in that time and you get 200 with results, keyed by network:
{
"success": true,
"request_id": "9b1f6c2e8a3d4f50b7e1c9a2d6f3e8b1",
"results": {
"tiktok": { "success": true, "url": "https://www.tiktok.com/@mybrand/video/7441…", "post_id": "7441…" },
"youtube": { "success": true, "url": "https://youtube.com/shorts/aB3…" },
"instagram": { "success": false, "error": "Instagram is still processing the video", "error_code": "processing_timeout" }
}
}When a network takes longer, the answer is still 200, but without results: it has a message, the request_id and total_platforms, and the work carries on in the background. Read the outcome with Post status or a webhook. Send async_upload=true to get that answer straight away.
{
"success": true,
"message": "Upload initiated successfully in background.",
"request_id": "9b1f6c2e8a3d4f50b7e1c9a2d6f3e8b1",
"total_platforms": 3
}A scheduled or queued post answers 202 with its job_id instead.
One network failing never fails the others. Retry only the failed ones with Retry: the video is not uploaded again.
Captions per network
title is the caption every network uses. To say something different on one network, send {network}_title (for example tiktok_title, instagram_title, x_title), and {network}_description where the network has a separate body (YouTube, LinkedIn, Reddit, WordPress…). YouTube needs a title; it uses youtube_title, else title.
Network settings
Each network's own options are plain form fields, named after the network: TikTok privacy and interactions, the YouTube category, tags and thumbnail, an Instagram Story instead of a Reel, a Pinterest board, a Reddit subreddit, and so on. The full list for each network, with what it does and its limits, is on that network's page under Networks.
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=How we ship" \
-F "privacy_level=PUBLIC_TO_EVERYONE" \
-F "youtube_title=How we ship, in 60 seconds" \
-F "privacyStatus=public" \
-F "[email protected]"Later, queued or repeated
- At a time:
scheduled_date(ISO 8601) with an optionaltimezone. The answer is 202 with ajob_id; see Scheduled posts. - In the queue:
add_to_queue=truetakes the profile's next free slot; see Queue. - On repeat:
repeat_every(day,week,month) andrepeat_times(2 to 30) schedule the whole series at once; see Scheduling and repeats.
Safe to retry
Send an Idempotency-Key header, or your own request_id. If the network drops after you sent the request, sending it again with the same key returns the first request's result instead of posting twice. See Retrying safely.
Limits
The video must be within your plan's upload size and each network's own limits (length, size, aspect ratio). Reelspan checks before uploading and says which network can't take it; see Video requirements.