User Device Registration
Register or update a user’s device information. This endpoint is typically called during transaction requests to maintain device tracking and security measures.
If you don’t have your own device/IP info, we also offer an external device fingerprinting SDK that provides enhanced device identification capabilities and seamless integration with our API. Contact our team at support@orca-fraud.com to get more info.
API Endpoint
URL: /v1/userDevice
Method: POST
Request Body
The request must include a JSON payload with the device details:
{
"id": "DEVICE123",
"userId": "USER123",
"deviceId": "iPhone13-UDID789",
"fingerprint": "fp_123",
"name": "John's iPhone",
"type": "mobile",
"platform": "iOS",
"sessionKey": "session_123",
"source": "FingerprintJS",
"host": "johns-iphone.local",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15",
"remoteIP": "192.168.1.1",
"ipAddress": "192.168.1.1",
"ipCountry": "US",
"gpsCountry": "US",
"ipCoordinates": "37.7749,-122.4194",
"gpsCoordinates": "37.7750,-122.4195",
"status": "ACTIVE",
"lastLoginAttempt": 1734167723000,
"lastLoginSuccess": true,
"lastSeen": 1734167723000,
"firstSeen": 1734167723000,
"city": "San Francisco",
"region": "California",
"postalCode": "94103",
"country": "US",
"operatingSystemName": "iOS",
"operatingSystemVersion": "15.0",
"deviceModel": "iPhone 13",
"browserName": "Safari",
"browserVersion": "15.0",
"timezone": "America/Los_Angeles",
"deviceAgeHours": 720,
"isEmulator": false,
"isRemoteSoftware": false,
"isRooted": false,
"isTamperedApp": false,
"isProxy": false,
"isTor": false,
"isIncognito": false,
"isVPN": false,
"isSpoofed": false,
"isBot": false,
"isBogon": false,
"isDatacenter": false,
"isKnownAttacker": false,
"isKnownAbuser": false,
"isIcloudRelay": false,
"debuggerConnected": false,
"fingerprintConfidence": 0.95,
"asnNumber": "AS16509",
"asnName": "Amazon.com, Inc.",
"asnType": "hosting",
"asnRoute": "203.0.113.0/24",
"carrierCountryCode": "655",
"carrierNetworkCode": "01",
"carrierName": "Vodacom",
"vpnRiskLevel": "low",
"proxyRiskLevel": "low",
"threatRiskLevel": "low",
"overallRiskLevel": "low",
"ipType": "residential",
"sessionIpCount": 1,
"countryCount": 1,
"distractionCount": 0
}Response
A successful request returns a 200 status code with the registered device details:
{
"id": "DEVICE123",
"userId": "USER123",
"deviceId": "iPhone13-UDID789",
"fingerprint": "fp_123",
"name": "John's iPhone",
"type": "mobile",
"platform": "iOS",
"sessionKey": "session_123",
"source": "FingerprintJS",
"host": "johns-iphone.local",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15",
"remoteIP": "192.168.1.1",
"ipAddress": "192.168.1.1",
"ipCountry": "US",
"gpsCountry": "US",
"ipCoordinates": "37.7749,-122.4194",
"gpsCoordinates": "37.7750,-122.4195",
"status": "ACTIVE",
"lastLoginAttempt": 1734167723000,
"lastLoginSuccess": true,
"lastSeen": 1734167723000,
"firstSeen": 1734167723000,
"city": "San Francisco",
"region": "California",
"postalCode": "94103",
"country": "US",
"operatingSystemName": "iOS",
"operatingSystemVersion": "15.0",
"deviceModel": "iPhone 13",
"browserName": "Safari",
"browserVersion": "15.0",
"timezone": "America/Los_Angeles",
"deviceAgeHours": 720,
"isEmulator": false,
"isRemoteSoftware": false,
"isRooted": false,
"isTamperedApp": false,
"isProxy": false,
"isTor": false,
"isIncognito": false,
"isVPN": false,
"isSpoofed": false,
"isBot": false,
"isBogon": false,
"isDatacenter": false,
"isKnownAttacker": false,
"isKnownAbuser": false,
"isIcloudRelay": false,
"debuggerConnected": false,
"fingerprintConfidence": 0.95,
"asnNumber": "AS16509",
"asnName": "Amazon.com, Inc.",
"asnType": "hosting",
"asnRoute": "203.0.113.0/24",
"carrierCountryCode": "655",
"carrierNetworkCode": "01",
"carrierName": "Vodacom",
"vpnRiskLevel": "low",
"proxyRiskLevel": "low",
"threatRiskLevel": "low",
"overallRiskLevel": "low",
"ipType": "residential",
"sessionIpCount": 1,
"countryCount": 1,
"distractionCount": 0
}Error Response Format
See the Error Reference section for a full description of API errors. All API errors follow a consistent JSON structure:
{
"error": {
"type": "ERROR_TYPE",
"message": "Human-readable error description",
"details": ["Additional error details (optional)"]
},
"timestamp": 1755602195137
}In the case of a validation error, the format will be as follows:
{
"error": {
"type": "VALIDATION_ERROR",
"message": "Request validation failed",
"details": [
"/id: Expected string"
]
},
"timestamp": 1755602195137
}Schema Definition
UserDevice
| Property | Type | Required | Description |
|---|---|---|---|
| id | string | No | Unique identifier for the device entity |
| deviceId | string | No | Unique device identifier |
| userId | string | Yes | User identifier |
| fingerprint | string | No | Unique device fingerprint identifier |
| sessionKey | string | No | Unique session identifier |
| name | string | No | Name of the device |
| type | string | No | Type of device (e.g., mobile, desktop) |
| platform | string | No | Device platform (e.g., iOS, Android, Web) |
| source | string | No | Fingerprinting provider (e.g., SHIELD, FingerprintJS) |
| host | string | No | Hostname of the device |
| userAgent | string | No | User agent of the device |
| remoteIP | string | No | Deprecated. Remote IP address of the device. Use ipAddress instead |
| ipAddress | string | No | IP address of the device |
| ipCountry | string | No | Country derived from IP address. ISO 3166-1 alpha-2 (e.g., ZA, US, GB) |
| gpsCountry | string | No | Country derived from GPS coordinates. ISO 3166-1 alpha-2 (e.g., ZA, US, GB) |
| ipCoordinates | string | No | Coordinates derived from IP geolocation. Formatted as "lat,lon" (e.g., "-26.2041,28.0473") |
| gpsCoordinates | string | No | Coordinates from device GPS. Formatted as "lat,lon" (e.g., "-26.2041,28.0473") |
| status | string | No | Device status (ACTIVE, BLOCKED, SUSPICIOUS) |
| lastLoginAttempt | number | No | Unix timestamp in milliseconds of last login attempt |
| lastLoginSuccess | boolean | No | Whether the last login attempt succeeded |
| lastSeen | number | No | Unix timestamp in milliseconds |
| firstSeen | number | No | Unix timestamp in milliseconds |
| createdAt | number | No | Unix timestamp in milliseconds that device entity was created |
| updatedAt | number | No | Unix timestamp in milliseconds when last updated |
Location Fields
| Property | Type | Required | Description |
|---|---|---|---|
| city | string | No | City of the device (e.g., Cape Town) |
| region | string | No | Region/state of the device (e.g., Western Cape) |
| postalCode | string | No | Postal/ZIP code of the device (e.g., 7701) |
| country | string | No | Country code (supported country). ISO 3166-1 alpha-2 (e.g., ZA, US, GB) |
Device Signal Fields
These fields are flat on the request but mapped to a deviceSignals nested object internally.
| Property | Type | Required | Description |
|---|---|---|---|
| operatingSystemName | string | No | Operating system name |
| operatingSystemVersion | string | No | Operating system version |
| deviceModel | string | No | Device model name |
| browserName | string | No | Browser name |
| browserVersion | string | No | Browser version |
| timezone | string | No | Device timezone (e.g., America/Los_Angeles) |
| deviceAgeHours | number | No | Device age in hours |
| isEmulator | boolean | No | Whether the device is an emulator |
| isRemoteSoftware | boolean | No | Whether remote software is detected |
| isRooted | boolean | No | Whether the device is rooted/jailbroken |
| isTamperedApp | boolean | No | Whether the app has been tampered with |
| isProxy | boolean | No | Whether a proxy is detected |
| isTor | boolean | No | Whether Tor is detected |
| isIncognito | boolean | No | Whether incognito/private mode is active |
| isVPN | boolean | No | Whether a VPN is detected |
| isSpoofed | boolean | No | Whether spoofing is detected |
| isBot | boolean | No | Whether a bot is detected |
| debuggerConnected | boolean | No | Whether a debugger is connected |
Security Signal Fields
These fields are flat on the request but mapped to a securitySignals nested object internally.
| Property | Type | Required | Description |
|---|---|---|---|
| fingerprintConfidence | number | No | Confidence score for the fingerprint (0–1) |
| vpnRiskLevel | string | No | VPN risk level (low, medium_low, medium, high, very_high) |
| proxyRiskLevel | string | No | Proxy risk level (low, medium_low, medium, high, very_high) |
| threatRiskLevel | string | No | Threat risk level (low, medium_low, medium, high, very_high) |
| overallRiskLevel | string | No | Overall risk level (low, medium_low, medium, high, very_high) |
| behaviorBiometricLevel | string | No | Behavior biometric risk level (low, medium, high) |
| remoteAccessLevel | string | No | Remote access risk level (low, medium, high) |
| osAnomalyLevel | string | No | OS anomaly risk level (low, medium, high) |
Network Fields
These fields are flat on the request but mapped to a networkInfo nested object internally.
| Property | Type | Required | Description |
|---|---|---|---|
| ipType | string | No | IP address type (e.g., residential, datacenter) |
| sessionIpCount | number | No | Number of IPs observed in the session |
| countryCount | number | No | Number of distinct countries observed |
| isKnownAttacker | boolean | No | Whether the IP is a known attacker |
| isKnownAbuser | boolean | No | Whether the IP is a known abuser |
| isIcloudRelay | boolean | No | Whether the IP is an iCloud Private Relay exit node |
| isBogon | boolean | No | Whether the IP is a bogon (unallocated/reserved) address |
| isDatacenter | boolean | No | Whether the IP belongs to a datacenter |
| asnNumber | string | No | ASN identifier of the IP (e.g., AS16509) |
| asnName | string | No | Organisation name associated with the ASN |
| asnType | string | No | ASN type (hosting, isp, cdn, edu, gov, mil, business) |
| asnRoute | string | No | CIDR network prefix associated with the ASN (e.g., 203.0.113.0/24) |
| carrierCountryCode | string | No | 3-digit Mobile Country Code (MCC) of the carrier (e.g., 655 for South Africa) |
| carrierNetworkCode | string | No | 2–3 digit Mobile Network Code (MNC) of the carrier (e.g., 01 for Vodacom ZA) |
| carrierName | string | No | Name of the mobile carrier |
Biometric Fields
These fields are flat on the request but mapped to a biometrics nested object internally.
| Property | Type | Required | Description |
|---|---|---|---|
| distractionCount | number | No | Number of distractions detected during the session |