cdpfleet Pre-launch Get early access

cdpfleet / How it works

How it works

Four steps. No browser infrastructure.

Ask for a browser with one HTTPS call, connect your Playwright code to the WebSocket it returns, and close it when you're done. Everything between — servers, browser builds, displays, updates — is ours.

  • 1HTTPS call
  • 5languages
  • 1 sbilling resolution

The four steps

  1. Request a browser: POST /<browser>/session with your API key and a proxy — e.g. POST https://starter.cdpfleet.com/camoufox/session.
  2. Get your socket: the response carries a single-use wsUrl on one of our routers, plus the session id and its thread weight.
  3. Connect your code: chromium/firefox/webkit.connect(wsUrl) and use it like a local browser — pages, contexts, network interception, screenshots. Or launch with "cdp": true and use Puppeteer.
  4. Close to stop billing: browser.close() frees the browser at once; every session's start and end is in your usage log.
The four steps as one program
// npm install [email protected]
// Browsers run on cdpfleet, so no `npx playwright install` is needed.
import { chromium } from 'playwright';

const KEY = process.env.CDPFLEET_API_KEY;

// 1. Launch the browser
const res = await fetch('https://starter.cdpfleet.com/chromium/session', {
  method: 'POST',
  headers: { 'x-api-key': KEY, 'content-type': 'application/json' },
  body: JSON.stringify({
    proxy: 'http://user:[email protected]:8080',
    headless: 'new',
  }),
});
if (!res.ok) throw new Error(`launch failed: ${res.status} ${await res.text()}`);
const { wsUrl } = await res.json();

// 2. Connect and drive it
const browser = await chromium.connect(wsUrl, { headers: { 'x-api-key': KEY } });
const page = await browser.newPage();
await page.goto('https://example.com');
console.log(await page.title());
await browser.close(); // ends the session and stops billing

What you choose per launch

The browser

12 desktop browsers with channels and pinned versions, and phone engines in early access.

Learn more →

The proxy

Every session goes through a proxy: yours, a pool with per-host rules, or the residential proxy.

Learn more →

Headless or headful

A headless browser takes 1 thread, a headful one 2.

Learn more →

Timeouts and extras

Idle and overall timeouts, keep_alive, profiles, recordings, live view.

Learn more →

Errors you can act on

A refused launch says why, with a status and an error code: no free thread (429 threads_exceeded), quota used up, the fleet momentarily busy (503, retry with backoff). Retry 503 and respect Retry-After on 429; other 4xx need fixing. The worker-pool case has a complete retry loop.