Skip to content
All fingerprint checks
Automation surface

The user agent names no headless product

Pim· Clearcote Research 2 min readCheck id headless-ua-token

No 'HeadlessChrome' in the user agent and no headless brand in the client hints (severity: critical).

What a detector infers

Both of Chrome's headless modes name themselves in the user agent. New headless (chrome --headless) prefixes the product, so the string reads HeadlessChrome/155.0.0.0; chrome-headless-shell reports HeadlessChrome with the full build number, and also names HeadlessChrome among its client-hint brands. The token appears in navigator.userAgent and in the User-Agent header alike, and a headed browser never carries it.

Measured: Chrome 155 in new headless on Windows and Linux, Edge 155 headless, Playwright's bundled Chromium and chrome-headless-shell all carry it; headed Chrome on a virtual display does not. Until now the audit used the token only together with a Chromium-only brand list, so a default new-headless Chrome — which keeps the normal Chrome brands in its client hints — was never flagged for it.

This row flags the token on its own, at critical severity, because there is nothing to weigh: the browser is describing itself as headless, correctly. It disappears only when the user agent is replaced, with --user-agent or a protocol override, and then the other headless rows have to answer instead.

How to resolve it

Run the browser headed — a virtual display such as Xvfb is enough — if it should present as an ordinary desktop browser. Replacing the user agent removes the word but not the headless behaviour other rows read, and the replacement then has to match the client hints and the TLS handshake as well.

How is a headless browser detected?

Nearby checks in Automation surface

See all 53 checks in Automation surface
Who builds this test

Clearcote is a browser built for fingerprint coherence

It is a Chromium fork, maintained by the same people who wrote this reference. It ships as a compiled browser rather than as a stealth script injected into someone else's — which is a description of how it is built, and is not an argument about how it behaves on this check.

This audit takes no position on how Clearcote scores on Automation surface checks, on this one, or anywhere else. It has no baseline corpus of other people's fingerprints to rank you against and no vendor scoreboard — nearly every check is self-referential, asking one browser the same question through two independent APIs and reporting whether both answers can be true at once. It runs identically on any browser, including ours. Run it on yours and read the result yourself.

See the other checks in Automation surface — the family headless-ua-token belongs to.