Chrome DevTools Protocol on Browserberg
If you would rather not use a driver library at all, a session is a plain CDP WebSocket. Everything else on this site is a convenience layer over this endpoint.
Connect in one line
import WebSocket from 'ws';
const ws = new WebSocket(`wss://browserberg.com/v1/connect?token=${process.env.BB_TOKEN}`);
ws.on('open', () => {
ws.send(JSON.stringify({ id: 1, method: 'Page.enable' }));
ws.send(JSON.stringify({
id: 2,
method: 'Page.navigate',
params: { url: 'https://portal.example.de' }
}));
});
curl -X POST https://browserberg.com/v1/sessions \
-H "Authorization: Bearer $BB_TOKEN" \
-H "Content-Type: application/json" \
-d '{"locale":"de-DE","timezone":"Europe/Berlin"}'
# -> { "sessionId": "...", "cdpUrl": "wss://browserberg.com/v1/connect/..." }
Details
| Transport | WebSocket, TLS terminated at the edge |
|---|---|
| Session creation | POST /v1/sessions |
| Default locale | de-DE |
| Default timezone | Europe/Berlin |
| Wire protocol licence | Apache-2.0, schema published |
| Where sessions run | EU bare metal (OVHcloud) |
As of 2026-08-30
Questions people actually ask
Why would I use raw CDP instead of a driver?
Mostly you would not. It is worth it when you need a domain a driver does not expose, or when you are building your own abstraction and a driver's opinions are in the way.
What is the most common CDP mistake you see?
Calling Page.addScriptToEvaluateOnNewDocument without Page.enable. It returns a valid-looking identifier and the script silently never runs -- no error, no warning. It cost us real time.
Can two clients drive one session?
One writer, plus any number of read-only observers. That is how live view works without two clients fighting over the same page, and the writer lease is explicit rather than first-come.
Things worth knowing
Page.enable before addScriptToEvaluateOnNewDocument
Without Page.enable, Page.addScriptToEvaluateOnNewDocument returns a valid-looking identifier and the script silently never runs. We lost time to this one; it is in our engineering notes for a reason.
The default locale is de-DE
Sessions default to de-DE and Europe/Berlin because that is the first market. Override both on session creation if you need something else.
One writer per session
A session accepts a single writing client. Read-only observers can attach alongside it, which is how live view works without two clients fighting over the same page.
Other integrations
- Playwright Playwright connects to Browserberg over the Chrome DevTools Protocol.
- Puppeteer Puppeteer talks CDP natively, so connecting to Browserberg is a one-argument change from puppeteer.
- Selenium Selenium reaches Browserberg through Chrome's CDP support.
- LangChain LangChain agents drive Browserberg today through Playwright's toolkit, pointed at a remote CDP endpoint.
- MCP A Model Context Protocol server that exposes Browserberg sessions as tools to any MCP client.
Point an existing script at us
Five browser hours free, no card. If it runs locally, it runs here with one line changed.