Skip to main content

How uploads work

Files are uploaded with a presigned URL: request a time-limited URL from the API, then upload the file straight to Azure Blob Storage. This keeps upload bandwidth off your API server, handles files up to the per-category maximums, and works well for parallel uploads.

Presigned URL uploads

Basic flow

1

Request presigned URL

Call /api/uploads/url to get a time-limited upload URL.
2

Upload directly to Azure

Use the returned URL to upload your file to Azure Blob Storage with a single PUT.
3

Create submission

Submit the returned blobPath in your submission request.
The request body uses filename and contentType. The response returns uploadUrl, blobPath, and expiresAt. The presigned URL expires after 1 hour.
This same upload flow is used for supporting context files, not just primary assets. Upload the file here, then reference its blobPath in a submission’s contextItems instead of assets. Document types (PDF, DOCX, TXT) are accepted in addition to media. See Tags and supporting context.

Implementation example

Parallel uploads

For batch operations, request a presigned URL per file and upload them in parallel:

Supported file types and sizes

The API accepts these MIME types: A 415 is returned when the contentType is not in this allowlist or does not match the file.

Handling large files

Large files use the same presigned URL flow. A single PUT works for the SAS URL. For very large files you can use the Azure Blob Storage SDK against the same SAS URL, which handles the transfer for you:
The presigned URL is valid for 1 hour. If the upload does not finish in that window, request a new URL and retry. There is no application-level resumable, multipart, or verify step — the upload completes when the PUT to Azure succeeds, and the blobPath is ready to submit.

Error handling

Network retries

Implement exponential backoff for transient failures:

Validate before uploading

Check the file exists, is readable, and is within the category limit before you upload:

Troubleshooting

Upload URL expired

Presigned URLs expire after 1 hour. If the upload takes longer, request a new URL and retry.

Content type mismatch

Ensure the contentType matches the actual file format and is one of the allowed MIME types above. A mismatched or unsupported type returns 415.

403 invalid filename

The filename failed validation. Use a plain filename without path traversal or unusual characters.

413 payload too large

The uploaded blob exceeds the per-category size limit for its type. Check the file against the maximum sizes above before submitting.