Limits and quotas
Rate limits, file sizes, time limits, the free daily quota, quotas per visitor for service keys and how long files are kept.
Rate limits#
| Limit | Reads (GET, HEAD) per minute | Writes per minute |
|---|---|---|
| Per API key | 120 | 120 |
| Per IP address | 300 | 300 |
Per visitor IP address, with X-End-User | 900 | 300 |
Reads and writes share the limits of an API key and of an IP address. Only requests for a visitor with X-End-User count reads and writes apart, so status checks do not use up the budget for new conversions.
Every /v1 response shows the limit of your API key:
RateLimit-Limit: 120
RateLimit-Remaining: 117
RateLimit-Reset: 42
RateLimit-Policy: 120;w=60/v2 responses use X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset, like the CloudConvert API. RateLimit-Reset is the number of seconds until the window starts over. Above the limit you get 429 with the code RATE_LIMIT_EXCEEDED and a Retry-After header in seconds.
To check the status of many conversions, ask for up to 50 in one request with GET /v1/conversions?ids=…, or use webhooks.
File and request sizes#
| What | Limit |
|---|---|
File in a multipart/form-data request | 100 MB |
| Files through uploads and from URLs | max_file_size in GET /v1/account |
File inline with import/base64 | 10 MB after decoding |
JSON body of POST /v2/jobs | 16 MB |
| Any other JSON body | 1 MB |
File returned in the response with Accept: application/octet-stream | 50 MB, larger files come as 303 to the download URL |
Conversions in a batch or archive, IDs in GET /v1/conversions | 50 |
| Presets per account | 100 |
| Active API keys per account | 25 |
Time limits#
| What | Limit |
|---|---|
| One conversion | 5 minutes. convert tasks can set a lower timeout in seconds |
?wait=N in the simple API | 30 seconds |
/sync requests and the /wait endpoints | 5 minutes |
| Downloading a file from a URL | 2 minutes |
Free daily quota#
Every account converts 50 files and uses 20 minutes of conversion time per day for free. The quota resets at midnight UTC. After that, conversions use credits. GET /v1/account shows what is left today and your credit balance. Prices are on the pricing page.
Failed conversions do not count. Requests with a sandbox key use neither the quota nor credits.
Visitors of your website#
If you run a website or app on top of switchfile, a service key lets each of your visitors use a free quota of their own. Send two headers with every /v1 request:
X-End-User: <an ID for the visitor, 1 to 128 characters: letters, digits and . _ : @ ->
X-End-User-Ip: <the visitor's IP address>Then the free quota counts per visitor and per IP address instead of for your account: 50 files and 20 minutes of video conversion time per day. IPv6 addresses count per /64 network. Each visitor only sees and uses their own conversions and uploads. X-End-User with a key that is not a service key returns 403 END_USER_NOT_ALLOWED. Service keys are set up by us; write to us if you need one.
While a conversion to a video format is queued or running, it counts against the video quota with an estimate based on the file size, about one second per MB and at least 10 seconds. When it is done, the estimate is replaced by the time that was actually needed. Deleting a conversion before it is done does not give the quota back. Above the quota you get:
{
"type": "https://switchfile.io/docs/api/v1#errors-quota-exceeded",
"title": "Quota exceeded",
"status": 429,
"code": "QUOTA_EXCEEDED",
"detail": "The free limit of 50 files per day is used up.",
"limit": "files_per_day",
"scope": "end_user",
"reset_at": "2026-11-07T00:00:00+00:00"
}limit is files_per_day or video_minutes_per_day, scope is end_user or ip. GET /v1/account with both headers adds end_user_quota with what the visitor has left.
Rate limits count per visitor too: 300 requests per minute with POST, PATCH and DELETE, and 900 with GET, both per visitor and per visitor IP address.
Retention#
Input and result files are deleted 24 hours after a conversion or job ends. expires_at tells you when. Download URLs work until then. Delete earlier with DELETE /v1/conversions/{id} or DELETE /v2/jobs/{id}.