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 has the better free tier and costs less at every volume if you pay for a year up front. On monthly billing, Bannerbear is cheaper just below its 10K, 30K, 50K and 100K-credit tiers (25K images a month costs $247 there, against $280 on Orshot), and Orshot is cheaper at every other volume up to 300K. 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, it also helps to have:
- 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. - Batch requests: Backfilling an existing photo library is faster when one request can carry many images.
Here's how Orshot and Bannerbear compare before we go deeper:
| Orshot | Bannerbear | |
|---|---|---|
| Entry paid plan | $39/mo for 1.5K credits | $49/mo for 1K 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, or an async job with a 15-minute limit | 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 | Yes, response.size |
Yes, width and height |
| Watermark overrides per request | Logo, text, opacity, position, size | Logo, text, opacity, position, size, rotation, visibility |
| Batch endpoint | No, one render per request | Up to 100 images per request |
| API rate limit | 100 to 200 requests/min | 360 requests/min (60 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, shadow | Font, size, weight, color, stroke, background, shadow, highlight |
What's the best API for watermarking images?
Orshot
Orshot is a template-based API for generating images, PDFs, and video. Its render call returns the finished file in the same request by default, which suits watermarking inside an upload handler.
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' },
}),
});
if (!res.ok) throw new Error(`Orshot render failed: ${res.status}`);
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 at no extra cost. 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. There are three paid plans, each with a choice of monthly credits: Launch at $39 for 1.5K (or $99 for 5K), Grow at $160 for 20K (or 40K), and Scale at $349 for 75K (or 150K or 300K). 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.
- Your own storage costs nothing extra: Uploading renders to a connected S3 or R2 bucket doesn't use extra 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 for building templates and render calls from tools like Claude Code or Cursor
- Integrations with Zapier, Make, n8n, and Pipedream, plus direct connections to Airtable, Google Sheets, Notion, Shopify, HubSpot, WordPress, Webflow, Slack, Google Drive, and Dropbox
Watch out for:
- A lower rate limit than Bannerbear: 100 requests/min on Free and Launch, 200 on Grow and Scale
- No batch endpoint, so a large backfill is one request per image, paced by that rate limit
- Fewer per-request layout controls: no rotation, and hiding a layer means setting its opacity to 0
Best for: Teams that watermark images inside the upload request and process anywhere from a hundred to tens of thousands of images a month.
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}` },
],
},
}),
});
if (!res.ok) throw new Error(`Bannerbear render failed: ${res.status}`);
const image = await res.json();
await sql`UPDATE listings SET image_url = ${image.files.webp} WHERE id = ${listingId}`;
The finished file's URL is in files, keyed by format. 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.
To backfill an existing photo library, the batches endpoint takes up to 100 image payloads per request: POST /v5/batches with type: "images" and an items array. It's asynchronous, so you poll GET /v5/batches/:uid until every image is done.
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 1K credits. Scale costs $149/month for 10K credits, rising to $198 for 20K, $247 for 30K, and $296 for 40K. Enterprise costs $299/month for 50K credits, then $458 for 100K, $617 for 500K, $776 for 1M, and $1,253 for 2M.
- 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:
- A batch endpoint for up to 100 images per request, for backfilling large libraries
- A higher rate limit, at 360 requests a minute
- More per-request layout control, with
rotate,anchor-point, andhidden - An MCP server, hosted or local via
npx @bannerbear/mcp, and 50+ app integrations on every paid plan - 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
- Instant URLs and custom S3 storage start on the $149 Scale plan
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 six workloads with the cheapest plan that covers each, on monthly and yearly billing. Every workload renders one WebP per image at scale 1. Bannerbear has no annual plan, so its yearly figure is 12 monthly bills.
| 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 | 4K | $99 (Launch 5K) | $149 (Scale 10K) | $990 | $1,788 |
| A photo platform with busy months | 10K (12K in 3 busy months a year) | $160 (Grow 20K) | $149, or $198 in busy months (Scale 10K / 20K) | $1,600 | $1,935 |
| A stock photo site watermarking previews | 25K | $280 (Grow 40K) | $247 (Scale 30K) | $2,800 | $2,964 |
| An agency watermarking client shoots | 45K | $349 (Scale 75K) | $299 (Enterprise 50K) | $3,490 | $3,588 |
| A high-volume media pipeline | 60K | $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 + (4K − 1.5K) × $0.036 = $129. On Bannerbear, Automate's 1K credits aren't enough, so the next step is Scale at $149 for 10K.
- Photo platform: Orshot's Grow plan covers 20K credits, so normal and busy months both fit at $160. Bannerbear has no overage, so its 10K-credit Scale tier at $149 would refuse the last 2K requests in a busy month. Moving up to the 20K-credit tier for the 3 busy months gives 9 × $149 + 3 × $198 = $1,935 a year, about the same as Orshot billed monthly ($1,920). That only works if you see the busy months coming. In a steady 10K-image month with no spikes, Bannerbear's $149 is cheaper than Orshot's $160.
- Stock photo site: Orshot has no plan between 20K and 40K credits, and Grow 20K plus overage costs $160 + 5K × $0.030 = $310, so Grow 40K at $280 is the cheapest option. Bannerbear's 30K-credit tier is $33 a month less.
- Agency: 45K fits Bannerbear's 50K-credit Enterprise tier at $299. On Orshot, Grow 40K plus overage costs $280 + 5K × $0.030 = $430, so Scale at $349 is the cheapest option, $50 a month more.
- Media pipeline: Orshot's next plan above 40K credits is Scale at $349 for 75K. Bannerbear's next tier above 50K credits is Enterprise at $458 for 100K.
On monthly billing, the cheaper option depends on where your volume falls between the two vendors' tiers. Counting Orshot's overage where it beats the next plan up:
| Images per month | Cheaper on monthly billing |
|---|---|
| Up to about 6.4K | Orshot |
| About 6.4K to 10K | Bannerbear |
| 10K to about 23K | Orshot |
| About 23K to 30K | Bannerbear |
| 30K to about 40.6K | Orshot |
| About 40.6K to 50K | Bannerbear |
| 50K to about 79.5K | Orshot |
| About 79.5K to 100K | Bannerbear |
| 100K to 300K | Orshot |
On annual billing, Orshot is cheaper at every volume from 100 to 300K images a month, because it charges 10 months for 12 and Bannerbear has no annual discount. The trade-off is commitment: Orshot's annual price is paid for the year up front, while Bannerbear bills month to month. Above 300K, Orshot's pricing is custom, so compare quotes.
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 (Bannerbear pricing FAQ). On Orshot, a render at scale 2 is still 1 credit. A second format costs the same on both, because on Orshot 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 4K images, Launch costs $99 a month or $990 a year, against $149 a month or $1,788 a year on Bannerbear.- 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 10K images with busy months up to 12K, Grow covers 20K credits for $160 a month or $1,600 a year. Bannerbear's $149 plan covers 10K credits and refuses the rest, so you'd move up to the $198 tier before each busy month. With 3 busy months that's $1,935 a year, and a spike you didn't plan for means failed uploads.
- Bannerbear if volume stays steady around 10K a month. Its $149 Scale tier is a little cheaper than Orshot's $160 Grow plan when there are no spikes to cover.
For high-volume media pipelines
- Orshot on cost at 60K images, where 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 on monthly cost if your volume sits just under one of its tiers. At 25K images it's $247 against Orshot's $280, and at 45K it's $299 against $349. If you pay for a year up front, Orshot still comes out ahead at both.
- Bannerbear for batch requests of up to 100 images and a higher rate limit, at 360 requests a minute against Orshot's 100 to 200.
For teams with enterprise requirements
- Bannerbear if you need SSO, audit logs, or zero data retention, which its Enterprise plan includes from $299 a month.
Frequently asked questions
What's the cheapest API for watermarking images in 2026?
It depends on how you pay. If you pay for a year up front, Orshot is cheaper at every volume from 100 to 300K images a month, because it charges 10 months for 12 and Bannerbear has no annual discount. On monthly billing, the two trade places at each tier boundary. Orshot is $0 for 100 images a month, $99 for 4K, and $349 for 60K, against $49, $149, and $458 on Bannerbear. Bannerbear is cheaper at a steady 10K ($149 against $160), 25K ($247 against $280), and 45K ($299 against $349).
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?
Mostly. Orshot's Dynamic URLs and Bannerbear's Instant URLs render from a signed URL with the source image as a parameter, so the page itself only needs an <img> tag. The signature is created with your secret key, though, so generate each URL on a server or ahead of time, never in browser code.
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.