Skip to content

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.

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 maxActiveRenders slot at once, but counts toward rendersPerMinute for 60 seconds, even if it failed or was cancelled.
  • A batch with more items than either allowance answers 400 LIMIT_EXCEEDED instead of 429.

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 (documentsThisMonth and storageBytes). An unlimited allowance reads null.
  • Templates from a PDF have a monthly allowance too, templateConversionsPerMonth, with templateConversionsThisMonth beside 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 with 402 QUOTA_EXCEEDED until 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 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 answer 402 QUOTA_EXCEEDED until 00:00 UTC. It is unlimited (null) unless a platform administrator sets it; GET /v1/render-limits shows it and testRendersToday.
  • 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.

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.

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.

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.

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_TIMEOUT with 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} answers 404 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.

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
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

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
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
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
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