N-Ways
Documentation développeursItinéraires

Itinéraires

Des itinéraires pour chaque façon de se déplacer, la matrice d’itinéraires et l’optimisation de tournées.

Sur cette page
Remarque :

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

Un itinéraire, avec jusqu’à 25 arrêts intermédiaires

POST https://nways.ng/maps/v1/routes/compute

Voiture, fourgonnette, okada (moto-taxi ; respecte les interdictions d’okada et fait marcher au-delà de la limite d’une zone interdite), moto (la vôtre) et dispatch (motos de coursiers : exemptées des interdictions d’okada à passagers), keke et danfo (respectent leurs interdictions), marche, vélo, bateau (bateaux de passagers et embarcadères) et train. Pour un code postal, l’itinéraire mène à la meilleure entrée du bâtiment ; là où la route s’arrête avant la porte, l’itinéraire indique où s’arrêter et comment finir (lastMile) ; péages dans leurs devises, passages de frontière, résidences fermées, interdictions évitées avec leurs sources. fields= choisit les champs de chaque itinéraire. Motifs : MODE_INVALID, LANG_INVALID, ROUTING_PREFERENCE_INVALID, TOO_MANY_INTERMEDIATES, INTERMEDIATES_NOT_SUPPORTED, AVOID_INVALID, TOLL_VEHICLE_INVALID, LAST_MILE_INVALID, ACCESS_INVALID, WAYPOINT_INVALID, POSTCODE_INVALID, POSTCODE_NOT_FOUND, GHANAPOST_INVALID, GHANAPOST_NOT_FOUND, PLUSCODE_INVALID, NO_ROUTE, NO_ROAD_ROUTE, ROUTE_TOO_FAR, ROUTING_UNAVAILABLE, OKADA_BANNED_ORIGIN, OKADA_BANNED_DESTINATION, OKADA_BANNED_ROUTE, KEKE_BANNED_*, DANFO_BANNED_*, MOTORBIKE_BANNED_*, ROUTING_UNAVAILABLE (503).

Paramètres

NomOùTypeDescription
fieldsrequêtestringListe séparée par des virgules des champs à garder dans chaque résultat (a.b descend dans les objets ; id est toujours gardé ; * = tous).

Corps de la requête

ChampTypeDescription
originWaypointObligatoire. Exactement un élément parmi lat et lng, postcode (NIPOST : l’itinéraire mène à sa meilleure entrée), ghanaPost ou plusCode (complet, ou court suivi d’une ville).
origin.latnumber
origin.lngnumber
origin.postcodestring
origin.ghanaPoststring
origin.plusCodestring
origin.headingnumberOrigine seulement : sens de déplacement (en degrés), pour qu’un véhicule en mouvement ne commence pas par un demi-tour.
destinationWaypointObligatoire. Exactement un élément parmi lat et lng, postcode (NIPOST : l’itinéraire mène à sa meilleure entrée), ghanaPost ou plusCode (complet, ou court suivi d’une ville).
destination.latnumber
destination.lngnumber
destination.postcodestring
destination.ghanaPoststring
destination.plusCodestring
destination.headingnumberOrigine seulement : sens de déplacement (en degrés), pour qu’un véhicule en mouvement ne commence pas par un demi-tour.
intermediatesWaypoint[]Au plus 25 éléments.
intermediates[].latnumber
intermediates[].lngnumber
intermediates[].postcodestring
intermediates[].ghanaPoststring
intermediates[].plusCodestring
intermediates[].headingnumberOrigine seulement : sens de déplacement (en degrés), pour qu’un véhicule en mouvement ne commence pas par un demi-tour.
modestringAu choix: drive, van, okada, motorbike, dispatch, keke, danfo, walk, bicycle, boat, train. Par défaut: drive.
alternativesbooleanJusqu’à 2 itinéraires de plus (sans arrêts intermédiaires). Par défaut: false.
routingPreferencestringAu choix: traffic_unaware, traffic_aware. Par défaut: traffic_unaware.
departAtstring (date-time)
avoidstring[]
langstringAu choix: en, fr, pt.
tollVehiclestringClasse de tarif de péage (van : bus). Au choix: car, suv, bus, truck.
accessstringTrajets en train et en bateau : vers et depuis les gares et les embarcadères. Au choix: walk, okada, drive.
lastMilestringAu choix: walk, okada.
allowBansstring[]Ids d’interdictions non confirmées (tirés de unconfirmedBans) à traverser quand même.
faresbooleanAjouter des estimations de tarif à chaque itinéraire (SKU avancé). Par défaut: false.
cURL
curl -X POST "https://nways.ng/maps/v1/routes/compute" \
  -H "X-NWays-Api-Key: VOTRE_CLE_API" \
  -H "Content-Type: application/json" \
  -d '{"origin":{"lat":6.4474,"lng":3.472},"destination":{"postcode":"LA08A09DB10"},"mode":"drive","routingPreference":"traffic_aware"}'
JavaScript
const res = await fetch('https://nways.ng/maps/v1/routes/compute', {
  method: 'POST',
  headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "origin": {
      "lat": 6.4474,
      "lng": 3.472
    },
    "destination": {
      "postcode": "LA08A09DB10"
    },
    "mode": "drive",
    "routingPreference": "traffic_aware"
  }),
})
const data = await res.json()
Python
import os
import requests

res = requests.post(
    "https://nways.ng/maps/v1/routes/compute",
    headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
    json={"origin": {"lat": 6.4474, "lng": 3.472}, "destination": {"postcode": "LA08A09DB10"}, "mode": "drive", "routingPreference": "traffic_aware"},
    timeout=10,
)
data = res.json()

Réponse

Itinéraires

ChampTypeDescription
routesRoute[]Obligatoire.
routes[].distanceMnumberObligatoire.
routes[].durationSnumberObligatoire.
routes[].staticDurationSnumberObligatoire. Sans le trafic en direct
routes[].trafficDelaySnumberObligatoire. Ce que le trafic et les incidents ajoutent en ce moment (traffic_aware).
routes[].speedSourcestringAu choix: live, typical, estimated.
routes[].summarystring
routes[].geometryLineStringObligatoire.
routes[].geometry.typestringObligatoire.
routes[].geometry.coordinatesnumber[][]Obligatoire.
routes[].legsLeg[]Obligatoire. Un par tronçon entre deux arrêts.
routes[].legs[].distanceMnumberObligatoire.
routes[].legs[].durationSnumberObligatoire.
routes[].stepsStep[]Obligatoire.
routes[].steps[].maneuverstringObligatoire. depart, arrive, continue, left, right, slight_left, sharp_right, uturn_left, roundabout_enter, ferry_enter, … (autre)
routes[].steps[].instructionstringObligatoire.
routes[].steps[].distanceMnumberObligatoire.
routes[].steps[].durationSnumberObligatoire.
routes[].steps[].streetNamesstring[]
routes[].steps[].startIndexintegerObligatoire. Index dans geometry.coordinates
routes[].steps[].endIndexintegerObligatoire.
routes[].steps[].roundaboutExitinteger
routes[].steps[].towardstring[]
routes[].steps[].atTrafficLightboolean
routes[].steps[].crossingstringÀ pied : footbridge, underpass, zebra, signals, crossing, junction
routes[].segmentsobject[]Trajets qui changent de mode de déplacement (train, bateau, okada avec une marche au-delà d’une interdiction).
routes[].segments[].modestringObligatoire. Au choix: walk, okada, drive, train, boat.
routes[].segments[].linestring
routes[].segments[].fromstringObligatoire.
routes[].segments[].tostringObligatoire.
routes[].segments[].distanceMnumberObligatoire.
routes[].segments[].durationSnumberObligatoire.
routes[].segments[].waitSnumber
routes[].segments[].stopsinteger
routes[].segments[].scheduledboolean
routes[].segments[].estimatedboolean
routes[].segments[].farestring
routes[].segments[].notestring
routes[].segments[].geometryLineStringObligatoire.
routes[].segments[].geometry.typestringObligatoire.
routes[].segments[].geometry.coordinatesnumber[][]Obligatoire.
routes[].congestionobject[]
routes[].congestion[].startIndexinteger
routes[].congestion[].endIndexinteger
routes[].congestion[].levelstring
routes[].tollsobject
routes[].tolls.gatesobject[]
routes[].tolls.gates[].namestring
routes[].tolls.gates[].locationPoint
routes[].tolls.gates[].atMinteger
routes[].tolls.gates[].priceinteger | null
routes[].tolls.gates[].currencystring
routes[].tolls.gates[].paymentstring
routes[].tolls.totalobject
routes[].tolls.unknownPricesinteger
routes[].borderCrossingsobject[]
routes[].borderCrossings[].fromstring
routes[].borderCrossings[].tostring
routes[].borderCrossings[].locationPoint
routes[].borderCrossings[].location.typestringObligatoire.
routes[].borderCrossings[].location.coordinatesnumber[]Obligatoire. [lng, lat] Au moins 2 éléments, au plus 2 éléments.
routes[].borderCrossings[].atMinteger
routes[].borderCrossings[].poststring
routes[].borderCrossings[].clockChangeHnumber
routes[].vehicleRulesobjectTrajets en okada, keke et danfo
routes[].vehicleRules.vehiclestringAu choix: okada, motorbike, keke, danfo.
routes[].vehicleRules.avoidedBan[]
routes[].vehicleRules.avoided[].idstringObligatoire.
routes[].vehicleRules.avoided[].zonestringObligatoire.
routes[].vehicleRules.avoided[].scopestringObligatoire.
routes[].vehicleRules.avoided[].hoursstring
routes[].vehicleRules.avoided[].sincestring
routes[].vehicleRules.avoided[].sourcestring (uri)
routes[].vehicleRules.avoided[].wherestringAu choix: origin, destination, stop, route.
routes[].vehicleRules.avoided[].walkMnumber
routes[].vehicleRules.adviceBan[]
routes[].vehicleRules.advice[].idstringObligatoire.
routes[].vehicleRules.advice[].zonestringObligatoire.
routes[].vehicleRules.advice[].scopestringObligatoire.
routes[].vehicleRules.advice[].hoursstring
routes[].vehicleRules.advice[].sincestring
routes[].vehicleRules.advice[].sourcestring (uri)
routes[].vehicleRules.advice[].wherestringAu choix: origin, destination, stop, route.
routes[].vehicleRules.advice[].walkMnumber
routes[].vehicleRules.endBanBan
routes[].vehicleRules.endBan.idstringObligatoire.
routes[].vehicleRules.endBan.zonestringObligatoire.
routes[].vehicleRules.endBan.scopestringObligatoire.
routes[].vehicleRules.endBan.hoursstring
routes[].vehicleRules.endBan.sincestring
routes[].vehicleRules.endBan.sourcestring (uri)
routes[].vehicleRules.endBan.wherestringAu choix: origin, destination, stop, route.
routes[].vehicleRules.endBan.walkMnumber
routes[].vehicleRules.allowedByRequestBan[]
routes[].vehicleRules.allowedByRequest[].idstringObligatoire.
routes[].vehicleRules.allowedByRequest[].zonestringObligatoire.
routes[].vehicleRules.allowedByRequest[].scopestringObligatoire.
routes[].vehicleRules.allowedByRequest[].hoursstring
routes[].vehicleRules.allowedByRequest[].sincestring
routes[].vehicleRules.allowedByRequest[].sourcestring (uri)
routes[].vehicleRules.allowedByRequest[].wherestringAu choix: origin, destination, stop, route.
routes[].vehicleRules.allowedByRequest[].walkMnumber
routes[].vehicleRules.reportedobject[]
routes[].vehicleRules.reported[].locationPoint
routes[].vehicleRules.reported[].reportersinteger
routes[].vehicleRules.reported[].lastSeenstring
routes[].lastMileobject
routes[].lastMile.stopAtPoint
routes[].lastMile.stopAt.typestringObligatoire.
routes[].lastMile.stopAt.coordinatesnumber[]Obligatoire. [lng, lat] Au moins 2 éléments, au plus 2 éléments.
routes[].lastMile.stopNamestring
routes[].lastMile.modestring
routes[].lastMile.distanceMnumber
routes[].lastMile.durationSnumber
routes[].lastMile.geometryLineString
routes[].lastMile.geometry.typestringObligatoire.
routes[].lastMile.geometry.coordinatesnumber[][]Obligatoire.
routes[].accessobject
routes[].access.kindstringAu choix: estate, government, military, police, gate.
routes[].access.textstring
routes[].access.namestring
routes[].access.gatePoint
routes[].access.gate.typestringObligatoire.
routes[].access.gate.coordinatesnumber[]Obligatoire. [lng, lat] Au moins 2 éléments, au plus 2 éléments.
routes[].access.dropOffAtGateboolean
routes[].roadConditionobject
routes[].roadCondition.roughMnumber
routes[].countrystring
routes[].warningsstring[]
routes[].faresFareEstimate[]
routes[].fares[].modestringObligatoire. Au choix: taxi, shared_taxi, okada, keke, bus, ridehail, boat.
routes[].fares[].servicestring
routes[].fares[].currencystringObligatoire. Au choix: NGN, GHS, XOF.
routes[].fares[].lowintegerObligatoire.
routes[].fares[].typicalintegerObligatoire.
routes[].fares[].highintegerObligatoire.
routes[].fares[].textstringObligatoire.
routes[].fares[].perPersonbooleanObligatoire.
routes[].fares[].charterbooleanObligatoire.
routes[].fares[].nightboolean
routes[].fares[].rushboolean
routes[].fares[].rainboolean
routes[].fares[].basisstringObligatoire. Au choix: crowd, guide.
routes[].fares[].reportsintegerObligatoire.
routes[].fares[].durationSnumberObligatoire.
routes[].fares[].openingOfferintegerLà où les prix se marchandent : une bonne première offre.
routes[].fares[].sourcesstring (uri)[]
waypointsobject[]Obligatoire. Où chaque point de passage a été placé sur l’itinéraire, dans l’ordre.
waypoints[].locationPointObligatoire.
waypoints[].location.typestringObligatoire.
waypoints[].location.coordinatesnumber[]Obligatoire. [lng, lat] Au moins 2 éléments, au plus 2 éléments.
waypoints[].postcodestring
waypoints[].entrancestring
modestringObligatoire. Au choix: drive, van, okada, motorbike, dispatch, keke, danfo, walk, bicycle, boat, train. Par défaut: drive.
warningsstring[]
unconfirmedBansBan[]
unconfirmedBans[].idstringObligatoire.
unconfirmedBans[].zonestringObligatoire.
unconfirmedBans[].scopestringObligatoire.
unconfirmedBans[].hoursstring
unconfirmedBans[].sincestring
unconfirmedBans[].sourcestring (uri)
unconfirmedBans[].wherestringAu choix: origin, destination, stop, route.
unconfirmedBans[].walkMnumber
attributionstringObligatoire.
200 OK
{
  "routes": [
    {
      "distanceM": 0,
      "durationS": 0,
      "staticDurationS": 0,
      "trafficDelayS": 0,
      "speedSource": "live",
      "summary": "Admiralty Way and Awudu Ekpekha Boulevard",
      "geometry": {
        "type": "string",
        "coordinates": [
          []
        ]
      },
      "legs": [
        {
          "distanceM": 0,
          "durationS": 0
        }
      ],
      "steps": [
        {
          "maneuver": "right",
          "instruction": "Turn right onto Admiralty Way.",
          "distanceM": 0,
          "durationS": 0,
          "streetNames": [],
          "startIndex": 0,
          "endIndex": 0,
          "roundaboutExit": 0,
          "toward": [],
          "atTrafficLight": true,
          "crossing": "string"
        }
      ],
      "segments": [
        {
          "mode": "walk",
          "line": "string",
          "from": "string",
          "to": "string",
          "distanceM": 0,
          "durationS": 0,
          "waitS": 0,
          "stops": 0,
          "scheduled": true,
          "estimated": true,
          "fare": "string",
          "note": "string",
          "geometry": {}
        }
      ],
      "congestion": [
        {
          "startIndex": 0,
          "endIndex": 0,
          "level": "string"
        }
      ],
      "tolls": {
        "gates": [
          {}
        ],
        "total": {
          "NGN": 300
        },
        "unknownPrices": 0
      },
      "borderCrossings": [
        {
          "from": "string",
          "to": "string",
          "location": {},
          "atM": 0,
          "post": "string",
          "clockChangeH": 0
        }
      ],
      "vehicleRules": {
        "vehicle": "okada",
        "avoided": [
          {}
        ],
        "advice": [
          {}
        ],
        "endBan": {
          "id": "string",
          "zone": "Third Mainland Bridge",
          "scope": "string",
          "hours": "string",
          "since": "string",
          "source": "string",
          "where": "origin",
          "walkM": 0
        },
        "allowedByRequest": [
          {}
        ],
        "reported": [
          {}
        ]
      },
      "lastMile": {
        "stopAt": {
          "type": "string",
          "coordinates": []
        },
        "stopName": "string",
        "mode": "string",
        "distanceM": 0,
        "durationS": 0,
        "geometry": {
          "type": "string",
          "coordinates": []
        }
      },
      "access": {
        "kind": "estate",
        "text": "string",
        "name": "string",
        "gate": {
          "type": "string",
          "coordinates": []
        },
        "dropOffAtGate": true
      },
      "roadCondition": {
        "roughM": 0
      },
      "country": "string",
      "warnings": [
        "string"
      ],
      "fares": [
        {
          "mode": "taxi",
          "service": "Bolt",
          "currency": "NGN",
          "low": 0,
          "typical": 0,
          "high": 0,
          "text": "₦3,000–4,500",
          "perPerson": true,
          "charter": true,
          "night": true,
          "rush": true,
          "rain": true,
          "basis": "crowd",
          "reports": 0,
          "durationS": 0,
          "openingOffer": 0,
          "sources": []
        }
      ]
    }
  ],
  "waypoints": [
    {
      "location": {
        "type": "string",
        "coordinates": [
          0
        ]
      },
      "postcode": "string",
      "entrance": "string"
    }
  ],
  "mode": "drive",
  "warnings": [
    "string"
  ],
  "unconfirmedBans": [
    {
      "id": "string",
      "zone": "Third Mainland Bridge",
      "scope": "string",
      "hours": "string",
      "since": "string",
      "source": "string",
      "where": "origin",
      "walkM": 0
    }
  ],
  "attribution": "string"
}

Erreurs

  • default Erreur

Temps de trajet de plusieurs origines vers plusieurs destinations (par élément)

POST https://nways.ng/maps/v1/routes/matrix

Jusqu’à 50 départs et 50 arrivées, 625 éléments (départs × arrivées), chacun facturé comme une unité route_matrix. Modes drive, van, walk, bicycle ; okada, keke et danfo respectent leurs interdictions comme /routes/compute (un élément qui part d’une zone interdite ou y arrive est NOT_ALLOWED, avec l’interdiction) ; motorbike et dispatch seulement les interdictions visant toutes les motos. Points à 400 km au plus en voiture, 200 km sinon. Motifs : MODE_INVALID, MATRIX_TOO_LARGE, MATRIX_TOO_FAR, WAYPOINT_INVALID, POSTCODE_INVALID, POSTCODE_NOT_FOUND, GHANAPOST_INVALID, GHANAPOST_NOT_FOUND, PLUSCODE_INVALID, ROUTING_UNAVAILABLE (503).

Paramètres

NomOùTypeDescription
fieldsrequêtestringListe séparée par des virgules des champs à garder dans chaque résultat (a.b descend dans les objets ; id est toujours gardé ; * = tous).

Corps de la requête

ChampTypeDescription
originsWaypoint[]Obligatoire. Au moins 1 éléments, au plus 50 éléments.
origins[].latnumber
origins[].lngnumber
origins[].postcodestring
origins[].ghanaPoststring
origins[].plusCodestring
origins[].headingnumberOrigine seulement : sens de déplacement (en degrés), pour qu’un véhicule en mouvement ne commence pas par un demi-tour.
destinationsWaypoint[]Obligatoire. Au moins 1 éléments, au plus 50 éléments.
destinations[].latnumber
destinations[].lngnumber
destinations[].postcodestring
destinations[].ghanaPoststring
destinations[].plusCodestring
destinations[].headingnumberOrigine seulement : sens de déplacement (en degrés), pour qu’un véhicule en mouvement ne commence pas par un demi-tour.
modestringokada, keke et danfo respectent leurs interdictions (comme /routes/compute) ; motorbike et dispatch (motos de coursiers) seulement les interdictions visant toutes les motos. Au choix: drive, van, okada, motorbike, dispatch, keke, danfo, walk, bicycle. Par défaut: drive.
allowBansstring[]
cURL
curl -X POST "https://nways.ng/maps/v1/routes/matrix" \
  -H "X-NWays-Api-Key: VOTRE_CLE_API" \
  -H "Content-Type: application/json" \
  -d '{"origins":[{"lat":6.4474,"lng":3.472},{"postcode":"LA08A09DB09"}],"destinations":[{"lat":6.43,"lng":3.42},{"lat":6.45,"lng":3.4}],"mode":"motorbike"}'
JavaScript
const res = await fetch('https://nways.ng/maps/v1/routes/matrix', {
  method: 'POST',
  headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "origins": [
      {
        "lat": 6.4474,
        "lng": 3.472
      },
      {
        "postcode": "LA08A09DB09"
      }
    ],
    "destinations": [
      {
        "lat": 6.43,
        "lng": 3.42
      },
      {
        "lat": 6.45,
        "lng": 3.4
      }
    ],
    "mode": "motorbike"
  }),
})
const data = await res.json()
Python
import os
import requests

res = requests.post(
    "https://nways.ng/maps/v1/routes/matrix",
    headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
    json={"origins": [{"lat": 6.4474, "lng": 3.472}, {"postcode": "LA08A09DB09"}], "destinations": [{"lat": 6.43, "lng": 3.42}, {"lat": 6.45, "lng": 3.4}], "mode": "motorbike"},
    timeout=10,
)
data = res.json()

Réponse

La matrice

ChampTypeDescription
elementsobject[]Obligatoire.
elements[].originIndexintegerObligatoire.
elements[].destinationIndexintegerObligatoire.
elements[].statusstringObligatoire. NOT_ALLOWED : le départ ou l’arrivée est dans une zone interdite pour le mode (ban indique laquelle). Au choix: OK, ROUTE_NOT_FOUND, NOT_ALLOWED.
elements[].durationSnumberObligatoire.
elements[].distanceMnumberObligatoire.
elements[].banBan
elements[].ban.idstringObligatoire.
elements[].ban.zonestringObligatoire.
elements[].ban.scopestringObligatoire.
elements[].ban.hoursstring
elements[].ban.sincestring
elements[].ban.sourcestring (uri)
elements[].ban.wherestringAu choix: origin, destination, stop, route.
elements[].ban.walkMnumber
originsPoint[]Obligatoire.
origins[].typestringObligatoire.
origins[].coordinatesnumber[]Obligatoire. [lng, lat] Au moins 2 éléments, au plus 2 éléments.
destinationsPoint[]Obligatoire.
destinations[].typestringObligatoire.
destinations[].coordinatesnumber[]Obligatoire. [lng, lat] Au moins 2 éléments, au plus 2 éléments.
modestringObligatoire.
attributionstringObligatoire.
200 OK
{
  "elements": [
    {
      "originIndex": 0,
      "destinationIndex": 0,
      "status": "OK",
      "durationS": 0,
      "distanceM": 0,
      "ban": {
        "id": "string",
        "zone": "Third Mainland Bridge",
        "scope": "string",
        "hours": "string",
        "since": "string",
        "source": "string",
        "where": "origin",
        "walkM": 0
      }
    }
  ],
  "origins": [
    {
      "type": "string",
      "coordinates": [
        0
      ]
    }
  ],
  "destinations": [
    {
      "type": "string",
      "coordinates": [
        0
      ]
    }
  ],
  "mode": "string",
  "attribution": "string"
}

Erreurs

  • default Erreur

Quel véhicule visite quels arrêts, et dans quel ordre

POST https://nways.ng/maps/v1/routes/optimize

Modes comme /routes/matrix : les arrêts situés dans une zone interdite pour le mode ne sont pas attribués et figurent dans notAllowed. Jusqu’à 50 arrêts et 5 véhicules (départ, arrivée facultative, capacité) : le moindre temps total dans la capacité de chaque véhicule, par une heuristique rapide sur les temps de trajet du moteur (sans garantie d’optimum). L’itinéraire de chaque véhicule est calculé comme /routes/compute, sauf si geometry vaut false. Un appel route_optimization. Motifs : MODE_INVALID, STOPS_INVALID, VEHICLES_INVALID, STOP_ID_INVALID, VEHICLE_ID_INVALID, STOP_INVALID, CAPACITY_INVALID, STOPS_TOO_FAR, WAYPOINT_INVALID, POSTCODE_INVALID, POSTCODE_NOT_FOUND, GHANAPOST_INVALID, GHANAPOST_NOT_FOUND, PLUSCODE_INVALID, LANG_INVALID, ROUTING_UNAVAILABLE (503).

Corps de la requête

ChampTypeDescription
stopsobject[]Obligatoire. Au moins 1 éléments, au plus 50 éléments.
stops[].idstringObligatoire.
stops[].locationWaypointObligatoire. Exactement un élément parmi lat et lng, postcode (NIPOST : l’itinéraire mène à sa meilleure entrée), ghanaPost ou plusCode (complet, ou court suivi d’une ville).
stops[].location.latnumber
stops[].location.lngnumber
stops[].location.postcodestring
stops[].location.ghanaPoststring
stops[].location.plusCodestring
stops[].location.headingnumberOrigine seulement : sens de déplacement (en degrés), pour qu’un véhicule en mouvement ne commence pas par un demi-tour.
stops[].demandintegerPar défaut: 1. ≥ 1.
stops[].serviceSnumberPar défaut: 0. ≥ 0, ≤ 14400.
vehiclesobject[]Obligatoire. Au moins 1 éléments, au plus 5 éléments.
vehicles[].idstringObligatoire.
vehicles[].startWaypointObligatoire. Exactement un élément parmi lat et lng, postcode (NIPOST : l’itinéraire mène à sa meilleure entrée), ghanaPost ou plusCode (complet, ou court suivi d’une ville).
vehicles[].start.latnumber
vehicles[].start.lngnumber
vehicles[].start.postcodestring
vehicles[].start.ghanaPoststring
vehicles[].start.plusCodestring
vehicles[].start.headingnumberOrigine seulement : sens de déplacement (en degrés), pour qu’un véhicule en mouvement ne commence pas par un demi-tour.
vehicles[].endWaypointExactement un élément parmi lat et lng, postcode (NIPOST : l’itinéraire mène à sa meilleure entrée), ghanaPost ou plusCode (complet, ou court suivi d’une ville).
vehicles[].end.latnumber
vehicles[].end.lngnumber
vehicles[].end.postcodestring
vehicles[].end.ghanaPoststring
vehicles[].end.plusCodestring
vehicles[].end.headingnumberOrigine seulement : sens de déplacement (en degrés), pour qu’un véhicule en mouvement ne commence pas par un demi-tour.
vehicles[].capacityinteger0 = aucune limite Par défaut: 0. ≥ 0.
modestringokada, keke et danfo respectent leurs interdictions (comme /routes/compute) ; motorbike et dispatch (motos de coursiers) seulement les interdictions visant toutes les motos. Au choix: drive, van, okada, motorbike, dispatch, keke, danfo, walk, bicycle. Par défaut: drive.
allowBansstring[]
geometrybooleanPar défaut: true.
langstringAu choix: en, fr, pt.
cURL
curl -X POST "https://nways.ng/maps/v1/routes/optimize" \
  -H "X-NWays-Api-Key: VOTRE_CLE_API" \
  -H "Content-Type: application/json" \
  -d '{"stops":[{"id":"order-1","location":{"lat":6.44,"lng":3.4},"serviceS":120},{"id":"order-2","location":{"postcode":"LA08A09DB09"},"demand":2}],"vehicles":[{"id":"bike-1","start":{"lat":6.4474,"lng":3.472},"capacity":6}],"mode":"motorbike"}'
JavaScript
const res = await fetch('https://nways.ng/maps/v1/routes/optimize', {
  method: 'POST',
  headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "stops": [
      {
        "id": "order-1",
        "location": {
          "lat": 6.44,
          "lng": 3.4
        },
        "serviceS": 120
      },
      {
        "id": "order-2",
        "location": {
          "postcode": "LA08A09DB09"
        },
        "demand": 2
      }
    ],
    "vehicles": [
      {
        "id": "bike-1",
        "start": {
          "lat": 6.4474,
          "lng": 3.472
        },
        "capacity": 6
      }
    ],
    "mode": "motorbike"
  }),
})
const data = await res.json()
Python
import os
import requests

res = requests.post(
    "https://nways.ng/maps/v1/routes/optimize",
    headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
    json={"stops": [{"id": "order-1", "location": {"lat": 6.44, "lng": 3.4}, "serviceS": 120}, {"id": "order-2", "location": {"postcode": "LA08A09DB09"}, "demand": 2}], "vehicles": [{"id": "bike-1", "start": {"lat": 6.4474, "lng": 3.472}, "capacity": 6}], "mode": "motorbike"},
    timeout=10,
)
data = res.json()

Réponse

Le plan

ChampTypeDescription
routesobject[]Obligatoire.
routes[].vehiclestringObligatoire.
routes[].stopsstring[]Obligatoire. Ids des arrêts dans l’ordre de visite
routes[].durationSnumberObligatoire.
routes[].distanceMnumberObligatoire.
routes[].serviceSnumberObligatoire.
routes[].loadintegerObligatoire.
routes[].arrivalsSnumber[]Obligatoire. Secondes entre le départ et chaque arrêt
routes[].routeRoute
routes[].route.distanceMnumberObligatoire.
routes[].route.durationSnumberObligatoire.
routes[].route.staticDurationSnumberObligatoire. Sans le trafic en direct
routes[].route.trafficDelaySnumberObligatoire. Ce que le trafic et les incidents ajoutent en ce moment (traffic_aware).
routes[].route.speedSourcestringAu choix: live, typical, estimated.
routes[].route.summarystring
routes[].route.geometryLineStringObligatoire.
routes[].route.geometry.typestringObligatoire.
routes[].route.geometry.coordinatesnumber[][]Obligatoire.
routes[].route.legsLeg[]Obligatoire. Un par tronçon entre deux arrêts.
routes[].route.legs[].distanceMnumberObligatoire.
routes[].route.legs[].durationSnumberObligatoire.
routes[].route.stepsStep[]Obligatoire.
routes[].route.steps[].maneuverstringObligatoire. depart, arrive, continue, left, right, slight_left, sharp_right, uturn_left, roundabout_enter, ferry_enter, … (autre)
routes[].route.steps[].instructionstringObligatoire.
routes[].route.steps[].distanceMnumberObligatoire.
routes[].route.steps[].durationSnumberObligatoire.
routes[].route.steps[].streetNamesstring[]
routes[].route.steps[].startIndexintegerObligatoire. Index dans geometry.coordinates
routes[].route.steps[].endIndexintegerObligatoire.
routes[].route.steps[].roundaboutExitinteger
routes[].route.steps[].towardstring[]
routes[].route.steps[].atTrafficLightboolean
routes[].route.steps[].crossingstringÀ pied : footbridge, underpass, zebra, signals, crossing, junction
routes[].route.segmentsobject[]Trajets qui changent de mode de déplacement (train, bateau, okada avec une marche au-delà d’une interdiction).
routes[].route.segments[].modestringObligatoire. Au choix: walk, okada, drive, train, boat.
routes[].route.segments[].linestring
routes[].route.segments[].fromstringObligatoire.
routes[].route.segments[].tostringObligatoire.
routes[].route.segments[].distanceMnumberObligatoire.
routes[].route.segments[].durationSnumberObligatoire.
routes[].route.segments[].waitSnumber
routes[].route.segments[].stopsinteger
routes[].route.segments[].scheduledboolean
routes[].route.segments[].estimatedboolean
routes[].route.segments[].farestring
routes[].route.segments[].notestring
routes[].route.segments[].geometryLineStringObligatoire.
routes[].route.congestionobject[]
routes[].route.congestion[].startIndexinteger
routes[].route.congestion[].endIndexinteger
routes[].route.congestion[].levelstring
routes[].route.tollsobject
routes[].route.tolls.gatesobject[]
routes[].route.tolls.totalobject
routes[].route.tolls.unknownPricesinteger
routes[].route.borderCrossingsobject[]
routes[].route.borderCrossings[].fromstring
routes[].route.borderCrossings[].tostring
routes[].route.borderCrossings[].locationPoint
routes[].route.borderCrossings[].atMinteger
routes[].route.borderCrossings[].poststring
routes[].route.borderCrossings[].clockChangeHnumber
routes[].route.vehicleRulesobjectTrajets en okada, keke et danfo
routes[].route.vehicleRules.vehiclestringAu choix: okada, motorbike, keke, danfo.
routes[].route.vehicleRules.avoidedBan[]
routes[].route.vehicleRules.adviceBan[]
routes[].route.vehicleRules.endBanBan
routes[].route.vehicleRules.allowedByRequestBan[]
routes[].route.vehicleRules.reportedobject[]
routes[].route.lastMileobject
routes[].route.lastMile.stopAtPoint
routes[].route.lastMile.stopNamestring
routes[].route.lastMile.modestring
routes[].route.lastMile.distanceMnumber
routes[].route.lastMile.durationSnumber
routes[].route.lastMile.geometryLineString
routes[].route.accessobject
routes[].route.access.kindstringAu choix: estate, government, military, police, gate.
routes[].route.access.textstring
routes[].route.access.namestring
routes[].route.access.gatePoint
routes[].route.access.dropOffAtGateboolean
routes[].route.roadConditionobject
routes[].route.roadCondition.roughMnumber
routes[].route.countrystring
routes[].route.warningsstring[]
routes[].route.faresFareEstimate[]
routes[].route.fares[].modestringObligatoire. Au choix: taxi, shared_taxi, okada, keke, bus, ridehail, boat.
routes[].route.fares[].servicestring
routes[].route.fares[].currencystringObligatoire. Au choix: NGN, GHS, XOF.
routes[].route.fares[].lowintegerObligatoire.
routes[].route.fares[].typicalintegerObligatoire.
routes[].route.fares[].highintegerObligatoire.
routes[].route.fares[].textstringObligatoire.
routes[].route.fares[].perPersonbooleanObligatoire.
routes[].route.fares[].charterbooleanObligatoire.
routes[].route.fares[].nightboolean
routes[].route.fares[].rushboolean
routes[].route.fares[].rainboolean
routes[].route.fares[].basisstringObligatoire. Au choix: crowd, guide.
routes[].route.fares[].reportsintegerObligatoire.
routes[].route.fares[].durationSnumberObligatoire.
routes[].route.fares[].openingOfferintegerLà où les prix se marchandent : une bonne première offre.
routes[].route.fares[].sourcesstring (uri)[]
unassignedstring[]Obligatoire.
notAllowedobject[]Arrêts, ou départs et arrivées de véhicules, situés dans une zone interdite pour le mode.
notAllowed[].stopstring
notAllowed[].vehiclestring
notAllowed[].banBanObligatoire.
notAllowed[].ban.idstringObligatoire.
notAllowed[].ban.zonestringObligatoire.
notAllowed[].ban.scopestringObligatoire.
notAllowed[].ban.hoursstring
notAllowed[].ban.sincestring
notAllowed[].ban.sourcestring (uri)
notAllowed[].ban.wherestringAu choix: origin, destination, stop, route.
notAllowed[].ban.walkMnumber
durationSnumberObligatoire.
modestringObligatoire.
attributionstringObligatoire.
200 OK
{
  "routes": [
    {
      "vehicle": "string",
      "stops": [
        "string"
      ],
      "durationS": 0,
      "distanceM": 0,
      "serviceS": 0,
      "load": 0,
      "arrivalsS": [
        0
      ],
      "route": {
        "distanceM": 0,
        "durationS": 0,
        "staticDurationS": 0,
        "trafficDelayS": 0,
        "speedSource": "live",
        "summary": "Admiralty Way and Awudu Ekpekha Boulevard",
        "geometry": {
          "type": "string",
          "coordinates": []
        },
        "legs": [
          {}
        ],
        "steps": [
          {}
        ],
        "segments": [
          {}
        ],
        "congestion": [
          {}
        ],
        "tolls": {
          "gates": [],
          "total": {
            "NGN": 300
          },
          "unknownPrices": 0
        },
        "borderCrossings": [
          {}
        ],
        "vehicleRules": {
          "vehicle": "okada",
          "avoided": [],
          "advice": [],
          "endBan": {},
          "allowedByRequest": [],
          "reported": []
        },
        "lastMile": {
          "stopAt": {},
          "stopName": "string",
          "mode": "string",
          "distanceM": 0,
          "durationS": 0,
          "geometry": {}
        },
        "access": {
          "kind": "estate",
          "text": "string",
          "name": "string",
          "gate": {},
          "dropOffAtGate": true
        },
        "roadCondition": {
          "roughM": 0
        },
        "country": "string",
        "warnings": [
          "string"
        ],
        "fares": [
          {}
        ]
      }
    }
  ],
  "unassigned": [
    "string"
  ],
  "notAllowed": [
    {
      "stop": "string",
      "vehicle": "string",
      "ban": {
        "id": "string",
        "zone": "Third Mainland Bridge",
        "scope": "string",
        "hours": "string",
        "since": "string",
        "source": "string",
        "where": "origin",
        "walkM": 0
      }
    }
  ],
  "durationS": 0,
  "mode": "string",
  "attribution": "string"
}

Erreurs

  • default Erreur