General
What is Blink PDF?
What is Blink PDF?
Who is Blink PDF for?
Who is Blink PDF for?
- Developers and engineers building document generation into web apps, APIs, or backend pipelines
- Operations and product leaders who need reliable, fast PDF output without maintaining rendering infrastructure
- Markdown tool users — if you work in Obsidian, Notion, or any Markdown-first environment and want a polished PDF output, Blink PDF fits naturally
- AI agent builders — Blink PDF is a clean, side-effect-free tool that agents can call to produce shareable, archiveable documents from generated Markdown content
Why is Blink PDF so fast?
Why is Blink PDF so fast?
Do I need to know CSS or LaTeX?
Do I need to know CSS or LaTeX?
Integration & Compatibility
Can I use Blink PDF with automation tools like n8n, Make, or Zapier?
Can I use Blink PDF with automation tools like n8n, Make, or Zapier?
Which fonts can I use?
Which fonts can I use?
fontStack field — inter (body and headings), jetbrains-mono (code), and the emoji families noto-emoji-mono and twemoji-mozilla. On top of that, you can render body and headings in any Google Fonts family by passing a googleFontsUrl — available on every plan. Fonts are embedded in every PDF so it renders consistently on any device or viewer. Arbitrary custom font uploads are not supported today.For details on selecting fonts and binding roles, see Fonts & Typography.What file size can I render?
What file size can I render?
blink://asset/<id> handles are fetched at render time and do not count toward this limit.If your payload exceeds the limit for your plan, the API returns 413 Payload Too Large. Upgrading your plan increases the limit.Fill
Codes, HTTP status, and the full contract live on Named errors and Inspect. Each answer below is the fix; it is not a second copy of those pages.Can I fill an existing PDF form?
Can I fill an existing PDF form?
POST /v1/fill (same bp_ key as render). Start at Fill a form. Fill is not a mode on POST /v1/render.Fill returned 400 unknown_field_name. How do I fix it?
Fill returned 400 unknown_field_name. How do I fix it?
fields[].name — 400 unknown_field_name means that values key is not a fillable inspect name (suggestions are close matches; fill never silently drops an unknown key).Why was my form rejected with NeedAppearances?
Why was my form rejected with NeedAppearances?
/NeedAppearances is 422 need_appearances: rejected, not repaired — never set /NeedAppearances on the filled PDF. See Named errors.Inspect returned no fields. What do I do?
Inspect returned no fields. What do I do?
fields: [] and skipped: [] with reason: "no_widgets" means the PDF is not a form yet — make it a form in studio first; inspect is not a map editor.Why is an encrypted PDF rejected?
Why is an encrypted PDF rejected?
/Encrypt is 422 encrypted_pdf — Blink PDF does not decrypt. See Named errors.Why is an XFA form rejected?
Why is an XFA form rejected?
/XFA is 422 xfa_unsupported — Blink PDF does not flatten XFA. See Named errors.Why is a signed PDF rejected?
Why is a signed PDF rejected?
/Perms or a field signature /V is 422 signed_pdf — an empty /FT /Sig is skipped, not this error. See Named errors.Fill returned 400 appearance_unencodable. What now?
Fill returned 400 appearance_unencodable. What now?
400 appearance_unencodable) — fill does not draw tofu, does not return 200 with a blank box, and does not accept a custom TTF. See Named errors.Does fill return 402 the same way as render?
Does fill return 402 the same way as render?
POST /v1/fill returns the same 402 spend_cap_reached as render (the 402 names units; raise the cap or upgrade). See Pricing.Why did fill or store return 413?
Why did fill or store return 413?
bodyBytes on fill-by-bytes (128 KiB / 2 MiB / 5 MiB) versus maxTemplateBytes on store/replace (5 / 10 / 20 MiB) — Free fill-by-bytes rarely holds a real form, so store then fill by id. See Rate limits and Pricing.Fill wrote the PDF even though a required field was empty. Is that an error?
Fill wrote the PDF even though a required field was empty. Is that an error?
/Ff Required is metadata; validate-fill lists empty names in missingRequired, and fill still writes the PDF (not a 400).One field name has several widgets. What happens on fill?
One field name has several widgets. What happens on fill?
multi_widget means one name has many placements — one fill value paints every placement. See Inspect.Does rotating my API key delete stored templates?
Does rotating my API key delete stored templates?
bp_ key; rotate the key, the library stays. See Stored templates.Privacy & Security
How do you handle data privacy?
How do you handle data privacy?
Is my API key secure?
Is my API key secure?
bp_ key — rotate the key, the library stays. All API traffic is encrypted with TLS.Billing & Plans
Is there a free trial?
Is there a free trial?
What happens if I exceed my plan quota?
What happens if I exceed my plan quota?
- Free — rendering stops once you hit 250 render units for the month. The API returns a
402error (spend_cap_reached) until the calendar month resets. There is no daily cap. - Pro — additional units are billed at $0.004 per unit through Stripe metered billing. If you’ve set a spending cap, rendering stops when the cap is reached instead of incurring overage.
- Business — additional units are billed at $0.001 per unit.
- Enterprise — governed by your contract terms; typically dedicated capacity with no per-render metering.
402 spend_cap_reached on POST /v1/fill as on render.How do I cancel or change my plan?
How do I cancel or change my plan?
- Upgrades take effect immediately.
- Downgrades take effect at the start of your next billing cycle.
- Cancellations — your plan remains active until the end of the current paid period. After that, your account reverts to the Free tier rather than being deleted, so you keep access to your API keys and usage history.
How does annual billing work?
How does annual billing work?
Do health checks or validation count toward my usage?
Do health checks or validation count toward my usage?
POST /v1/render/validate calls are free and never consume render units. Only successful POST /v1/fill, POST /v1/render, and POST /v1/templates/*/render responses billed as counted (in the X-BlinkPDF-Billing header) consume units — a fill is 1 unit on the same allowance; cache and idempotent replays on /v1/render do not. POST /v1/inspect and POST /v1/validate-fill spend none. Note that POST /v1/render/validate has its own rate-limit bucket, so a validate burst can still return 429.