Upload Management
This section documents the endpoints available for managing and retrieving information about your uploads.
Base URL
https://api.multi-upload-tool.com/api/v1
Authentication
All requests require an API Token in the header:
x-api-key: YOUR_API_TOKEN
List Uploads
Retrieve a list of posts you have uploaded. Supports pagination and filtering.
Endpoint
GET /upload
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
page | number | No | Page number (default: 1). |
limit | number | No | Items per page (default: 100, max: 1000). |
platform | string | No | Filter by platform (tiktok, youtube). |
status | string | No | Filter by status (pending, processing, completed, failed, scheduled). |
search | string | No | Search by title. |
startDate | string (ISO) | No | Filter by uploaded/scheduled/created on or after date. |
endDate | string (ISO) | No | Filter by uploaded/scheduled/created on or before date. |
Example Request
curl -X GET "https://api.multi-upload-tool.com/api/v1/upload?page=1&limit=10&platform=tiktok" \
-H "x-api-key: YOUR_API_TOKEN"Example Response
{
"success": true,
"data": [
{
"id": 456,
"title": "My amazing video",
"platform": "tiktok",
"status": "completed",
"uploadedAt": "2023-10-27T10:00:00.000Z",
"thumbnailUrl": "https://...",
"videoUrl": "https://...",
"fileSize": "12345678",
"connectedAccount": {
"id": "cmf3k9x2a0001l408q7vbn2hd",
"platform": "tiktok",
"accountName": "brand account",
"profileImageUrl": "https://...",
"tags": "team,marketing"
},
"metadata": { "videoId": "73123456789" }
}
],
"pagination": {
"total": 50,
"page": 1,
"limit": 10,
"totalPages": 5
}
}Get Upload Details
Retrieve details for a specific upload.
Endpoint
GET /upload/:id
Example Request
curl -X GET "https://api.multi-upload-tool.com/api/v1/upload/456" \
-H "x-api-key: YOUR_API_TOKEN"Example Response
{
"success": true,
"data": {
"id": 456,
"platform": "tiktok",
"title": "My amazing video",
"description": "Check this out!",
"status": "completed",
"uploadedAt": "2023-10-27T10:00:00.000Z",
"thumbnailUrl": "https://...",
"videoUrl": "https://...",
"connectedAccount": {
"id": "cmf3k9x2a0001l408q7vbn2hd",
"platform": "tiktok",
"accountName": "brand account",
"profileImageUrl": "https://..."
},
"metadata": {
"videoId": "73123456789",
"shareUrl": "https://www.tiktok.com/@user/video/73123456789"
}
}
}Update Upload
Update a scheduled upload, a draft or a post awaiting approval: its caption or its publish time. The status of a draft only changes through submit / approve. To send a failed upload again, use Retry a Failed Upload.
Endpoint
PATCH /upload/:id
Only uploads in scheduled status can be updated.
Body Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
title | string | No | Update the title. |
description | string | No | Update the description. |
scheduledFor | string (ISO) | No | Update scheduled publish time. |
status | string | No | Not editable here: a different value returns 400 USE_APPROVAL_ACTIONS. Use submit / approve for drafts, and cancel a scheduled post by deleting it. |
Example Request
curl -X PATCH "https://api.multi-upload-tool.com/api/v1/upload/456" \
-H "x-api-key: YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"title": "Updated Title", "scheduledFor": "2023-10-30T12:00:00.000Z"}'Example Response
{
"success": true,
"data": {
"id": 456,
"title": "Updated Title",
"status": "scheduled",
"scheduledFor": "2023-10-30T12:00:00.000Z"
}
}Why an Upload Failed
A failed upload carries errorMessage (the platform’s words) and failure, the same information as data you can act on:
"status": "failed",
"errorMessage": "TikTok Error: Daily quota for active publishing users reached. (reached_active_user_cap)",
"failure": { "code": "rate_limited", "retryable": true, "nextAction": "retry_later" }failure is null unless the upload failed.
X posts also carry xCredits: { "spent": 15, "refunded": 0, "net": 15 }, the credits the post cost (null until the job has run). See X credits.
code | retryable | nextAction | Meaning |
|---|---|---|---|
rate_limited | true | retry_later | A platform cap or rate limit (TikTok daily creator cap, too many posts in 24 hours, Facebook rate limit, YouTube upload quota). Retry once it resets. |
account_disconnected | true | reconnect_account | The platform refused the account’s access. Reconnect it, then retry. |
platform_unavailable | true | retry | The platform timed out or dropped the connection. |
queue_expired | true | retry | The job waited more than 24 hours in the queue and was dropped. |
unknown | true | retry | Not recognized. Retry once; contact support if it fails again. |
media_invalid | false | replace_media | The platform refuses this file (format, resolution, duration, size). |
media_unreachable | false | replace_media | The media URL could not be downloaded. |
content_flagged | false | edit_post | The platform refused the content (flagged as spam, blocked link). |
platform_processing_timeout | false | check_platform | The platform received the video but did not finish processing it in time. It may still appear: check the account before retrying. |
cancelled | false | none | Cancelled on purpose. |
Retry a Failed Upload
Sends one failed upload again. An upload is one account of a post: when a post went out on 2 of 3 accounts, retrying the failed one never republishes the other two.
Endpoint
POST /upload/:id/retry
Body Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
force | boolean | No | Retry even when failure.retryable is false. Use it only after checking the platform (e.g. platform_processing_timeout). |
Example Request
curl -X POST "https://api.multi-upload-tool.com/api/v1/upload/456/retry" \
-H "x-api-key: YOUR_API_TOKEN"Example Response
{ "success": true, "data": { "uploadId": 456, "status": "pending" } }When a retry is refused (409)
code | Why |
|---|---|
NOT_FAILED | Only failed uploads can be retried. |
ALREADY_RETRYING | The upload is still being retried automatically. Wait for the result. |
NOT_RETRYABLE | failure.retryable is false: retrying would fail again. Pass force: true to override. |
ACCOUNT_INACTIVE | Reconnect the account first. |
MEDIA_EXPIRED | The media of a failed upload is kept for 24 hours, then deleted. Create a new post. |
DAILY_LIMIT | The account reached its daily cap. The message says when it resets. |
PLAN_LIMIT | A retried post counts toward your monthly quota again: the quota is used up, or your plan no longer includes this platform. |
QUEUE_FULL / QUEUE_BUSY | Too many uploads in progress. Try again in a few minutes. |
{ "success": false, "error": "The account is not connected. Reconnect it, then retry.", "code": "ACCOUNT_INACTIVE" }Retry All Failed Uploads
Sends again every retryable upload that failed in the last 24 hours. Uploads that were published are never touched.
Endpoint
POST /upload/retry-failed
Body Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
accountId | string | No | Only this account’s failed uploads. |
platform | string | No | Only this platform’s failed uploads. |
Example Response
{
"success": true,
"data": {
"retried": [456, 457],
"skipped": [
{ "uploadId": 458, "platform": "instagram", "code": "NOT_RETRYABLE", "reason": "Retrying will not fix this failure (media_invalid); next step: replace_media." }
]
}
}In the dashboard, the same actions are the Retry button on a failed post and Retry failed in the failures banner.
Get Upload Limits
Check upload limits for a specific account (e.g. YouTube daily quota).
Endpoint
GET /limits/:accountId
Example Request
curl -X GET "https://api.multi-upload-tool.com/api/v1/limits/cmf3k9x2a0001l408q7vbn2hd" \
-H "x-api-key: YOUR_API_TOKEN"Example Response
{
"success": true,
"data": {
"remaining": 5,
"limit": 10,
"resetAt": "2023-10-28T00:00:00.000Z"
}
}