---
title: Plans and limits
description: What each plan includes, how renders are counted, and what happens when you hit the monthly limit.
sidebar:
  label: Plans and limits
  order: 6
---

Plans differ in one number: renders per month. Every account gets every feature — both endpoints, all four formats, templates, and the sandbox.

| Plan | Price | Renders / month |
| --- | --- | --- |
| Free | $0 | 100 |
| Builder | $9 / mo | 2,000 |
| Pro | $29 / mo | 10,000 |
| Max | $99 / mo | 50,000 |

Free needs no card. Upgrade, downgrade, and cancel from **Billing** in the [dashboard](https://snhtml.com/dashboard); a cancelled or expired subscription falls back to the free allowance rather than locking the account.

## How renders are counted

One render is one attempt at producing a file. The attempt is recorded *before* the browser starts, then marked succeeded when the bytes come back.

**Counts against your quota:**

- a successful `POST /v1/render` or `POST /v1/render/template`
- a render that fails after it started — a page that never settles, a timeout, a browser error
- a render started from the dashboard sandbox

**Doesn't count:**

- a request rejected for a missing or invalid API key
- a request rejected for an invalid body (a bad format, an unknown field)
- creating, editing, previewing, or deleting a template

Usage resets at the start of each calendar month (UTC). The **Billing** tab shows the current month's total alongside the succeeded/failed split.

## Hitting the limit

Once the month's renders are used up, render requests fail with `402` and:

```json
{ "error": "Monthly render limit reached. Upgrade your plan or wait for the next billing period." }
```

Nothing else is affected — keys keep working, templates stay editable, and the counter clears at the start of the next month. Upgrading raises the allowance right away.

If you generate files in a batch job, treat `402` as a stop signal rather than something to retry: retrying spends nothing but won't succeed until the plan changes or the month rolls over.

## Per-request limits

Separate from the monthly quota, one request is capped at:

| Limit | Value |
| --- | --- |
| HTML payload | 5 MB |
| `waitForTimeout` | 10,000 ms |
| `deviceScaleFactor` | 4 |
| `scale` (PDF) | 0.1 – 2 |
| API keys per account | 10 |
| Template name | 120 characters |

Large documents are usually large because of embedded images. Host those and reference them by absolute URL instead of inlining `data:` URIs, and a document that blew the 5 MB limit typically drops to a few kilobytes.
