Logo

Generate, track, sign
PDFs with one API.

Each recipient gets a personal link. Every open, page read, comment and signature streams into your app or agent.

EU-hosted, GDPR-native Free plan, no card

From the PDF you generate to the signed copy in your app.

Generate

Generate PDFs from HTML or Office files, fill forms, merge, compress and OCR — every operation, one API.

Track

Personal links per recipient track every open, page read, comment and form entry, streamed to your webhook.

Sign

Request signatures in the tracked link, confirmed by emailed code. Sealed PDF with audit trail when done.

One link per recipient, every event comes back named.

Generate a tokenized link per recipient. Every event downstream is already identified — no logins, no exports, no dashboards in the way.

POST /docs/68052-a7bc5/links
{
  "name":  "Alex Rivera",
  "email": "alex@example.com"
}
200 OK application/json
{
  "token": "fi6WgjyH",
  "name":  "Alex Rivera",
  "email": "alex@example.com",
  "url":   "https://docs.apdf.io/acme/68052-a7bc5?v=fi6WgjyH",
  "is_active":  true,
  "created_at": "2026-05-08T09:00:00Z"
}
Live event stream Live
T Tom Mendez document:loaded
A Alex Rivera page:read
S Sara Chen page:enter
A Alex Rivera link:clicked
T Tom Mendez document:download
A Alex Rivera signature:signed

Send a link to a viewer that streams every interaction back.

Your recipient opens the PDF in our hosted viewer — no install, no setup, just a link. They read, fill forms, and annotate. Our viewer, not your lock-in.

A Proposal — Acme × Contoso
4 / 12
100%
A Alex Rivera 2m

Is the price locked for 12 months?

Replaces the attachment.

No 25 MB ceiling, no spam-filter roulette. Revoke a recipient’s access at any time — even after the link has been forwarded.

Replaces the dashboard.

No additional dashboards to log in or to refresh. Events land in your CRM, or your agent the moment they happen — in time to act before they move on.

You own the signal.
We host the surface.

What you actually get back.

Every reader interaction lands in your stream as a typed event. Below, the ones worth acting on — each in a JSON shape your code already speaks.

Engagement heatmap 12 pages · 6 sessions
1
2
3
4
5
6
7
8
9
10
11
12
A Alex Rivera
S Sara Chen
T Tom Mendez
L Lena Park
M Marcus Brown
R Riya Patel
Total dwell
0s
2m+
GET /docs/68052-a7bc5/analytics/sessions/0lLKvtyo
{
  "session": {
    "id":        "0lLKvtyoC1nl3WD0",
    "recipient": {
      "name":  "Alex Rivera",
      "email": "alex@example.com"
    }
  },
  "metrics": {
    "total_duration_ms": 89364,
    "pages_viewed":      8,
    "completion_pct":    67,
    "downloads":         0,
    "prints":            1
  },
  "pages": [
    { "page": 4, "duration_ms": 47100 },
    { "page": 5, "duration_ms": 22300 },
    { "page": 7, "duration_ms": 12500 }
  ],
  "events": [
    {
      "event":   "annotation:create",
      "page":    4,
      "payload": {
        "comment": "Is the price locked for 12 months?"
      }
    }
  ]
}
document:loaded
Document opened

First proof of life. They engaged at all.

page:read
Page read

Where attention actually lives. Find the strong sections, spot the boring ones.

link:clicked
Link clicked

The clearest "tell me more" signal — they pulled on a specific thread.

form:submit
Form submitted

Structured intent — names, answers, choices, captured field by field.

annotation:create
Annotation created

Questions and pushback in writing — the highest-engagement signal you can get.

signature:completed
Signature completed

Every signer has signed. The sealed PDF is on its way and your webhook already fired.

And more events. See all on the analytics page.

From form fill to next step.

Field reports, contracts, customer intake — each submission delivers every field as structured data to your endpoint, ready to update a CRM record, ping a team channel, or push the project to its next stage.

Form fields Proposal — Acme × Contoso
Alex Rivera
Starter
Pro
Enterprise

Need to confirm pricing for the additional seats before signing. Can we hop on a call this week?

Subscribe to product updates
Submitted as POST https://hook.acme.com/forms
{
  "doc_id":    "68052-a7bc5",
  "recipient": { "name": "Alex Rivera", "email": "alex@example.com" },
  "fields": [
    { "name": "full_name",  "type": "text",     "page": 1, "value": "Alex Rivera" },
    { "name": "plan_tier",  "type": "radio",    "page": 1, "value": true, "exportValue": "Pro" },
    { "name": "notes",      "type": "text",     "page": 2, "value": "Need to confirm pricing for the additional seats..." },
    { "name": "subscribe",  "type": "checkbox", "page": 2, "value": true, "exportValue": "Subscribe" }
  ]
}

Signed in the same link
they already read.

Every party signs their own part, confirmed with a code sent to their email. When the last one signs, everyone gets the sealed PDF back with an audit trail.

Proposal — Acme × Contoso 12 / 12
Alex Rivera
Signed at 11:48
Sign here
Sara Chen
Reading the terms
Approved by Acme
Acme
Approves once both signed
After the last signature Audit trail page Seal with a timestamp Sent to everyone

Your team and your company can sign too. See how on the e-signature page.

Turn any event into an action.

Compose any combination of events as the trigger, narrow with filters, and wire the result to your endpoint. No glue code, no separate tool to learn.

When

When the document is opened

or

downloaded

or

printed

When a page is read

or

left

When the form is submitted

When the document is opened

or

a page is visited

When text is copied

or

a link is clicked

When the document is signed

When an annotation is created

or

updated

When an annotation is created

or

updated

or

deleted

Filter

only if reading time is over 5 minutes

and

at least 80% of the document is read

only on page 4

and

after 30 seconds spent on the page

only if 8 or more pages were viewed

only if 3 or more pages were viewed

only if 5 or more pages were viewed

only if 80% of the document was read

only if reading time is over 1 minute

only on page 2 or later

and

reading time is over 2 minutes

Then

POST https://hook.acme.com/automations
Authorization Bearer sk_live_pVx…
Content-Type application/json

Give your agents eyes.

Connect Apdf over MCP. Your agent sees every reader signal, reads the context, and acts on it — autonomously. It can ask for a signature; only people sign.

Agent reasoning
Signal: annotation:create — Alex Rivera, page 4.
Reading session context ...
2 min 32 s in. Returned to the pricing page twice — 47 s there. Completion 25%.
Reading annotation content ...
Highlight on the price line. Comment: "Is the price locked for 12 months?" — a specific objection.
Serious reader, one blocker. Intent is hot now — pinging the deal owner on Slack.
Sent to @john.smith in #sales-acme with full session context.
MCP tool calls
⇠ webhook annotation:create
recipient: "Alex Rivera" · page: 4
→ apdf.get-document-session
← duration: 152s · completion: 25%
pages: p4(47s) p5(22s) p7(12s)
→ apdf.list-document-annotations
← type: highlight · page: 4
comment: "Is the price locked for 12 months?"
→ slack.send-message
{ channel: "#sales-acme", mention: "@john.smith",
summary: "Hot signal: pricing dwell + price-lock question" }
← message delivered
Drops into
Claude Claude ChatGPT ChatGPT Cursor Cursor Gemini Gemini
53 MCP tools OAuth apdf.io/mcp/main

Build, wire, or hand it off.

From embedded inside your app to fully autonomous.
Three ways to put Apdf to work.

For builders
Embed in your product

A user of your app sends a contract. You see who opened it, where they paused, and get the signed PDF back. Hosted viewer, personal links, JSON API.

For operators
Wire it into your stack

A quote is opened again — HubSpot gets a task, the rep a Slack ping. Webhooks on every event; rules run inside Apdf or in your own tools.

For AI-native teams
Let an agent close the loop

Connect over MCP. Attention drops on page 4 — your agent reads the context, drafts the follow-up and asks for the signature. People sign.

EU-hosted

GDPR-native by default. Your data never leaves the EU.

Never used to train AI

Your PDFs and reader events stay yours. Period.

MCP-native

First-class agent support, not a retrofitted add-on.

Exportable, always

No vendor lock-in. Open API, your data on demand.

Generate PDFs.
Get them back signed.