- Test the actual commercial browser and record its version and profile settings.
- A rewritten user agent is not a substitute for testing a real antidetect profile.
- Separate detected, not detected and unavailable results before measuring performance.
- An allow recommendation or stable visitor identifier does not prove a genuine browser.
On this page
Test antidetect browser detection with real profiles, normal-browser controls and an explicit “unavailable” result. A detector that catches one altered profile has not proved universal coverage. A detector that returns no warning has not proved the browser is genuine. Maskbreak provides network and browser signals for signup, login and checkout, but those signals still need this kind of evaluation.
This is a test plan, not a published accuracy benchmark. It is intended for developers comparing detectors or checking their own integration. For the underlying concept, see what an antidetect browser changes.
Use the actual browser, not just a changed user agent
Changing navigator.userAgent in a test harness can exercise a consistency check. It does not reproduce an entire commercial antidetect browser. Real products can alter multiple surfaces together, and their behavior changes between releases and profile configurations.
For each test, record the browser product and version, operating system, profile configuration, network condition, collection time and deployed detector version when available. Use accounts and infrastructure you control. Keep only the evidence needed for the evaluation and restrict access to it; do not collect customer sessions just to fill a benchmark.
Keep a normal browser on the same machine and network as a control. Otherwise a changed proxy or operating system may explain a result you attribute to the antidetect tool. Test realistic abuse cases at the protected endpoint, following the OWASP approach to defining abuse cases, rather than judging only the appearance of a homepage scanner.
A small test matrix that answers useful questions
| Case | What it checks | Record separately |
|---|---|---|
| Normal Chrome, Safari or Firefox | Whether ordinary browsers trigger the tampering signal | Browser version, completed checks, false positives |
| Normal browser with a VPN | Whether network risk is being confused with browser tampering | VPN result versus device result |
| Real antidetect profile on the same network | Whether that specific profile is detected | Profile settings, positive or negative device signal |
| Several fresh profiles and repeated visits | How results vary across configurations and runs | Per-profile outcomes, not just the best run |
| SDK blocked or device event omitted | Whether missing evidence is handled honestly | Unavailable check, not a successful negative |
| Provider error or application timeout | Whether the fallback works without an accidental pass | Failure path and visitor-facing next step |
Do not tune rules only against the profiles you will use for your final check. Keep a separate group of normal and altered profiles for validation. A setting that catches one profile by also flagging an entire browser family can make the demonstration look better while harming real customers.
Wire it into your own app: a free key returns decision, risk_score and reasons for every visit, 1,000 requests an hour, no card.
Get an API keySeparate detection from evidence availability
Maskbreak’s server-side response contains device availability information. The API schema documents device.checked_signals and device.complete. Some legacy boolean fields remain false for compatibility when a signal was not checked. Reading those values without their availability information can turn an incomplete assessment into a misleading green result.
This helper classifies the antidetect signal only. It is for test reporting, not permission to authenticate a user or approve a payment.
function antidetectObservation(result) {
const device = result?.device;
if (!Array.isArray(device?.checked_signals) ||
!device.checked_signals.includes('antidetect') ||
typeof device.antidetect !== 'boolean') {
return 'unavailable';
}
return device.antidetect ? 'detected' : 'not_detected';
}For overall device coverage, also inspect device.complete. For the complete visit, consider network evidence and any degraded state too. A completed antidetect check does not mean every other check succeeded.
What does a missed antidetect profile mean?
If you know that the test used an actual antidetect profile and the completed check reports no detection, that is a false negative for this test. Preserve the result. Do not relabel it as a normal browser, silently remove it from the sample or replace it with a simulated positive.
If collection failed, classify the run as unavailable instead. That is an integration or coverage problem to investigate, not evidence that the detector correctly accepted the browser. A stable visitor identifier is a third, separate observation: linking visits and recognizing tampering are different tasks.
Consistent WebGL and WebGPU reports are similarly limited evidence. They can show that the values agreed in that check; they do not establish a genuine browser or a unique physical device. Experimental consistency checks should not quietly become production blocking rules without validation.
Measure the misses and the customer cost
Report three counts for each group: detected, not detected and unavailable. Among completed known-antidetect tests, missed detections divided by completed tests gives the sample’s false-negative rate. Among completed normal-browser tests, detections divided by completed tests gives its false-positive rate. Report the unavailable share separately so outages cannot improve either rate on paper.
Always publish the denominators and scope. A small set of profiles does not establish population-wide accuracy, and a single brand-wide percentage hides version and configuration differences. In production, also check how many legitimate customers finish a review step, abandon it or contact support.
Use the findings before you turn on blocking
Start by observing results on the actual action you want to protect. Confirm that the server evaluates fresh browser evidence and that all routes capable of completing that action apply the same policy. Keep authentication, authorization and abuse limits independent of the detector.
Then choose the response to each signal combination. A VPN alone is not proof of abuse; missing evidence is not a clean visit; and a recommendation only has an effect when your backend enforces it. The rollout guide and API test cases cover the next step. The goal is a defensible decision flow, not a scanner that always turns red for a demonstration.
Questions people ask
- Does no tampering detected prove a browser is genuine?
- No. It means the available check did not identify tampering in that visit. A real antidetect profile can be missed. Missing or unsuccessful checks must be reported separately rather than described as clean.
- How can I tell whether Maskbreak actually checked the browser?
- Inspect device.checked_signals and device.complete in the server-side evaluation response. An antidetect boolean is meaningful as a negative result only when that signal appears in checked_signals. A missing device object means device evidence is unavailable.
- Can a browser fingerprint identify an antidetect browser?
- A visitor identifier and a tampering signal answer different questions. An identifier may link visits without detecting an altered browser, and detecting tampering does not establish the visitor’s identity or intent.
- Is one successful antidetect test enough to choose a provider?
- No. Repeat tests across actual browser versions and profiles, then compare normal-browser false positives and unavailable results. A result from one profile is evidence about that test, not a detection rate for the entire product.
Paste it in, then watch the verdicts
The public sk_test_sandbox key returns the documented allow, review and block shapes with no account, so the failure path is testable before you go live. SDKs for Node, Python and PHP, or plain HTTP. The <a href="/api">API reference</a> and the <a href="/pricing">free tier</a> cover the rest.