Pricing

Priced per page, not per seat.

A billable unit is one PNG or JPG, or one page of a PDF. Cache hits are never billed, so the number you pay for is the number of distinct documents you produce.

No commitment

Free

$0 forever

Enough to ship a side project and keep it running.

  • 200 renders a month
  • 3 templates
  • No watermark on anything
  • Community support
Start with no key

Pay as you go

$0.006 per PNG · $0.015 per PDF page

Card on file, billed monthly in arrears. No commitment.

  • $0.006 per PNG or JPG
  • $0.015 per PDF page
  • $50 monthly spend cap by default, raise it when you want
  • Cache hits are never billed
How metering works

Plans

Starter

$19 per month

The first plan with webhooks. Most projects land here.

  • 5,000 renders a month
  • 25 templates
  • Webhooks on queued renders
  • 30-day file retention
  • $4 per 1,000 over the allowance
Estimate your bill

Scale

$249 per month

Dedicated capacity and an SLA.

  • 150,000 renders a month
  • Dedicated Chromium pool
  • Uptime SLA
  • Everything in Growth
  • $4 per 1,000 over the allowance
Talk to us

Annual billing is ten times the monthly price — two months free. Overage on every paid plan is $4 per 1,000 units. Prices in US dollars, excluding any tax we are required to collect.

Calculator

What would a month cost you?

Put in what you actually produce. The cache-hit slider matters more than people expect: retries, idempotent workers and re-sent webhooks all land on the same key.

Pages, not documents. A 3-page invoice is 3.

A repeat of an identical request. Free, and it does not count against any allowance.

Billable units: 4,800 a month

Growth at $79 a month is cheapest for this volume.

Plan Base Overage Month Per unit
Enter your volumes.

A plan's included quantity is counted in billable units, the same unit the calculator uses. Pay as you go prices each format separately: $0.006 a PNG and $0.015 a PDF page.

How metering works

Counted before the render, not at invoice time.

Free-tier limits and spend caps are enforced in our own database, in the request path, before any browser starts. Stripe's billing meters only reconcile when an invoice is drawn, which is too late to stop a runaway loop — so they are the billing record, not the gate.

Every successful render writes one meter event with the render id as its idempotency key, so a retried flush can never double-bill you.

Spend caps and quotas →

The meter, exactly

Meter
galley_render
Price
$0.006 per unit
One PNG or JPG
1 unit · $0.006
One PDF page
2.5 units · $0.015
Cache hit
0 units · $0.00
Failed render
0 units · $0.00

One meter carries both prices: the PNG/PDF difference is weighted on the event, so a PDF page reports 2.5 units at $0.006 each. You are billed $0.015 a page either way — this is just how it reaches Stripe.

Questions

What counts as one render?
One billable unit per PNG or JPG, and one per page of a PDF. A three-page invoice is three units. A cache hit is zero units — it renders nothing.
What happens when I go over a plan's allowance?
Overage is $4 per 1,000 units on Starter, Growth and Scale, billed monthly in arrears. Renders do not stop. On the free tier they do stop, with a 402 and a quota_exceeded error that tells you what to do.
Is there a spend cap?
Yes. Every metered account gets a $50 monthly cap by default, enforced in our own database before a render starts rather than at invoice time. Raise it, lower it, or set it to zero.
Do I need a credit card to try it?
No. The first 50 renders need no key, no signup and no card: connect an agent to the MCP endpoint, or press the button on the home page. After that the free tier is 200 renders a month, still with no card.
What does annual billing save?
Two months. An annual plan is ten times the monthly price.
Are failed renders billed?
No. A render that fails is not metered. Neither is validate_data, listing templates, or fetching a fresh signed URL for a render you already paid for.
How long are files kept?
30 days on Free, Pay as you go and Starter; 90 days on Growth and Scale. Signed URLs expire in an hour, but the stored object does not — ask for a fresh URL with GET /v1/renders/:id.