Skip to main content
Everything you need to know about Blink PDF, answered in one place. If your question isn’t here, email us at [email protected] and we’ll get back to you promptly.

General

No. Blink PDF takes Markdown as input and produces a PDF as output. You configure headers, footers, page size, margins, and branding through simple API parameters — there is no stylesheet to write and no LaTeX to learn.If you can write a README, you can use Blink PDF.

Integration & Compatibility

Blink PDF ships a curated set of hosted families you select per request with the 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.
The maximum input size depends on your plan:Images staged as 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.
Yes. Fill is a second verb: send a blank AcroForm and a name-to-value map to POST /v1/fill (same bp_ key as render). Start at Fill a form. Fill is not a mode on POST /v1/render.
Copy keys from inspect 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).
A template with /NeedAppearances is 422 need_appearances: rejected, not repaired — never set /NeedAppearances on the filled PDF. See Named errors.
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.
/Encrypt is 422 encrypted_pdf — Blink PDF does not decrypt. See Named errors.
/XFA is 422 xfa_unsupported — Blink PDF does not flatten XFA. See Named errors.
Catalog /Perms or a field signature /V is 422 signed_pdf — an empty /FT /Sig is skipped, not this error. See Named errors.
The hosted appearance face cannot encode that value (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.
Yes — a maxed key on POST /v1/fill returns the same 402 spend_cap_reached as render (the 402 names units; raise the cap or upgrade). See Pricing.
Yes — POST /v1/fill, POST /v1/inspect, and POST /v1/validate-fill share the plan post-auth bucket; wait the Retry-After seconds on 429. See Rate limits.
The 413 names the cap: 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.
No — /Ff Required is metadata; validate-fill lists empty names in missingRequired, and fill still writes the PDF (not a 400).
Inspect multi_widget means one name has many placements — one fill value paints every placement. See Inspect.
No — templates belong to the account, not the bp_ key; rotate the key, the library stays. See Stored templates.

Privacy & Security

Your Markdown input is loaded into memory for rendering, the PDF is returned to you, and the input is immediately purged — it is never written to disk, logged in plaintext, or stored in a database. REST streams the PDF back and does not keep it. MCP download files and staged assets default to 24 hours. On MCP you can opt in to keep a PDF until you delete it; the signed link still expires in 24 hours. See Zero Retention for the full breakdown.Enterprise customers can run on dedicated infrastructure with data isolation, a zero-retention output option, and on-premise / VPC deployment for full data sovereignty. See Enterprise.
API keys are hashed with SHA-256 before storage — we cannot retrieve your key in plaintext. If you believe a key has been compromised, rotate it immediately from your account dashboard. Rotating a key invalidates the old one instantly. Stored templates belong to the account, not the bp_ key — rotate the key, the library stays. All API traffic is encrypted with TLS.

Billing & Plans

Yes — the Free plan is available with no credit card required. You get 250 render units per month (with no daily cap) to explore the API, test your integration, and evaluate output quality. A text render costs 1 unit; image-heavy renders cost more, up to 16. See how billing works.When you’re ready to remove the watermark and increase your volume, you can upgrade to a paid plan at any time from your account dashboard.
Usage is metered in render units, and it depends on your plan and settings:
  • Free — rendering stops once you hit 250 render units for the month. The API returns a 402 error (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.
Each paid plan also has a fixed hard cap at 2× its included volume (60,000 units for Pro, 2,000,000 for Business). Overage billing is otherwise soft — you are never abruptly cut off without warning, and you won’t face surprise charges unless you’ve opted into uncapped overage.A maxed key returns the same 402 spend_cap_reached on POST /v1/fill as on render.
You can upgrade, downgrade, or cancel your plan at any time from the billing section of your account dashboard.
  • 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.
If you’re on an annual plan and need to cancel early, email [email protected] to discuss your options.
When you choose annual billing, the full year’s base subscription is charged upfront as a single payment. You save approximately 17% compared to monthly billing — roughly two months free.Any overage render units you use beyond your included allowance are still billed monthly at the end of each calendar month, at the same per-unit overage rate as the monthly plan.
No. Health-check requests and 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.