Logo

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.

Proposal-Acme.pdf
4 / 12
Live
REST API

Pull events on demand

GET /docs/{id}/analytics
Webhooks

Push to any endpoint

POST https://hook.acme.com
MCP Agents

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.

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?t=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 page:leave

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 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.

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.

document:download
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.

highlight
underline
strikethrough
squiggly
ink · free-drawing
GET /docs/68052-a7bc5/annotations
{
  "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"
    }
  ]
}

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" }
  ]
}

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

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 a page is visited

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 on page 5 or later

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

Speaks every language you do.

Every endpoint comes with copy-paste snippets in cURL, JavaScript, PHP, Ruby, Python, Go, and Java.

POST /docs/68052-a7bc5/links
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"
200 OK application/json
{
  "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.

Agent reasoning
Signal: annotation:createAlex 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
39 MCP tools OAuth apdf.io/mcp/main

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.

For builders
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.

For operators
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.

For AI-native teams
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.

EU-hosted

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

Not training data

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.

Stop guessing.
Start knowing.