Container status with rail moves
Carrier events of a container (the same data as Navo container tracking), with rail:true on events at rail terminals or by train, and rail_events as a count. Events trimmed in the example.
Query parameters
Container number.
Response schema
52 fields
Derived from the example response, nested as the JSON is.
data
The payload. Everything an endpoint returns sits under this key.
Container type, for example 40HC.
Event code, for example DEPA or LOAD.
Current normalised status of the shipment. Ocean lifecycle order: discharged, available, delivered, returned_empty. Two values end a shipment, delivered and returned_empty, and returned_empty outranks delivered.
Carrier name, falling back to the SCAC when we hold no name.
Vessel currently carrying the container, or null when we hold neither a name nor an IMO. Its lat and lng are always null here; the keyed endpoints carry the live position under vessel_position.
IMO number of the vessel.
Origin port name, falling back to its UN/LOCODE.
Destination port name, falling back to its UN/LOCODE.
Arrival time (ISO 8601) of the vessel (the ARRI event) at the port in destination_unlocode: planned until it arrives, actual after (see eta_is_estimated). It is not the discharge (DISC) and not the moment the cargo is ready for pickup. When a line files no arrival event, its discharge at that port stands in. Null when the carrier publishes none and we cannot predict one.
pol
Port of loading UN/LOCODE.
Human-readable name.
Country name.
Latitude.
Longitude.
pod
Port of discharge UN/LOCODE.
Human-readable name.
Country name.
Latitude.
Longitude.
vessel_position
Live AIS position of the carrying vessel. Null when we hold no IMO or no fix yet.
Latitude.
Longitude.
route
The legs in order. Each carries its two endpoints, its geometry and its vessel.
The drawn geometry of the leg as lat and lng pairs. Empty on an inland leg, where we do not draw a line we cannot verify.
Milestone timeline, oldest to newest.
events[]
Event code, for example DEPA or LOAD.
The event in plain words. A non-actual event is tagged "(planned)".
True when the event happened. False means it is planned or estimated, so never read it as a fact.
UN/LOCODE for the event, or null when the carrier gave no place.
place
Event or status code.
Human-readable name.
Country name.
Latitude.
Longitude.
Vessel currently carrying the container, or null when we hold neither a name nor an IMO. Its lat and lng are always null here; the keyed endpoints carry the live position under vessel_position.
Carrier voyage number, when published. Null otherwise.
Errors
A failure carries { "ok": false, "error": { "code", "message", "severity" } }. Branch on the code, and log the message.
No key in Authorization or x-api-key.
The key is unknown or revoked.
Not a container number.
No carrier has events for this container yet.
More than 40 requests in one minute from one client.
A source did not answer. Retry in a minute.
curl 'https://rail.navo24.com/v1/rail/container?ref=MEDU3392382' \
-H "Authorization: Bearer tmcp_YOUR_API_KEY"const res = await fetch("https://rail.navo24.com/v1/rail/container?ref=MEDU3392382", {
headers: {
"Authorization": "Bearer tmcp_YOUR_API_KEY"
}
});
const data = await res.json();import requests
res = requests.get(
"https://rail.navo24.com/v1/rail/container?ref=MEDU3392382",
headers={"Authorization": "Bearer tmcp_YOUR_API_KEY"},
)
data = res.json(){
"data": {
"reference": "MEDU3392382",
"container": "MEDU3392382",
"bl": "MEDUADN51159",
"booking": null,
"size": "20GP",
"type": "Dry",
"status": "in_transit",
"carrier": "MSC",
"vessel": "MSC IRIS",
"imo": "9987378",
"origin_name": "QINGDAO, CN",
"destination_name": "HAMBURG, DE",
"eta": "2026-11-05T00:00:00+00:00",
"updated": "2026-10-29T21:13:46+00:00",
"pol": {
"name": "Qingdao",
"country": "China",
"lat": 36.05229,
"lng": 120.29819
},
"pod": {
"name": "Hamburg",
"country": "Germany",
"lat": 53.55073,
"lng": 9.99302
},
"vessel_position": {
"lat": 49.53715,
"lng": -0.165616666666667,
"at": null
},
"route": {
"path": [
[
120.2982,
36.0523
],
[
120.3411,
36.043
]
]
},
"events": [
{
"type": "GTOT",
"label": "Gate out",
"actual": true,
"passed": false,
"ais_at": null,
"at": "2026-08-21T00:00:00+00:00",
"local": "2026-08-21T00:00:00",
"date_only": true,
"location": "CNTAO",
"place": {
"code": "CNTAO",
"name": "Qingdao",
"country": "China",
"cc": "CN",
"lat": 36.05229,
"lng": 120.29819
},
"vessel": null,
"voyage": null,
"rail": false
},
{
"type": "GTIN",
"label": "Gate in",
"actual": true,
"passed": false,
"ais_at": null,
"at": "2026-09-03T00:00:00+00:00",
"local": "2026-09-03T00:00:00",
"date_only": true,
"location": "CNTAO",
"place": {
"code": "CNTAO",
"name": "Qingdao",
"country": "China",
"cc": "CN",
"lat": 36.05229,
"lng": 120.29819
},
"vessel": null,
"voyage": null,
"rail": false
}
],
"rail_events": 0
}
}