POST /v1/inspect returns every fillable field plus skipped import names. Use those name values as keys on fill. Do not invent /T tokens.
Not POST /v1/render. Does not accept values. Does not store the PDF. Does not write appearances. Does not spend a unit.
Send
JSON{ "pdf": "<Base64>" } or { "templateId": "…" } — exactly one. Multipart pdf (file) or templateId works the same. Same x-api-key as render.
templateId is 404. Sending both pdf and templateId is 400. Extra keys such as values are 400.
What you get
Fields
Skipped
skipped[] is { name, reason }. Filling a skipped name is 400 skipped_field_name — no silent drop.
Warnings
warnings[] is always present. Empty when every fillable name has one widget.
No widgets
fields: [] and skipped: [] include reason: "no_widgets". That reason is omitted when fields or skipped is non-empty. If the PDF has no widgets, make it a form in studio first. Inspect is not a map editor.
Limits and rejects
Inspect is unmetered. It still sits on the same planratePerMin and concurrency limiters as fill — a burst is 429 rate_limited. It does not apply plan bodyBytes to live pdf bytes.
Templates with no /AcroForm, /NeedAppearances, a password, XFA, or a document signature are rejected by name (no_acroform, need_appearances, encrypted_pdf, xfa_unsupported, signed_pdf). See Fill errors.
Persist the blank with
POST /v1/templates if you want to inspect and fill by id later. Inspect itself does not store.