Quickstart
One POST to create a session, then plain Playwright over CDP. No SDK, no browser plugins, nothing to install beyond Playwright itself.
Python
import json, urllib.request
from playwright.sync_api import sync_playwright
# 1. Create a session (your API key stays server-side — never in the browser)
req = urllib.request.Request(
"https://connect.bowsr.ai/v1/sessions",
method="POST",
headers={"Authorization": "Bearer bk_live_..."},
)
session = json.loads(urllib.request.urlopen(req).read())
# 2. Connect plain Playwright — no plugins, no flags, no bowsr SDK
with sync_playwright() as pw:
browser = pw.chromium.connect_over_cdp(session["connect_url"])
page = browser.contexts[0].new_page()
page.goto("https://example.com")
print(page.title())
browser.close()
# 3. Release when done (or let your spend cap be the backstop)
urllib.request.urlopen(urllib.request.Request(
f"https://connect.bowsr.ai/v1/sessions/{session['session_id']}",
method="DELETE",
))Node.js
const res = await fetch("https://connect.bowsr.ai/v1/sessions", {
method: "POST",
headers: { Authorization: "Bearer bk_live_..." },
});
const session = await res.json();
const { chromium } = require("playwright");
const browser = await chromium.connectOverCDP(session.connect_url);
const page = await browser.contexts()[0].newPage();
await page.goto("https://example.com");
console.log(await page.title());
await browser.close();
await fetch(`https://connect.bowsr.ai/v1/sessions/${session.session_id}`, {
method: "DELETE",
});Responses to know
402 — monthly browser-seconds cap reached. Running sessions are ended when the cap is hit.
429 — concurrency limit reached; release a session or wait.
401 / 403 — bad key, revoked key, or an account not yet approved.
Sessions are billed by the second while the browser is usable; container startup is on us.