Skip to content
Browsa

Phantom, the browser your agents run on

Phantom is Browsa's own browser built on Chromium: one build for every customer on every plan, measured in public.

From your code to the site
  1. Your codePlaywright, Puppeteer, raw CDP or MCP
  2. Browsa APIPOST /v1/agents picks one coherent machine
  3. PhantomBuilt in, no random noise
    • navigator
    • WebGL
    • WebGPU
    • Screen
    • Fonts
    • Voices
    • Permissions
    • Time zone
  4. The siteVia your proxy, or from our data center
Measured on production
Browser
Default, macOS
Network
No proxy, our data center
Compared with
Regular Chrome on a real Mac

What public checks reported

One production run, no proxy. The miss is shown with the passes.

Measured on

bot.sannysoft.com
31/ 31checks passed
fingerprint-scan.com
0/ 100bot score, lower is better
deviceandbrowserinfo.com
0/ 22signals raised, not flagged
Twelve real sites
10/ 12opened: 7 untouched, 3 after one click

Of the twelve sites, three showed Cloudflare's full-page check and opened after one click on its checkbox, and two did not load. No browser passes every check. Every result, misses included.

Measured values and known gaps

Each area, what Phantom does, and what a default browser reported next to a real Mac.

Measured on

  • navigatorNo gap

    Sets user agent, platform, languages, vendor, hardwareConcurrency and deviceMemory for the chosen OS, with the same values in workers and iframes. Cores, memory, screen and GPU name are chosen together as one machine

    macOS user agent and platform: MacIntel, languages en-US, en; hardwareConcurrency 14, deviceMemory 32. A dedicated worker, a shared worker and an iframe reported the same values. The userAgentData architecture was arm in the page, the dedicated worker and the shared worker, as on the real Mac; earlier that day the first page of a session read x86. The Chrome major version in the user agent was one behind the latest stable release that rebrowser-bot-detector looked up; its version test passed.

  • Automation flagNo gap

    navigator.webdriver is present and false, as in regular Chrome. Ordinary pages get no chrome.runtime object. The cdc_* properties automation drivers leave behind are absent

    navigator.webdriver is false and 'webdriver' in navigator is true, the same as regular Chrome on a real Mac. window.chrome has loadTimes, csi and app and no runtime, the same keys as on the real Mac

  • Automation clientNo gap

    Console behaviour, error timing and error stack traces are the same with an automation client attached as without one

    rebrowser-bot-detector passed all 18 tests it ran, with unmodified Playwright as our test client, runtimeEnableLeak and sourceUrlLeak among them. deviceandbrowserinfo.com raised none of its 22 signals; isAutomatedWithCDP, isAutomatedWithCDPInWebWorker and hasInconsistentTimingResolution were all false. In the first run of the day sourceUrlLeak failed; on 12 November 2026 hasInconsistentTimingResolution was raised.

  • PermissionsNo gap

    Permission states follow regular Chrome defaults

    All 20 permission states our probe queries matched regular Chrome on a real Mac: for example notifications, geolocation, camera and microphone prompt, clipboard-write and the motion sensors granted

  • WebGLGaps

    Reports a GPU vendor and renderer for the chosen OS, in the format Chrome uses

    On macOS: vendor Google Inc. (Apple), renderer ANGLE (Apple, ANGLE Metal Renderer: Apple M2, Unspecified Version), the strings the real Mac reports. The same 39 WebGL and 36 WebGL2 extensions and the same limits as on the real Mac (38 against 39 extensions on 12 November 2026). deviceandbrowserinfo.com did not raise hasInconsistentWebGLShaderLang; it did on 12 November.

    Gaps: drawing runs in software, so a shader draw test took 716 ms against 108 ms on the real Mac, and the image it drew differs; CreepJS listed two notes, "suspicious gpu" and "suspicious capabilities"

  • WebGPUGap

    Exposes the WebGPU API with an adapter

    navigator.gpu returns an adapter with vendor apple and architecture metal-3. Its 25 features and preferred format bgra8unorm are the same as in regular Chrome of the same major version on an Apple M2, and the 36 limits fingerprint-scan.com read are the same too. On 12 November 2026 no adapter was available.

    Gap: it draws in software, so WebGPU work is slower than on a real GPU. We did not time it in this run

  • Screen and windowNo gap

    Sets screen size, color depth and pixel ratio. A Mac profile gets the built-in display of a Mac that shipped with its chip, with that model's menu bar; scrollbars are overlay scrollbars and the display reports P3 colour

    1512 x 982, color depth 30, pixel ratio 2, with a 32 px menu bar, on a profile with an M3 Max chip. Scrollbars take no width; color-gamut: p3 and dynamic-range: high match, as on the real Mac (a 1470 x 956 screen with the same 32 px bar). In the first run of the day a profile had 1920 x 1080 with a 25 px bar, which no Mac laptop has.

  • Canvas and audioGaps

    Adds no random noise. Anti-aliased edges in canvas and WebGL output are drawn slightly differently for each identity, and the same way every time for that identity, as they differ between real machines. Audio is not varied

    Canvas: the same result on repeated draws, no altered pixels in a solid fill. Two default browsers gave different canvas and WebGL readouts; until that day's last build every browser gave the same ones. In a test of that build, one identity gave the same readouts in a second session. Audio: the same result on two runs, and a live sample rate of 48000 Hz as on the real Mac. CreepJS listed no lies.

    Gaps: the canvas image and text metrics differ from the real Mac; a 2D canvas test took 27 ms against 14 ms; the audio readout differs from the sixth decimal place (124.0434777 against 124.0434748); the live audio context reported running, and suspended on the real Mac

  • FontsGap

    Provides the fonts of the chosen OS

    All 37 macOS fonts our probe looks for were found, the same 37 as on the real Mac.

    Gap: text set in the generic system-ui, cursive, fantasy and emoji families measured different widths than on the real Mac (system-ui: about 890 px against 827 px), and an emoji drawn to a canvas came out differently

  • Voices and media devicesNo gap

    The speech voice list and the media device list follow a real Mac

    CreepJS counted 210 speech voices, 191 of them local, the same counts as on the real Mac. One audio input, one video input and one audio output, as on the real Mac

  • Video and DRMGaps

    Plays the codecs built into the Chromium build

    H.264, VP8, VP9 and AV1 are reported as playable. mediaCapabilities reports decoding as smooth and power efficient, as on the real Mac.

    Gaps: no HEVC video and no Widevine (com.widevine.alpha is refused); regular Chrome on the real Mac had both. WebRTC lists 13 video codecs against 15 on the real Mac: H.265 and one H.264 profile are missing

  • Time zone and languageNo gap

    Follow your proxy's country when you set a proxy. With no proxy, the time zone follows the address the traffic leaves from, and country does not change it

    No proxy: the time zone belongs to the country fingerprint-scan.com looked up for the exit address, and the page, both workers and an iframe reported the same zone. Language en-US

  • NetworkNot compared

    Bring your own HTTP, HTTPS or SOCKS5 proxy per browser. Without one, traffic leaves from our data center

    No proxy: traffic left from our data center, with a data-center IP address. WebRTC reported that same address

How we measured

Measured on production on 14 November 2026, after a new browser build went live that day, with a default browser: POST /v1/agents with only a TTL (macOS is the default os_type), no proxy. Page values were read by a probe script run through Playwright over CDP; detector values are what each public page showed in the same run. "The real Mac" is the same probe run in regular Chrome on a real Apple Silicon Mac on 12 November 2026, one major version behind our build. The WebGPU comparison used Chrome of the same major version as our build on an Apple M2. This is one run of one browser; the platform picks the machine, so screen size, cores and memory differ between browsers. Windows and Linux shapes were not measured on this build, so we do not list their values here.

More bot checks, passes and misses

Measured on

  • PassedNot detectedBotD: none of its 18 detectors fired
  • PassedPassedbrowserscan.net: "Browser fingerprint authenticity: 100%"
  • PassedTrustworthyiphey.com, score 100
  • MissMixedCreepJS: 0% headless, 0% stealth, 31% "like headless", two WebGL notes
  • PassedPassedrebrowser-bot-detector: 18 tests passed, none failed
  • MissMixedpixelscan.net: no automated behavior, but "Masking detected" and "Proxy detected"

On 9 November 2026 the trust score API gave a default browser 840 out of 1000. That number is an estimate computed from the browser's settings, not a result of these checks; 700 to 849 is the range a new browser with default settings starts in. How trust_score is computed.

Power-user overrides

Six overrides for finer control, set when the agent is created.

  • Empty means the platform default.
  • An invalid value falls back to the default rather than refusing the provision.
  • The overrides do not change the trust score.
OverrideAccepted valuesDefault
screen_resolution
1366x768, 1440x900, 1536x864, 1600x900, 1920x1080, 2560x1440, 3840x2160, mobile-iphone (390x844), mobile-android-pixel (412x915), or custom WxH (320≤W,H≤7680)
Platform picks (default browsers measured 1920x1080 and 1440x900 on 14 November 2026)
webrtc_mode
masked, real, disabled
masked
geolocation_mode
prompt, allow, block
prompt
geolocation_data
"lat,lng" string (lat∈[-90,90], lng∈[-180,180]), used when geolocation_mode="allow"
derived from country
media_devices_mode
masked, real
masked
port_scan_protection
masked, real
masked

1Set them on the agent at create time.

POST /v1/agents
curl https://browsa.io/v1/agents \
  -H "X-API-Key: agt_live_..." \
  -d '{
    "mode": "burner",
    "os_type": "OS_TYPE_MACOS",
    "country": "de",
    "screen_resolution": "2560x1440",
    "geolocation_mode": "allow",
    "geolocation_data": "52.5200,13.4050"
  }'

2Incoherent combinations are not refused (some advanced use cases want a mobile resolution on a macOS UA). They show up in warnings on GET /v1/agents/{id}/fingerprint.

GET /v1/agents/{id}/fingerprint
{
  "screen": { "width": 390, "height": 844, ... },
  "warnings": [
    "screen_resolution is smaller than a desktop screen but os_type is a desktop OS; a page can read both values",
    "media_devices_mode=real returns the host's device list, which is empty in our data center"
  ],
  ...
}

Verify it yourself

Four ways to audit the fingerprint yourself.

  1. GET /v1/agents/{id}/fingerprintThe wire-level preview for any provisioned agent.
  2. GET /v1/agents/{id}/trustThe per-factor trust-score breakdown.
  3. GET /v1/agents/{id}/detection-signalThe latest recorded harness run for your identity's fingerprint shape, or null when there is none from the last 14 days (the case on 9 November 2026).
  4. c.connect(agent_id)Connect to the agent via CDP in the SDK and open any bot-check page in it. Compare what you see with the measurements above.
verify.py
from browsa import Client
c = Client(api_key="agt_live_...")

agent = c.create_agent(country="us", os_type="OS_TYPE_MACOS")
print(c.fingerprint(agent["id"]))  # full wire spec
print(c.trust_breakdown(agent["id"]))  # why the score is what it is
print(c.connect(agent["id"]))  # paste-ready Playwright snippet

Why we publish this

So you can check Phantom against your own browser. If a value here doesn't match yours, email support@browsa.io with your agent_id.

Audit it on your own agent.

Start free with 100 credits. No card, no subscription.