Skip to content
Navo24 Navo24
GETAPI key

Door-to-door chain

GETapi.navo24.com/v1/distance/multimodal

Give two places and the modes you accept. The API picks the ports, rail terminals and airports, routes each leg on its own network, adds handling at every transfer and returns the best chain plus the other feasible ones. The example is a Dongguan factory to Warsaw with sea, rail and road allowed; section geometry is left out and one alternative is shown.

Query parameters

fromstringrequired

Any form from the Locations table, usually a factory or warehouse address.

tostringrequired

Same forms as from.

modesstring

Comma-separated SEA,ROAD,RAIL,AIR,RIVER. Default all five. A chain uses only these.

optimizestring

cost (default), time or distance. Sets the order of route and alternatives.

polstring

Fix the port of loading by UN/LOCODE. Otherwise the API chooses.

podstring

Fix the port of discharge, e.g. PLGDN.

speed_knotsnumber

Sea leg speed, 3 to 40. Default 14.

routing_modestring

Sea leg routing, short or safe.

avoidstring

Passages to close on the sea leg.

alternativesboolean

Other feasible chains in alternatives[]. Default true for ROAD, RAIL, AIR and /multimodal.

handlingboolean

Add terminal handling at each transfer: port 24 h, rail terminal 12 h, airport 12 h, river port 18 h. Default true.

pathboolean

Geometry per section as [lat, lng] pairs. Road sections also give ferry_paths as lines.

datestring

Departure date YYYY-MM-DD for the seasonal river rules. Default today (UTC). Only river legs depend on it.

seasonalboolean

false switches the seasonal river rules off: no closures, no slow-downs, no seasonal_notes. Default true.

Response schema

19 fields

Nested exactly as the JSON is. Open a branch to read its fields; hover a name for the full dot-path.

dataobject
from / dataobject
toobject

The resolved points: kind (port, airport, country, address, coordinates), name, locode or iata, country_code, lat, lng.

transport_modes[]array

The modes you allowed.

routeobject
labelstring

Chain type: Sea, Rail, Air, Road, River (road, barge, road) or Sea + River (sea to a river-mouth gateway, then barge).

transport_modes[]array

The modes the chain actually uses, in order.

summaryobject
distanceobject

Total km and nm for the chain.

durationobject

Total hours and days. duration.hours = moving_hours + handling_hours.

cost_indexnumber

Relative cost in thousands of km-equivalents at SEA 1, RIVER 1.8, RAIL 3, ROAD 6, AIR 40 per km. For ranking, not a price.

sections[]array

Legs in order: transport_mode, from, to, distance, duration, path. SEA legs add speed_knots, via, eca and passages. ROAD legs add driving_hours and ferry_paths. RIVER legs add the fields below.

speed_kmhnumber

RIVER: average speed over ground for this leg, current and locks included.

currentobject

RIVER: km sailed with the current (downstream_km), against it (upstream_km) and on still water such as canals, lakes and tidal reaches (slack_water_km).

locksinteger

RIVER: lock sites passed. lock_hours is the time they add, already inside duration.

waterways[]array

RIVER: named waterways on the leg, longest first, as name, km and class (CEMT class in Europe).

seasonal[]array

RIVER: seasonal rules that touch this leg on the requested date, with the km affected.

attributionstring

RIVER: credit line for the waterway data this leg was built from. Show it wherever you display the leg.

transfers[]array

Each change of mode: at (port, rail terminal or airport), from_mode, to_mode, hours.

estimatedboolean

true when a road leg was estimated from straight-line distance because road routing was briefly unavailable.

alternatives[]array

Other feasible chains, same shape, in the order set by optimize.

datestring

Present when RIVER is allowed: the date the seasonal rules were applied for.

seasonal_notes[]array

Seasonal river rules that changed the answer: id, kind (closure, ice_risk, low_water), note, typical_window, source, then time_factor for a slow-down or reopens_about for a closure, and effect: no_route (the river chain is gone), detour (it goes round the closed stretch) or slower.

Errors

A failure answers with an HTTP error status and { "error": { "code", "message" } }. Branch on the code, and log the message.

invalid_request400

A parameter is missing or malformed: an unknown mode, speed_knots outside 3 to 40, an unknown passage in avoid, a pol/pod that is not a sea port, or a date that is not YYYY-MM-DD.

location_not_found404

The location is well formed but we cannot place it: an unknown code, or an address the geocoder does not find.

no_route422

No route joins the two points with the modes and passages you allowed, for example SEA only between two inland cities. When a seasonal river closure is the cause, the message names each closure, its typical window and the date it usually reopens.

geocoder_unavailable503

Free-text address lookup is briefly down. Codes and coordinates keep working.

Sea chain

The five closest main container ports on each side are paired, the pairs ranked by sea distance plus the inland legs, and the best three routed in full. Inland legs go by rail when rail is allowed and the port is more than 250 km away, otherwise by road.

River and Sea + River chains

River: road to a river port, barge, road from a river port. Sea + River: sea to a gateway at a river mouth, then barge inland (or the reverse). Sea + River is dropped when it is more than 1.3 times the River km or not at least 3 % shorter than River, more than 2.5 times the great circle while a direct chain exists, more than 1.6 times the shortest chain without air, or more than half road and rail access. Seasonal closures on the requested date remove river stretches, see Inland waterways.

Rail, air and road chains

Rail: road to the nearest railhead within 150 km, rail, road from the railhead. Air: road to one of the two closest large cargo airports within 600 km, flight, road to the door. Road: direct truck route, ferries included.

What the times include

Moving time per leg and handling at each transfer. Timetables, border queues, customs and cut-offs are not modelled: these are planning estimates.

curl 'https://api.navo24.com/v1/distance/multimodal?from=Dongguan%2C%20China&to=Warsaw%2C%20Poland&modes=SEA%2CRAIL%2CROAD&date=2026-10-17' \
  -H "Authorization: Bearer tmcp_YOUR_API_KEY"
Response
{
  "data": {
    "from": {
      "kind": "address",
      "name": "Dongguan",
      "country_code": "CN",
      "lat": 23.01836,
      "lng": 113.74523
    },
    "to": {
      "kind": "address",
      "name": "Warsaw",
      "country_code": "PL",
      "lat": 52.23337,
      "lng": 21.07115
    },
    "transport_modes": [
      "SEA",
      "RAIL",
      "ROAD"
    ],
    "optimize": "cost",
    "route": {
      "label": "Sea",
      "transport_modes": [
        "ROAD",
        "SEA",
        "RAIL"
      ],
      "summary": {
        "distance": {
          "km": 20206.8,
          "nm": 10910.8,
          "meters": 20206800
        },
        "duration": {
          "hours": 825.2,
          "days": 34.38,
          "seconds": 2970720
        },
        "moving_hours": 777.2,
        "handling_hours": 48.0,
        "speed_kmh": 24.49,
        "cost_index": 20.99
      },
      "sections": [
        {
          "transport_mode": "ROAD",
          "from": {
            "kind": "address",
            "name": "Dongguan",
            "country_code": "CN",
            "lat": 23.01836,
            "lng": 113.74523
          },
          "to": {
            "kind": "port",
            "name": "Dongguan",
            "locode": "CNDGG",
            "country_code": "CN",
            "lat": 23.04797,
            "lng": 113.74146
          },
          "distance": {
            "km": 6.0,
            "nm": 3.2,
            "meters": 5951
          },
          "duration": {
            "hours": 0.1,
            "days": 0.01,
            "seconds": 533
          },
          "driving_hours": 0.1
        },
        {
          "transport_mode": "SEA",
          "from": {
            "kind": "port",
            "name": "Dongguan",
            "locode": "CNDGG",
            "country_code": "CN",
            "lat": 23.04797,
            "lng": 113.74146
          },
          "to": {
            "kind": "port",
            "name": "Kaliningrad",
            "locode": "RUKGD",
            "country_code": "RU",
            "lat": 54.65159,
            "lng": 20.33569
          },
          "distance": {
            "km": 19825.6,
            "nm": 10705.0,
            "meters": 19825600
          },
          "duration": {
            "hours": 764.6,
            "days": 31.86,
            "seconds": 2752560
          },
          "speed_knots": 14.0,
          "via": "via Suez Canal",
          "eca": {
            "nm": 3193.8,
            "non_eca_nm": 7511.2,
            "share": 0.2983,
            "zones": [
              {
                "id": "north-sea",
                "name": "North Sea ECA",
                "nm": 814.5
              },
              {
                "id": "baltic",
                "name": "Baltic Sea ECA",
                "nm": 444.5
              },
              {
                "id": "mediterranean",
                "name": "Mediterranean Sea ECA",
                "nm": 1934.8
              }
            ]
          },
          "passages": [
            {
              "id": "suez",
              "name": "Suez Canal"
            },
            {
              "id": "malacca",
              "name": "Strait of Malacca"
            },
            {
              "id": "babalmandab",
              "name": "Bab-el-Mandeb"
            },
            {
              "id": "gibraltar",
              "name": "Strait of Gibraltar"
            }
          ]
        },
        {
          "transport_mode": "RAIL",
          "from": {
            "kind": "rail_terminal",
            "lat": 54.64694,
            "lng": 20.33833
          },
          "to": {
            "kind": "rail_terminal",
            "lat": 52.24545,
            "lng": 21.05261
          },
          "distance": {
            "km": 375.2,
            "nm": 202.6,
            "meters": 375220
          },
          "duration": {
            "hours": 12.5,
            "days": 0.52,
            "seconds": 45026
          }
        }
      ],
      "transfers": [
        {
          "at": {
            "kind": "port",
            "name": "Dongguan",
            "locode": "CNDGG",
            "country_code": "CN",
            "lat": 23.04797,
            "lng": 113.74146
          },
          "from_mode": "ROAD",
          "to_mode": "SEA",
          "hours": 24.0
        },
        {
          "at": {
            "kind": "port",
            "name": "Kaliningrad",
            "locode": "RUKGD",
            "country_code": "RU",
            "lat": 54.65159,
            "lng": 20.33569
          },
          "from_mode": "SEA",
          "to_mode": "RAIL",
          "hours": 24.0
        }
      ],
      "estimated": false
    },
    "alternatives": [
      {
        "label": "Rail",
        "transport_modes": [
          "ROAD",
          "RAIL"
        ],
        "summary": {
          "distance": {
            "km": 10386.6,
            "nm": 5608.3,
            "meters": 10386600
          },
          "duration": {
            "hours": 358.0,
            "days": 14.92,
            "seconds": 1288800
          },
          "moving_hours": 346.0,
          "handling_hours": 12.0,
          "speed_kmh": 29.01,
          "cost_index": 31.21
        },
        "sections": [
          {
            "transport_mode": "ROAD",
            "from": {
              "kind": "address",
              "name": "Dongguan",
              "country_code": "CN",
              "lat": 23.01836,
              "lng": 113.74523
            },
            "to": {
              "kind": "rail_terminal",
              "lat": 23.0975,
              "lng": 113.84695
            },
            "distance": {
              "km": 17.6,
              "nm": 9.5,
              "meters": 17590
            },
            "duration": {
              "hours": 0.4,
              "days": 0.01,
              "seconds": 1275
            },
            "driving_hours": 0.4
          },
          {
            "transport_mode": "RAIL",
            "from": {
              "kind": "rail_terminal",
              "lat": 23.0975,
              "lng": 113.84695
            },
            "to": {
              "kind": "rail_terminal",
              "lat": 52.24545,
              "lng": 21.05261
            },
            "distance": {
              "km": 10369.0,
              "nm": 5598.8,
              "meters": 10368985
            },
            "duration": {
              "hours": 345.6,
              "days": 14.4,
              "seconds": 1244278
            }
          }
        ],
        "transfers": [
          {
            "at": {
              "kind": "rail_terminal",
              "lat": 23.0975,
              "lng": 113.84695
            },
            "from_mode": "ROAD",
            "to_mode": "RAIL",
            "hours": 12.0
          }
        ],
        "estimated": false
      }
    ]
  },
  "meta": {
    "took_ms": 897
  }
}