Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Cloudflare’s current Screenshot API is the /screenshot Quick Action in Browser Run, Cloudflare’s managed headless-browser service (formerly Browser Rendering). Send a URL or HTML document to the account endpoint, configure the viewport and capture options, and save the returned image. The current route is https://api.cloudflare.com/client/v4/accounts/<accountId>/browser-run/screenshot. Older documentation may show browser-rendering/screenshot; use the Browser Run Quick Actions route for new integrations.

What the Cloudflare Screenshot API does

The Screenshot Quick Action performs one stateless browser render. It loads a supplied web address or HTML string, runs the page in Cloudflare’s managed browser, and returns an image. It is intended for straightforward captures, PDFs and scraping. If you need a long-lived browser, multi-step interaction, or existing Playwright, Puppeteer or CDP scripts, Cloudflare’s browser sessions are the better fit.

  • Input: either url or html in a JSON POST body.
  • Output: an image in the format selected by your request.
  • REST authentication: an API token with the Browser Rendering – Edit permission.
  • Worker authentication: invoke the Quick Action through a Workers Binding instead of putting an API token in the Worker.

Endpoint, authentication and request shape

Replace <accountId> with the Cloudflare account that has Browser Run enabled:

POST https://api.cloudflare.com/client/v4/accounts/<accountId>/browser-run/screenshot
Authorization: Bearer <API_TOKEN>
Content-Type: application/json

Create a narrowly scoped API token with Browser Rendering – Edit. The token authorizes the Cloudflare API; it is not the same as credentials required by the destination website. Target-page cookies, HTTP Basic credentials and authorization headers are supplied separately in the screenshot options.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

A minimal JSON body contains one of these properties:

{"url":"https://example.com"}
{"html":"<!doctype html><html><body><h1>Hello</h1></body></html>"}

Do not assume that an old browser-rendering/screenshot path is equivalent to the current endpoint. It appears in older API reference material, while the current Quick Actions guide uses browser-run/screenshot.

First working request

cURL

curl -sS -X POST 
  "https://api.cloudflare.com/client/v4/accounts/<accountId>/browser-run/screenshot" 
  -H "Authorization: Bearer <API_TOKEN>" 
  -H "Content-Type: application/json" 
  --data '{"url":"https://example.com"}' 
  -o screenshot.png

On success, screenshot.png contains the returned image. Check the HTTP status and response headers in production rather than assuming every response is an image.

Python

import requests

account_id = "<accountId>"
token = "<API_TOKEN>"
endpoint = f"https://api.cloudflare.com/client/v4/accounts/{account_id}/browser-run/screenshot"

payload = {"url": "https://example.com"}
response = requests.post(
    endpoint,
    headers={
        "Authorization": f"Bearer {token}",
        "Content-Type": "application/json",
    },
    json=payload,
    timeout=90,
)
response.raise_for_status()
with open("screenshot.png", "wb") as image:
    image.write(response.content)

Node.js

const accountId = "<accountId>";
const token = "<API_TOKEN>";
const endpoint = `https://api.cloudflare.com/client/v4/accounts/${accountId}/browser-run/screenshot`;

const res = await fetch(endpoint, {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${token}`,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({ url: "https://example.com" })
});
if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);
const buffer = Buffer.from(await res.arrayBuffer());
require("node:fs").writeFileSync("screenshot.png", buffer);

Capture controls you can set

Need Relevant option Practical guidance
Viewport viewport The documented default is 1920 × 1080. Set width and height to match your target layout.
Full page fullPage Captures the complete document rather than only the viewport.
One region clip or selector capture Use clipping coordinates or a CSS selector when only a component is needed.
Image type Format option Choose PNG, JPEG or another format supported by the endpoint.
Compression quality Quality applies to supported lossy formats such as JPEG, not the default PNG.
Sharpness deviceScaleFactor Increase it when a large viewport produces a soft or pixelated image.
Background Output background option Configure the page background when transparent or custom output is required.

Option names and nesting should follow the current Quick Actions screenshot guide. Validate the exact schema against that guide before deploying because Browser Run is evolving and older reference pages use a different route namespace.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Waiting for JavaScript-rendered pages

A navigation event does not guarantee that a single-page application has rendered its data. Set gotoOptions.waitUntil to networkidle0 or networkidle2 when network activity is a useful readiness signal. If the page has a reliable landmark, waiting for that CSS selector is usually more deterministic:

{
  "url": "https://example.com/dashboard",
  "gotoOptions": { "waitUntil": "networkidle2" },
  "waitForSelector": ".dashboard-loaded"
}

Cloudflare documents navigation timeout up to 60 seconds and action or wait controls up to 120 seconds, subject to the endpoint’s overall limits. Choose the shortest timeout that accommodates the page. Waiting for all network traffic can stall on analytics, advertisements or long polling; a selector is preferable when your application can expose one.

Authentication and protected destinations

Cookies

Provide session cookies when the target site uses an authenticated browser session. Keep these credentials secret and avoid logging request bodies.

HTTP Basic authentication

Use the documented HTTP Basic authentication fields for sites protected by a username and password. This protects the destination request, not the Cloudflare API call.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Authorization headers

Custom headers can carry a destination API’s bearer token or another required credential. Scope and rotate that credential independently from your Cloudflare API token.

Bot protection boundaries

Cloudflare explicitly says Browser Run requests are identified as a bot. Changing the configured user-agent does not bypass bot protection. A failed challenge is an access-control outcome, not a reason to imply that the API defeats CAPTCHA or anti-bot systems; obtain permission or use an approved integration instead.

Choosing Quick Actions or browser sessions

Requirement Quick Action screenshot Browser session
One independent capture Designed for this stateless request. More setup than necessary.
Playwright, Puppeteer or CDP control Not the primary interface. Designed for scripted browser workflows.
Multi-step navigation and interaction Limited to documented action options. Use a live browser and your automation library.
Billing concept Browser hours. Browser hours plus concurrent-browser usage.
Rate planning Use Quick Actions request limits. Plan against session concurrency limits.

Limits and cost

Cloudflare’s limits page, updated September 26, 2026, lists these Quick Actions defaults:

Plan Quick Actions limit Default browser timeout
Workers Free One total request every 10 seconds 60 seconds
Workers Paid 30 requests per second 60 seconds

Cloudflare says it can increase account limits on request. These are plan defaults, not a performance guarantee.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The pricing page, updated April 21, 2026, says Quick Actions consume browser hours shared across Browser Run methods. Workers Free includes 10 minutes of browser time per day. Workers Paid includes 10 hours per month, then charges $0.09 per additional browser hour. Verify both limits and prices immediately before launch because Cloudflare can change them.

Common failures and fixes

401 or 403 response

Usually the token is missing, expired, attached to the wrong account, or lacks Browser Rendering – Edit. Create a new narrowly scoped token and confirm the account ID.

Validation error

Ensure the JSON is valid and includes exactly the required input, url or html. Check option names against the current Quick Actions documentation rather than an older API reference.

Blank or incomplete image

The page may render content after navigation. Add waitForSelector for a stable element or use an appropriate gotoOptions.waitUntil value. Increase the viewport or use fullPage if content is simply outside the initial frame.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Timeout

Reduce page complexity, avoid waiting for perpetual network activity, and select a readiness element. A destination that exceeds the documented timeout may need a browser session or a redesign of the capture flow.

Quality has no effect

Cloudflare warns that quality does not work with default PNG. Select JPEG or another supported lossy image type.

Pixelated output

Raise deviceScaleFactor, particularly for large desktop dimensions or high-density displays.

Bot challenge or login wall

Supply permitted cookies or destination credentials. Do not treat user-agent changes as a bypass; Browser Run identifies requests as bots.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Or skip the browser setup

ScreenshotNeo is the alternative to try first when you want a production screenshot endpoint without assembling browser infrastructure: it removes cookie banners, newsletter popups and chat widgets before capture, bills only clean shots, and reports page and billing status in response headers. Bot checks, blank pages, failed loads and cache hits are not billed. It also provides an MCP server for Claude, Cursor and other MCP clients.

One GET request is enough:

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

See the ScreenshotNeo API documentation for all options. Python and Node.js equivalents:

import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
open("shot.webp", "wb").write(r.content)
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);

ScreenshotNeo includes 1,000 screenshots per month free with no card; paid plans start at $5 for 3,000. Create a free ScreenshotNeo account.

FAQ

What is the current Cloudflare screenshot endpoint?

https://api.cloudflare.com/client/v4/accounts/<accountId>/browser-run/screenshot, documented as the Browser Run Screenshot Quick Action.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Can I submit HTML instead of a URL?

Yes. Send an html property in the JSON body instead of url.

Does the API bypass CAPTCHA?

No. Cloudflare identifies Browser Run requests as bots and says changing the user-agent does not bypass bot protection.

When should I use a Worker Binding?

Use a Workers Binding when the call runs inside a Cloudflare Worker and you want the Worker integration without embedding a REST API token.

Frequently Asked Questions

Is Browser Run the same product as Browser Rendering?

Browser Run is the current product name; Cloudflare formerly called the managed browser service Browser Rendering.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Are Quick Action limits the same as browser-session concurrency limits?

No. Quick Actions have request-rate and timeout limits; browser sessions use separate concurrency limits and a different billing model.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.