Skip to main content

Limits

All limits are enforced per account. Exceeding a limit returns a 429 Too Many Requests response with a Retry-After header.

Transfer Limits

PlanTransfers / Month
Free50
Pro1,000
EnterpriseUnlimited
  • Each POST /v1/transfers call counts as one transfer, regardless of file count
  • Downloads do not count against transfer limits
  • Limits reset on your billing cycle date (day of the month you signed up)

File Size Limits

PlanMax File SizeTotal Storage
Free100 MB1 GB
Pro1 GB50 GB
Enterprise5 GB500 GB
  • Max file size is per individual file, not per transfer
  • Total storage is the sum of all active (non-expired, non-deleted) transfers
  • When storage is full, new uploads return 413. Delete or let transfers expire to free space.

Download Limits

SettingDefaultRange
max_downloads per transfer101–1,000
  • Each GET /v1/transfers/:id/download call decrements the counter
  • When the counter hits 0, the transfer status changes to downloaded and further download attempts return 410 Gone
  • Set max_downloads in your POST /v1/transfers request to control this

Transfer Expiry

PlanMax Expiry
Free24 hours
Pro30 days
Enterprise365 days
  • Set expires_in when creating a transfer: 1h, 12h, 24h, 7d, 30d, 365d
  • Expired transfers return 410 Gone on download attempts
  • A background worker cleans up expired file data periodically

API Key Limits

PlanMax API Keys
Free1
Pro10
EnterpriseUnlimited

Rate Limits

EndpointLimit
POST /v1/transfers60 requests / minute
GET /v1/transfers120 requests / minute
GET /v1/transfers/:id120 requests / minute
GET /v1/transfers/:id/download30 requests / minute
DELETE /v1/transfers/:id30 requests / minute
POST /v1/accounts/:id/api-keys10 requests / minute
DELETE /v1/accounts/:id/api-keys/:keyId10 requests / minute
Rate limits are per API key, not per account. If you need higher limits, contact support.

Rate Limit Headers

Every response includes rate limit information:
HeaderDescription
X-RateLimit-LimitMaximum requests allowed in the window
X-RateLimit-RemainingRequests remaining in the current window
X-RateLimit-ResetUnix timestamp when the window resets
Retry-AfterSeconds to wait before retrying (only on 429 responses)

Handling Rate Limits

When you receive a 429 response, wait for the duration specified in the Retry-After header before retrying.
import time
import requests

response = requests.post(url, headers=headers, data=data, files=files)

if response.status_code == 429:
    retry_after = int(response.headers.get("Retry-After", 60))
    time.sleep(retry_after)
    response = requests.post(url, headers=headers, data=data, files=files)
const response = await fetch(url, { method: "POST", headers, body: form });

if (response.status === 429) {
  const retryAfter = parseInt(response.headers.get("Retry-After") || "60");
  await new Promise((r) => setTimeout(r, retryAfter * 1000));
  // Retry the request
}