Benchmark · method

How we test antidetect browsers

We fixed the method on 2026-10-28, before any result. Every product ran with the same rules, on the same computer, with its default settings. This page lists each rule, each dropped check, and each deviation, so that you can check every score.

Tested 2026-10-28/29

Direct answer

Each browser gets up to 100 points in seven sections: real anti-bot checks (35), profiles that cannot be linked (20), no impossible values (15), engine freshness (10), public checkers (10), speed and RAM (5), and price and openness (5). Two profiles of each product ran on one Linux server, each product on its own fresh US ISP proxy, with stock Chrome as a control on the same IP. We make AliasMode, and it was scored with the same rules.

Scoring

The rule for every point. The same rules apply to every browser.
SectionPointsRule
Real anti-bot checks35Cloudflare: 14 × pages passed / 3. reCAPTCHA v3: 11.2 × (score − 0.1) / 0.8, from 0 to 11.2. Fingerprint Pro: 4.2 for no bot flag, 2.8 for no tampering flag, and 2.8 for no virtual machine flag.
Profiles cannot be linked2020 × hashed signals that differ between the two profiles / 7
No impossible values1515 × (1 − impossible values / 10), at least 0
Engine freshness1010 − 2.5 × major versions behind the stable browser, at least 0. Chromium engines are compared with Chrome stable (156), Firefox engines with Firefox stable (159), on the test day. When the user agent claims a newer version than the engine, the engine version counts.
Public checkers10CreepJS, BrowserScan, and Pixelscan, 10/3 points each. CreepJS: full points with no lies and no headless or stealth flag, half with 1 or 2 lies, else 0. BrowserScan: full points × the authenticity percent. Pixelscan: full points when it says consistent and finds no masking, half with one problem, else 0.
Speed and RAM52.5 × fastest launch / this launch, plus 2.5 × lowest RAM / this RAM
Price and openness5Free plan with 10 or more profiles: 2, with 3 to 9 profiles: 1. Open-source app: 1. Open-source engine: 1. Cheapest paid plan $10 a month or less, or no paid plan needed: 1.

The plan gave DataDome 10 points, Cloudflare 10, reCAPTCHA v3 8, and Fingerprint Pro 7 (3, 2, and 2). DataDome was dropped, as explained below, so the other three checks were scaled by 1.4 to keep 35 points.

Tiers

TierTotal score
S85 and more
A70 to 84.9
B55 to 69.9
C40 to 54.9
DLess than 40

The test computer and the profiles

  • One Linux x86_64 server with 16 cores, 31 GB RAM, and no GPU. The display is a virtual X display (Xvfb). Every product has the same host.
  • Free plans or free trials only, with no payment. A product with paid plans only is listed as not tested. So is a product with no Linux desktop app.
  • Identity: Windows, the newest browser version that the product offers, and US English. Timezone, geolocation, and WebRTC stay at the product default, which is usually “based on IP”. All other settings stay at the product defaults. No tuning.
  • Two profiles per product, A and B, because the smallest free plan allows two.
  • We wrote down the app version and the engine version of every product, and turned off automatic updates where the app allows it.
  • AppImages were extracted and run, because this host cannot mount them.

Stock Chrome as the control

Before each product, stock Google Chrome for Linux, with no changes, ran the real anti-bot checks on the IP of that product. If the control failed a check, the IP was replaced once. If the control failed again, that check would be dropped for that product and its points spread over the other real checks.

With the final IPs, stock Chrome passed the first Cloudflare page, scored 0.9 on reCAPTCHA v3, and had no Fingerprint Pro flag, for every product. So a flag on a product comes from the product, not from its IP.

Proxies and pacing

  • Each product got a fresh US ISP proxy of its own, from the same provider. Both profiles of a product used that IP.
  • At least 5 minutes passed between two DataDome page loads on one IP.
  • The first Cloudflare page sets a clearance cookie that lasts a year. So the second and third Cloudflare tries used two other challenge pages on other domains, which no profile had visited.

How the browsers were started and driven

  • Each profile started the way the product’s own app starts it.
  • We opened every page by typing its URL with keyboard input from the operating system. We attached no CDP or Playwright session to any browser that an app manages.
  • Camoufox and CloakBrowser are libraries, so they started through their own documented API. That is their only normal use.
  • AliasMode profiles started through the AliasMode app’s own launcher.
  • We never clicked a Cloudflare checkbox.
  • Evidence: a screenshot for every verdict, the page text copied with the keyboard (Ctrl+A, Ctrl+C), the probe data, and a screen recording of each run.

The checks

Every check, the page it ran on, and what counts.
CheckPageWhat counts
Cloudflare managed challengescrapingcourse.com, zerocaptcha.io, capskip.comThe page passes with no click within 30 seconds. Page 1 ran in profile A. Pages 2 and 3 ran one in each profile.
reCAPTCHA v3The antcpt.com score detectorThe score that the page shows
Fingerprint ProThe public Fingerprint demo playgroundThe Bot, Browser Tampering, and Virtual Machine smart signals
CreepJSThe public CreepJS pageLies, and the headless and stealth percents
BrowserScanbrowserscan.netThe fingerprint authenticity percent
Pixelscanpixelscan.netThe consistency verdict and masking
Local probeOur own page, served on the test computerThe 7 hashed signals, the 15 impossible-value checks, and the user agent and engine version

The 7 hashed signals

The probe page hashes each of these signals in profile A and in profile B of the same product. A signal counts when the two hashes differ. A value that is empty in both profiles counts as the same value.

  • Canvas 2D image
  • WebGL image readback
  • Audio (an offline render)
  • Text metrics
  • DOMRect and emoji size
  • Font list
  • Speech voices

The 15 impossible values

Each value counts once. They are checked against stock Chrome on Windows, or stock Firefox on Windows for Firefox engines.

  1. navigator.platform is not Win32.
  2. The user-agent client hints do not say Windows, or the platform version is impossible.
  3. The user agent, the client-hint version, and the real engine version disagree.
  4. userAgentData is missing, or its brand list is malformed (Chromium engines).
  5. Core Windows fonts are missing, or Linux-only fonts are visible.
  6. The WebGL renderer is not a Windows ANGLE or Direct3D string, or a software renderer (SwiftShader or llvmpipe) is visible.
  7. The timezone differs from the timezone of the proxy IP.
  8. navigator.languages and the Accept-Language header disagree.
  9. WebRTC shows a public IP that is not the proxy IP.
  10. The speech voices are not Windows voices.
  11. Screen values are impossible: the available size is larger than the screen, or the offsets or the pixel ratio are odd.
  12. hardwareConcurrency or deviceMemory has an impossible value.
  13. navigator.webdriver is true, or automation traces are visible.
  14. Native-code checks fail on patched functions (toString or prototype lies).
  15. Any other value that stock Chrome or Firefox on Windows never shows, written down with the evidence.

Speed and RAM

Launch time runs from the start command until the probe page is fully loaded. RAM is the total proportional set size (PSS) of the browser process tree, with one probe tab, 60 seconds after the start. Each product had a warm-up launch, and then 3 measured launches. The pages show the median of the 3.

Dropped checks

  • DataDome (the GitHub sign-up page): stock Chrome was blocked on every IP where we tried it, 12 in all. So the host or its IP range is flagged, and the check could not separate the browsers. Its 10 points went to the other real checks.
  • iphey: it gave no verdict, even for stock Chrome on this host. Its points went to CreepJS, BrowserScan, and Pixelscan.
  • Pixelscan often stayed on “scanning” or “Collecting Data”, even for stock Chrome. Only a verdict that the page showed earns points.

Every deviation from the plan

  • Cloudflare is scored on 3 pages instead of 1 try. This changed on 2026-10-29, after the results, for every browser. One try proved too random: a retry of the same page 15 seconds later could change the result. Stock Chrome passed each new page on one of the test IPs before we used it.
  • Cloudflare page 3, Dolphin Anty and Octo Browser: the click that our harness uses to copy the page text opened a link on the page before the pass text was read. The try was repeated once in the same profile, and it passed. The profile may already have held a clearance, so these two passes count, with a flag in our notes.
  • CreepJS lies were counted from the saved page, the same way for every browser.
  • Timezone: the geo databases disagree for these IPs (Texas or Michigan). A timezone that matches ipinfo, ip-api, or the IP timezone that BrowserScan shows counts as correct.
  • This host blocks the Chrome sandbox, and we have no root. So every Chromium browser ran with --no-sandbox. The warning bar that this adds is not counted as an impossible value.
  • CloakBrowser (free 146) and MoreLogin Chrome got a new IP once, because stock Chrome failed Cloudflare on their first IP.
  • Octo Browser has no free plan, so it ran on its free 2-day trial (code TRIAL, no payment). GoLogin ran on its free 7-day trial.
  • The Octo Browser app clears the library path of the host, so its engine got a small wrapper that restores it. The wrapper adds a few milliseconds to the launch time.
  • Dolphin Anty refused one temporary email domain and accepted another. Its new profiles default to Linux, so we chose Windows 11.
  • GoLogin’s new profiles first launched Orbita 109, until the app’s own “Update profiles” step. The Orbita 154 run is scored.
  • Donut Browser’s free plan offers no Windows identity, so it ran with a Linux identity. Its impossible values are counted against Windows, as the method requires.
  • The AdsPower free plan holds 2 profiles. SunBrowser and FlowerBrowser were tested one after the other, each with two new profiles. For the two later Cloudflare tries, each engine used one profile.
  • DICloak’s free plan allows 15 opens a day. Its 3 speed launches had no warm-up, and each one restored extra tabs, so its RAM figure includes those tabs.
  • One speed launch of AliasMode Firefox did not load the probe page (a fault in our harness), and one launch of Donut Browser restored a tab from an earlier session. Each was repeated once.
  • The Camoufox launch time includes the library’s own location lookup through the proxy, about 3 seconds.
  • AliasMode Chromium ran from the AliasMode app source with the Linux engine build that ships in beta.70, before the release, on 2026-10-29. Its profiles started through the app’s Local API, which uses the same launcher as the app window.
  • An early AliasMode Chromium run was discarded: another script on the host reached its control port. Later runs used a port that the script cannot reach. No other profile was touched.

Reruns

We rerun a product when its vendor asks for a run on a paid plan through our contact page, or when our harness caused a failure. A product that cannot finish a check gets 0 for that check, with a note. Every rerun uses this method and gets a dated line in the changelog on the tier list page.

Limits and bias

  • We make AliasMode, one of the tested products.
  • The list of impossible values comes from the checks that AliasMode runs before its own releases.
  • The Cloudflare rule changed after the results.
  • One computer with no GPU, one IP per product, and free plans or trials only. A Windows PC with a graphics card, or a paid plan, can give other results.