Upload Video
Upload a video to one or more social media platforms.
Endpoint
POST https://api.indreelforge.com/api/upload
Parameters
Required
| Parameter | Type | Description |
|---|---|---|
video | file | Video file (MP4, MOV, AVI, WebM). Max 2 GB. |
title | string | Title / caption for the post |
user | string | Profile name (case-sensitive) |
platform[] | string | Target platform(s). Repeat for multiple. |
Optional — General
| Parameter | Type | Description |
|---|---|---|
description | string | Extended description / body text |
schedule | datetime | ISO 8601 schedule time (e.g. 2025-12-31T18:00:00Z) |
async_upload | boolean | Default 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.) |
tags | string | Comma-separated hashtags (without #) |
location | string | Location tag |
thumbnail | file | Custom thumbnail image (JPG/PNG) |
Platform-Specific Overrides
Pass these to override title/description per platform:
| Parameter | Platforms |
|---|---|
instagram_title | |
youtube_title | YouTube |
facebook_title | |
tiktok_title | TikTok |
x_title | X (Twitter) |
linkedin_title | |
pinterest_title | |
reddit_title | |
reddit_subreddit | Reddit — required for Reddit posts |
Instagram-Specific
| Parameter | Description |
|---|---|
instagram_share_to_feed | true / false — show Reel on feed (default true) |
instagram_audio_name | Audio track name |
YouTube-Specific
| Parameter | Description |
|---|---|
youtube_privacy | public / private / unlisted (default public) |
youtube_category | Numeric category ID |
youtube_made_for_kids | true / false |
youtube_shorts | true to upload as a YouTube Short |
TikTok-Specific
| Parameter | Description |
|---|---|
tiktok_privacy | PUBLIC_TO_EVERYONE / MUTUAL_FOLLOW_FRIENDS / FOLLOWER_OF_CREATOR / SELF_ONLY |
tiktok_disable_comment | true / false |
tiktok_disable_duet | true / false |
tiktok_disable_stitch | true / false |
tiktok_auto_add_music | true / false |
Pinterest-Specific
| Parameter | Description |
|---|---|
pinterest_board_id | Target board ID |
pinterest_link | Destination URL for the pin |
LinkedIn-Specific
| Parameter | Description |
|---|---|
linkedin_visibility | PUBLIC / CONNECTIONS (default PUBLIC) |
Supported Platforms
instagram, youtube, facebook, tiktok, x, linkedin, threads, pinterest, reddit, bluesky, discord, telegram, mastodon, wordpress
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
| Status | Code | Description |
|---|---|---|
| 400 | — | Invalid parameters or unsupported file format |
| 401 | — | Invalid or missing API key |
| 402 | X_ADDON_REQUIRED / X_MONTHLY_LIMIT_REACHED | The 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 |