Zenrows
Talk to sales Start free

Browser Sessions

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.

Formerly Scraping Browser, now Browser Sessions.

What you'd manage without Browser Sessions

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?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?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

Build any flow from browser actions.

Navigate, fill, click, wait, screenshot, evaluate. Compose them in any order to handle any page.

  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?apikey=…"
  )
Playwright Node.js
import { chromium } from "playwright";

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

const browser = await puppeteer.connect({
  browserWSEndpoint: "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?apikey=YOUR_KEY

Free plan. 5,000 credits every month. No driver install. No SDK lock-in.