cdpfleet Pre-launch Get early access

cdpfleet / 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. A proxy is required, and by default the identity is matched to the proxy's location. POST /session is an alias for this browser.

  • /camoufox/sessionlaunch endpoint
  • 1.60Playwright client
  • 2threads (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 that keep the same device between sessions.

Versions on the fleet now

stable152.0.4pinned150

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.

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
// npm install [email protected]
// 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:[email protected]: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

Launch options

OptionWhat it does
proxy_rulesSend specific destination hosts through specific proxies.
inactivity_timeoutEnd the session after this long with no traffic on its WebSocket.
overall_timeoutHard cap on the session's total lifetime, regardless of activity.
vpn_tunnelVPN Tunnel: UDP/WebRTC full support — all of the browser's traffic, UDP included, goes through the residential exit.
vpnOwn network (dedicated plans): send all of the browser's traffic through your own VPN instead of a proxy.
headlessRun without a display.
versionPin an older major version.
osOperating system of the generated fingerprint.
localeBrowser locale(s).
geoipMatch timezone, locale, geolocation and WebRTC IP to the proxy's exit IP.
humanizeHuman-like cursor movement.
block_imagesBlock all images.
block_webrtcDisable WebRTC entirely.
block_webglDisable WebGL.
disable_coopDisable Cross-Origin-Opener-Policy.
screenConstrain the fingerprint's screen size.
windowFixed outer window size.
fingerprintUse a complete BrowserForge fingerprint.
configOverride individual fingerprint properties.
fontsExtra font families to expose.
custom_fonts_onlyExpose only the fonts in fonts.
webgl_configForce a specific WebGL vendor/renderer pair.
ff_versionFirefox major version to claim in the fingerprint.
main_world_evalAllow scripts in the page's main world.
screencastStream the page to your code (Playwright page.screencast).
screen_sizeResolution of the session's own display (headful only).
keep_aliveKeep the session when your client disconnects (dedicated threads only).
start_urlOpen this page at launch so the session can be driven in live view with no client connected.
profileRestore a saved browser profile and save it again when the session ends.
recordOpt this session out of recording with false.

Every session also needs a proxy — yours, or the residential proxy.