API Reference & Workflow
This API allows you to programmatically upload content to TikTok, Instagram, YouTube, Facebook, Pinterest, Bluesky and more. The process is asynchronous to handle large files and platform-specific processing times efficiently.
Architecture Overview
Workflow Overview
The general workflow for uploading content involves two main steps:
- Initiate Upload: Send your media file(s) and metadata to the upload endpoint. The server queues the job and returns an
uploadId. - Check Status: Poll the status endpoint using the
uploadId, or receive a webhook when the upload is complete.
Sequence Diagram
Base URL
https://api.multi-upload-tool.com/api/v1Authentication
All requests require an API key in the header:
x-api-key: YOUR_API_TOKENGenerate your API key from the Dashboard under Settings > API Keys.
API Key Access (Scopes)
Each key carries a list of scopes, chosen when you create it under Settings > API Keys. Give each integration only what it needs: a reporting dashboard needs analytics:read, not the right to publish.
| Scope | Allows |
|---|---|
* | Everything. Every key created before scopes existed has it, and so does a key created without a list. |
posts:read | Read posts, limits, platform rules and the credit balance (/x-credits); dry-run a post (/upload/validate); follow a subtitle render (GET /ai/captions/{jobId}). |
posts:write | Create posts and upload media — always held for approval unless the key also has posts:publish. Also the AI features (/ai/post-text, /ai/captions), which spend credits. |
posts:publish | Publish directly, approve, retry, reschedule, create client review links. |
accounts:read / accounts:write | Read connected accounts / disconnect one. |
analytics:read | Read statistics (and refresh them). |
pools:read / pools:write | Read pools / add and remove videos. A pool publishes on its own schedule. |
webhooks:read / webhooks:write | Read / manage webhooks. |
team:read / team:write | Read / manage team members and invites. |
links:read / links:write | Read / manage short links, custom domains and white-label links. |
inbox:read / inbox:write | Read Instagram / Facebook comments and DMs / reply, mark read, manage auto-reply automations. |
writeincludesread;posts:publishincludesposts:writeandposts:read.- The dashboard offers presets: Full access, Publishing, Drafts only (AI agent), Read only, or Custom.
- Drafts only (
posts:writewithoutposts:publish) is made for AI agents: they prepare posts, a human approves them. See Drafts & Approval. - Every operation states the scope it needs in the OpenAPI document (
x-required-scope). - Existing keys keep full access: nothing changes for them unless you edit them.
- A key must hold at least one scope: an empty list is refused (
*is full access). - A key without
webhooks:writedoes not see the webhooks’ signingsecret. - On the MCP endpoint, the same scopes decide which tools the key sees.
A call the key is not allowed to make returns 403:
{ "success": false, "error": "This API key does not have the \"webhooks:write\" scope needed here. …", "code": "INSUFFICIENT_SCOPE", "requiredScope": "webhooks:write" }Rotate a key
Rotate in the key’s menu creates a new secret with the same name and access. The old secret stops working immediately, so update every tool that uses it.
Rate Limiting
| Type | Limit | Window |
|---|---|---|
| Standard requests | 100 requests | 15 minutes per IP |
| Uploads | Platform-specific | Rolling 24-hour window |
When rate limited, the API returns 429 Too Many Requests. See Limits & Quotas for platform-specific daily caps.
Idempotency (safe retries)
A request that times out may still have gone through. Send an Idempotency-Key header on POST /upload and POST /upload/bulk so a retry never publishes twice:
curl -X POST https://api.multi-upload-tool.com/api/v1/upload/bulk \
-H "x-api-key: YOUR_API_TOKEN" \
-H "Idempotency-Key: 5f0c2a8e-7d1b-4c3e-9a61-2b8f4e1d9c07" \
-F 'accounts=["cmf3k9x2a0001l408q7vbn2hd"]' \
-F "video=@/path/to/video.mp4"- Use a new unique value (a UUID) for each post you intend to create, and the same value when you retry that post.
- For 24 hours, a retry with the same key returns the first response unchanged, with the header
Idempotent-Replay: true. Nothing is published again. - If the first request is still running, the retry gets
409 IDEMPOTENCY_IN_PROGRESS: wait and retry. - If the first request failed with an error, the key is released: the retry runs normally.
- With
async=false, if the post takes more than 10 minutes to publish, the response isstatus: "processing"with itsuploadId(check it withGET /upload/:id). That response is the one replayed: a retry never publishes twice. - Keys are scoped to your account and to the endpoint, and are at most 255 characters. The body is not compared: a different body sent with a used key still gets the first response.
Over MCP, pass the same value as the idempotencyKey argument of create_post.
Response Format
All responses follow a standard JSON structure:
{
"success": true,
"message": "Optional message",
"data": { ... },
"error": "Error message (if success is false)"
}