Calculate shipment CO2e
Well-to-wheel CO2e of one shipment with the tank-to-wheel and well-to-tank split, per leg and in total. Distances come from Navo Distance & Time: the real sea route with canals and ECA miles, road and rail networks, air as great circle + 95 km. Every transport_mode and shipping_type of the Freight Rates API is covered. The example is two 40'hc, 36 t of cargo, Shanghai to Rotterdam, with the mode comparison.
Request body
UN/LOCODE, IATA, city, address or "lat,lng". from is accepted too. Not needed when you send distance_km.
Same formats as origin. to is accepted too.
Sea, Air, Road or Rail. The same hierarchy as the Freight Rates API.
Sea: FCL, LCL, Bulk, RoRo. Air: Aircargo, ULD. Road: FTL, LTL, FCL. Rail: FCL, FWL, FTL, LWL. Defaults: Sea FCL, Air Aircargo, Road FTL, Rail FCL. The old Freight Rates values (FCL, LCL, BULK, RORO, AIR with road_type / rail_type) work too.
Container for FCL (20'st, 40'hc... or 20ST, 40HC, 20GP), vehicle for RoRo (Truck, Trailer, Lorry, Van, Car, Plant), ULD type for Air ULD. container_type and vehicle_type are accepted. Default 40'hc / Truck / PMC.
Number of containers, vehicles or ULDs. Default 1.
Cargo gross mass. Required for LCL, Air, Road FTL/LTL and Rail wagons. Optional for FCL and RoRo (GLEC default load per unit is used and marked cargo_basis: default).
Cargo mass in metric tonnes, for Bulk. Wins over weight_kg.
Air only: we return chargeable_kg (1:6000) for reference. CO2e is always on actual mass, as ISO 14083 requires.
Sea legs. safe (default since 27 October 2026): Red Sea closed, Asia, the Gulf and India to Europe round the Cape of Good Hope, as most carriers sail now (about 31% more distance and CO2e on Shanghai to Rotterdam). short: shortest open route via Suez, as in EcoTransIT and most calculators. When the two differ, route_alternative returns the other one.
average (default), electric or diesel.
Air only: unknown (default, 55% belly / 45% freighter), freighter or belly.
Bulk only: the vessel deadweight, picks the GLEC bulk carrier class. Without it the class follows the cargo size (navo_assumption).
Skip routing and use your own distance (one leg of transport_mode). Air adds the GLEC 95 km.
Primary data from your carrier, g CO2e per t km (per TEU km for Sea FCL) by leg mode: {"SEA": 61.5}. The leg then says source: client primary data.
Also calculate the same cargo by Sea, Rail, Road and Air on the same lane. Adds compare[] with vs_lowest.
Return each leg geometry as [[lat, lng], ...] for a map. Default false.
Response schema
100 fields
Derived from the example response, nested as the JSON is.
data
The payload. Everything an endpoint returns sits under this key.
How the position was produced, for example route_reckoning.
query
Origin code (airport IATA or UN/LOCODE).
Destination code (airport IATA or UN/LOCODE).
Mode the source named for the move. Null when it named none.
Third level of the rates transport hierarchy: a container (40'hc), a RoRo vehicle (Truck) or an air ULD (AKE, PMC, PAG). Null for LCL, LTL, LWL, Bulk and Aircargo.
Vessel capacity in TEU.
from
Human-readable name.
UN/LOCODE of the place.
carrier_event when a carrier filed it, trackingmcp_inference when we derived the step from surrounding events.
ISO 3166-1 alpha-2 country code.
Country name.
Latitude.
Longitude.
to
Human-readable name.
UN/LOCODE of the place.
carrier_event when a carrier filed it, trackingmcp_inference when we derived the step from surrounding events.
ISO 3166-1 alpha-2 country code.
Country name.
Latitude.
Longitude.
totals
co2e_kg
The voyage broken into legs. Empty when we cannot yet split it.
legs[]
Mode the source named for the move. Null when it named none.
from
Human-readable name.
UN/LOCODE of the place.
carrier_event when a carrier filed it, trackingmcp_inference when we derived the step from surrounding events.
ISO 3166-1 alpha-2 country code.
Latitude.
Longitude.
to
Human-readable name.
UN/LOCODE of the place.
carrier_event when a carrier filed it, trackingmcp_inference when we derived the step from surrounding events.
ISO 3166-1 alpha-2 country code.
Latitude.
Longitude.
emissions
intensity
Where the answer on this call came from: direct_carrier or warm_db.
co2e_kg
Your own free-text note on this box. Null when you have written none.
route
The legs in order. Each carries its two endpoints, its geometry and its vessel.
The event in plain words. A non-actual event is tagged "(planned)".
passages[]
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.
Human-readable name.
eca
zones[]
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.
Human-readable name.
compare[]
Mode the source named for the move. Null when it named none.
co2e_kg
The legs in order. Each carries its two endpoints, its geometry and its vessel.
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.
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.
transport_mode is not Sea, Air, Road or Rail.
shipping_type does not exist for this mode.
Unknown container, RoRo vehicle or ULD.
LCL, Bulk, Air, Road FTL/LTL or a Rail wagon without weight_kg / weight_mt.
origin or destination could not be resolved.
No route by this mode between the points.
More than 120 requests in one minute for one key.
Distance & Time did not answer. Retry shortly.
Method
ISO 14083:2023 activity based: emissions = activity x intensity, well-to-wheel (WTW = TTW + WTT). Default intensities come from the GLEC Framework v3.2 (Smart Freight Centre, October 2025), Module 2 section 3, each row with its table (factor_set glec-3.2-navo-2026.10). Sea FCL and LCL use the CCWG trade lane of the port pair. Region for road and rail comes from the leg ends. Rows marked navo_assumption are our choice of class where GLEC gives several (LTL, inland vessel size, Ro-Ro size, bulk size without vessel_dwt, part wagon, block train). Carrier primary data always beats a default: send it as intensity_override.
Reporting
Quote the figure with its method, factor_set and distance_source. Results are estimates for Scope 3 category 4 or 9 reporting, not verified carrier figures.
Transport hierarchy and how each type is calculated
transport_mode, then shipping_type, then transport_unit, the same levels as the Freight Rates API. Activity is tonne km (TEU km for Sea FCL) times a GLEC v3.2 default intensity.
| transport_mode | shipping_type | transport_unit | Activity and intensity |
|---|---|---|---|
| Sea | FCL | 20'st, 40'st, 40'hc, 45'hc, 20'rf, 40'rf | TEU km x CCWG trade lane intensity (GLEC Tables 18-19, 32 lanes, dry or reefer); industry average 71.7 / 142.3 when the lane is unknown |
| Sea | LCL | none | t km x the same trade lane intensity per tonne (10 t per TEU) |
| Sea | Bulk | none | t km x bulk carrier class by vessel_dwt, or by cargo size; weight_mt (GLEC Table 14) |
| Sea | RoRo | Truck, Trailer, Lorry, Van, Car, Plant | t km (gross) x Ro-Ro intensity, Car = vehicle carrier (GLEC Table 17) |
| Air | Aircargo | none | t km, great circle + 95 km, short haul under 1,500 km / long haul (GLEC Table 1); aircraft: unknown, freighter, belly |
| Air | ULD | AKE, PMC, PAG | as Aircargo, weight_kg required |
| Road | FTL | none | t km x artic truck 34-40 t by region: Europe / South America, North America, China, India; Asia and Africa x1.22 |
| Road | LTL | none | t km x part load truck by region |
| Road | FCL | 20'st, 40'st, 40'hc, 20'rf, 40'rf | t km (cargo + tare) x container truck by region; reefer x1.12 |
| Rail | FCL | 20'st, 40'st, 40'hc, 45'hc, 20'rf, 40'rf | t km (cargo + tare) x container train (GLEC Tables 4-5), rail_traction; US and India averages; reefer x1.12 |
| Rail | FWL | none | t km x rail intensity by region and traction |
| Rail | FTL | none | block train, rail intensity x0.9 |
| Rail | LWL | none | part wagon, rail intensity x1.25 |
curl -X POST 'https://api.navo24.com/v1/carbon/calculate' \
-H "Authorization: Bearer tmcp_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"origin":"CNSHA","destination":"NLRTM","transport_mode":"Sea","shipping_type":"FCL","transport_unit":"40'hc","units":2,"weight_kg":36000,"compare":true}'const res = await fetch("https://api.navo24.com/v1/carbon/calculate", {
method: "POST",
headers: {
"Authorization": "Bearer tmcp_YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
"origin": "CNSHA",
"destination": "NLRTM",
"transport_mode": "Sea",
"shipping_type": "FCL",
"transport_unit": "40'hc",
"units": 2,
"weight_kg": 36000,
"compare": true
})
});
const data = await res.json();import requests
res = requests.post(
"https://api.navo24.com/v1/carbon/calculate",
headers={"Authorization": "Bearer tmcp_YOUR_API_KEY"},
json={
"origin": "CNSHA",
"destination": "NLRTM",
"transport_mode": "Sea",
"shipping_type": "FCL",
"transport_unit": "40'hc",
"units": 2,
"weight_kg": 36000,
"compare": True
},
)
data = res.json(){
"data": {
"request_id": "co2_3b9e0c51d2a84f17",
"method": "ISO 14083:2023, GLEC Framework v3.2 (Oct 2025) Module 2 default intensities, well-to-wheel",
"factor_set": "glec-3.2-navo-2026.10",
"scope": "Scope 3, category 4/9 (upstream / downstream transport)",
"query": {
"origin": "CNSHA",
"destination": "NLRTM",
"transport_mode": "Sea",
"shipping_type": "FCL",
"transport_unit": "40'hc",
"notation": "Sea-FCL-40'hc",
"units": 2,
"teu": 4.0,
"cargo_t": 36.0,
"cargo_basis": "declared"
},
"from": {
"name": "Shanghai",
"locode": "CNSHA",
"kind": "port",
"country_code": "CN",
"country": "China",
"lat": 31.40009,
"lng": 121.49711
},
"to": {
"name": "Rotterdam",
"locode": "NLRTM",
"kind": "port",
"country_code": "NL",
"country": "Netherlands",
"lat": 51.90438,
"lng": 4.44245
},
"totals": {
"co2e_kg": {
"wtw": 3686.7,
"ttw": 3034.15,
"wtt": 652.55
},
"co2e_t": 3.687,
"distance_km": 19610.1,
"intensity_g_per_tkm": 5.22,
"co2e_kg_per_unit": 1843.35
},
"legs": [
{
"transport_mode": "SEA",
"from": {
"name": "Shanghai",
"locode": "CNSHA",
"kind": "port",
"country_code": "CN",
"lat": 31.40009,
"lng": 121.49711
},
"to": {
"name": "Rotterdam",
"locode": "NLRTM",
"kind": "port",
"country_code": "NL",
"lat": 51.90438,
"lng": 4.44245
},
"distance_km": 19610.1,
"distance_source": "Navo Distance & Time, sea route",
"emissions": {
"activity": 78440.4,
"activity_unit": "TEU km",
"intensity": {
"value": 47.0,
"unit": "g CO2e / TEU km",
"class": "Container ship, Asia to-from North Europe (dry)",
"source": "GLEC Framework v3.2, Module 2 §3, Table 18, trade lane Asia to-from North Europe, Dry",
"factor_id": "sea_lane_asia_neu_dry",
"navo_assumption": false
},
"co2e_kg": {
"wtw": 3686.7,
"ttw": 3034.15,
"wtt": 652.55
},
"notes": [
"trade lane Asia to-from North Europe"
]
}
}
],
"route": {
"label": "Sea",
"passages": [
{
"id": "suez",
"name": "Suez Canal"
},
{
"id": "malacca",
"name": "Strait of Malacca"
},
{
"id": "babalmandab",
"name": "Bab-el-Mandeb"
},
{
"id": "gibraltar",
"name": "Strait of Gibraltar"
}
],
"eca": {
"nm": 2340.5,
"non_eca_nm": 8248.1,
"share": 0.221,
"zones": [
{
"id": "north-sea",
"name": "North Sea ECA",
"nm": 405.7
}
]
}
},
"took_ms": 0,
"compare": [
{
"transport_mode": "Sea",
"notation": "Sea-FCL-40'hc",
"co2e_kg": {
"wtw": 3686.7,
"ttw": 3034.15,
"wtt": 652.55
},
"distance_km": 19610.1,
"intensity_g_per_tkm": 5.22,
"route": "Sea",
"status": "ok",
"vs_lowest": 1.0
},
{
"transport_mode": "Rail",
"notation": "Rail-FCL-40'hc",
"co2e_kg": {
"wtw": 8239.83,
"ttw": 4012.8,
"wtt": 4227.03
},
"distance_km": 11001.4,
"intensity_g_per_tkm": 20.81,
"route": "Rail",
"status": "ok",
"vs_lowest": 2.24
},
{
"transport_mode": "Road",
"notation": "Road-FCL-40'hc",
"co2e_kg": {
"wtw": 38120.04,
"ttw": 29238.07,
"wtt": 8881.97
},
"distance_km": 10763.3,
"intensity_g_per_tkm": 98.38,
"route": "Road",
"status": "ok",
"vs_lowest": 10.34
},
{
"transport_mode": "Air",
"notation": "Air-Aircargo",
"co2e_kg": {
"wtw": 255810.22,
"ttw": 212066.67,
"wtt": 43743.55
},
"distance_km": 9017.6,
"intensity_g_per_tkm": 788.0,
"route": "Air",
"status": "ok",
"vs_lowest": 69.39
}
]
}
}