Cloud API v1
Complete reference for the HiTekNova Cloud API — authentication, device record queries, single and bulk IMEI lookup, SKU mapping.
Contents
Overview Base URL & Authentication Authentication — RegisteredToken Single Lookup — getByImei Bulk Lookup — getByImeiBulk List Devices — getAllDevices Query by User — getByUser Query by Machine — getByMachine SKU Mapping — getSku Device Record Fields Error Handling SupportOverview
The Cloud API exposes HiTekNova's device processing data over HTTPS as JSON. Every endpoint takes a POST request with a JSON body and returns a JSON response. All data-querying endpoints require a Bearer JWT obtained from RegisteredToken.
Base URL & Authentication
All endpoints share the same base URL. Pass your JWT in the Authorization header.
Authorization header
Authorization: Bearer <JWT> Content-Type: application/json
Authentication — RegisteredToken
Exchange your dashboard username and password for a JWT. The token embeds your customer_id, so every subsequent call is automatically scoped to your account. Tokens are long-lived — cache them.
Required parameters
| Parameter | Type | Description |
|---|---|---|
username required | string | Dashboard username |
password required | string | Dashboard password |
Example — Request
curl -X POST https://cloudapi.hiteknova.com/ClientDataAPI/RegisteredToken \ -H "Content-Type: application/json" \ -d '{"username":"yourlogin","password":"yourpassword"}'
Response
On success the raw JWT string is returned in the body (no JSON wrapper). Use it as Authorization: Bearer <token> on every other call.
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6...
Single Lookup — getByImei
Look up history for a single IMEI or serial number. Matches either imei_esn or serial_number. Returns up to 100 records per call, paginated via fromid.
Required parameters
| Parameter | Type | Description |
|---|---|---|
imei required | string (min 4) | Matches imei_esn OR serial_number |
Optional parameters
| Parameter | Type | Description |
|---|---|---|
fromdate | string (YYYY-MM-DD) | Default: 1 year ago |
todate | string (YYYY-MM-DD) | Default: today (UTC) |
fromid | integer | Cursor — records with id > fromid |
limit | integer | Default and max: 100 |
latest | boolean | Default false. When true, returns only the newest record (LIMIT 1, ORDER BY id DESC). |
test_result | string | passed, failed |
erase_result | string | passed, failed |
report_type | string | all, erase, triage |
os_type | string | iOS, Android |
model_name | string | Partial match (LIKE) |
Example
curl -X POST https://cloudapi.hiteknova.com/ClientDataAPI/getByImei \ -H "Authorization: Bearer <JWT>" \ -H "Content-Type: application/json" \ -d '{"imei":"356360390499091"}'
Response
{
"status": 1,
"msg": "",
"total": 2,
"has_more": false,
"last_id": 60185,
"data": [ { /* device record */ }, ... ]
}
All query endpoints (getByImei, getByImeiBulk, getAllDevices, getByUser, getByMachine) return records with the same shape. See Device Record Fields for the complete field reference.
Bulk Lookup — getByImeiBulk NEW
Look up history for up to 100 IMEIs or serial numbers in one call. The latest flag (default true) returns one newest record per matched input in request order — the fastest path for "do I have these devices?" checks. Set latest: false for full history with id ASC paging via from_id / last_id.
Required parameters
| Parameter | Type | Description |
|---|---|---|
imeis required | string[] (max 100) | Array of IMEIs or serial numbers (length 4–50) |
Optional parameters
| Parameter | Type | Description |
|---|---|---|
latest | boolean | Default true. One newest record per matched IMEI, in request order. |
fromdate | string (YYYY-MM-DD) | Default: 30 days ago |
todate | string (YYYY-MM-DD) | Default: today (UTC) |
from_id | integer | Cursor for pagination (use with latest: false) |
limit | integer | Default and max: 100 |
test_result | string | passed, failed |
erase_result | string | passed, failed |
report_type | string | all, erase, triage |
os_type | string | iOS, Android |
model_name | string | Partial match (LIKE) |
latest is true (the default), records are returned in the order of the input array. When latest is false, records are returned by id ASC and pagination via from_id/last_id is active.RAM field is populated from process.specs.ram when available (typically for Android devices with specs collected during testing).Example — latest (default)
curl -X POST https://cloudapi.hiteknova.com/ClientDataAPI/getByImeiBulk \ -H "Authorization: Bearer <JWT>" \ -H "Content-Type: application/json" \ -d '{ "imeis": ["356360390499091","356360393577562","358991131387944"] }'
Example — full history, paged
{
"imeis": ["356360390499091"],
"latest": false,
"fromdate": "2026-01-01",
"limit": 100
}
// next page
{
"imeis": ["356360390499091"],
"latest": false,
"from_id": 60190,
"limit": 100
}
Example — filters
{
"imeis": ["356360390499091","356360393577562"],
"latest": false,
"erase_result": "passed",
"os_type": "Android",
"model_name": "Galaxy S24",
"fromdate": "2026-01-01",
"todate": "2026-04-15"
}
Response
{
"status": 1,
"msg": "",
"total": 3,
"has_more": false,
"last_id": 60185,
"data": [
{
"id": 60184,
"IMEI": "356360393577562",
"IMEI2": "357332263577567",
"SerialNumber": "R5CXB08H4PJ",
"ModelName": "Galaxy S24 FE",
"Capacity": "256GB",
"RAM": "8GB",
"BatteryMaxCapacity": "98%",
"ErasureStatus": "Passed",
// ... see Device Record Fields below
}
]
}
List Devices — getAllDevices
List device records for the authenticated customer, filtered by date and report type. Returns up to 100 records, paginated via fromid.
Optional parameters
| Parameter | Type | Description |
|---|---|---|
fromdate | string | Default: 1 year ago |
todate | string | Default: today (UTC) |
fromid | integer | Cursor — records with id >= fromid |
limit | integer | Default and max: 100 |
report_type | string | all, erase, triage |
latest | boolean | Default false. When true, returns only the newest record (LIMIT 1, ORDER BY id DESC). |
test_result | string | passed, failed |
erase_result | string | passed, failed |
os_type | string | iOS, Android |
model_name | string | Partial match (LIKE) |
Example
curl -X POST https://cloudapi.hiteknova.com/ClientDataAPI/getAllDevices \ -H "Authorization: Bearer <JWT>" \ -H "Content-Type: application/json" \ -d '{"fromdate":"2026-03-01","todate":"2026-04-15","report_type":"erase"}'
Response
{
"status": 1,
"msg": "",
"total": 100,
"has_more": true,
"last_id": 60110,
"data": [ { /* device record */ }, ... ]
}
All query endpoints (getByImei, getByImeiBulk, getAllDevices, getByUser, getByMachine) return records with the same shape. See Device Record Fields for the complete field reference.
Query by User — getByUser
List records created by a specific operator (username). Use for per-technician reports.
Required parameters
| Parameter | Type | Description |
|---|---|---|
username required | string | Operator username |
fromdate required | string | YYYY-MM-DD |
todate required | string | YYYY-MM-DD |
fromid required | integer | Cursor (use 0 to start) |
report_type required | string | all, erase, triage |
Optional parameters
| Parameter | Type | Description |
|---|---|---|
data_format | integer | 1 = run records through formatData() (same shape as other endpoints). Otherwise raw DB columns are returned. |
limit | integer | Inner per-table limit (default 10000). |
test_result | string | passed, failed |
erase_result | string | passed, failed |
os_type | string | iOS, Android |
model_name | string | Partial match (LIKE) |
UNION, so has_more in the response is always false and latest is not supported. Use fromid for cursor paging.Example
curl -X POST https://cloudapi.hiteknova.com/ClientDataAPI/getByUser \ -H "Authorization: Bearer <JWT>" \ -H "Content-Type: application/json" \ -d '{ "username":"operator01", "fromdate":"2026-03-01", "todate":"2026-04-15", "fromid":0, "report_type":"all", "data_format":1 }'
Query by Machine — getByMachine
List records processed on a specific TestPod machine (machine_sn).
Required parameters
| Parameter | Type | Description |
|---|---|---|
machine_sn required | string | TestPod machine serial |
fromdate required | string | YYYY-MM-DD |
todate required | string | YYYY-MM-DD |
fromid required | integer | Cursor |
report_type required | string | all, erase, triage |
Optional parameters
| Parameter | Type | Description |
|---|---|---|
limit | integer | Inner per-table limit (default 10000). |
test_result | string | passed, failed |
erase_result | string | passed, failed |
os_type | string | iOS, Android |
model_name | string | Partial match (LIKE) |
UNION, so has_more in the response is always false and latest is not supported. Use fromid for cursor paging.Example
curl -X POST https://cloudapi.hiteknova.com/ClientDataAPI/getByMachine \ -H "Authorization: Bearer <JWT>" \ -H "Content-Type: application/json" \ -d '{ "machine_sn":"TP-001234", "fromdate":"2026-03-01", "todate":"2026-04-15", "fromid":0, "report_type":"all" }'
SKU Mapping — getSku
Fetch the SKU mapping table for your account. Returns sku, sku_1, sku_2 rows used to enrich getBy* responses.
Example
curl -X POST https://cloudapi.hiteknova.com/ClientDataAPI/getSku \ -H "Authorization: Bearer <JWT>" \ -H "Content-Type: application/json" \ -d '{}'
Response
{
"status": 1,
"data": [
{ "sku": "SKU001", "sku_1": "Alias A", "sku_2": "Alias B" }
]
}
Device Record Fields
Every record returned by the query endpoints has the following shape. Fields may be empty strings when a value is not available.
| Field | Type | Description |
|---|---|---|
id | integer | Record id (use for cursor pagination) |
IMEI | string | Primary IMEI |
IMEI2 | string | Secondary IMEI (dual-SIM) |
MEID | string | CDMA MEID |
SerialNumber | string | Device serial |
ECID | string | Apple ECID |
Manufacturer | string | Manufacturer name |
ModelNumber | string | Model number (SKU code) |
ModelName | string | Human-readable model name |
RegulatoryModel | string | FCC / regulatory model |
Region | string | Regional code |
ProductType | string | Product type |
Capacity | string | Storage capacity |
RAM | string | Device RAM (from process.specs.ram) |
Color | string | Device color |
BatteryMaxCapacity | string | Battery max capacity (percent) |
CycleCount | string | Battery cycle count |
OSType | string | iOS or Android |
OSVersion | string | Operating system version |
BluetoothAddress | string | Bluetooth MAC |
WifiAddress | string | Wi-Fi MAC |
FMIStatus | string | Find My iPhone / activation lock status |
FRPStatus | string | Factory Reset Protection status |
MDMStatus | string | MDM status |
Jailbreak | string | Jailbreak / root status |
GSMABlacklisted | string | GSMA blacklist status |
SimLock | string | SIM lock state |
Carrier | string | Carrier name |
SKU | string | Customer SKU |
MachineSN | string | TestPod machine serial that processed the device |
PortIndex | string | TestPod port index |
Username | string | Operator username |
LocalTimeCreated | string | Local time the record was created |
UTCTimeCreated | string | UTC creation timestamp |
DiagnosticsResult | string | Diagnostics app result |
ManualGrading | string | Manual grading result |
ErasureStatus | string | Passed / Failed |
ErasureID | string | Erasure certificate ID (sha3-224 hash) |
ErasureCertificateURL | string | Full URL to the erasure certificate PDF |
Comments | string | Free-text comments |
CustomField | string | Custom field |
Customer | string | Customer label |
PurchaseOrder | string | PO number |
BoxNumber | string | Box number |
Error Handling
On failure, endpoints return status: 0 and a human-readable msg. On success, status: 1.
{
"status": 0,
"msg": "Data format incorrect"
}
msg | Description |
|---|---|
Data format incorrect | Request body is not valid JSON or a required parameter is missing. |
Username or password incorrect | RegisteredToken — invalid credentials |
Authorization failed | JWT is missing, invalid, or expired — call RegisteredToken again. |
Missing or invalid 'imeis' | No valid IMEIs provided to getByImeiBulk after filtering (min length 4). |
Too many imeis: max 100 per request | More than 100 IMEIs sent to getByImeiBulk in a single call. |
No valid imeis provided (min length 4) | No valid IMEIs provided to getByImeiBulk after filtering (min length 4). |
