October 14, 2026 12 min read 2,535 words

Orshot vs Bannerbear: Best Image Watermarking API (2026)

Rishi Raj Jain
Rishi Raj Jain @rishi_raj_jain_

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, and hidden
  • 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.

Thanks for reading

If this was useful, sharing it on X helps a lot. Spotted a typo or want to push back? DM me.

More posts

1 post