Upload API Reference
Upload videos and photo carousels to your TikTok accounts programmatically using our Upload API.
Base Endpoint
POST /api/v1/upload
Authentication
- Required: Bearer token (JWT or API key)
- Feature: Available to all subscription plans
Endpoints
Upload Video
POST /api/v1/upload/video
Upload a video directly or from a URL.
TikTok account ID to upload to. Auto-selected if only one account connected.
Video title (1-150 characters)
Video description (max 2200 characters)
privacyLevel
string
default:"PUBLIC_TO_EVERYONE"
Privacy level:
PUBLIC_TO_EVERYONE
MUTUAL_FOLLOW_FRIENDS
FOLLOWER_OF_CREATOR
SELF_ONLY
Disable duet functionality
Disable stitch functionality
Custom video cover timestamp in milliseconds
Direct video URL for URL-based uploads
curl -X POST 'https://api.d1g.qzz.io/api/v1/upload/video' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"title": "My Amazing Video",
"description": "Check out this awesome content!",
"privacyLevel": "PUBLIC_TO_EVERYONE",
"disableDuet": false,
"disableStitch": false,
"videoUrl": "https://example.com/video.mp4"
}'
import axios from 'axios';
const uploadVideo = async () => {
try {
const response = await axios.post(
'https://api.d1g.qzz.io/api/v1/upload/video',
{
title: 'My Amazing Video',
description: 'Check out this awesome content!',
privacyLevel: 'PUBLIC_TO_EVERYONE',
disableDuet: false,
disableStitch: false,
videoUrl: 'https://example.com/video.mp4'
},
{
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
}
);
console.log('Upload successful:', response.data);
} catch (error) {
console.error('Upload failed:', error.response?.data || error.message);
}
};
import requests
def upload_video():
url = "https://api.d1g.qzz.io/api/v1/upload/video"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
data = {
"title": "My Amazing Video",
"description": "Check out this awesome content!",
"privacyLevel": "PUBLIC_TO_EVERYONE",
"disableDuet": False,
"disableStitch": False,
"videoUrl": "https://example.com/video.mp4"
}
response = requests.post(url, json=data, headers=headers)
if response.status_code == 200:
print("Upload successful:", response.json())
else:
print("Upload failed:", response.json())
{
"success": true,
"data": {
"uploadId": "dd3c9a25-f6a0-4ef7-b227-830fa0da70e4",
"status": "pending",
"message": "Video upload queued. Processing in background."
}
}
Upload Photo Carousel
POST /api/v1/upload/photo
Upload a photo carousel with 1-35 photos.
TikTok account ID to upload to
Carousel title (1-150 characters)
privacyLevel
string
default:"PUBLIC_TO_EVERYONE"
Privacy level (same options as video upload)
Disable duet functionality
Disable stitch functionality
Number of photos in carousel (1-35)
Photo uploads require multipart/form-data encoding with photos sent as file fields named photos[].
Get Upload Status
GET /api/v1/upload/status/{uploadId}
Get the current status of an upload.
Upload ID returned from upload endpoint
{
"success": true,
"data": {
"uploadId": "dd3c9a25-f6a0-4ef7-b227-830fa0da70e4",
"status": "published",
"progressPercentage": 100,
"tiktokVideoId": "v_inbox_file~v2.7562847402311370807",
"error": null,
"mediaType": "video",
"publishedAt": "2025-01-19T09:31:40.733Z"
}
}
Get Upload History
GET /api/v1/upload/history
Get a list of all uploads for the authenticated user.
{
"success": true,
"data": [
{
"id": "dd3c9a25-f6a0-4ef7-b227-830fa0da70e4",
"tiktokVideoId": "v_inbox_file~v2.7562847402311370807",
"title": "Amazing TikTok Video",
"description": "Check out this amazing content!",
"status": "published",
"uploadProgress": 100,
"mediaType": "video",
"tiktokAccount": {
"id": "123e4567-e89b-12d3-a456-426614174000",
"username": "my_tiktok_handle",
"displayName": "My TikTok Name"
},
"createdAt": "2025-01-19T09:31:29.265Z",
"publishedAt": "2025-01-19T09:31:40.733Z",
"error": null
}
],
"pagination": {
"total": 42,
"limit": 20,
"offset": 0
}
}
Delete Upload
DELETE /api/v1/upload/{uploadId}
Delete an upload (only works for uploads that haven’t been published).
Upload Limits
| Plan | Monthly Limit | Video Size | Photo Count |
|---|
| Free | 5 | 1GB | 1-35 |
| Basic | 25 | 1GB | 1-35 |
| Professional | 100 | 1GB | 1-35 |
Exceeding upload limits will result in a 403 FORBIDDEN error. Upload limits reset on your subscription anniversary date.
Common Errors
- 400 VALIDATION_ERROR: Invalid parameters or missing required fields
- 403 FORBIDDEN: Upload limit exceeded or insufficient permissions
- 404 NOT_FOUND: Invalid upload ID
- 413 PAYLOAD_TOO_LARGE: File size exceeds 1GB limit
- 422 UNPROCESSABLE_ENTITY: Unsupported file format or corrupted file
For file upload errors, ensure your video is in MP4 format with H.264 codec and your photos are JPG/PNG under 10MB each.