PDF Form Filling API
Start building for free today – no credit card required.
Fill the form fields of any PDF with a single API call. Send the names of the fields with their values and get back the filled PDF – ready to send, archive or print, or flattened so the answers can no longer be changed.
Claude, ChatGPT, Cursor or your own agent can call
fill-pdf-form directly.
Benefits of our PDF Form Filling API
Fill text fields, checkboxes, radio buttons, dropdowns and list boxes in the forms you already
have, without redesigning them. Calculated fields such as totals are updated after filling, and
numbers and dates appear in the field's own display format, like 1.234,50 or 14.10.2026. Invalid
values are rejected field by field with a clear error, so you know exactly what to fix. Find the
names of the fields with our PDF Form Fields API.
Want your recipients to fill in the form themselves instead? Share it through the
PDF viewer and receive every submission
as structured data.
Read our API documentation to learn how to fill PDF forms.
Multi-language Code Example
curl -X POST https://apdf.io/api/pdf/form/fill \
-H "Authorization: Bearer TOKEN" \
-d file="FILE_URL" \
-d fields[0][name]="full_name" \
-d fields[0][value]="Jane Doe" \
-d fields[1][name]="contact" \
-d fields[1][value]="Email" \
-d fields[2][name]="newsletter" \
-d fields[2][value]="true"
const data = new FormData();
data.append('file', 'FILE_URL');
data.append('fields[0][name]', 'full_name');
data.append('fields[0][value]', 'Jane Doe');
data.append('fields[1][name]', 'contact');
data.append('fields[1][value]', 'Email');
data.append('fields[2][name]', 'newsletter');
data.append('fields[2][value]', 'true');
fetch('https://apdf.io/api/pdf/form/fill', {
headers: {'Authorization': 'Bearer TOKEN'},
method: 'POST',
body: data
})
.then(response => response.json())
.then(json => console.log(json));
use GuzzleHttp\Client;
$client = new Client();
$response = $client->post(
'https://apdf.io/api/pdf/form/fill', [
'headers' => [
'Authorization' => 'Bearer TOKEN'
],
'form_params' => [
'file' => 'FILE_URL',
'fields[0][name]' => 'full_name',
'fields[0][value]' => 'Jane Doe',
'fields[1][name]' => 'contact',
'fields[1][value]' => 'Email',
'fields[2][name]' => 'newsletter',
'fields[2][value]' => 'true'
]
]);
$body = $response->getBody();
echo json_encode($body->getContents());
require 'rest-client'
response = RestClient.post(
'https://apdf.io/api/pdf/form/fill',
{
'file' => 'FILE_URL',
'fields[0][name]' => 'full_name',
'fields[0][value]' => 'Jane Doe',
'fields[1][name]' => 'contact',
'fields[1][value]' => 'Email',
'fields[2][name]' => 'newsletter',
'fields[2][value]' => 'true'
},
{
Authorization: "Bearer TOKEN"
}
)
puts response.body
import requests
response = requests.post(
'https://apdf.io/api/pdf/form/fill',
headers = {
'Authorization': 'Bearer TOKEN'
},
data = {
'file': 'FILE_URL',
'fields[0][name]': 'full_name',
'fields[0][value]': 'Jane Doe',
'fields[1][name]': 'contact',
'fields[1][value]': 'Email',
'fields[2][name]': 'newsletter',
'fields[2][value]': 'true'
}
)
print(response.text)
import (
"fmt"
"github.com/go-resty/resty/v2"
)
func main() {
client := resty.New()
data := map[string]string{
"file": "FILE_URL",
"fields[0][name]": "full_name",
"fields[0][value]": "Jane Doe",
"fields[1][name]": "contact",
"fields[1][value]": "Email",
"fields[2][name]": "newsletter",
"fields[2][value]": "true"
}
resp, _ := client.R().
SetFormData(data).
SetHeader("Authorization", "Bearer TOKEN").
Post("https://apdf.io/api/pdf/form/fill")
fmt.Println(resp.String())
}
import okhttp3.*;
class Pdf {
public static void main(String[] args) throws Exception {
OkHttpClient client = new OkHttpClient();
FormBody formBody = new FormBody.Builder()
.add("file", "FILE_URL")
.add("fields[0][name]", "full_name")
.add("fields[0][value]", "Jane Doe")
.add("fields[1][name]", "contact")
.add("fields[1][value]", "Email")
.add("fields[2][name]", "newsletter")
.add("fields[2][value]", "true")
.build();
Request request = new Request.Builder()
.url("https://apdf.io/api/pdf/form/fill")
.addHeader("Authorization", "Bearer TOKEN")
.post(formBody)
.build();
Response response = client.newCall(request).execute();
System.out.println(response.body().string());
}
}
No-Code PDF Form Filling
Integrate our PDF Form Filling API with Zapier Webhooks to automate your paperwork. Fill applications, contracts and order forms with the data from your CRM, spreadsheet or online forms as soon as a record comes in – from hundreds of apps supported by Zapier, without copying anything by hand.
PDF form tutorials
Track Who Read the Documents They Were Required to Read
When the auditor asks who read the safety policy, 'we emailed it' is a shrug. Per-person links measure the reading, an in-document acknowledgement checkbox collects the signature, and one script joins them into a defensible roster: read 100% and acknowledged, read but unsigned, never opened.
Onboard Clients with a Tracked Welcome Packet and Intake Form
Welcome PDF here, form tool there, chase emails everywhere — or one tracked link: the packet with the intake form as its last page. The client reads, fills and submits in a single visit, and both halves come back attributed — the answers machine-readable, the read confirmed page by page.
How to Make a PDF Form Fillable Online and Collect the Submissions
Your PDF already has the fields — don't rebuild it in a form builder. Share it as a link that's fillable in any browser and collect every submission as typed, recipient-attributed data: in the dashboard, over the API, or pushed straight to your webhook and handled by a one-file PHP receiver.
Your code made the PDF.
Then it went dark.
Opened, read, re-read, dropped on page 4 — you never see any of it. Share the PDFs you generate through Apdf recipient links, and every signal becomes something you can act on: ping Slack, update the CRM, let an agent follow up. Same account, same API token, one more call.
API · Webhook · MCP