Spot rates for a lane
Marketplace spot rates for a port pair, refreshed daily. fcl has one entry per offer with 20ST, 40ST and 40HC prices side by side; lcl is a ladder by shipment size. covers says whether origin and destination charges are in the price, so compare offers with the same covers only. A lane asked for the first time answers state: queued with empty lists and fills within the hour. Prices are USD and indicative.
Query parameters
Port of loading UN/LOCODE.
Port of discharge UN/LOCODE.
Cargo volume, m3, for an LCL band. Give with kg.
Cargo weight, kg, for an LCL band. Give with cbm.
Response schema
32 fields
Derived from the example response, nested as the JSON is.
data
The payload. Everything an endpoint returns sits under this key.
Port of loading UN/LOCODE.
Port of discharge UN/LOCODE.
Why the field stands where it does: resolved, contract_required, not_published, not_applicable or awaiting_carrier.
fcl[]
Where the answer on this call came from: direct_carrier or warm_db.
Carrier name, falling back to the SCAC when we hold no name.
prices_usd
Port-to-port transit in days.
Departure of the consignment as a pair: the estimate and the actual. Read actual before treating a flight as flown.
lcl
bands[]
Port-to-port transit in days.
Where the answer on this call came from: direct_carrier or warm_db.
Your own free-text note on this box. Null when you have written none.
Errors
A failure carries { "ok": false, "error": { "code", "message", "severity" } }. Branch on the code, and log the message.
pol or pod missing or not a UN/LOCODE.
No key sent.
The organisation has no active freightrates entitlement.
curl 'https://api.navo24.com/v1/rates/lane/spot?pol=CNSHA&pod=NLRTM' \
-H "Authorization: Bearer tmcp_YOUR_API_KEY"const res = await fetch("https://api.navo24.com/v1/rates/lane/spot?pol=CNSHA&pod=NLRTM", {
headers: {
"Authorization": "Bearer tmcp_YOUR_API_KEY"
}
});
const data = await res.json();import requests
res = requests.get(
"https://api.navo24.com/v1/rates/lane/spot?pol=CNSHA&pod=NLRTM",
headers={"Authorization": "Bearer tmcp_YOUR_API_KEY"},
)
data = res.json(){
"data": {
"pol": "CNSHA",
"pod": "NLRTM",
"state": "watching",
"fetched_at": "2026-11-01T20:46:52.772335+00:00",
"fcl": [
{
"source": "navo24",
"carrier": null,
"prices_usd": {
"20ST": 1610,
"40ST": 2560,
"40HC": 2560
},
"transit_days": 60,
"departure": null,
"valid_until": "2026-11-04",
"covers": "ocean_freight_only",
"details": "Port-to-port ocean freight, origin/destination port charges excluded",
"badge": "live",
"source_url": null
},
{
"source": "navo24",
"carrier": "OOCL",
"prices_usd": {
"20ST": 2159,
"40ST": 3209,
"40HC": null
},
"transit_days": 48,
"departure": "2026-11-08",
"valid_until": "2026-11-09",
"covers": "ocean_freight_only",
"details": "1x 20ST, port-to-port CNSHA -> NLRTM, ocean freight service LL3, direct; local charges (THC, DOC etc.) not included",
"badge": "live",
"source_url": null
}
],
"lcl": {
"reference_kg_per_m3": 500,
"bands": [
{
"up_to_wm": 1,
"from_usd": 159,
"per_wm_usd": 159,
"offers": 7,
"transit_days": [
29,
65
],
"valid_until": "2026-11-14",
"source": "navo24",
"covers": "ocean_freight_only"
},
{
"up_to_wm": 3,
"from_usd": 385.98,
"per_wm_usd": 129,
"offers": 3,
"transit_days": [
29,
65
],
"valid_until": "2026-11-14",
"source": "navo24",
"covers": "ocean_freight_only"
},
{
"up_to_wm": 10,
"from_usd": 1150,
"per_wm_usd": 115,
"offers": 3,
"transit_days": [
29,
65
],
"valid_until": "2026-11-14",
"source": "navo24",
"covers": "ocean_freight_only"
}
],
"estimate": null
},
"notes": [
"Prices are USD per container (FCL) or per shipment (LCL) as each source quotes them. Sources do not all quote the same basis: `covers` says whether origin and destination charges are in the price, so compare only offers with the same `covers`.",
"LCL is priced per shipment and falls steeply per cubic metre as the shipment grows; 1 W/M is 1 m3 or 1 tonne, whichever is greater. A band price is for the whole band, not an interpolation."
]
}
}