Fill a form
curl -H "X-Api-Key: $KEY" -F files=@form.pdf \ -F 'data={"name":"Ada","date":"2026-11-06","agree":true}' \ http://localhost:9027/v1/pdf/forms/fill -o filled.pdfimport { openAsBlob } from 'node:fs';import { writeFile } from 'node:fs/promises';
const form = new FormData();form.append('files', await openAsBlob('form.pdf'), 'form.pdf');form.append('data', JSON.stringify({ name: 'Ada', date: '2026-11-06', agree: true,}));
const response = await fetch('http://localhost:9027/v1/pdf/forms/fill', { method: 'POST', headers: { 'X-Api-Key': process.env.KEY }, body: form,});if (!response.ok) throw new Error(await response.text());await writeFile('filled.pdf', Buffer.from(await response.arrayBuffer()));import jsonimport osfrom pathlib import Path
import requests
response = requests.post( "http://localhost:9027/v1/pdf/forms/fill", headers={"X-Api-Key": os.environ["KEY"]}, files=[("files", open("form.pdf", "rb"))], data={"data": json.dumps({"name": "Ada", "date": "2026-11-06", "agree": True})},)response.raise_for_status()Path("filled.pdf").write_bytes(response.content)package main
import ( "bytes" "io" "log" "mime/multipart" "net/http" "os" "path/filepath")
func main() { var body bytes.Buffer form := multipart.NewWriter(&body) attach(form, "files", "form.pdf") form.WriteField("data", `{"name":"Ada","date":"2026-11-06","agree":true}`) form.Close()
request, err := http.NewRequest("POST", "http://localhost:9027/v1/pdf/forms/fill", &body) if err != nil { log.Fatal(err) } request.Header.Set("X-Api-Key", os.Getenv("KEY")) request.Header.Set("Content-Type", form.FormDataContentType())
response, err := http.DefaultClient.Do(request) if err != nil { log.Fatal(err) } defer response.Body.Close() if response.StatusCode >= 300 { message, _ := io.ReadAll(response.Body) log.Fatalf("%s: %s", response.Status, message) }
out, err := os.Create("filled.pdf") if err != nil { log.Fatal(err) } defer out.Close() if _, err := io.Copy(out, response.Body); err != nil { log.Fatal(err) }}
// attach adds the file at path to the form as the named field.func attach(form *multipart.Writer, field, path string) { file, err := os.Open(path) if err != nil { log.Fatal(err) } defer file.Close() part, err := form.CreateFormFile(field, filepath.Base(path)) if err != nil { log.Fatal(err) } if _, err := io.Copy(part, file); err != nil { log.Fatal(err) }}Fills a PDF form from data, applying tags in annotations, optionally flattening the result.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”object
JSON object visible as ctx, sent as text.
JSON object, sent as text or as a file; a field named customer.name takes
that path.
Example
{"customer": {"name": "Ada"}}The PDF with form fields, and optionally tags in annotations.
Fix the values into the page content.
Remove the annotations that carried tags. Default true.
Responses
Section titled “Responses”The filled PDF
The file, as bytes.
Accepted; the result goes to the webhook
The request is wrong
The JSON body of every error response.
object
A stable, machine-readable kind.
What went wrong, for a person.
Example
{ "error": "invalid_request", "message": "unknown step 'teleport'"}The template failed to render
The JSON body of every error response.
object
A stable, machine-readable kind.
What went wrong, for a person.
Example
{ "error": "invalid_request", "message": "unknown step 'teleport'"}Not supported in this version
The JSON body of every error response.
object
A stable, machine-readable kind.
What went wrong, for a person.
Example
{ "error": "invalid_request", "message": "unknown step 'teleport'"}