The Cloudflare screenshot alternative
with batteries included
Cloudflare Browser Rendering rents you a raw headless browser — the pipeline around it is yours to build. Microlink returns a finished capture: cookie banners and ads removed by default, a built-in residential proxy for blocked pages, and a CDN-hosted URL you can embed anywhere.
Microlink
curl 'https://api.microlink.io?url=https://example.com&screenshot'Returns a CDN-hosted URL — cookie banners already gone.
Cloudflare Browser Rendering
curl -X POST \
'https://api.cloudflare.com/client/v4/accounts/{account_id}/browser-rendering/screenshot' \
-H 'Authorization: Bearer {api_token}' \
-H 'Content-Type: application/json' \
-d '{"url": "https://example.com"}' \
--output screenshot.pngReturns raw binary — storing, caching, and serving it is on you.
No token, no account — try it right now, even on cloudflare.com itself:
Why Developers Switch
The top reasons teams pick Microlink over Cloudflare's screenshot endpoint.
A screenshot URL, not a browser rental
Cloudflare's endpoint is an authenticated POST that returns raw binary — your API token can never touch a browser tag, so every capture routes through your backend, and storing, caching, and serving the image is your job. Microlink returns a CDN-hosted URL you can drop straight into an image tag.
Popups and cookie banners gone by default
Microlink ships adblock enabled by default: ads, trackers, and cookie consent banners are stripped before the page renders. On Cloudflare you get rejectRequestPattern and addScriptTag — the blocklists and consent-dismissal scripts are yours to write and maintain.
A proxy Cloudflare will never ship
When a target blocks datacenter traffic, Microlink signals EPROXYNEEDED and proxy: true reroutes the request through auto-rotating residential IPs, with antibot detection for 30+ providers — Cloudflare included. Cloudflare sells the bot protection those walls are made of; its own docs state the configurable user agent "does not bypass bot protection".
One request, the whole platform
A single API call can return the screenshot, the PDF, the metadata — title, description, logo, brand image — and even markdown, all at the same per-request price with no token juggling. On Cloudflare, each of those is a separate endpoint call, billed as separate browser time.
Presentation-ready output, not raw pixels
Browser chrome overlays with light/dark themes and custom backgrounds, dark-mode capture, named device presets like iPhone 15 Pro Max, and animated MP4/WebM recordings — all parameters, not projects. Cloudflare's endpoint exposes viewport numbers and PNG/JPEG.
A free tier with zero setup
Microlink gives you 25 free requests per day — no account, no API token, testable from the browser address bar. Cloudflare's free tier needs an account ID plus a scoped API token, and caps you at 10 minutes of browser time per day and 1 request every 10 seconds.
Open-source core, fully auditable
Browserless, Metascraper, and MQL are MIT licensed — the engine behind every capture is public code you can read, fork, or self-host. Browser Rendering is a closed managed service inside the Cloudflare platform.
One request price.
Everything included.
Microlink bills finished screenshots. Cloudflare bills browser-minutes and concurrency — and the pipeline around them is yours to build.
Microlink
$49/mo
46,000 requests/month
- One request can return screenshot, PDF, metadata, logo, and markdown together
- Adblock and cookie-banner removal on by default
- Built-in residential proxy and antibot detection
- TTL caching up to 31 days — cache hits don't spend your quota
- No concurrency limit* and no per-minute cap
- Free: 25 requests/day, no credit card, no expiry
- 330+ edge nodes, 99.9% SLA
- ~$0.00107/request on this tier
Cloudflare
$5/mo + usage
Workers Paid + browser time
- 10 browser-hours/month included, then $0.09/hour
- 10 concurrent browsers (averaged), then $2.00/browser
- Quick Actions capped at 10 requests/second
- Storage, caching, and delivery are your build (R2, Cache API)
- Free plan: 10 min/day of browser time, 1 request every 10s
The usage trap: same 46,000 captures, very different bills
Cloudflare charges browser time plus concurrency — and concurrency is billed on your daily peak, averaged over the month. The shape of your traffic moves the bill more than the volume does.
| Scenario | What happens | Monthly bill |
|---|---|---|
| Cloudflare — traffic spread evenly | 46,000 captures × ~5s of browser time ≈ 64 browser-hours | ≈ $10/mo |
| Cloudflare — daily batch at 10 req/s | Same volume at Cloudflare's own rate cap holds ~50 browsers open — 40 over the 10 included, at $2.00 each | ≈ $90/mo |
| Microlink — any traffic shape | 46,000 requests, no concurrency limit* and no per-minute cap | $49/mo |
Estimates assume ~5 seconds of browser time per capture at Cloudflare's published rates. The exact number matters less than the shape of the curve: the bill moves with render time and traffic bursts, on top of building storage, caching, and delivery yourself. Microlink's price is the finished capture at a flat per-request rate — and one request can bundle the screenshot with the PDF, metadata, logo, and markdown, while a paid-plan TTL of up to 31 days means cache hits don't spend your monthly quota at all.
* Microlink never bills or caps concurrency on legitimate usage. We only restrict usage that is fraudulent or illegal — for example, traffic aimed at attacking other people's sites.
Ship screenshots, not browser plumbing
Your first 25 requests/day are free — no token, no account, no credit card.
Feature-by-Feature Comparison
A screenshot API and browser infrastructure, side by side.
| Feature | Microlink | Cloudflare |
|---|---|---|
| Screenshot capture | ✓ | ✓ |
| Full-page screenshots | ✓ | ✓ |
| Element-level capture (CSS selector) | ✓ | ✓ |
| Viewport control | ✓ | ✓ |
| PNG / JPEG output | ✓ | ✓ |
| Custom JS injection | ✓ | ✓ |
| Custom CSS injection | ✓ | ✓ |
| Custom HTTP headers | ✓ | ✓ |
| Custom cookies | ✓ | ✓ |
| Wait for selector | ✓ | ✓ |
| Response caching (TTL) Microlink cache hits are free and do not count against your plan. | ✓ | ✓ |
| PDF generation | ✓ | ✓ |
| Markdown conversion | ✓ | ✓ |
| MCP server | ✓ | ✓ |
| Cookie banner removal (on by default) Microlink ships adblock enabled by default, with automatic consent-banner handling. | ✓ | ✕ |
| Ad & tracker blocking engine Cloudflare exposes manual rejectRequestPattern / rejectResourceTypes filters — the blocklist is yours to maintain. | ✓ | Partial |
| Built-in proxy (auto-rotating residential) | ✓ | ✕ |
| Antibot detection (30+ providers) Detected providers include Cloudflare's own bot management. | ✓ | ✕ |
| Hosted capture URLs (CDN delivery) | ✓ | ✕ |
| Direct embed (no backend) | ✓ | ✕ |
| Keyless free tier (no account setup) Cloudflare requires an account ID plus an API token with Browser Rendering permission. | ✓ | ✕ |
| Metadata extraction | ✓ | ✕ |
| Screenshot + PDF + metadata in one request Cloudflare Quick Actions are separate endpoint calls, each billed as browser time. | ✓ | ✕ |
| MQL (structured data via CSS selectors) | ✓ | ✕ |
| Link previews SDK | ✓ | ✕ |
| Browser chrome overlay | ✓ | ✕ |
| Dark/light mode capture | ✓ | ✕ |
| Device emulation presets Cloudflare exposes manual viewport and userAgent values, no named device presets. | ✓ | Partial |
| Animated capture (MP4/WebM) | ✓ | ✕ |
| Signed request URLs | ✓ | ✕ |
| Open-source core | ✓ | ✕ |
| Full browser sessions (Puppeteer / Playwright / CDP) Microlink exposes Puppeteer through the function parameter; Cloudflare offers persistent sessions. | Partial | ✓ |
| Multi-page crawling | ✕ | ✓ |
| AI-prompt JSON extraction | ✕ | ✓ |
| Workers-native bindings | ✕ | ✓ |
Last verified: August 2026. See each product's docs for the latest.
Where Cloudflare
Might Be the Right Choice
You live inside Cloudflare Workers
Workers bindings call the browser directly from your Worker code with no extra auth hop, and compose naturally with R2, KV, and Queues. If your stack is already Workers-native, that gravity is real.
You need a full automation platform
Persistent browser sessions with Puppeteer, Playwright, and CDP support cover testing, scraping flows, and agent automation well beyond captures. Browser Rendering is browser infrastructure, not just a screenshot tool.
Crawling and AI extraction endpoints
The crawl endpoint handles multi-page jobs and the JSON endpoint extracts structured data from a natural-language prompt — both beyond what a screenshot API covers.
Raw compute is cheap at light usage
Workers Paid is $5/month with 10 browser-hours included, then $0.09 per hour. If your captures are quick, your volume is low, and you are happy assembling storage and delivery yourself, the compute bill stays small.
It runs on Cloudflare's network
Captures render on the same global edge platform that fronts much of the web — Microlink would know, since its own CDN is served from Cloudflare edge nodes. For the screenshot use case, though, the network is the starting point, not the finished pipeline.
Ship cleaner screenshots
25 requests/day free — no account, no credit card. One GET request in, one finished capture back.
The following examples show how to use the Microlink API with CLI, cURL, JavaScript, Python, Ruby, PHP & Golang, targeting 'https://www.cloudflare.com' URL with 'screenshot' API parameter:
CLI Microlink API example
microlink https://www.cloudflare.com&screenshotcURL Microlink API example
curl -G "https://api.microlink.io" \
-d "url=https://www.cloudflare.com" \
-d "screenshot=true"JavaScript Microlink API example
import mql from '@microlink/mql'
const { data } = await mql('https://www.cloudflare.com', {
screenshot: true
})Python Microlink API example
import requests
url = "https://api.microlink.io/"
querystring = {
"url": "https://www.cloudflare.com",
"screenshot": "true"
}
response = requests.get(url, params=querystring)
print(response.json())Ruby Microlink API example
require 'uri'
require 'net/http'
base_url = "https://api.microlink.io/"
params = {
url: "https://www.cloudflare.com",
screenshot: "true"
}
uri = URI(base_url)
uri.query = URI.encode_www_form(params)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Get.new(uri)
response = http.request(request)
puts response.bodyPHP Microlink API example
<?php
$baseUrl = "https://api.microlink.io/";
$params = [
"url" => "https://www.cloudflare.com",
"screenshot" => "true"
];
$query = http_build_query($params);
$url = $baseUrl . '?' . $query;
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET"
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #: " . $err;
} else {
echo $response;
}Golang Microlink API example
package main
import (
"fmt"
"net/http"
"net/url"
"io"
)
func main() {
baseURL := "https://api.microlink.io"
u, err := url.Parse(baseURL)
if err != nil {
panic(err)
}
q := u.Query()
q.Set("url", "https://www.cloudflare.com")
q.Set("screenshot", "true")
u.RawQuery = q.Encode()
req, err := http.NewRequest("GET", u.String(), nil)
if err != nil {
panic(err)
}
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
fmt.Println(string(body))
}import mql from '@microlink/mql'
const { data } = await mql('https://www.cloudflare.com', {
screenshot: true
})Is there a Cloudflare screenshot alternative that removes cookie banners automatically?
Yes — that is Microlink's default behavior. The adblock parameter ships enabled, so ads, trackers, and cookie consent banners are stripped before the capture is taken, with automatic consent handling for supported providers.
Cloudflare's screenshot endpoint gives you the raw tools instead: rejectRequestPattern filters and addScriptTag injection. The blocklists and consent-dismissal scripts are yours to write and keep up to date.
Can I embed a Cloudflare Browser Rendering screenshot directly in an image tag?
Not directly. Cloudflare's endpoint is an authenticated POST — the request carries your API token, so it can never run from a browser tag. Every capture has to route through your backend, and storing, caching, and serving the binary is your job.
Microlink screenshots are plain GET URLs that return a CDN-hosted image, so you can drop them into an image tag, a CSS background, or an Open Graph meta tag with no backend at all. See the screenshot docs for the embed patterns.
Why doesn't Cloudflare's screenshot endpoint include a proxy for blocked pages?
Cloudflare is the world's largest bot-protection vendor — the walls that block screenshot requests are often Cloudflare's own product. Its Browser Rendering docs are explicit that the configurable user agent "does not bypass bot protection".
Microlink ships the missing piece: when a target refuses datacenter traffic, the API signals EPROXYNEEDED, and proxy: true reroutes the same request through auto-rotating residential IPs on Pro plans, backed by antibot detection for 30+ providers.
How does Cloudflare Browser Rendering pricing compare to Microlink for screenshots?
The models are different shapes — and the shape of your traffic moves the Cloudflare bill more than the volume does. Cloudflare bills browser time and concurrency on top of a $5/month Workers Paid plan: 10 browser-hours included, then $0.09 per hour, plus $2.00 per concurrent browser beyond 10 — measured on your daily peak, averaged over the month.
At ~5 seconds of browser time per capture, 46,000 captures spread evenly is about 64 browser-hours — roughly $10/month. The same volume as a daily batch at Cloudflare's 10 requests/second cap holds ~50 browsers open at peak, and that concurrency pushes the bill to roughly $90/month — before storage, caching, and delivery, which are separate work.
Microlink bills finished screenshots at a flat rate: $49/month covers 46,000 requests with adblock, proxy routing on Pro, CDN-hosted output, and caching included — a paid-plan TTL of up to 31 days means cache hits don't spend your quota, and there is no concurrency limit or per-minute cap on legitimate usage. A single request can even bundle the screenshot with the PDF, metadata, logo, and markdown, where Cloudflare bills each endpoint call as separate browser time.
How do I migrate from the Cloudflare screenshot endpoint to Microlink?
The capture concepts map one-to-one: url stays url, fullPage becomes screenshot.fullPage, selector becomes screenshot.element, and viewport, waitForSelector, cookies, and setExtraHTTPHeaders all have direct equivalents.
The main change is simpler plumbing: Microlink is a GET request with query parameters instead of an authenticated POST with a JSON body, and the response is a hosted image URL instead of a binary you need to store. Start from the screenshot guide.
What are Cloudflare's screenshot rate limits compared to Microlink?
On the Workers Free plan, Cloudflare allows 10 minutes of browser time per day and 1 Quick Actions request every 10 seconds, with a 60-second browser timeout. The paid plan raises that to 10 requests per second and 120 concurrent browsers per account.
Microlink's free tier is 25 requests per day with no account or token setup, and paid plans have no per-minute cap — you spend your monthly quota at whatever rate your workload needs.
When is Cloudflare Browser Rendering the better choice?
When you need browser infrastructure rather than finished screenshots. If your code already lives in Cloudflare Workers, bindings give you a headless browser with no extra auth hop, and persistent Puppeteer, Playwright, and CDP sessions cover automation well beyond captures.
Its crawling and AI-extraction endpoints also go past what a screenshot API covers. If that is your workload, Browser Rendering is a genuinely different product — this page is about the screenshot use case.
Why is there no live benchmark against Cloudflare on this page?
Microlink's open screenshot benchmark measures dedicated screenshot SaaS providers over identical cold-start runs. Cloudflare's endpoint is account-scoped infrastructure with its own rate limits, so it has not been through that suite yet.
We only publish numbers we have measured — the comparison on this page sticks to documented capabilities, pricing, and limits from each product's own docs.