Reference

Stay within rate limits

Use with your agent

Give this prompt to your AI agent. The agent does the task for you.

Read https://thirds.ai/docs/rate-limits and help me set request concurrency and safe retries for thirds.ai using its rate, size, and queue limits.

Send work at a steady rate and wait for active jobs to finish. Every plan has the same render limits. Plans change credits and queue order. They do not increase these safety limits.

Request and job limits

LimitMaximum
API-key submission rate5 per second, with an idle burst of 21
Live jobs per API key8
Live jobs per account16
Paid queued-job backlog500 across the service
Anonymous playground allowance200 renders per browser per month

A live job is queued or running. PDF and image work share account capacity. A burst allowance does not increase live-job capacity. The playground also has CAPTCHA, address rate controls, and a separate live-job cap. These safety controls are not a promise of throughput. There is no lifetime render quota.

Render size limits

LimitMaximum
Render request body8 MiB
HTML input5 MiB
Template source1 MiB
Template data1 MiB of canonical JSON
Template data depth32 levels
One data collection10,000 items
Total template data values50,000
One fetched asset10 MiB
All fetched assets20 MiB across at most 128 assets
PDF output100 pages and 25 MiB
Static-image output32,000,000 pixels and 25 MiB
Image width320 to 7680 pixels
Image height200 to 4320 pixels
Worker render time30 seconds
JavaScript ready-marker wait2 seconds

Memory, CPU, browser processes, temporary storage, and template evaluation also have fixed safety limits. A limit failure spends no render credits. Repeated failed renders can still trigger abuse limits. Split large documents, resize images, and remove unused assets before trying again. See PDF and image options.

Read the retry headers

A retryable request error includes Retry-After in seconds and the same value at error.retry.retry_after_seconds. Wait at least that long. Keep the same Idempotency-Key and input when you retry a render request. Add a small random delay when many workers retry together.

ResponseWhat to do
429 rate_limitedSlow down. The current retry delay is between 1 and 60 seconds.
429 account_concurrency_limited or key_concurrency_limitedWait for active jobs to finish. The response gives a 5-second retry delay.
429 abuse_limitedFix repeated failures. The response gives a 3600-second retry delay; the daily failure count can still block a later attempt.
503 overloadedWait for the 30-second retry delay before submitting again.
202 with a jobPoll the route in Location. Retry-After: 1 gives the initial polling delay.

The API does not provide a remaining-request counter or X-RateLimit-* headers. Use Retry-After, the response code, and your own count of active jobs. A retry header is guidance for the next attempt, not a guarantee that capacity becomes available at that time.

Give each client a deadline and a retry limit. If the deadline ends while a job is active, save its ID and read it later. Do not create a replacement job just because your request times out. See safe retries.

Understand queue order

The queue orders work by enqueue time plus the plan's priority offset. The offsets are 0 seconds for Scale, 30 seconds for Growth, 2 minutes for Starter, 5 minutes for packs, 10 minutes for Free, and 15 minutes for anonymous work.

These offsets only sort jobs. They don't set a fixed wait or promise a finish time. Older work gains priority so lower tiers can still run. Keep polling the same job while it is queued. Webhooks can notify your server when the job ends.

For a specific refusal or failed job, use the error guide. For credit grants and spend limits, use billing.

Ready to make your first file?

Start in the playground with a gallery template, or get an API key and send your first request from your own terminal.