ScreenshotNeo

BlogComparisons

Browserless Review: How Good Is It for Scraping and Automation?

Browserless offers managed browsers, REST APIs and BrowserQL. Here’s how its interfaces, limits and usage based pricing fit scraping and automation work.

By the ScreenshotNeo team29 September 202610 min read

Browserless Review: How Good Is It for Scraping and Automation?

Browserless is managed browser infrastructure for developers. You can connect existing Puppeteer or Playwright code to remote browsers, use BrowserQL for browser automation, or call REST endpoints for bounded jobs such as page extraction, screenshots, PDFs, and crawling. It is a practical option when your workflow needs a real browser and you do not want to run that browser infrastructure yourself. It is not one interchangeable scraping API: each interface has different state and workflow limits.

Short verdict: Browserless is worth evaluating for JavaScript-rendered pages, browser-driven workflows, and multi-step automation. REST is convenient for one request and one result; use a stateful browser session for flows that need clicks, form entry, or cookies to persist. Browserless documents bot protection features, but that does not guarantee a protected site will allow your request. For static pages, ordinary HTTP requests may be simpler. That last point is an engineering inference from the job each interface is designed to do, not a measured comparison.

This is a documentation-based review, not a hands-on benchmark. No comparative performance, reliability, or success-rate figures are claimed here. Confirm current plan details and test your own targets before committing to a workload.

1. What Browserless includes

Browserless provides hosted headless browser sessions, REST and GraphQL interfaces, and private deployment or self-hosting options. Its overview distinguishes BaaS (Browsers as a Service) for existing Puppeteer and Playwright scripts, BrowserQL/BAP for browser automation, and REST for single-action tasks. See the official Browserless overview and connection URL reference.

A stateful browser session can carry cookies across a multi-step flow; separate REST calls do not share browser state.
A stateful browser session can carry cookies across a multi-step flow; separate REST calls do not share browser state.
Interface Good fit Important constraint
REST One-shot rendered content, selector extraction, screenshots, PDFs, or crawling Each request is a single action; it does not retain browser state between requests.
BaaS Porting an existing Puppeteer or Playwright workflow to remote browsers Sessions stay open until closed or timed out and can continue consuming browser time.
BrowserQL/BAP New automation workflows using Browserless’s automation interface and vendor-described stealth or CAPTCHA capabilities Test against your intended sites; feature availability does not guarantee access.
Private deployment or Docker Teams that need more deployment control You still own browser operations and maintenance to the degree required by your deployment.

REST endpoints cover tasks such as rendered HTML, CSS-selector extraction, screenshots, PDFs, downloads, and browser functions. The documentation describes REST as stateless: cookies and session state are not preserved after an independent response. A normal REST call is therefore not the right tool for “log in, click through two pages, then extract a result.” Choose BaaS or a suitable BrowserQL workflow for that kind of sequence. See REST API overview.

2. How to connect an existing Playwright script

If your team already has a Playwright script, BaaS can minimize changes: connect to Browserless instead of launching a local browser. The example below uses Playwright’s CDP connection mode, which the Browserless quickstart documents for its default Chromium endpoint. Install playwright-core, set the token in the environment, then run the script with Node.js.

npm install playwright-core

# Set BROWSERLESS_TOKEN in your shell before running this file.
# Example: export BROWSERLESS_TOKEN=your_token

import { chromium } from "playwright-core";

const token = process.env.BROWSERLESS_TOKEN;
if (!token) throw new Error("Set BROWSERLESS_TOKEN first");

const browser = await chromium.connectOverCDP(
  `wss://production-sfo.browserless.io?token=${encodeURIComponent(token)}`
);

try {
  const context = browser.contexts()[0] ?? await browser.newContext();
  const page = await context.newPage();
  await page.goto("https://example.com", { waitUntil: "domcontentloaded" });
  await page.locator("h1").waitFor();
  console.log(await page.locator("h1").innerText());
} finally {
  await browser.close();
}

Closing the browser in finally matters: Browserless says abandoned sessions remain open until timeout and may continue to consume billable time. Keep the browser session around for a multi-step flow rather than reconnecting between each page if you need its cookies or browser state. Reconnecting counts as a new browser connection under the pricing model. The code follows the documented connection pattern; consult the Playwright connection guide for protocol alternatives and current endpoint details.

Puppeteer and protocol compatibility

Browserless BaaS supports Puppeteer, Playwright, and other CDP-oriented clients such as chromedp and Pyppeteer. The route must match the protocol the client expects. For example, Playwright’s connectOverCDP works with the default CDP endpoint; Playwright’s native connect expects a Playwright protocol endpoint. Selenium and WebDriver are not supported in BaaS v2 because that path uses Chrome DevTools Protocol rather than WebDriver. If your language lacks a compatible CDP client, consider a plain HTTP REST endpoint for a bounded one-shot task. See BaaS documentation.

3. Use REST when a single browser action is enough

For example, a screenshot request is an HTTP POST with a URL and optional screenshot options. The endpoint returns image bytes; the output flag saves them to disk. This avoids opening a WebSocket session in your application.

A browser can render JavaScript and trigger lazy-loaded content before capture, but the workflow must wait for the content it needs.
A browser can render JavaScript and trigger lazy-loaded content before capture, but the workflow must wait for the content it needs.
curl -X POST \
  "https://production-sfo.browserless.io/screenshot?token=YOUR_API_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"url":"https://example.com/","options":{"fullPage":true,"type":"png"}}' \
  --output screenshot.png

REST can also return rendered content or structured extraction, depending on the endpoint. For screenshots, documented options include full-page capture, output type, quality, clipping, viewport size, device scale factor, and element-specific selectors. Shared request configuration includes waiting for events, selectors or timeouts, navigation options, rejecting resource types or request patterns, and continuing after some wait errors using bestAttempt. Read the endpoint’s current schema before relying on a specific option.

For more involved automation, a REST endpoint is not a substitute for keeping a browser alive. Calls do not share cookies or page state. A REST screenshot is a single capture; an authentication flow with clicks and form fills needs a stateful route.

4. Can Browserless scrape JavaScript-heavy or protected pages?

A managed browser can render client-side JavaScript and expose the resulting page content to a scrape or screenshot endpoint. Browserless also describes stealth, proxies, and CAPTCHA-related capabilities in its product documentation. These are tools to test, not a promise that every site will work. Its REST documentation warns that advanced fingerprinting and interactive CAPTCHAs can still block requests. Treat a CAPTCHA, access-denied page, or empty result as a failed job and inspect the actual response or captured page before accepting the output.

Use the least complex path that handles the target. For a public page that renders normally, start with REST or a normal HTTP client if browser rendering is unnecessary. For a multi-step authenticated process, use BaaS or an appropriate BrowserQL workflow. If a target blocks automation, check that you are permitted to access it and test documented options against a representative sample; do not assume stealth or a proxy removes site restrictions.

5. Cost: browser time, proxy traffic, and CAPTCHA solves

Browserless uses units. The pricing page defines one unit as a block of browser time up to 30 seconds per browser connection; longer sessions use an additional unit for each additional 30 seconds, and a reconnect counts as a new connection. The page also lists residential proxy traffic at 6 units per MB, datacenter proxy traffic at 2 units per MB, and 10 units per successful CAPTCHA solve. These figures come from the Browserless pricing page; terms and plan prices can change.

The dossier’s pricing snapshot showed a Prototyping plan at $25/month when accessed on September 29, 2026. Treat that as a dated reference, not a quote. Check the live page for included units, concurrency, overage rates, and plan terms before estimating spend. A useful estimate requires your own workload data: session duration, reconnect frequency, proxy bandwidth, successful CAPTCHA solves, and failure behavior. There is no sound per-page price without those inputs.

  • Close each browser when its work is complete, including on exceptions.
  • Set a suitable connection or session timeout so a hung script does not leave a browser running.
  • Reuse a session for a multi-step workflow when state must persist; account for the time it remains open.
  • Track proxy use and CAPTCHA solves separately from browser time.
  • Measure unit consumption for representative runs before setting a production budget.

6. Reliability, latency, and deployment choices

Managed infrastructure shifts browser deployment and scaling work to a service, while self-hosting gives more infrastructure control and adds operational responsibility. Neither model removes the need to handle navigation errors, blocked pages, timeouts, and malformed data in application code. Browserless recommends choosing a region near the target sites because distance can affect latency. That is a deployment consideration, not a measured latency claim.

For a fair evaluation, run a small, repeatable workload on pages you are allowed to access. Record the date, plan, region, client and browser protocol, target pages, task steps, proxy or stealth settings, completion rate, latency, and unit use. Separate navigation failure from selector failure and from a page that loaded a challenge. Without those controls, a comparison of “fastest” or “most reliable” services would be misleading.

7. Troubleshooting common problems

Symptom Likely cause What to try
Authentication or connection rejected Missing, invalid, or incorrectly encoded token; wrong region or protocol endpoint Check the token and endpoint shown in the account and docs. Encode query values and use the protocol-specific connection method.
Playwright connection fails immediately Using connect against a CDP endpoint, or a native endpoint with a mismatched client version Use connectOverCDP with the default CDP URL. Use the native /playwright path only with the matching protocol and version guidance.
Screenshot is blank, blocked, or shows a CAPTCHA Target-side bot checks, blocked navigation, or capture before useful content rendered Inspect the captured page and status, wait for a meaningful selector, and evaluate the documented anti-bot route for a permitted use case. Do not assume it guarantees access.
Content is missing on long pages Lazy-loaded sections have not entered the viewport For the screenshot API, use documented scrollPage behavior with full-page capture where appropriate; wait for the target content and verify the output.
Cookies disappear between requests REST calls are stateless Keep the flow in one stateful browser session or pass supported cookies explicitly for the individual task.
Usage is higher than expected Long-lived sessions, reconnects, proxy bandwidth, or successful CAPTCHA solves Close sessions in finally, add sensible timeouts, reduce unnecessary reconnects, and inspect unit usage against your run logs.
Requests queue or fail under load Concurrency limit, session cap, or transient target errors Check plan limits, control your own concurrency, and add bounded retries with backoff for transient failures. Avoid retrying permanent errors indefinitely.

8. ScreenshotNeo alternative for screenshot jobs

If your task is specifically to produce website screenshots or PDFs, ScreenshotNeo is the alternative to try first: it focuses on clean captures, bills only clean shots, and its lowest paid plan starts at $5. It is a website screenshot API and MCP server from Yorker Media. It is not a replacement for a general purpose stateful browser when your application needs arbitrary browser automation.

Or skip the browser setup: one GET request returns an image or PDF. The example below requests a WebP screenshot; see the ScreenshotNeo API documentation for available parameters.

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

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 accepts cookie and consent banners like a visitor, then removes 60+ known consent platforms, newsletter popups, and chat widgets; each step can be turned off. Bot checks, blank pages, timeouts, failed loads, and cache hits are not billed, and response headers report the page verdict and billing status. Its MCP server exposes take_screenshot, get_page_info, and capture_pdf for Claude, Cursor, and other MCP clients. The free plan includes 1,000 screenshots a month with no card; paid plans start at $5 for 3,000 screenshots. Every feature is available on every plan.

Sign up free for 1,000 screenshots a month, with no card required.

9. Who should choose Browserless?

Browserless is a reasonable candidate if your code already uses Puppeteer or Playwright, your target requires JavaScript rendering, or the task needs a persistent browser session. Its REST endpoints can simplify one-shot extraction and media generation. Consider other approaches when a plain HTTP request can do the job, when the workflow requires a protocol Browserless does not support, or when your team cannot accommodate unit-based usage and browser session operations.

The decision should come from a representative trial rather than a feature checklist alone. Confirm protocol compatibility, state needs, target behavior, region, concurrency, and the real unit consumption of completed jobs. The documentation explains what interfaces are available; it does not establish independent performance or universal site access.

FAQ

Does Browserless work with Selenium?

Not through BaaS v2, which uses CDP rather than WebDriver. Consider a compatible CDP client or a REST endpoint for a task that fits one request.

Does the REST API preserve login state?

No. Independent REST calls are stateless. Keep a multi-step flow in a stateful browser session.

Can I self-host Browserless?

Browserless documents Docker-based self-hosting and private deployments. Self-hosting gives deployment control but leaves browser infrastructure operations with your team.

Is Browserless the right choice for every scrape?

No. If the page is static and accessible with ordinary HTTP, a browser may add unnecessary setup and cost. Use a browser when the page or workflow actually needs one.