Anti-Bot

What Is Screen Resolution Fingerprinting?

What Is Screen Resolution Fingerprinting? — conceptual illustration
On this page

Screen resolution fingerprinting reads the display geometry a browser reports - screen.width/height, availWidth/availHeight, colorDepth, devicePixelRatio, and the inner/outer window sizes. The values are moderately identifying on their own (common resolutions cluster, but the available-area and pixel-ratio combination adds entropy) and, more importantly, they must be mutually coherent: the window cannot be larger than the screen, the available area must be the screen minus plausible OS chrome, and the pixel ratio must match the claimed device. Headless browsers report defaults and impossible combinations that give them away.

Quick facts

Readsscreen.width/height, availWidth/availHeight, colorDepth, devicePixelRatio
WindowinnerWidth/Height, outerWidth/Height, screenX/Y
Coherence ruleswindow <= screen; avail = screen - OS chrome; dpr matches device
Headless tell800x600, 0x0, or inner == outer (no browser chrome)
Retina rulemacOS/iPhone report devicePixelRatio >= 2

The display geometry surface

A browser exposes two related coordinate systems. The screen: screen.width/height (full display), availWidth/availHeight (minus the taskbar/dock/menu bar), colorDepth (almost always 24), and devicePixelRatio (1 standard, 2 Retina, 1.25/1.5 on scaled Windows). And the window: innerWidth/innerHeight (viewport), outerWidth/outerHeight (including browser chrome), and screenX/screenY (position on screen). Common resolutions (1920x1080, 1440x900, 390x844) are shared by many users, so resolution alone is low-entropy, but the full tuple - resolution plus available area plus pixel ratio plus window size - is meaningfully identifying and, crucially, structured.

Coherence rules and headless defaults

The structure is what catches bots, because the values cannot be independent:

  • Window within screen - outerWidth/Height cannot exceed screen.availWidth/Height. A window bigger than the screen is impossible on real hardware.
  • Available area - availHeight should be screen.height minus a plausible taskbar/dock; equal values (avail == full) suggests no OS chrome, common in headless.
  • Chrome height - outerHeight - innerHeight is the browser toolbar height; zero means no chrome (headless) and a fixed unrealistic value across a fleet is a tell.
  • Pixel ratio coherence - an iPhone or Retina Mac UA with devicePixelRatio: 1 is contradictory; those devices are always >= 2.

Headless browsers default to telltale geometry - 800x600, 1280x720 with inner == outer, or 0x0 - and these defaults are shared across entire scraping fleets, making them stand out against the natural spread of real displays.

Setting believable display metrics

The fix is to present a complete, internally consistent display profile matching the claimed device: a common real resolution, available area reduced by a realistic OS chrome amount, a window size smaller than the screen with a non-zero toolbar height, and a device pixel ratio appropriate to the platform. For a desktop, 1920x1080 with availHeight around 1040, dpr 1, and a windowed viewport is safe; for a specific phone, use that model's exact metrics and pixel ratio.

As with the rest of the fingerprint, the display tuple must also agree with the User-Agent, Client Hints, hardware signals, and media queries (orientation, pointer type). It is one facet of a single coherent device identity - editing screen.width alone, while leaving the window sizes and pixel ratio at headless defaults, creates exactly the contradictions anti-bot systems look for.

Code example

javascript
// Display tuple an anti-bot script reads
const display = {
  screen: [screen.width, screen.height].join('x'),
  avail:  [screen.availWidth, screen.availHeight].join('x'),
  depth:  screen.colorDepth,                  // ~24
  dpr:    window.devicePixelRatio,            // 1 / 2 / 1.5
  inner:  [innerWidth, innerHeight].join('x'),
  outer:  [outerWidth, outerHeight].join('x')
};

// Coherence checks (pseudo):
//   outerWidth > screen.availWidth            -> window bigger than screen (impossible)
//   outerHeight - innerHeight === 0           -> no browser chrome (headless)
//   /iPhone|Macintosh/.test(ua) && dpr < 2    -> Retina device with dpr 1 (contradiction)
//   screen === '800x600' || screen === '0x0'  -> headless default

Related terms

What Is Hardware Fingerprinting?
Hardware fingerprinting reads device capability signals - CPU cores, RAM, and screen metrics - that JavaScript exposes directly. The main va…
What Is CSS Media Query Fingerprinting?
CSS media query fingerprinting reads operating-system and device preferences through window.matchMedia(). Modern CSS media features expose t…
What Is Client Hints Fingerprinting?
User-Agent Client Hints (UA-CH) are structured HTTP headers and a JavaScript API that report the same browser/OS facts the User-Agent string…
What Is Browser Fingerprinting?
Browser fingerprinting is a technique that identifies and tracks a visitor by combining dozens of small, observable characteristics of their…
What Is Fingerprint Clustering?
Fingerprint clustering is the practice of grouping fingerprints from millions of real visitors by similarity, then rejecting any new visitor…
What Is Headless Browser Detection?
Headless browser detection is the set of probes anti-bot systems use to distinguish a headless or instrumented Chrome session from a real us…
What Is Anti-Bot Detection?
Anti-bot detection is the set of techniques websites use to distinguish automated traffic from human users — and to block, challenge, or thr…
What Is Browser Fingerprinting Evasion?
Browser fingerprinting evasion is the practice of configuring an automated browser so that the combined fingerprint it presents — canvas, We…
Anti-Bot Vendor Detection Cheatsheet
The first step of any scrape against a protected site is identifying which anti-bot vendor is in front of it. The vendor determines almost e…
How Do Websites Detect Web Scrapers?
Websites detect scrapers by collecting hundreds of signals across the network, transport, browser, and behavioral layers, then scoring the c…

Concept map

How Screen Resolution Fingerprinting connects

The terms most directly tied to this one. Hover a node to see its neighbours, click to preview, drag to rearrange.

0 terms · 0 connections
You are here · Anti-Bot
Building map…

Frequently asked questions

Is screen resolution a strong fingerprint on its own?

Moderately - common resolutions are shared by many users, so resolution alone is low-entropy, but the full tuple (resolution, available area, pixel ratio, window sizes) is more identifying. Its bigger value is coherence: the window cannot exceed the screen, the pixel ratio must match the device, and headless defaults are shared across fleets.

What gives away a headless browser in the screen metrics?

Telltale default sizes (800x600, 1280x720, 0x0), inner dimensions equal to outer (no browser chrome height), available area equal to full screen (no taskbar/dock), and these same values repeated across an entire fleet. Any window larger than the screen, or a Retina-class UA with devicePixelRatio 1, is also a direct contradiction.

How should I set window and screen sizes for a scraper?

Use a complete, coherent profile for the claimed device: a common real resolution, available area reduced by a realistic OS chrome amount, a windowed viewport smaller than the screen with a non-zero toolbar height, and a matching device pixel ratio. Keep it consistent with the User-Agent, Client Hints, and media-query signals - do not edit one value in isolation.

Last updated: 2026-05-30