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=×tamp=&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.
Sur cette page
- Lister vos traceurs, avec le nombre par état
- Ajouter un traceur par son IMEI (le premier qui l’ajoute le garde)
- Le catalogue des appareils, les réseaux SIM de votre pays et leurs APN, et où les appareils envoient
- Ajouter plusieurs traceurs depuis un CSV (vérifiez d’abord avec dryRun)
- La fiche des installateurs, les SMS de réglage de chaque traceur dans l’ordre (CSV)
- Le transfert depuis votre plateforme de suivi, ses adresses et les unités qu’elle envoie
- Activer le transfert, ou lui donner un nouveau jeton (l’ancien cesse aussitôt)
- Désactiver le transfert (les unités restent listées)
- Ajouter une unité transférée à vos traceurs (un nouveau véhicule à son nom, sauf si vous en donnez un)
- Oublier une unité transférée (elle revient si votre plateforme l’envoie à nouveau)
- Vos demandes de transfert de traceurs ici, et les traceurs partis ailleurs
- Demander un traceur qu’une autre organisation détient (propriétaires et administrateurs)
- Vous faites reconnecter l’appareil maintenant (son SMS de redémarrage) ; une nouvelle connexion dans les 3 minutes le transfère
- Retirer une demande
- Obtenir un traceur, ses étapes de configuration et ce qui ne va pas
- Modifier un traceur (son véhicule, son modèle, sa SIM)
- Retirer un traceur (n’importe qui peut alors l’ajouter)
- Le journal de l’appareil (connexions, trames brutes, champs décodés, réponses envoyées, erreurs), du plus ancien au plus récent
- Le journal et l’état de l’appareil au fil de l’eau (server-sent events)
- Faire rouler un traceur virtuel pour celui-ci (son propre protocole, via la passerelle de N-Ways)
- Arrêter son traceur virtuel
- Les commandes envoyées à un traceur (les 30 dernières), et celles qu’il accepte
- Envoyer une commande (propriétaires et administrateurs) ; sa réponse arrive dans le journal de l’appareil
Envoyez votre clé avec key=VOTRE_CLE_API dans l’adresse, ou dans l’en-tête X-NWays-Api-Key. Clés d’API
Adresse de base : https://nways.ng/maps/v1/fleet
Lister vos traceurs, avec le nombre par état
GET https://nways.ng/maps/v1/fleet/trackers
Paramètres
| Nom | Où | Type | Description |
|---|---|---|---|
state | requête | string | Au choix: awaiting_first_fix, live, silent. |
model | requête | string | Un identifiant de modèle du catalogue. |
q | requête | string | Trouve un nom, un IMEI, un véhicule ou un numéro de SIM. |
curl "https://nways.ng/maps/v1/fleet/trackers" \
-H "X-NWays-Api-Key: VOTRE_CLE_API"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()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()Réponse
Traceurs
| Champ | Type | Description |
|---|---|---|
trackers | Tracker[] | Obligatoire. |
trackers[].id | string | |
trackers[].imei | string | |
trackers[].name | string | |
trackers[].vehicleId | string | null | |
trackers[].vehicleName | string | |
trackers[].protocol | string | Un protocole que la passerelle de N-Ways lit (gt06, teltonika, h02, gps103, tk103, gl200, meitrack, ruptela, jt808, suntech, galileo, startek, topin, xexun, gosafe, tzone, wialon, watch, osmand), forward pour une unité transférée depuis votre plateforme de suivi, ou "" tant que son modèle ou sa première connexion ne le disent pas. |
trackers[].model | string | |
trackers[].simNumber | string | |
trackers[].network | string | |
trackers[].apn | string | |
trackers[].state | string | Au choix: awaiting_first_fix, live, silent. |
trackers[].connected | boolean | |
trackers[].heard | boolean | La passerelle de N-Ways a entendu cet appareil (même avant son ajout). |
trackers[].lastSeenAt | string (date-time) | null | |
trackers[].lastFixAt | string (date-time) | null | Sa dernière position GPS. |
trackers[].onMapAt | string (date-time) | null | Sa dernière position qui a déplacé son véhicule sur la carte. |
trackers[].position | object | null | |
trackers[].batteryPct | number | null | |
trackers[].batteryV | number | null | |
trackers[].extVoltageV | number | null | |
trackers[].ignition | boolean | null | |
trackers[].sats | integer | null | |
trackers[].odometerM | number | null | |
trackers[].claimedAt | string (date-time) | |
trackers[].setup | object | Pour un seul traceur : les étapes SMS dans l’ordre (key, sms, reply, optional), ou les réglages d’une app de téléphone (value). |
trackers[].setup.protocol | string | |
trackers[].setup.host | string | |
trackers[].setup.port | integer | |
trackers[].setup.url | string | |
trackers[].setup.smsTo | string | |
trackers[].setup.assumed | boolean | |
trackers[].setup.steps | object[] | |
trackers[].setup.steps[].n | integer | |
trackers[].setup.steps[].key | string | |
trackers[].setup.steps[].sms | string | |
trackers[].setup.steps[].value | string | |
trackers[].setup.steps[].reply | string | |
trackers[].setup.steps[].optional | boolean | |
trackers[].diagnosis | string[] | Ce que la passerelle a vu et qu’il faut corriger, le plus utile d’abord. |
trackers[].virtual | VirtualTracker | |
trackers[].virtual.running | boolean | |
trackers[].virtual.protocol | string | |
trackers[].virtual.startedAt | string (date-time) | |
trackers[].virtual.until | string (date-time) | |
trackers[].virtual.sent | integer | |
trackers[].virtual.answered | integer | |
trackers[].virtual.problems | string[] | |
trackers[].virtual.error | string | |
counts | object | Obligatoire. |
models | object |
{
"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": {}
}Erreurs
defaultErreur
Ajouter un traceur par son IMEI (le premier qui l’ajoute le garde)
POST https://nways.ng/maps/v1/fleet/trackers
Erreurs : INVALID_IMEI (pas 15 chiffres, ou chiffre de contrôle Luhn faux), INVALID_DEVICE_ID (l’identifiant d’un téléphone), TRACKER_EXISTS (déjà à vous), TRACKER_CLAIMED_ELSEWHERE (une autre organisation le détient), VEHICLE_NOT_FOUND.
Corps de la requête
| Champ | Type | Description |
|---|---|---|
imei | string | 15 chiffres (espaces et tirets ignorés) ; l’identifiant d’appareil d’un téléphone pour le modèle osmand-phone, l’identifiant d’unité d’une plateforme pour le modèle forwarded. |
name | string | |
vehicleId | string | Un de vos véhicules ("" pour le détacher). |
vehicle | object | Un nouveau véhicule pour lui, à la place. |
vehicle.name | string | |
vehicle.mode | string | |
vehicle.plate | string | |
model | string | Un identifiant de modèle du catalogue, ou not-sure (appris à sa première connexion). |
simNumber | string | |
network | string | Un identifiant de réseau du catalogue, ou other. |
apn | string | Par défaut : celui du réseau. |
curl -X POST "https://nways.ng/maps/v1/fleet/trackers" \
-H "X-NWays-Api-Key: VOTRE_CLE_API" \
-H "Content-Type: application/json" \
-d '{"imei":"356307042441013","vehicleId":"truck-12","model":"concox-gt06n","network":"mtn","simNumber":"+2348030000000"}'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()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()Réponse
Ajouté
| Champ | Type | Description |
|---|---|---|
id | string | |
imei | string | |
name | string | |
vehicleId | string | null | |
vehicleName | string | |
protocol | string | Un protocole que la passerelle de N-Ways lit (gt06, teltonika, h02, gps103, tk103, gl200, meitrack, ruptela, jt808, suntech, galileo, startek, topin, xexun, gosafe, tzone, wialon, watch, osmand), forward pour une unité transférée depuis votre plateforme de suivi, ou "" tant que son modèle ou sa première connexion ne le disent pas. |
model | string | |
simNumber | string | |
network | string | |
apn | string | |
state | string | Au choix: awaiting_first_fix, live, silent. |
connected | boolean | |
heard | boolean | La passerelle de N-Ways a entendu cet appareil (même avant son ajout). |
lastSeenAt | string (date-time) | null | |
lastFixAt | string (date-time) | null | Sa dernière position GPS. |
onMapAt | string (date-time) | null | Sa dernière position qui a déplacé son véhicule sur la carte. |
position | object | null | |
batteryPct | number | null | |
batteryV | number | null | |
extVoltageV | number | null | |
ignition | boolean | null | |
sats | integer | null | |
odometerM | number | null | |
claimedAt | string (date-time) | |
setup | object | Pour un seul traceur : les étapes SMS dans l’ordre (key, sms, reply, optional), ou les réglages d’une app de téléphone (value). |
setup.protocol | string | |
setup.host | string | |
setup.port | integer | |
setup.url | string | |
setup.smsTo | string | |
setup.assumed | boolean | |
setup.steps | object[] | |
setup.steps[].n | integer | |
setup.steps[].key | string | |
setup.steps[].sms | string | |
setup.steps[].value | string | |
setup.steps[].reply | string | |
setup.steps[].optional | boolean | |
diagnosis | string[] | Ce que la passerelle a vu et qu’il faut corriger, le plus utile d’abord. |
virtual | VirtualTracker | |
virtual.running | boolean | |
virtual.protocol | string | |
virtual.startedAt | string (date-time) | |
virtual.until | string (date-time) | |
virtual.sent | integer | |
virtual.answered | integer | |
virtual.problems | string[] | |
virtual.error | string |
{
"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"
}
}Erreurs
defaultErreur
Le catalogue des appareils, les réseaux SIM de votre pays et leurs APN, et où les appareils envoient
GET https://nways.ng/maps/v1/fleet/trackers/catalog
models : chaque modèle (avec son status supported | coming, ses façons de se connecter et sa famille), puis forwarded et not-sure. brands, families, protocols, counts : comme GET https://nways.ng/v1/trackers/catalogue. networks : ceux de votre pays ; unverified : un APN tiré d’une liste publique, pas encore vérifié sur une vraie SIM.
curl "https://nways.ng/maps/v1/fleet/trackers/catalog" \
-H "X-NWays-Api-Key: VOTRE_CLE_API"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()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()Réponse
Catalogue
| Champ | Type | Description |
|---|---|---|
models | TrackerModel[] | |
models[].id | string | |
models[].brand | string | |
models[].brandId | string | |
models[].name | string | |
models[].protocol | string | |
models[].family | string | Son jeu de commandes (SMS de réglage, logiciel, commandes). |
models[].kind | string | Au choix: vehicle, asset, personal, obd, phone. |
models[].password | string | Le mot de passe SMS d’origine. |
models[].popular | boolean | |
models[].status | string | Au choix: supported, coming. |
models[].methods | string[] | |
brands | object[] | |
families | object | |
protocols | object[] | |
protocols[].id | string | |
protocols[].name | string | |
protocols[].status | string | Au choix: supported, coming. |
protocols[].port | integer | |
networks | object[] | |
networks[].id | string | |
networks[].name | string | |
networks[].apn | string | |
networks[].user | string | |
networks[].pass | string | |
networks[].unverified | boolean | |
country | string | |
host | string | |
ports | object | |
osmandUrl | string | |
platforms | string[] | |
commandKinds | string[] |
{
"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"
]
}Erreurs
defaultErreur
Ajouter plusieurs traceurs depuis un CSV (vérifiez d’abord avec dryRun)
POST https://nways.ng/maps/v1/fleet/trackers/import
Colonnes repérées par leur en-tête, dans n’importe quel ordre, virgules ou points-virgules : imei, vehicle (l’un des vôtres par identifiant, nom ou plaque, ou un nouveau de ce nom), model (un identifiant du catalogue ou « Marque Modèle » ; vide : pas sûr), sim, network, et au choix apn, name, plate, type. 1 000 lignes au plus. Chaque ligne dit ce qui ne va pas (issues : imei_missing, imei_invalid, imei_check_digit, imei_duplicate, imei_yours, imei_elsewhere, model_unknown, network_unknown, vehicle_missing, mode_unknown) ; avec dryRun à false, les bonnes lignes sont ajoutées et les autres laissées de côté.
Corps de la requête
| Champ | Type | Description |
|---|---|---|
csv | string | Obligatoire. |
dryRun | boolean |
curl -X POST "https://nways.ng/maps/v1/fleet/trackers/import" \
-H "X-NWays-Api-Key: VOTRE_CLE_API" \
-H "Content-Type: application/json" \
-d '{"csv":"imei,vehicle,model,sim,network\n356307042441013,Hiace 2,Concox GT06N,08030000000,MTN\n","dryRun":true}'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()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()Réponse
Chaque ligne
| Champ | Type | Description |
|---|---|---|
rows | object[] | |
rows[].row | integer | |
rows[].imei | string | |
rows[].model | string | |
rows[].network | string | |
rows[].simNumber | string | |
rows[].vehicle | string | |
rows[].vehicleId | string | |
rows[].newVehicle | boolean | |
rows[].ok | boolean | |
rows[].trackerId | string | |
rows[].issues | object[] | |
rows[].issues[].field | string | |
rows[].issues[].code | string | |
rows[].issues[].message | string | |
total | integer | |
ok | integer | |
bad | integer | |
added | integer | |
dryRun | boolean |
{
"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
}Erreurs
defaultErreur
La fiche des installateurs, les SMS de réglage de chaque traceur dans l’ordre (CSV)
GET https://nways.ng/maps/v1/fleet/trackers/setup.csv
Paramètres
| Nom | Où | Type | Description |
|---|---|---|---|
ids | requête | string | Identifiants de traceurs, séparés par des virgules. Par défaut : les traceurs pas encore sur la carte. |
lang | requête | string | Au choix: en, fr, pt. Par défaut: en. |
curl "https://nways.ng/maps/v1/fleet/trackers/setup.csv" \
-H "X-NWays-Api-Key: VOTRE_CLE_API"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()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()Réponse
Une ligne par SMS : IMEI, traceur, véhicule, modèle, numéro de SIM, étape, à faire, SMS, réponse.
Erreurs
defaultErreur
Le transfert depuis votre plateforme de suivi, ses adresses et les unités qu’elle envoie
GET https://nways.ng/maps/v1/fleet/trackers/forwarding
curl "https://nways.ng/maps/v1/fleet/trackers/forwarding" \
-H "X-NWays-Api-Key: VOTRE_CLE_API"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()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()Réponse
Transfert
| Champ | Type | Description |
|---|---|---|
enabled | boolean | |
token | string | null | La clé de vos adresses : gardez-la secrète. |
urls | object | null | |
urls.traccar | string | |
urls.osmand | string | |
urls.flespi | string | |
urls.webhook | string | |
urls.bearer | string | |
wialon | object | |
wialon.host | string | |
wialon.port | integer | |
wialon.password | string | |
wialon.status | string | Au choix: supported, coming. |
units | object[] | |
units[].unitId | string | |
units[].source | string | Au choix: traccar, osmand, flespi, webhook, wialon. |
units[].name | string | |
units[].firstSeen | string (date-time) | |
units[].lastSeen | string (date-time) | |
units[].lastFixAt | string (date-time) | null | |
units[].position | object | null | |
units[].received | integer | |
units[].trackerId | string | Rempli une fois qu’il est l’un de vos traceurs. |
units[].trackerName | string | |
units[].elsewhere | boolean | Une autre organisation détient cet IMEI. |
units[].lastPayload | object | Ce que la plateforme a envoyé en dernier (unités pas encore ajoutées). |
lastAt | string (date-time) | null | |
lastBySource | object | |
unknown | integer | Unités pas encore ajoutées. |
units24h | integer |
{
"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
}Erreurs
defaultErreur
Activer le transfert, ou lui donner un nouveau jeton (l’ancien cesse aussitôt)
POST https://nways.ng/maps/v1/fleet/trackers/forwarding
curl -X POST "https://nways.ng/maps/v1/fleet/trackers/forwarding" \
-H "X-NWays-Api-Key: VOTRE_CLE_API"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()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()Réponse
Transfert
| Champ | Type | Description |
|---|---|---|
enabled | boolean | |
token | string | null | La clé de vos adresses : gardez-la secrète. |
urls | object | null | |
urls.traccar | string | |
urls.osmand | string | |
urls.flespi | string | |
urls.webhook | string | |
urls.bearer | string | |
wialon | object | |
wialon.host | string | |
wialon.port | integer | |
wialon.password | string | |
wialon.status | string | Au choix: supported, coming. |
units | object[] | |
units[].unitId | string | |
units[].source | string | Au choix: traccar, osmand, flespi, webhook, wialon. |
units[].name | string | |
units[].firstSeen | string (date-time) | |
units[].lastSeen | string (date-time) | |
units[].lastFixAt | string (date-time) | null | |
units[].position | object | null | |
units[].received | integer | |
units[].trackerId | string | Rempli une fois qu’il est l’un de vos traceurs. |
units[].trackerName | string | |
units[].elsewhere | boolean | Une autre organisation détient cet IMEI. |
units[].lastPayload | object | Ce que la plateforme a envoyé en dernier (unités pas encore ajoutées). |
lastAt | string (date-time) | null | |
lastBySource | object | |
unknown | integer | Unités pas encore ajoutées. |
units24h | integer |
{
"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
}Erreurs
defaultErreur
Désactiver le transfert (les unités restent listées)
DELETE https://nways.ng/maps/v1/fleet/trackers/forwarding
curl -X DELETE "https://nways.ng/maps/v1/fleet/trackers/forwarding" \
-H "X-NWays-Api-Key: VOTRE_CLE_API"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()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()Réponse
Transfert
| Champ | Type | Description |
|---|---|---|
enabled | boolean | |
token | string | null | La clé de vos adresses : gardez-la secrète. |
urls | object | null | |
urls.traccar | string | |
urls.osmand | string | |
urls.flespi | string | |
urls.webhook | string | |
urls.bearer | string | |
wialon | object | |
wialon.host | string | |
wialon.port | integer | |
wialon.password | string | |
wialon.status | string | Au choix: supported, coming. |
units | object[] | |
units[].unitId | string | |
units[].source | string | Au choix: traccar, osmand, flespi, webhook, wialon. |
units[].name | string | |
units[].firstSeen | string (date-time) | |
units[].lastSeen | string (date-time) | |
units[].lastFixAt | string (date-time) | null | |
units[].position | object | null | |
units[].received | integer | |
units[].trackerId | string | Rempli une fois qu’il est l’un de vos traceurs. |
units[].trackerName | string | |
units[].elsewhere | boolean | Une autre organisation détient cet IMEI. |
units[].lastPayload | object | Ce que la plateforme a envoyé en dernier (unités pas encore ajoutées). |
lastAt | string (date-time) | null | |
lastBySource | object | |
unknown | integer | Unités pas encore ajoutées. |
units24h | integer |
{
"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
}Erreurs
defaultErreur
Ajouter une unité transférée à vos traceurs (un nouveau véhicule à son nom, sauf si vous en donnez un)
POST https://nways.ng/maps/v1/fleet/trackers/forwarding/units/{unitId}/add
Paramètres
| Nom | Où | Type | Description |
|---|---|---|---|
unitId | chemin | string | Obligatoire. |
Corps de la requête
| Champ | Type | Description |
|---|---|---|
imei | string | 15 chiffres (espaces et tirets ignorés) ; l’identifiant d’appareil d’un téléphone pour le modèle osmand-phone, l’identifiant d’unité d’une plateforme pour le modèle forwarded. |
name | string | |
vehicleId | string | Un de vos véhicules ("" pour le détacher). |
vehicle | object | Un nouveau véhicule pour lui, à la place. |
vehicle.name | string | |
vehicle.mode | string | |
vehicle.plate | string | |
model | string | Un identifiant de modèle du catalogue, ou not-sure (appris à sa première connexion). |
simNumber | string | |
network | string | Un identifiant de réseau du catalogue, ou other. |
apn | string | Par défaut : celui du réseau. |
curl -X POST "https://nways.ng/maps/v1/fleet/trackers/forwarding/units/string/add" \
-H "X-NWays-Api-Key: VOTRE_CLE_API" \
-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"}'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()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()Réponse
Ajouté
| Champ | Type | Description |
|---|---|---|
id | string | |
imei | string | |
name | string | |
vehicleId | string | null | |
vehicleName | string | |
protocol | string | Un protocole que la passerelle de N-Ways lit (gt06, teltonika, h02, gps103, tk103, gl200, meitrack, ruptela, jt808, suntech, galileo, startek, topin, xexun, gosafe, tzone, wialon, watch, osmand), forward pour une unité transférée depuis votre plateforme de suivi, ou "" tant que son modèle ou sa première connexion ne le disent pas. |
model | string | |
simNumber | string | |
network | string | |
apn | string | |
state | string | Au choix: awaiting_first_fix, live, silent. |
connected | boolean | |
heard | boolean | La passerelle de N-Ways a entendu cet appareil (même avant son ajout). |
lastSeenAt | string (date-time) | null | |
lastFixAt | string (date-time) | null | Sa dernière position GPS. |
onMapAt | string (date-time) | null | Sa dernière position qui a déplacé son véhicule sur la carte. |
position | object | null | |
batteryPct | number | null | |
batteryV | number | null | |
extVoltageV | number | null | |
ignition | boolean | null | |
sats | integer | null | |
odometerM | number | null | |
claimedAt | string (date-time) | |
setup | object | Pour un seul traceur : les étapes SMS dans l’ordre (key, sms, reply, optional), ou les réglages d’une app de téléphone (value). |
setup.protocol | string | |
setup.host | string | |
setup.port | integer | |
setup.url | string | |
setup.smsTo | string | |
setup.assumed | boolean | |
setup.steps | object[] | |
setup.steps[].n | integer | |
setup.steps[].key | string | |
setup.steps[].sms | string | |
setup.steps[].value | string | |
setup.steps[].reply | string | |
setup.steps[].optional | boolean | |
diagnosis | string[] | Ce que la passerelle a vu et qu’il faut corriger, le plus utile d’abord. |
virtual | VirtualTracker | |
virtual.running | boolean | |
virtual.protocol | string | |
virtual.startedAt | string (date-time) | |
virtual.until | string (date-time) | |
virtual.sent | integer | |
virtual.answered | integer | |
virtual.problems | string[] | |
virtual.error | string |
{
"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"
}
}Erreurs
defaultErreur
Oublier une unité transférée (elle revient si votre plateforme l’envoie à nouveau)
DELETE https://nways.ng/maps/v1/fleet/trackers/forwarding/units/{unitId}
Paramètres
| Nom | Où | Type | Description |
|---|---|---|---|
unitId | chemin | string | Obligatoire. |
curl -X DELETE "https://nways.ng/maps/v1/fleet/trackers/forwarding/units/string" \
-H "X-NWays-Api-Key: VOTRE_CLE_API"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()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()Réponse
Oublié
Erreurs
defaultErreur
Vos demandes de transfert de traceurs ici, et les traceurs partis ailleurs
GET https://nways.ng/maps/v1/fleet/tracker-transfers
curl "https://nways.ng/maps/v1/fleet/tracker-transfers" \
-H "X-NWays-Api-Key: VOTRE_CLE_API"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()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()Réponse
Transferts
| Champ | Type | Description |
|---|---|---|
transfers | TrackerTransfer[] | |
transfers[].id | string | |
transfers[].imei | string | |
transfers[].direction | string | Au choix: in, out. |
transfers[].state | string | Au choix: pending, waiting, moved, expired, cancelled. |
transfers[].vehicleId | string | null | |
transfers[].restartSms | string | Ce qu’il faut envoyer à l’appareil pour qu’il se reconnecte. |
transfers[].createdAt | string (date-time) | |
transfers[].startedAt | string (date-time) | null | |
transfers[].expiresAt | string (date-time) | null | |
transfers[].movedAt | string (date-time) | null | |
transfers[].trackerId | string | |
windowS | integer |
{
"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
}Erreurs
defaultErreur
Demander un traceur qu’une autre organisation détient (propriétaires et administrateurs)
POST https://nways.ng/maps/v1/fleet/tracker-transfers
Erreurs : TRACKER_NOT_CLAIMED (personne ne le détient : ajoutez-le), TRACKER_EXISTS (déjà à vous), TRANSFER_NOT_PROVABLE (un téléphone ou une unité transférée : son organisation le retire).
Corps de la requête
| Champ | Type | Description |
|---|---|---|
imei | string | Obligatoire. |
vehicleId | string |
curl -X POST "https://nways.ng/maps/v1/fleet/tracker-transfers" \
-H "X-NWays-Api-Key: VOTRE_CLE_API" \
-H "Content-Type: application/json" \
-d '{"imei":"string","vehicleId":"string"}'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()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()Réponse
Demandé
| Champ | Type | Description |
|---|---|---|
id | string | |
imei | string | |
direction | string | Au choix: in, out. |
state | string | Au choix: pending, waiting, moved, expired, cancelled. |
vehicleId | string | null | |
restartSms | string | Ce qu’il faut envoyer à l’appareil pour qu’il se reconnecte. |
createdAt | string (date-time) | |
startedAt | string (date-time) | null | |
expiresAt | string (date-time) | null | |
movedAt | string (date-time) | null | |
trackerId | string |
{
"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"
}Erreurs
defaultErreur
Vous faites reconnecter l’appareil maintenant (son SMS de redémarrage) ; une nouvelle connexion dans les 3 minutes le transfère
POST https://nways.ng/maps/v1/fleet/tracker-transfers/{transferId}/start
Paramètres
| Nom | Où | Type | Description |
|---|---|---|---|
transferId | chemin | string | Obligatoire. |
curl -X POST "https://nways.ng/maps/v1/fleet/tracker-transfers/trf_4fQ9xLm2Za/start" \
-H "X-NWays-Api-Key: VOTRE_CLE_API"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()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()Réponse
En attente
| Champ | Type | Description |
|---|---|---|
id | string | |
imei | string | |
direction | string | Au choix: in, out. |
state | string | Au choix: pending, waiting, moved, expired, cancelled. |
vehicleId | string | null | |
restartSms | string | Ce qu’il faut envoyer à l’appareil pour qu’il se reconnecte. |
createdAt | string (date-time) | |
startedAt | string (date-time) | null | |
expiresAt | string (date-time) | null | |
movedAt | string (date-time) | null | |
trackerId | string |
{
"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"
}Erreurs
defaultErreur
Retirer une demande
DELETE https://nways.ng/maps/v1/fleet/tracker-transfers/{transferId}
Paramètres
| Nom | Où | Type | Description |
|---|---|---|---|
transferId | chemin | string | Obligatoire. |
curl -X DELETE "https://nways.ng/maps/v1/fleet/tracker-transfers/string" \
-H "X-NWays-Api-Key: VOTRE_CLE_API"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()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()Réponse
Retirée
Erreurs
defaultErreur
Obtenir un traceur, ses étapes de configuration et ce qui ne va pas
GET https://nways.ng/maps/v1/fleet/trackers/{trackerId}
Paramètres
| Nom | Où | Type | Description |
|---|---|---|---|
trackerId | chemin | string | Obligatoire. Son identifiant, ou son IMEI. |
curl "https://nways.ng/maps/v1/fleet/trackers/trk_4fQ9xLm2Za" \
-H "X-NWays-Api-Key: VOTRE_CLE_API"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()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()Réponse
Traceur
| Champ | Type | Description |
|---|---|---|
id | string | |
imei | string | |
name | string | |
vehicleId | string | null | |
vehicleName | string | |
protocol | string | Un protocole que la passerelle de N-Ways lit (gt06, teltonika, h02, gps103, tk103, gl200, meitrack, ruptela, jt808, suntech, galileo, startek, topin, xexun, gosafe, tzone, wialon, watch, osmand), forward pour une unité transférée depuis votre plateforme de suivi, ou "" tant que son modèle ou sa première connexion ne le disent pas. |
model | string | |
simNumber | string | |
network | string | |
apn | string | |
state | string | Au choix: awaiting_first_fix, live, silent. |
connected | boolean | |
heard | boolean | La passerelle de N-Ways a entendu cet appareil (même avant son ajout). |
lastSeenAt | string (date-time) | null | |
lastFixAt | string (date-time) | null | Sa dernière position GPS. |
onMapAt | string (date-time) | null | Sa dernière position qui a déplacé son véhicule sur la carte. |
position | object | null | |
batteryPct | number | null | |
batteryV | number | null | |
extVoltageV | number | null | |
ignition | boolean | null | |
sats | integer | null | |
odometerM | number | null | |
claimedAt | string (date-time) | |
setup | object | Pour un seul traceur : les étapes SMS dans l’ordre (key, sms, reply, optional), ou les réglages d’une app de téléphone (value). |
setup.protocol | string | |
setup.host | string | |
setup.port | integer | |
setup.url | string | |
setup.smsTo | string | |
setup.assumed | boolean | |
setup.steps | object[] | |
setup.steps[].n | integer | |
setup.steps[].key | string | |
setup.steps[].sms | string | |
setup.steps[].value | string | |
setup.steps[].reply | string | |
setup.steps[].optional | boolean | |
diagnosis | string[] | Ce que la passerelle a vu et qu’il faut corriger, le plus utile d’abord. |
virtual | VirtualTracker | |
virtual.running | boolean | |
virtual.protocol | string | |
virtual.startedAt | string (date-time) | |
virtual.until | string (date-time) | |
virtual.sent | integer | |
virtual.answered | integer | |
virtual.problems | string[] | |
virtual.error | string |
{
"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"
}
}Erreurs
defaultErreur
Modifier un traceur (son véhicule, son modèle, sa SIM)
PATCH https://nways.ng/maps/v1/fleet/trackers/{trackerId}
Paramètres
| Nom | Où | Type | Description |
|---|---|---|---|
trackerId | chemin | string | Obligatoire. Son identifiant, ou son IMEI. |
Corps de la requête
| Champ | Type | Description |
|---|---|---|
imei | string | 15 chiffres (espaces et tirets ignorés) ; l’identifiant d’appareil d’un téléphone pour le modèle osmand-phone, l’identifiant d’unité d’une plateforme pour le modèle forwarded. |
name | string | |
vehicleId | string | Un de vos véhicules ("" pour le détacher). |
vehicle | object | Un nouveau véhicule pour lui, à la place. |
vehicle.name | string | |
vehicle.mode | string | |
vehicle.plate | string | |
model | string | Un identifiant de modèle du catalogue, ou not-sure (appris à sa première connexion). |
simNumber | string | |
network | string | Un identifiant de réseau du catalogue, ou other. |
apn | string | Par défaut : celui du réseau. |
curl -X PATCH "https://nways.ng/maps/v1/fleet/trackers/trk_4fQ9xLm2Za" \
-H "X-NWays-Api-Key: VOTRE_CLE_API" \
-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"}'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()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()Réponse
Traceur
| Champ | Type | Description |
|---|---|---|
id | string | |
imei | string | |
name | string | |
vehicleId | string | null | |
vehicleName | string | |
protocol | string | Un protocole que la passerelle de N-Ways lit (gt06, teltonika, h02, gps103, tk103, gl200, meitrack, ruptela, jt808, suntech, galileo, startek, topin, xexun, gosafe, tzone, wialon, watch, osmand), forward pour une unité transférée depuis votre plateforme de suivi, ou "" tant que son modèle ou sa première connexion ne le disent pas. |
model | string | |
simNumber | string | |
network | string | |
apn | string | |
state | string | Au choix: awaiting_first_fix, live, silent. |
connected | boolean | |
heard | boolean | La passerelle de N-Ways a entendu cet appareil (même avant son ajout). |
lastSeenAt | string (date-time) | null | |
lastFixAt | string (date-time) | null | Sa dernière position GPS. |
onMapAt | string (date-time) | null | Sa dernière position qui a déplacé son véhicule sur la carte. |
position | object | null | |
batteryPct | number | null | |
batteryV | number | null | |
extVoltageV | number | null | |
ignition | boolean | null | |
sats | integer | null | |
odometerM | number | null | |
claimedAt | string (date-time) | |
setup | object | Pour un seul traceur : les étapes SMS dans l’ordre (key, sms, reply, optional), ou les réglages d’une app de téléphone (value). |
setup.protocol | string | |
setup.host | string | |
setup.port | integer | |
setup.url | string | |
setup.smsTo | string | |
setup.assumed | boolean | |
setup.steps | object[] | |
setup.steps[].n | integer | |
setup.steps[].key | string | |
setup.steps[].sms | string | |
setup.steps[].value | string | |
setup.steps[].reply | string | |
setup.steps[].optional | boolean | |
diagnosis | string[] | Ce que la passerelle a vu et qu’il faut corriger, le plus utile d’abord. |
virtual | VirtualTracker | |
virtual.running | boolean | |
virtual.protocol | string | |
virtual.startedAt | string (date-time) | |
virtual.until | string (date-time) | |
virtual.sent | integer | |
virtual.answered | integer | |
virtual.problems | string[] | |
virtual.error | string |
{
"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"
}
}Erreurs
defaultErreur
Retirer un traceur (n’importe qui peut alors l’ajouter)
DELETE https://nways.ng/maps/v1/fleet/trackers/{trackerId}
Paramètres
| Nom | Où | Type | Description |
|---|---|---|---|
trackerId | chemin | string | Obligatoire. Son identifiant, ou son IMEI. |
curl -X DELETE "https://nways.ng/maps/v1/fleet/trackers/trk_4fQ9xLm2Za" \
-H "X-NWays-Api-Key: VOTRE_CLE_API"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()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()Réponse
Retiré
Erreurs
defaultErreur
Le journal de l’appareil (connexions, trames brutes, champs décodés, réponses envoyées, erreurs), du plus ancien au plus récent
GET https://nways.ng/maps/v1/fleet/trackers/{trackerId}/log
Les 500 dernières entrées et 7 jours sont gardés. Sans after, les limit dernières entrées.
Paramètres
| Nom | Où | Type | Description |
|---|---|---|---|
trackerId | chemin | string | Obligatoire. |
after | requête | string | Un identifiant d’entrée : seulement les entrées suivantes. |
limit | requête | integer | Par défaut: 200. ≤ 500. |
curl "https://nways.ng/maps/v1/fleet/trackers/string/log" \
-H "X-NWays-Api-Key: VOTRE_CLE_API"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()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()Réponse
Entrées
| Champ | Type | Description |
|---|---|---|
entries | TrackerLogEntry[] | |
entries[].id | string | Un curseur : les entrées suivantes en ont de plus grands. |
entries[].at | string (date-time) | |
entries[].dir | string | Au choix: in, out, note. |
entries[].kind | string | login, position, heartbeat, alarm, status, handshake, unknown, ack, connect, disconnect, noise, refused |
entries[].hex | string | |
entries[].ascii | string | |
entries[].decoded | object | |
entries[].error | string | |
entries[].remote | string |
{
"entries": [
{
"id": "string",
"at": "2026-10-15T09:00:00+01:00",
"dir": "in",
"kind": "string",
"hex": "string",
"ascii": "string",
"decoded": {},
"error": "string",
"remote": "string"
}
]
}Erreurs
defaultErreur
Le journal et l’état de l’appareil au fil de l’eau (server-sent events)
GET https://nways.ng/maps/v1/fleet/trackers/{trackerId}/stream
event: state (le Tracker) et event: log (une TrackerLogEntry), en commençant par l’état et les 50 dernières entrées (ou celles après ?after=). Un commentaire toutes les 15 s le garde ouvert.
Paramètres
| Nom | Où | Type | Description |
|---|---|---|---|
trackerId | chemin | string | Obligatoire. |
curl "https://nways.ng/maps/v1/fleet/trackers/string/stream" \
-H "X-NWays-Api-Key: VOTRE_CLE_API"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()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()Réponse
Un flux d’événements
Erreurs
defaultErreur
Faire rouler un traceur virtuel pour celui-ci (son propre protocole, via la passerelle de N-Ways)
POST https://nways.ng/maps/v1/fleet/trackers/{trackerId}/virtual
Un court trajet dans votre pays, une position toutes les 3 s, les réponses vérifiées octet par octet. Pannes à essayer : noAckWait, badCrc, invalidFix, clockSkewH (8 : un traceur à l’heure de Chine), backlog. Erreurs : VIRTUAL_RUNNING, TRACKER_NO_VEHICLE, TRACKER_CONNECTED (le vrai est connecté), VIRTUAL_TRACKER_UNAVAILABLE.
Paramètres
| Nom | Où | Type | Description |
|---|---|---|---|
trackerId | chemin | string | Obligatoire. |
Corps de la requête
| Champ | Type | Description |
|---|---|---|
minutes | integer | Par défaut: 3. ≥ 1, ≤ 10. |
sos | boolean | |
powerCut | boolean | |
noAckWait | boolean | |
badCrc | boolean | |
invalidFix | boolean | |
clockSkewH | number | |
backlog | integer | ≤ 50. |
lang | string |
curl -X POST "https://nways.ng/maps/v1/fleet/trackers/string/virtual" \
-H "X-NWays-Api-Key: VOTRE_CLE_API" \
-H "Content-Type: application/json" \
-d '{"minutes":3,"sos":true,"powerCut":true,"noAckWait":true,"badCrc":true,"invalidFix":true,"clockSkewH":0,"backlog":0,"lang":"string"}'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()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()Réponse
Démarré
| Champ | Type | Description |
|---|---|---|
running | boolean | |
protocol | string | |
startedAt | string (date-time) | |
until | string (date-time) | |
sent | integer | |
answered | integer | |
problems | string[] | |
error | string |
{
"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"
}Erreurs
defaultErreur
Arrêter son traceur virtuel
DELETE https://nways.ng/maps/v1/fleet/trackers/{trackerId}/virtual
Paramètres
| Nom | Où | Type | Description |
|---|---|---|---|
trackerId | chemin | string | Obligatoire. |
curl -X DELETE "https://nways.ng/maps/v1/fleet/trackers/string/virtual" \
-H "X-NWays-Api-Key: VOTRE_CLE_API"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()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()Réponse
Arrêté
Erreurs
defaultErreur
Les commandes envoyées à un traceur (les 30 dernières), et celles qu’il accepte
GET https://nways.ng/maps/v1/fleet/trackers/{trackerId}/commands
Paramètres
| Nom | Où | Type | Description |
|---|---|---|---|
trackerId | chemin | string | Obligatoire. |
curl "https://nways.ng/maps/v1/fleet/trackers/string/commands" \
-H "X-NWays-Api-Key: VOTRE_CLE_API"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()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()Réponse
Commandes
| Champ | Type | Description |
|---|---|---|
commands | TrackerCommand[] | |
commands[].id | string | |
commands[].kind | string | Au choix: locate, restart, interval, heartbeat. |
commands[].seconds | integer | |
commands[].state | string | offline et sms : envoyez plutôt le SMS. Au choix: sent, answered, offline, failed, sms. |
commands[].text | string | La commande par la connexion. |
commands[].sms | string | La même sous forme de SMS. |
commands[].smsTo | string | |
commands[].reply | string | Ce que l’appareil a répondu. |
commands[].error | string | |
commands[].createdBy | string | |
commands[].createdAt | string (date-time) | |
commands[].sentAt | string (date-time) | null | |
commands[].answeredAt | string (date-time) | null | |
kinds | object | Chaque commande qu’il accepte : par sa connexion (gprs) ou par SMS seulement. |
connected | boolean |
{
"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
}Erreurs
defaultErreur
Envoyer une commande (propriétaires et administrateurs) ; sa réponse arrive dans le journal de l’appareil
POST https://nways.ng/maps/v1/fleet/trackers/{trackerId}/commands
Connecté et son protocole l’accepte par la connexion : envoyée, puis répondue. Sinon : offline ou sms, avec le SMS à lui envoyer (sms, smsTo). Erreurs : COMMAND_NOT_SUPPORTED, COMMANDS_NOT_SUPPORTED (un téléphone ou une unité transférée).
Paramètres
| Nom | Où | Type | Description |
|---|---|---|---|
trackerId | chemin | string | Obligatoire. |
Corps de la requête
| Champ | Type | Description |
|---|---|---|
kind | string | Obligatoire. Au choix: locate, restart, interval, heartbeat. |
seconds | integer | interval : 5 à 3600 ; heartbeat : 60 à 3600 (en minutes entières). |
curl -X POST "https://nways.ng/maps/v1/fleet/trackers/string/commands" \
-H "X-NWays-Api-Key: VOTRE_CLE_API" \
-H "Content-Type: application/json" \
-d '{"kind":"interval","seconds":30}'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()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()Réponse
Envoyée (ou le SMS à envoyer)
| Champ | Type | Description |
|---|---|---|
id | string | |
kind | string | Au choix: locate, restart, interval, heartbeat. |
seconds | integer | |
state | string | offline et sms : envoyez plutôt le SMS. Au choix: sent, answered, offline, failed, sms. |
text | string | La commande par la connexion. |
sms | string | La même sous forme de SMS. |
smsTo | string | |
reply | string | Ce que l’appareil a répondu. |
error | string | |
createdBy | string | |
createdAt | string (date-time) | |
sentAt | string (date-time) | null | |
answeredAt | string (date-time) | null |
{
"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"
}Erreurs
defaultErreur