Limits
Over a size or count limit, a request answers LIMIT_EXCEEDED (400, or 413 for a request
body) unless a row says otherwise. Every 429 is retryable. Error codes and retries are in the
HTTP API.
If you run your own installation, you can change the render allowances, the request rate per address, the page, size, input, time and memory limits of a render, and how long renders are kept; see self-hosting limits.
Render allowances
Section titled “Render allowances”Each workspace has two allowances, shared by every person and API key in it. Over either one, a
request answers 429 RATE_LIMITED with a Retry-After header, and nothing is created.
| Allowance | Default | Retry-After |
|---|---|---|
maxActiveRenders: renders queued or processing at once |
10 | 1 second |
rendersPerMinute: renders created in any rolling 60 seconds |
60 | The time until a slot frees up |
See your workspace’s values in Studio under Manage → Render limits (Maximum outstanding
renders and Renders per minute), or with GET /v1/render-limits (scope render:read).
Only a platform administrator can change them.
On the hosted service, each plan sets both:
| Plan | maxActiveRenders |
rendersPerMinute |
|---|---|---|
| Free | 10 | 60 |
| Starter | 30 | 120 |
| Pro | 50 | 300 |
| Business | 100 | 1,000 |
| Request | Counts |
|---|---|
POST /v1/renders: direct documents, published versions and previews |
One each |
POST /v1/renders/batch |
One per item; the whole batch is admitted or none |
| Reports API PDF output, and template previews as PDF | One each |
| Reports API XLSX output, and template previews as XLSX | Nothing, but refused while the workspace is full |
POST /v1/renders/string, and template previews as HTML |
Nothing |
Test renders ("test": true) |
Nothing; they have their own allowance, below |
| Polling, downloads, cancelling and template edits | Nothing |
A repeat with the same Idempotency-Key, and invalid or refused requests |
Nothing |
- A render counts once, whatever its page count.
- A finished render frees its
maxActiveRendersslot at once, but counts towardrendersPerMinutefor 60 seconds, even if it failed or was cancelled. - A batch with more items than either allowance answers
400 LIMIT_EXCEEDEDinstead of429.
Monthly documents and storage
Section titled “Monthly documents and storage”A workspace can also have a monthly document allowance and a storage allowance. On your own installation both are unlimited unless a platform administrator sets them.
| Allowance | Counts |
|---|---|
documentsPerMonth: real documents per calendar month (UTC) |
Each render that is not a test render, and each XLSX output, once it succeeds |
maxStorageBytes: uploaded fonts, images, workbooks and PDFs |
Every file not deleted, and once each, deleted files published versions use |
- Renders still queued or processing count too, so the allowance can’t be overrun. A render that fails or is cancelled doesn’t count.
- Over either allowance, the request answers
402 QUOTA_EXCEEDED, which is not retryable, and nothing is created. The document allowance starts again on the 1st of each month (UTC). Publishing again doesn’t use more storage. Deleting a file frees its space once no published version uses it, and deleting a template frees the files only its published versions use. - On a paid hosted plan, an owner or administrator can turn on overage under Manage → Render
limits. Documents past the plan’s are then rendered and billed per 1,000 with the plan’s next
invoice, until the month’s overage reaches the spend cap set there; past the cap, requests
answer
402 QUOTA_EXCEEDED. Owners and administrators get an email at 80% and 100% of the plan’s documents, and when the cap is reached. - Test renders never count, so they keep working when the month’s documents are used up.
- While a workspace has a monthly document allowance, every PDF preview, in Studio and through the API, is a test render with the watermark. Test renders then have the workspace’s own render allowances instead of the test allowance below. XLSX previews have no watermark, so each counts as a document.
- See both allowances and how much of them is used in Studio under Manage → Render limits,
or with
GET /v1/render-limits(documentsThisMonthandstorageBytes). An unlimited allowance readsnull. - Templates from a PDF have a monthly allowance too,
templateConversionsPerMonth, withtemplateConversionsThisMonthbeside it. One counts from the moment it starts, unless it fails before the AI answers or because the server restarted. Over the allowance, new ones are refused with402 QUOTA_EXCEEDEDuntil the next month. On the Free plan they can also be refused earlier, when the service’s AI capacity for Free workspaces is used up for the month.
Test renders
Section titled “Test renders”Test renders are watermarked PDFs that count against none of the allowances above. Each workspace has a separate allowance for them, counted and answered the same way:
| Allowance | Value |
|---|---|
| Test renders queued or processing at once | 10, or your own maxActiveRenders if lower |
| Test renders created in any rolling 60 seconds | 10, or your own rendersPerMinute if lower |
- A workspace can also have a daily allowance of test renders,
testRendersPerDay, counted per day (UTC) and including previews. Over it, test renders answer402 QUOTA_EXCEEDEDuntil 00:00 UTC. It is unlimited (null) unless a platform administrator sets it;GET /v1/render-limitsshows it andtestRendersToday. - A batch’s test items count against this allowance and its other items against the workspace’s.
A batch with more test items than this allowance answers
400 LIMIT_EXCEEDED. - Test renders still appear in usage, like any other render.
Suspended workspaces
Section titled “Suspended workspaces”A platform administrator can suspend a workspace. While it is suspended, every render answers
403 FORBIDDEN, and so does every request with one of its API keys. Its members can still sign
in to Studio, read its templates and files, and export them. GET /v1/render-limits reads
"suspended": true.
Request rates
Section titled “Request rates”| Limit | Value | Over it |
|---|---|---|
Requests to /v1/ per client IP address (IPv6: per /64) |
1,200 per clock minute | 429, Retry-After until the next minute |
| Requests to the MCP server per client IP address | 1,200 per clock minute | 429, Retry-After until the next minute |
| Reports API renders and template previews waiting their turn | 100 per workspace, each for up to 30 seconds | 429, no Retry-After |
| Report archive imports, workspace imports and exports | 1 at a time per workspace | 429, no Retry-After |
| Studio sign-in attempts per client address | 10 a minute | 429 |
Reports API requests can be sent in parallel, up to the workspace’s maxActiveRenders. Each
waits its turn while the workspace’s earlier requests are prepared, which takes milliseconds for
a typical template.
Template renders, previews and Handlebars string renders can also answer 429 RATE_LIMITED
without a Retry-After when the server is busy. Wait a few seconds and retry.
Request bodies
Section titled “Request bodies”A body over its endpoint’s limit is refused with 413 LIMIT_EXCEEDED before it is read.
| Endpoint | Largest body |
|---|---|
POST /v1/renders |
11 MiB |
POST /v1/renders/batch |
32 MiB |
POST /v1/renders/string |
1,000,000 bytes |
POST /v1/reports/render |
10 MiB |
POST /v1/templates/{id}/preview |
30 MiB |
POST /v1/reports/import, POST /v1/reports/import/inspect |
30 MiB |
POST /v1/workspace-folders/import |
60 MiB |
| Every other endpoint | 1 MiB |
Text in a JSON body may not contain NUL characters or unpaired surrogates; such a body answers
400 BAD_REQUEST.
Renders
Section titled “Renders”These apply to every PDF, from the Renders API and the Reports API alike. A render over one fails
with LIMIT_EXCEEDED unless the row says otherwise, and the render’s error names the diagnostic
code.
| Limit | Value | Diagnostic code |
|---|---|---|
| Pages per PDF | 200 | max_pages |
| PDF size | 50 MiB | max_output_bytes |
| Image width and height | 4096 × 8192 pixels | image_too_large for the height |
| Input: document, CSS, fonts, images and attachments together | 10 MiB | max_input_bytes |
| Memory to lay out the pages of one render | 512 MiB | render_memory_limit |
| Other working memory of one render | 256 MiB | render_process_exited, failing as RENDER_FAILED |
| Render time | 60 seconds | |
| Reports API wait for a PDF | 95 seconds | See below |
| Finished renders, their PDFs and webhook deliveries kept | 30 days after creation |
- After 95 seconds the Reports API answers
504 RENDER_TIMEOUTwith the render’s ID, and the render keeps going. Set your HTTP client’s timeout above 95 seconds. - After 30 days,
GET /v1/renders/{id}answers404 NOT_FOUND. Keep your own copy of PDFs you need.
Field limits of a render request, such as html length or page size, are in the
API reference.
Batches
Section titled “Batches”| Limit | Value | Over it |
|---|---|---|
| Items per batch | 1 to 100 | 400 BAD_REQUEST |
| Request body | 32 MiB | 413 LIMIT_EXCEEDED |
| Input for all items together | 64 MiB | 400 LIMIT_EXCEEDED |
| Each item | The same limits as a single render | Checks on the request refuse the whole batch; render limits fail only that item |
All item PDFs as one file (GET /v1/renders/batch/{id}/pdf) |
50 MiB together | 400 LIMIT_EXCEEDED |
Templates and workspace files
Section titled “Templates and workspace files”| Limit | Value |
|---|---|
| Template name | 1 to 120 characters |
| Template description | 2,000 characters |
| Templates deleted in one request | 100 |
template.html |
2,000,000 characters |
| Page header, Page footer | 100,000 characters each |
helpers.js |
500,000 characters; with the translation labels it reads, 2 MB |
| Stylesheets per template | 20, each up to 1,000,000 characters |
| Partials per template | 200, each up to 1,000,000 characters; names up to 255 characters |
| Scripts per template | 10, each up to 100,000 characters |
| Sample data sets and translation files | 20 each per template; names up to 80 characters |
| Fonts, images and workbooks | 500 per template, 20 MiB together |
| Uploaded PDF file a template adds | 5 MB |
| Workspace files one template references | 100, nested at most 20 levels deep |
| Template source with every file it includes | 5 MB |
| Workspace file | 1,000,000 characters; name up to 120 characters |
| Workspace folder name | 80 characters |
Helpers and scripts
Section titled “Helpers and scripts”These apply to helpers.js, Handlebars and beforeRender scripts when a template renders or is
previewed. The scripts together, the body, the header and the footer each run as one step. A step
over a limit fails with LIMIT_EXCEEDED unless the row says otherwise; later renders are not
affected.
| Limit | Value |
|---|---|
| CPU time | 2 seconds per step |
| Memory | 64 MiB per step |
| Source plus data sent into a step | 8,000,000 bytes |
| HTML a step produces | 5,000,000 bytes |
| Data nesting | 100 levels (400 BAD_REQUEST) |
| Template complexity | 50,000 Handlebars syntax nodes, nested at most 100 deep |
Logged console calls |
The first 100 per run, each cut to 2,000 characters |
Components
Section titled “Components”| Limit | Value | Checked |
|---|---|---|
| Components in the composition, reusable ones included | 1,000 | On save |
| Nesting depth in the composition | 50 | On save |
| Reusable components | 100 | On save |
| Reusable component name | 1 to 200 characters | On save |
| Columns per table | 30 | On save |
| Path segments in a binding | 1 to 20 | On save |
| Components after repeats and tables are expanded | 10,000 | On render |
| Nesting depth after expansion | 100 | On render |
Items in one repeat or table source |
500 | On render |
| Expanded document | 1 MB | On render |
Imports and exports
Section titled “Imports and exports”| Limit | Value |
|---|---|
| Report archive | 20 MB decoded (400 BAD_REQUEST over it) |
| Entries in a report archive | 10,000 |
| Workspace or folder export to import | 42 MB zip |
| Project folder imported in Studio with Import… | 245 files, 10 MB in total, each text file up to 1 MB |
Import label |
200 characters |
Limits on other pages
Section titled “Limits on other pages”| Feature | Where |
|---|---|
| API key names and lifetime, upload size, link lifetime | HTTP API |
Direct document html, stylesheets and assets |
Render with the Renders API |
| String renders | String rendering |
| Spreadsheet and workbook templates | Spreadsheet templates |
| Steps that add or merge other templates | Combine templates |
| Passwords and signing certificates | PDF standards and security |
| Webhook endpoints and deliveries | Webhooks |
| Storage destinations: 10 per workspace | Storage destinations |
| Report archive contents | Import report archives |