Skip to main content
POST /v1/templates stores a blank AcroForm once and returns { id, title, fields, skipped }. The stored object is the template, not a filled output. Not POST /v1/render. Not /v1/forms. Not a Markdown sandwich-document kit. Does not spend a unit. Then send { "templateId": "<id>", "values": { … } } to inspect, validate-fill, or fill without resending the PDF.

Store

JSON { "pdf": "<Base64>", "title": "Intake card" } or multipart pdf plus optional title. Extra keys (values, templateId) are rejected. Same x-api-key as render. title is the body field, or the upload filename if omitted. JSON without a filename must send title. An empty multipart File.name is omitted — same 400 missing_property #/title as JSON without title.
Rejects no /AcroForm, /NeedAppearances, a password, XFA, or a document signature — same codes as inspect and fill.

Receive

No warnings. No reason. No fill values.

Get, list, update, delete, download

downloadUrl is GET /v1/templates/{id}/download on this host, same x-api-key. Schema-only GET is not enough if you need the bytes. Foreign or unknown id: 404. Store outage: 503 service_unavailable — never a silent drop.

Ownership

Templates belong to the account, not the API key. Any bp_ key (or OAuth principal) on that account can list, get, update, delete, download, and fill the same id. Rotating a key does not orphan the library. Another account’s id is 404.

Caps

Object cap getMaxTemplates: 10 / 50 / 250 (Free / Pro / Business). Independent of kept MCP PDFs (10 / 100 / 1,000). Hitting one does not block the other. A full template cap is 409 template_limit with maxTemplates and current. Upload cap maxTemplateBytes: 5 / 10 / 20 MiB. Oversize store or replace is 413 payload_too_large and names maxTemplateBytes. Not render bodyBytes. Enterprise can raise this byte cap. Fill-by-bytes still uses render bodyBytes (128 KiB / 2 MiB / 5 MiB). Fill-by-id does not re-check the stored PDF against bodyBytes. On Free, store the blank, then fill by id. See Pricing.

Fill by id

Inspect and validate-fill accept the same XOR. Sending both pdf and templateId is 400.
Fill values are never stored on the template row. Account erasure deletes stored templates. See Zero Retention.
MCP tools store_template, list_templates, get_template, update_template, and delete_template proxy this library. list_pdfs stays filled and generated outputs — it never mixes templates. See MCP fill.