Seasonal closures
Rivers freeze and run low. Pass the departure date and the API applies 55 seasonal rules for that day. The example is Astrakhan to Moscow on 2027-01-15 with RIVER and RAIL allowed: the Volga and the Moscow Canal are closed by ice, so the answer is the rail chain and seasonal_notes says why and when the river reopens.
Query parameters
Any form from the Locations table.
Any form from the Locations table.
Allowed modes. With RIVER alone and every river stretch closed, the call answers 422 no_route.
Departure date, YYYY-MM-DD. Default today (UTC).
false ignores the seasonal rules.
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.
data
from / data
The resolved points: kind (port, airport, country, address, coordinates), name, locode or iata, country_code, lat, lng.
The modes you allowed.
route
Chain type: Sea, Rail, Air, Road, River (road, barge, road) or Sea + River (sea to a river-mouth gateway, then barge).
The modes the chain actually uses, in order.
summary
Total km and nm for the chain.
Total hours and days. duration.hours = moving_hours + handling_hours.
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[]
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.
RIVER: average speed over ground for this leg, current and locks included.
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).
RIVER: lock sites passed. lock_hours is the time they add, already inside duration.
RIVER: named waterways on the leg, longest first, as name, km and class (CEMT class in Europe).
RIVER: seasonal rules that touch this leg on the requested date, with the km affected.
RIVER: credit line for the waterway data this leg was built from. Show it wherever you display the leg.
Each change of mode: at (port, rail terminal or airport), from_mode, to_mode, hours.
true when a road leg was estimated from straight-line distance because road routing was briefly unavailable.
Other feasible chains, same shape, in the order set by optimize.
Present when RIVER is allowed: the date the seasonal rules were applied for.
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.
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.
The location is well formed but we cannot place it: an unknown code, or an address the geocoder does not find.
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.
Free-text address lookup is briefly down. Codes and coordinates keep working.
When nothing else is allowed
Same trip with modes=RIVER only: 422 no_route, message "No route connects these points with the transport modes allowed. Seasonal closure on 2027-01-15: Volga ice season (upper and middle Volga) (typical 20 Nov - 20 Apr, reopens about 2027-04-21); Lower Volga ice season (typical 15 Dec - 20 Mar, reopens about 2027-03-21); Moscow Canal winter closure (typical 20 Nov - 25 Apr, reopens about 2027-04-26)."
mode=RIVER on /route
Single-mode /route with RIVER also allows road for the access legs, so a full closure falls back to the road chain with seasonal_notes instead of a 422.
Seasonal rule kinds
Windows are typical, taken from waterway authority calendars and marked as estimates in source. They are not live ice or gauge readings.
| kind | Effect |
|---|---|
| closure | The stretch is removed for that date. The River chain is dropped (effect no_route) or goes round (detour). Carries reopens_about. |
| ice_risk | Time on the stretch ×time_factor, effect slower. |
| low_water | Time on the stretch ×time_factor, effect slower. Draft and part loads are not modelled. |
curl 'https://api.navo24.com/v1/distance/multimodal?from=RUASF&to=RUMOW&modes=RIVER%2CRAIL&date=2027-01-15' \
-H "Authorization: Bearer tmcp_YOUR_API_KEY"const res = await fetch("https://api.navo24.com/v1/distance/multimodal?from=RUASF&to=RUMOW&modes=RIVER%2CRAIL&date=2027-01-15", {
headers: {
"Authorization": "Bearer tmcp_YOUR_API_KEY"
}
});
const data = await res.json();import requests
res = requests.get(
"https://api.navo24.com/v1/distance/multimodal?from=RUASF&to=RUMOW&modes=RIVER%2CRAIL&date=2027-01-15",
headers={"Authorization": "Bearer tmcp_YOUR_API_KEY"},
)
data = res.json() {
"data": {
"from": {
"kind": "port",
"locode": "RUASF",
"name": "Astrakhan",
"country": "Russia",
"country_code": "RU",
"lat": 46.37709,
"lng": 48.05431
},
"to": {
"kind": "port",
"locode": "RUMOW",
"name": "Moskva",
"country": "Russia",
"country_code": "RU",
"lat": 55.75,
"lng": 37.6
},
"transport_modes": [
"RIVER",
"RAIL"
],
"optimize": "cost",
"routing_mode": "short",
"avoided": [],
"route": {
"label": "Rail",
"transport_modes": [
"RAIL"
],
"summary": {
"distance": {
"km": 1480.1,
"nm": 799.2,
"meters": 1480100
},
"duration": {
"hours": 49.3,
"days": 2.05,
"seconds": 177480
},
"moving_hours": 49.3,
"handling_hours": 0,
"speed_kmh": 30.02,
"cost_index": 4.44
},
"sections": [
{
"transport_mode": "RAIL",
"distance": {
"km": 1480.1,
"nm": 799.2,
"meters": 1480091
},
"duration": {
"hours": 49.3,
"days": 2.06,
"seconds": 177611
},
"estimated": false,
"from": {
"lat": 46.375,
"lng": 48.07639,
"kind": "rail_terminal"
},
"to": {
"lat": 55.76083,
"lng": 37.6325,
"kind": "rail_terminal"
}
}
],
"transfers": [],
"estimated": false
},
"alternatives": [],
"date": "2027-01-15",
"seasonal_notes": [
{
"id": "volga_upper",
"kind": "closure",
"note": "Volga ice season (upper and middle Volga)",
"typical_window": "20 Nov - 20 Apr",
"source": "estimate: Rosmorrechflot basin administrations, Volga season usually late Apr - mid/late Nov",
"km": 2378.2,
"reopens_about": "2027-04-21",
"effect": "no_route"
},
{
"id": "volga_lower",
"kind": "closure",
"note": "Lower Volga ice season",
"typical_window": "15 Dec - 20 Mar",
"source": "estimate: Volgo-Kaspiysky basin, lower Volga ice usually mid Dec - mid Mar",
"km": 431.1,
"reopens_about": "2027-03-21",
"effect": "no_route"
},
{
"id": "moscow_canal",
"kind": "closure",
"note": "Moscow Canal winter closure",
"typical_window": "20 Nov - 25 Apr",
"source": "estimate: FBU Kanal imeni Moskvy, navigation usually late Apr - mid/late Nov",
"km": 122.8,
"reopens_about": "2027-04-26",
"effect": "no_route"
}
]
},
"meta": {
"took_ms": 384
}
}