Device Fingerprinting

POST http://localhost/api/v1/device/check scope: device.check

Hashes client-collected browser fingerprint signals (see the WSDeviceFingerprint JS helper) into a stable device ID, tracks repeat sightings, and flags headless/automation browsers.

Parameters

Field Type Optional Description
canvas string Optional Canvas rendering hash.
webgl_vendor string Optional
webgl_renderer string Optional
fonts string Optional Detected font list.
audio string Optional AudioContext fingerprint hash.
screen string Optional Screen resolution/color-depth.
timezone string Optional
language string Optional
hardware_concurrency number Optional
platform string Optional
webdriver boolean Optional navigator.webdriver — a strong headless-automation signal on its own.
user_agent string Optional

Every parameter here is optional.

Example Request

curl -X POST http://localhost/api/v1/device/check \
  -H "Authorization: Bearer wsk_xxx_xxx"
<?php
$ch = curl_init('http://localhost/api/v1/device/check');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Bearer wsk_xxx_xxx']);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
import requests

response = requests.post("http://localhost/api/v1/device/check",
    headers={"Authorization": "Bearer wsk_xxx_xxx"},
)

data = response.json()
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, _ := http.NewRequest("POST", "http://localhost/api/v1/device/check", nil)
	req.Header.Set("Authorization", "Bearer wsk_xxx_xxx")

	resp, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	respBody, _ := io.ReadAll(resp.Body)
	fmt.Println(string(respBody))
}

Example Response

{
  "data": {
    "device_hash": "a1b2c3...", "is_new_device": false, "times_seen": 4,
    "first_seen": "2026-06-01 10:00:00", "is_headless_suspected": false,
    "fraud_score": 0, "risk_score": 0,
    "reasons": ["No headless/automation signals detected"]
  }
}