Orshot vs Bannerbear: Best Image Watermarking API (2026)
Marketplaces, stock photo sites and apps that host user uploads usually need to watermark images automatically, with a logo in a corner or a line of text like a buyer name or order ID.
You can script it with Sharp or ImageMagick, but then you maintain fonts, placement for every aspect ratio, and a redeploy whenever the logo changes. An image API turns it into one HTTP request: design the watermark once, send each image URL, and get the watermarked file back.
This guide compares Orshot and Bannerbear on price per image, free tier, request format and watermark controls. The short answer: Orshot costs less at every volume and has the better free tier, and Bannerbear fits large batch backfills.
What do you need from a watermark API?
At a minimum, a watermark API should:
- Accept a source image URL and return a hosted output file.
- Let you change the logo, text, and opacity per request, so one template covers light and dark photos.
- Output WebP and AVIF, not just PNG and JPEG, so watermarked images stay small.
- Have predictable pricing: one image, one known cost.
For production use, the options that stand out add:
- A synchronous response: The upload handler gets the watermarked file back in the same request, with no polling or webhook plumbing.
- A free tier that recurs: Enough monthly renders to run staging or a small site without paying.
- No hard stop at the plan limit: If credits run out mid-month, uploads should not start failing.
- Signed render URLs: A URL you can put in an
<img>tag, with expiry and render caps so a leaked link can't drain your credits.
Here's how Orshot and Bannerbear compare before we go deeper:
| Orshot | Bannerbear | |
|---|---|---|
| Entry paid plan | $39/mo for 1,500 credits | $49/mo for 1,000 credits |
| Free usage | 100 credits, refilled every month | 30 credits, one-time trial |
| Credits per watermarked image | 1 | 1 per JPG at scale 1, more for each extra format or scale |
| Out of credits | Optional overage with a spending cap | Requests refused |
| Response | Hosted URL, base64 or binary, in the same request | Async by default, sync endpoint with a 10 s timeout |
| URL-only rendering | Signed Dynamic URLs | Signed Instant URLs |
| Image output formats | PNG, JPEG, WebP, AVIF | JPG, PNG, WebP, AVIF |
| Per-request canvas resize | Not documented | Yes, width and height |
| Watermark overrides per request | Logo, text, opacity, position, size | Logo, text, opacity, position, rotation, visibility |
| API rate limit | 100 to 200 requests/min | 60 requests per 10 s |
And here's how they compare on the watermark properties you can change per request:
| Control | Orshot | Bannerbear |
|---|---|---|
| Opacity per request | logo.opacity |
opacity |
| Position per request | logo.x, logo.y in px |
left, top, plus anchor-point |
| Hide a layer per request | No hidden key, set opacity to 0 |
hidden |
| Source image fit | objectFit, objectPosition |
background-size: cover or contain |
| Text styling per request | Font, size, weight, color, stroke, background | Text, color, size |
What's the best API for watermarking images?
1. Orshot
Orshot is a template-based API for generating images, PDFs, and video. For watermarking, its main difference is that the render call returns the finished file in the same request, so you can watermark inside an upload handler without a queue.
Let's walk through watermarking listing photos for a marketplace.
Design the watermark template
In Orshot Studio, create a template with three layers and give each a parameter ID: photo for the source image, logo for the brand mark, and stamp for an optional line of text. Set the logo's default position and opacity in the editor.
Watermark an image on upload
After a seller uploads a photo, send its URL to the render endpoint and store the result:
const res = await fetch('https://api.orshot.com/v1/studio/render', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${process.env.ORSHOT_API_KEY}`,
},
body: JSON.stringify({
templateId: process.env.ORSHOT_WATERMARK_TEMPLATE_ID,
modifications: {
photo: uploadUrl,
'logo.opacity': '0.4',
stamp: `Listing #${listingId}`,
},
response: { format: 'webp', type: 'url' },
}),
});
const { data } = await res.json();
await sql`UPDATE listings SET image_url = ${data.content} WHERE id = ${listingId}`;
A bare key such as photo replaces a layer's content. A dotted key such as logo.opacity overrides one style property, and the same pattern works for x, y, width, height, and objectFit. Set type to binary or base64 if you'd rather get the bytes back and upload them yourself.
If sources come in different aspect ratios, add size to the response object: a preset such as instagram-story, or exact pixels such as "1080x1350". When the template uses Smart Resize, elements scale together and stay anchored to the edge they were designed against, so a corner logo stays in its corner. scale still applies on top, so "1080x1350" at scale 2 outputs 2160×2700.
If you connect an S3 or Cloudflare R2 bucket, every render is also uploaded there. A failed upload doesn't fail the render: you still get the Orshot URL plus a warning.
Watermark from a URL instead
For pages that render images directly, Dynamic URLs turn the same template into a signed URL:
https://api.orshot.com/v1/studio/dynamic-url/listing-1042.webp?templateId=<TEMPLATE_ID>&photo=<URL-encoded source>&sign=<SIGNATURE>
Each URL can have a render cap and an expiry from 1 hour to never. Resetting the signature invalidates every URL issued with the old one.
How Orshot bills
One render costs one credit. Paid plans start at $39/month for 1,500 credits, then $99 for 5,000, $160 for 20,000, and $349 for 75,000. Annual billing charges 10 months for 12.
- The Free plan refills every month: 100 credits, with the full API at 100 requests/min.
- Overage is opt-in: By default renders stop at the plan limit. Turn on overage and extra renders cost $0.036 (Launch), $0.030 (Grow), or $0.024 (Scale) per credit, with a spending cap you set.
- One format per render: If you need WebP and a JPEG fallback, that's two renders and two credits.
Strengths:
- 100 free renders every month, not a one-time trial, and no Orshot branding on free-plan renders
- Imports existing designs from Canva and Figma, so the brand team's watermark files don't need rebuilding
- Bulk watermarking from a spreadsheet with no code: upload a CSV or Excel file, map columns to template parameters, and failed rows are flagged without stopping the batch
- An MCP server, CLI, and agent skill, so Claude Code or Cursor can build templates and port existing Bannerbear calls
Watch out for:
- A lower rate limit than Bannerbear: 100 requests/min on Free and Launch, 200 on Grow and Scale
Best for: Teams that watermark images inside the upload request and process anywhere from a hundred to tens of thousands of images a month.
2. Bannerbear
Bannerbear is a template-based API for images, animations, and video tools. Its API is asynchronous by default and gives you a few more layout controls per request than Orshot, such as rotating and hiding layers.
Here's the same marketplace example on Bannerbear.
Design the watermark template
In the Bannerbear editor, create an image template with the same three layers, named photo, logo, and stamp.
Watermark an image on upload
The v5 API takes layer changes as an array of objects, each with a name and CSS-like properties. To get the file back in the same request, use the sync host:
const res = await fetch('https://sync.api.bannerbear.com/v5/images', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${process.env.BANNERBEAR_API_KEY}`,
},
body: JSON.stringify({
template: process.env.BANNERBEAR_WATERMARK_TEMPLATE_UID,
formats: ['webp'],
modifications: {
objects: [
{ name: 'photo', 'background-image': uploadUrl, 'background-size': 'cover' },
{ name: 'logo', opacity: 0.4 },
{ name: 'stamp', text: `Listing #${listingId}` },
],
},
}),
});
const image = await res.json();
The sync host returns 408 if the render takes longer than 10 seconds. For anything that can't fail inline, use the default host instead: POST https://api.bannerbear.com/v5/images returns 202, and you poll GET /v5/images/:uid or receive a signed webhook when the image is ready.
If your sources arrive in different aspect ratios, add modifications.template.width and height to the request. The canvas then matches each photo, and one template covers every ratio.
Watermark from a URL instead
Bannerbear's Instant URLs work like Orshot's Dynamic URLs. You append parameters to a template URL, sign it with HMAC, and set rate_limit, max_renders, and expires_at to limit abuse.
How Bannerbear bills
The Automate plan costs $49/month for 1,000 credits. Scale starts at $149/month for 10,000 credits, and Enterprise starts at $299/month for 50,000. The pricing page doesn't list prices for the larger tiers within each plan.
- Credits multiply with formats and scale: One JPG at scale 1 costs 1 credit. WebP plus a JPEG fallback costs 2, and JPG plus PNG at scale 2 costs 4.
- There's no overage: Once credits run out, requests are refused until the next cycle.
- The free trial is one-time: 30 credits, no credit card, and a cap of 3 image templates.
Strengths:
- Canvas width and height can change per request, so one template fits every aspect ratio
- More per-request layout control, with
rotate,anchor-point, andhidden - SSO, audit logs, and zero data retention on the Enterprise plan
- Several output formats from one request, if you're fine paying a credit for each
Watch out for:
- Async by default, and the sync host times out at 10 seconds
- No overage, so uploads fail once the month's credits are gone
- A 30-credit, one-time trial instead of a recurring free tier
Best for: Teams that watermark in background jobs, backfill large photo libraries in batches, or need enterprise controls like SSO and audit logs.
What does it actually cost?
Per-credit prices only tell part of the story, so here are four workloads with the cheapest plan that covers each, on monthly and yearly billing. Every workload renders one WebP per image at scale 1.
| Workload | Images per month | Orshot (monthly) | Bannerbear (monthly) | Orshot (yearly) | Bannerbear (yearly) |
|---|---|---|---|---|---|
| A portfolio or small store | 100 | $0 (Free) | $49 (Automate) | $0 | $588 |
| A marketplace watermarking listing photos | 4,000 | $99 (Launch 5k) | $149 (Scale 10k) | $990 | $1,788 |
| A photo platform with a busy month | 10,000 (overages to 12,000) | $160 (Grow 20k) | 2K overage images fail but $149 (Scale 10k) | $1,600 | $1,788 |
| A high-volume media pipeline | 60,000 | $349 (Scale 75k) | $458 (Enterprise 100k) | $3,490 | $5,496 |
How each total is calculated:
- Portfolio or small store: 100 images fit inside Orshot's 100 free monthly credits. Bannerbear's 30 trial credits are used up in the first month, after which the cheapest plan is Automate at $49.
- Marketplace: On Orshot, Launch 5k at $99 is cheaper than Launch 1.5k plus overage: $39 + (5,000 − 1,500) × $0.036 = $129. On Bannerbear, Automate's 1,000 credits aren't enough, so the next step is Scale at $149 for 10,000.
- Photo platform: Orshot's Grow plan covers 20,000 credits, so both the normal and the busy month fit. Bannerbear's Scale plan covers 10,000 credits and has no overage, so in the busy month the last 2,000 requests are refused. Avoiding that means moving to a larger Scale tier, whose price isn't published.
- Media pipeline: Orshot's next plan above 40,000 credits is Scale at $349 for 75,000. Bannerbear's Enterprise plan starts at $458 for more than 50,000 credits.
A few things to keep in mind:
- Scale costs extra on Bannerbear. A retina image at scale 2 costs 2 credits, and adding a second format doubles that again. A second format costs the same on Orshot, because it means a second render.
- A hard limit is a real cost. If watermarking runs inside your upload flow, refused requests mean failed uploads. Orshot's opt-in overage costs more per image than a bigger plan, but it keeps uploads working while you decide whether to upgrade.
Which watermark API should you choose?
Recommendations by team type
For solo developers, portfolios, and small stores
- Orshot if you watermark around 100 images a month. The Free plan covers that at $0, while Bannerbear's entry plan costs $49 a month, or $588 a year.
For marketplaces and listing sites
- Orshot for a few thousand listing photos a month. At 4,000 images, Launch costs $99 a month or $990 a year, against $149 a month or $1,788 a year on Bannerbear. Renders can also be written to your own S3 or R2 bucket in the same request.
- Bannerbear if you backfill large photo libraries in batches of up to 100 images per request.
For SaaS apps watermarking on behalf of users
- Orshot if upload volume changes from month to month. At 10,000 images with busy months up to 12,000, Grow covers 20,000 credits for $160 a month or $1,600 a year. Bannerbear's $149 plan covers 10,000 credits and refuses the rest, so the extra 2,000 uploads fail unless you move up a tier.
For high-volume media pipelines
- Orshot on cost. At 60,000 images, Scale costs $349 a month or $3,490 a year, against $458 a month or $5,496 a year on Bannerbear's Enterprise 100k tier.
- Bannerbear for batch requests of up to 100 images, a higher rate limit
Frequently asked questions
What's the cheapest API for watermarking images in 2026?
Orshot. It's $0 for 100 images a month, $99 for 4,000, and $349 for 60,000, against $49, $149, and $458 on Bannerbear. Annual billing brings Orshot's price down further, to 10 months for 12, while Bannerbear doesn't offer an annual discount.
Which watermark API has the best free tier?
Orshot. The Free plan gives you 100 renders every month with the full API, and no credit card required. Bannerbear gives you 30 credits once, with a 3-template cap.
Do Orshot or Bannerbear have a dedicated watermark endpoint?
No. Both watermark through templates: a watermark layer above a photo layer that you replace on each request. That's more flexible than a fixed watermark endpoint, because the logo, text, opacity, and position can all change per request.
Can I watermark images without writing backend code?
Yes. Orshot's Dynamic URLs and Bannerbear's Instant URLs render from a signed URL with the source image as a parameter, so an <img> tag is enough.
Can each image get a different watermark?
Yes, on both. Pass a different logo URL or text in each request. This is how you stamp a buyer name or order ID on licensed downloads.
What happens when I run out of credits?
On Bannerbear, requests are refused until the next billing cycle. On Orshot, renders also stop by default, but you can turn on overage at $0.024 to $0.036 per credit with a spending cap.
How do I handle photos in different aspect ratios?
Both APIs resize the canvas per request. On Orshot, pass response.size as "WIDTHxHEIGHT" (or a preset such as instagram-story). With Smart Resize, the watermark stays anchored to the edge it was designed against. On Bannerbear, set modifications.template.width and height so the canvas matches each photo.