Portfolio summary
One roll-up of your whole book: how many are active, how many in exception, how many arrive this week, and the money at risk. The container list beside the counts is the filtered slice, so a filter narrows the list without changing the counts. One quirk worth knowing: the id on a summary row is the container number, not the UUID the other endpoints use.
Counted: REST: 1 call per keyed request, whatever the route answers; a quota refusal is not counted. MCP: 10 Navo Tokens per reference that carries data; an empty answer is free. See what counts as a successful request.
Query parameters
Which slice the containers array carries: all (default), exceptions, arriving_soon or demurrage_risk. The four counts always describe the whole book.
Response schema
15 fields
Derived from the example response, nested as the JSON is.
The response contract this build answers, as a date. Pin it in your client and nothing in the shape below moves under you.
Whether the request succeeded.
data
The payload. Everything an endpoint returns sits under this key.
Containers you are tracking, excluding archived ones.
Count of shipments in an exception state: customs hold, rolled, delayed or at transshipment.
Count with an ETA in the next seven days.
Demurrage already accrued across the book, in USD.
Tracked containers on the account.
containers[]
Stable identifier for the record. On the tracking endpoints this is the container UUID, except on a portfolio summary row, where it is the container number.
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.
Arrival time (ISO 8601). Null when the carrier publishes none and we cannot predict one. When the line gave only a date, this reads 00:00 UTC on that date, which is padding, and some real ETAs also fall exactly on 00:00 UTC: eta_local tells them apart (a bare YYYY-MM-DD for a date, a time for a real ETA). Take the day from eta_local rather than converting this instant (west of UTC a padded date shows the day before).
The ETA on the destination port's own clock, with no offset: YYYY-MM-DDTHH:MM:SS, or a bare YYYY-MM-DD when the line gave a date and no time. A bare date is how to tell a date-only ETA. We read an ETA at exactly 00:00 UTC as a date unless the line stated a time for that moment at the destination. Null when we cannot place the destination port.
The IANA time zone of the destination port (for example Europe/Amsterdam), to label eta_local. Null when eta_local is.
Name of the carrying vessel, or null when the carrier named none.
IMO number of the carrying vessel, or null when unknown.
Errors
A failure carries { "ok": false, "error": { "code", "message", "severity" } }. Branch on the code, and log the message.
The key is missing, malformed or revoked.
MCP calls on Navo Tokens only: your balance cannot pay for this call. Nothing is charged and no data is returned. Besides code and message, the error carries credits_required, credits_balance, top_up_url and packages (see Navo Tokens on the TrackingMCP reference page). A REST call on your API key never meets this.
We could not read your book. Retry.
curl 'https://api.navo24.com/v1/tracking/containers/summary' \
-H "Authorization: Bearer tmcp_YOUR_API_KEY"const res = await fetch("https://api.navo24.com/v1/tracking/containers/summary", {
headers: {
"Authorization": "Bearer tmcp_YOUR_API_KEY"
}
});
const data = await res.json();import requests
res = requests.get(
"https://api.navo24.com/v1/tracking/containers/summary",
headers={"Authorization": "Bearer tmcp_YOUR_API_KEY"},
)
data = res.json(){
"api_version": "2026-08-04",
"ok": true,
"data": {
"total_active": 47,
"exceptions": 4,
"arriving_this_week": 6,
"demurrage_risk_usd": 0,
"containers": [
{
"id": "MEDU1234562",
"status": "discharged",
"eta": "2026-10-21T00:00:00+00:00",
"eta_local": "2026-10-21",
"eta_timezone": "Europe/Amsterdam",
"vessel_name": null,
"vessel_imo": null
}
]
}
}