Freight CO₂e following the GLEC Framework and ISO 14083
Carbonara calculates the greenhouse gas emissions of freight transport following the approach of the GLEC Framework v3.2 (Smart Freight Centre, 2025) and ISO 14083:2023. It is source-available (PolyForm Noncommercial) at https://github.com/majidkabir/carbonara; this MCP server is the public service at https://carbonara-co2.org calling it. It is not certified or verified against ISO 14083: its results are calculations for the user's own reporting process.
with_rf.weight_kg; or teu with teu_net_tonnes (net cargo tonnes per TEU) or a container_load profile from the dataset. No container tare weight is added.mode (road, rail, sea, air, inland_waterway), vehicle_type (a short alias such as hgv or a full dataset id; see list_vehicle_types), and where it goes: from and to as {"lat", "lon"} (optionally "name") or {"code": "NLRTM"} (UN/LOCODE) / {"code": "CPH"} (IATA); or distance_km with distance_type (sfd, gcd or actual).fuel; a truck's load (load_tonnes, or load_factor) and empty_trip_factor; electricity use (energy_kwh_per_tkm with country). See Methods.{"id", "hub_type"}. No hub factors ship by default (the openly published averages carry no reuse licence), so hubs need a dataset that defines them.
1. Intensity (default value, ISO 14083 7.2.5): tonne-km = tonnes × distance; emissions = tonne-km × intensity (g CO2e/tkm) × DAF ÷ 1000. The intensity is a published average for the vehicle type.
2. Load model (modelled, ISO 14083 7.2.4), for trucks when load_tonnes or load_factor is given: emissions per vehicle-km at that load, interpolated between DESNZ's 0 %, 50 % and 100 % laden values, plus empty_trip_factor × the empty vehicle's emissions, divided by the tonnes on board: g/tkm = (E(load) + empty_trip_factor × E(empty)) / (payload_t × load_factor). Important: load_factor is a share of the model's payload_t, DESNZ's *average full load* (17.9 t for an articulated truck over 33 t), not the truck's rated payload as in GLEC or EcoTransIT (about 26 t for a 40 t truck). So load_factor: 0.6 means 10.7 t here, but about 16 t in GLEC's terms. When the weight on the truck is known, give load_tonnes instead: it means the same in every tool. Results say how many tonnes a load factor meant. Loads above payload_t are allowed up to 1.6 × it. Vans have no load model.
3. Fuel (primary data, ISO 14083 7.2.3), when the leg has measured fuel (fuel, amount in the fuel's unit, optional vehicle_tonne_km of the whole trip): emissions = amount × fuel factor × share, share = shipment tonne-km ÷ vehicle_tonne_km (1 when not given).
4. Energy (modelled), for electric trains or trucks, with energy_kwh_per_tkm and country (ISO alpha-3): kWh per tonne-km × that country's grid intensity, all well-to-tank. There is no default kWh figure: the user must give the operator's.
Hubs add tonnes × hub g CO2e/t ÷ 1000 (WTW only). Intensity per tonne-km covers transport only.
A leg's distance is distance_km when given. Otherwise it is routed from the coordinates:
| Mode | Route | Distance type |
|---|---|---|
| road | OSRM on OpenStreetMap roads (worldwide on the public service, in overlapping regions joined where they overlap) | shortest feasible (SFD) |
| rail | OSRM with a freight-train profile on OpenStreetMap railways | SFD |
| inland waterway | OSRM with a barge profile on navigable OpenStreetMap waterways (CEMT class I+) | SFD |
| sea | shortest path on Eurostat's SeaRoute maritime network | SFD |
| air | great circle | great-circle (GCD) |
Without a router for a mode, Carbonara falls back to the great circle; for container ships and inland waterways, whose factors are per actual distance, a leg given only by coordinates is then refused instead (give distance_km). The public service routes road, rail, inland waterway and sea as in the table. Each leg reports its distance_method (given, osrm, sea_network, great_circle, …) and distance_type.
parts), with DESNZ's RoPax ferry factor, the rest with the truck.route_parts_km). With energy_kwh_per_tkm, track tagged as not electrified uses the vehicle type's own (diesel) factor.Emissions are tonne-km × intensity × DAF (GLEC p.22). A DAF applies when the leg's distance type differs from the type the factor was built on (distance_basis):
| Mode | From → to | DAF | Source |
|---|---|---|---|
| sea | SFD → actual | × 1.15 | GLEC p.51, citing Clean Cargo |
| air | actual flown → GCD | − 95 km | GLEC p.38 |
| inland waterway | SFD → actual | × 1 | GLEC: the network leaves little room for deviation |
A mismatch without a DAF is an error, not a silent guess. Each leg reports daf and daf_source.
added (gap or access) with a note; moved legs carry a note. Turn this off with add_road_legs: false; gaps then appear in warnings instead.The default dataset is desnz-2026,nl-iww-2026,eu-mrv-2024:
container_ship means the short-sea factor on legs under 2,000 km and the deep-sea factor from 2,000 km (Carbonara's threshold, not a standard's); the leg's factor_note says which. container_ship_short_sea / container_ship_deep_sea choose one; DESNZ's container ships by size stay available by their full ids.Known limitations:
Each leg and hub has a data_type (ISO 14083 3.3.3): primary (measured fuel, or the operator's own intensities), modelled (load or energy model) or default (published average). The result's primary_data_share is the share of WTW from primary data.
wtw_kg, ttw_kg, wtt_kg, tonne_km, intensity_g_per_tkm (WTW per tonne-km, transport only), primary_data_share, dataset, warnings.legs[]): distance_km, distance_method, distance_type, daf, daf_source, tonne_km, ttw_kg, wtt_kg, wtw_kg, method (intensity, load_model, fuel, energy), data_type, factor (the intensity used, with source, year and distance_basis), factor_note, added, note, load-model fields (load_factor, load_tonnes, payload_t, empty_trip_factor), route_parts_km and parts.At https://carbonara-co2.org, without an account: single shipments and batches of up to 100 shipments, 2,000 shipments a day per visitor. A free account (email sign-in) gives an API key for 100,000 shipments a day and batches of up to 10,000.