Skip to main content
Blink PDF has two verbs. Render turns Markdown into a PDF. Fill takes a blank AcroForm plus a { name: value } map and returns a filled PDF. Fill is not a mode on POST /v1/render. There is no /v1/forms route — that path is 404. Use the fill paths below with the same bp_ key you already use to render.

Paths

Send pdf (Base64 or a multipart file) or templateId — never both, never neither. Unknown, deleted, or another account’s id is 404.

Inspect

List fillable names and kinds before you write values.

Fill

Write appearances, optional flatten, named errors, and validate-fill.

Templates

Store a blank once, then fill by id. Account-owned, not key-owned.

MCP fill

inspect_form → validate_fill → fill_form for agents.

Inspect, then fill (under five minutes)

The same bp_ key as render. This synthetic intake has two fields: givenName (text) and agree (checkbox). It is not a real-world form.
Inspect returns JSON names. Fill returns application/pdf with written appearances. Open intake-filled.pdf — the text already shows. Do not set /NeedAppearances.
On Free, a real form often exceeds the 128 KiB fill-by-bytes body. Store the blank, then fill with { "templateId": "<id>", "values": { … } }.

Rules that stay true

  • Same key. A bp_ key that can render can fill. Do not mint a fill key.
  • One unit. A successful POST /v1/fill costs 1 unit on the same allowance as render. Inspect, validate-fill, and the template library do not spend a unit.
  • Atomic values. One bad key fails the whole request. No silent drop. false is a value (checkbox Off), not an omit.
  • Never /NeedAppearances. A template that already has the flag is rejected (need_appearances). The filled PDF never includes it.
  • REST streams. POST /v1/fill does not keep the output. MCP fill_form returns a signed download link (24 hours unless you persist).
See Pricing for units and template caps, and Zero Retention for what happens to fill values.