← Back to Resources

FPScanner Fingerprinting Signals

⚠️ Additional documentation will be added soon.

How to Read This Page

FPScanner is the client-side fingerprinting component used to collect browser, device, and environment signals.

This page documents the fingerprinting signals collected by the FPScanner JavaScript SDK.

Signals are organized to match the structure of the fingerprint payload returned by the SDK.

{
  "signals": {
    "automation": {
      "...": "..."
    },
    "device": {
      "...": "..."
    },
    "browser": {
      "...": "..."
    }
  }
}

Signal Categories

Browse Signals

Expand a category to see the example JSON payload and the documentation for its fields.

signals.automation View details
{
  "webdriver": false,
  "webdriverWritable": false,
  "selenium": false,
  "cdp": false,
  "playwright": false,
  "navigatorPropertyDescriptors": "00000"
}

signals.automation

Signals used to detect browser automation frameworks and instrumentation.

[

  {
    "name": "webdriver",
    "example": false,
    "description": "Whether the browser exposes `navigator.webdriver = true`, a common indicator of automated control."
  },
    
  {
    "name": "webdriverWritable",
    "example": false,
    "description": "Indicates whether the `navigator.webdriver` property appears writable or modified, which may suggest tampering by automation tooling."
  },
    
  {
    "name": "selenium",
    "example": false,
    "description": "Detects artifacts commonly introduced by Selenium (for example global variables or DOM modifications)."
  },
    
  {
    "name": "cdp",
    "example": false,
    "description": "Detects side effects associated with Chrome DevTools Protocol (CDP) instrumentation used by automation frameworks."
  },
    
  {
    "name": "playwright",
    "example": false,
    "description": "Detects Playwright-specific globals, hooks, or runtime traces left by the framework."
  },
    
  {
    "name": "navigatorPropertyDescriptors",
    "example": "00000",
    "description": "Compact signature representing selected `navigator` property descriptor states used to detect environment tampering."
  }
    
]
signals.device View details
{
  "cpuCount": 14,
  "memory": 8,
  "platform": "MacIntel",
  "screenResolution": {
    "width": 2560,
    "height": 1440,
    "pixelDepth": 24,
    "colorDepth": 24,
    "availableWidth": 2560,
    "availableHeight": 1410,
    "innerWidth": 1707,
    "innerHeight": 857,
    "hasMultipleDisplays": true
  },
  "multimediaDevices": {
    "speakers": 1,
    "microphones": 1,
    "webcams": 1
  },
  "mediaQueries": {
    "prefersColorScheme": "dark",
    "prefersReducedMotion": false,
    "prefersReducedTransparency": false,
    "colorGamut": "srgb",
    "pointer": "fine",
    "anyPointer": "fine",
    "hover": true,
    "anyHover": true,
    "colorDepth": 8
  }
}

signals.device

Core device-level values collected from the browser runtime.

[

  {
    "name": "cpuCount",
    "example": 14,
    "description": "Number of logical CPU cores reported by the browser (`navigator.hardwareConcurrency`)."
  },
    
  {
    "name": "memory",
    "example": 8,
    "description": "Approximate device memory in GB reported by the browser (`navigator.deviceMemory`)."
  },
    
  {
    "name": "platform",
    "example": "MacIntel",
    "description": "Platform string reported by the browser (`navigator.platform`)."
  }
    
]

signals.device.screenResolution

Display and viewport metrics collected from the browser environment. These values should generally be interpreted together.

[

  {
    "name": "width",
    "example": 2560,
    "description": "Reported screen width in CSS pixels (`screen.width`)."
  },
    
  {
    "name": "height",
    "example": 1440,
    "description": "Reported screen height in CSS pixels (`screen.height`)."
  },
    
  {
    "name": "pixelDepth",
    "example": 24,
    "description": "Pixel depth of the display (`screen.pixelDepth`)."
  },
    
  {
    "name": "colorDepth",
    "example": 24,
    "description": "Color depth reported by the browser (`screen.colorDepth`)."
  },
    
  {
    "name": "availableWidth",
    "example": 2560,
    "description": "Available screen width excluding operating system UI elements (`screen.availWidth`)."
  },
    
  {
    "name": "availableHeight",
    "example": 1410,
    "description": "Available screen height excluding operating system UI elements (`screen.availHeight`)."
  },
    
  {
    "name": "innerWidth",
    "example": 1707,
    "description": "Viewport width of the current browsing context (`window.innerWidth`)."
  },
    
  {
    "name": "innerHeight",
    "example": 857,
    "description": "Viewport height of the current browsing context (`window.innerHeight`)."
  },
    
  {
    "name": "hasMultipleDisplays",
    "example": true,
    "description": "Indicates whether the browser environment appears to use multiple displays based on screen and viewport behavior."
  }
    
]

signals.device.multimediaDevices

Counts of media devices returned by `navigator.mediaDevices.enumerateDevices()`, grouped by input and output type.

[

  {
    "name": "speakers",
    "example": 1,
    "description": "Number of audio output devices (`audiooutput`) returned by media device enumeration."
  },
    
  {
    "name": "microphones",
    "example": 1,
    "description": "Number of audio input devices (`audioinput`) returned by media device enumeration."
  },
    
  {
    "name": "webcams",
    "example": 1,
    "description": "Number of video input devices (`videoinput`) returned by media device enumeration."
  }
    
]

signals.device.mediaQueries

Signals derived from CSS media queries using `window.matchMedia()`. These values describe user preferences, input capabilities, and display characteristics.

[

  {
    "name": "prefersColorScheme",
    "example": "dark",
    "description": "User color scheme preference detected via the `(prefers-color-scheme)` media query. Possible values: `dark`, `light`, or `null` if no preference is matched."
  },
    
  {
    "name": "prefersReducedMotion",
    "example": false,
    "description": "Indicates whether the user has enabled reduced motion accessibility settings, detected using the `(prefers-reduced-motion: reduce)` media query."
  },
    
  {
    "name": "prefersReducedTransparency",
    "example": false,
    "description": "Indicates whether the user prefers reduced transparency effects, detected via the `(prefers-reduced-transparency: reduce)` media query."
  },
    
  {
    "name": "colorGamut",
    "example": "srgb",
    "description": "Display color gamut capability detected via `(color-gamut)` media queries. Possible values include `srgb`, `p3`, `rec2020`, or `null` if none match."
  },
    
  {
    "name": "pointer",
    "example": "fine",
    "description": "Primary pointing device precision detected via `(pointer)` media queries. Possible values: `fine` (mouse/trackpad), `coarse` (touch input), `none`, or `null`."
  },
    
  {
    "name": "anyPointer",
    "example": "fine",
    "description": "Most capable pointing device available on the system, detected via `(any-pointer)` media queries. Possible values: `fine`, `coarse`, `none`, or `null`."
  },
    
  {
    "name": "hover",
    "example": true,
    "description": "Indicates whether the primary input device supports hover interactions, detected via `(hover: hover)`."
  },
    
  {
    "name": "anyHover",
    "example": true,
    "description": "Indicates whether any available input device supports hover interactions, detected via `(any-hover: hover)`."
  },
    
  {
    "name": "colorDepth",
    "example": 8,
    "description": "Maximum color depth supported by the display as inferred from `(color)` media queries. The value corresponds to the highest `color` media query level that matches."
  }
    
]
signals.browser View details
{
  "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36",
  "features": {
    "bitmask": "1000111100010111100111111101",
    "chrome": true,
    "brave": false,
    "applePaySupport": false,
    "opera": false,
    "serial": true,
    "attachShadow": true,
    "caches": true,
    "webAssembly": true,
    "buffer": false,
    "showModalDialog": false,
    "safari": false,
    "webkitPrefixedFunction": true,
    "mozPrefixedFunction": false,
    "usb": true,
    "browserCapture": true,
    "paymentRequestUpdateEvent": true,
    "pressureObserver": true,
    "audioSession": false,
    "selectAudioOutput": false,
    "barcodeDetector": true,
    "battery": true,
    "devicePosture": true,
    "documentPictureInPicture": true,
    "eyeDropper": true,
    "editContext": true,
    "fencedFrame": true,
    "sanitizer": false,
    "otpCredential": true
  },
  "plugins": {
    "isValidPluginArray": true,
    "pluginCount": 5,
    "pluginNamesHash": "-2cdc5c8b",
    "pluginConsistency1": true,
    "pluginOverflow": false
  },
  "extensions": {
    "bitmask": "00000000",
    "extensions": []
  },
  "highEntropyValues": {
    "architecture": "arm",
    "bitness": "64",
    "brands": [
      {
        "brand": "Not(A:Brand",
        "version": "8"
      },
      {
        "brand": "Chromium",
        "version": "144"
      },
      {
        "brand": "Google Chrome",
        "version": "144"
      }
    ],
    "mobile": false,
    "model": "",
    "platform": "macOS",
    "platformVersion": "26.2.0",
    "uaFullVersion": "144.0.7559.133"
  },
  "etsl": 33,
  "maths": "67d0b556",
  "toSourceError": {
    "toSourceError": "TypeError: Cannot read properties of null (reading 'usdfsh')",
    "hasToSource": false
  }
}

signals.browser.userAgent

Primary browser user-agent string used as one of several consistency inputs.

[

  {
    "name": "userAgent",
    "example": "Mozilla/5.0 (...)",
    "description": "Full user-agent string exposed by `navigator.userAgent`."
  }
    
]

signals.browser.features

Boolean feature checks derived from the presence of browser APIs and globals. These signals help characterize the runtime environment and can reveal inconsistencies between the claimed browser and the actual capabilities.

[

  {
    "name": "bitmask",
    "example": "1000111100010111100111111101",
    "description": "Compact binary representation of all feature checks in this group. Each position corresponds to a feature flag in a fixed order, where `1` indicates the feature is present and `0` indicates it is absent."
  },
    
  {
    "name": "chrome",
    "example": true,
    "description": "Indicates whether the `window.chrome` object exists, which is typically exposed by Chromium-based browsers."
  },
    
  {
    "name": "brave",
    "example": false,
    "description": "Indicates whether the `navigator.brave` object exists, a property commonly exposed by the Brave browser."
  },
    
  {
    "name": "serial",
    "example": true,
    "description": "Whether the Web Serial API (`navigator.serial`) is available in the browser environment."
  },
    
  {
    "name": "usb",
    "example": true,
    "description": "Whether the WebUSB API (`window.USB`) is available in the runtime."
  },
    
  {
    "name": "documentPictureInPicture",
    "example": true,
    "description": "Indicates support for the Document Picture-in-Picture API (`window.documentPictureInPicture`)."
  },
    
  {
    "name": "sanitizer",
    "example": false,
    "description": "Whether the HTML Sanitizer API (`window.Sanitizer`) is available."
  },
    
  {
    "name": "otpCredential",
    "example": true,
    "description": "Indicates support for the Web OTP Credential API (`window.OTPCredential`)."
  }
    
]

signals.browser.plugins

Checks derived from `navigator.plugins` to summarize the reported plugin set and detect unusual `PluginArray` behavior.

[

  {
    "name": "isValidPluginArray",
    "example": true,
    "description": "Whether `navigator.plugins` presents itself as a native plugin collection, based on its string representation (for example `"[object PluginArray]"`)."
  },
    
  {
    "name": "pluginCount",
    "example": 5,
    "description": "Number of entries exposed through `navigator.plugins`."
  },
    
  {
    "name": "pluginNamesHash",
    "example": "-2cdc5c8b",
    "description": "Hash of the comma-separated plugin names reported by `navigator.plugins`, used for compact comparison without storing raw names."
  },
    
  {
    "name": "pluginConsistency1",
    "example": true,
    "description": "Whether the first plugin entry is consistent with its first mime type via `navigator.plugins[0] === navigator.plugins[0][0].enabledPlugin`."
  },
    
  {
    "name": "pluginOverflow",
    "example": false,
    "description": "Result of an out-of-range access check on `navigator.plugins.item(4294967296)`. Unexpected behavior may indicate a non-standard or emulated plugin array."
  }
    
]

signals.browser.extensions

Signals derived from DOM markers and injected globals associated with a small set of known browser extensions.

[

  {
    "name": "bitmask",
    "example": "00000000",
    "description": "Compact binary representation of extension checks in this order: `grammarly`, `metamask`, `coupon-birds`, `deepl`, `monica-ai`, `sider-ai`, `requestly`, `veepn`."
  },
    
  {
    "name": "extensions",
    "example": ['grammarly'],
    "description": "Names of extensions whose indicators were detected in the page or runtime environment."
  }
    
]

signals.browser.highEntropyValues

High-entropy User-Agent Client Hints values returned by `navigator.userAgentData.getHighEntropyValues()`. These signals provide a more detailed view of the browser and device environment when supported.

[

  {
    "name": "architecture",
    "example": "arm",
    "description": "CPU architecture reported by high-entropy UA Client Hints, such as `arm` or `x86`."
  },
    
  {
    "name": "bitness",
    "example": "64",
    "description": "CPU bitness reported by high-entropy UA Client Hints, typically `32` or `64`."
  },
    
  {
    "name": "brands",
    "example": [{"brand":"Not(A:Brand","version":"8"},{"brand":"Chromium","version":"144"},{"brand":"Google Chrome","version":"144"}],
    "description": "List of browser brands and versions returned by UA Client Hints."
  },
    
  {
    "name": "mobile",
    "example": false,
    "description": "Whether the browser reports a mobile form factor through UA Client Hints."
  },
    
  {
    "name": "model",
    "example": "",
    "description": "Device model reported by UA Client Hints. This value is often empty on desktop browsers."
  },
    
  {
    "name": "platform",
    "example": "macOS",
    "description": "Operating system platform reported by UA Client Hints."
  },
    
  {
    "name": "platformVersion",
    "example": "26.2.0",
    "description": "Operating system version reported by UA Client Hints."
  },
    
  {
    "name": "uaFullVersion",
    "example": "144.0.7559.133",
    "description": "Full browser version reported by UA Client Hints."
  }
    
]

signals.browser.etsl

Low-level runtime signal based on the length of `eval.toString()`, used for browser and environment consistency checks.

[

  {
    "name": "etsl",
    "example": 33,
    "description": "Length of the string returned by `eval.toString()`. This value can vary across browser engines and is useful for detecting inconsistencies with the claimed environment."
  }
    
]

signals.browser.maths

Hash of outputs from selected JavaScript `Math` constants and functions, used as a runtime fingerprint.

[

  {
    "name": "maths",
    "example": "67d0b556",
    "description": "Hash of deterministic outputs from a fixed set of `Math` constants and functions. Small engine or runtime differences can change this value."
  }
    
]

signals.browser.toSourceError

Signals derived from JavaScript error formatting and `toSource` availability checks.

[

  {
    "name": "toSourceError",
    "example": "TypeError: Cannot read properties of null (reading 'usdfsh')",
    "description": "String representation of the error produced by accessing a property on `null`. Error formatting can vary across engines and environments."
  },
    
  {
    "name": "hasToSource",
    "example": false,
    "description": "Whether calling `toSource()` succeeds on a thrown value in the current runtime. This is typically supported only in some JavaScript environments."
  }
    
]
signals.graphics View details
{
  "webGL": {
    "vendor": "Google Inc. (Apple)",
    "renderer": "ANGLE (Apple, ANGLE Metal Renderer: Apple M4 Pro, Unspecified Version)"
  },
  "webgpu": {
    "vendor": "apple",
    "architecture": "metal-3",
    "device": "",
    "description": ""
  },
  "canvas": {
    "hasModifiedCanvas": false,
    "canvasFingerprint": "-421c84e0"
  }
}

signals.graphics.webGL

Unmasked WebGL vendor and renderer strings collected from the `WEBGL_debug_renderer_info` extension when available.

[

  {
    "name": "vendor",
    "example": "Google Inc. (Apple)",
    "description": "Unmasked WebGL vendor string returned by `WEBGL_debug_renderer_info`. This field is collected only when the extension is available."
  },
    
  {
    "name": "renderer",
    "example": "ANGLE (Apple, ANGLE Metal Renderer: Apple M4 Pro, Unspecified Version)",
    "description": "Unmasked WebGL renderer string returned by `WEBGL_debug_renderer_info`. This value often reveals the underlying GPU or graphics translation layer."
  }
    
]

signals.graphics.webgpu

WebGPU adapter information returned by `navigator.gpu.requestAdapter()` when WebGPU is supported and an adapter is available.

[

  {
    "name": "vendor",
    "example": "apple",
    "description": "Adapter vendor reported by `adapter.info.vendor`."
  },
    
  {
    "name": "architecture",
    "example": "metal-3",
    "description": "Adapter architecture reported by `adapter.info.architecture`."
  },
    
  {
    "name": "device",
    "example": "",
    "description": "Adapter device value reported by `adapter.info.device`."
  },
    
  {
    "name": "description",
    "example": "",
    "description": "Adapter description reported by `adapter.info.description`."
  }
    
]

signals.graphics.canvas

Canvas integrity and fingerprint signals derived from pixel inspection and deterministic 2D rendering output.

[

  {
    "name": "hasModifiedCanvas",
    "example": false,
    "description": "Whether drawing and reading a known 1×1 PNG produces unexpected pixel data, which may indicate modified canvas behavior."
  },
    
  {
    "name": "canvasFingerprint",
    "example": "-421c84e0",
    "description": "Hash of the `canvas.toDataURL()` output after rendering a fixed set of shapes, colors, and text to a 2D canvas."
  }
    
]
signals.codecs View details
{
  "audioCanPlayTypeHash": "688c7345",
  "videoCanPlayTypeHash": "-126cde82",
  "audioMediaSourceHash": "-3cbc04a4",
  "videoMediaSourceHash": "-48c15d34",
  "rtcAudioCapabilitiesHash": "26a15cc5",
  "rtcVideoCapabilitiesHash": "4f24a817",
  "hasMediaSource": true
}

signals.codecs

Hashes of media codec support results collected from `canPlayType()`, `MediaSource.isTypeSupported()`, and WebRTC RTP capability APIs.

[

  {
    "name": "audioCanPlayTypeHash",
    "example": "688c7345",
    "description": "Hash of audio codec support results returned by `HTMLMediaElement.canPlayType()` across a fixed set of audio MIME types and codecs."
  },
    
  {
    "name": "videoCanPlayTypeHash",
    "example": "-126cde82",
    "description": "Hash of video codec support results returned by `HTMLMediaElement.canPlayType()` across a fixed set of video MIME types and codecs."
  },
    
  {
    "name": "audioMediaSourceHash",
    "example": "-3cbc04a4",
    "description": "Hash of audio codec support results returned by `MediaSource.isTypeSupported()` across a fixed set of audio MIME types and codecs."
  },
    
  {
    "name": "videoMediaSourceHash",
    "example": "-48c15d34",
    "description": "Hash of video codec support results returned by `MediaSource.isTypeSupported()` across a fixed set of video MIME types and codecs."
  },
    
  {
    "name": "rtcAudioCapabilitiesHash",
    "example": "26a15cc5",
    "description": "Hash of the audio capabilities object returned by `RTCRtpReceiver.getCapabilities("audio")`."
  },
    
  {
    "name": "rtcVideoCapabilitiesHash",
    "example": "4f24a817",
    "description": "Hash of the video capabilities object returned by `RTCRtpReceiver.getCapabilities("video")`."
  },
    
  {
    "name": "hasMediaSource",
    "example": true,
    "description": "Whether the `MediaSource` API is available in the current runtime."
  }
    
]
signals.locale View details
{
  "internationalization": {
    "timezone": "Europe/Paris",
    "localeLanguage": "en-US"
  },
  "languages": {
    "languages": [
      "en",
      "fr-FR",
      "fr",
      "en-US"
    ],
    "language": "en"
  }
}

signals.locale.internationalization

Internationalization values derived from `Intl.DateTimeFormat().resolvedOptions()`.

[

  {
    "name": "timezone",
    "example": "Europe/Paris",
    "description": "Timezone identifier returned by `Intl.DateTimeFormat().resolvedOptions().timeZone`."
  },
    
  {
    "name": "localeLanguage",
    "example": "en-US",
    "description": "Locale string returned by `Intl.DateTimeFormat().resolvedOptions().locale`, representing the browser’s default locale."
  }
    
]

signals.locale.languages

Browser language preference values exposed through navigator language APIs.

[

  {
    "name": "languages",
    "example": ['en-US', 'fr-FR', 'fr', 'en'],
    "description": "Ordered list of preferred languages reported by `navigator.languages`."
  },
    
  {
    "name": "language",
    "example": "en-US",
    "description": "Primary browser language reported by `navigator.language`."
  }
    
]
signals.contexts View details
{
  "iframe": {
    "webdriver": false,
    "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36",
    "platform": "MacIntel",
    "memory": 8,
    "cpuCount": 14,
    "language": "en"
  },
  "webWorker": {
    "vendor": "Google Inc. (Apple)",
    "renderer": "ANGLE (Apple, ANGLE Metal Renderer: Apple M4 Pro, Unspecified Version)",
    "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36",
    "language": "en",
    "platform": "MacIntel",
    "memory": 8,
    "cpuCount": 14
  }
}

signals.contexts.iframe

Snapshot of navigator values collected from a same-origin `about:blank` iframe, used for cross-context consistency checks.

[

  {
    "name": "webdriver",
    "example": false,
    "description": "Value of `navigator.webdriver` observed inside the iframe context."
  },
    
  {
    "name": "userAgent",
    "example": "Mozilla/5.0 (...)",
    "description": "User-agent string reported by `iframe.contentWindow.navigator.userAgent`."
  },
    
  {
    "name": "platform",
    "example": "MacIntel",
    "description": "Platform value reported by `iframe.contentWindow.navigator.platform`."
  },
    
  {
    "name": "memory",
    "example": 8,
    "description": "Device memory value reported by `iframe.contentWindow.navigator.deviceMemory`."
  },
    
  {
    "name": "cpuCount",
    "example": 14,
    "description": "Logical CPU count reported by `iframe.contentWindow.navigator.hardwareConcurrency`."
  },
    
  {
    "name": "language",
    "example": "en",
    "description": "Language value reported by `iframe.contentWindow.navigator.language`."
  }
    
]

signals.contexts.webWorker

Snapshot of navigator and graphics values collected from a dedicated web worker, used for cross-context consistency checks.

[

  {
    "name": "vendor",
    "example": "Google Inc. (Apple)",
    "description": "Unmasked WebGL vendor string collected inside the worker via `OffscreenCanvas` and `WEBGL_debug_renderer_info` when available."
  },
    
  {
    "name": "renderer",
    "example": "ANGLE (...)",
    "description": "Unmasked WebGL renderer string collected inside the worker via `OffscreenCanvas` and `WEBGL_debug_renderer_info` when available."
  },
    
  {
    "name": "userAgent",
    "example": "Mozilla/5.0 (...)",
    "description": "User-agent string reported by `navigator.userAgent` inside the worker context."
  },
    
  {
    "name": "language",
    "example": "en",
    "description": "Language value reported by `navigator.language` inside the worker context."
  },
    
  {
    "name": "platform",
    "example": "MacIntel",
    "description": "Platform value reported by `navigator.platform` inside the worker context."
  },
    
  {
    "name": "memory",
    "example": 8,
    "description": "Device memory value reported by `navigator.deviceMemory` inside the worker context."
  },
    
  {
    "name": "cpuCount",
    "example": 14,
    "description": "Logical CPU count reported by `navigator.hardwareConcurrency` inside the worker context."
  }
    
]