The PDF engagement layer,
for apps and agents.
Get every open, read, click, and more streamed in
real time – and follow up at the perfect moment.
Pull events on demand
GET /docs/{id}/analytics
Push to any endpoint
POST https://hook.acme.com
Built for AI agents
tools/get-document-session
From reader signals to API, webhook, or agent — turning attention into action while interest is still hot.
Most PDF platforms cover one slice.
Ours builds the PDF, reads the room, and closes the deal.
Generate
Generate from data, personalize per recipient, merge and assemble — every PDF operation, one API.
Track
Know who opened it, what held attention, who came back — and where they walked away. Streamed, not sampled.
Automate
Ping Slack on re-open. Create CRM tasks. Let agents follow up. Rules, webhooks, and MCP — wire to anything.
Know who’s reading — in your stack, not ours.
Generate a tokenized link per recipient. Every event downstream is already identified — no logins, no exports, no dashboards in the way.
{ "name": "Alex Rivera", "email": "alex@example.com" }
{ "token": "fi6WgjyH", "name": "Alex Rivera", "email": "alex@example.com", "url": "https://docs.apdf.io/acme/68052-a7bc5?t=fi6WgjyH", "is_active": true, "created_at": "2026-05-08T09:00:00Z" }
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.
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 mid-read, 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.
{ "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 opened
First proof of life. They engaged at all.
Page read
Where attention actually lives. Find the strong sections, spot the boring ones.
Link clicked
The clearest "tell me more" signal — they pulled on a specific thread.
Form submitted
Structured intent — names, answers, choices, captured field by field.
Annotation created
Questions and pushback in writing — the highest-engagement signal you can get.
Document downloaded
They’re advancing it internally. A buyer-committee tell.
And more events. See all on the analytics page.
When readers mark it up, you hear it.
Highlights, underlines, strikethroughs, squiggles, hand-drawn marks — each can carry a comment with author and timestamp. Visible in your dashboard, delivered to your endpoint.
{ "data": [ { "annotation_id": "annot_1776805002364_5uxvr3fcx", "page": 4, "type": "highlight", "annotated_text": "standard rate of $12,000/mo", "comment_author": "Alex Rivera", "comment_text": "Is the price locked for 12 months?", "created_at": "2026-04-21T20:57:12Z" }, { "annotation_id": "annot_1776805044335_stzuj7fyu", "page": 5, "type": "underline", "annotated_text": "kickoff in Q3 2026", "comment_author": "Alex Rivera", "comment_text": "Can we move this earlier?", "created_at": "2026-04-21T20:58:30Z" }, { "annotation_id": "annot_1776805111201_kwpx4mzf2", "page": 7, "type": "ink", "annotated_text": null, "comment_author": null, "comment_text": null, "created_at": "2026-04-21T21:01:14Z" } ] }
Is the price locked for 12 months?
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.
Need to confirm pricing for the additional seats before signing. Can we hop on a call this week?
{ "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" } ] }
Turn reader signals into automated actions.
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
downloaded
printed
When a page is read
left
When the form is submitted
When the document is opened
a page is visited
When text is copied
a link is clicked
When a page is visited
When an annotation is created
updated
When an annotation is created
updated
deleted
Filter
only if reading time is over 5 minutes
at least 80% of the document is read
only on page 4
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 on page 5 or later
only if reading time is over 1 minute
only on page 2 or later
reading time is over 2 minutes
Then
Speaks every language you do.
Every endpoint comes with copy-paste snippets in cURL, JavaScript, PHP, Ruby, Python, Go, and Java.
curl -X POST https://apdf.io/api/docs/68052-a7bc5/links \ -H "Authorization: Bearer sk_live_pVx..." \ -d name="Alex Rivera" \ -d email="alex@example.com"
{ "data": { "token": "fi6WgjyH", "name": "Alex Rivera", "email": "alex@example.com", "url": "https://docs.apdf.io/acme/68052-a7bc5?t=fi6WgjyH", "is_active": true, "last_viewed_at": null, "created_at": "2026-04-21T14:14:37Z" } }
Give your agents eyes.
Connect Apdf over MCP. Your agent sees every reader signal, reads the context, and acts on it — autonomously.
Every PDF operation, one API.
Generate from HTML. Merge, split, watermark. Read text, lock with a password. REST endpoints in your stack.
HTML → PDF
Generate styled PDFs straight from HTML markup.
Merge PDFs
Combine many PDFs into one, in your chosen order.
Split PDF
Cut a PDF into chunks by page, range, or count.
Compress
Shrink file size without visible quality loss.
Extract pages
Pull out specific pages as their own document.
Watermark / Stamp
Stamp logos, signatures, or watermarks onto pages.
Extract text
Pull the plain text out of a PDF, page by page.
Password protect
Encrypt a PDF with user and owner-level passwords.
And more PDF endpoints. See the full list in the docs.
Build, wire, or hand it off.
From embedded inside your app to fully autonomous.
Three ways to put Apdf to work.
Embed in your product
PDFs and tracking inside any app you build, SaaS or in-house. A user sends a contract — you see who opened it, where they paused, when they came back. Hosted viewer, tokenized recipient links, JSON API.
Wire it into your stack
Turn engagement into action. A quote re-opens after three days — HubSpot creates a task, the AE gets pinged in Slack. Webhooks fire on every signal; automations run inside Apdf or in your own tools.
Let an agent close the loop
Connect through MCP. Attention drops on page 4 — your agent investigates the engagement, drafts the follow-up, books the next call. The same loop your team runs, working on its own around the clock.
GDPR-native by default. Your data never leaves the EU.
Your PDFs and reader events stay yours. Period.
First-class agent support, not a retrofitted add-on.
No vendor lock-in. Open API, your data on demand.