Skip to main content

Upload Video

Upload a video to one or more social media platforms.

Endpoint​

POST https://api.indreelforge.com/api/upload

Parameters​

Required​

ParameterTypeDescription
videofileVideo file (MP4, MOV, AVI, WebM). Max 2 GB.
titlestringTitle / caption for the post
userstringProfile name (case-sensitive)
platform[]stringTarget platform(s). Repeat for multiple.

Optional — General​

ParameterTypeDescription
descriptionstringExtended description / body text
scheduledatetimeISO 8601 schedule time (e.g. 2025-12-31T18:00:00Z)
async_uploadbooleanDefault true: respond at once and publish in the background. false: wait up to 50 s for the publish result — see Synchronous mode. For a video URL, false also downloads and verifies the file before responding. (async is accepted as an alias.)
tagsstringComma-separated hashtags (without #)
locationstringLocation tag
thumbnailfileCustom thumbnail image (JPG/PNG)

Platform-Specific Overrides​

Pass these to override title/description per platform:

ParameterPlatforms
instagram_titleInstagram
youtube_titleYouTube
facebook_titleFacebook
tiktok_titleTikTok
x_titleX (Twitter)
linkedin_titleLinkedIn
pinterest_titlePinterest
reddit_titleReddit
reddit_subredditReddit — required for Reddit posts

Instagram-Specific​

ParameterDescription
instagram_share_to_feedtrue / false — show Reel on feed (default true)
instagram_audio_nameAudio track name

YouTube-Specific​

ParameterDescription
youtube_privacypublic / private / unlisted (default public)
youtube_categoryNumeric category ID
youtube_made_for_kidstrue / false
youtube_shortstrue to upload as a YouTube Short

TikTok-Specific​

ParameterDescription
tiktok_privacyPUBLIC_TO_EVERYONE / MUTUAL_FOLLOW_FRIENDS / FOLLOWER_OF_CREATOR / SELF_ONLY
tiktok_disable_commenttrue / false
tiktok_disable_duettrue / false
tiktok_disable_stitchtrue / false
tiktok_auto_add_musictrue / false

Pinterest-Specific​

ParameterDescription
pinterest_board_idTarget board ID
pinterest_linkDestination URL for the pin

LinkedIn-Specific​

ParameterDescription
linkedin_visibilityPUBLIC / CONNECTIONS (default PUBLIC)

Supported Platforms​

instagram, youtube, facebook, tiktok, x, linkedin, threads, pinterest, reddit, bluesky, discord, telegram, mastodon, wordpress

info

TikTok requires a paid plan (Basic or above).

Examples​

cURL​

curl \
-H 'Authorization: Apikey YOUR_API_KEY' \
-F 'video=@/path/to/video.mp4' \
-F 'title="My Awesome Video"' \
-F 'user="my-brand"' \
-F 'platform[]=instagram' \
-F 'platform[]=youtube' \
-F 'platform[]=tiktok' \
-X POST https://api.indreelforge.com/api/upload

Schedule for later​

curl \
-H 'Authorization: Apikey YOUR_API_KEY' \
-F 'video=@/path/to/video.mp4' \
-F 'title="Scheduled post"' \
-F 'user="my-brand"' \
-F 'platform[]=instagram' \
-F 'schedule="2025-12-31T18:00:00Z"' \
-X POST https://api.indreelforge.com/api/upload

JavaScript​

const form = new FormData();
form.append('video', fs.createReadStream('/path/to/video.mp4'));
form.append('title', 'My Awesome Video');
form.append('user', 'my-brand');
form.append('platform[]', 'instagram');
form.append('platform[]', 'youtube');

const response = await fetch('https://api.indreelforge.com/api/upload', {
method: 'POST',
headers: { 'Authorization': 'Apikey YOUR_API_KEY' },
body: form,
});

const data = await response.json();
console.log(data);

Python​

import requests

files = {'video': open('/path/to/video.mp4', 'rb')}
data = {
'title': 'My Awesome Video',
'user': 'my-brand',
'platform[]': ['instagram', 'youtube', 'tiktok'],
}
headers = {'Authorization': 'Apikey YOUR_API_KEY'}

response = requests.post(
'https://api.indreelforge.com/api/upload',
files=files,
data=data,
headers=headers,
)
print(response.json())

Response​

{
"status": "success",
"message": "Video upload queued successfully",
"data": {
"upload_id": "upl_abc123",
"platforms": {
"instagram": { "status": "queued" },
"youtube": { "status": "queued" },
"tiktok": { "status": "queued" }
}
}
}

Synchronous mode (async_upload=false)​

By default the upload is queued and the response returns immediately (HTTP 201) with an upload_id; poll GET /api/upload/{upload_id}/status or use webhooks to follow delivery.

Send async_upload=false to have the request wait for the publish result instead. The server waits up to 50 seconds and then responds with HTTP 200 and the final per-platform outcome:

{
"success": true,
"sync": true,
"message": "Published",
"data": {
"upload_id": "upl_abc123",
"status": "completed",
"platforms": { "youtube": "completed", "x": "completed" },
"platform_post_ids": { "youtube": "dQw4w9WgXcQ", "x": "1849…" }
}
}

status is completed, partial (some platforms failed — see error_message) or failed. If publishing takes longer than 50 seconds, you get the normal asynchronous response instead and can keep polling. Scheduled and queued posts are always asynchronous.

Error Responses​

StatusCodeDescription
400—Invalid parameters or unsupported file format
401—Invalid or missing API key
402X_ADDON_REQUIRED / X_MONTHLY_LIMIT_REACHEDThe upload targets X and no X posts remain this month (1 free per month on every plan; 300/month with the X add-on). See the X guide
403—Platform not connected for the specified profile
413—File too large (max 2 GB)
429—Rate limit exceeded
500—Internal server error