Touch fingerprinting is a browser tracking technique that reads navigator.maxTouchPoints and touch event APIs to determine whether you are on a smartphone, tablet, touch-enabled laptop, or a traditional desktop — silently, without cookies, and in a single line of JavaScript. You can see what your own device exposes right now on whatsmy.fyi.
TL;DR
Touch fingerprinting uses navigator.maxTouchPoints, the TouchEvent constructor, and the pointer CSS media query to classify your device type. A desktop without a touchscreen returns maxTouchPoints = 0; an iPhone returns 5; a Surface Pro returns 10. Combined with screen dimensions and pixel ratio, this signal reliably separates mobile from desktop traffic and contributes measurable entropy to a full browser fingerprint.
What Is Touch Fingerprinting?
Touch fingerprinting is a subset of browser fingerprinting that targets your device's touch hardware. Every browser exposes a set of JavaScript APIs describing whether the device has a touchscreen and, if so, how many simultaneous touch points it supports. These APIs were designed to help developers build adaptive interfaces — but they also serve as a device-type classification signal that requires no consent, no storage, and no user interaction.
The primary property involved is navigator.maxTouchPoints, a read-only integer introduced in the W3C Pointer Events specification. It returns the maximum number of touch contacts the device can track simultaneously. Zero means no touchscreen. Five or ten indicates a smartphone or tablet. Touch-enabled laptops and 2-in-1 convertibles typically report 10. Because this value reflects physical hardware, it is stable across sessions, resistant to clearing browsing data, and identical in incognito mode.
Touch fingerprinting does not identify you uniquely on its own — it is a classification signal, not a unique identifier. Its value to trackers lies in combining it with screen resolution, device pixel ratio, user agent, and battery status to build a more complete device profile. The Electronic Frontier Foundation's Cover Your Tracks project identifies touch support as one of the signals collected in a full browser fingerprint test.
How Does Touch Fingerprinting Work?
A fingerprinting script reads three complementary signals to build its device-type picture. Each can be read in under a millisecond with no user permission required.
Signal 1 — navigator.maxTouchPoints
This is the most direct signal. Per the W3C Pointer Events specification, the value must reflect the hardware maximum — it cannot be set by software or changed by clearing browsing data. A device with a 10-point multi-touch digitizer always returns 10. This hardware-binding is what makes the signal useful for fingerprinting: it is consistent, cross-session, and unaffected by privacy tools that target cookies or storage.
Signal 2 — TouchEvent Constructor Check
Older fingerprinting code checks for the existence of the TouchEvent constructor in the global scope. On non-touch devices this constructor does not exist, producing undefined. On iOS and Android it is present. This method predates the Pointer Events API and is now less reliable — Chromium-based browsers expose the constructor even on non-touch desktops — but it is still included in many legacy fingerprinting libraries.
Signal 3 — CSS Pointer Media Query via JavaScript
The pointer CSS media feature, readable from JavaScript via window.matchMedia, distinguishes between coarse pointers (fingers on a touchscreen), fine pointers (a mouse or stylus), and no pointer at all. Unlike maxTouchPoints, this query reflects the primary input device rather than touch hardware presence, so a Surface Pro used with a keyboard mouse reports fine even though its maxTouchPoints is 10. Reading both values together gives a more complete input profile.
// Touch fingerprinting: reading all three signals
function getTouchFingerprint() {
// Signal 1: maximum simultaneous touch points (hardware constant)
const maxTouchPoints = navigator.maxTouchPoints ?? 0;
// Signal 2: legacy TouchEvent constructor presence check
const hasTouchEvents = 'TouchEvent' in window;
// Signal 3: CSS pointer media query via matchMedia
const pointerType = window.matchMedia('(pointer: coarse)').matches
? 'coarse' // finger / touchscreen
: window.matchMedia('(pointer: fine)').matches
? 'fine' // mouse / stylus
: 'none'; // no pointer device
// Device classification based on combined signals
const isTouch = maxTouchPoints > 0;
const isMobile = isTouch && window.screen.width <= 768;
const isTablet = isTouch && window.screen.width > 768 && window.screen.width <= 1366;
return {
maxTouchPoints, // 0 = desktop, 5 = smartphone, 10 = tablet / 2-in-1
hasTouchEvents,
pointerType,
isTouch,
isMobile,
isTablet,
};
}
// Example outputs:
// MacBook Pro (no touchscreen) → { maxTouchPoints: 0, pointerType: "fine", isTouch: false }
// iPhone 15 Pro → { maxTouchPoints: 5, pointerType: "coarse", isMobile: true }
// Surface Pro 11 → { maxTouchPoints: 10, pointerType: "fine", isTablet: true }
// iPad Air → { maxTouchPoints: 5, pointerType: "coarse", isTablet: true }maxTouchPoints Values Across Device Types
The table below shows the values that common devices return for navigator.maxTouchPoints, alongside their touch event and pointer query results. These values reflect hardware constants and do not change across browser versions or operating system updates.
| Device Type | maxTouchPoints | pointer media query | TouchEvent in window |
|---|---|---|---|
| Desktop PC / Mac (no touchscreen) | 0 | fine | false (Gecko) / true (Chromium) |
| iPhone (all modern models) | 5 | coarse | true |
| Android smartphone | 5 or 10 | coarse | true |
| iPad / Android tablet | 5 or 10 | coarse | true |
| Microsoft Surface / touch laptop | 10 | fine (when mouse used) | true (Chromium) |
| Chromebook (non-touch) | 0 | fine | false |
| Linux desktop (any browser) | 0 | fine | false (Firefox) / true (Chrome) |
The inconsistency in the TouchEvent in window column matters for privacy: Chromium-based browsers expose the TouchEvent constructor on all platforms, including non-touch desktops, to avoid breaking web compatibility assumptions. Firefox only exposes it on actual touch devices. This asymmetry is itself a browser engine identifier — a separate fingerprinting signal derived from the attempt to read another.
Who Uses Touch Fingerprinting in the Real World?
Advertising Networks and Analytics
Ad-tech platforms read maxTouchPoints to segment audiences by device type for bid pricing and ad creative selection. Mobile and tablet inventory commands different CPM rates than desktop. Because this signal requires no cookies and no user interaction, it feeds directly into the device-type dimension of a fingerprint-based audience profile. The same signal that lets a developer build a responsive menu is repurposed to assign your device to a pricing bucket without your knowledge.
Fraud Detection and Bot Mitigation
Security platforms such as Fingerprint.com and DataDome use touch signals as a consistency check. A bot claiming to be a mobile browser in its user agent while reporting maxTouchPoints = 0 is a contradiction that reveals automation. Headless Chrome, Puppeteer, and Selenium typically return non-touch values even when the user agent is spoofed to a smartphone. Touch signal inconsistency is one of the lighter-weight bot detection heuristics that runs before computationally expensive checks.
Paywall and Geographic Restriction Enforcement
Some publishers serve different content versions to mobile versus desktop users — not just for layout, but for metered access logic. A user who clears cookies and reloads may lose their session, but their device's maxTouchPoints value persists unchanged. Combined with screen resolution and timezone, touch data helps re-identify returning visitors who have deleted cookies.
A/B Testing and Personalisation Engines
Experimentation platforms use device type — derived in part from touch signals — to segment experiment variants. Running a test on "mobile users only" without cookies requires a reliable device-type signal. maxTouchPoints provides a hardware-grounded value that cannot be cleared, making it more stable than user agent string parsing across the session.
Is Touch Fingerprinting a Privacy Risk?
Touch fingerprinting is less of a direct privacy risk than canvas fingerprinting or audio fingerprinting because it produces low-entropy classification data, not a unique identifier. A value of 5 for maxTouchPoints is shared by every iPhone. The risk materialises when touch data is combined with other signals: screen resolution, device pixel ratio, hardware concurrency, timezone, and WebGL renderer information. In a combined fingerprint, touch data helps narrow the anonymity set — it reduces the population of devices that share your profile from hundreds of millions to tens of millions, making subsequent high-entropy signals more effective at individual identification.
Under the GDPR, device fingerprinting — including low-entropy signals like touch data — is considered processing of personal data when the resulting profile can be linked to an individual. The French CNIL and the Irish DPC have both issued guidance treating fingerprinting as equivalent to cookie-based tracking for consent purposes. In practice, enforcement against touch-signal collection specifically is rare because the data has legitimate uses in responsive design detection.
How to Protect Yourself from Touch Fingerprinting
Protection options range from passive reduction to active spoofing. The most effective defences target the full fingerprint surface area rather than touch signals in isolation.
- Brave Browser (recommended for daily use): Brave's Farbling feature randomises a range of fingerprinting signals per session and per site. While Brave does not currently randomise
maxTouchPointsdirectly, its broader fingerprint randomisation makes the combined fingerprint less stable and less useful for cross-site tracking. For most users, Brave is the best balance of protection and usability. - Firefox with
privacy.resistFingerprinting: When this flag is enabled, Firefox reportsmaxTouchPoints = 0and suppresses touch event APIs regardless of your hardware. This makes your browser report as a non-touch desktop device universally, eliminating touch fingerprinting at the cost of breaking touch-dependent websites when used on an actual touchscreen device. - Tor Browser (strongest protection): Tor Browser inherits Firefox's
privacy.resistFingerprintingand normalises the full fingerprint surface, including touch data. All Tor Browser users appear to have identical touch profiles. The trade-off is significantly slower browsing due to the Tor network's routing. - Use a device with common hardware: The anonymity set for
maxTouchPointsis determined by how many other devices share your exact value. If you use an iPhone, you share a value with hundreds of millions of other iPhones. Unusual hardware — a custom 2-in-1 with a non-standard digitizer — produces a rarer value. Standard, popular hardware reduces touch-related entropy. - VPNs do not help here: A VPN routes your traffic through a different IP address but does not modify browser API responses. Your
navigator.maxTouchPointsvalue is identical whether or not a VPN is active. Check what your full browser fingerprint exposes — including your network information — on whatsmy.fyi.
Frequently Asked Questions
What does navigator.maxTouchPoints return on a desktop?
On a standard desktop or laptop without a touchscreen, navigator.maxTouchPoints returns 0. This value is a hardware constant — it reflects the absence of a touch digitizer in the device. Clearing your browser history, using incognito mode, or switching networks does not change this value.
Does maxTouchPoints work the same in all browsers?
The property itself behaves consistently — it returns a hardware-derived integer in all modern browsers. However, the TouchEvent constructor availability differs: Chromium-based browsers expose it on non-touch desktops for web compatibility reasons, while Firefox only exposes it on actual touch devices. This difference is itself a fingerprinting signal that can identify the browser engine independently of the user agent string.
Can touch fingerprinting identify me individually?
Not on its own. maxTouchPoints is a categorical signal — most devices fall into one of a handful of values (0, 5, or 10). Millions of devices share each value. Touch fingerprinting becomes a privacy risk when it is combined with other signals such as screen resolution, device pixel ratio, WebGL renderer data, and audio fingerprinting. In a full combined fingerprint, touch data narrows the anonymity set but is not sufficient for individual identification in isolation.
Does incognito mode hide my touch fingerprint?
No. Incognito and private browsing modes prevent your browser from saving browsing history, cookies, and form data to disk. They do not modify the values returned by hardware-facing APIs. Your navigator.maxTouchPoints value, screen dimensions, and pointer type are identical in an incognito window and in a normal browsing session.
Why does my touch laptop report a different value than my phone?
Touch-enabled laptops and 2-in-1 convertibles typically have a 10-point digitizer, so they report maxTouchPoints = 10. Most smartphones report 5, reflecting a 5-point digitizer. iPads also report 5. The exact value depends on the hardware specification of the touch controller, not the operating system. Additionally, a touch laptop used with a mouse will report pointer: fine in the CSS media query even though its maxTouchPoints is non-zero — the two signals capture different aspects of the input configuration.
How does touch fingerprinting differ from user agent detection?
User agent strings are easily spoofed — any script, extension, or developer tool can set an arbitrary user agent. navigator.maxTouchPoints reads a hardware register that cannot be changed through user agent overrides. A bot claiming to be an iPhone in its user agent but returning maxTouchPoints = 0 is therefore detectable as fraudulent. Touch signal inconsistency with the claimed user agent is a common bot detection heuristic used by fraud prevention platforms.
Does navigator.maxTouchPoints change when I connect an external monitor?
No. Connecting an external monitor changes your screen resolution and available display area, but it does not affect maxTouchPoints. That value reflects the touch hardware of the primary device — your laptop or tablet — not the connected display. However, connecting a touch-capable external display to a device may update the value if the OS registers the additional touch digitizer, though this is uncommon in practice.
Related Articles
- What Is Browser Fingerprinting? How Sites Track You Without Cookies — the complete guide to all fingerprinting signals combined
- What Is Screen Fingerprinting? How Screen Resolution Tracks You — how screen dimensions combine with touch data for device classification
- What Is Canvas Fingerprinting? How Websites Track You Without Cookies — how GPU rendering differences produce a unique device identifier
- What Is Audio Fingerprinting? How AudioContext Tracks Your Browser — a high-entropy companion signal often deployed alongside touch data
- What Is CPU Fingerprinting? How Hardware Concurrency Tracks Your Device — another hardware-grounded signal that complements maxTouchPoints



