PDF Form Visualization API
Start building for free today – no credit card required.
Show an AI agent what a form looks like. Get every page of a PDF form as an image with a numbered box on each field to fill, together with a list that tells which field each number is. The agent sees the form the way a person does and fills the right field, even when the field names say nothing.
Claude, ChatGPT, Cursor or your own agent can call
visualize-pdf-form directly.
Benefits of our PDF Form Visualization API
A field named Text12 doesn't tell an agent what to enter, but the
page does. The agent looks at the image, finds the box next to “Date of birth” and fills
its field with our PDF Form Filling API.
The numbers follow the reading order, neighbouring boxes get different colors so they stand apart,
and fields that a form only shows on demand are marked separately. Read-only fields and buttons
stay unmarked, so every number is a field the agent can fill.
Read our API documentation to learn how to visualize PDF form fields.
Multi-language Code Example
curl -X POST https://apdf.io/api/pdf/form/visualize \
-H "Authorization: Bearer TOKEN" \
-d file="FILE_URL" \
-d pages="1"
const data = new FormData();
data.append('file', 'FILE_URL');
data.append('pages', '1');
fetch('https://apdf.io/api/pdf/form/visualize', {
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/visualize', [
'headers' => [
'Authorization' => 'Bearer TOKEN'
],
'form_params' => [
'file' => 'FILE_URL',
'pages' => '1'
]
]);
$body = $response->getBody();
echo json_encode($body->getContents());
require 'rest-client'
response = RestClient.post(
'https://apdf.io/api/pdf/form/visualize',
{
'file' => 'FILE_URL',
'pages' => '1'
},
{
Authorization: "Bearer TOKEN"
}
)
puts response.body
import requests
response = requests.post(
'https://apdf.io/api/pdf/form/visualize',
headers = {
'Authorization': 'Bearer TOKEN'
},
data = {
'file': 'FILE_URL',
'pages': '1'
}
)
print(response.text)
import (
"fmt"
"github.com/go-resty/resty/v2"
)
func main() {
client := resty.New()
data := map[string]string{
"file": "FILE_URL",
"pages": "1"
}
resp, _ := client.R().
SetFormData(data).
SetHeader("Authorization", "Bearer TOKEN").
Post("https://apdf.io/api/pdf/form/visualize")
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("pages", "1")
.build();
Request request = new Request.Builder()
.url("https://apdf.io/api/pdf/form/visualize")
.addHeader("Authorization", "Bearer TOKEN")
.post(formBody)
.build();
Response response = client.newCall(request).execute();
System.out.println(response.body().string());
}
}
No-Code AI Form Workflows
Integrate our PDF Form Visualization API with Zapier Webhooks to build AI form workflows without code. Hand the page images to an AI step that decides which answer goes into which field, then fill the form – for the forms that arrive in your inbox, cloud storage or CRM, from hundreds of apps supported by Zapier.
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