Watermark anything, via API or no-code.
Drop a file in the editor or hit one endpoint from your code. Image, video, and PDF watermarks at production scale — burned into pixels, not metadata.
Upload Image, Video, or PDF
Click here to open the processing workspace
- No signup for the editor
- Sub-second image latency
- Free tier · 100 calls/mo
How it works
From upload to watermarked, in one call
Whether you have ten files or ten thousand, the flow is the same.
Features
Everything you need to ship watermarking
No glue code, no FFmpeg containers, no ImageMagick CVEs.
Text & image overlays
Drop text or upload a logo. Full control over font, color, opacity, rotation, and per-edge padding.
Drag to position
Nine presets, freeform drag, or fractional coordinates from the API. Pixel-perfect placement.
Tiled / diagonal
Repeat the watermark across the whole canvas with configurable angle and gap — crop-proof protection.
Opacity & blend
Subtle from 5% to bold at 100%. Preserves alpha channels and original color profiles.
Sync + async
Images and PDFs return instantly. Videos queue on dedicated FFmpeg workers — poll for progress.
Batch processing
Upload up to 20 files in one call, get a ZIP back. Or fire 10k calls in parallel from the API.
Clean REST API
One endpoint per format. Multipart for files, JSON for jobs. Same shape across cURL, Node, Python.
Tracked & metered
Every request is logged with status, latency, file size, and source. Dashboard or via the usage API.
Developer-first
One endpoint. Any language.
POST a file and a config. Get a watermarked file back. No SDK lock-in — works the same from cURL, fetch, requests, Go, anything that speaks HTTP.
- API key auth · per-key rate limits
- Multipart for files, JSON for video jobs
- Same params across image, video, PDF
- Webhook-style polling for async jobs
- Usage logged per call with latency + size
- OpenAPI spec at /api/openapi.json
curl -X POST https://api.apiwatermark.com/watermark \
-H "Authorization: Bearer aw_••••••••" \
-F "image=@photo.jpg" \
-F "text=© MyBrand" \
-F "position=bottom-right" \
-F "opacity=0.5" \
-o watermarked.jpgconst form = new FormData();
form.append("image", file);
form.append("text", "© MyBrand");
form.append("position", "bottom-right");
const res = await fetch("https://api.apiwatermark.com/watermark", {
method: "POST",
headers: { Authorization: `Bearer ${API_KEY}` },
body: form,
});
const watermarked = await res.blob();import requests
with open("photo.jpg", "rb") as f:
res = requests.post(
"https://api.apiwatermark.com/watermark",
headers={"Authorization": f"Bearer {API_KEY}"},
files={"image": f},
data={"text": "© MyBrand", "position": "bottom-right"},
)
open("watermarked.jpg", "wb").write(res.content)Use cases
Built for real workflows
Photographers
Stamp proofs before sending galleries. Batch 200 photos, get a ZIP, deliver client-safe previews.
200 photos → batch endpoint → ZIP
E-commerce platforms
Auto-brand every product image on upload. One API call between your CDN and your storage.
Image uploaded → API → branded image stored
Document platforms
Burn the viewer's email + IP into every page of a PDF before serving it. Audit-trail built in.
User opens PDF → stamp with their email → serve
Start watermarking in 60 seconds
Free up to 100 calls a month. No credit card. Drop a file in the editor or hit the API right now.