N-Ways
Documentação para programadoresPercursos

Percursos

Percursos para cada forma de viajar, a matriz de percursos e a otimização de rotas.

Nesta página
Nota:

Envie a sua chave com key=A_SUA_CHAVE_API no endereço, ou no cabeçalho X-NWays-Api-Key. Chaves de API

Endereço base: https://nways.ng/maps/v1

Um percurso, com até 25 pontos intermédios

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

Automóvel, carrinha, okada (mototáxi; respeita as proibições de okada, faz a pé a passagem do limite de uma zona proibida), motorbike (a sua própria mota) e dispatch (motas de estafetas: isentas das proibições de okada de passageiros), keke e danfo (respeitam as suas proibições), a pé, bicicleta, barco (barcos de passageiros e cais) e comboio. Os códigos postais encaminham para a melhor entrada do edifício; onde a estrada acaba antes da porta, o percurso indica onde parar e como terminar (lastMile); portagens nas respetivas moedas, passagens de fronteira, condomínios fechados, proibições evitadas com as suas fontes. fields= escolhe os campos de cada percurso. Motivos: 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).

Parâmetros

NomeOndeTipoDescrição
fieldsconsultastringLista separada por vírgulas dos campos a manter em cada resultado (a.b entra em objetos; id é sempre mantido; * = todos).

Corpo do pedido

CampoTipoDescrição
originWaypointObrigatório. Exatamente um de: lat e lng, postcode (NIPOST: encaminha para a sua melhor entrada), ghanaPost ou plusCode (completo, ou curto com uma localidade a seguir).
origin.latnumber
origin.lngnumber
origin.postcodestring
origin.ghanaPoststring
origin.plusCodestring
origin.headingnumberSó na origem: sentido de deslocação (graus), para que um veículo em movimento não comece com uma inversão de marcha.
destinationWaypointObrigatório. Exatamente um de: lat e lng, postcode (NIPOST: encaminha para a sua melhor entrada), ghanaPost ou plusCode (completo, ou curto com uma localidade a seguir).
destination.latnumber
destination.lngnumber
destination.postcodestring
destination.ghanaPoststring
destination.plusCodestring
destination.headingnumberSó na origem: sentido de deslocação (graus), para que um veículo em movimento não comece com uma inversão de marcha.
intermediatesWaypoint[]No máximo 25 elementos.
intermediates[].latnumber
intermediates[].lngnumber
intermediates[].postcodestring
intermediates[].ghanaPoststring
intermediates[].plusCodestring
intermediates[].headingnumberSó na origem: sentido de deslocação (graus), para que um veículo em movimento não comece com uma inversão de marcha.
modestringUm de: drive, van, okada, motorbike, dispatch, keke, danfo, walk, bicycle, boat, train. Predefinição: drive.
alternativesbooleanAté 2 percursos adicionais (sem pontos intermédios). Predefinição: false.
routingPreferencestringUm de: traffic_unaware, traffic_aware. Predefinição: traffic_unaware.
departAtstring (date-time)
avoidstring[]
langstringUm de: en, fr, pt.
tollVehiclestringClasse tarifária de portagem (van: autocarro). Um de: car, suv, bus, truck.
accessstringViagens de comboio e barco: de e para estações e cais. Um de: walk, okada, drive.
lastMilestringUm de: walk, okada.
allowBansstring[]Ids de proibições não confirmadas (de unconfirmedBans) por onde passar mesmo assim.
faresbooleanAcrescentar estimativas de tarifa a cada percurso (SKU avançado). Predefinição: false.
cURL
curl -X POST "https://nways.ng/maps/v1/routes/compute" \
  -H "X-NWays-Api-Key: A_SUA_CHAVE_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()

Resposta

Percursos

CampoTipoDescrição
routesRoute[]Obrigatório.
routes[].distanceMnumberObrigatório.
routes[].durationSnumberObrigatório.
routes[].staticDurationSnumberObrigatório. Sem trânsito em direto
routes[].trafficDelaySnumberObrigatório. O que o trânsito e os incidentes acrescentam agora (traffic_aware).
routes[].speedSourcestringUm de: live, typical, estimated.
routes[].summarystring
routes[].geometryLineStringObrigatório.
routes[].geometry.typestringObrigatório.
routes[].geometry.coordinatesnumber[][]Obrigatório.
routes[].legsLeg[]Obrigatório. Um por troço entre paragens.
routes[].legs[].distanceMnumberObrigatório.
routes[].legs[].durationSnumberObrigatório.
routes[].stepsStep[]Obrigatório.
routes[].steps[].maneuverstringObrigatório. depart, arrive, continue, left, right, slight_left, sharp_right, uturn_left, roundabout_enter, ferry_enter, … (outros)
routes[].steps[].instructionstringObrigatório.
routes[].steps[].distanceMnumberObrigatório.
routes[].steps[].durationSnumberObrigatório.
routes[].steps[].streetNamesstring[]
routes[].steps[].startIndexintegerObrigatório. Índice em geometry.coordinates
routes[].steps[].endIndexintegerObrigatório.
routes[].steps[].roundaboutExitinteger
routes[].steps[].towardstring[]
routes[].steps[].atTrafficLightboolean
routes[].steps[].crossingstringA pé: passagem superior, passagem inferior, passadeira, semáforos, travessia, cruzamento
routes[].segmentsobject[]Viagens que mudam a forma de deslocação (comboio, barco, okada com um trajeto a pé para passar uma proibição).
routes[].segments[].modestringObrigatório. Um de: walk, okada, drive, train, boat.
routes[].segments[].linestring
routes[].segments[].fromstringObrigatório.
routes[].segments[].tostringObrigatório.
routes[].segments[].distanceMnumberObrigatório.
routes[].segments[].durationSnumberObrigatório.
routes[].segments[].waitSnumber
routes[].segments[].stopsinteger
routes[].segments[].scheduledboolean
routes[].segments[].estimatedboolean
routes[].segments[].farestring
routes[].segments[].notestring
routes[].segments[].geometryLineStringObrigatório.
routes[].segments[].geometry.typestringObrigatório.
routes[].segments[].geometry.coordinatesnumber[][]Obrigatório.
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.typestringObrigatório.
routes[].borderCrossings[].location.coordinatesnumber[]Obrigatório. [lng, lat] Pelo menos 2 elementos, no máximo 2 elementos.
routes[].borderCrossings[].atMinteger
routes[].borderCrossings[].poststring
routes[].borderCrossings[].clockChangeHnumber
routes[].vehicleRulesobjectViagens de okada, keke e danfo
routes[].vehicleRules.vehiclestringUm de: okada, motorbike, keke, danfo.
routes[].vehicleRules.avoidedBan[]
routes[].vehicleRules.avoided[].idstringObrigatório.
routes[].vehicleRules.avoided[].zonestringObrigatório.
routes[].vehicleRules.avoided[].scopestringObrigatório.
routes[].vehicleRules.avoided[].hoursstring
routes[].vehicleRules.avoided[].sincestring
routes[].vehicleRules.avoided[].sourcestring (uri)
routes[].vehicleRules.avoided[].wherestringUm de: origin, destination, stop, route.
routes[].vehicleRules.avoided[].walkMnumber
routes[].vehicleRules.adviceBan[]
routes[].vehicleRules.advice[].idstringObrigatório.
routes[].vehicleRules.advice[].zonestringObrigatório.
routes[].vehicleRules.advice[].scopestringObrigatório.
routes[].vehicleRules.advice[].hoursstring
routes[].vehicleRules.advice[].sincestring
routes[].vehicleRules.advice[].sourcestring (uri)
routes[].vehicleRules.advice[].wherestringUm de: origin, destination, stop, route.
routes[].vehicleRules.advice[].walkMnumber
routes[].vehicleRules.endBanBan
routes[].vehicleRules.endBan.idstringObrigatório.
routes[].vehicleRules.endBan.zonestringObrigatório.
routes[].vehicleRules.endBan.scopestringObrigatório.
routes[].vehicleRules.endBan.hoursstring
routes[].vehicleRules.endBan.sincestring
routes[].vehicleRules.endBan.sourcestring (uri)
routes[].vehicleRules.endBan.wherestringUm de: origin, destination, stop, route.
routes[].vehicleRules.endBan.walkMnumber
routes[].vehicleRules.allowedByRequestBan[]
routes[].vehicleRules.allowedByRequest[].idstringObrigatório.
routes[].vehicleRules.allowedByRequest[].zonestringObrigatório.
routes[].vehicleRules.allowedByRequest[].scopestringObrigatório.
routes[].vehicleRules.allowedByRequest[].hoursstring
routes[].vehicleRules.allowedByRequest[].sincestring
routes[].vehicleRules.allowedByRequest[].sourcestring (uri)
routes[].vehicleRules.allowedByRequest[].wherestringUm de: 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.typestringObrigatório.
routes[].lastMile.stopAt.coordinatesnumber[]Obrigatório. [lng, lat] Pelo menos 2 elementos, no máximo 2 elementos.
routes[].lastMile.stopNamestring
routes[].lastMile.modestring
routes[].lastMile.distanceMnumber
routes[].lastMile.durationSnumber
routes[].lastMile.geometryLineString
routes[].lastMile.geometry.typestringObrigatório.
routes[].lastMile.geometry.coordinatesnumber[][]Obrigatório.
routes[].accessobject
routes[].access.kindstringUm de: estate, government, military, police, gate.
routes[].access.textstring
routes[].access.namestring
routes[].access.gatePoint
routes[].access.gate.typestringObrigatório.
routes[].access.gate.coordinatesnumber[]Obrigatório. [lng, lat] Pelo menos 2 elementos, no máximo 2 elementos.
routes[].access.dropOffAtGateboolean
routes[].roadConditionobject
routes[].roadCondition.roughMnumber
routes[].countrystring
routes[].warningsstring[]
routes[].faresFareEstimate[]
routes[].fares[].modestringObrigatório. Um de: taxi, shared_taxi, okada, keke, bus, ridehail, boat.
routes[].fares[].servicestring
routes[].fares[].currencystringObrigatório. Um de: NGN, GHS, XOF.
routes[].fares[].lowintegerObrigatório.
routes[].fares[].typicalintegerObrigatório.
routes[].fares[].highintegerObrigatório.
routes[].fares[].textstringObrigatório.
routes[].fares[].perPersonbooleanObrigatório.
routes[].fares[].charterbooleanObrigatório.
routes[].fares[].nightboolean
routes[].fares[].rushboolean
routes[].fares[].rainboolean
routes[].fares[].basisstringObrigatório. Um de: crowd, guide.
routes[].fares[].reportsintegerObrigatório.
routes[].fares[].durationSnumberObrigatório.
routes[].fares[].openingOfferintegerOnde os preços se regateiam: uma boa primeira oferta.
routes[].fares[].sourcesstring (uri)[]
waypointsobject[]Obrigatório. Para onde cada ponto de passagem foi encaminhado, por ordem.
waypoints[].locationPointObrigatório.
waypoints[].location.typestringObrigatório.
waypoints[].location.coordinatesnumber[]Obrigatório. [lng, lat] Pelo menos 2 elementos, no máximo 2 elementos.
waypoints[].postcodestring
waypoints[].entrancestring
modestringObrigatório. Um de: drive, van, okada, motorbike, dispatch, keke, danfo, walk, bicycle, boat, train. Predefinição: drive.
warningsstring[]
unconfirmedBansBan[]
unconfirmedBans[].idstringObrigatório.
unconfirmedBans[].zonestringObrigatório.
unconfirmedBans[].scopestringObrigatório.
unconfirmedBans[].hoursstring
unconfirmedBans[].sincestring
unconfirmedBans[].sourcestring (uri)
unconfirmedBans[].wherestringUm de: origin, destination, stop, route.
unconfirmedBans[].walkMnumber
attributionstringObrigatório.
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"
}

Erros

  • default Erro

Tempos de viagem de muitas origens para muitos destinos (por elemento)

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

Até 50 origens e 50 destinos, 625 elementos (origens × destinos), cada um faturado como uma unidade route_matrix. Modos drive, van, walk, bicycle; okada, keke e danfo respeitam as suas proibições como em /routes/compute (um elemento de ou para uma zona de proibição é NOT_ALLOWED, com a proibição); motorbike e dispatch apenas as proibições que abrangem todos os motociclos. Pontos a no máximo 400 km de distância de automóvel, 200 km nos outros modos. Motivos: 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).

Parâmetros

NomeOndeTipoDescrição
fieldsconsultastringLista separada por vírgulas dos campos a manter em cada resultado (a.b entra em objetos; id é sempre mantido; * = todos).

Corpo do pedido

CampoTipoDescrição
originsWaypoint[]Obrigatório. Pelo menos 1 elementos, no máximo 50 elementos.
origins[].latnumber
origins[].lngnumber
origins[].postcodestring
origins[].ghanaPoststring
origins[].plusCodestring
origins[].headingnumberSó na origem: sentido de deslocação (graus), para que um veículo em movimento não comece com uma inversão de marcha.
destinationsWaypoint[]Obrigatório. Pelo menos 1 elementos, no máximo 50 elementos.
destinations[].latnumber
destinations[].lngnumber
destinations[].postcodestring
destinations[].ghanaPoststring
destinations[].plusCodestring
destinations[].headingnumberSó na origem: sentido de deslocação (graus), para que um veículo em movimento não comece com uma inversão de marcha.
modestringokada, keke e danfo respeitam as suas proibições (como em /routes/compute); motorbike e dispatch (motas de estafetas) apenas as proibições que abrangem todos os motociclos. Um de: drive, van, okada, motorbike, dispatch, keke, danfo, walk, bicycle. Predefinição: drive.
allowBansstring[]
cURL
curl -X POST "https://nways.ng/maps/v1/routes/matrix" \
  -H "X-NWays-Api-Key: A_SUA_CHAVE_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()

Resposta

A matriz

CampoTipoDescrição
elementsobject[]Obrigatório.
elements[].originIndexintegerObrigatório.
elements[].destinationIndexintegerObrigatório.
elements[].statusstringObrigatório. NOT_ALLOWED: a origem ou o destino fica dentro de uma zona de proibição para o modo (ban indica qual). Um de: OK, ROUTE_NOT_FOUND, NOT_ALLOWED.
elements[].durationSnumberObrigatório.
elements[].distanceMnumberObrigatório.
elements[].banBan
elements[].ban.idstringObrigatório.
elements[].ban.zonestringObrigatório.
elements[].ban.scopestringObrigatório.
elements[].ban.hoursstring
elements[].ban.sincestring
elements[].ban.sourcestring (uri)
elements[].ban.wherestringUm de: origin, destination, stop, route.
elements[].ban.walkMnumber
originsPoint[]Obrigatório.
origins[].typestringObrigatório.
origins[].coordinatesnumber[]Obrigatório. [lng, lat] Pelo menos 2 elementos, no máximo 2 elementos.
destinationsPoint[]Obrigatório.
destinations[].typestringObrigatório.
destinations[].coordinatesnumber[]Obrigatório. [lng, lat] Pelo menos 2 elementos, no máximo 2 elementos.
modestringObrigatório.
attributionstringObrigatório.
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"
}

Erros

  • default Erro

Que veículo visita que paragens, e por que ordem

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

Modos como em /routes/matrix: as paragens dentro de uma zona de proibição para o modo ficam por atribuir e são listadas em notAllowed. Até 50 paragens e 5 veículos (partida, chegada opcional, capacidade): o menor tempo total dentro da capacidade de cada veículo, por uma heurística rápida sobre os tempos de viagem do motor (não é um ótimo garantido). O percurso de cada veículo é calculado como em /routes/compute, a menos que geometry seja false. Uma chamada route_optimization. Motivos: 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).

Corpo do pedido

CampoTipoDescrição
stopsobject[]Obrigatório. Pelo menos 1 elementos, no máximo 50 elementos.
stops[].idstringObrigatório.
stops[].locationWaypointObrigatório. Exatamente um de: lat e lng, postcode (NIPOST: encaminha para a sua melhor entrada), ghanaPost ou plusCode (completo, ou curto com uma localidade a seguir).
stops[].location.latnumber
stops[].location.lngnumber
stops[].location.postcodestring
stops[].location.ghanaPoststring
stops[].location.plusCodestring
stops[].location.headingnumberSó na origem: sentido de deslocação (graus), para que um veículo em movimento não comece com uma inversão de marcha.
stops[].demandintegerPredefinição: 1. ≥ 1.
stops[].serviceSnumberPredefinição: 0. ≥ 0, ≤ 14400.
vehiclesobject[]Obrigatório. Pelo menos 1 elementos, no máximo 5 elementos.
vehicles[].idstringObrigatório.
vehicles[].startWaypointObrigatório. Exatamente um de: lat e lng, postcode (NIPOST: encaminha para a sua melhor entrada), ghanaPost ou plusCode (completo, ou curto com uma localidade a seguir).
vehicles[].start.latnumber
vehicles[].start.lngnumber
vehicles[].start.postcodestring
vehicles[].start.ghanaPoststring
vehicles[].start.plusCodestring
vehicles[].start.headingnumberSó na origem: sentido de deslocação (graus), para que um veículo em movimento não comece com uma inversão de marcha.
vehicles[].endWaypointExatamente um de: lat e lng, postcode (NIPOST: encaminha para a sua melhor entrada), ghanaPost ou plusCode (completo, ou curto com uma localidade a seguir).
vehicles[].end.latnumber
vehicles[].end.lngnumber
vehicles[].end.postcodestring
vehicles[].end.ghanaPoststring
vehicles[].end.plusCodestring
vehicles[].end.headingnumberSó na origem: sentido de deslocação (graus), para que um veículo em movimento não comece com uma inversão de marcha.
vehicles[].capacityinteger0 = sem limite Predefinição: 0. ≥ 0.
modestringokada, keke e danfo respeitam as suas proibições (como em /routes/compute); motorbike e dispatch (motas de estafetas) apenas as proibições que abrangem todos os motociclos. Um de: drive, van, okada, motorbike, dispatch, keke, danfo, walk, bicycle. Predefinição: drive.
allowBansstring[]
geometrybooleanPredefinição: true.
langstringUm de: en, fr, pt.
cURL
curl -X POST "https://nways.ng/maps/v1/routes/optimize" \
  -H "X-NWays-Api-Key: A_SUA_CHAVE_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()

Resposta

O plano

CampoTipoDescrição
routesobject[]Obrigatório.
routes[].vehiclestringObrigatório.
routes[].stopsstring[]Obrigatório. Ids das paragens pela ordem de visita
routes[].durationSnumberObrigatório.
routes[].distanceMnumberObrigatório.
routes[].serviceSnumberObrigatório.
routes[].loadintegerObrigatório.
routes[].arrivalsSnumber[]Obrigatório. Segundos desde o início até cada paragem
routes[].routeRoute
routes[].route.distanceMnumberObrigatório.
routes[].route.durationSnumberObrigatório.
routes[].route.staticDurationSnumberObrigatório. Sem trânsito em direto
routes[].route.trafficDelaySnumberObrigatório. O que o trânsito e os incidentes acrescentam agora (traffic_aware).
routes[].route.speedSourcestringUm de: live, typical, estimated.
routes[].route.summarystring
routes[].route.geometryLineStringObrigatório.
routes[].route.geometry.typestringObrigatório.
routes[].route.geometry.coordinatesnumber[][]Obrigatório.
routes[].route.legsLeg[]Obrigatório. Um por troço entre paragens.
routes[].route.legs[].distanceMnumberObrigatório.
routes[].route.legs[].durationSnumberObrigatório.
routes[].route.stepsStep[]Obrigatório.
routes[].route.steps[].maneuverstringObrigatório. depart, arrive, continue, left, right, slight_left, sharp_right, uturn_left, roundabout_enter, ferry_enter, … (outros)
routes[].route.steps[].instructionstringObrigatório.
routes[].route.steps[].distanceMnumberObrigatório.
routes[].route.steps[].durationSnumberObrigatório.
routes[].route.steps[].streetNamesstring[]
routes[].route.steps[].startIndexintegerObrigatório. Índice em geometry.coordinates
routes[].route.steps[].endIndexintegerObrigatório.
routes[].route.steps[].roundaboutExitinteger
routes[].route.steps[].towardstring[]
routes[].route.steps[].atTrafficLightboolean
routes[].route.steps[].crossingstringA pé: passagem superior, passagem inferior, passadeira, semáforos, travessia, cruzamento
routes[].route.segmentsobject[]Viagens que mudam a forma de deslocação (comboio, barco, okada com um trajeto a pé para passar uma proibição).
routes[].route.segments[].modestringObrigatório. Um de: walk, okada, drive, train, boat.
routes[].route.segments[].linestring
routes[].route.segments[].fromstringObrigatório.
routes[].route.segments[].tostringObrigatório.
routes[].route.segments[].distanceMnumberObrigatório.
routes[].route.segments[].durationSnumberObrigatório.
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[].geometryLineStringObrigatório.
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.vehicleRulesobjectViagens de okada, keke e danfo
routes[].route.vehicleRules.vehiclestringUm de: 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.kindstringUm de: 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[].modestringObrigatório. Um de: taxi, shared_taxi, okada, keke, bus, ridehail, boat.
routes[].route.fares[].servicestring
routes[].route.fares[].currencystringObrigatório. Um de: NGN, GHS, XOF.
routes[].route.fares[].lowintegerObrigatório.
routes[].route.fares[].typicalintegerObrigatório.
routes[].route.fares[].highintegerObrigatório.
routes[].route.fares[].textstringObrigatório.
routes[].route.fares[].perPersonbooleanObrigatório.
routes[].route.fares[].charterbooleanObrigatório.
routes[].route.fares[].nightboolean
routes[].route.fares[].rushboolean
routes[].route.fares[].rainboolean
routes[].route.fares[].basisstringObrigatório. Um de: crowd, guide.
routes[].route.fares[].reportsintegerObrigatório.
routes[].route.fares[].durationSnumberObrigatório.
routes[].route.fares[].openingOfferintegerOnde os preços se regateiam: uma boa primeira oferta.
routes[].route.fares[].sourcesstring (uri)[]
unassignedstring[]Obrigatório.
notAllowedobject[]Paragens, ou partidas e chegadas de veículos, dentro de uma zona de proibição para o modo.
notAllowed[].stopstring
notAllowed[].vehiclestring
notAllowed[].banBanObrigatório.
notAllowed[].ban.idstringObrigatório.
notAllowed[].ban.zonestringObrigatório.
notAllowed[].ban.scopestringObrigatório.
notAllowed[].ban.hoursstring
notAllowed[].ban.sincestring
notAllowed[].ban.sourcestring (uri)
notAllowed[].ban.wherestringUm de: origin, destination, stop, route.
notAllowed[].ban.walkMnumber
durationSnumberObrigatório.
modestringObrigatório.
attributionstringObrigatório.
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"
}

Erros

  • default Erro