Device Fingerprint
Deployment

Server API

Server-side interface for querying device fingerprint recognition results

Purpose

fp_query is used to query device fingerprint identification results.

The caller must first obtain the server-returned gee_token through client_report, then pass that gee_token to fp_query to obtain the final:

  • fp fingerprint value
  • risk_code risk codes
  • risk_label risk labels
  • client_ip client IP
  • client_type client type
  • access_list access list hit information

Integration Flow

The standard call sequence is as follows:

  1. The client collects fingerprint data and calls client_report.
  2. The server returns a new gee_token.
  3. The caller passes the gee_token, private_key, and ts to fp_query.
  4. The server returns the final query result.

Notes:

  • fp_query only accepts the gee_token returned by client_report.
  • Do not pass the original client token directly to fp_query.

Request Information

Request Method

POST

Request URL

/api/v1/fp_query/{app_id}

Path Parameters

ParameterTypeRequiredDescription
app_idstringYesApplication ID

Request Body

{
  "gee_token": "string",
  "private_key": "string",
  "ts": 1712345678
}

Field description:

FieldTypeRequiredDescription
gee_tokenstringYesToken returned by client_report
private_keystringYesApplication secret key, which must correspond to app_id
tsintegerYesCurrent request timestamp. A Unix timestamp in seconds is recommended

Successful Response

Response Format

{
  "status": "success",
  "code": 0,
  "data": {
    "fp": "fp-value",
    "risk_code": [20400, 20606],
    "risk_label": ["BEING_DEBUGGED", "BROWSER_INCOGNITO_MODE"],
    "client_ip": "1.1.1.1",
    "client_type": "Web/H5",
    "access_list": {
      "hit": false,
      "list_type": "none",
      "identity_type": ""
    }
  }
}

Field Description

FieldTypeDescription
statusstringFixed as success when the request succeeds
codeintegerFixed as 0 when the request succeeds
data.fpstringFingerprint value
data.risk_codeinteger[]Risk code list
data.risk_labelstring[]Risk label list, corresponding one-to-one with risk_code
data.client_ipstringClient IP
data.client_typestringClient type
data.access_listobjectAccess list hit result

access_list Field Description

The access_list structure is as follows:

{
  "hit": false,
  "list_type": "none",
  "identity_type": ""
}

Field description:

FieldTypeDescription
hitbooleanWhether an access list was hit
list_typestringAccess list type. Usually none when no list is hit
identity_typestringHit identity type. Usually an empty string when no list is hit

Common examples:

  • No hit: {"hit": false, "list_type": "none", "identity_type": ""}
  • Blacklist hit: {"hit": true, "list_type": "black", "identity_type": "fingerprint"}

client_type Return Values

The current API converts internal client type codes into readable text:

CodeReturn Value
1Android
3Web/H5
4iOS

Call Examples

Request Example

curl -X POST 'https://your-domain/api/v1/fp_query/test-app' \
  -H 'Content-Type: application/json' \
  -d '{
    "gee_token": "output-gee-token-from-client-report",
    "private_key": "private-key",
    "ts": 1712345678
  }'

Response Example

{
  "status": "success",
  "code": 0,
  "data": {
    "fp": "GEE3-01-xxxxxxxx",
    "risk_code": [20400, 20606],
    "risk_label": ["BEING_DEBUGGED", "BROWSER_INCOGNITO_MODE"],
    "client_ip": "1.1.1.1",
    "client_type": "Web/H5",
    "access_list": {
      "hit": false,
      "list_type": "none",
      "identity_type": ""
    }
  }
}

risk_code Description

risk_code indicates the risk items detected for the device or environment. Multiple values may be returned at the same time.

Return rules:

  • risk_code is an integer array.
  • risk_label corresponds one-to-one with risk_code in order.
  • A single query may hit multiple risk codes.
  • If no risk is hit, risk_code may be an empty array [].

Example:

{
  "risk_code": [20400, 20606],
  "risk_label": ["BEING_DEBUGGED", "BROWSER_INCOGNITO_MODE"]
}

The risk_code list below helps you understand common risk labels and their typical scenarios, making it easier to connect query results to allow, step-up verification, rate limiting, or review strategies.

The current risk codes are described below.

Basic

risk_coderisk_labelDescriptionScenario Risk DescriptionApplicable Client Types
10001INVALID_PACKAGEApplication package information validation exceptionSome abusive actors may tamper with the application package, add ads, or modify business logic, then repackage and distribute it.Android, iOS
10002TOKEN_EXPIREDToken has expiredAbusive actors may cache and accumulate tokens, then use cached tokens to send large volumes of business requests shortly after a campaign starts.Android, iOS, Web

Device / Runtime Environment

risk_coderisk_labelDescriptionScenario Risk DescriptionApplicable Client Types
20100EMULATOREmulator environmentAbusive actors can use traditional emulators to perform black-market operations at scale, such as large-scale registration and credential stuffing.Android, iOS, Web
20101CLOUD_PHONECloud phone environmentAbusive actors can use cloud phones or ARM servers to conduct black-market operations more efficiently and automatically than with previous techniques, such as large-scale registration and credential stuffing.Android
20103RUNNING_ON_MACOSRunning in a macOS environmentAbusive actors may use M-series Macs to run apps because they are easier to automate and tamper with, enabling profit-seeking abuse.iOS
20207RUNNING_IN_VIRTUAL_MACHINERunning in a virtual machine environmentAbusive actors can virtualize a new environment on the device to perform most automated attacks, such as automatic ordering, leveling, and adding friends.Android, iOS, Web
20220RUNNING_IN_SYSTEM_CLONEDRunning in a system clone environmentAbusive actors may use system-level multi-instance technology to run multiple app instances on one device for bulk registration and frequent credential stuffing, bypassing platform risk controls for illicit gain.Android
21000DEVICE_WITHOUT_SIMDevice has no SIM cardNormal user devices typically use carrier SIM cards. SIM-free device access often comes from device farms operated by abusive actors.Android, iOS

Tampering / Automation / Reverse Engineering

risk_coderisk_labelDescriptionScenario Risk DescriptionApplicable Client Types
20200APP_CLONE_TOOL_INSTALLEDApp clone tool installedFor example, reward abusers may create multiple app clones on the same device during referral campaigns, log in with multiple accounts, and coordinate invitation flows.Android, Web
20201TAMPERING_TOOL_INSTALLEDTampering tool installedTo evade risk-control detection, abusive actors may modify some device information and attributes, such as changing device identifiers like IMEI to evade device fingerprint tagging.Android, iOS
20202AUTOMATION_TOOL_INSTALLEDAutomation tool installedUsed to control many devices efficiently and perform large-scale operations, such as likes, reposts, and mass advertising.Android, iOS
20203REVERSE_ENGINEERING_TOOL_INSTALLEDReverse engineering tool installedAbusive actors may use reverse engineering tools to analyze application business logic and then tamper with code.Android, iOS, Web
20204NETWORK_TAMPER_TOOL_INSTALLEDNetwork tampering tool installedAbusive actors often use these tools to tamper with networks for attacks, such as evading risk-control tracking and detection at the network identifier layer.Android, iOS
20205GAME_TAMPER_TOOL_INSTALLEDGame tampering tool installedGame farming groups or cheating players may use these tools to cheat in games.Android, iOS
20206VIRTUAL_LOCATION_TOOL_INSTALLEDVirtual location tool installedAbusive actors often tamper with location information to bypass business location restrictions or forge trajectories that mimic real user movement.Android, iOS
20210RUNNING_IN_CLONED_APPRunning in an app clone environmentAbusive actors can use device-provided app cloning to create multiple app instances for multi-account login and coordination.Android, iOS
20211USING_DEVICE_TAMPERING_TOOLDevice tampering tool is being usedTo evade risk-control detection, abusive actors may modify some device information and attributes, such as changing device identifiers like IMEI to evade device fingerprint tagging.Android
20212USING_AUTOMATION_TOOLAutomation tool is being usedUsed to control many devices efficiently and perform large-scale operations, such as likes, reposts, and mass advertising.Android, iOS
20213USING_REVERSE_ENGINEERING_TOOLReverse engineering tool is being usedAbusive actors may use reverse engineering tools to analyze application business logic and then tamper with code.Android
20216USING_VIRTUAL_LOCATIONVirtual location is being usedAbusive actors often tamper with location information to bypass business location restrictions or forge trajectories that mimic real user movement.Android, iOS

Hook / Information Tampering

risk_coderisk_labelDescriptionScenario Risk DescriptionApplicable Client Types
20300HOOK_TAMPERING_LOWLow-risk Hook tamperingThere is suspected code tampering. It may be abusive tampering, or it may be legitimate hook usage during development.iOS, Web
20301HOOK_TAMPERING_MEDIUMMedium-risk Hook tamperingCode tampering exists. Abusive actors may tamper with code logic and attack business APIs for profit.Android, iOS, Web
20302HOOK_TAMPERING_HIGHHigh-risk Hook tamperingHigh-risk code tampering exists, involving more dangerous tampering techniques.Android, iOS
20303SUSPICIOUS_DEVICE_INFO_TAMPEREDDevice information is suspected to have been tampered withAbusive actors may forge device information to disguise the current device as a new one, bypassing business restrictions for abusive activity.Android, iOS

Debugging / Interaction Risks

risk_coderisk_labelDescriptionScenario Risk DescriptionApplicable Client Types
20400BEING_DEBUGGEDDevice or page is being debuggedAbusive actors often use debugging techniques for reverse engineering analysis, API cracking, and similar scenarios.Android, iOS, Web
20401DEBUG_MODE_OR_TEST_APPDebug mode or test application environmentDebugging, device-control tools, or cracked packages usually have this characteristic. Some normal users may also hit this risk by unintentionally enabling developer mode.Android, iOS
20402SCREEN_SHARINGScreen casting or screen sharing behavior existsFraudsters may trick users into enabling screen sharing, exposing personal information and eventually causing financial loss.Android, iOS
20403VOICE_CONNECTEDVoice connection behavior existsFraudsters may conduct scams through voice calls, causing financial loss.Android, iOS

Network Environment

risk_coderisk_labelDescriptionScenario Risk DescriptionApplicable Client Types
20500VPN_ENABLEDVPN is enabledVPN is enabled on the device, indicating a network-layer tampering risk. VPNs can evade network identifier tracking and may even tamper with the network.Android, iOS
20501NETWORK_PROXYProxy network existsThe device uses a network proxy and accesses services through a specified exit node, evading risk-control detection and restrictions.Android, iOS

Root / Jailbreak / System Risks

risk_coderisk_labelDescriptionScenario Risk DescriptionApplicable Client Types
20600DEVICE_JAILBREAKDevice is jailbrokenA jailbroken iOS device can obtain higher privileges, enabling further business tampering.iOS
20601DEVICE_ROOTEDDevice is rootedAbusive actors often root Android devices to obtain higher privileges and further tamper with business logic.Android
20602SUSPICIOUS_CUSTOM_ROMSuspicious custom ROMSome abusive devices use ROMs customized from Android open-source projects. They have strong disguise capabilities, can severely affect business, and make the device system untrustworthy.Android
20603SUSPICIOUS_OPEN_SOURCE_ROMSuspicious open-source ROMNormal Android devices use vendor-provided native systems. Some abusive devices use Android open-source systems, which may affect business and indicate suspicious system risk.Android
20607DEVICE_BOOTLOADER_UNLOCKEDBootloader is unlockedAfter abusive actors unlock the bootloader, protection mechanisms are easier to bypass, and malware or attackers can more easily gain device control.Android
20608SUSPICIOUS_DEVICE_RESETSuspicious device reset behaviorSuspected abusive activity performed through device reset.Android, iOS
20610SYSTEM_VERSION_TOO_LOWSystem version is too lowMost phones used for abusive activity are relatively old, with low device performance and low system versions, such as below Android 9 or iOS 11.Android, iOS

Browser Environment

risk_coderisk_labelDescriptionScenario Risk DescriptionApplicable Client Types
20604BROWSER_COOKIE_FEATURE_DISABLEDBrowser Cookie feature is disabledBrowser cookies are disabled.Web
20605PSEUDO_BROWSER_ENVSuspected fake browser environmentAbusive actors often break away from the browser container and forge an environment consistent with a normal browser for protocol cracking.Web
20606BROWSER_INCOGNITO_MODEBrowser is in incognito modeThe page is running in a browser incognito/private mode environment.Web

Notes:

  • In the official admin console, it is recommended to display both risk_code and risk_label.
  • The meaning of risk codes may expand as rules are added. Callers should handle them as values that may return multiple entries.
  • For unknown risk codes, risk_label may be an empty string.

Error Description

Business Error Response Format

For business errors, the HTTP status code is usually still 200, and the response format is as follows:

{
  "status": "error",
  "code": -40000,
  "msg": "param error",
  "desc": {}
}

Common Error Codes

private_key Mismatch

{
  "status": "error",
  "code": -40003,
  "msg": "private_key mismatch",
  "desc": {
    "app_id": "test-app"
  }
}

Troubleshooting:

  • Check whether private_key corresponds to the current app_id.
  • Check whether the wrong application configuration was used.

Application Does Not Exist or Is Not Visible in the Current Environment

{
  "status": "error",
  "code": -40004,
  "msg": "app not found",
  "desc": {
    "app_id": "test-app"
  }
}

Troubleshooting:

  • Check whether app_id is correct.
  • Check whether the application has been deleted.
  • Check whether the current deployment environment allows access to this application.

The Input Is Not the Server-Returned gee_token

{
  "status": "error",
  "code": -40000,
  "msg": "param error",
  "desc": {
    "field": "token",
    "reason": "geetoken required",
    "crypt_type": 10
  }
}

Troubleshooting:

  • Check whether the original client token was passed directly to fp_query.
  • Confirm that the input is the gee_token returned by client_report.

Internal System Exception

{
  "status": "error",
  "code": -50000,
  "msg": "runtime error",
  "desc": {
    "type": "异常类型文本"
  }
}

Parameter Validation Errors

If the request body is missing fields or contains fields with incorrect types, the API directly returns 422 and does not use the business error wrapper.

Common scenarios:

  • Missing gee_token
  • Missing private_key
  • ts is not an integer

Integration Recommendations

It is recommended to integrate as follows:

  1. Use client_report and fp_query as a pair of APIs.
  2. Only pass the gee_token returned by client_report to fp_query.
  3. Ensure that app_id and private_key come from the same application.
  4. Use a current timestamp generated by the server for ts to avoid obviously stale data.
  5. Use risk_code + risk_label as business decision inputs. It is not recommended to rely on a single field only.