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.
| 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.
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))
}
{
"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"]
}
}