N-Ways
Developer docsGPS trackers

GPS trackers

The trackers fitted to your cars, bikes and trucks (Concox, Jimi, Micodus, Teltonika, Sinotrack, Coban, Queclink, Meitrack, Ruptela, Suntech, Galileosky, iStartek, JT/T 808 and more, and phones running Traccar Client or OsmAnd). Add one by its IMEI (14 digits are fine: the check digit is worked out), and put it on a vehicle now or later (POST /trackers/assign; a vehicle can have several, its position from the best current fix, the primary first); send it the setup SMS steps (setup), and its positions appear as that vehicle's, with ignition, power and battery. First claim wins: a tracker another organisation holds is refused (TRACKER_CLAIMED_ELSEWHERE: move it with /tracker-transfers). Devices report to trk.nways.ng on their protocol's port (GT06 5023, Teltonika 5027, H02 5013, the catalogue lists each; 5000 works any of them out); ones that report under a shorter id (TK103, watches, JT/T 808 by terminal or SIM number) are matched to their IMEI; phones to https://nways.ng/v1/trackers/osmand?id=<tracker id>&lat=&lon=&timestamp=&speed= (OsmAnd's protocol). Alarms (SOS, power cut, overspeed, low battery) are alerts of kind tracker_alarm and the webhook asset.tracker_alarm. Try it without hardware: POST /trackers/{trackerId}/virtual drives a virtual tracker speaking the device's own protocol, or run go run ./cmd/trackersim (the backend repository) against your own gateway.

On this page
Note:

Send your key as key=YOUR_API_KEY on the address, or in the X-NWays-Api-Key header. API keys

Base address: https://nways.ng/maps/v1/fleet

List your trackers, with counts by state

GET https://nways.ng/maps/v1/fleet/trackers

Parameters

NameInTypeDescription
statequerystringOne of: awaiting_first_fix, live, silent.
modelquerystringA catalogue model id.
qquerystringFinds a name, IMEI, vehicle or SIM number.
cURL
curl "https://nways.ng/maps/v1/fleet/trackers" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
const res = await fetch('https://nways.ng/maps/v1/fleet/trackers', {
  headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()
Python
import os
import requests

res = requests.get(
    "https://nways.ng/maps/v1/fleet/trackers",
    headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
    timeout=10,
)
data = res.json()

Response

Trackers

FieldTypeDescription
trackersTracker[]Required.
trackers[].idstring
trackers[].imeistring
trackers[].namestring
trackers[].vehicleIdstring | null
trackers[].vehicleNamestring
trackers[].protocolstringA protocol N-Ways' gateway reads (gt06, teltonika, h02, gps103, tk103, gl200, meitrack, ruptela, jt808, suntech, galileo, startek, topin, xexun, gosafe, tzone, wialon, watch, osmand), forward for a unit forwarded from your tracking platform, or "" until its model or first connection says.
trackers[].modelstring
trackers[].simNumberstring
trackers[].networkstring
trackers[].apnstring
trackers[].statestringOne of: awaiting_first_fix, live, silent.
trackers[].connectedboolean
trackers[].heardbooleanN-Ways' gateway has heard this device (even before it was added).
trackers[].lastSeenAtstring (date-time) | null
trackers[].lastFixAtstring (date-time) | nullIts last GPS fix.
trackers[].onMapAtstring (date-time) | nullIts last fix that moved its vehicle on the map.
trackers[].positionobject | null
trackers[].batteryPctnumber | null
trackers[].batteryVnumber | null
trackers[].extVoltageVnumber | null
trackers[].ignitionboolean | null
trackers[].satsinteger | null
trackers[].odometerMnumber | null
trackers[].claimedAtstring (date-time)
trackers[].setupobjectThe single tracker's: the SMS steps in order (key, sms, reply, optional), or a phone app's settings (value).
trackers[].setup.protocolstring
trackers[].setup.hoststring
trackers[].setup.portinteger
trackers[].setup.urlstring
trackers[].setup.smsTostring
trackers[].setup.assumedboolean
trackers[].setup.stepsobject[]
trackers[].setup.steps[].ninteger
trackers[].setup.steps[].keystring
trackers[].setup.steps[].smsstring
trackers[].setup.steps[].valuestring
trackers[].setup.steps[].replystring
trackers[].setup.steps[].optionalboolean
trackers[].diagnosisstring[]What the gateway saw that needs fixing, most useful first.
trackers[].virtualVirtualTracker
trackers[].virtual.runningboolean
trackers[].virtual.protocolstring
trackers[].virtual.startedAtstring (date-time)
trackers[].virtual.untilstring (date-time)
trackers[].virtual.sentinteger
trackers[].virtual.answeredinteger
trackers[].virtual.problemsstring[]
trackers[].virtual.errorstring
countsobjectRequired.
modelsobject
200 OK
{
  "trackers": [
    {
      "id": "trk_4fQ9xLm2Za",
      "imei": "356307042441013",
      "name": "string",
      "vehicleId": "string",
      "vehicleName": "string",
      "protocol": "gt06",
      "model": "string",
      "simNumber": "string",
      "network": "string",
      "apn": "string",
      "state": "awaiting_first_fix",
      "connected": true,
      "heard": true,
      "lastSeenAt": "2026-10-15T09:00:00+01:00",
      "lastFixAt": "2026-10-15T09:00:00+01:00",
      "onMapAt": "2026-10-15T09:00:00+01:00",
      "position": {
        "lat": 0,
        "lng": 0,
        "at": "2026-10-15T09:00:00+01:00"
      },
      "batteryPct": 0,
      "batteryV": 0,
      "extVoltageV": 0,
      "ignition": true,
      "sats": 0,
      "odometerM": 0,
      "claimedAt": "2026-10-15T09:00:00+01:00",
      "setup": {
        "protocol": "string",
        "host": "string",
        "port": 0,
        "url": "string",
        "smsTo": "string",
        "assumed": true,
        "steps": [
          {}
        ]
      },
      "diagnosis": [
        "no_vehicle"
      ],
      "virtual": {
        "running": true,
        "protocol": "string",
        "startedAt": "2026-10-15T09:00:00+01:00",
        "until": "2026-10-15T09:00:00+01:00",
        "sent": 0,
        "answered": 0,
        "problems": [
          "string"
        ],
        "error": "string"
      }
    }
  ],
  "counts": {},
  "models": {}
}

Errors

  • default Error

Add a tracker by its IMEI (first claim wins)

POST https://nways.ng/maps/v1/fleet/trackers

Errors: INVALID_IMEI (not 15 digits, or the Luhn check digit is wrong), INVALID_DEVICE_ID (a phone's id), TRACKER_EXISTS (already yours), TRACKER_CLAIMED_ELSEWHERE (another organisation holds it), VEHICLE_NOT_FOUND.

Request body

FieldTypeDescription
imeistring15 digits (spaces and dashes are dropped); a phone's device id for model osmand-phone, a platform's unit id for model forwarded.
namestring
vehicleIdstringOne of your vehicles ("" to unlink).
vehicleobjectA new vehicle for it, instead.
vehicle.namestring
vehicle.modestring
vehicle.platestring
modelstringA catalogue model id, or not-sure (learned from its first connection).
simNumberstring
networkstringA catalogue network id, or other.
apnstringDefault: the network's.
cURL
curl -X POST "https://nways.ng/maps/v1/fleet/trackers" \
  -H "X-NWays-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"imei":"356307042441013","vehicleId":"truck-12","model":"concox-gt06n","network":"mtn","simNumber":"+2348030000000"}'
JavaScript
const res = await fetch('https://nways.ng/maps/v1/fleet/trackers', {
  method: 'POST',
  headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "imei": "356307042441013",
    "vehicleId": "truck-12",
    "model": "concox-gt06n",
    "network": "mtn",
    "simNumber": "+2348030000000"
  }),
})
const data = await res.json()
Python
import os
import requests

res = requests.post(
    "https://nways.ng/maps/v1/fleet/trackers",
    headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
    json={"imei": "356307042441013", "vehicleId": "truck-12", "model": "concox-gt06n", "network": "mtn", "simNumber": "+2348030000000"},
    timeout=10,
)
data = res.json()

Response

Added

FieldTypeDescription
idstring
imeistring
namestring
vehicleIdstring | null
vehicleNamestring
protocolstringA protocol N-Ways' gateway reads (gt06, teltonika, h02, gps103, tk103, gl200, meitrack, ruptela, jt808, suntech, galileo, startek, topin, xexun, gosafe, tzone, wialon, watch, osmand), forward for a unit forwarded from your tracking platform, or "" until its model or first connection says.
modelstring
simNumberstring
networkstring
apnstring
statestringOne of: awaiting_first_fix, live, silent.
connectedboolean
heardbooleanN-Ways' gateway has heard this device (even before it was added).
lastSeenAtstring (date-time) | null
lastFixAtstring (date-time) | nullIts last GPS fix.
onMapAtstring (date-time) | nullIts last fix that moved its vehicle on the map.
positionobject | null
batteryPctnumber | null
batteryVnumber | null
extVoltageVnumber | null
ignitionboolean | null
satsinteger | null
odometerMnumber | null
claimedAtstring (date-time)
setupobjectThe single tracker's: the SMS steps in order (key, sms, reply, optional), or a phone app's settings (value).
setup.protocolstring
setup.hoststring
setup.portinteger
setup.urlstring
setup.smsTostring
setup.assumedboolean
setup.stepsobject[]
setup.steps[].ninteger
setup.steps[].keystring
setup.steps[].smsstring
setup.steps[].valuestring
setup.steps[].replystring
setup.steps[].optionalboolean
diagnosisstring[]What the gateway saw that needs fixing, most useful first.
virtualVirtualTracker
virtual.runningboolean
virtual.protocolstring
virtual.startedAtstring (date-time)
virtual.untilstring (date-time)
virtual.sentinteger
virtual.answeredinteger
virtual.problemsstring[]
virtual.errorstring
201 OK
{
  "id": "trk_4fQ9xLm2Za",
  "imei": "356307042441013",
  "name": "string",
  "vehicleId": "string",
  "vehicleName": "string",
  "protocol": "gt06",
  "model": "string",
  "simNumber": "string",
  "network": "string",
  "apn": "string",
  "state": "awaiting_first_fix",
  "connected": true,
  "heard": true,
  "lastSeenAt": "2026-10-15T09:00:00+01:00",
  "lastFixAt": "2026-10-15T09:00:00+01:00",
  "onMapAt": "2026-10-15T09:00:00+01:00",
  "position": {
    "lat": 0,
    "lng": 0,
    "at": "2026-10-15T09:00:00+01:00"
  },
  "batteryPct": 0,
  "batteryV": 0,
  "extVoltageV": 0,
  "ignition": true,
  "sats": 0,
  "odometerM": 0,
  "claimedAt": "2026-10-15T09:00:00+01:00",
  "setup": {
    "protocol": "string",
    "host": "string",
    "port": 0,
    "url": "string",
    "smsTo": "string",
    "assumed": true,
    "steps": [
      {
        "n": 0,
        "key": "string",
        "sms": "string",
        "value": "string",
        "reply": "string",
        "optional": true
      }
    ]
  },
  "diagnosis": [
    "no_vehicle"
  ],
  "virtual": {
    "running": true,
    "protocol": "string",
    "startedAt": "2026-10-15T09:00:00+01:00",
    "until": "2026-10-15T09:00:00+01:00",
    "sent": 0,
    "answered": 0,
    "problems": [
      "string"
    ],
    "error": "string"
  }
}

Errors

  • default Error

The device catalogue, your country's SIM networks and their APNs, and where devices report

GET https://nways.ng/maps/v1/fleet/trackers/catalog

models: every model (with status supported | coming, its methods and family), then forwarded and not-sure. brands, families, protocols, counts: as GET https://nways.ng/v1/trackers/catalogue. networks: your country's; unverified: an APN from a public listing not yet checked on a real SIM.

cURL
curl "https://nways.ng/maps/v1/fleet/trackers/catalog" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
const res = await fetch('https://nways.ng/maps/v1/fleet/trackers/catalog', {
  headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()
Python
import os
import requests

res = requests.get(
    "https://nways.ng/maps/v1/fleet/trackers/catalog",
    headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
    timeout=10,
)
data = res.json()

Response

Catalogue

FieldTypeDescription
modelsTrackerModel[]
models[].idstring
models[].brandstring
models[].brandIdstring
models[].namestring
models[].protocolstring
models[].familystringIts command set (setup SMS, configurator, commands).
models[].kindstringOne of: vehicle, asset, personal, obd, phone.
models[].passwordstringThe SMS password it ships with.
models[].popularboolean
models[].statusstringOne of: supported, coming.
models[].methodsstring[]
brandsobject[]
familiesobject
protocolsobject[]
protocols[].idstring
protocols[].namestring
protocols[].statusstringOne of: supported, coming.
protocols[].portinteger
networksobject[]
networks[].idstring
networks[].namestring
networks[].apnstring
networks[].userstring
networks[].passstring
networks[].unverifiedboolean
countrystring
hoststring
portsobject
osmandUrlstring
platformsstring[]
commandKindsstring[]
200 OK
{
  "models": [
    {
      "id": "concox-gt06n",
      "brand": "Concox",
      "brandId": "string",
      "name": "GT06N",
      "protocol": "gt06",
      "family": "string",
      "kind": "vehicle",
      "password": "string",
      "popular": true,
      "status": "supported",
      "methods": [
        "sms"
      ]
    }
  ],
  "brands": [
    {}
  ],
  "families": {},
  "protocols": [
    {
      "id": "string",
      "name": "string",
      "status": "supported",
      "port": 0
    }
  ],
  "networks": [
    {
      "id": "string",
      "name": "string",
      "apn": "string",
      "user": "string",
      "pass": "string",
      "unverified": true
    }
  ],
  "country": "string",
  "host": "trk.nways.ng",
  "ports": {},
  "osmandUrl": "string",
  "platforms": [
    "string"
  ],
  "commandKinds": [
    "string"
  ]
}

Errors

  • default Error

Add many trackers from a CSV (check it first with dryRun)

POST https://nways.ng/maps/v1/fleet/trackers/import

Columns by header, any order, commas or semicolons: imei, vehicle (one of yours by id, name or plate, or a new one by that name), model (a catalogue id or "Brand Model"; empty: not sure), sim, network, and optionally apn, name, plate, type. At most 1,000 rows. Each row says what's wrong (issues: imei_missing, imei_invalid, imei_check_digit, imei_duplicate, imei_yours, imei_elsewhere, model_unknown, network_unknown, vehicle_missing, mode_unknown); with dryRun false the good rows are added and the rest left out.

Request body

FieldTypeDescription
csvstringRequired.
dryRunboolean
cURL
curl -X POST "https://nways.ng/maps/v1/fleet/trackers/import" \
  -H "X-NWays-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"csv":"imei,vehicle,model,sim,network\n356307042441013,Hiace 2,Concox GT06N,08030000000,MTN\n","dryRun":true}'
JavaScript
const res = await fetch('https://nways.ng/maps/v1/fleet/trackers/import', {
  method: 'POST',
  headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "csv": "imei,vehicle,model,sim,network\n356307042441013,Hiace 2,Concox GT06N,08030000000,MTN\n",
    "dryRun": true
  }),
})
const data = await res.json()
Python
import os
import requests

res = requests.post(
    "https://nways.ng/maps/v1/fleet/trackers/import",
    headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
    json={"csv": "imei,vehicle,model,sim,network\n356307042441013,Hiace 2,Concox GT06N, 08030000000,MTN\n", "dryRun": True},
    timeout=10,
)
data = res.json()

Response

Each row

FieldTypeDescription
rowsobject[]
rows[].rowinteger
rows[].imeistring
rows[].modelstring
rows[].networkstring
rows[].simNumberstring
rows[].vehiclestring
rows[].vehicleIdstring
rows[].newVehicleboolean
rows[].okboolean
rows[].trackerIdstring
rows[].issuesobject[]
rows[].issues[].fieldstring
rows[].issues[].codestring
rows[].issues[].messagestring
totalinteger
okinteger
badinteger
addedinteger
dryRunboolean
200 OK
{
  "rows": [
    {
      "row": 0,
      "imei": "string",
      "model": "string",
      "network": "string",
      "simNumber": "string",
      "vehicle": "string",
      "vehicleId": "string",
      "newVehicle": true,
      "ok": true,
      "trackerId": "string",
      "issues": [
        {
          "field": "string",
          "code": "string",
          "message": "string"
        }
      ]
    }
  ],
  "total": 0,
  "ok": 0,
  "bad": 0,
  "added": 0,
  "dryRun": true
}

Errors

  • default Error

The installers' sheet, every tracker's setup SMS in order (CSV)

GET https://nways.ng/maps/v1/fleet/trackers/setup.csv

Parameters

NameInTypeDescription
idsquerystringTracker ids, comma-separated. Default: the trackers not on the map yet.
langquerystringOne of: en, fr, pt. Default: en.
cURL
curl "https://nways.ng/maps/v1/fleet/trackers/setup.csv" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
const res = await fetch('https://nways.ng/maps/v1/fleet/trackers/setup.csv', {
  headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()
Python
import os
import requests

res = requests.get(
    "https://nways.ng/maps/v1/fleet/trackers/setup.csv",
    headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
    timeout=10,
)
data = res.json()

Response

One line per SMS: IMEI, tracker, vehicle, model, SIM number, step, what to do, SMS, answer.

Errors

  • default Error

Forwarding from your tracking platform, its addresses, and the units it sends

GET https://nways.ng/maps/v1/fleet/trackers/forwarding

cURL
curl "https://nways.ng/maps/v1/fleet/trackers/forwarding" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
const res = await fetch('https://nways.ng/maps/v1/fleet/trackers/forwarding', {
  headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()
Python
import os
import requests

res = requests.get(
    "https://nways.ng/maps/v1/fleet/trackers/forwarding",
    headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
    timeout=10,
)
data = res.json()

Response

Forwarding

FieldTypeDescription
enabledboolean
tokenstring | nullThe key in your addresses: keep it secret.
urlsobject | null
urls.traccarstring
urls.osmandstring
urls.flespistring
urls.webhookstring
urls.bearerstring
wialonobject
wialon.hoststring
wialon.portinteger
wialon.passwordstring
wialon.statusstringOne of: supported, coming.
unitsobject[]
units[].unitIdstring
units[].sourcestringOne of: traccar, osmand, flespi, webhook, wialon.
units[].namestring
units[].firstSeenstring (date-time)
units[].lastSeenstring (date-time)
units[].lastFixAtstring (date-time) | null
units[].positionobject | null
units[].receivedinteger
units[].trackerIdstringSet once it's one of your trackers.
units[].trackerNamestring
units[].elsewherebooleanAnother organisation holds this IMEI.
units[].lastPayloadobjectWhat the platform sent last (units not added yet).
lastAtstring (date-time) | null
lastBySourceobject
unknownintegerUnits not added yet.
units24hinteger
200 OK
{
  "enabled": true,
  "token": "fwd_8KwP2nVd5T…",
  "urls": {
    "traccar": "string",
    "osmand": "string",
    "flespi": "string",
    "webhook": "string",
    "bearer": "string"
  },
  "wialon": {
    "host": "string",
    "port": 0,
    "password": "string",
    "status": "supported"
  },
  "units": [
    {
      "unitId": "string",
      "source": "traccar",
      "name": "string",
      "firstSeen": "2026-10-15T09:00:00+01:00",
      "lastSeen": "2026-10-15T09:00:00+01:00",
      "lastFixAt": "2026-10-15T09:00:00+01:00",
      "position": {},
      "received": 0,
      "trackerId": "string",
      "trackerName": "string",
      "elsewhere": true,
      "lastPayload": {}
    }
  ],
  "lastAt": "2026-10-15T09:00:00+01:00",
  "lastBySource": {},
  "unknown": 0,
  "units24h": 0
}

Errors

  • default Error

Turn forwarding on, or give it a new token (the old one stops at once)

POST https://nways.ng/maps/v1/fleet/trackers/forwarding

cURL
curl -X POST "https://nways.ng/maps/v1/fleet/trackers/forwarding" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
const res = await fetch('https://nways.ng/maps/v1/fleet/trackers/forwarding', {
  method: 'POST',
  headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()
Python
import os
import requests

res = requests.post(
    "https://nways.ng/maps/v1/fleet/trackers/forwarding",
    headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
    timeout=10,
)
data = res.json()

Response

Forwarding

FieldTypeDescription
enabledboolean
tokenstring | nullThe key in your addresses: keep it secret.
urlsobject | null
urls.traccarstring
urls.osmandstring
urls.flespistring
urls.webhookstring
urls.bearerstring
wialonobject
wialon.hoststring
wialon.portinteger
wialon.passwordstring
wialon.statusstringOne of: supported, coming.
unitsobject[]
units[].unitIdstring
units[].sourcestringOne of: traccar, osmand, flespi, webhook, wialon.
units[].namestring
units[].firstSeenstring (date-time)
units[].lastSeenstring (date-time)
units[].lastFixAtstring (date-time) | null
units[].positionobject | null
units[].receivedinteger
units[].trackerIdstringSet once it's one of your trackers.
units[].trackerNamestring
units[].elsewherebooleanAnother organisation holds this IMEI.
units[].lastPayloadobjectWhat the platform sent last (units not added yet).
lastAtstring (date-time) | null
lastBySourceobject
unknownintegerUnits not added yet.
units24hinteger
200 OK
{
  "enabled": true,
  "token": "fwd_8KwP2nVd5T…",
  "urls": {
    "traccar": "string",
    "osmand": "string",
    "flespi": "string",
    "webhook": "string",
    "bearer": "string"
  },
  "wialon": {
    "host": "string",
    "port": 0,
    "password": "string",
    "status": "supported"
  },
  "units": [
    {
      "unitId": "string",
      "source": "traccar",
      "name": "string",
      "firstSeen": "2026-10-15T09:00:00+01:00",
      "lastSeen": "2026-10-15T09:00:00+01:00",
      "lastFixAt": "2026-10-15T09:00:00+01:00",
      "position": {},
      "received": 0,
      "trackerId": "string",
      "trackerName": "string",
      "elsewhere": true,
      "lastPayload": {}
    }
  ],
  "lastAt": "2026-10-15T09:00:00+01:00",
  "lastBySource": {},
  "unknown": 0,
  "units24h": 0
}

Errors

  • default Error

Turn forwarding off (the units stay listed)

DELETE https://nways.ng/maps/v1/fleet/trackers/forwarding

cURL
curl -X DELETE "https://nways.ng/maps/v1/fleet/trackers/forwarding" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
const res = await fetch('https://nways.ng/maps/v1/fleet/trackers/forwarding', {
  method: 'DELETE',
  headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()
Python
import os
import requests

res = requests.delete(
    "https://nways.ng/maps/v1/fleet/trackers/forwarding",
    headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
    timeout=10,
)
data = res.json()

Response

Forwarding

FieldTypeDescription
enabledboolean
tokenstring | nullThe key in your addresses: keep it secret.
urlsobject | null
urls.traccarstring
urls.osmandstring
urls.flespistring
urls.webhookstring
urls.bearerstring
wialonobject
wialon.hoststring
wialon.portinteger
wialon.passwordstring
wialon.statusstringOne of: supported, coming.
unitsobject[]
units[].unitIdstring
units[].sourcestringOne of: traccar, osmand, flespi, webhook, wialon.
units[].namestring
units[].firstSeenstring (date-time)
units[].lastSeenstring (date-time)
units[].lastFixAtstring (date-time) | null
units[].positionobject | null
units[].receivedinteger
units[].trackerIdstringSet once it's one of your trackers.
units[].trackerNamestring
units[].elsewherebooleanAnother organisation holds this IMEI.
units[].lastPayloadobjectWhat the platform sent last (units not added yet).
lastAtstring (date-time) | null
lastBySourceobject
unknownintegerUnits not added yet.
units24hinteger
200 OK
{
  "enabled": true,
  "token": "fwd_8KwP2nVd5T…",
  "urls": {
    "traccar": "string",
    "osmand": "string",
    "flespi": "string",
    "webhook": "string",
    "bearer": "string"
  },
  "wialon": {
    "host": "string",
    "port": 0,
    "password": "string",
    "status": "supported"
  },
  "units": [
    {
      "unitId": "string",
      "source": "traccar",
      "name": "string",
      "firstSeen": "2026-10-15T09:00:00+01:00",
      "lastSeen": "2026-10-15T09:00:00+01:00",
      "lastFixAt": "2026-10-15T09:00:00+01:00",
      "position": {},
      "received": 0,
      "trackerId": "string",
      "trackerName": "string",
      "elsewhere": true,
      "lastPayload": {}
    }
  ],
  "lastAt": "2026-10-15T09:00:00+01:00",
  "lastBySource": {},
  "unknown": 0,
  "units24h": 0
}

Errors

  • default Error

Add a forwarded unit as one of your trackers (a new vehicle named after it, unless you give one)

POST https://nways.ng/maps/v1/fleet/trackers/forwarding/units/{unitId}/add

Parameters

NameInTypeDescription
unitIdpathstringRequired.

Request body

FieldTypeDescription
imeistring15 digits (spaces and dashes are dropped); a phone's device id for model osmand-phone, a platform's unit id for model forwarded.
namestring
vehicleIdstringOne of your vehicles ("" to unlink).
vehicleobjectA new vehicle for it, instead.
vehicle.namestring
vehicle.modestring
vehicle.platestring
modelstringA catalogue model id, or not-sure (learned from its first connection).
simNumberstring
networkstringA catalogue network id, or other.
apnstringDefault: the network's.
cURL
curl -X POST "https://nways.ng/maps/v1/fleet/trackers/forwarding/units/string/add" \
  -H "X-NWays-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"imei":"string","name":"string","vehicleId":"string","vehicle":{"name":"string","mode":"string","plate":"string"},"model":"string","simNumber":"string","network":"string","apn":"string"}'
JavaScript
const res = await fetch('https://nways.ng/maps/v1/fleet/trackers/forwarding/units/string/add', {
  method: 'POST',
  headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "imei": "string",
    "name": "string",
    "vehicleId": "string",
    "vehicle": {
      "name": "string",
      "mode": "string",
      "plate": "string"
    },
    "model": "string",
    "simNumber": "string",
    "network": "string",
    "apn": "string"
  }),
})
const data = await res.json()
Python
import os
import requests

res = requests.post(
    "https://nways.ng/maps/v1/fleet/trackers/forwarding/units/string/add",
    headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
    json={"imei": "string", "name": "string", "vehicleId": "string", "vehicle": {"name": "string", "mode": "string", "plate": "string"}, "model": "string", "simNumber": "string", "network": "string", "apn": "string"},
    timeout=10,
)
data = res.json()

Response

Added

FieldTypeDescription
idstring
imeistring
namestring
vehicleIdstring | null
vehicleNamestring
protocolstringA protocol N-Ways' gateway reads (gt06, teltonika, h02, gps103, tk103, gl200, meitrack, ruptela, jt808, suntech, galileo, startek, topin, xexun, gosafe, tzone, wialon, watch, osmand), forward for a unit forwarded from your tracking platform, or "" until its model or first connection says.
modelstring
simNumberstring
networkstring
apnstring
statestringOne of: awaiting_first_fix, live, silent.
connectedboolean
heardbooleanN-Ways' gateway has heard this device (even before it was added).
lastSeenAtstring (date-time) | null
lastFixAtstring (date-time) | nullIts last GPS fix.
onMapAtstring (date-time) | nullIts last fix that moved its vehicle on the map.
positionobject | null
batteryPctnumber | null
batteryVnumber | null
extVoltageVnumber | null
ignitionboolean | null
satsinteger | null
odometerMnumber | null
claimedAtstring (date-time)
setupobjectThe single tracker's: the SMS steps in order (key, sms, reply, optional), or a phone app's settings (value).
setup.protocolstring
setup.hoststring
setup.portinteger
setup.urlstring
setup.smsTostring
setup.assumedboolean
setup.stepsobject[]
setup.steps[].ninteger
setup.steps[].keystring
setup.steps[].smsstring
setup.steps[].valuestring
setup.steps[].replystring
setup.steps[].optionalboolean
diagnosisstring[]What the gateway saw that needs fixing, most useful first.
virtualVirtualTracker
virtual.runningboolean
virtual.protocolstring
virtual.startedAtstring (date-time)
virtual.untilstring (date-time)
virtual.sentinteger
virtual.answeredinteger
virtual.problemsstring[]
virtual.errorstring
201 OK
{
  "id": "trk_4fQ9xLm2Za",
  "imei": "356307042441013",
  "name": "string",
  "vehicleId": "string",
  "vehicleName": "string",
  "protocol": "gt06",
  "model": "string",
  "simNumber": "string",
  "network": "string",
  "apn": "string",
  "state": "awaiting_first_fix",
  "connected": true,
  "heard": true,
  "lastSeenAt": "2026-10-15T09:00:00+01:00",
  "lastFixAt": "2026-10-15T09:00:00+01:00",
  "onMapAt": "2026-10-15T09:00:00+01:00",
  "position": {
    "lat": 0,
    "lng": 0,
    "at": "2026-10-15T09:00:00+01:00"
  },
  "batteryPct": 0,
  "batteryV": 0,
  "extVoltageV": 0,
  "ignition": true,
  "sats": 0,
  "odometerM": 0,
  "claimedAt": "2026-10-15T09:00:00+01:00",
  "setup": {
    "protocol": "string",
    "host": "string",
    "port": 0,
    "url": "string",
    "smsTo": "string",
    "assumed": true,
    "steps": [
      {
        "n": 0,
        "key": "string",
        "sms": "string",
        "value": "string",
        "reply": "string",
        "optional": true
      }
    ]
  },
  "diagnosis": [
    "no_vehicle"
  ],
  "virtual": {
    "running": true,
    "protocol": "string",
    "startedAt": "2026-10-15T09:00:00+01:00",
    "until": "2026-10-15T09:00:00+01:00",
    "sent": 0,
    "answered": 0,
    "problems": [
      "string"
    ],
    "error": "string"
  }
}

Errors

  • default Error

Forget a forwarded unit (it comes back if your platform sends it again)

DELETE https://nways.ng/maps/v1/fleet/trackers/forwarding/units/{unitId}

Parameters

NameInTypeDescription
unitIdpathstringRequired.
cURL
curl -X DELETE "https://nways.ng/maps/v1/fleet/trackers/forwarding/units/string" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
const res = await fetch('https://nways.ng/maps/v1/fleet/trackers/forwarding/units/string', {
  method: 'DELETE',
  headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()
Python
import os
import requests

res = requests.delete(
    "https://nways.ng/maps/v1/fleet/trackers/forwarding/units/string",
    headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
    timeout=10,
)
data = res.json()

Response

Forgotten

Errors

  • default Error

Your requests to move trackers here, and trackers that moved away

GET https://nways.ng/maps/v1/fleet/tracker-transfers

cURL
curl "https://nways.ng/maps/v1/fleet/tracker-transfers" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
const res = await fetch('https://nways.ng/maps/v1/fleet/tracker-transfers', {
  headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()
Python
import os
import requests

res = requests.get(
    "https://nways.ng/maps/v1/fleet/tracker-transfers",
    headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
    timeout=10,
)
data = res.json()

Response

Transfers

FieldTypeDescription
transfersTrackerTransfer[]
transfers[].idstring
transfers[].imeistring
transfers[].directionstringOne of: in, out.
transfers[].statestringOne of: pending, waiting, moved, expired, cancelled.
transfers[].vehicleIdstring | null
transfers[].restartSmsstringWhat to send the device so it logs in afresh.
transfers[].createdAtstring (date-time)
transfers[].startedAtstring (date-time) | null
transfers[].expiresAtstring (date-time) | null
transfers[].movedAtstring (date-time) | null
transfers[].trackerIdstring
windowSinteger
200 OK
{
  "transfers": [
    {
      "id": "trf_4fQ9xLm2Za",
      "imei": "string",
      "direction": "in",
      "state": "pending",
      "vehicleId": "string",
      "restartSms": "string",
      "createdAt": "2026-10-15T09:00:00+01:00",
      "startedAt": "2026-10-15T09:00:00+01:00",
      "expiresAt": "2026-10-15T09:00:00+01:00",
      "movedAt": "2026-10-15T09:00:00+01:00",
      "trackerId": "string"
    }
  ],
  "windowS": 180
}

Errors

  • default Error

Ask for a tracker another organisation holds (owners and admins)

POST https://nways.ng/maps/v1/fleet/tracker-transfers

Errors: TRACKER_NOT_CLAIMED (nobody holds it: add it), TRACKER_EXISTS (yours already), TRANSFER_NOT_PROVABLE (a phone or forwarded unit: its organisation removes it).

Request body

FieldTypeDescription
imeistringRequired.
vehicleIdstring
cURL
curl -X POST "https://nways.ng/maps/v1/fleet/tracker-transfers" \
  -H "X-NWays-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"imei":"string","vehicleId":"string"}'
JavaScript
const res = await fetch('https://nways.ng/maps/v1/fleet/tracker-transfers', {
  method: 'POST',
  headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "imei": "string",
    "vehicleId": "string"
  }),
})
const data = await res.json()
Python
import os
import requests

res = requests.post(
    "https://nways.ng/maps/v1/fleet/tracker-transfers",
    headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
    json={"imei": "string", "vehicleId": "string"},
    timeout=10,
)
data = res.json()

Response

Asked

FieldTypeDescription
idstring
imeistring
directionstringOne of: in, out.
statestringOne of: pending, waiting, moved, expired, cancelled.
vehicleIdstring | null
restartSmsstringWhat to send the device so it logs in afresh.
createdAtstring (date-time)
startedAtstring (date-time) | null
expiresAtstring (date-time) | null
movedAtstring (date-time) | null
trackerIdstring
201 OK
{
  "id": "trf_4fQ9xLm2Za",
  "imei": "string",
  "direction": "in",
  "state": "pending",
  "vehicleId": "string",
  "restartSms": "string",
  "createdAt": "2026-10-15T09:00:00+01:00",
  "startedAt": "2026-10-15T09:00:00+01:00",
  "expiresAt": "2026-10-15T09:00:00+01:00",
  "movedAt": "2026-10-15T09:00:00+01:00",
  "trackerId": "string"
}

Errors

  • default Error

You're making the device log in afresh now (its restart SMS); a fresh login within 3 minutes moves it

POST https://nways.ng/maps/v1/fleet/tracker-transfers/{transferId}/start

Parameters

NameInTypeDescription
transferIdpathstringRequired.
cURL
curl -X POST "https://nways.ng/maps/v1/fleet/tracker-transfers/trf_4fQ9xLm2Za/start" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
const res = await fetch('https://nways.ng/maps/v1/fleet/tracker-transfers/trf_4fQ9xLm2Za/start', {
  method: 'POST',
  headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()
Python
import os
import requests

res = requests.post(
    "https://nways.ng/maps/v1/fleet/tracker-transfers/trf_4fQ9xLm2Za/start",
    headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
    timeout=10,
)
data = res.json()

Response

Waiting

FieldTypeDescription
idstring
imeistring
directionstringOne of: in, out.
statestringOne of: pending, waiting, moved, expired, cancelled.
vehicleIdstring | null
restartSmsstringWhat to send the device so it logs in afresh.
createdAtstring (date-time)
startedAtstring (date-time) | null
expiresAtstring (date-time) | null
movedAtstring (date-time) | null
trackerIdstring
200 OK
{
  "id": "trf_4fQ9xLm2Za",
  "imei": "string",
  "direction": "in",
  "state": "pending",
  "vehicleId": "string",
  "restartSms": "string",
  "createdAt": "2026-10-15T09:00:00+01:00",
  "startedAt": "2026-10-15T09:00:00+01:00",
  "expiresAt": "2026-10-15T09:00:00+01:00",
  "movedAt": "2026-10-15T09:00:00+01:00",
  "trackerId": "string"
}

Errors

  • default Error

Withdraw a request

DELETE https://nways.ng/maps/v1/fleet/tracker-transfers/{transferId}

Parameters

NameInTypeDescription
transferIdpathstringRequired.
cURL
curl -X DELETE "https://nways.ng/maps/v1/fleet/tracker-transfers/string" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
const res = await fetch('https://nways.ng/maps/v1/fleet/tracker-transfers/string', {
  method: 'DELETE',
  headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()
Python
import os
import requests

res = requests.delete(
    "https://nways.ng/maps/v1/fleet/tracker-transfers/string",
    headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
    timeout=10,
)
data = res.json()

Response

Withdrawn

Errors

  • default Error

Get a tracker, its setup steps and what's wrong

GET https://nways.ng/maps/v1/fleet/trackers/{trackerId}

Parameters

NameInTypeDescription
trackerIdpathstringRequired. Its id, or its IMEI.
cURL
curl "https://nways.ng/maps/v1/fleet/trackers/trk_4fQ9xLm2Za" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
const res = await fetch('https://nways.ng/maps/v1/fleet/trackers/trk_4fQ9xLm2Za', {
  headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()
Python
import os
import requests

res = requests.get(
    "https://nways.ng/maps/v1/fleet/trackers/trk_4fQ9xLm2Za",
    headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
    timeout=10,
)
data = res.json()

Response

Tracker

FieldTypeDescription
idstring
imeistring
namestring
vehicleIdstring | null
vehicleNamestring
protocolstringA protocol N-Ways' gateway reads (gt06, teltonika, h02, gps103, tk103, gl200, meitrack, ruptela, jt808, suntech, galileo, startek, topin, xexun, gosafe, tzone, wialon, watch, osmand), forward for a unit forwarded from your tracking platform, or "" until its model or first connection says.
modelstring
simNumberstring
networkstring
apnstring
statestringOne of: awaiting_first_fix, live, silent.
connectedboolean
heardbooleanN-Ways' gateway has heard this device (even before it was added).
lastSeenAtstring (date-time) | null
lastFixAtstring (date-time) | nullIts last GPS fix.
onMapAtstring (date-time) | nullIts last fix that moved its vehicle on the map.
positionobject | null
batteryPctnumber | null
batteryVnumber | null
extVoltageVnumber | null
ignitionboolean | null
satsinteger | null
odometerMnumber | null
claimedAtstring (date-time)
setupobjectThe single tracker's: the SMS steps in order (key, sms, reply, optional), or a phone app's settings (value).
setup.protocolstring
setup.hoststring
setup.portinteger
setup.urlstring
setup.smsTostring
setup.assumedboolean
setup.stepsobject[]
setup.steps[].ninteger
setup.steps[].keystring
setup.steps[].smsstring
setup.steps[].valuestring
setup.steps[].replystring
setup.steps[].optionalboolean
diagnosisstring[]What the gateway saw that needs fixing, most useful first.
virtualVirtualTracker
virtual.runningboolean
virtual.protocolstring
virtual.startedAtstring (date-time)
virtual.untilstring (date-time)
virtual.sentinteger
virtual.answeredinteger
virtual.problemsstring[]
virtual.errorstring
200 OK
{
  "id": "trk_4fQ9xLm2Za",
  "imei": "356307042441013",
  "name": "string",
  "vehicleId": "string",
  "vehicleName": "string",
  "protocol": "gt06",
  "model": "string",
  "simNumber": "string",
  "network": "string",
  "apn": "string",
  "state": "awaiting_first_fix",
  "connected": true,
  "heard": true,
  "lastSeenAt": "2026-10-15T09:00:00+01:00",
  "lastFixAt": "2026-10-15T09:00:00+01:00",
  "onMapAt": "2026-10-15T09:00:00+01:00",
  "position": {
    "lat": 0,
    "lng": 0,
    "at": "2026-10-15T09:00:00+01:00"
  },
  "batteryPct": 0,
  "batteryV": 0,
  "extVoltageV": 0,
  "ignition": true,
  "sats": 0,
  "odometerM": 0,
  "claimedAt": "2026-10-15T09:00:00+01:00",
  "setup": {
    "protocol": "string",
    "host": "string",
    "port": 0,
    "url": "string",
    "smsTo": "string",
    "assumed": true,
    "steps": [
      {
        "n": 0,
        "key": "string",
        "sms": "string",
        "value": "string",
        "reply": "string",
        "optional": true
      }
    ]
  },
  "diagnosis": [
    "no_vehicle"
  ],
  "virtual": {
    "running": true,
    "protocol": "string",
    "startedAt": "2026-10-15T09:00:00+01:00",
    "until": "2026-10-15T09:00:00+01:00",
    "sent": 0,
    "answered": 0,
    "problems": [
      "string"
    ],
    "error": "string"
  }
}

Errors

  • default Error

Edit a tracker (its vehicle, model, SIM)

PATCH https://nways.ng/maps/v1/fleet/trackers/{trackerId}

Parameters

NameInTypeDescription
trackerIdpathstringRequired. Its id, or its IMEI.

Request body

FieldTypeDescription
imeistring15 digits (spaces and dashes are dropped); a phone's device id for model osmand-phone, a platform's unit id for model forwarded.
namestring
vehicleIdstringOne of your vehicles ("" to unlink).
vehicleobjectA new vehicle for it, instead.
vehicle.namestring
vehicle.modestring
vehicle.platestring
modelstringA catalogue model id, or not-sure (learned from its first connection).
simNumberstring
networkstringA catalogue network id, or other.
apnstringDefault: the network's.
cURL
curl -X PATCH "https://nways.ng/maps/v1/fleet/trackers/trk_4fQ9xLm2Za" \
  -H "X-NWays-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"imei":"string","name":"string","vehicleId":"string","vehicle":{"name":"string","mode":"string","plate":"string"},"model":"string","simNumber":"string","network":"string","apn":"string"}'
JavaScript
const res = await fetch('https://nways.ng/maps/v1/fleet/trackers/trk_4fQ9xLm2Za', {
  method: 'PATCH',
  headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "imei": "string",
    "name": "string",
    "vehicleId": "string",
    "vehicle": {
      "name": "string",
      "mode": "string",
      "plate": "string"
    },
    "model": "string",
    "simNumber": "string",
    "network": "string",
    "apn": "string"
  }),
})
const data = await res.json()
Python
import os
import requests

res = requests.patch(
    "https://nways.ng/maps/v1/fleet/trackers/trk_4fQ9xLm2Za",
    headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
    json={"imei": "string", "name": "string", "vehicleId": "string", "vehicle": {"name": "string", "mode": "string", "plate": "string"}, "model": "string", "simNumber": "string", "network": "string", "apn": "string"},
    timeout=10,
)
data = res.json()

Response

Tracker

FieldTypeDescription
idstring
imeistring
namestring
vehicleIdstring | null
vehicleNamestring
protocolstringA protocol N-Ways' gateway reads (gt06, teltonika, h02, gps103, tk103, gl200, meitrack, ruptela, jt808, suntech, galileo, startek, topin, xexun, gosafe, tzone, wialon, watch, osmand), forward for a unit forwarded from your tracking platform, or "" until its model or first connection says.
modelstring
simNumberstring
networkstring
apnstring
statestringOne of: awaiting_first_fix, live, silent.
connectedboolean
heardbooleanN-Ways' gateway has heard this device (even before it was added).
lastSeenAtstring (date-time) | null
lastFixAtstring (date-time) | nullIts last GPS fix.
onMapAtstring (date-time) | nullIts last fix that moved its vehicle on the map.
positionobject | null
batteryPctnumber | null
batteryVnumber | null
extVoltageVnumber | null
ignitionboolean | null
satsinteger | null
odometerMnumber | null
claimedAtstring (date-time)
setupobjectThe single tracker's: the SMS steps in order (key, sms, reply, optional), or a phone app's settings (value).
setup.protocolstring
setup.hoststring
setup.portinteger
setup.urlstring
setup.smsTostring
setup.assumedboolean
setup.stepsobject[]
setup.steps[].ninteger
setup.steps[].keystring
setup.steps[].smsstring
setup.steps[].valuestring
setup.steps[].replystring
setup.steps[].optionalboolean
diagnosisstring[]What the gateway saw that needs fixing, most useful first.
virtualVirtualTracker
virtual.runningboolean
virtual.protocolstring
virtual.startedAtstring (date-time)
virtual.untilstring (date-time)
virtual.sentinteger
virtual.answeredinteger
virtual.problemsstring[]
virtual.errorstring
200 OK
{
  "id": "trk_4fQ9xLm2Za",
  "imei": "356307042441013",
  "name": "string",
  "vehicleId": "string",
  "vehicleName": "string",
  "protocol": "gt06",
  "model": "string",
  "simNumber": "string",
  "network": "string",
  "apn": "string",
  "state": "awaiting_first_fix",
  "connected": true,
  "heard": true,
  "lastSeenAt": "2026-10-15T09:00:00+01:00",
  "lastFixAt": "2026-10-15T09:00:00+01:00",
  "onMapAt": "2026-10-15T09:00:00+01:00",
  "position": {
    "lat": 0,
    "lng": 0,
    "at": "2026-10-15T09:00:00+01:00"
  },
  "batteryPct": 0,
  "batteryV": 0,
  "extVoltageV": 0,
  "ignition": true,
  "sats": 0,
  "odometerM": 0,
  "claimedAt": "2026-10-15T09:00:00+01:00",
  "setup": {
    "protocol": "string",
    "host": "string",
    "port": 0,
    "url": "string",
    "smsTo": "string",
    "assumed": true,
    "steps": [
      {
        "n": 0,
        "key": "string",
        "sms": "string",
        "value": "string",
        "reply": "string",
        "optional": true
      }
    ]
  },
  "diagnosis": [
    "no_vehicle"
  ],
  "virtual": {
    "running": true,
    "protocol": "string",
    "startedAt": "2026-10-15T09:00:00+01:00",
    "until": "2026-10-15T09:00:00+01:00",
    "sent": 0,
    "answered": 0,
    "problems": [
      "string"
    ],
    "error": "string"
  }
}

Errors

  • default Error

Remove a tracker (it can then be added by anyone)

DELETE https://nways.ng/maps/v1/fleet/trackers/{trackerId}

Parameters

NameInTypeDescription
trackerIdpathstringRequired. Its id, or its IMEI.
cURL
curl -X DELETE "https://nways.ng/maps/v1/fleet/trackers/trk_4fQ9xLm2Za" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
const res = await fetch('https://nways.ng/maps/v1/fleet/trackers/trk_4fQ9xLm2Za', {
  method: 'DELETE',
  headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()
Python
import os
import requests

res = requests.delete(
    "https://nways.ng/maps/v1/fleet/trackers/trk_4fQ9xLm2Za",
    headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
    timeout=10,
)
data = res.json()

Response

Removed

Errors

  • default Error

The device log (connections, raw frames, decoded fields, answers sent, errors), oldest first

GET https://nways.ng/maps/v1/fleet/trackers/{trackerId}/log

The last 500 entries and 7 days are kept. Without after, the last limit entries.

Parameters

NameInTypeDescription
trackerIdpathstringRequired.
afterquerystringAn entry id: only later entries.
limitqueryintegerDefault: 200. ≤ 500.
cURL
curl "https://nways.ng/maps/v1/fleet/trackers/string/log" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
const res = await fetch('https://nways.ng/maps/v1/fleet/trackers/string/log', {
  headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()
Python
import os
import requests

res = requests.get(
    "https://nways.ng/maps/v1/fleet/trackers/string/log",
    headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
    timeout=10,
)
data = res.json()

Response

Entries

FieldTypeDescription
entriesTrackerLogEntry[]
entries[].idstringA cursor: later entries have larger ones.
entries[].atstring (date-time)
entries[].dirstringOne of: in, out, note.
entries[].kindstringlogin, position, heartbeat, alarm, status, handshake, unknown, ack, connect, disconnect, noise, refused
entries[].hexstring
entries[].asciistring
entries[].decodedobject
entries[].errorstring
entries[].remotestring
200 OK
{
  "entries": [
    {
      "id": "string",
      "at": "2026-10-15T09:00:00+01:00",
      "dir": "in",
      "kind": "string",
      "hex": "string",
      "ascii": "string",
      "decoded": {},
      "error": "string",
      "remote": "string"
    }
  ]
}

Errors

  • default Error

The device log and state as they change (server-sent events)

GET https://nways.ng/maps/v1/fleet/trackers/{trackerId}/stream

event: state (the Tracker) and event: log (a TrackerLogEntry), starting with the state and the last 50 entries (or those after ?after=). A comment every 15 s keeps it open.

Parameters

NameInTypeDescription
trackerIdpathstringRequired.
cURL
curl "https://nways.ng/maps/v1/fleet/trackers/string/stream" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
const res = await fetch('https://nways.ng/maps/v1/fleet/trackers/string/stream', {
  headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()
Python
import os
import requests

res = requests.get(
    "https://nways.ng/maps/v1/fleet/trackers/string/stream",
    headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
    timeout=10,
)
data = res.json()

Response

An event stream

Errors

  • default Error

Drive a virtual tracker for this one (its own protocol, through N-Ways' gateway)

POST https://nways.ng/maps/v1/fleet/trackers/{trackerId}/virtual

A short road in your country, a position every 3 s, answers checked byte for byte. Faults to try: noAckWait, badCrc, invalidFix, clockSkewH (8: a tracker on China time), backlog. Errors: VIRTUAL_RUNNING, TRACKER_NO_VEHICLE, TRACKER_CONNECTED (the real one is connected), VIRTUAL_TRACKER_UNAVAILABLE.

Parameters

NameInTypeDescription
trackerIdpathstringRequired.

Request body

FieldTypeDescription
minutesintegerDefault: 3. ≥ 1, ≤ 10.
sosboolean
powerCutboolean
noAckWaitboolean
badCrcboolean
invalidFixboolean
clockSkewHnumber
backloginteger≤ 50.
langstring
cURL
curl -X POST "https://nways.ng/maps/v1/fleet/trackers/string/virtual" \
  -H "X-NWays-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"minutes":3,"sos":true,"powerCut":true,"noAckWait":true,"badCrc":true,"invalidFix":true,"clockSkewH":0,"backlog":0,"lang":"string"}'
JavaScript
const res = await fetch('https://nways.ng/maps/v1/fleet/trackers/string/virtual', {
  method: 'POST',
  headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "minutes": 3,
    "sos": true,
    "powerCut": true,
    "noAckWait": true,
    "badCrc": true,
    "invalidFix": true,
    "clockSkewH": 0,
    "backlog": 0,
    "lang": "string"
  }),
})
const data = await res.json()
Python
import os
import requests

res = requests.post(
    "https://nways.ng/maps/v1/fleet/trackers/string/virtual",
    headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
    json={"minutes": 3, "sos": True, "powerCut": True, "noAckWait": True, "badCrc": True, "invalidFix": True, "clockSkewH": 0, "backlog": 0, "lang": "string"},
    timeout=10,
)
data = res.json()

Response

Started

FieldTypeDescription
runningboolean
protocolstring
startedAtstring (date-time)
untilstring (date-time)
sentinteger
answeredinteger
problemsstring[]
errorstring
202 OK
{
  "running": true,
  "protocol": "string",
  "startedAt": "2026-10-15T09:00:00+01:00",
  "until": "2026-10-15T09:00:00+01:00",
  "sent": 0,
  "answered": 0,
  "problems": [
    "string"
  ],
  "error": "string"
}

Errors

  • default Error

Stop its virtual tracker

DELETE https://nways.ng/maps/v1/fleet/trackers/{trackerId}/virtual

Parameters

NameInTypeDescription
trackerIdpathstringRequired.
cURL
curl -X DELETE "https://nways.ng/maps/v1/fleet/trackers/string/virtual" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
const res = await fetch('https://nways.ng/maps/v1/fleet/trackers/string/virtual', {
  method: 'DELETE',
  headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()
Python
import os
import requests

res = requests.delete(
    "https://nways.ng/maps/v1/fleet/trackers/string/virtual",
    headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
    timeout=10,
)
data = res.json()

Response

Stopped

Errors

  • default Error

Commands sent to a tracker (the last 30), and which it takes

GET https://nways.ng/maps/v1/fleet/trackers/{trackerId}/commands

Parameters

NameInTypeDescription
trackerIdpathstringRequired.
cURL
curl "https://nways.ng/maps/v1/fleet/trackers/string/commands" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
const res = await fetch('https://nways.ng/maps/v1/fleet/trackers/string/commands', {
  headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()
Python
import os
import requests

res = requests.get(
    "https://nways.ng/maps/v1/fleet/trackers/string/commands",
    headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
    timeout=10,
)
data = res.json()

Response

Commands

FieldTypeDescription
commandsTrackerCommand[]
commands[].idstring
commands[].kindstringOne of: locate, restart, interval, heartbeat.
commands[].secondsinteger
commands[].statestringoffline and sms: send the SMS instead. One of: sent, answered, offline, failed, sms.
commands[].textstringThe command over the connection.
commands[].smsstringThe same as an SMS.
commands[].smsTostring
commands[].replystringWhat the device answered.
commands[].errorstring
commands[].createdBystring
commands[].createdAtstring (date-time)
commands[].sentAtstring (date-time) | null
commands[].answeredAtstring (date-time) | null
kindsobjectEach command it takes: over its connection (gprs) or by SMS only.
connectedboolean
200 OK
{
  "commands": [
    {
      "id": "cmd_4fQ9xLm2Za",
      "kind": "locate",
      "seconds": 0,
      "state": "sent",
      "text": "string",
      "sms": "string",
      "smsTo": "string",
      "reply": "string",
      "error": "string",
      "createdBy": "string",
      "createdAt": "2026-10-15T09:00:00+01:00",
      "sentAt": "2026-10-15T09:00:00+01:00",
      "answeredAt": "2026-10-15T09:00:00+01:00"
    }
  ],
  "kinds": {},
  "connected": true
}

Errors

  • default Error

Send a command (owners and admins); its answer comes in the device log

POST https://nways.ng/maps/v1/fleet/trackers/{trackerId}/commands

Connected and its protocol takes it over the connection: sent, then answered. Otherwise: offline or sms, with the SMS to send it (sms, smsTo). Errors: COMMAND_NOT_SUPPORTED, COMMANDS_NOT_SUPPORTED (a phone or forwarded unit).

Parameters

NameInTypeDescription
trackerIdpathstringRequired.

Request body

FieldTypeDescription
kindstringRequired. One of: locate, restart, interval, heartbeat.
secondsintegerinterval: 5–3600; heartbeat: 60–3600 (whole minutes).
cURL
curl -X POST "https://nways.ng/maps/v1/fleet/trackers/string/commands" \
  -H "X-NWays-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kind":"interval","seconds":30}'
JavaScript
const res = await fetch('https://nways.ng/maps/v1/fleet/trackers/string/commands', {
  method: 'POST',
  headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "kind": "interval",
    "seconds": 30
  }),
})
const data = await res.json()
Python
import os
import requests

res = requests.post(
    "https://nways.ng/maps/v1/fleet/trackers/string/commands",
    headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
    json={"kind": "interval", "seconds": 30},
    timeout=10,
)
data = res.json()

Response

Sent (or the SMS to send)

FieldTypeDescription
idstring
kindstringOne of: locate, restart, interval, heartbeat.
secondsinteger
statestringoffline and sms: send the SMS instead. One of: sent, answered, offline, failed, sms.
textstringThe command over the connection.
smsstringThe same as an SMS.
smsTostring
replystringWhat the device answered.
errorstring
createdBystring
createdAtstring (date-time)
sentAtstring (date-time) | null
answeredAtstring (date-time) | null
201 OK
{
  "id": "cmd_4fQ9xLm2Za",
  "kind": "locate",
  "seconds": 0,
  "state": "sent",
  "text": "string",
  "sms": "string",
  "smsTo": "string",
  "reply": "string",
  "error": "string",
  "createdBy": "string",
  "createdAt": "2026-10-15T09:00:00+01:00",
  "sentAt": "2026-10-15T09:00:00+01:00",
  "answeredAt": "2026-10-15T09:00:00+01:00"
}

Errors

  • default Error