Seatext library / BotRefund evidence
User Agent Strings: Normal vs Automated Browsers — What Actually Differs
Automated browsers often expose themselves through user agent strings that contain automation markers like 'HeadlessChrome', outdated versions, or mismatched platform tokens. Normal browsers send consistent, up-to-date user agents that match their actual rendering engine...
✓ Built for advertisers who need clear, refund-ready traffic evidence.
Automated browsers frequently betray themselves in the user agent string. A headless Chrome instance may include HeadlessChrome in the token, while older automation frameworks like PhantomJS ship with static, outdated strings that no longer match any current browser release. Legitimate browsers, by contrast, send user agents that stay in sync with their actual version, platform, and rendering engine — Chrome on Windows 11 reports Windows NT 10.0 and a current Chrome version number, Safari on iOS includes the iOS version and WebKit build.
| Criterion | Normal Browser | Automated Browser (Default) | Takeaway |
|---|---|---|---|
| Automation tokens | Absent — no HeadlessChrome, PhantomJS, Puppeteer, or Playwright markers |
Often present in default configurations; headless Chrome adds HeadlessChrome, PhantomJS identifies itself explicitly |
Check for known automation substrings, but assume they can be stripped. |
| Version freshness | Matches the latest stable or recent release channel for that browser | Frequently stale — older Chrome versions, frozen Firefox ESR builds, or legacy WebKit versions | Compare the version token against current release schedules; large gaps are suspicious. |
| Platform consistency | OS token matches navigator.platform, screen metrics, and timezone | Mismatches common — e.g., Windows NT 10.0 user agent but Linux navigator.platform | Cross-reference user agent with client-side APIs; inconsistencies signal spoofing. |
| Architecture token | Reflects actual CPU architecture (x64, arm64) and bitness | Often generic or wrong — 32-bit token on 64-bit host, missing arm64 on Apple Silicon | Architecture mismatches are a strong secondary signal when combined with other checks. |
| Feature alignment | User agent implies support for modern APIs (WebGL, WebRTC, Permissions Policy) that are actually present | May claim modern version but lack corresponding APIs or have them patched | Probe for API presence; a modern user agent without WebGL or with broken permissions is a red flag. |
| Entropy and variability | Minor variations across installs, updates, and enterprise policies | Often identical across thousands of sessions — same build ID, same patch level | Low entropy across sessions suggests a cloned or containerized environment. |
What a user agent string actually contains
The user agent is a single HTTP header (User-Agent) and a JavaScript property (navigator.userAgent). It packs product tokens, version numbers, platform identifiers, and rendering engine details into one line. A typical Chrome 126 on Windows 11 looks like:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
Each segment has history: Mozilla/5.0 is a legacy compatibility token, Windows NT 10.0 identifies the OS, Win64; x64 the architecture, AppleWebKit/537.36 the engine, and Chrome/126.0.0.0 the browser version. Safari and Firefox follow similar patterns with their own engine tokens.
How normal browsers keep user agents consistent
Browser vendors update the user agent automatically with every release. The string is generated from internal build metadata, so it always matches the rendering engine, JavaScript engine, and platform capabilities actually present. Enterprise policies can append custom tokens (e.g., MyCorpBrowser/1.0), but the core tokens remain aligned with the binary. On mobile, the user agent includes the OS version and device model — iOS Safari embeds the iOS version and Mobile/15E148 build tag.
Where automated browsers diverge by default
Automation frameworks prioritize function over stealth. Puppeteer and Playwright launch headless Chrome with a --headless flag that historically appended HeadlessChrome to the user agent. Selenium with ChromeDriver does the same unless configured otherwise. PhantomJS, unmaintained since 2018, ships a frozen WebKit 538.1 user agent that no real browser has used in years. Older versions of HtmlUnit declare themselves as HtmlUnit/2.x. These defaults make trivial detection possible — a simple substring match catches the majority of unmodified automation traffic.
Common spoofing techniques and their limits
Sophisticated operators override the user agent via page.setUserAgent() (Puppeteer), context.setUserAgent() (Playwright), or Chrome DevTools Protocol Network.setUserAgentOverride. They copy a current Chrome user agent from a real device. This defeats naive string matching but introduces new inconsistencies:
- Client hints mismatch:
navigator.userAgentData(the User-Agent Client Hints API) may still report the real browser brand and version. - Navigator properties:
navigator.platform,navigator.hardwareConcurrency,navigator.deviceMemoryoften remain at automation defaults. - Feature gaps: A spoofed Chrome 126 user agent on a headless instance may lack WebGL, have a software renderer, or miss the
Permissions-Policyheader. - TLS/JA3 fingerprint: The TLS handshake cipher suite order often differs from the real browser the user agent claims to be.
BotRefund's Console Debug Evaluator check (source S1) looks for exactly these mismatches — automation tools patch or hide browser APIs, but those changes break when the browser is checked from another angle. A single anomaly is not a verdict; privacy tools, corporate networks, and unusual devices can produce unexpected behavior for genuine people.
Why user agent analysis alone fails
User agent strings are self-reported and trivially mutable. Legitimate users may run outdated browsers, custom builds, or privacy extensions that randomize the string. Automated browsers can copy a perfect, current user agent from a real device profile. Relying on the user agent alone produces false positives (blocking real users on old versions) and false negatives (missing well-spoofed bots).
BotRefund's approach (sources S1, S4, S6) treats the user agent as one of 106 independent signals. The window.open Tamper check (S4) and Impossible Tab Speed check (S6) examine behavioral mechanics — timing, movement, hesitation — that scripts struggle to reproduce. These signals feed an AI prediction model that weighs the complete pattern across browser, network, device, and behavior evidence, achieving 99% accuracy through corroboration, not any single tell.
Practical detection workflow
- Collect the user agent from both the HTTP header and
navigator.userAgent; flag discrepancies. - Parse tokens for automation substrings (
HeadlessChrome,PhantomJS,Puppeteer,Playwright,HtmlUnit,Zombie,Nightmare). - Validate version freshness against known release calendars; flag versions older than 2-3 major releases.
- Cross-check client hints (
navigator.userAgentData.brands,navigator.userAgentData.platform) against the legacy string. - Verify platform consistency — compare
navigator.platform, screen resolution, timezone, and language against the user agent's OS token. - Probe API presence — test WebGL, WebRTC, Canvas, Permissions Policy, and Battery API for alignment with the claimed browser version.
- Assess entropy — low variability across sessions suggests containerized or cloned environments.
- Correlate with behavioral signals — mouse movement, click timing, scroll patterns, session duration (see BotRefund's biometric checks in S4, S6).
- Feed all signals into a scoring model — no single factor decides; the pattern determines the verdict.
Key facts from BotRefund's detection methodology
| Fact | Detail | Source |
|---|---|---|
| Signal count | 106 independent checks across browser, network, device, and behavior | S1, S4, S6 |
| Detection philosophy | Corroboration over single tells; each signal is evidence, not a verdict | S1, S4, S6 |
| AI prediction accuracy | 99% by weighing complete pattern across all signals | S1, S4, S6 |
| Console Debug Evaluator | Checks for API mismatches that automation tools create when patching browser internals | S1 |
| Biometric checks | Window.open Tamper, Impossible Tab Speed analyze timing, movement, hesitation patterns | S4, S6 |
| False positive handling | Privacy tools, corporate networks, unusual devices cross-checked before verdict | S1, S4, S6 |
Limitations and when this advice doesn't apply
- Legacy enterprise environments may run frozen browser versions (ESR, LTSC) that look stale but are legitimate.
- Privacy-focused users using tools like Brave, Tor Browser, or user agent randomizers will produce atypical strings.
- Embedded browsers in apps (WebView, Electron) have distinct user agents that don't match desktop browsers.
- New automation frameworks emerge constantly; substring lists require maintenance.
- Sophisticated adversaries replicate full browser fingerprints including TLS, client hints, and behavioral profiles — user agent analysis catches only the unsophisticated majority.
Frequently asked questions
Can I block bots just by checking for "HeadlessChrome" in the user agent?
No. That catches only default, unmodified headless Chrome. Any operator who spends five minutes reading documentation will override the user agent. You'll block zero determined attackers and some legitimate users running Chrome in headless mode for testing.
What's the difference between the HTTP User-Agent header and navigator.userAgent?
They should match. If they don't, something is modifying one but not the other — a proxy, a browser extension, or automation middleware. A mismatch is itself a detection signal.
Do User-Agent Client Hints replace the legacy user agent string?
They're being phased in (Chrome, Edge) but the legacy string remains for compatibility. Client hints are structured (brands, platform, mobile) and harder to spoof consistently, but adoption is incomplete. Check both.
How often do real browsers update their user agent strings?
Every major version — roughly every 4 weeks for Chrome and Edge, every 4-8 weeks for Firefox, annually for Safari (tied to OS releases). Enterprise ESR channels update less frequently but still receive security patches.
What user agent should I use for legitimate scraping?
Use a current, real browser's user agent from the same machine type you're running on. Rotate through a small pool of recent versions. But understand: the user agent is the easiest signal to get right and the least important one. Focus on behavioral consistency — timing, mouse movement, API completeness.
Does BotRefund rely on user agent strings for detection?
User agent analysis is one of 106 signals. BotRefund's Console Debug Evaluator (S1) looks for API mismatches that automation creates, while biometric checks (S4, S6) analyze interaction patterns. The AI model weighs the complete picture — browser, network, device, behavior — rather than trusting any single rule.
Can a well-configured automated browser pass every user agent check?
Yes, the user agent can be made perfect. But perfect user agent + missing WebGL + software renderer + linear mouse movements + superhuman click speed + identical session durations across thousands of visits = detectable pattern. The user agent is the cover; the behavior is the book.
Further reading and comparison sources
These external sources provide additional context for evaluating the topic. Their inclusion is not an endorsement.
How BotRefund helps with automation detection
BotRefund doesn't rely on user agent strings alone. Our platform runs 106 independent checks — including the Console Debug Evaluator that spots API mismatches from automation tooling, and biometric checks like Window.open Tamper and Impossible Tab Speed that analyze timing, movement, and hesitation patterns scripts can't replicate. Each signal feeds an AI model that weighs the complete browser, network, device, and behavior picture, achieving 99% accuracy through corroboration. You can add BotRefund to your site in about a minute to start a free bot audit and see exactly how much automated traffic is clicking your ads.