Sada Files

Developer docs

  1. Developers

Rate limits and errors

Limits are measured in weighted units, and every failure returns a stable code you can branch on.

Default limits

LimitDefaultApplies to
Hourly budget300 unitsEach key, and each IP
Burst60 units a minuteEach key, and each IP
Data API calls1,000 a day, resets at 00:00 UTCEach account
Uploads at once2Each key
File size2 GB, or less where a tool says soEach file
Files in a batch500Each request

The headers are the live answer

These are defaults, and limits can change. Trust X-RateLimit-Limit over this table. A data API call counts toward the daily quota even if the provider then blocks it.

Request weights

Each request spends units according to its cost. Each tool page shows its own weight.

RouteUnits
POST /v1/tools/:slug2 (20 on AI-worker tools)
POST /v1/tools/:slug/jobs2 (20 on AI-worker tools)
POST /v1/seo-tools/:slug2
GET /v1/apis/:slug2
POST /v1/pipeline3
POST /v1/batches5
POST /v1/jobs/:id/continue2
GET /v1/tools, GET /v1/formatsNot counted

Response headers

HeaderMeaning
X-RateLimit-LimitUnits in the hourly budget
X-RateLimit-RemainingUnits left this hour
X-RateLimit-ResetUnix time the hourly window resets
X-RateLimit-WeightUnits this request spent
Retry-AfterSeconds to wait, sent on a fair-use 429

The daily data API limit reports its wait in details.retryAfterSeconds instead of a header.

Error format

Errors are JSON with a code and a readable message. Branch on the code, because messages can change. step names the failing pipeline step and details carries extras.

429 Too Many Requests
{
  "code": "RATE_LIMITED",
  "message": "Daily API quota reached for this account.",
  "details": {
    "limit": 1000,
    "retryAfterSeconds": 3600
  }
}

Planned data APIs are the one exception. They answer 501 with {"error":"not_implemented","status":"planned"}.

Error codes

CodeHTTPMeaning
INVALID_INPUT400A parameter is missing or malformed.
OPTION_INVALID400An option failed the tool's schema, or is unknown.
PIPELINE_INCOMPATIBLE400A step cannot take the previous step's output.
TOO_MANY_FILES400More files than the tool accepts.
UNAUTHENTICATED401The key is missing, invalid, expired or revoked.
FORBIDDEN403The key lacks the scope, or the account is suspended.
NOT_FOUND404No such route, data API or owned resource.
TOOL_UNKNOWN404No tool has this slug.
JOB_NOT_FOUND404The job does not exist.
CANCELLED409The job was cancelled.
CONFLICT409The request conflicts with existing state.
JOB_EXPIRED410The job passed its 24-hour limit.
JOB_DELETED410The job was deleted.
FILE_TOO_LARGE413A file is over the limit for this tool.
UNSUPPORTED_FORMAT415The tool does not accept this file type.
ENCRYPTED_INPUT422The input is password-protected.
CORRUPT_INPUT422The input could not be read.
PDF_BOMB422The PDF looks like a decompression bomb.
ZIP_BOMB422The archive looks like a decompression bomb.
OUT_OF_MEMORY422The job ran out of memory.
ENGINE_ERROR422The engine failed. details.code has the reason.
RATE_LIMITED429A rate limit, the daily quota or the upload slots ran out.
INTERNAL500Something failed on our side.
OUTPUT_INVALID500The tool produced an output that failed checks.
SERVICE_UNAVAILABLE503An upstream provider blocked or refused the request.
TOOL_DISABLED503The tool is switched off for now.
TIMEOUT504The engine or provider took too long.

What's next?