Cloudflare Browser Rendering vs Screenshot API: Full Comparison
Disclosure: this comparison is published by ScreenshotRun. We build a screenshot API. We'll be honest about where Cloudflare does better.
Cloudflare Browser Run (formerly Browser Rendering) is a service that opens a real browser on Cloudflare's servers and lets you control it remotely. You can take screenshots, generate PDFs, scrape pages, extract text. If your app already runs on Cloudflare Workers (their serverless platform), connecting Browser Run takes a few lines of code.
So why would you pay for a separate screenshot API?
Fair question. Cloudflare is one of the biggest infrastructure companies on the internet. Their Browser Run REST API, added in 2025, means you can take a screenshot without writing any server-side code at all. Just send an HTTP request. For some teams, that's all they need.
For others, it turns into a week of patching things that a dedicated screenshot tool handles out of the box. If you're weighing Cloudflare browser rendering vs a screenshot API, the decision comes down to how much you want to build yourself. This page breaks it down.
Infrastructure vs product: what Cloudflare browser rendering gives you
Browser Run gives you a browser. That's it. What you do with that browser (screenshots, scraping, testing, PDF generation) is up to you.
A screenshot API gives you a screenshot. You send a URL, you get back an image. All the complexity of opening a browser, waiting for the page to load, handling pop-ups, picking the right format. That happens on the API side.
Think of it this way: Browser Run is like renting a professional kitchen to make toast. You can do it, but you're paying for equipment you won't touch. A screenshot API is the toaster.
In 2025, Cloudflare added Quick Actions, a set of simple REST endpoints that handle common tasks without requiring you to write browser automation scripts. The /screenshot endpoint takes a URL and returns a PNG image. On the surface, that looks like a screenshot API. Under the surface, the browser behind it has none of the screenshot-specific features that dedicated tools build in: no cookie banner removal, no ad blocking, no mobile device simulation.
Quick Actions include ten endpoints:
| Endpoint | What it does |
|---|---|
| /screenshot | Capture a page as PNG or JPEG |
| Generate a PDF from a URL or HTML | |
| /markdown | Convert a page to Markdown text |
| /content | Return the page HTML after JavaScript runs |
| /scrape | Pull out specific page elements |
| /json | Extract structured data using AI |
| /links | List every link on a page |
| /crawl | Visit multiple pages automatically |
| /snapshot | Grab several formats in one request |
| /accessibilityTree | Return the page's accessibility structure |
Screenshots are one of ten things Browser Run can do. For Cloudflare, screenshots are a feature. For a dedicated API, screenshots are the entire product. That gap shows up fast once you move past basic captures.
The screenshot endpoint, up close
Taking a screenshot with Browser Run's REST API looks like this. You send a POST request to Cloudflare with your account ID and an API token:
curl -X POST \
"https://api.cloudflare.com/client/v4/accounts/ACCOUNT_ID/browser-run/screenshot" \
-H "Authorization: Bearer CF_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"url": "https://stripe.com",
"screenshotOptions": {
"fullPage": true,
"type": "png"
},
"viewport": {
"width": 1280,
"height": 800
},
"gotoOptions": {
"waitUntil": "networkidle0"
}
}'
You get back a PNG file. For a straightforward capture of a public page, this works fine.
The same screenshot with ScreenshotRun:
curl "https://api.screenshotrun.com/v1/screenshots/capture?\
url=https://stripe.com&\
full_page=true&\
format=png&\
width=1280" \
-H "Authorization: Bearer YOUR_API_KEY"
Both give you a full-page PNG of stripe.com. The difference shows up when the page has a cookie consent banner, when it blocks bots, when images load only as you scroll, or when you need the screenshot in WebP format on a mobile screen in dark mode. That's where Browser Run hands you the problem and a screenshot API solves it for you.
Screenshot features Browser Run doesn't include
Browser Run opens a browser. But a browser alone doesn't know how to dismiss cookie pop-ups, block ads, pretend to be a real visitor, or output your screenshot in six different image formats. Those are features you either build yourself or get from a tool that already built them.
| Feature | Cloudflare Browser Run | ScreenshotRun |
|---|---|---|
| Cookie banner removal | Write your own script to find and close it | block_cookies=true |
| Ad blocking | Not available | block_ads=true |
| Chat widget removal | Not available | block_chats=true |
| Bypass bot detection | Not possible. Cloudflare's docs say the browser is "always identified as a bot" | stealth=true |
| Mobile / tablet view | Configure screen size and user agent string manually | device=mobile |
| Dark mode | Inject JavaScript to switch the color scheme | dark_mode=true |
| Output formats | PNG and JPEG only | PNG, JPEG, WebP, AVIF, TIFF, PDF |
| Resize the image | Not available | resize_width / resize_height |
| High-resolution (retina) | Set pixel density manually | retina=true |
| Screenshot from a specific country | Runs on whichever Cloudflare server is closest to you (no choice) | geolocation=US (any country) |
| Proxy | Not available | proxy=true |
| Page metadata in the same call | Requires a separate request to /json | extract_metadata=true |
| Async delivery via webhook | Not available (you wait for the response) | webhook_url for background processing |
| Caching | Not built in | cache_ttl=3600 |
| Hide specific page elements | Write your own CSS to hide them | hide_selectors=[".popup"] |
| Click a button before capture | Write a browser automation script | click_selector=".accept-btn" |
The two areas where Browser Run comes close are CSS and JavaScript injection. Both services let you add custom styles or run custom scripts on the page before the screenshot is taken. Everything else in the table above is something you either build from scratch on Browser Run, or handle with one parameter on a dedicated screenshot API.
Take cookie banners. On ScreenshotRun, you add block_cookies=true and the service detects and removes consent pop-ups automatically. It knows the markup patterns used by Quantcast, Termly, CookieBot, Osano, and about a dozen other consent tools. On Browser Run, you write a script that finds the "Accept" button and clicks it. That script breaks every time a site redesigns its cookie dialog. I've seen teams update these scripts every few weeks just to keep their screenshot pipeline running.
Bot detection is an even bigger gap. Cloudflare Browser Rendering's own documentation says the browser is "always identified as a bot regardless of user agent configuration." If the site you're trying to capture uses any kind of bot protection (and yes, that includes Cloudflare's own bot protection), you'll get a security challenge page instead of a screenshot. A dedicated API with a stealth mode (a way of making the browser look like a regular visitor rather than an automated script) handles most of these sites. Not all of them, but the vast majority.
What does Cloudflare browser rendering actually cost?
The pricing looks simple until you do the math.
Free tier: 10 minutes of browser time per day. Up to three browsers running at once. You can start one new browser every 20 seconds. In practice, that's about 100-200 screenshots per day if each one takes 3-5 seconds. Enough to experiment with. Not enough to power anything real.
Paid tier ($5/month for Cloudflare Workers): 10 hours of browser time per month included, up to 10 browsers running in parallel. After the included hours, you pay $0.09 for each additional browser hour. If you use Browser Run through code in a Worker (rather than the simple REST API), extra parallel browsers cost $2.00 each per month on top of that.
Numbers for a real workload. Say you capture 5,000 screenshots per month and each one takes 5 seconds:
5,000 x 5 seconds = 25,000 seconds = about 7 browser hours. That fits inside the included 10 hours. Total cost: $5/month. Hard to argue with that.
But 5 seconds per screenshot is optimistic. Pages with lots of JavaScript tend to take closer to 10 seconds. Full-page screenshots of long pages can hit 15-20 seconds. If your average creeps up to 10 seconds: 5,000 x 10 = about 14 hours. That's 4 over the free limit, adding $0.36. Still cheap at $5.36.
Now scale to 50,000 screenshots per month at 10 seconds each: about 139 browser hours. Subtract the included 10, multiply the rest by $0.09 = $11.60 + the $5 base = $16.60/month.
ScreenshotRun's Pro plan gives you 15,000 screenshots for $29/month. For 50,000 you'd be on the Growth plan at $79/month. On raw per-screenshot cost, Browser Run wins at high volume, if you don't need any of the features in the table above and you're comfortable building and maintaining the pipeline yourself.
Honestly, the cost nobody tracks is developer time. Writing the cookie-blocking script. Building retry logic for when captures time out. Converting PNG to WebP because Browser Run only outputs two formats. Debugging why your screenshot came back as a bot challenge page. One afternoon of that kind of work costs more than a year of API fees.
Four cases where Browser Run wins
We'd be dishonest if we skipped this part. For certain situations, Browser Run is the better choice.
The strongest case is when your app already lives on Cloudflare Workers. If you need occasional screenshots as part of a bigger workflow (scrape a page, capture it, pull out the text, save it), Browser Run keeps everything under one roof. No calls to an outside service, no extra network delay, no second vendor to manage.
It also wins when screenshots are just one piece of what you're doing. The /scrape, /markdown, /json, and /crawl endpoints cover jobs that a screenshot API doesn't do at all. If you need to extract structured data from a page and take a screenshot of it in the same workflow, one service handles both.
Sometimes you need full control over the browser. Filling out login forms, clicking through a multi-step checkout, waiting for a specific event before capturing. These things require writing browser automation code. A screenshot API gives you parameters. Browser Run gives you a full session where you can run whatever scripts you need.
And if your needs are small and your target sites are straightforward, the free tier is genuinely hard to beat. Under 200 daily screenshots of public pages without cookie banners or bot protection? Free, no credit card, no commitment.
When a Cloudflare browser rendering alternative makes sense
Browser Run becomes the wrong tool when you need screenshots to work reliably across many different websites without building that reliability yourself.
Cookie banners, ad pop-ups, chat widgets, images that only load when you scroll to them, bot detection walls, dark mode, mobile and tablet views, WebP output, image resizing, webhook delivery, caching. That's eleven separate problems. In a dedicated screenshot API, each one is already solved. In a Browser Run pipeline, each one is a project.
I've talked to developers who started with Browser Run because the free tier was attractive. They spent a week writing a script that handled retries, closed cookie pop-ups, set up the right screen sizes, and recovered from timeouts. Then a website updated its consent dialog and the screenshots broke. Then another site started showing Cloudflare security challenges to their browser, a browser that was running on Cloudflare's own servers.
Blocked by Cloudflare while running on Cloudflare. That one stings.
A dedicated screenshot API exists because these rendering problems are worth solving once, by a team that deals with them every day across thousands of different sites, instead of solving them from scratch in every project.
ScreenshotRun's free tier gives you 200 screenshots per month in any format, with every feature turned on. No server to set up, no automation scripts to write, no browser hours to watch. One request, one image.
curl "https://api.screenshotrun.com/v1/screenshots/capture?\
url=https://stripe.com&\
full_page=true&\
format=webp&\
block_cookies=true&\
device=mobile&\
dark_mode=true" \
-H "Authorization: Bearer YOUR_API_KEY"
Six parameters. Mobile view, dark mode, full page, WebP format, cookie banners removed. Getting the same result from Browser Run means writing about 40 lines of browser automation code and deploying it as a Cloudflare Worker.
Try both on the same URL. The screenshot quality, the amount of code you had to write, and the time it took will tell you everything this page can't.