cdpUrl with a CDP-compatible automation client.
Playwright
import { chromium } from "playwright";
import BrowsercashSDK from "@browsercash/sdk";
const client = new BrowsercashSDK({
apiKey: process.env.DRIVER_API_KEY!,
baseURL: "https://api.driver.dev",
});
const session = await client.browser.session.create({ type: "hosted" });
const browser = await chromium.connectOverCDP(session.cdpUrl);
const context = browser.contexts()[0] || (await browser.newContext());
const page = context.pages()[0] || (await context.newPage());
await page.goto("https://example.com");
console.log(await page.title());
await browser.close();
await client.browser.session.stop({ sessionId: session.sessionId });
import os
import requests
from playwright.sync_api import sync_playwright
resp = requests.post(
"https://api.driver.dev/v1/browser/session",
headers={"Authorization": f"Bearer {os.getenv('DRIVER_API_KEY')}"},
json={"type": "hosted"},
)
resp.raise_for_status()
session = resp.json()
try:
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(session["cdpUrl"])
context = browser.contexts[0] if browser.contexts else browser.new_context()
page = context.pages[0] if context.pages else context.new_page()
page.goto("https://example.com")
print(page.title())
browser.close()
finally:
requests.delete(
"https://api.driver.dev/v1/browser/session",
headers={"Authorization": f"Bearer {os.getenv('DRIVER_API_KEY')}"},
params={"sessionId": session["sessionId"]},
)
Puppeteer
import puppeteer from "puppeteer-core";
const browser = await puppeteer.connect({
browserWSEndpoint: session.cdpUrl,
});
const page = await browser.newPage();
await page.goto("https://example.com");
console.log(await page.title());
await browser.disconnect();
Cleanup
Close or disconnect your automation client, then stop the Driver session through the API. Stopping the session is what releases the browser and ends billing.curl -X DELETE "https://api.driver.dev/v1/browser/session?sessionId=$SESSION_ID" \
-H "Authorization: Bearer $DRIVER_API_KEY"