PDF Overlay (Watermark) API
Send your PDF and a stamp PDF, and get the stamp drawn on top of the pages you pick. Made for CONFIDENTIAL marks, DRAFT labels, logos and approval stamps.
- Free plan
- No credit card
Request
curl -X POST https://apdf.io/api/pdf/page/overlay \
-H "Authorization: Bearer TOKEN" \
-d file="FILE_URL" \
-d overlay="OVERLAY_FILE_URL" \
-d from="1,3" \
-d to="2-z" \
-d repeat="1"
const data = new FormData();
data.append('file', 'FILE_URL');
data.append('overlay', 'OVERLAY_FILE_URL');
data.append('from', '1,3');
data.append('to', '2-z');
data.append('repeat', '1');
fetch('https://apdf.io/api/pdf/page/overlay', {
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/page/overlay', [
'headers' => [
'Authorization' => 'Bearer TOKEN'
],
'form_params' => [
'file' => 'FILE_URL',
'overlay' => 'OVERLAY_FILE_URL',
'from' => '1,3',
'to' => '2-z',
'repeat' => '1'
]
]);
$body = $response->getBody();
echo json_encode($body->getContents());
require 'rest-client'
response = RestClient.post(
'https://apdf.io/api/pdf/page/overlay',
{
'file' => 'FILE_URL',
'overlay' => 'OVERLAY_FILE_URL',
'from' => '1,3',
'to' => '2-z',
'repeat' => '1'
},
{
Authorization: "Bearer TOKEN"
}
)
puts response.body
import requests
response = requests.post(
'https://apdf.io/api/pdf/page/overlay',
headers = {
'Authorization': 'Bearer TOKEN'
},
data = {
'file': 'FILE_URL',
'overlay': 'OVERLAY_FILE_URL',
'from': '1,3',
'to': '2-z',
'repeat': '1'
}
)
print(response.text)
import (
"fmt"
"github.com/go-resty/resty/v2"
)
func main() {
client := resty.New()
data := map[string]string{
"file": "FILE_URL",
"overlay": "OVERLAY_FILE_URL",
"from": "1,3",
"to": "2-z",
"repeat": "1"
}
resp, _ := client.R().
SetFormData(data).
SetHeader("Authorization", "Bearer TOKEN").
Post("https://apdf.io/api/pdf/page/overlay")
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("overlay", "OVERLAY_FILE_URL")
.add("from", "1,3")
.add("to", "2-z")
.add("repeat", "1")
.build();
Request request = new Request.Builder()
.url("https://apdf.io/api/pdf/page/overlay")
.addHeader("Authorization", "Bearer TOKEN")
.post(formBody)
.build();
Response response = client.newCall(request).execute();
System.out.println(response.body().string());
}
}
Drawn on top.
Page by page.
The stamp is drawn over your page content, not behind it.
You choose which pages get it and which stamp goes where.
- to
- Pages of your PDF that get a stamp
- from
- Stamp pages to place, one per page, in order
- repeat
- Stamp pages reused once from runs out
- repeat=1
- A one-page stamp on every target page
- (none set)
- Stamp page 1 on page 1, 2 on 2, and so on
Marked before it leaves.
A stamp tells the reader what a document is before they read a word of it. Add it on the way out.
Confidential documents
Mark board packs, HR files and due diligence documents as confidential before they are shared beyond the core team.
Draft versus final
Put a DRAFT label on every page while a document is in review, and send the final version without it from the same source.
Approval stamps
Stamp approved invoices, signed-off drawings and checked reports with a mark everyone on your team spots at a glance.
Samples and copies
Label specimen certificates, sample contracts and demo exports, so nobody mistakes them for the real document.
Stamp from anywhere.
Watermark each file right where your workflow makes it.
One account and one monthly allowance behind every route.
One authenticated POST from any language. Copy-paste samples in cURL, Node.js, Python and more.
POST /api/pdf/page/overlay
Pick the action in any Zap and map files from earlier steps. No code and no servers to run.
Overlay PDF
Add the Apdf node to any workflow, on n8n Cloud or self-hosted, and chain it with your automation.
Overlay PDF pages
Let Claude, ChatGPT, Gemini or your own agent run it through the MCP server, on any paid plan.
overlay-pdf-pages
1,000 watermarks
a month. Free.
Start on the free plan and move up only when your volume does — up to 1,000,000 operations a month on Business.
- One call is one operation, however many pages.
- Only calls that do the work are counted.
- Hard limits, so no surprise overage charges.
Watermarking PDFs, answered
Overlay and watermark tutorials
Add Page Numbers and Headers to PDFs with Python
Add consistent page numbers, headers, or footers to existing PDF documents using Python and the Apdf Overlay API. Perfect for preparing reports for distribution without regenerating the original documents.
Add Per-Recipient Watermarks, Then Track Every Read
Watermarks deter what tracking can only observe — so one pipeline does both: each recipient's copy is stamped with their own name, uploaded as its own tracked document, and shared through their own link. Four chained API calls per name, result URLs flowing straight into tracking, no downloads between.
Watermark Draft PDFs via Claude Before Sharing
The draft that leaks is the one you didn't stamp. Conversationally it's one message: the agent designs the translucent DRAFT — CONFIDENTIAL stamp itself with the PDF generator, overlays it across every page, renders a page to prove it looks right — and mints one named copy per reviewer.
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