Device Fingerprint

Server API

Use the client SDK's device_token to query the device fingerprint and obtain device identification, device information, and risk signals. If client reporting fails, submit the raw SDK geetoken through the same endpoint for fallback analysis. See fp_query fallback mode.

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 bodyReturned by the client SDK.

Supported clients

iOS, Android, and Web/H5.

Regional restrictions

Each application belongs to exactly one Region, configured in the dashboard. Send the request to the regional API endpoint for the application's Region.

RegionDescriptionAPI endpoint (HTTPS)
GLBGlobalhttps://riskct-global.geelabapi.com
NANorth Americahttps://riskct-na.geelabapi.com
EUEuropehttps://riskct-eu.geelabapi.com

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, does not pass the IP allowlist check, or fallback mode is disabled
403deactivate / quota_exceeded / manual_deactivateThe customer product switch is switch=off; message is the current CustomerProductVersion.status
404integration not foundpublic_key is invalid, or the request was not sent to the regional API endpoint for the application's Region
429Too many requestsFallback analysis exceeded the application's rate limit quota
500Internal server errorServer error

POST /api/v2/fp_query/{public_key}

Query the device fingerprint. Send the device_token returned by the client SDK to retrieve trusted device attributes and risk signals.

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

Request

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

Path

FieldTypeRequiredMeaningWhere to get
public_keystringYesApplication public identifierDashboard

Headers

FieldRequiredMeaningWhere to get it
AuthorizationYesBearer <secret>, server-side query authenticationGet secret from the dashboard
Content-TypeYesapplication/json—

Body

{
  "device_token": "<from-client-sdk>",
  "event_type": "login",
  "event_time": "2026-08-20T10:30:00+08:00"
}
FieldTypeRequiredMeaningWhere to get
device_tokenstringYesFor a standard query, pass the result token. For fallback analysis, pass the raw SDK geetoken. Both use this field.Client SDK interface
event_typestringNoBusiness event type, such as loginCaller-provided
event_timestringNoEvent time in RFC 3339 format (with a time zone or Z)Caller-provided

Minimum request body:

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

fp_query fallback mode

If the client SDK fails to report data or does not obtain a result token, send the raw geetoken generated by the SDK to your backend. The backend can then use the same POST /api/v2/fp_query/{public_key} endpoint to obtain the device fingerprint and risk signals.

Request method

  • Continue using the device_token field and pass the raw SDK geetoken as-is. No additional field or mode parameter is required.
  • Use the same URL, Bearer authentication, and optional parameters as a standard query. Send the request to the API endpoint for the application's Region. Keep secret on the backend and never expose it to clients.

Example for the Global endpoint (replace it with the North America or Europe endpoint when applicable):

curl -sS -X POST "https://riskct-global.geelabapi.com/api/v2/fp_query/{public_key}" \
  -H "Authorization: Bearer {secret}" \
  -H "Content-Type: application/json" \
  -d '{"device_token":"{sdk_raw_geetoken}"}'

The response structure is the same as a standard query; see Response (200). Successful fp_query requests in fallback mode are also billable.

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_idstringAnalysis ID, formatted as req_ + UUID v7. Standard queries with the same result token return the same value; fallback analysis generates a new value for every request.
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.0–1.0

The following table lists the signal values and descriptions currently supported by the Server API.

Signal Reference (40+)

signallevelDescriptionSupported platforms
BEING_DEBUGGEDHIGHThe device may be under active debugging, which can enable reverse engineering, tampering, or automated device-farm controlAndroid, iOS, Web
DEBUG_MODE_OR_TEST_APPLOWThe device has debugging enabled, or the app is a debug, modified, or non-store buildAndroid, iOS
EMULATORHIGHA traditional emulator environment was detectedAndroid, iOS, Web
CLOUD_PHONEHIGHA cloud device or ARM server environment was detectedAndroid
RUNNING_ON_MACOSMEDIUMThe app is running on macOSiOS
VPN_ENABLEDLOWA VPN connection is enabled on the deviceAndroid, iOS
NETWORK_PROXYMEDIUMA network proxy is configured on the deviceAndroid, iOS
INVALID_PACKAGELOWThe package name may have been modified, or the app may have been repackagedAndroid, iOS
TOKEN_EXPIREDMEDIUMThe device_token has expired or was reusedAndroid, iOS, Web
LIMIT_EXCEEDMEDIUMA configured limit was exceededAndroid, iOS, Web
SCREEN_SHARINGLOWScreen sharing is active on the deviceAndroid, iOS
VOICE_CONNECTEDLOWA voice call is active on the deviceAndroid, iOS
IP_CRAWLER_OR_BOTMEDIUMThe IP address is associated with malicious cracking, crawler, or bot activityAndroid, iOS, Web
IP_MALICIOUS_ATTACKHIGHThe IP address is associated with malicious attack activityAndroid, iOS, Web
IP_SUSPICIOUS_PROXYMEDIUMThe IP address is suspected of being a proxyAndroid, iOS, Web
IDC_IPMEDIUMIDC/data center IPAndroid, iOS, Web
DEVICE_JAILBREAKHIGHThe iOS device is jailbrokeniOS
DEVICE_ROOTEDHIGHThe Android device is rootedAndroid
SUSPICIOUS_CUSTOM_ROMHIGHThe Android device is running a suspicious custom ROMAndroid
SUSPICIOUS_OPEN_SOURCE_ROMHIGHThe Android device is running an Android Open Source Project-based ROMAndroid
BROWSER_COOKIE_FEATURE_DISABLEDMEDIUMBrowser cookies are unavailable or disabledWeb
PSEUDO_BROWSER_ENVHIGHA spoofed browser environment was detectedWeb
BROWSER_INCOGNITO_MODELOWThe browser is running in private or incognito modeWeb
DEVICE_BOOTLOADER_UNLOCKEDHIGHThe device bootloader is unlockedAndroid
SUSPICIOUS_DEVICE_RESETHIGHA suspicious device reset was detectedAndroid, iOS
SYSTEM_VERSION_TOO_LOWMEDIUMThe device operating system version is outdatedAndroid, iOS
DEVICE_WITHOUT_SIMLOWNo SIM card was detected in the deviceAndroid, iOS
HOOK_TAMPERING_LOWMEDIUMLow-risk code hooking or tampering was detected; exclude modifications introduced by your own application before acting on this signaliOS, Web
HOOK_TAMPERING_MEDIUMHIGHMedium-risk code hooking or tampering capable of altering application logic was detectedAndroid, iOS, Web
HOOK_TAMPERING_HIGHHIGHHigh-risk code hooking or tampering was detectedAndroid, iOS
SUSPICIOUS_DEVICE_INFO_TAMPEREDHIGHDevice information may have been spoofed, or device attributes do not match the fingerprintAndroid, iOS
ANTIDETECT_BROWSERHIGHThe device is running an anti-detect browserWeb
APP_CLONE_TOOL_INSTALLEDLOWAn app-cloning tool is installed on the deviceAndroid, Web
TAMPER_TOOL_INSTALLEDLOWA device-tampering tool is installed on the deviceAndroid, iOS
AUTOMATION_TOOL_INSTALLEDLOWA device-farm or automation tool capable of operating at scale is installed on the deviceAndroid, iOS
REVERSE_ENGINEERING_TOOL_INSTALLEDLOWA reverse-engineering tool is installed on the deviceAndroid, iOS, Web
NETWORK_TAMPER_TOOL_INSTALLEDLOWA network-tampering tool is installed or may be in use on the deviceAndroid, iOS
GAME_TAMPER_TOOL_INSTALLEDLOWA game modification or cheat tool is installed on the deviceAndroid, iOS
VIRTUAL_LOCATION_TOOL_INSTALLEDLOWA location-spoofing tool is installed on the deviceAndroid, iOS
RUNNING_IN_VIRTUAL_MACHINEHIGHThe device is running in a virtual machineAndroid, iOS, Web
RUNNING_IN_CLONED_APPHIGHThe app is running in a cloned-app environmentAndroid, iOS
USING_DEVICE_TAMPERING_TOOLHIGHA device-tampering or other high-risk tool is currently in useAndroid
USING_AUTOMATION_TOOLHIGHA device-farm or automation tool is currently in useAndroid, iOS
USING_REVERSE_ENGINEERING_TOOLHIGHA reverse-engineering or tampering tool is currently in useAndroid
USING_VIRTUAL_LOCATIONHIGHA location-spoofing tool is currently in useAndroid, iOS
RUNNING_IN_SYSTEM_CLONEDLOWA system-level cloned-app environment was detectedAndroid

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, does not pass the IP allowlist check, or fallback mode is disabled
403deactivate / quota_exceeded / manual_deactivate{}The customer product switch is switch=off; message is the current CustomerProductVersion.status, not Forbidden
404integration not found{}public_key is invalid, or the request was not sent to the regional API endpoint for the application's Region
429Too many requests{}Fallback analysis exceeded the application's per-minute or per-hour rate limit quota
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 dashboard. Get {device_token} from the client SDK, and send the request to the regional API endpoint 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}",
    "event_type": "login",
    "event_time": "2026-08-20T10:30:00+08:00"
  }'