Add a logo to a PDF
Every PDF that leaves your system is a chance to remind whoever opens it who made it. This endpoint stamps your logo image onto every page of a PDF automatically — for branding invoices, marking drafts, or claiming exported reports as your own.
Run it online
Run this on our servers with your account. Free tools run in your browser; this one bills your KIT balance per the price above.
Why a logo on the page matters more than it seems
A PDF with no visual branding reads as generic no matter how good the content is — a quote, a report or a contract that could have come from anyone. Sales teams, agencies and platforms that generate documents on behalf of their users all hit the same wall eventually: the output needs to look like it came from somewhere specific. Manually opening every PDF in an editor to drop in a logo does not survive contact with real volume, which is exactly the gap this endpoint closes.
What the watermark actually does to the file
The image you provide is overlaid onto every page of the target PDF at a position, scale and opacity you control — a corner mark for subtle branding, a centered semi-transparent stamp for a DRAFT-style notice, or a full-page background for a more assertive treatment. It's composited into the page content itself, not attached as a separate layer that a viewer might hide, so it survives printing, flattening and most downstream conversions.
How the request works
POST the target PDF and the logo image to /pdf/watermark-image, along with your placement settings. As with every task here, it's asynchronous — you get a task_id back immediately, and the branded PDF is delivered to your signed webhook, or sits behind a signed link valid for 24 hours if you'd rather retrieve it yourself.
Where it plugs into a real system
This step sits naturally at the end of a document-generation pipeline: after an invoice, proposal or report PDF is assembled, this call brands it before it's emailed or stored. Platforms that let end users export PDFs on their behalf often run every export through this endpoint automatically, so branding never depends on someone remembering to add it.
The economics of stamping at scale
It's a flat $0.002 per request, independent of page count, which makes branding thousands of documents a predictable line item rather than a variable one. A failed task after automatic retries is never charged, and neither the logo nor the source PDF is retained past the documented retention window.
What you can do with it
Branding auto-generated invoices
A billing system produces PDF invoices programmatically; this endpoint stamps the company logo onto every one before it reaches a customer's inbox.
Marking draft documents
Legal and finance teams need reviewers to know a PDF isn't final; a semi-transparent logo or seal placed across every page makes that unmistakable.
White-labeling reports for clients
An agency generates reports on behalf of its own clients and applies each client's logo automatically before delivery.
Protecting shared exports
A platform lets users download PDFs of their data; watermarking with the platform's mark discourages uncredited redistribution.
FAQ
How do I add a logo to a PDF via API?
POST your PDF and logo image to /pdf/watermark-image with your placement settings; the branded file returns via webhook or a signed link.
Can I control where the logo appears?
Yes — you set position, scale and opacity, from a small corner mark to a full centered stamp.
Does the watermark apply to every page?
By default it applies across all pages, so branding is consistent regardless of document length.
What image formats work as the watermark?
Common raster formats with transparency support work well, since transparency lets the logo blend naturally into the page instead of sitting as an opaque block.
Is this endpoint free to use?
There's no free tier — free tiers get abused and slow everyone down. Access runs on a prepaid ForHosting KIT balance: top up from $10.00 (it never expires) and each request is charged at its published price, so a call with no balance returns HTTP 402. No subscription, no tokens, no invented credits, and a failed task is never charged.
Will the watermark survive if someone prints the PDF?
Yes, since it's composited into the page content rather than a removable overlay, it prints and flattens along with the rest of the page.
Can I bulk-brand many PDFs at once?
Submit one task per PDF; each is priced and processed independently, so batches scale linearly and predictably.
What if the watermark task fails?
It retries automatically up to three times, and if it still fails you get a clear error with no charge for the attempt.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, and soon from our app, email and Telegram.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/pdf/watermark-image \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"pdf":"https://ejemplo.com/documento.pdf"}'const res = await fetch("https://api.kit.forhosting.com/pdf/watermark-image", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"pdf": "https://ejemplo.com/documento.pdf"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/pdf/watermark-image",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"pdf": "https://ejemplo.com/documento.pdf"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/pdf/watermark-image", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"pdf":"https://ejemplo.com/documento.pdf"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"pdf":"https://ejemplo.com/documento.pdf"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/pdf/watermark-image", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"pdf": "https://ejemplo.com/documento.pdf"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "pdf.watermark_image",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_mb | 25 |
max_pages | 200 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
413 | input_too_large | The file exceeds the size limit. |