Step 1
Create an API key in the dashboard
API keys are generated through a bearer-authenticated dashboard session. The returned key is only shown once, so store it immediately.
This page documents the practical upload API: how to create a key, which header to send, which endpoint to call for each upload strategy, and what constraints matter in production.
If you only need the shortest path to a working integration, follow these three steps first and use the endpoint reference after that.
Step 1
API keys are generated through a bearer-authenticated dashboard session. The returned key is only shown once, so store it immediately.
Step 2
Upload creation, completion, abort, and status endpoints accept the raw API key in the X-Api-Key header. Do not prefix it with Bearer.
Step 3
Use presign-put for direct object uploads, or multipart presigning for larger files and resumable transfer.
Key management is protected by bearer authentication, while upload execution accepts either bearer auth or the raw API key. The upload-specific header is X-Api-Key and should contain the full key string with no prefix.
curl -X POST "$BASE_URL/api-keys/generate" \
-H "Authorization: Bearer $JWT" \
-H "Content-Type: application/json" \
-d '{ "name": "CI uploads" }'curl -X GET "$BASE_URL/api/upload/$UPLOAD_ID/status" \
-H "X-Api-Key: $API_KEY"These are the routes that matter for end-to-end upload automation. The table focuses on the auth mode, payload type, and the job each endpoint performs.
/api-keys/generateCreates a new key for the current tenant. Request body supports an optional name field. The full key is returned only in this response.
/api/upload/presign-putReturns a session token, file id, and direct upload URL. After uploading the object, finish the flow with /api/upload/complete.
/api/upload/multipartReturns presigned URLs for each part together with the session token. Use it when large files or unstable networks make chunked transfer safer.
/api/upload/completeFinalizes either the single-put or multipart flow and creates the actual upload record that starts processing against target accounts.
/api/upload/abortCancels an unfinished upload session and removes the staged object when possible.
/api/upload/{uploadId}/statusReturns aggregate status plus per-account delivery details, including external ids and failure information when available.
/uploadsDashboard-focused endpoint for paginated upload history. It is not exposed through API key auth.
The upload record is accepted and waiting for its scheduled dispatch window.
The upload is actively being dispatched or retried. Internal Retrying and Dispatching states are both presented as Processing.
The target platform confirmed publication for the account entry.
The upload could not be completed for at least one destination. Check per-account errorCode and errorMessage values.
Use these examples as starting points. Replace the placeholders with your actual base URL, bearer token, API key, account ids, and file paths.
curl -X POST "$BASE_URL/api/upload/presign-put" \
-H "X-Api-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Spring launch teaser",
"accounts": ["account_123"],
"fileName": "video.mp4",
"fileSize": 734003200,
"contentType": "video/mp4"
}'
curl -X PUT "$UPLOAD_URL" -H "Content-Type: video/mp4" --data-binary @./video.mp4
curl -X POST "$BASE_URL/api/upload/complete" \
-H "X-Api-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{ "sessionToken": "$SESSION_TOKEN", "parts": [] }'The first Upload24 blog article explains why the API is split into key management, upload session creation, and per-account delivery tracking.