Zenrows
Talk to sales Start building free

Browser Sessions · Private Beta

Operate dynamic websites with browser sessions.

Get data from sites that need login, clicks, or scrolling.

Give your agents and workflows a real browser when pages require clicks, forms, login, pagination, session state, or multi-step navigation. Puppeteer, Playwright, any CDP client. Protected Web Access included.

Start building free 20,000 browser minutes/month · No credit card

The thesis

Your code is the driver.

Connect to the WebSocket. The browser does what you ask, in the order you ask. Click. Type. Wait. Read the DOM back.

import { chromium } from "playwright";

const browser = await chromium.connectOverCDP(
  "wss://browser.zenrows.com/connect?apikey=ZR_•••"
);

const page = await browser.newPage();
await page.goto("https://example.com/login");
await page.fill("#email", "you@team.com");
await page.fill("#password", secret);
await page.click("button[type=submit]");
await page.waitForURL("**/dashboard");

return await page.content();
import puppeteer from "puppeteer";

const browser = await puppeteer.connect({
  browserWSEndpoint: "wss://browser.zenrows.com/connect?apikey=ZR_•••",
});

const page = await browser.newPage();
await page.goto("https://example.com/login");
await page.type("#email", "you@team.com");
await page.type("#password", secret);
await page.click("button[type=submit]");
await page.waitForNavigation();

return await page.content();

No drivers. No headless quirks.

The Chromium runs on Zenrows. Your code runs anywhere. Sessions persist, the Protected Network routes, Protected Web Access stays out of the way.

The vocabulary

Six actions. Endless flows.

Navigate, type, click, wait, capture, evaluate. Six verbs that compose into any scrape flow.

  1. 01 goto Navigate to any URL. Anti-bot, proxies, sessions, routed transparently.
  2. 02 fill Type into any input. Forms, search boxes, auth credentials.
  3. 03 click Click any selector. Buttons, links, dropdowns, modals.
  4. 04 waitFor Wait for selector, URL change, or network idle. No race conditions.
  5. 05 screenshot Capture the page. Viewport, full-page, or a specific element.
  6. 06 evaluate Run JavaScript in the page context. Read the DOM, post events.

The session

Sessions persist.

Cookies, auth, open tabs, they stay alive across calls. Build flows that span pages without reconnecting.

  1. POST /auth

    Submit credentials

    The browser fills the form and posts to the auth endpoint.

    page.fill("#email", email);
    page.fill("#password", secret);
    page.click("button[type=submit]");
  2. SET-COOKIE

    The session lives.

    Auth response carries a cookie. The browser holds it. Every subsequent call rides it.

    Set-Cookie: session=abc123…; HttpOnly
  3. GET /dashboard

    Stay authenticated.

    Navigate anywhere on the site. The session cookie rides along, no re-auth.

    page.goto("/dashboard");
    // 200 OK — no redirect to /login
  4. GET /api/report

    Pull the data.

    Hit the authenticated endpoint. Read the response. Done.

    const data = await page.evaluate(
      () => fetch("/api/report").then(r => r.json())
    );

The ecosystem

Already in your stack.

Any framework that speaks CDP speaks to Zenrows. No SDK lock-in. No driver install.

Playwright Python
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
  browser = p.chromium.connect_over_cdp(
    "wss://browser.zenrows.com/connect?apikey=…"
  )
Playwright Node.js
import { chromium } from "playwright";

const browser = await chromium.connectOverCDP(
  "wss://browser.zenrows.com/connect?apikey=…"
);
Puppeteer Node.js
import puppeteer from "puppeteer";

const browser = await puppeteer.connect({
  browserWSEndpoint: "wss://browser.zenrows.com/…",
});
Selenium Python
from selenium import webdriver

opts = webdriver.ChromeOptions()
opts.debugger_address = "wss://browser.zenrows.com/…"
driver = webdriver.Remote(options=opts)
Selenium Java
ChromeOptions opts = new ChromeOptions();
opts.setExperimentalOption(
  "debuggerAddress",
  "wss://browser.zenrows.com/…"
);
Raw CDP Any
const ws = new WebSocket(
  "wss://browser.zenrows.com/…"
);
ws.send(JSON.stringify({
  id: 1, method: "Page.navigate", …
}));

The handoff

Connect the browser.

wss://browser.zenrows.com/connect?apikey=YOUR_KEY

20,000 browser minutes / month, free. No driver install. No SDK lock-in.