# Plans and limits

> Plan prices and included renders, the render table, auto top-ups, the monthly top-up limit and render packs, payments, and every rate, size and timeout limit per plan.



Usage is measured in renders: one render is one generated document or image of up to 50 pages. Each plan includes a monthly number of renders and a set of technical limits. The [pricing page](/pricing/) shows what each plan includes and what one render costs on each.

## Plans [#plans]

Prices are in euros (€) and exclude VAT, which Stripe adds at checkout based on your location. Annual billing costs 20 % less and is shown here as the effective monthly price.

| Plan       | Monthly     | Annual (per month) | Renders per month | Auto top-up (1,000 renders) | Templates | Members   | File retention (maximum) |
| ---------- | ----------- | ------------------ | ----------------- | --------------------------- | --------- | --------- | ------------------------ |
| Free       | €0          | €0                 | 50                | not available               | 2         | 1         | 7 days                   |
| Starter    | €19         | €15                | 3,000             | €6.00                       | unlimited | 3         | 90 days                  |
| Growth     | €59         | €47                | 15,000            | €4.00                       | unlimited | 10        | 1 year                   |
| Pro        | €149        | €119               | 50,000            | €3.00                       | unlimited | 25        | forever                  |
| Scale      | €399        | €319               | 200,000           | €2.00                       | unlimited | unlimited | forever                  |
| Enterprise | from €1,500 | custom             | 1,000,000 and up  | from €1.20                  | unlimited | unlimited | forever                  |

PDFs and images are available on every plan. Every paid plan includes the whole generation feature set: templates and versioning, webhooks, test mode, zero-retention delivery, [signed links](/docs/signed-links), batches and your own storage buckets. From Growth, plans also include compliance output: [PDF/A](/docs/pdf-options#pdfa), [PDF/UA](/docs/pdf-options#pdfua) and [e-invoices](/docs/e-invoicing). Higher plans add organisational capacity: more members, longer log retention and higher technical limits.

The Free plan stops when its 50 renders are used; it has no auto top-ups.

## What counts as a render [#what-counts-as-a-render]

| Operation                                                                                                                      | Billed renders                            |
| ------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------- |
| PDF render (template, HTML, URL, Markdown or canvas), up to 50 pages                                                           | 1                                         |
| Each additional 50 pages of the same PDF                                                                                       | +1                                        |
| Image render (PNG, JPEG or WebP)                                                                                               | 1                                         |
| [PDF tool](/docs/pdf-tools) call (`POST /v1/pdf-tools/…`): merge, split, rotate, protect, unlock, metadata or PDF/A conversion | 1                                         |
| [E-invoice](/docs/e-invoicing) layer on top of a PDF render (Factur-X, ZUGFeRD, XRechnung)                                     | included (+0)                             |
| E-invoice XML export (`POST /v1/einvoices`)                                                                                    | 1                                         |
| Batch ZIP download                                                                                                             | 0 (the renders inside are already billed) |
| Batch merged PDF ([batches](/docs/batches))                                                                                    | 1                                         |
| [Signed-link](/docs/signed-links) render: cache miss / cache hit                                                               | 1 / 0                                     |
| Test renders, editor previews, failed and canceled renders                                                                     | 0                                         |

Examples: a 12-page invoice is 1 render, and so is the same invoice as a Factur-X e-invoice; a 120-page report is 3 renders (50 + 50 + 20 pages); a social image in two sizes is 2 renders. PDF/A output on a render costs nothing extra.

Nothing is billed for renders that fail, renders canceled before rendering started, or renders rejected with `page_limit_exceeded`. The number billed is recorded per render in the render object's `billed_renders` field and in the `X-Billed-Renders` header of binary responses.

Included renders reset at the start of each billing cycle and don't roll over. Rollover of unused renders on annual plans is planned.

## Auto top-up and monthly top-up limit [#auto-top-up-and-monthly-top-up-limit]

Paid plans are never billed for overage. Instead they use **auto top-up**: when fewer than 200 renders (the default; high-volume workspaces can ask support for a higher number) are left in your workspace (included renders plus any prepaid renders), we add 1,000 renders for your plan's top-up price excl. VAT so your renders keep working: €6 on Starter, €4 on Growth, €3 on Pro and €2 on Scale. Stripe (via Link) charges your card within about 24 hours. Unused renders roll over and expire after 12 months. The renders are available at once, and you get an email for every top-up. The API calls auto top-ups `render_blocks`.

* Renders are drawn from the included allowance first, then from prepaid renders with the earliest expiry.
* A new top-up is only added after the previous one has been paid. If a payment fails, no further top-ups are added until it succeeds.
* Top-ups already bought keep their renders and price when you change plans.

The **monthly top-up limit** is the most your workspace can spend per cycle on the plan plus auto top-ups. It defaults to twice your plan's monthly price and you can change it; `0` turns auto top-ups off. On Growth, for example, the default limit of €118 leaves €59 for top-ups: it allows up to 14 top-ups, or 14,000 extra renders, per cycle. The API calls it the spend cap (`spend_cap_cents`).

When no top-up can be added (the monthly top-up limit is reached, auto top-ups are off, or a top-up payment is outstanding) and the renders run out, live renders fail with `402 render_limit_reached`; test keys continue to work.

You are notified by email, and by the `usage.threshold_reached` webhook event, at 50 %, 80 % and 100 % of the included renders and when the monthly top-up limit stops further top-ups.

### Render packs (Free plan) [#render-packs-free-plan]

Render packs are prepaid renders for the Free plan: 10,000 renders for €50, 50,000 for €200 and 250,000 for €750 (excluding VAT), each valid for 12 months. Packs bought on Free stay usable after you upgrade. Paid plans top up automatically instead and cannot buy packs.

## Payments, receipts and tax [#payments-receipts-and-tax]

Payments are processed by Stripe. Link (by Stripe) is the seller of record: your receipts and invoices come from Link, and card statements show `LINK.COM*`. All prices exclude VAT; Stripe calculates the applicable VAT or sales tax from your location, adds it at checkout and collects it. You are charged in euros. Enter your VAT or other tax ID at Stripe Checkout; it then appears on your invoices.

## Check your usage [#check-your-usage]

`GET /v1/account` returns the plan, the current cycle, renders and the limits that apply to your workspace:

```json
{
  "workspace": { "id": "ws_01J9ZK0P2R4T6V8X0Z2B4D6F8H", "name": "Example GmbH" },
  "plan": { "code": "growth", "interval": "month" },
  "cycle": { "start": "2026-09-01T00:00:00Z", "end": "2026-10-01T00:00:00Z" },
  "renders": {
    "included": 15000,
    "used": 4211,
    "remaining_included": 10789,
    "prepaid_remaining": 0,
    "spend_cap_cents": 11800
  },
  "limits": {
    "rate_limit_rps": 20,
    "sync_concurrency": 20,
    "sync_timeout_s": 60,
    "max_payload_mb": 10,
    "max_pages": 500,
    "bulk_concurrency": 10
  },
  "regions": ["eu"]
}
```

`prepaid_remaining` counts the renders left in render packs and auto top-ups. `spend_cap_cents` is the monthly top-up limit in euro cents, excluding VAT; `0` means auto top-ups are off.

`GET /v1/usage?from=2026-09-01&to=2026-09-30&granularity=day&group_by=template_id` returns a time series of billed renders and render counts, which is handy for internal cost dashboards. Both endpoints need the `account:read` scope.

## Limits by plan [#limits-by-plan]

| Limit                                     | Free   | Starter | Growth  | Pro      | Scale     | Enterprise |
| ----------------------------------------- | ------ | ------- | ------- | -------- | --------- | ---------- |
| Rate limit (sustained / burst per second) | 2 / 5  | 10 / 20 | 20 / 40 | 50 / 100 | 150 / 300 | custom     |
| Concurrent sync renders                   | 2      | 10      | 20      | 50       | 150       | custom     |
| Sync timeout                              | 30 s   | 60 s    | 60 s    | 90 s     | 120 s     | 300 s      |
| Async maximum duration                    | 60 s   | 5 min   | 10 min  | 15 min   | 30 min    | custom     |
| Request body                              | 2 MB   | 10 MB   | 10 MB   | 20 MB    | 50 MB     | custom     |
| Pages per PDF                             | 20     | 200     | 500     | 1,000    | 2,000     | custom     |
| Remote assets per render                  | 50     | 200     | 200     | 500      | 1,000     | custom     |
| Bulk concurrency                          | —      | 2       | 10      | 20       | 50        | custom     |
| Batch items                               | —      | 500     | 2,000   | 10,000   | 50,000    | custom     |
| File retention (maximum)                  | 7 days | 90 days | 1 year  | forever  | forever   | forever    |
| Request log retention                     | —      | 7 days  | 7 days  | 30 days  | 90 days   | custom     |
| Test renders per minute                   | 10     | 60      | 60      | 120      | 300       | custom     |
| Team members                              | 1      | 3       | 10      | 25       | unlimited | unlimited  |
| PDF/A, PDF/UA and e-invoicing             | —      | —       | ✓       | ✓        | ✓         | ✓          |

The template engine's execution budget also scales with the plan, from 50,000 units on Free to 20 million on Scale. See [sandbox and limits](/docs/template-language#sandbox-and-limits).

One person can own up to two workspaces on the Free plan. Paid workspaces don't count, but a free workspace you deleted in the last 30 days still does, and so does one you take over from someone else. To add another, upgrade one of your workspaces to a paid plan.

## Limits on every plan [#limits-on-every-plan]

| Limit                               | Value                                               |
| ----------------------------------- | --------------------------------------------------- |
| `metadata`                          | 50 keys per render, values up to 500 characters     |
| `Idempotency-Key`                   | 255 characters; responses are replayed for 24 hours |
| `binary` delivery                   | 20 MB                                               |
| `base64` delivery                   | 10 MB                                               |
| Signed URL lifetime                 | 60 seconds to 7 days, 1 hour by default             |
| `data_url` document                 | 50 MB                                               |
| Rendered HTML per template          | 50 MB                                               |
| Template recursion depth            | 50                                                  |
| Fixed wait delay (`wait.delay_ms`)  | 10 seconds                                          |
| Custom headers per webhook endpoint | 10                                                  |
| Webhook response time               | 10 seconds                                          |
| Webhook delivery log                | 30 days                                             |
| Uploaded files                      | 50 MB each, kept for 24 hours                       |

## What happens when you hit a limit [#what-happens-when-you-hit-a-limit]

| Limit                                                                                                                             | Response                                                                                       | What to do                                                                                                                   |
| --------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| Free renders used up, or no auto top-up can be added (monthly top-up limit reached, auto top-ups off, top-up payment outstanding) | `402 render_limit_reached`                                                                     | Free: upgrade, buy a render pack or wait for the next cycle. Paid: raise the monthly top-up limit or settle the open payment |
| Requests per second                                                                                                               | `429 rate_limited` with `Retry-After`                                                          | Back off and spread requests out                                                                                             |
| Concurrent sync renders                                                                                                           | `429 concurrency_limited` with `Retry-After`                                                   | Lower parallelism or switch to `mode: "async"`                                                                               |
| Sync timeout                                                                                                                      | `202` with the render still running, or `408 render_timeout` with `timeout_behavior: "cancel"` | Poll the render or wait for the webhook                                                                                      |
| Async maximum duration                                                                                                            | The render ends as `failed` with `render_timeout`                                              | Simplify the document or split it                                                                                            |
| Request body                                                                                                                      | `413 payload_too_large`                                                                        | Send less data, or use `data_url`                                                                                            |
| Output size for the delivery type                                                                                                 | `413 output_too_large`                                                                         | Use `url` delivery                                                                                                           |
| Pages per PDF                                                                                                                     | `422 page_limit_exceeded`, nothing billed                                                      | Check the data volume, split the document, or upgrade                                                                        |
| Remote assets per render                                                                                                          | Further asset requests are blocked and reported as warnings                                    | Reduce the number of remote assets or inline them                                                                            |
| Template execution budget                                                                                                         | `422 template_fuel_exhausted`                                                                  | Simplify loops or precompute values                                                                                          |
| Test renders per minute                                                                                                           | `429 rate_limited`                                                                             | Slow down test loops in CI                                                                                                   |

See [Errors](/docs/errors) for the full list of codes and fixes.
