from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(
"wss://browser.zenrows.com/connect?apikey=…"
)
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.
Behind every login wall, paginated table, or multi-step form is data your team needed yesterday. We drive the browser. You get the answer.
The thesis
Your code is the driver.
Your team gets the answer.
Connect to the WebSocket. The browser does what you ask, in the order you ask. Click. Type. Wait. Read the DOM back.
Tell us what to do. We click, type, wait, and scroll. The page does what your team needed. The answer lands clean.
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();
- OpenAny page, including ones behind a login.
- FillYour team's credentials, into the right boxes.
- ClickThe button that takes the page forward.
- WaitUntil the page is fully ready.
- ReadThe answer your team needed.
No drivers. No headless quirks.
No setup. No fragile scripts.
The Chromium runs on Zenrows. Your code runs anywhere. Sessions persist, the Protected Network routes, Protected Web Access stays out of the way.
The browser runs on Zenrows. Your team works anywhere. Logins stay open, the right network is picked for you, the page just works.
The vocabulary
Six actions. Endless flows.
Every interaction your team needs.
Navigate, type, click, wait, capture, evaluate. Six verbs that compose into any scrape flow.
Open a page. Fill a form. Click a button. Wait for the result. Capture the answer. Run it again next week.
- 01 goto Open Navigate to any URL. Anti-bot, proxies, sessions, routed transparently. Open any website. Login walls, geo-blocks, slow loads, all handled.
- 02 fill Type Type into any input. Forms, search boxes, auth credentials. Type into any input. Forms, search boxes, credentials.
- 03 click Click Click any selector. Buttons, links, dropdowns, modals. Click any button, link, or dropdown. Modals, menus, anything on the page.
- 04 waitFor Wait Wait for selector, URL change, or network idle. No race conditions. Wait until the page is ready. No half-loaded reads.
- 05 screenshot Snapshot Capture the page. Viewport, full-page, or a specific element. Capture the page. Full page, viewport, or any region.
- 06 evaluate Read Run JavaScript in the page context. Read the DOM, post events. Read any value from the page. Numbers, text, lists.
The session
Sessions persist.
Stay logged in. Forever.
Cookies, auth, open tabs, they stay alive across calls. Build flows that span pages without reconnecting.
Log in once. We hold the session for as long as your team needs. Every report, every export, every refresh just works.
-
POST /auth
Sign in
Submit credentials
The browser fills the form and posts to the auth endpoint.
The browser fills the form and signs your team in, the same way a person would.
page.fill("#email", email); page.fill("#password", secret); page.click("button[type=submit]"); -
SET-COOKIE
Session opens
The session lives.
Auth response carries a cookie. The browser holds it. Every subsequent call rides it.
The site signs your team in and the browser stays signed in. Every next page is already authenticated.
Set-Cookie: session=abc123…; HttpOnly -
GET /dashboard
Open dashboard
Stay authenticated.
Navigate anywhere on the site. The session cookie rides along, no re-auth.
Open any page on the site. Your team never has to sign in again for this run.
page.goto("/dashboard"); // 200 OK — no redirect to /login -
GET /api/report
Pull report
Pull the data.
Hit the authenticated endpoint. Read the response. Done.
Pull the report your team came for. The answer lands clean.
const data = await page.evaluate( () => fetch("/api/report").then(r => r.json()) );
The ecosystem
Already in your stack.
Already in your tools.
Any framework that speaks CDP speaks to Zenrows. No SDK lock-in. No driver install.
Lands in Salesforce, HubSpot, Slack, Sheets, Notion. Wherever your team makes decisions.
import { chromium } from "playwright";
const browser = await chromium.connectOverCDP(
"wss://browser.zenrows.com/connect?apikey=…"
);
import puppeteer from "puppeteer";
const browser = await puppeteer.connect({
browserWSEndpoint: "wss://browser.zenrows.com/…",
});
from selenium import webdriver
opts = webdriver.ChromeOptions()
opts.debugger_address = "wss://browser.zenrows.com/…"
driver = webdriver.Remote(options=opts)
ChromeOptions opts = new ChromeOptions();
opts.setExperimentalOption(
"debuggerAddress",
"wss://browser.zenrows.com/…"
);
const ws = new WebSocket(
"wss://browser.zenrows.com/…"
);
ws.send(JSON.stringify({
id: 1, method: "Page.navigate", …
}));
The handoff
Connect the browser.
Just press start.
- BrowserA live browser ready when your team is.
- Stays openLogins, sessions, tabs all kept warm.
- DeliversThe answer in the tool your team already uses.
20,000 browser minutes / month, free. No driver install. No SDK lock-in.
20,000 browser minutes / month, free. No code to write. No setup to maintain.