DEV Community

Praise James for Zenrows

Posted on Originally published at zenrows.com

The best Browserbase alternative in 2026 for protected web access

This article was originally published on the Zenrows blog. Read the original here: https://www.zenrows.com/blog/best-browserbase-alternative-for-protected-web-access

We benchmarked Zenrows against Browserbase Fetch on four protected targets plus one unprotected page, 100 requests per target at 2 req/s. Zenrows returned 100 percent. Browserbase Fetch returned 62.25 percent across the protected targets and a 403 on all 100 TripAdvisor requests. This covers the results, the cost math, and how to migrate a basic Fetch request.

Benchmark script and CSV results is on GitHub.

The core difference

Browserbase gives agents a real browser to drive, which is right when an agent has to navigate, click, and hold session state. For plain data extraction, running that browser adds a configuration layer you manage, and billing tracks browser time rather than successful data. A failed session still consumes billable browser hours and proxy bandwidth.

Zenrows Fetch uses mode=auto to pick the configuration each target needs and bills only for successful requests.

The cost math on a 40 percent failure rate

10,000 daily page attempts on a Cloudflare-protected site with 40 percent failing consumes about 5,000 browser-hours and 300 GB of proxy bandwidth per month.

  • Browserbase Developer ($20/mo) comes to about $4,196/month for browser execution and proxy bandwidth alone
  • Browserbase Startup ($99/mo) comes to about $3,499/month, same exclusions
  • Zenrows Scale, billed on success, comes to about $622/month at 7.5 million credits, assuming every successful request needs both JS rendering and premium proxies (25x multiplier)

Browserbase's calculation starts from session time and bandwidth you estimate up front. Zenrows starts from successful requests and the config each one needed.

What Zenrows and Browserbase cost

Benchmark results

We run this benchmark on September 24, 2026, each platform on its default config. Zenrows ran mode=auto; Browserbase ran default Fetch, where proxies are disabled by default.

Target Protection Zenrows Browserbase Fetch
IKEA product page Cloudflare 100% 100%
TripAdvisor listings DataDome 100% 0% (403 on all 100)
Walmart product page PerimeterX 100% 100%
Amazon product page Akamai 100% 49%
Python 3.14.7 docs none 100% 100%

Zenrows returned 100 percent across the four protected sites because mode=auto escalated only when a target needed more than the default path. Browserbase Fetch averaged 62.25 percent across the protected targets. The zero on TripAdvisor follows from the default config, which executes no JavaScript and disables proxies. Reaching DataDome-protected TripAdvisor requires browser fingerprinting through the Sessions API, which adds a browser-session layer to a data extraction task.

On response time, Zenrows averaged 5.36s per target against Browserbase's 1.18s. Read that alongside retrieval. Browserbase averaged 0.61s on TripAdvisor while returning 403 on every request, and a faster response only counts if it returns the content.

Migrating a Fetch request

Browserbase Fetch uses a POST to https://api.browserbase.com/v1/fetch with the URL in the JSON body:

# pip install browserbase
import os
from browserbase import Browserbase

bb = Browserbase(api_key=os.environ.get("BROWSERBASE_API_KEY"))

response = bb.fetch_api.create(
    url="https://www.ikea.com/us/en/p/kallax-shelf-unit-white-80275887/"
)
print(f"status code: {response.status_code}")
Enter fullscreen mode Exit fullscreen mode

Zenrows uses a GET to https://api.zenrows.com/v1/ with config as query parameters:

# pip install requests
import os
import requests

API_KEY = os.environ.get("ZENROWS_API_KEY")
TARGET_URL = "https://www.ikea.com/us/en/p/kallax-shelf-unit-white-80275887/"

params = {
    "url": TARGET_URL,
    "apikey": API_KEY,
    "mode": "auto",  # adapts config to the target's protection level
}

response = requests.get("https://api.zenrows.com/v1/", params=params)
print(f"status code: {response.status_code}")
Enter fullscreen mode Exit fullscreen mode

The migration changes the endpoint, auth, HTTP method, and parameters. The target URL and how you handle the returned content stay the same. Zenrows keeps protected retrieval and structured output inside the Fetch workflow, where Browserbase splits them across Fetch and Extract.

Driving a browser when you need one

When a page needs browser interaction, Zenrows Browser Sessions connects over CDP through Playwright.

# pip install playwright
# playwright install chromium
import os
from playwright.sync_api import sync_playwright

API_KEY = os.environ.get("ZENROWS_API_KEY")
connection_url = f"wss://browser.zenrows.com?apikey={API_KEY}"  # remote browser endpoint

with sync_playwright() as p:
    browser = p.chromium.connect_over_cdp(connection_url)
    page = browser.new_page()
    try:
        page.goto(
            "https://www.ikea.com/us/en/p/kallax-shelf-unit-white-80275887/",
            wait_until="domcontentloaded"
        )
        page.locator("body").wait_for()
        print(f"page title: {page.title()}")
    finally:
        browser.close()  # always close the remote session
Enter fullscreen mode Exit fullscreen mode

When Browserbase is the right call

Choose Browserbase when an agent needs to operate a browser rather than retrieve content.

  • Building an agent that navigates, authenticates, and fills forms inside sites
  • You need session replay and visual debugging through Live View and Session Inspector
  • Existing Playwright automation with a custom proxy stack you want to keep
  • Workflows that depend on Chrome extensions or persistent browser state

What's next

Top comments (0)