[cdpfleet](https://cdpfleet.com/) / Browsers

Browsers

# Every browser flavor. *Every channel.*

12 desktop browsers on one fleet — the real Google Chrome, Edge, Brave, Opera, Whale and Yandex, Playwright's Chromium, Firefox and WebKit, and three stealth builds. Pick one per launch; drive it with Playwright from five languages or over CDP.

[Browser reference](https://cdpfleet.com/docs/browsers)[Code builder](https://cdpfleet.com/docs/builder)

-   **12**desktop browsers
-   **3**engines: Chromium, Gecko, WebKit
-   **3**stealth builds
-   **6**with CDP

## Chromium family

### Google Chrome

Official Google build

**stable**157.0.8103.78**beta**159.0.8154.6**dev**159.0.8144.0**pinned**156.0.8078.79**pinned**155.0.8059.84

[Google Chrome →](https://cdpfleet.com/browsers/chrome)

### Microsoft Edge

Official Microsoft build

**stable**157.0.4341.57**beta**158.0.4370.16**dev**159.0.4393.0

[Microsoft Edge →](https://cdpfleet.com/browsers/edge)

### Brave

Privacy-focused Chromium

**stable**1.99.57**beta**1.101.47

[Brave →](https://cdpfleet.com/browsers/brave)

### Opera

Chromium-based

**stable**140.0.6074.18**developer**141.0.6079.0

[Opera →](https://cdpfleet.com/browsers/opera)

### Naver Whale

Naver's Chromium browser

**stable**5.41.429.5

[Naver Whale →](https://cdpfleet.com/browsers/whale)

### Yandex Browser

Chromium-based

**stable**26.10.0.1882

[Yandex Browser →](https://cdpfleet.com/browsers/yandex)

### Chromium

Playwright build

**build**148.0.7778.96

[Chromium →](https://cdpfleet.com/browsers/chromium)

### Patchright

Stealth-patched Chromium

**release**1.60.2

[Patchright →](https://cdpfleet.com/browsers/patchright)

### Rebrowser

Stealth-patched Chromium

**release**1.52.0

[Rebrowser →](https://cdpfleet.com/browsers/rebrowser)

## Firefox family

### Camoufox

Based on Firefox source; not affiliated with Mozilla

**stable**156.0.1-beta.34**pinned**152.0.4**pinned**150

[Camoufox →](https://cdpfleet.com/browsers/camoufox)

### Firefox

Based on Firefox source; not affiliated with Mozilla

**build**150.0.2

[Firefox →](https://cdpfleet.com/browsers/firefox)

## WebKit

### WebKit

Playwright build

**build**26.4

[WebKit →](https://cdpfleet.com/browsers/webkit)

## Channels and versions

-   Without a `channel` you get the stable build. Chrome and Edge also run **beta** and **dev**, Brave **beta**, Opera its **developer** channel.
-   Pin a previous major with `{"version": "…"}` on Chrome and Camoufox to reproduce or compare behaviour; previous majors rotate as new versions ship.
-   The fleet updates itself. Every new major gets a post on [/docs/updates](https://cdpfleet.com/docs/updates) with what changed for automation, measured on the fleet.

Google Chrome, beta channel

 

```node
// npm install playwright@1.60.0
// 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/chrome/session', {
  method: 'POST',
  headers: { 'x-api-key': KEY, 'content-type': 'application/json' },
  body: JSON.stringify({
    proxy: 'http://user:pass@proxy.example.com:8080',
    channel: 'beta',
    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
```

```python
# pip install playwright==1.60.0 requests
# Browsers run on cdpfleet, so no `playwright install` is needed.
import os
import requests
from playwright.sync_api import sync_playwright

KEY = os.environ["CDPFLEET_API_KEY"]

# 1. Launch the browser
res = requests.post(
    "https://starter.cdpfleet.com/chrome/session",
    headers={"x-api-key": KEY},
    json={
        "proxy": "http://user:pass@proxy.example.com:8080",
        "channel": "beta",
        "headless": "new",
    },
    timeout=60,
)
res.raise_for_status()
ws_url = res.json()["wsUrl"]

# 2. Connect and drive it
with sync_playwright() as p:
    browser = p.chromium.connect(ws_url, headers={"x-api-key": KEY})
    page = browser.new_page()
    page.goto("https://example.com")
    print(page.title())
    browser.close()  # ends the session and stops billing
```

```java
// Maven: com.microsoft.playwright:playwright:1.60.0  and  com.google.code.gson:gson:2.11.0
// Run with PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1: browsers run on cdpfleet.
import com.google.gson.JsonParser;
import com.microsoft.playwright.*;
import java.net.URI;
import java.net.http.*;
import java.util.Map;

public class Example {
  public static void main(String[] args) throws Exception {
    String key = System.getenv("CDPFLEET_API_KEY");

    // 1. Launch the browser
    String body = """
        {
          "proxy": "http://user:pass@proxy.example.com:8080",
          "channel": "beta",
          "headless": "new"
        }
        """;
    HttpResponse<String> res = HttpClient.newHttpClient().send(
        HttpRequest.newBuilder(URI.create("https://starter.cdpfleet.com/chrome/session"))
            .header("x-api-key", key)
            .header("content-type", "application/json")
            .POST(HttpRequest.BodyPublishers.ofString(body))
            .build(),
        HttpResponse.BodyHandlers.ofString());
    if (res.statusCode() != 200) {
      throw new RuntimeException("launch failed: " + res.statusCode() + " " + res.body());
    }
    String wsUrl = JsonParser.parseString(res.body()).getAsJsonObject().get("wsUrl").getAsString();

    // 2. Connect and drive it
    try (Playwright playwright = Playwright.create()) {
      Browser browser = playwright.chromium().connect(wsUrl,
          new BrowserType.ConnectOptions().setHeaders(Map.of("x-api-key", key)));
      Page page = browser.newPage();
      page.navigate("https://example.com");
      System.out.println(page.title());
      browser.close(); // ends the session and stops billing
    }
  }
}
```

```csharp
// dotnet add package Microsoft.Playwright --version 1.60.0
// Browsers run on cdpfleet, so no `playwright install` is needed.
using System.Net.Http.Json;
using System.Text;
using System.Text.Json;
using Microsoft.Playwright;

var key = Environment.GetEnvironmentVariable("CDPFLEET_API_KEY")!;

// 1. Launch the browser
using var http = new HttpClient();
http.DefaultRequestHeaders.Add("x-api-key", key);
var body = """
    {
      "proxy": "http://user:pass@proxy.example.com:8080",
      "channel": "beta",
      "headless": "new"
    }
    """;
var res = await http.PostAsync("https://starter.cdpfleet.com/chrome/session",
    new StringContent(body, Encoding.UTF8, "application/json"));
if (!res.IsSuccessStatusCode)
    throw new Exception($"launch failed: {(int)res.StatusCode} {await res.Content.ReadAsStringAsync()}");
var wsUrl = (await res.Content.ReadFromJsonAsync<JsonElement>()).GetProperty("wsUrl").GetString()!;

// 2. Connect and drive it
using var playwright = await Playwright.CreateAsync();
var browser = await playwright.Chromium.ConnectAsync(wsUrl, new BrowserTypeConnectOptions
{
    Headers = new Dictionary<string, string> { ["x-api-key"] = key },
});
var page = await browser.NewPageAsync();
await page.GotoAsync("https://example.com");
Console.WriteLine(await page.TitleAsync());
await browser.CloseAsync(); // ends the session and stops billing
```

```go
// go get github.com/playwright-community/playwright-go@v0.6000.0
//
// One-time driver setup (needs Node.js 18+): playwright-go can no longer download the
// 1.60.0 driver itself, so build it from npm and point PLAYWRIGHT_DRIVER_PATH at it:
//   mkdir -p ~/.cache/pw-driver-1.60.0 && cd ~/.cache/pw-driver-1.60.0 &&
//     curl -sL https://registry.npmjs.org/playwright-core/-/playwright-core-1.60.0.tgz | tar xz &&
//     ln -sf "$(command -v node)" node
//   export PLAYWRIGHT_DRIVER_PATH=~/.cache/pw-driver-1.60.0
// Browsers run on cdpfleet, so no browsers are downloaded (SkipInstallBrowsers).
package main

import (
	"encoding/json"
	"fmt"
	"io"
	"log"
	"net/http"
	"os"
	"strings"

	"github.com/playwright-community/playwright-go"
)

func main() {
	key := os.Getenv("CDPFLEET_API_KEY")

	// 1. Launch the browser
	body := `{
	  "proxy": "http://user:pass@proxy.example.com:8080",
	  "channel": "beta",
	  "headless": "new"
	}`
	req, _ := http.NewRequest("POST", "https://starter.cdpfleet.com/chrome/session", strings.NewReader(body))
	req.Header.Set("x-api-key", key)
	req.Header.Set("content-type", "application/json")
	res, err := http.DefaultClient.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer res.Body.Close()
	if res.StatusCode != http.StatusOK {
		msg, _ := io.ReadAll(res.Body)
		log.Fatalf("launch failed: %s %s", res.Status, msg)
	}
	var session struct {
		WsURL string `json:"wsUrl"`
	}
	if err := json.NewDecoder(res.Body).Decode(&session); err != nil {
		log.Fatal(err)
	}

	// 2. Connect and drive it (Install fetches only the Playwright driver, once)
	opts := &playwright.RunOptions{SkipInstallBrowsers: true}
	if err := playwright.Install(opts); err != nil {
		log.Fatal(err)
	}
	pw, err := playwright.Run(opts)
	if err != nil {
		log.Fatal(err)
	}
	defer pw.Stop()
	browser, err := pw.Chromium.Connect(session.WsURL, playwright.BrowserTypeConnectOptions{
		Headers: map[string]string{"x-api-key": key},
	})
	if err != nil {
		log.Fatal(err)
	}
	page, err := browser.NewPage()
	if err != nil {
		log.Fatal(err)
	}
	if _, err := page.Goto("https://example.com"); err != nil {
		log.Fatal(err)
	}
	title, _ := page.Title()
	fmt.Println(title)
	browser.Close() // ends the session and stops billing
}
```

## Stealth builds

### Patchright

Stealth-patched Chromium

[Patchright →](https://cdpfleet.com/browsers/patchright)

### Rebrowser

Stealth-patched Chromium

[Rebrowser →](https://cdpfleet.com/browsers/rebrowser)

### Camoufox

Based on Firefox source; not affiliated with Mozilla

[Camoufox →](https://cdpfleet.com/browsers/camoufox)

Real browsers are headful by default and send their own genuine fingerprints; the stealth builds go further for sites that score automation. See the [headless tells](https://cdpfleet.com/docs/cases/headless-tells) case.

## Playwright or CDP

-   **Playwright:** `chromium`/`firefox`/`webkit.connect(wsUrl)` with the client of the same minor version — **1.60** (1.52 for Rebrowser) — from Node.js, Python, Java, C# or Go.
-   **CDP:** launch Google Chrome, Microsoft Edge, Brave, Opera, Yandex Browser, Chromium with `"cdp": true` and connect Puppeteer, `connectOverCDP` or any CDP client to `cdpUrl`.
-   **Persistent profiles** on Google Chrome, Microsoft Edge, Brave, Opera, Yandex Browser, Chromium, Patchright, Camoufox, Firefox, WebKit.
-   A headless browser takes 1 [thread](https://cdpfleet.com/threads), a headful one 2.

## Related

Cases, recipes, posts and comparisons about this — updated as new ones are published.

### Reference docs

The details, options and errors.

-   [Browsers](https://cdpfleet.com/docs/browsers)Every browser's versions and launch options.
-   [Code builder](https://cdpfleet.com/docs/builder)A ready-to-run program for any browser and options.
-   [CDP & Puppeteer](https://cdpfleet.com/docs/cdp)Connecting over the Chrome DevTools Protocol.
-   [Updates](https://cdpfleet.com/docs/updates)New browser versions on the fleet.

### Cases 30

Real problems solved end to end, run on production in five languages.

-   [Case 84: Does the TLS fingerprint (JA4) explain which browsers got in? Twelve browsers against six vendors](https://cdpfleet.com/docs/cases/ja4-vs-vendor-verdicts)Each of the twelve browsers from the real-site lab week loads a TLS echo page once, so we know the JA4, peetprint and HTTP/2 fingerprint it sends. Grouped by…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/cases/84-ja4-vs-vendor-verdicts)
-   [Case 85: A Function or your own browser? Screenshot, PDF and Markdown of the same pages, timed and billed](https://cdpfleet.com/docs/cases/function-vs-your-own-browser)Three pages, three outputs, two ways: one POST to a Function, or launch a browser yourself, connect Playwright, capture and close. Wall time, the thread-seconds each…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/cases/85-function-vs-your-own-browser)
-   [Case 83: Brave's fingerprint randomisation per site, per context and per launch, and what public fingerprint pages make of it](https://cdpfleet.com/docs/cases/brave-farbling)Brave adds noise to canvas, audio, cores, memory and the plugin list, keyed to the site and the session. One probe on two made-up sites, the same site again, a…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/cases/83-brave-farbling)
-   [Case 81: Behaviour scoring: Camoufox humanize on and off vs plain Chrome clicks on a public bot-test form](https://cdpfleet.com/docs/cases/behaviour-scoring-humanize)A public behavioural bot-test page scores how a demo login form was filled in: clicks, keystrokes, timing. Camoufox with `humanize` off, on and slowed down, and…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/cases/81-behaviour-scoring-humanize)
-   [Case 80: How many tabs fit in one session, by plan, browser and "memory"](https://cdpfleet.com/docs/cases/tabs-and-memory-by-plan)A long Wikipedia article opened in one new tab after another until the session ends: on Community (2 GB), a shared plan (4 GB) and a dedicated thread (6 GB), in…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/cases/80-tabs-and-memory-by-plan)
-   [Case 77: Kasada and AWS WAF on real sites: twelve browsers, four sites, one exit each](https://cdpfleet.com/docs/cases/kasada-and-aws-waf-by-browser)Two real sites behind Kasada and two behind AWS WAF, loaded once by each of twelve browsers and by a returning Camoufox profile, through one sticky residential exit…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/cases/77-kasada-and-aws-waf-by-browser)
-   [Case 75: HUMAN on real sites: twelve browsers, three sites, one exit each](https://cdpfleet.com/docs/cases/human-real-sites-by-browser)Three real sites behind HUMAN (formerly PerimeterX), chosen from our sweep as easy, medium and hard, loaded once by each of twelve browsers and by a returning…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/cases/75-human-real-sites-by-browser)
-   [Case 73: Akamai on real sites: twelve browsers, three sites, one exit each](https://cdpfleet.com/docs/cases/akamai-real-sites-by-browser)Three real sites behind Akamai Bot Manager, chosen from our sweep as easy, medium and hard, loaded once by each of twelve browsers and by a returning Camoufox…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/cases/73-akamai-real-sites-by-browser)

[All cases →](https://cdpfleet.com/docs/cases) 30 match this topic

### Browser comparisons 15

Measured side by side on the fleet.

-   [Brave beta vs stable](https://cdpfleet.com/docs/compare/brave-beta-vs-stable)Brave's beta channel next to stable on the fleet. Right now the beta is the older engine: Brave 1.100 beta is on Chromium 156, while 1.99 stable already moved to…
-   [Opera developer vs stable](https://cdpfleet.com/docs/compare/opera-developer-vs-stable)Opera's developer channel next to stable on the fleet. Both are on Chromium 155, so the web platform and the TLS and HTTP/2 fingerprint are identical. What gives the…
-   [Naver Whale vs Chrome](https://cdpfleet.com/docs/compare/whale-vs-chrome)Whale 5.41 runs on Chromium 156, one major behind Chrome 157, names itself in the user agent and client hints, and now sends the same TLS hello as Chrome. What that…
-   [Yandex Browser vs Chrome](https://cdpfleet.com/docs/compare/yandex-vs-chrome)Yandex Browser 26.8 runs on Chromium 150, six majors behind Chrome 156, names itself in the user agent and client hints, puts Russian first in navigator.languages…
-   [Camoufox vs Firefox, headless](https://cdpfleet.com/docs/compare/camoufox-vs-firefox-headless)Headless Firefox and headless Camoufox (both based on Firefox source; not affiliated with Mozilla) side by side: the headless tells a page can read, what Camoufox…
-   [WebKit vs Chromium](https://cdpfleet.com/docs/compare/webkit-vs-chromium)Playwright's WebKit 26.4 claims a Mac in its user agent but reports Linux, sets navigator.webdriver and speaks HTTP/1.1 through a proxy. Where it beats Chromium…
-   [Camoufox 152 vs Camoufox 150](https://cdpfleet.com/docs/compare/camoufox-152-vs-150)Both claim Firefox 152 and send the same TLS fingerprint — but on 152 Playwright's evaluate and init scripts run in an isolated world the page can't see, while on…
-   [Edge vs Brave](https://cdpfleet.com/docs/compare/edge-vs-brave)Two Chromium 155 forks with the same TLS and HTTP/2 fingerprint: Edge names itself in the user agent and reports its real machine; Brave hides in the user agent but…

[All browser comparisons →](https://cdpfleet.com/docs/compare) 15 match this topic

## Read next

[Threads →](https://cdpfleet.com/threads)[Web scraping →](https://cdpfleet.com/web-scraping)[Android & iOS →](https://cdpfleet.com/mobile)[Live view →](https://cdpfleet.com/live-view)[Pricing →](https://cdpfleet.com/pricing)

---
Source: https://cdpfleet.com/browsers · Markdown: https://cdpfleet.com/browsers.md · All docs for AI tools: https://cdpfleet.com/llms.txt
