API Migration Guide
This guide is for developers who are currently using the
Unwired Labs LocationAPI process endpoint and
want to migrate to the
nRF Cloud Ground Fix API.
It covers field mappings for LTE, LTE-CAT-M, NB-IoT, and Wi-Fi location
requests.
Key structural differences
| Unwired Labs | nRF Cloud | |
|---|---|---|
| Endpoint | POST /v2/process | POST /location/ground-fix |
| Cell radio type | radio at the root level of the request | Separate field per radio type: lte, ltecatm, nbiot |
| Wi-Fi APs | Flat array under wifi key | Flat array under wifi key |
| Auth | API token in request body | Bearer token (Organization Auth Token) in Authorization header |
| Maximum Wi-Fi APs Limit | 15 | None |
| Maximum Cells Limit | 7 | None |
Cell location
Unwired Labs uses a single cells array where each object includes a radio
field to indicate the network type ("lte", "umts", "gsm", etc.). nRF Cloud
uses separate typed arrays — lte, ltecatm, and nbiot — with identical
field schemas. Split your cells by radio type when building the nRF Cloud
request.
nRF Cloud supports LTE, LTE-CAT-M, and NB-IoT only.
LTE field mapping
The same field mapping applies to all three nRF Cloud cell array types: lte,
ltecatm, and nbiot.
| Unwired Labs field | nRF Cloud field | Required (nRF Cloud) | Notes |
|---|---|---|---|
mcc | mcc | Yes | Mobile Country Code — identical |
mnc | mnc | Yes | Mobile Network Code — identical; nRF Cloud also accepts string format (e.g. "01") |
cid | eci | Yes | Cell ID → E-UTRA Cell Identifier |
lac | tac | Yes | Location Area Code → Tracking Area Code (LTE uses TAC, not LAC) |
signal | rsrp | No | Signal strength in dBm |
psc | pci | No | Physical Cell ID |
ta | adv | No | Timing Advance |
LTE-CAT-M and NB-IoT follow the same structure, using ltecatm or nbiot
as the top-level array key instead of lte.
Wi-Fi location
Both APIs use a flat array of access point objects under a wifi key. The main
differences are field names and a few additional optional fields available in
nRF Cloud.
Wi-Fi field mapping
| Unwired Labs field | nRF Cloud field | Required (nRF Cloud) | Notes |
|---|---|---|---|
bssid | macAddress | Yes | MAC address of the access point — same data, different field name |
| (not supported) | signalStrength | Yes | Signal strength detected of the Wi-Fi AP |
channel | channel | No | Wi-Fi channel number — identical |
frequency | frequency | No | Channel frequency in MHz — identical. Mutually exclusive with channel in nRF Cloud |
timestamp | (not supported) | No | - |
nRF Cloud requires a minimum of 2 access points per request.
Example: Wi-Fi request
Unwired Labs:
{
"token": "YOUR_TOKEN",
"wifi": [
{ "bssid": "30:86:2d:c4:29:d0", "channel": 6, "frequency": 2437 },
{ "bssid": "3c:37:86:5d:75:d4", "channel": 11, "frequency": 2462 }
]
}
nRF Cloud:
{
"wifi": [
{ "macAddress": "30:86:2d:c4:29:d0", "channel": 6, "signalStrength": -45 },
{ "macAddress": "3c:37:86:5d:75:d4", "channel": 11, "signalStrength": -50 }
]
}
Cell and Wi-Fi combined requests
nRF Cloud supports requests that include both cell and Wi-Fi data, same as
Unwired Labs. Just include both lte (or ltecatm/nbiot) and wifi arrays
in the same request body.
Example: Cell and Wi-Fi request
Unwired Labs:
{
"token": "YOUR_TOKEN",
"radio": "lte",
"mcc": 242,
"mnc": 2,
"cells": [
{
"cid": 33903884,
"lac": 2801,
"signal": -66,
"psc": 123,
"ta": 16
}
],
"wifi": [
{ "bssid": "30:86:2d:c4:29:d0", "channel": 6, "frequency": 2437 },
{ "bssid": "3c:37:86:5d:75:d4", "channel": 11, "frequency": 2462 }
]
}
nRF Cloud:
{
"lte": [
{
"mcc": 242,
"mnc": 2,
"eci": 33903884,
"tac": 2801,
"rsrp": -66,
"pci": 123,
"adv": 16
}
],
"wifi": [
{
"macAddress": "30:86:2d:c4:29:d0",
"channel": 6,
"frequency": 2437,
"signalStrength": -45
},
{
"macAddress": "3c:37:86:5d:75:d4",
"channel": 11,
"frequency": 2462,
"signalStrength": -50
}
]
}
Response format
Both APIs return a latitude, longitude, and accuracy estimate. Field names differ:
| Unwired Labs field | nRF Cloud field | Description |
|---|---|---|
lat | lat | Latitude |
lon | lon | Longitude |
accuracy | uncertainty | Radius in meters, 1-sigma probability (68%) that your device is within this circle. |
address | (not returned) | nRF Cloud does not return a geocoded address at this time |
| (not returned) | fulfilledWith | Method used: SCELL, MCELL, or WIFI |
Auth
Unwired Labs requires an API token to be included in the request body. nRF Cloud
uses Bearer token authentication with an Organization Auth Token, which must be
included in the Authorization header of the HTTP request.
Example: Auth
Unwired Labs:
URL: https://us1.unwiredlabs.com/v2/process
HEADERS: NONE
BODY:
{
"token": "YOUR_TOKEN",
"radio": "lte",
"mcc": 242,
"mnc": 2,
"cells": [
{
"cid": 33903884,
"lac": 2801,
"signal": -66,
"psc": 123,
"ta": 16
}
]
}
nRF Cloud:
URL:
https://api.nrfcloud.com/v1/organizations/<YOUR_ORG>/projects/<YOUR_PROJECT>/location/ground-fix
HEADERS: Authorization: Bearer <YOUR_OAT_TOKEN>
BODY:
{
"lte": [
{
"mcc": 242,
"mnc": 2,
"eci": 33903884,
"tac": 2801,
"rsrp": -66,
"adv": 16
}
]
}
Example nRF Cloud request
In order to make a request to location services, you need an organization, project, and an OAT. See the details in the Location Services Quickstart Guide to get set up.
curl --request POST \
--url https://api.nrfcloud.com/v1/organizations/<YOUR_ORG>/projects/<YOUR_PROJECT>/location/ground-fix \
--header 'Authorization: Bearer <YOUR_OAT_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"lte": [
{
"mcc": 242,
"mnc": 2,
"eci": 33903884,
"tac": 2801,
"rsrp": -66,
"adv": 16
}
],
"wifi": [
{
"macAddress": "30:86:2d:c4:29:d0",
"channel": 6,
"frequency": 2437,
"signalStrength": -45
},
{
"macAddress": "3c:37:86:5d:75:d4",
"channel": 11,
"frequency": 2462,
"signalStrength": -50
}
]
}'