cdpfleet Pre-launch Get early access

cdpfleet / Threads

How billing works

You buy threads, not machines.

A thread is a slot for a running browser. You never size servers, count CPUs or keep a pool warm: buy threads — dedicated or shared — and launch browsers into them. Time is metered to the second.

  • 1thread · headless
  • 2threads · headful
  • 3–4threads · phones
  • 1 sbilling resolution

Heavier browsers take more threads

Session typeThreadsWhat it is
Linux headless1Any desktop engine without a display.
Linux headful2Full rendering on a virtual display — the default for most browsers.
Mobile WebView3Android WebView on hardware phones, iOS WebView (phones, early access).
Mobile Chrome4Chrome and other full browsers on hardware Android phones (early access).

A launch that would exceed your threads gets 429 threads_exceeded until a session closes. The launch response tells you the session's weight, and the dashboard shows what is running.

Metered in thread-seconds

Usage is threads × seconds, nothing rounded up. Ten seconds of a headful browser is 20 thread-seconds; a minute of a headless one is 60.

On shared threads the thread-seconds come out of the day's pool; on dedicated threads they are only reported — dedicated minutes are unlimited.

The clock stops with the socket

  • Billing starts when your browser is ready — the launch response — and stops the moment either side closes the WebSocket.
  • browser.close() ends the session at once.
  • A session you never connect to ends after 60 seconds — unless it was launched with start_url for Launch interactive, which runs without a client until its idle timeout.
  • If our server doesn't accept your connection, the session isn't billed.
Launch, use, close — the whole billed lifetime of a session
// 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

Two ways to buy threads

Shared threads

Pooled browser-minutes for bursty and scheduled work: 60/120/240/480 minutes per thread per day, from $1 per thread per month.

Learn more →

Dedicated threads

Reserved capacity for always-on work: unlimited minutes, 24-hour sessions and keep_alive at $5 per thread per month.

Learn more →

Community

Free: 2 threads with 60 minutes each per day and a proxy included. Invite-only for now.

Learn more →