cdpfleet Docs GitHub Dashboard

Compare / browsers

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 hides, and what its "virtual" mode costs.

Camoufox Firefox

Firefox vs Camoufox compares the two browsers headful. This page is about the cheaper mode most scrapers run: headless, where there is no display and a page has the most to notice. Firefox on the fleet is Playwright's build (150.0.2 on 2026-10-25), based on Firefox source and not affiliated with Mozilla. Camoufox is the anti-detect browser built on the same engine, also based on Firefox source and not affiliated with Mozilla (156.0.1-beta.34 on 2026-10-25, driven by the official Camoufox library). Camoufox has two headless modes: "headless": true (no display at all) and "headless": "virtual" (headful on a virtual display the page can't tell from a real one). All three were launched once through the same rotating proxy on 2026-10-25.

The headless tells, measured

Firefox, headlessCamoufox, headless (`true` and `"virtual"`)
navigator.webdrivertrue: the browser says it is automated, and bot.sannysoft.com marks "WebDriver" red.false in both modes, in the page's world and in Playwright's isolated world.
Window vs viewportOuter window = viewport = 1280×720: no browser chrome around the page, which no real desktop window has.Outer window taller than the viewport (1280×806 and 1280×805 around a 1280×720 page), as a window with toolbars would be.
Screen1280×720, the same as the window: the screen is the page.A desktop screen from the persona (1920×1080 and 3440×1440 in these launches), with a taskbar-sized gap between the screen and the available height.
GPU (WebGL)llvmpipe (Mesa software rendering): a server without a GPU.A persona GPU: "Radeon HD 3200 Graphics" and "ANGLE (AMD, Radeon R9 200 Series …)" in these launches.
Cores, plugins, PDF viewerThe server's 64 cores, 0 plugins, no PDF viewer.12 and 8 cores, 5 plugins, a PDF viewer: consumer-machine values.
Languages, timezonenavigator.languages gave no real list, timezone UTC.Matched to the proxy exit (Spain in these launches): timezone Europe/Madrid, languages es-ES and en-ES.
bot.sannysoft.com4 of 57 checks red: WebDriver, "Chrome (New)" and two plugin checks.1 red in both modes: "Chrome (New)", because it is Firefox and says so.

What stays the same

What differs beyond the tells

"virtual" vs true headless on Camoufox

`"headless": true``"headless": "virtual"`
Threads1 (headless)2 (counted as headful)
Launch, this run1.7 s4.9 s
Tells measured hereThe same as "virtual": webdriver false, window chrome, persona screen and GPU, 1 sannysoft flag.The same as true headless.
WhenThe default for scraping: cheapest, and on these probes it showed nothing the virtual display didn't.When a site behaves differently without a real display (rendering paths, focus, some video), or you want a recording or live view of the session.

Which to pick

Measured on the fleet (2026-10-25)

One launch of each on 2026-10-25 through the same rotating proxy; Camoufox read through main_world_eval. Camoufox's persona (OS, screen, GPU, cores, locale, timezone) is drawn per launch, so its values differ between its two columns by chance, not by mode; Firefox's values are the server's.

Launch and cost

Single run; timings depend on the proxy and on fleet load.

Firefox, headlessCamoufox, headlessCamoufox, headless "virtual"
Launch body{"headless":true}{"headless":true,"main_world_eval":true}{"headless":"virtual","main_world_eval":true}
Threads used1 (linux_headless)1 (linux_headless)2 (linux_headful)
Browser version150.0.2156.0.1-beta.34156.0.1-beta.34
Launch request → browser ready0.9 s1.7 s4.9 s
Playwright connect0.2 s0.1 s0.0 s
Load example.com1.6 s2.4 s1.0 s
Load tls.peet.ws/api/all1.3 s0.9 s1.5 s

What the network sees

From tls.peet.ws/api/all, requested by the browser itself. JA3 hashes change between runs of the same build (GREASE), so compare JA4 and the HTTP/2 fingerprint.

Firefox, headlessCamoufox, headlessCamoufox, headless "virtual"
HTTP versionh2h2h2
JA4t13d1617h2_86a278354501_3cbfd9057e0dt13d1517h2_8daaf6152771_3cbfd9057e0dt13d1517h2_8daaf6152771_3cbfd9057e0d
Peetprint hashfd4547eeb41f073156b7bc8125a79a3ca4bbbc7e3adf3db97d276fd0adb1efc4a4bbbc7e3adf3db97d276fd0adb1efc4
Akamai HTTP/2 fingerprint1:65536;2:0;4:131072;5:16384|12517377|0|m,p,a,s1:65536;2:0;4:131072;5:16384|12517377|0|m,p,a,s1:65536;2:0;4:131072;5:16384|12517377|0|m,p,a,s
Cipher suites / extensions16 / 1715 / 1715 / 17
Header order (first 12)method, path, authority, scheme, user-agent, accept, accept-language, accept-encoding, upgrade-insecure-requests, sec-fetch-dest, sec-fetch-mode, sec-fetch-sitemethod, path, authority, scheme, user-agent, accept, accept-language, accept-encoding, upgrade-insecure-requests, sec-fetch-dest, sec-fetch-mode, sec-fetch-sitemethod, path, authority, scheme, user-agent, accept, accept-language, accept-encoding, upgrade-insecure-requests, sec-fetch-dest, sec-fetch-mode, sec-fetch-site

What page scripts see

Read with page.evaluate on example.com. Cores and memory are the server's and vary between fleet nodes.

Firefox, headlessCamoufox, headlessCamoufox, headless "virtual"
navigator.userAgentMozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0Mozilla/5.0 (X11; Linux x86_64; rv:156.0) Gecko/20100101 Firefox/156.0Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:156.0) Gecko/20100101 Firefox/156.0
navigator.platform / vendorLinux x86_64 / ""Linux x86_64 / ""Win32 / ""
Languages—es-ES, esen-ES, en
Timezone / localeUTC / en-GBEurope/Madrid / es-ESEurope/Madrid / en-ES
Screen (w×h×availW×availH×depth)1280x720x1280x720x241920x1080x1920x1053x243440x1440x3440x1400x24
Window outer / inner / DPR1280x720 / 1280x720 / 11280x806 / 1280x720 / 11280x805 / 1280x720 / 1
hardwareConcurrency / deviceMemory64 / —12 / —8 / —
WebGL vendorMesaAMDGoogle Inc. (AMD)
WebGL rendererllvmpipe, or similarRadeon HD 3200 Graphics, or similarANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar
WebGL versionWebGL 2.0WebGL 2.0WebGL 2.0
WebGPU (navigator.gpu)nonono
Canvas hash71eb691771bfd7edeb7fc317
navigator.webdriveryesnono
window.chrome / navigator.connectionno / nono / nono / no
Plugins / PDF viewer0 / no5 / yes5 / yes
Notification.permission / permissions.querydefault / promptdefault / promptdefault / prompt

Web platform features

Presence probes; a user agent that claims one version while exposing another's features is a detectable inconsistency.

Firefox, headlessCamoufox, headlessCamoufox, headless "virtual"
Iterator.prototype.includes (new in Chrome 154)noyesyes
FontFace.width (new in Chrome 154)noyesyes
CSS text-decoration-inset (new in Chrome 154)yesyesyes
Iterator.prototype.join (Chrome 153)noyesyes
Iterator.zip (Chrome 153)yesyesyes
CSS scroll-axis-lock (Chrome 153)nonono
<camera> element (Chrome 153)nonono
document.requestStorageAccessFor (deprecated in 153)nonono
Topics API (document.browsingTopics)nonono
Protected Audience (navigator.joinAdInterestGroup)nonono
Shared Storage (window.sharedStorage)nonono
Attribution Reporting (window.attributionReporting)nonono
Private Aggregationnonono
WebHID (navigator.hid)nonono
CSS margin-trim (Chrome 155)nonono
CSS text-decoration-skip-spaces (Chrome 155)nonono
CSS corner shorthand (Chrome 155)nonono
CSS symbols() (Chrome 155)yesyesyes
Element.streamAppendHTML (Chrome 155)nonono
WebTransport.reliability (Chrome 155)yesyesyes
window.maximize() — Additional Windowing Controls (Chrome 155)nonono
Canvas srgb-linear colour space (Chrome 155)nonono
Permission policy media-playback-while-not-visible (Chrome 155)nonono
CSS random() (Chrome 156)nonono
CSS scroll-snap-type: pair (Chrome 156)nonono
Fenced frames (window.fence) — removal starts in 157nonono
rel=compression-dictionary (Chrome 156 updates)nonono

bot.sannysoft.com

The classic headless-detection test page; what it marks red.

Firefox, headlessCamoufox, headlessCamoufox, headless "virtual"
Checks / failed57 / 457 / 157 / 1
Failed checksWebDriver (New), Chrome (New), Plugins Length (Old), Plugins is of type PluginArrayChrome (New)Chrome (New)

A plain-HTTP URL (http://ip-api.com/json)

Chrome 154 warns before loading insecure HTTP by default — does that reach an automated session?

Firefox, headlessCamoufox, headlessCamoufox, headless "virtual"
Final URLhttp://ip-api.com/json/?fields=statushttp://ip-api.com/json/?fields=statushttp://ip-api.com/json/?fields=status
HTTP status200200200
Content loaded / warning page firstyes / noyes / noyes / no

Playwright over the remote connection

Which client features work on this side.

Firefox, headlessCamoufox, headlessCamoufox, headless "virtual"
page.evaluate runs in the page's own worldyesnono
main_world_eval option (mw: prefix)—yesyes
addInitScript visible to page scriptsyesnono
Console eventsyesyesyes
Request interception (page.route)yesyesyes
Screenshotyesyesyes
PDFno — Error: page.pdf: PDF generation is only supported for Headless Chromiumno — Error: page.pdf: PDF generation is only supported for Headless Chromiumno — Error: page.pdf: PDF generation is only supported for Headless Chromium
Mobile device emulationno — Error: browser.newContext: options.isMobile is not supported in Firefoxno — Error: browser.newContext: options.isMobile is not supported in Firefoxno — Error: browser.newContext: options.isMobile is not supported in Firefox
Tracingyesyesyes

Rows where the two sides differ are highlighted. IP addresses are replaced with placeholders (203.0.113.x). The probe is compare/probe.mjs in our repository; the raw result is below.

Raw output
{
  "ran_at": "2026-10-25T02:03:17.998Z",
  "sides": [
    {
      "label": "Firefox, headless",
      "engine": "firefox",
      "body": {
        "headless": true
      },
      "launch": {
        "browser": "firefox",
        "resource_class": "linux_headless",
        "weight": 1,
        "launch_ms": 938,
        "connect_ms": 152,
        "example_ms": 1553,
        "peet_ms": 1260
      },
      "network": {
        "http_version": "h2",
        "ja4": "t13d1617h2_86a278354501_3cbfd9057e0d",
        "ja3_hash": "6447ab086255d194909d4013b1a89e87",
        "peetprint_hash": "fd4547eeb41f073156b7bc8125a79a3c",
        "ciphers": 16,
        "extensions": 17,
        "akamai_h2": "1:65536;2:0;4:131072;5:16384|12517377|0|m,p,a,s",
        "akamai_h2_hash": "6ea73faa8fc5aac76bded7bd238f6433",
        "header_order": [
          "method",
          "path",
          "authority",
          "scheme",
          "user-agent",
          "accept",
          "accept-language",
          "accept-encoding",
          "upgrade-insecure-requests",
          "sec-fetch-dest",
          "sec-fetch-mode",
          "sec-fetch-site"
        ]
      },
      "page": {
        "user_agent": "Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0",
        "platform": "Linux x86_64",
        "vendor": "",
        "languages": [
          "undefined"
        ],
        "hardware_concurrency": 64,
        "device_memory": null,
        "max_touch_points": 0,
        "webdriver": true,
        "plugins": 0,
        "pdf_viewer": false,
        "ua_data": null,
        "screen": "1280x720x1280x720x24",
        "window": {
          "outer": "1280x720",
          "inner": "1280x720",
          "dpr": 1
        },
        "timezone": "UTC",
        "locale": "en-GB",
        "webgl": {
          "vendor": "Mesa",
          "renderer": "llvmpipe, or similar",
          "version": "WebGL 2.0"
        },
        "canvas_hash": "71eb6917",
        "webgpu": false,
        "chrome_object": false,
        "chrome_runtime": false,
        "notification_permission": "default",
        "notification_query": "prompt",
        "has_focus": true,
        "connection_api": false,
        "stack_read_by_debugger": false,
        "features": {
          "iterator_includes": false,
          "iterator_join": false,
          "iterator_zip": true,
          "fontface_width": false,
          "css_text_decoration_inset": true,
          "css_scroll_axis_lock": false,
          "websocket_options_bag": null,
          "camera_element": false,
          "topics_api": false,
          "protected_audience": false,
          "shared_storage": false,
          "attribution_reporting": false,
          "request_storage_access_for": false,
          "webhid": false,
          "private_aggregation": false,
          "css_margin_trim": false,
          "css_text_decoration_skip_spaces": false,
          "css_corner_shorthand": false,
          "css_symbols": true,
          "stream_append_html": false,
          "webtransport_reliability": true,
          "window_maximize": false,
          "canvas_srgb_linear": false,
          "policy_media_playback_while_not_visible": false,
          "css_random": false,
          "css_scroll_snap_pair": false,
          "fenced_frames": false,
          "compression_dictionary": false
        }
      },
      "page_main_world": null,
      "sannysoft": {
        "checks": 57,
        "failed": 4,
        "failed_names": [
          "WebDriver (New)",
          "Chrome (New)",
          "Plugins Length (Old)",
          "Plugins is of type PluginArray"
        ],
        "passed": 27
      },
      "plain_http": {
        "final_url": "http://ip-api.com/json/?fields=status",
        "status": 200,
        "title": "",
        "loaded": true,
        "warning_page": false,
        "page_text": "{\"status\":\"success\"}"
      },
      "playwright": {
        "evaluate_in_main_world": true,
        "console_events": true,
        "init_script": true,
        "route": true,
        "screenshot": true,
        "pdf": false,
        "pdf_error": "Error: page.pdf: PDF generation is only supported for Headless Chromium",
        "mobile_emulation": false,
        "mobile_emulation_error": "Error: browser.newContext: options.isMobile is not supported in Firefox",
        "tracing": true
      },
      "browser_version": "150.0.2"
    },
    {
      "label": "Camoufox, headless",
      "engine": "camoufox",
      "body": {
        "headless": true,
        "main_world_eval": true
      },
      "launch": {
        "browser": "camoufox",
        "resource_class": "linux_headless",
        "weight": 1,
        "launch_ms": 1747,
        "connect_ms": 123,
        "example_ms": 2406,
        "peet_ms": 858
      },
      "network": {
        "http_version": "h2",
        "ja4": "t13d1517h2_8daaf6152771_3cbfd9057e0d",
        "ja3_hash": "9d42e90b0225e779f03141ddcd699df2",
        "peetprint_hash": "a4bbbc7e3adf3db97d276fd0adb1efc4",
        "ciphers": 15,
        "extensions": 17,
        "akamai_h2": "1:65536;2:0;4:131072;5:16384|12517377|0|m,p,a,s",
        "akamai_h2_hash": "6ea73faa8fc5aac76bded7bd238f6433",
        "header_order": [
          "method",
          "path",
          "authority",
          "scheme",
          "user-agent",
          "accept",
          "accept-language",
          "accept-encoding",
          "upgrade-insecure-requests",
          "sec-fetch-dest",
          "sec-fetch-mode",
          "sec-fetch-site"
        ]
      },
      "page": {
        "user_agent": "Mozilla/5.0 (X11; Linux x86_64; rv:156.0) Gecko/20100101 Firefox/156.0",
        "platform": "Linux x86_64",
        "vendor": "",
        "languages": [
          "es-ES",
          "es"
        ],
        "hardware_concurrency": 12,
        "device_memory": null,
        "max_touch_points": 0,
        "webdriver": false,
        "plugins": 5,
        "pdf_viewer": true,
        "ua_data": null,
        "screen": "1920x1080x1920x1053x24",
        "window": {
          "outer": "1280x806",
          "inner": "1280x720",
          "dpr": 1
        },
        "timezone": "Europe/Madrid",
        "locale": "es-ES",
        "webgl": {
          "vendor": "AMD",
          "renderer": "Radeon HD 3200 Graphics, or similar",
          "version": "WebGL 2.0"
        },
        "canvas_hash": "71bfd7ed",
        "webgpu": false,
        "chrome_object": false,
        "chrome_runtime": false,
        "notification_permission": "default",
        "notification_query": "prompt",
        "has_focus": true,
        "connection_api": false,
        "stack_read_by_debugger": false,
        "features": {
          "iterator_includes": true,
          "iterator_join": true,
          "iterator_zip": true,
          "fontface_width": true,
          "css_text_decoration_inset": true,
          "css_scroll_axis_lock": false,
          "websocket_options_bag": null,
          "camera_element": false,
          "topics_api": false,
          "protected_audience": false,
          "shared_storage": false,
          "attribution_reporting": false,
          "request_storage_access_for": false,
          "webhid": false,
          "private_aggregation": false,
          "css_margin_trim": false,
          "css_text_decoration_skip_spaces": false,
          "css_corner_shorthand": false,
          "css_symbols": true,
          "stream_append_html": false,
          "webtransport_reliability": true,
          "window_maximize": false,
          "canvas_srgb_linear": false,
          "policy_media_playback_while_not_visible": false,
          "css_random": false,
          "css_scroll_snap_pair": false,
          "fenced_frames": false,
          "compression_dictionary": false
        }
      },
      "page_main_world": {
        "user_agent": "Mozilla/5.0 (X11; Linux x86_64; rv:156.0) Gecko/20100101 Firefox/156.0",
        "platform": "Linux x86_64",
        "vendor": "",
        "languages": [
          "es-ES",
          "es"
        ],
        "hardware_concurrency": 12,
        "device_memory": null,
        "max_touch_points": 0,
        "webdriver": false,
        "plugins": 5,
        "pdf_viewer": true,
        "ua_data": null,
        "screen": "1920x1080x1920x1053x24",
        "window": {
          "outer": "1280x806",
          "inner": "1280x720",
          "dpr": 1
        },
        "timezone": "Europe/Madrid",
        "locale": "es-ES",
        "webgl": {
          "vendor": "AMD",
          "renderer": "Radeon HD 3200 Graphics, or similar",
          "version": "WebGL 2.0"
        },
        "canvas_hash": "71bfd7ed",
        "webgpu": false,
        "chrome_object": false,
        "chrome_runtime": false,
        "notification_permission": "default",
        "notification_query": "prompt",
        "has_focus": true,
        "connection_api": false,
        "stack_read_by_debugger": false,
        "features": {
          "iterator_includes": true,
          "iterator_join": true,
          "iterator_zip": true,
          "fontface_width": true,
          "css_text_decoration_inset": true,
          "css_scroll_axis_lock": false,
          "websocket_options_bag": null,
          "camera_element": false,
          "topics_api": false,
          "protected_audience": false,
          "shared_storage": false,
          "attribution_reporting": false,
          "request_storage_access_for": false,
          "webhid": false,
          "private_aggregation": false,
          "css_margin_trim": false,
          "css_text_decoration_skip_spaces": false,
          "css_corner_shorthand": false,
          "css_symbols": true,
          "stream_append_html": false,
          "webtransport_reliability": true,
          "window_maximize": false,
          "canvas_srgb_linear": false,
          "policy_media_playback_while_not_visible": false,
          "css_random": false,
          "css_scroll_snap_pair": false,
          "fenced_frames": false,
          "compression_dictionary": false
        }
      },
      "sannysoft": {
        "checks": 57,
        "failed": 1,
        "failed_names": [
          "Chrome (New)"
        ],
        "passed": 30
      },
      "plain_http": {
        "final_url": "http://ip-api.com/json/?fields=status",
        "status": 200,
        "title": "",
        "loaded": true,
        "warning_page": false,
        "page_text": "{\"status\":\"success\"}"
      },
      "playwright": {
        "evaluate_in_main_world": false,
        "console_events": true,
        "init_script": false,
        "route": true,
        "screenshot": true,
        "pdf": false,
        "pdf_error": "Error: page.pdf: PDF generation is only supported for Headless Chromium",
        "mobile_emulation": false,
        "mobile_emulation_error": "Error: browser.newContext: options.isMobile is not supported in Firefox",
        "tracing": true,
        "main_world_eval_option": true
      },
      "browser_version": "156.0.1-beta.34"
    },
    {
      "label": "Camoufox, headless \"virtual\"",
      "engine": "camoufox",
      "body": {
        "headless": "virtual",
        "main_world_eval": true
      },
      "launch": {
        "browser": "camoufox",
        "resource_class": "linux_headful",
        "weight": 2,
        "launch_ms": 4861,
        "connect_ms": 18,
        "example_ms": 1037,
        "peet_ms": 1528
      },
      "network": {
        "http_version": "h2",
        "ja4": "t13d1517h2_8daaf6152771_3cbfd9057e0d",
        "ja3_hash": "9d42e90b0225e779f03141ddcd699df2",
        "peetprint_hash": "a4bbbc7e3adf3db97d276fd0adb1efc4",
        "ciphers": 15,
        "extensions": 17,
        "akamai_h2": "1:65536;2:0;4:131072;5:16384|12517377|0|m,p,a,s",
        "akamai_h2_hash": "6ea73faa8fc5aac76bded7bd238f6433",
        "header_order": [
          "method",
          "path",
          "authority",
          "scheme",
          "user-agent",
          "accept",
          "accept-language",
          "accept-encoding",
          "upgrade-insecure-requests",
          "sec-fetch-dest",
          "sec-fetch-mode",
          "sec-fetch-site"
        ]
      },
      "page": {
        "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:156.0) Gecko/20100101 Firefox/156.0",
        "platform": "Win32",
        "vendor": "",
        "languages": [
          "en-ES",
          "en"
        ],
        "hardware_concurrency": 8,
        "device_memory": null,
        "max_touch_points": 5,
        "webdriver": false,
        "plugins": 5,
        "pdf_viewer": true,
        "ua_data": null,
        "screen": "3440x1440x3440x1400x24",
        "window": {
          "outer": "1280x805",
          "inner": "1280x720",
          "dpr": 1
        },
        "timezone": "Europe/Madrid",
        "locale": "en-ES",
        "webgl": {
          "vendor": "Google Inc. (AMD)",
          "renderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar",
          "version": "WebGL 2.0"
        },
        "canvas_hash": "eb7fc317",
        "webgpu": false,
        "chrome_object": false,
        "chrome_runtime": false,
        "notification_permission": "default",
        "notification_query": "prompt",
        "has_focus": true,
        "connection_api": false,
        "stack_read_by_debugger": false,
        "features": {
          "iterator_includes": true,
          "iterator_join": true,
          "iterator_zip": true,
          "fontface_width": true,
          "css_text_decoration_inset": true,
          "css_scroll_axis_lock": false,
          "websocket_options_bag": null,
          "camera_element": false,
          "topics_api": false,
          "protected_audience": false,
          "shared_storage": false,
          "attribution_reporting": false,
          "request_storage_access_for": false,
          "webhid": false,
          "private_aggregation": false,
          "css_margin_trim": false,
          "css_text_decoration_skip_spaces": false,
          "css_corner_shorthand": false,
          "css_symbols": true,
          "stream_append_html": false,
          "webtransport_reliability": true,
          "window_maximize": false,
          "canvas_srgb_linear": false,
          "policy_media_playback_while_not_visible": false,
          "css_random": false,
          "css_scroll_snap_pair": false,
          "fenced_frames": false,
          "compression_dictionary": false
        }
      },
      "page_main_world": {
        "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:156.0) Gecko/20100101 Firefox/156.0",
        "platform": "Win32",
        "vendor": "",
        "languages": [
          "en-ES",
          "en"
        ],
        "hardware_concurrency": 8,
        "device_memory": null,
        "max_touch_points": 5,
        "webdriver": false,
        "plugins": 5,
        "pdf_viewer": true,
        "ua_data": null,
        "screen": "3440x1440x3440x1400x24",
        "window": {
          "outer": "1280x805",
          "inner": "1280x720",
          "dpr": 1
        },
        "timezone": "Europe/Madrid",
        "locale": "en-ES",
        "webgl": {
          "vendor": "Google Inc. (AMD)",
          "renderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar",
          "version": "WebGL 2.0"
        },
        "canvas_hash": "eb7fc317",
        "webgpu": false,
        "chrome_object": false,
        "chrome_runtime": false,
        "notification_permission": "default",
        "notification_query": "prompt",
        "has_focus": true,
        "connection_api": false,
        "stack_read_by_debugger": false,
        "features": {
          "iterator_includes": true,
          "iterator_join": true,
          "iterator_zip": true,
          "fontface_width": true,
          "css_text_decoration_inset": true,
          "css_scroll_axis_lock": false,
          "websocket_options_bag": null,
          "camera_element": false,
          "topics_api": false,
          "protected_audience": false,
          "shared_storage": false,
          "attribution_reporting": false,
          "request_storage_access_for": false,
          "webhid": false,
          "private_aggregation": false,
          "css_margin_trim": false,
          "css_text_decoration_skip_spaces": false,
          "css_corner_shorthand": false,
          "css_symbols": true,
          "stream_append_html": false,
          "webtransport_reliability": true,
          "window_maximize": false,
          "canvas_srgb_linear": false,
          "policy_media_playback_while_not_visible": false,
          "css_random": false,
          "css_scroll_snap_pair": false,
          "fenced_frames": false,
          "compression_dictionary": false
        }
      },
      "sannysoft": {
        "checks": 57,
        "failed": 1,
        "failed_names": [
          "Chrome (New)"
        ],
        "passed": 30
      },
      "plain_http": {
        "final_url": "http://ip-api.com/json/?fields=status",
        "status": 200,
        "title": "",
        "loaded": true,
        "warning_page": false,
        "page_text": "{\"status\":\"success\"}"
      },
      "playwright": {
        "evaluate_in_main_world": false,
        "console_events": true,
        "init_script": false,
        "route": true,
        "screenshot": true,
        "pdf": false,
        "pdf_error": "Error: page.pdf: PDF generation is only supported for Headless Chromium",
        "mobile_emulation": false,
        "mobile_emulation_error": "Error: browser.newContext: options.isMobile is not supported in Firefox",
        "tracing": true,
        "main_world_eval_option": true
      },
      "browser_version": "156.0.1-beta.34"
    }
  ]
}

Bottom line

Headless is where stock Firefox gives itself away most clearly: a window with no chrome, a screen the size of the page, a software GPU and an automation flag. Camoufox answers every one of those from the persona, in both of its headless modes.

The one thing Camoufox can't change is that it is Firefox: checks for Chrome, and sites that only serve Chromium, see Firefox either way.