Device Fingerprint

Server API

Use Geelab Device Fingerprint v2 Server API to query device identification, device information and risk signals

Overview

Use the client SDK's device_token to query the device fingerprint and obtain device identification, device information, and risk signals.

Interface

MethodPathPurpose
POST/api/v2/fp_query/{public_key}Query device fingerprint

Where to get input from

FieldUsed inWhere to get
public_keyPath /api/v2/fp_query/{public_key}Public application identifier from the console, used to locate the application and Region. It is not an authentication key.
secretAuthorization: Bearer <secret>Server API authentication secret from the console.
device_tokenRequest bodyClient SDK interface.

Supported clients

iOS, Android, and Web/H5.

Regional restrictions

Each application belongs to only one region and is configured by the background. The request must be sent to the node in the region where the application belongs.

RegionDescription
GLBGlobal
NANorth America
EUEurope

Requests sent to a node in another Region return 404 with message: "integration not found".

Response envelope

Use Content-Type: application/json. The HTTP status code and JSON code have the same value.

Success:

{ "code": 200, "data": {}, "message": "Success" }

Failure:

{ "code": 400, "data": {}, "message": "Invalid request" }

When validation fails, data contains:

{
  "errors": [
    { "field": "device_token", "reason": "Field required", "type": "missing" }
  ]
}

Error code

HTTP / codemessageMeaning
400Invalid requestThe request body is invalid, or device_token is invalid
401Invalid bearer tokenAuthentication failed; check the server-side secret
403ForbiddenThe application is unavailable or does not pass the IP whitelist
404integration not foundpublic_key is invalid, or the request did not reach the node for the application's Region
500Internal server errorServer error

POST /api/v2/fp_query/{public_key} Query the device fingerprint. Pass in the return from the client SDK device_token, obtain device identification, device information and risk signals.

MethodPOST
Path/api/v2/fp_query/{public_key}
AuthAuthorization: Bearer <secret>
Content-Typeapplication/json
SuccessHTTP 200, code=200, message=Success

Request

http
POST /api/v2/fp_query/{public_key}
Authorization: Bearer <secret>
Content-Type: application/json

Path

FieldTypeRequiredMeaningWhere to get
public_keystringyesapplication public identifierbackend

Headers

FieldRequiredMeaningWhere to get it
AuthorizationYesBearer <secret>, server-side query authenticationsecret: get from backend
Content-TypeYesapplication/json

Body

{
  "device_token": "<from-client-sdk>",
  "metadata": {
    "account_id": "account-001",
    "phone_num": "+8613800000000",
    "phone_sha256": "opaque-hash-value",
    "email": "[email protected]"
  },
  "event_type": "login",
  "event_time": "2026-08-20T10:30:00+08:00"
}
FieldTypeRequiredMeaningWhere to get
device_tokenstringYesDevice credentials for this queryClient SDK interface
metadataobjectNoBusiness side related information, see the table belowThe caller fills in
event_typestringNoBusiness event type, such as loginCaller-provided
event_timestringNoEvent time in RFC 3339 format (with a time zone or Z)Caller-provided
metadata

Both are optional strings.

FieldMeaning
account_idAccount ID
phone_numClear text of mobile phone number
phone_sha256Mobile phone number hash
phone_country_codeCountry Code
phone_prefixNumber prefix
emailEmail plain text
email_sha256Email Hash
email_domainEmail domain name
ip_addr_v4IPv4
ip_addr_v6IPv6
user_agentUser-Agent
ja3JA3
ja4JA4
mac_prefixMAC prefix
wifi_bssid_prefixWi-Fi BSSID Prefix
tls_cipherTLS cipher

Minimum request body:

{ "device_token": "<from-client-sdk>" }

Response (200)

{
  "code": 200,
  "data": {
    "request_id": "req_0198c7a1-5b2e-7c10-8d44-1234567890ab",
    "event_id": "evt_0198c7a1-5b2e-7c10-8d44-1234567890ab",
    "fp_detail": {
      "device_id": "GEE4-xxxxxx",
      "version": "1.0"
    },
    "signals": [
      {
        "signal": "CLOUD_PHONE",
        "level": "HIGH",
        "confidence": 0.8
      }
    ],
    "detail": {
      "client_type": "Android",
      "device_basic": {
        "os": "Android",
        "pla": "arm64-v8a",
        "mod": "Pixel 8",
        "osv": "14"
      },
      "ip_info": {
        "ip": "1.1.1.1"
      }
    }
  },
  "message": "Success"
}

data

FieldTypeMeaning
request_idstringIdentification request ID, formatted as req_ + UUID v7. Multiple queries with the same device_token have the same value.
event_idstringID of this query, formatted as evt_ + UUID v7. Each query has a different value.
fp_detailobjectDevice fingerprint details
signalsarrayHit signal list; [] when no signal is hit
detailobjectClient type, device information, and IP information
fp_detail
FieldTypeMeaning
device_idstringdevice fingerprint
versionstringFingerprint version, currently"1.0"
signals[]
FieldTypeMeaning
signalstringsignal identifier, for exampleCLOUD_PHONE
levelstringLOW/MEDIUM/HIGH
confidencenumber0.01.0

See "Signals" below for the values and descriptions of each signal.

detail
FieldTypeMeaning
client_typestringAndroid, iOS, or Web/H5
device_basicobjectBasic device information; its structure varies by client_type
ip_infoobject{ "ip": "<string>" }

Android/iOS device_basic:

{
  "os": "Android",
  "pla": "arm64-v8a",
  "mod": "Pixel 8",
  "osv": "14"
}
FieldMeaning
osOperating system
plaArchitecture
modModel
osvSystem version

Web/H5device_basic:

{
  "browser": { "name": "Chrome", "version": "145.0.0.0", "major": "145" },
  "device": { "model": "Macintosh", "vendor": "Apple" },
  "os": { "name": "macOS", "version": "10.15.7" }
}

Error

The HTTP status code equals code. message is the exact string shown in the table below.

HTTPmessagedataMeaning
400Invalid request{ "errors": [ { "field", "reason", "type" } ] }Missing field, wrong type, or invalid event_time
400Invalid request{ "errors": [{ "field": "device_token", "reason": "Invalid token", "type": "value_error" }] }device_token is invalid
401Invalid bearer token{}Authentication failed
403Forbidden{}The application is unavailable or does not pass the IP whitelist
404integration not found{}public_key is invalid, or the request did not reach the node for the application's Region
500Internal server error{}Server error
{
  "code": 400,
  "data": {
    "errors": [
      { "field": "device_token", "reason": "Field required", "type": "missing" }
    ]
  },
  "message": "Invalid request"
}
{
  "code": 401,
  "data": {},
  "message": "Invalid bearer token"
}

Example

Copy {public_key} and {secret} from the console. Get {device_token} from the client SDK, and send the request to the node for the application's Region.

curl -sS -X POST "https://{host}/api/v2/fp_query/{public_key}" \
  -H "Authorization: Bearer {secret}" \
  -H "Content-Type: application/json" \
  -d '{
    "device_token": "{device_token}",
    "metadata": { "account_id": "account-001" },
    "event_type": "login",
    "event_time": "2026-08-20T10:30:00+08:00"
  }'

Signal

In a successful fp_query response, the signal list is in data.signals[]. When no signal is hit, the array is [].

FieldTypeMeaning
signalstringsignal identifier, for exampleCLOUD_PHONE
levelstringLOW/MEDIUM/HIGH
confidencenumber0.01.0

Signal List (51)

signallevelconfidenceDescription
BEING_DEBUGGEDHIGH1The device has the risk of being debugged, and reverse analysis, cracking, and group control automation can be performed
DEBUG_MODE_OR_TEST_APPLOW1The device has debug mode turned on or a debug/cracked version of an application package not downloaded from the store is used
EMULATORHIGH0.95Legacy emulator risk detected
CLOUD_PHONEHIGH0.8Cloud phone (or ARM server) risk detected
RUNNING_ON_MACOSMEDIUM1Risks detected when running apps on Mac
VPN_ENABLEDLOW1The device is turning on VPN
NETWORK_PROXYMEDIUM1The device is turning on the network proxy
INVALID_PACKAGELOW1Package name tampering or repackaging detected
TOKEN_EXPIREDMEDIUM0.9device_token is expired or reused
LIMIT_EXCEEDMEDIUM1Limit exceeded
SCREEN_SHARINGLOW1The device is sharing screen
VOICE_CONNECTEDLOW1The device is in a voice call
WHITELIST_ACCOUNT_IDHIGH1User account blacklist
WHITELIST_IPHIGH1IP Blacklist
WHITELIST_DEVICE_FINGERPRINTHIGH1Device fingerprint blacklist
IP_CRAWLER_OR_BOTMEDIUM0.8The IP has malicious cracking or crawling behavior
IP_MALICIOUS_ATTACKHIGH0.6IP has malicious attacks
IP_SUSPICIOUS_PROXYMEDIUM0.8IP suspected proxy IP
BLACKLIST_ACCOUNT_IDLOW1User account whitelist
BLACKLIST_IPLOW1IP whitelist
BLACKLIST_DEVICE_FINGERPRINTLOW1Device fingerprint whitelist
DEVICE_JAILBREAKHIGH1iOS devices are jailbroken
DEVICE_ROOTEDHIGH1Android devices have root behavior
SUSPICIOUS_CUSTOM_ROMHIGH0.8Android devices using questionable custom ROMs
SUSPICIOUS_OPEN_SOURCE_ROMHIGH0.9Android Device ROM for Android Open Source Project
BROWSER_COOKIE_FEATURE_DISABLEDMEDIUM0.9Browser cookie not available
PSEUDO_BROWSER_ENVHIGH0.9Fake browser environment
BROWSER_INCOGNITO_MODELOW0.8Browser in incognito mode
DEVICE_BOOTLOADER_UNLOCKEDHIGH0.8Device bootloader detected and unlocked
SUSPICIOUS_DEVICE_RESETHIGH0.8Suspected device reset
SYSTEM_VERSION_TOO_LOWMEDIUM0.6The device system version is too low
DEVICE_WITHOUT_SIMLOW0.4No SIM card is detected in the device
HOOK_TAMPERING_LOWMEDIUM1The device has a low risk of code tampering. Using this label requires excluding self-development and tampering
HOOK_TAMPERING_MEDIUMHIGH1The device is at risk of code tampering, and the code logic can be tampered with
HOOK_TAMPERING_HIGHHIGH1The device has a high risk of code tampering
SUSPICIOUS_DEVICE_INFO_TAMPEREDHIGH0.8The device has the risk of information forgery, and device attributes or fingerprints do not match
ANTIDETECT_BROWSERHIGH0.8Device is running an anti-detection browser
APP_CLONE_TOOL_INSTALLEDLOW1There is a risk of installing multiple tools on the device
TAMPER_TOOL_INSTALLEDLOW1The risk of detecting that the device has modification tools installed
AUTOMATION_TOOL_INSTALLEDLOW1The risk of group control/automation tools installed on the device is detected, which can enable large-scale black production operations
REVERSE_ENGINEERING_TOOL_INSTALLEDLOW1Risk of device installation reverse tool detected
NETWORK_TAMPER_TOOL_INSTALLEDLOW1The device is at risk of using network tampering tools
GAME_TAMPER_TOOL_INSTALLEDLOW1The device is at risk of using game modifier tools
VIRTUAL_LOCATION_TOOL_INSTALLEDLOW1Detected that the device has a virtual positioning risk installed
RUNNING_IN_VIRTUAL_MACHINEHIGH1The current device is in a virtual machine environment
RUNNING_IN_CLONED_APPHIGH1Currently in a multi-open environment
USING_DEVICE_TAMPERING_TOOLHIGH1Currently using modified or risky tools
USING_AUTOMATION_TOOLHIGH0.95Currently using group control or automation tools
USING_REVERSE_ENGINEERING_TOOLHIGH1Currently using reverse tampering tools
USING_VIRTUAL_LOCATIONHIGH1Currently using the virtual positioning tool
RUNNING_IN_SYSTEM_CLONEDLOW0.9Risk of over-opening of device and systems

OpenAPI 3.1

When you need to generate a client or request a validator, you can download the [Device Fingerprint v2 OpenAPI 3.1 description file](/openapi/device-fingerprint-v2. yaml).