Erreurs
Ce que veut dire chaque erreur et que faire. Chaque erreur a un statut HTTP, un code stable sur lequel votre code peut agir et un message pour les personnes.
Sur cette page
À quoi ressemblent les erreurs
Les erreurs répondent avec un code HTTP et une même enveloppe JSON, qu’il s’agisse d’erreurs de clé, de quota ou propres à une API. reason est stable : votre programme peut s’y fier. message s’adresse aux personnes : il dit exactement ce qui s’est passé et comment y remédier, et peut être reformulé. details contient l’ErrorInfo de Google (le motif et, dans metadata, les faits qui l’expliquent et le lien docs) et un lien Help vers l’entrée du motif sur cette page.
{
"error": {
"code": 400,
"status": "INVALID_ARGUMENT",
"reason": "TOO_MANY_INTERMEDIATES",
"message": "A route has up to 25 intermediates.",
"details": [
{ "@type": "type.googleapis.com/google.rpc.ErrorInfo", "reason": "TOO_MANY_INTERMEDIATES", "domain": "nways.ng",
"metadata": { "docs": "https://nways.ng/developers/errors#api-reasons" } },
{ "@type": "type.googleapis.com/google.rpc.Help",
"links": [{ "description": "TOO_MANY_INTERMEDIATES: what it means and how to fix it", "url": "https://nways.ng/developers/errors#api-reasons" }] }
]
}
}Chaque réponse a aussi un en-tête X-Request-Id : joignez-le à toute question adressée à l’assistance. Fiez-vous au code et au motif, jamais aux mots du message.
Les anciennes adresses (/v1/…) renvoient les erreurs propres aux API sous une forme plus ancienne, { "error": "message", "code": "no_route" }, et les erreurs de clé et de plateforme dans l’enveloppe ci-dessus. Les SDK et les bibliothèques clientes lisent les deux.
Codes HTTP
| Code | Signification | Que faire |
|---|---|---|
| 200 | Fait. | |
| 202 | En préparation : un pack hors connexion en cours de création. | Redemandez après Retry-After secondes. |
| 400 | Un paramètre ou un champ manque ou est incorrect. | Corrigez la requête. Ne la renvoyez pas telle quelle. |
| 401 | Pas de clé, une clé que N-Ways n’a jamais émise, ou une clé supprimée ou régénérée. | Le motif et le message disent lequel. Envoyez la clé affichée dans la console. |
| 402 | Les appels gratuits du mois sont épuisés et il ne reste plus de crédit (BILLING_DISABLED). | Ajoutez du crédit dans la console, puis réessayez. |
| 403 | La clé n’a pas le droit de faire cela : son organisation, son projet ou la clé elle-même est coupé, ou l’appel sort de ses restrictions. | Voyez le motif, ci-dessous. |
| 404 | Introuvable : un code postal, un lieu ou une adresse inconnus. | Inutile de réessayer. |
| 422 | Comprise, mais impossible : aucun itinéraire entre les points. | Modifiez la requête, ou prévenez la personne. |
| 429 | Trop de requêtes, ou un quota épuisé. | Attendez le temps indiqué par Retry-After, puis réessayez. |
| 503 | La plateforme est coupée pour l’instant (PLATFORM_DISABLED : votre clé est valable), ou un problème de notre côté. | Attendez le temps indiqué par Retry-After, ou réessayez en espaçant les tentatives. |
| 500, 502 | Un problème de notre côté. | Réessayez en espaçant les tentatives : après 1, 2, 4, 8 secondes, puis abandonnez. |
Erreurs de clé, de plateforme, de quota et de facturation
Quand un appel est refusé, la réponse dit exactement pourquoi et comment y remédier. N-Ways vérifie, dans cet ordre : la plateforme (allumée), la clé (fournie, émise et non révoquée), son organisation et son projet (ni fermés ni suspendus), l’état de la clé (pas en pause), ses restrictions (l’API, puis le site web, l’application ou l’adresse IP), ses limites et quotas, puis le crédit. Le premier point qui échoue donne la réponse.
{
"error": {
"code": 403,
"status": "PERMISSION_DENIED",
"reason": "API_KEY_PAUSED",
"message": "The API key nw_8fK2q… (“Checkout”) is paused, so its calls are refused. Resume it in the console (https://map.nways.ng/console, Keys → the key → Resume); it works again within 30 seconds.",
"details": [
{
"@type": "type.googleapis.com/google.rpc.ErrorInfo",
"reason": "API_KEY_PAUSED",
"domain": "nways.ng",
"metadata": { "docs": "https://nways.ng/developers/errors#api-key-paused", "keyPrefix": "nw_8fK2q" }
},
{
"@type": "type.googleapis.com/google.rpc.Help",
"links": [{ "description": "API_KEY_PAUSED: what it means and how to fix it", "url": "https://nways.ng/developers/errors#api-key-paused" }]
}
]
}
}Les messages sont en anglais. metadata contient toujours docs, et les faits dont votre code peut avoir besoin : ce qui a été vu (seen) et ce qui est autorisé (allowed) pour les restrictions et les API, le plafond atteint (cap) avec sa limit et sa remise à zéro (resetsAt) pour les 429, until et suspendReason pour les suspensions, why et revokedAt pour les clés révoquées, keyValid quand la plateforme est coupée. Chaque refus porte aussi X-Request-Id.
| Code | Motif | Signification et solution |
|---|---|---|
| 503 | PLATFORM_DISABLED | La plateforme N-Ways Maps est coupée pour l’instant, pour tout le monde. Votre clé est valable (keyValid dit si N-Ways la connaît) : les appels refonctionnent dès le retour de la plateforme. Attendez Retry-After secondes et réessayez ; voyez la page d’état. |
| 401 | API_KEY_MISSING | La requête n’a pas de clé. Ajoutez key= ou l’en-tête X-NWays-Api-Key. |
| 401 | API_KEY_INVALID | N-Ways n’a jamais émis cette clé : une faute de frappe, une clé tronquée ou avec des caractères en trop (une clé, c’est nw_ suivi de 32 lettres et chiffres). Copiez la clé entière depuis la console. |
| 401 | API_KEY_REVOKED | La clé a été supprimée, ou c’est l’ancienne valeur d’une clé régénérée dont le délai de grâce est écoulé. Le message dit lequel et quand. Créez une nouvelle clé, ou utilisez la nouvelle valeur de la clé affichée dans la console. |
| 403 | PLATFORM_PREVIEW_ONLY | N-Ways a réservé la plateforme aux organisations qu’elle a invitées, et la vôtre n’en fait pas partie. Votre clé est valable ; pour être invité, écrivez à hello@nways.ng. |
| 403 | ORGANISATION_CLOSED | Votre organisation a été fermée (par son propriétaire ou par N-Ways) : aucune de ses clés ne fonctionne. Créez une nouvelle organisation dans la console, ou écrivez à hello@nways.ng pour la rouvrir. |
| 403 | ORGANISATION_SUSPENDED | N-Ways a suspendu votre organisation : toutes ses clés sont refusées. Le message indique jusqu’à quand (heure de Lagos), s’il y a une fin, et la raison donnée par N-Ways, si elle a choisi de la partager. Les appels refonctionnent d’eux-mêmes à cette heure-là ; sinon, écrivez à hello@nways.ng. |
| 403 | API_ACCESS_OFF | Votre organisation gère ses livraisons sur N-Ways (la console et N-Ways Business) sans l’API : ses clés sont donc désactivées. Pour utiliser aussi l’API, ajoutez-la dans la console, Facturation : vos appels d’API sont alors payés à l’usage, en plus de votre forfait mensuel. |
| 403 | API_TURNED_OFF | N-Ways a coupé les clés API de votre organisation ; votre accès et votre forfait ne changent pas, et la console et N-Ways Business continuent de fonctionner. Le message donne le motif enregistré par N-Ways. Écrivez à hello@nways.ng pour les faire rallumer. |
| 403 | PROJECT_SUSPENDED | N-Ways a suspendu le projet de cette clé ; les autres projets de l’organisation continuent de fonctionner. Le message nomme le projet et donne la raison. Écrivez à hello@nways.ng pour le rétablir. |
| 403 | API_KEY_PAUSED | La clé est en pause dans la console. Reprenez-la (Clés → la clé → Reprendre) : elle refonctionne sous 30 secondes. (Avant le 16 octobre 2026, ce motif s’appelait API_KEY_DISABLED.) |
| 403 | API_KEY_SERVICE_BLOCKED | La clé ne peut pas appeler cette API : le message nomme l’API et ce que la clé, son projet ou votre formule autorisent (service, allowed). Ajoutez l’API à celles de la clé ou du projet dans la console. Si votre formule ne la comprend pas, écrivez-nous pour l’ajouter. |
| 403 | API_KEY_HTTP_REFERRER_BLOCKED | La page web ne figure pas dans les restrictions de site web de la clé, ou la requête n’indiquait aucune page. Le message montre le site vu et ceux autorisés. Ajoutez son adresse, ou, si ce site n’est pas le vôtre, quelqu’un a copié votre clé. |
| 403 | API_KEY_IP_ADDRESS_BLOCKED | L’adresse du serveur ne figure pas dans les restrictions d’IP de la clé. Le message montre l’adresse vue et celles autorisées. Ajoutez votre adresse publique (NAT). |
| 403 | API_KEY_ANDROID_APP_BLOCKED | Le package ou le certificat de l’application Android n’est pas autorisé, ou n’a pas été envoyé. Le message montre ce qui a été vu et ce qui est autorisé. Ajoutez le SHA-1 d’importation et celui de Play. |
| 403 | API_KEY_IOS_APP_BLOCKED | Le bundle ID de l’application iOS n’est pas autorisé, ou n’a pas été envoyé. Le message montre ce qui a été vu et ce qui est autorisé. |
| 429 | RATE_LIMIT_EXCEEDED | Trop de requêtes cette minute : le plafond de la clé pour cette API, ou celui de votre organisation (toutes ses clés ensemble). Le message et cap disent lequel ; il se remet à zéro à la fin de la minute : attendez Retry-After secondes. |
| 429 | QUOTA_EXCEEDED | Un plafond journalier est atteint : celui de la clé pour cette API, ou celui de votre organisation. Le message et cap disent lequel, et quand il se remet à zéro (minuit à Lagos, UTC+1 ; resetsAt, Retry-After). Relevez le plafond de la clé dans la console, ou attendez. |
| 402 | BILLING_DISABLED | Ajoutez du crédit : les appels gratuits du mois pour cette API sont épuisés et il ne reste plus de crédit prépayé. Les autres API continuent de fonctionner dans la limite de leurs appels gratuits. Ajoutez du crédit dans la console (Facturation → Ajouter du crédit) et les appels reprennent aussitôt. |
| 429 | TEMPORARILY_BLOCKED | Trop de requêtes refusées venant d’une même connexion (une clé erronée ou bloquée envoyée encore et encore). Corrigez la clé, puis attendez Retry-After secondes. |
| 503 | BACKEND_ERROR | Les clés n’ont pas pu être vérifiées à ce moment-là (un problème de notre côté). Réessayez en espaçant les tentatives. |
Depuis le 16 octobre 2026, PARTNER_SUSPENDED devient ORGANISATION_SUSPENDED, une organisation désactivée par N-Ways répond ORGANISATION_SUSPENDED et non plus PROJECT_SUSPENDED, et les clés supprimées ou régénérées répondent API_KEY_REVOKED et non plus API_KEY_INVALID.
Les refus et les requêtes préliminaires (preflight) portent toujours les en-têtes CORS de la page appelante, sur /maps/v1 comme sur les anciennes adresses (/v1, /tiles, /fonts), pour que votre code (et la note du SDK Maps sur la carte) puisse lire le motif, même quand la plateforme est coupée.
Dans une page web, une carte refusée affiche la note du SDK Maps : le message de N-Ways, avec « What to do » qui mène au motif sur cette page. La console de développement du navigateur indique la même chose, avec le code HTTP.
Les motifs de chaque API
Chaque opération de la référence de l’API liste ses propres motifs. Ceux que vous rencontrerez le plus souvent :
| Motif | Code | API | Signification |
|---|---|---|---|
QUERY_REQUIRED, QUERY_TOO_LONG | 400 | Géocodage, saisie semi-automatique | q manque ou dépasse 200 caractères. |
POSTCODE_INVALID | 400 | Géocodage, itinéraires | Ce n’est pas un code postal NIPOST. |
POSTCODE_NOT_FOUND_CHECK | 404 | Géocodage | Un code postal bien formé que N-Ways ne sait pas situer : vérifiez-le avec le client. |
GHANAPOST_INVALID, GHANAPOST_UNKNOWN | 400, 404 | Géocodage | Ce n’est pas une adresse GhanaPost GPS ; ou c’en est une que N-Ways ne sait pas situer. |
FIELDS_REQUIRED, FIELDS_INVALID | 400 | Lieux | Les détails d’un lieu demandent fields ; ou un nom de champ est inconnu. |
SESSION_INVALID | 400 | Saisie semi-automatique | Le jeton de session ne fait pas de 8 à 64 lettres, chiffres, - ou _. |
TOO_MANY_INTERMEDIATES | 400 | Itinéraires | Plus de 25 arrêts en chemin. |
NO_ROUTE, NO_ROAD_ROUTE | 422 | Itinéraires | Aucun itinéraire : un point est trop loin d’une route, ou de l’autre côté de l’eau pour une voiture ou un okada. |
OKADA_BANNED_…, MOTORBIKE_BANNED_…, KEKE_BANNED_…, DANFO_BANNED_…, terminés par _ORIGIN, _DESTINATION, _STOP ou _ROUTE | 422 | Itinéraires | La loi interdit ce véhicule sur ce trajet : le départ, l’arrivée, un arrêt intermédiaire ou tous les chemins possibles sont dans une zone d’interdiction. Le message nomme l’interdiction. |
ROUTE_TOO_FAR | 422 | Itinéraires | Les lieux sont trop éloignés pour un seul itinéraire de ce type. |
MATRIX_TOO_LARGE, MATRIX_TOO_FAR | 400 | Matrice d’itinéraires | Plus de 50 départs ou arrivées, ou de 625 paires ; ou des points trop éloignés. |
STOPS_INVALID, VEHICLES_INVALID | 400 | Optimisation de tournées | De 1 à 50 arrêts et de 1 à 5 véhicules. |
ROUTING_UNAVAILABLE | 503 | Itinéraires | Le moteur d’itinéraires est occupé ou redémarre. Réessayez. |
INVALID_JSON | 400 | Toutes | Le corps de la requête n’est pas un JSON valide pour ce point d’accès. Le message dit où. |
BODY_TOO_LARGE | 413 | Toutes | Le corps de la requête dépasse la taille permise pour ce point d’accès. |
NOT_FOUND | 404 | Toutes | Ce point d’accès n’existe pas : vérifiez l’adresse et la méthode. |
INTERNAL | 500 | Toutes | Un problème de notre côté. Réessayez en espaçant les tentatives ; si cela dure, envoyez-nous le X-Request-Id. |
TASK_NOT_FOUND, TASK_ENDED | 404, 409 | Flotte | Cette livraison n’existe pas ; ou elle est terminée. |
DELIVERIES_OFF | 403 | Flotte | N-Ways a coupé les nouvelles livraisons de votre organisation (le message dit pourquoi). Les livraisons en cours continuent. |
CONTRACTORS_OFF | 403 | Flotte | L’envoi de livraisons aux livreurs N-Ways, leur invitation ou leur recrutement est coupé pour votre organisation. Vos propres livreurs peuvent toujours livrer. |
SMART_PRICE_OFF | 403 | Flotte | Les suggestions de paie et Smart Price sont coupés pour votre organisation : envoyez payMax vous-même, sans smartPrice. |
WEBHOOKS_OFF | 403 | Flotte | Les webhooks sont coupés pour votre organisation : rien n’est envoyé, et ajouter ou tester un point d’accès est refusé. Les événements restent disponibles pour l’export. |
ERP_OFF | 403 | Flotte | La synchro ERP (l’export des événements) est coupée pour votre organisation. |
ORGANISATION_SUSPENDED | 403 | Flotte | N-Ways a suspendu votre organisation : les nouvelles livraisons sont refusées comme ses clés. Les livraisons en cours continuent. |
Bien réessayer
- Ne réessayez que les 429 et les 5xx, avec des attentes croissantes et un peu de hasard, pour que de nombreux clients ne réessaient pas tous en même temps.
- Ne renvoyez jamais telle quelle une requête qui a reçu un 4xx autre que 429 : elle échouera de la même façon.
- Fixez un délai d’attente : 10 secondes pour le géocodage et les lieux, 20 pour les itinéraires.
- Mettez en cache ce que vous avez le droit de garder (voyez ce que vous pouvez conserver), pour qu’une courte panne n’arrête pas vos livreurs.