PDF Form Fields API
Start building for free today – no credit card required.
List every form field of a PDF with a single API call: its name, type, current value and the options it accepts, together with what the field means – the description stored in the PDF and the text printed around it on the page. Prefill forms from your data, read what a customer entered, or let an AI agent understand a form before it fills it.
Claude, ChatGPT, Cursor or your own agent can call
read-pdf-form directly.
Benefits of our PDF Form Fields API
Field names in real-world forms are often cryptic, like Text12 or
f1_05[0]. Next to every text field, checkbox, radio button,
dropdown and list box, the API returns its position on the page and the labels printed left, right,
above and below it, as well as the row and column it belongs to in a table. So you and your agents
know what each field asks for, and the field names returned are exactly what our
PDF Form Filling API takes.
Read our API documentation to learn how to read PDF form fields.
Multi-language Code Example
curl -X POST https://apdf.io/api/pdf/form/read \
-H "Authorization: Bearer TOKEN" \
-d file="FILE_URL"
const data = new FormData();
data.append('file', 'FILE_URL');
fetch('https://apdf.io/api/pdf/form/read', {
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/read', [
'headers' => [
'Authorization' => 'Bearer TOKEN'
],
'form_params' => [
'file' => 'FILE_URL'
]
]);
$body = $response->getBody();
echo json_encode($body->getContents());
require 'rest-client'
response = RestClient.post(
'https://apdf.io/api/pdf/form/read',
{
'file' => 'FILE_URL'
},
{
Authorization: "Bearer TOKEN"
}
)
puts response.body
import requests
response = requests.post(
'https://apdf.io/api/pdf/form/read',
headers = {
'Authorization': 'Bearer TOKEN'
},
data = {
'file': 'FILE_URL'
}
)
print(response.text)
import (
"fmt"
"github.com/go-resty/resty/v2"
)
func main() {
client := resty.New()
data := map[string]string{
"file": "FILE_URL"
}
resp, _ := client.R().
SetFormData(data).
SetHeader("Authorization", "Bearer TOKEN").
Post("https://apdf.io/api/pdf/form/read")
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")
.build();
Request request = new Request.Builder()
.url("https://apdf.io/api/pdf/form/read")
.addHeader("Authorization", "Bearer TOKEN")
.post(formBody)
.build();
Response response = client.newCall(request).execute();
System.out.println(response.body().string());
}
}
No-Code PDF Form Reading
Integrate our PDF Form Fields API with Zapier Webhooks to automate your form processing. Read the answers of filled PDF forms that arrive by email or upload and pass them on to your CRM, spreadsheet or database – from hundreds of apps supported by Zapier, without typing anything over 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