Cloud browsers for automation & AI agents

Cloud browsers that
don't get blocked.

Real Chrome on real machines — Apple Silicon or Linux — driven by the Playwright and Puppeteer you already use. You get a CDP URL. We run the fleet. You pay for the minutes a browser is actually working.

Built by a team that operates browser fleets in production for clients today.

browserfleet · mac-shared · what the page seeslive
brands
"Google Chrome", "Chromium", "Not)A;Brand"
platform
MacIntel
renderer
ANGLE Metal Renderer: Apple M2
headless
false
webdriver
false
plugins
5
a real machine, reporting the truth

Why it doesn't get blocked

The page isn't reading your headers. It's reading the machine.

Modern bot detection fingerprints the hardware — the GPU renderer, the platform, whether a window exists at all. Most cloud browsers are a headless Linux container, and no amount of user-agent spoofing changes what WebGL reports. So we changed the machine instead.

typical cloud browser · linux container · what the page sees
brands
"Chromium", "Not)A;Brand"
platform
Linux x86_64
renderer
Google SwiftShader (software)
headless
true
webdriver
true
plugins
0
× four tells no real visitor has
browserfleet · mac-shared · what the page seeslive
brands
"Google Chrome", "Chromium", "Not)A;Brand"
platform
MacIntel
renderer
ANGLE Metal Renderer: Apple M2
headless
false
webdriver
false
plugins
5
a real machine, reporting the truth

Left: the values a typical headless Linux container reports; varies by vendor. Right: a real BrowserFleet session on Apple Silicon, captured from the browser itself.

What you get

Four promises.

It doesn't get blocked

Real Google Chrome, always headful, on a real display. On the Apple Silicon class the GPU string is a Metal renderer because a Metal GPU is genuinely drawing the page.

You don't run it

No browsers to patch, no fleet to scale, no proxy plumbing. Create a session, get a CDP URL, connect the client you already have. Leave any time — your code doesn't change.

It costs what it uses

Billed per active minute, only while a client is connected. A session waiting on a slow model call, or idle over the weekend, costs nothing.

You can watch it and take over

A live view of any session, and a control channel that injects real OS-level input with human motion — so you can solve one step by hand and give the session back.

Persistent profiles

Logins that survive.

A profile is the customer's logged-in state — cookies, storage, sessions — kept in our encrypted store between runs. Log in once; every later session on that profile starts already inside.

Saved automatically when a session ends. A single-writer lock stops two sessions corrupting one profile. A profile is bound to the machine class it was made for, so its device identity never contradicts itself. Export it any time — it's yours.

Profiles in the docs
// 1. create a profile once — it's the customer's logged-in state
const profile = await bf.createProfile("shop-eu");

// 2. run a session on it, log in, do work…
const s1 = await bf.createSession({
  image: "chrome-stable", machineClass: "mac-shared",
  profile: { mode: "managed", id: profile.id },
});
// …end it. The state is saved automatically because the session ran on the profile.
await bf.endSession(s1.id);

// 3. next week: a new session on the same profile is already logged in
const s2 = await bf.createSession({
  image: "chrome-stable", machineClass: "mac-shared",
  profile: { mode: "managed", id: profile.id },
});

The platform

A dashboard, not just an endpoint.

Every session, every profile, every key and every minute — visible in one place, with a live view a click away. The API and the dashboard are the same product; use whichever the moment calls for.

app.browserfleet.io · sessionsorg · 3 of 25 running
sessionmachineprofileactivestate
sess_01K…7Q2Mmac-sharedshop-eu14 minlive view
sess_01K…3RH8browser-standard2 minrunning
sess_01K…9ZC1mac-sharedcrm-us41 minrunning
sess_01K…0FA4browser-perf6 minended
every session: open a live view, take over by hand, or end it — from the dashboard or the API

Quickstart

It's just CDP.

No proprietary driver and no rewrite. Playwright, Puppeteer, Python, or the raw protocol — the only BrowserFleet-specific line is creating the session.

Full quickstart
// npm i @browserfleet/sdk playwright
import { BrowserFleet } from "@browserfleet/sdk";
import { chromium } from "playwright";

const bf = new BrowserFleet({ apiKey: process.env.BROWSERFLEET_API_KEY });

const session = await bf.createSession({
  image: "chrome-stable",
  machineClass: "mac-shared",   // or browser-standard
});

const browser = await chromium.connectOverCDP(BrowserFleet.cdpUrl(session));
const page = await browser.newPage();
await page.goto("https://example.com");

await bf.endSession(session.id); // billing stops here

The fleet

macOSApple M2 · Metal GPU $0.40per browser-hour
PerformanceLinux · 3 vCPU · 6 GB $0.12per browser-hour
StandardLinux · 1 vCPU · 2 GB $0.05per browser-hour
NanoLinux · 0.5 vCPU · 1 GB $0.03per browser-hour

Every class runs real Chrome, headful. Per active minute, no seats, no monthly minimum. Plans and limits →

Where this goes

Every surface a real user has.

A fingerprint is not a string you set — it's a machine, and eventually it's a device someone holds. Today the fleet is Macs and Linux boxes. The same API is built to hand you a phone: a real one, in a rack, with a SIM and a touchscreen — not an emulator wearing a costume.

runningDesktop browser

Real Chrome on Apple Silicon and Linux, headful, over CDP.

nextMobile web

A browser that is genuinely a phone — touch events, device pixel ratio, mobile GPU.

plannedCloud Android

A full Android instance over ADB, not just a browser. Install an app and drive it.

plannedReal devices

Physical iPhones and Androids, one tenant per device, wiped between sessions.

The engine is oursin build

We're building our own Chromium fork rather than renting someone else's patches. Owning the engine is the only way to fix a tell at the source instead of papering over it in JavaScript — and the only version of this business with a moat.

Honest about today

Only the first stop is running. Everything after it is where the money and the engineering are going, not something you can call this afternoon. When a stop lights up, it lights up here first.

Point your existing code at a real machine.

Sign up, take the $2 of trial credit and run a session. It's five hours on Apple Silicon — enough to check the fingerprint against whatever has been blocking you.

Get an API key Talk to us

Built by a team that operates browser fleets in production for clients today.