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

Firefox family · Based on Firefox source; not affiliated with Mozilla

# Camoufox, *one socket* away.

Camoufox is an anti-detect browser based on Firefox source (not affiliated with Mozilla) that spoofs a complete, consistent fingerprint at the engine level. Set its identity with launch options (below) rather than with client-side `newContext` settings, which would fight the injected identity. Bring a `proxy` for real work (without one the free Community proxy is used), and by default the identity is matched to the proxy's location. `POST /session` is an alias for this browser.

[Open in the code builder](https://cdpfleet.com/docs/builder?browser=camoufox)[Reference](https://cdpfleet.com/docs/browsers/camoufox)

-   **/camoufox/session**launch endpoint
-   **1.60**Playwright client
-   **2**threads (headful default)

## Why Camoufox

-   An **anti-detect browser based on Firefox source** (not affiliated with Mozilla) that builds a complete, consistent fingerprint at the engine level.
-   Set the identity at launch — OS, locale, screen, fonts, WebGL, human-like cursor — and match it to the proxy's location by default. A `proxy` is required.
-   Pinned previous versions and [persistent profiles](https://cdpfleet.com/profiles) that keep the same device between sessions.

## Versions on the fleet now

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

One build per release, updated on the fleet as new versions ship.

Pin a previous major with `{"version": "…"}` — the reference page lists the ones available now.

New majors are announced on [/docs/updates](https://cdpfleet.com/docs/updates).

## Launch it

One HTTPS call to `POST /camoufox/session` returns a WebSocket URL; connect to it with Playwright's `firefox.connect()` (client 1.60). A headless session takes 1 thread, a headful one 2.

Camoufox: launch, open a page, print its title

 

```node
// npm install playwright@1.60.0
// Browsers run on cdpfleet, so no `npx playwright install` is needed.
import { firefox } from 'playwright';

const KEY = process.env.CDPFLEET_API_KEY;

// 1. Launch the browser
const res = await fetch('https://starter.cdpfleet.com/camoufox/session', {
  method: 'POST',
  headers: { 'x-api-key': KEY, 'content-type': 'application/json' },
  body: JSON.stringify({
    proxy: 'http://user:pass@proxy.example.com:8080',
    headless: false,
  }),
});
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 firefox.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/camoufox/session",
    headers={"x-api-key": KEY},
    json={
        "proxy": "http://user:pass@proxy.example.com:8080",
        "headless": False,
    },
    timeout=60,
)
res.raise_for_status()
ws_url = res.json()["wsUrl"]

# 2. Connect and drive it
with sync_playwright() as p:
    browser = p.firefox.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",
          "headless": false
        }
        """;
    HttpResponse<String> res = HttpClient.newHttpClient().send(
        HttpRequest.newBuilder(URI.create("https://starter.cdpfleet.com/camoufox/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.firefox().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",
      "headless": false
    }
    """;
var res = await http.PostAsync("https://starter.cdpfleet.com/camoufox/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.Firefox.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",
	  "headless": false
	}`
	req, _ := http.NewRequest("POST", "https://starter.cdpfleet.com/camoufox/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.Firefox.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
}
```

[This program on GitHub →](https://github.com/cdpfleet/cdpfleet/tree/main/examples/browsers/camoufox)

## Launch options

| Option | What it does |
| --- | --- |
| [`proxy_rules`](https://cdpfleet.com/docs/browsers/camoufox#opt-proxy_rules) | Send specific destination hosts through specific proxies. |
| [`inactivity_timeout`](https://cdpfleet.com/docs/browsers/camoufox#opt-inactivity_timeout) | End the session after this long with no traffic on its WebSocket. |
| [`overall_timeout`](https://cdpfleet.com/docs/browsers/camoufox#opt-overall_timeout) | Hard cap on the session's total lifetime, regardless of activity. |
| [`memory`](https://cdpfleet.com/docs/browsers/camoufox#opt-memory) | Give the session 2, 3 or 4 times your plan's memory; it counts as that many times the threads. |
| [`downloads`](https://cdpfleet.com/docs/browsers/camoufox#opt-downloads) | Keep every file the browser downloads, to fetch after the session. |
| [`vpn_tunnel`](https://cdpfleet.com/docs/browsers/camoufox#opt-vpn_tunnel) | VPN Tunnel: UDP/WebRTC full support — all of the browser's traffic, UDP included, goes through the residential exit. |
| [`vpn`](https://cdpfleet.com/docs/browsers/camoufox#opt-vpn) | Own network (dedicated plans): send all of the browser's traffic through your own VPN instead of a proxy. |
| [`headless`](https://cdpfleet.com/docs/browsers/camoufox#opt-headless) | Run without a display. |
| [`version`](https://cdpfleet.com/docs/browsers/camoufox#opt-version) | Pin an older major version. |
| [`os`](https://cdpfleet.com/docs/browsers/camoufox#opt-os) | Operating system of the generated fingerprint. |
| [`locale`](https://cdpfleet.com/docs/browsers/camoufox#opt-locale) | Browser locale(s). |
| [`geoip`](https://cdpfleet.com/docs/browsers/camoufox#opt-geoip) | Match timezone, locale, geolocation and WebRTC IP to the proxy's exit IP. |
| [`humanize`](https://cdpfleet.com/docs/browsers/camoufox#opt-humanize) | Human-like cursor movement. |
| [`block_images`](https://cdpfleet.com/docs/browsers/camoufox#opt-block_images) | Block all images. |
| [`block_webrtc`](https://cdpfleet.com/docs/browsers/camoufox#opt-block_webrtc) | Disable WebRTC entirely. |
| [`block_webgl`](https://cdpfleet.com/docs/browsers/camoufox#opt-block_webgl) | Disable WebGL. |
| [`disable_coop`](https://cdpfleet.com/docs/browsers/camoufox#opt-disable_coop) | Disable Cross-Origin-Opener-Policy. |
| [`screen`](https://cdpfleet.com/docs/browsers/camoufox#opt-screen) | Constrain the fingerprint's screen size. |
| [`window`](https://cdpfleet.com/docs/browsers/camoufox#opt-window) | Fixed outer window size. |
| [`fingerprint`](https://cdpfleet.com/docs/browsers/camoufox#opt-fingerprint) | Use a complete BrowserForge fingerprint. |
| [`config`](https://cdpfleet.com/docs/browsers/camoufox#opt-config) | Override individual fingerprint properties. |
| [`fonts`](https://cdpfleet.com/docs/browsers/camoufox#opt-fonts) | Extra font families to expose. |
| [`custom_fonts_only`](https://cdpfleet.com/docs/browsers/camoufox#opt-custom_fonts_only) | Expose only the fonts in `fonts`. |
| [`webgl_config`](https://cdpfleet.com/docs/browsers/camoufox#opt-webgl_config) | Force a specific WebGL vendor/renderer pair. |
| [`ff_version`](https://cdpfleet.com/docs/browsers/camoufox#opt-ff_version) | Firefox major version to claim in the fingerprint. |
| [`main_world_eval`](https://cdpfleet.com/docs/browsers/camoufox#opt-main_world_eval) | Allow scripts in the page's main world. |
| [`screencast`](https://cdpfleet.com/docs/browsers/camoufox#opt-screencast) | Stream the page to your code (Playwright page.screencast). |
| [`screen_size`](https://cdpfleet.com/docs/browsers/camoufox#opt-screen_size) | Resolution of the session's own display (headful only). |
| [`keep_alive`](https://cdpfleet.com/docs/browsers/camoufox#opt-keep_alive) | Keep the session when your client disconnects (dedicated threads only). |
| [`start_url`](https://cdpfleet.com/docs/browsers/camoufox#opt-start_url) | Open this page at launch so the session can be driven in live view with no client connected. |
| [`profile`](https://cdpfleet.com/docs/browsers/camoufox#opt-profile) | Restore a saved browser profile and save it again when the session ends. |
| [`record`](https://cdpfleet.com/docs/browsers/camoufox#opt-record) | Opt this session out of recording with false. |

Every session also needs a `proxy` — yours, or the [residential proxy](https://cdpfleet.com/residential-proxy).

## Related

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

### Reference docs

The details, options and errors.

-   [Camoufox reference](https://cdpfleet.com/docs/browsers/camoufox)Versions and every launch option.
-   [Quickstart](https://cdpfleet.com/docs/quickstart)Your first session in five minutes.

### Cases 28

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

-   [Case 88: A monitor end to end: create it, trigger a change, verify the signed webhook, read the diff and history](https://cdpfleet.com/docs/cases/monitor-end-to-end)Watch one element of a page that changes on every load, trigger checks with `POST …/run`, receive the `monitor.change` webhook and verify its HMAC signature, check…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/cases/88-monitor-end-to-end)
-   [Case 87: Geo compare: the same pages from five countries in one call, and reading the diff](https://cdpfleet.com/docs/cases/geo-compare)One `POST /v1/functions/geo` per page loads it from the US, Germany, the UK, Japan and Brazil at once and returns each country's Markdown and HTML plus a diff…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/cases/87-geo-compare)
-   [Case 86: Crawl a whole site as a job: map, crawl, stop, resume, results, zip and a signed webhook](https://cdpfleet.com/docs/cases/crawl-a-site-as-a-job)Map books.toscrape.com, crawl 100 pages of it as a background job, stop it part-way and resume it, then read the results as JSON lines and as a zip archive, and…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/cases/86-crawl-a-site-as-a-job)
-   [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 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 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)

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

### Recipes 14

Complete programs for one setup each.

-   [Camoufox with a Windows fingerprint](https://cdpfleet.com/docs/examples#camoufox-fingerprint)Camoufox builds a consistent identity at launch. Here: Windows, US English, human-like mouse movement, WebRTC disabled. Replace the proxy with yours; Camoufox also…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/examples/recipes/camoufox-fingerprint)
-   [Camoufox: pinned version, macOS persona, no images](https://cdpfleet.com/docs/examples#camoufox-lean-persona)A reproducible Firefox 150 identity that reports macOS, matches its timezone and locale to the proxy, and skips images to save proxy bandwidth. `main_world_eval`…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/examples/recipes/camoufox-lean-persona)
-   [Camoufox with a fixed screen and window](https://cdpfleet.com/docs/examples#camoufox-fixed-screen)Pin the persona's screen to common laptop sizes and the window to 1366×768 so screenshots and layouts are the same on every run, while the rest of the identity is…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/examples/recipes/camoufox-fixed-screen)
-   [Camoufox as a Windows laptop with Intel graphics](https://cdpfleet.com/docs/examples#camoufox-intel-laptop)Pick the GPU the persona reports with `webgl_config` (vendor and renderer from Camoufox's database) and keep the rest generated: a common office laptop instead of a…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/examples/recipes/camoufox-intel-laptop)
-   [Camoufox with exact fingerprint values](https://cdpfleet.com/docs/examples#camoufox-config)Override single properties of the generated identity with `config` — here 8 CPU cores, no touch screen and a 1920×1080 screen — while Camoufox keeps everything else…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/examples/recipes/camoufox-config)
-   [Camoufox reporting an older Firefox](https://cdpfleet.com/docs/examples#camoufox-ff-version)`ff_version: 135` makes the user agent say Firefox 135 (`rv:135.0`) while the engine stays Camoufox's Firefox 152 — for sites that serve a different page by version.…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/examples/recipes/camoufox-ff-version)
-   [Camoufox with a macOS font list](https://cdpfleet.com/docs/examples#camoufox-mac-fonts)A macOS persona that only exposes the fonts you list: with `custom_fonts_only`, font checks found Menlo and no longer found Arial or Courier New. Only fonts the…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/examples/recipes/camoufox-mac-fonts)
-   [Camoufox with slower, human-paced cursor moves](https://cdpfleet.com/docs/examples#camoufox-slow-humanize)Camoufox moves the cursor along natural paths by default; `humanize: 2` lets each move take up to 2 seconds — slower clicks for sites that score how fast a visitor's…[Code on GitHub](https://github.com/cdpfleet/cdpfleet/tree/main/examples/recipes/camoufox-slow-humanize)

[All recipes →](https://cdpfleet.com/docs/examples) 14 match this topic

### Updates 1

Product news and browser releases.

-   [Camoufox 156: Firefox 156 base, and humanized mouse moves no longer hang](https://cdpfleet.com/docs/updates/camoufox-156)The default Camoufox is now 156.0.1 (Firefox 156). A humanized mouse move can no longer hang the page, the TLS fingerprint changed, and 150/152 stay pinnable.

### Browser comparisons 4

Measured side by side on the fleet.

-   [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…
-   [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…
-   [Firefox vs Camoufox](https://cdpfleet.com/docs/compare/firefox-vs-camoufox)Playwright's Firefox build against the anti-detect fork built on it (both based on Firefox source; not affiliated with Mozilla): what Camoufox changes in what a site…
-   [Camoufox vs Patchright](https://cdpfleet.com/docs/compare/camoufox-vs-patchright)Two stealth browsers, two philosophies: a browser based on Firefox source (not affiliated with Mozilla) that spoofs the whole device at the C++ level, or a Chromium…

## Read next

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

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