Screenshot API

Screenshots of the page. Not the cookie banner.

A screenshot API that removes consent walls, sign-in modals and paywall overlays before it captures. Most screenshot APIs succeed 93% of the time and return something usable 69% of the time — we measured it, and fixed it.

93%renders succeedacross a 29-URL benchmark
69%are actually usablethe gap nobody quotes
1 / 29blocked by bot protection7 ruined by consent walls
~2smedian renderp50, viewport capture

See the difference

Left is the page as it loads. Right is what the API returns. No signup, no key.

overlay_mode=off raw
overlay_mode=dismiss clean

The gap nobody quotes

We benchmarked 29 URLs across headless, stealth and headful browsers, from both a residential line and a datacenter address. Every number on this page came out of that run.

Clean by default

Consent walls, sign-in modals, newsletter popups and paywall scrims are removed before capture. Known CMPs are declined properly; anything else is caught by shape — fixed, painted, high z-index, covering the page.

It never clicks Accept

Declining on your behalf for a throwaway render is defensible. Agreeing on your behalf is not. Reject buttons that are really paywall funnels are detected by their own label and skipped in favour of hiding.

Signed URLs

Drop a render straight into an <img src> without publishing an API key to every browser that loads the page. Mint a signed URL server-side and the signature covers every parameter.

The controls you expect

Viewport, device pixel ratio, full-page, PNG / JPEG / WebP, quality, dark mode, locale, timezone, element waits and delays. Sensible defaults so the simple call stays one line.

Built for agents

An MCP server, an OpenAPI description, llms.txt and a machine-readable api-catalog. Your agent can discover and call it without you writing a wrapper first.

Honest about limits

Some pages are behind bot protection and no browser trick gets past them — we tested that too, and say so rather than pretending. You get a clear error, not a picture of a challenge page.

One call

curl -X POST http://localhost:8301/v1/render \
  -H "X-API-Key: $RENDERSHED_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://www.theguardian.com/international"}' \
  -o shot.png
const res = await fetch("http://localhost:8301/v1/render", {
  method: "POST",
  headers: {
    "X-API-Key": process.env.RENDERSHED_KEY,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    url: "https://www.booking.com",
    width: 1440,
    response: "json",   // base64 instead of raw bytes
  }),
});

const png = Buffer.from(await res.arrayBuffer());
import os, requests

res = requests.post(
    "http://localhost:8301/v1/render",
    headers={"X-API-Key": os.environ["RENDERSHED_KEY"]},
    json={"url": "https://www.bbc.com/news", "format": "jpeg", "quality": 80},
    timeout=90,
)
open("shot.jpg", "wb").write(res.content)
<!-- signed server-side; no key reaches the browser -->
<img src="http://localhost:8301/v1/render?url=https%3A%2F%2Fstripe.com&width=1200&sig=..."
     width="1200" height="750" alt="stripe.com" loading="lazy">

Parameters

NameTypeDefaultDescription
urlstring requiredThe page to render. http and https only.
widthint 1440Viewport width, 200–3840.
heightint 900Viewport height, 200–4320.
dprfloat 1Device pixel ratio, up to 3.
full_pagebool falseCapture the whole document, not just the viewport.
formatenum pngpng, jpeg or webp.
qualityint 1–100, for jpeg and webp.
overlay_modeenum dismissoff, hide or dismiss.
block_adsbool trueDrop known ad and tracker requests.
dark_modebool falseRender with prefers-color-scheme: dark.
wait_for_selectorstring Wait for a CSS selector before capture.
delay_msint 0Extra settle time, up to 10000.
localestring en-USBrowser locale.
timezonestring UTCIANA timezone.

Built for agents, not just for people

An agent that can see a page is more useful than one that cannot. Everything needed to discover and call this without a wrapper:

Pricing

Cached renders are free and never count against your quota. They cost us a disk read, so charging for them twice would be charging for nothing.

Free

$0forever

100 / month

  • Viewport capture
  • PNG, JPEG, WebP
  • Overlay removal
  • Signed URLs
  • 24-hour cache

Starter

$9.99/ month

3,000 / month

  • Everything in Free
  • base64 / JSON response
  • 7-day cache
  • Retina (2x) output
  • Email support

Scale

$99/ month

75,000 / month

  • Everything in Growth
  • Full-page capture
  • 4K and 3x output
  • Overage at $0.001 / render
  • Self-hosted option

Questions

What makes this different from other screenshot APIs?

Most of them return the page with the cookie banner still on it. We benchmarked a 29-URL corpus: 93% of renders technically succeeded, but only 69% were images you could actually use. Seven were ruined by consent overlays and exactly one by bot protection. rendershed treats that gap as the product.

Does it click “Accept all” on cookie banners?

Never. It either declines, where a genuine reject control exists, or it hides the banner cosmetically, which consents to nothing. Reject buttons that actually lead to a paid subscription are detected and skipped.

Can it screenshot pages behind bot protection?

Sometimes, and we do not claim otherwise. We measured headless, stealth and headful browsers from both residential and datacenter addresses: the browser makes no difference, the IP makes some, and a small number of sites are simply not renderable. Those return an error rather than an image of a challenge page.

How do I use it in an <img> tag?

Mint a signed URL with POST /v1/sign and use it as the src. The signature covers every parameter, so the URL cannot be edited into a different render, and your API key never reaches the browser.

Is there an MCP server?

Yes. Rendershed exposes an MCP server so an AI agent can render a page and look at it as part of a task, plus an OpenAPI description and llms.txt for discovery.

What does it cost?

Free for 100 renders a month, then $9.99 for 3,000, $39.99 for 20,000 and $99 for 75,000. Cached renders are free and never count against your quota, because serving one costs us a disk read.