Calculate Travel Emissions

<span class="api-method api-method-get">GET</span> /v1/travel/emissions

Calculate CO2e emissions for passenger travel between two locations.


Request

Required Parameters

Parameter Type Description
origin_country string Origin country code (ISO 3166-1 alpha-2)
destination_country string Destination country code
passengers integer 1

Location Parameters

Parameter Type Description
origin_location string Origin city, address, or airport code
destination_location string Destination city, address, or airport code

Journey Parameters

Parameter Type Default Description
transport_mode string auto Transport mode (see below)
return_trip boolean false Include return journey (doubles emissions)

Flight Parameters

Parameter Type Default Description
cabin_class string economy economy, premium_economy, business, first

Car/Taxi Parameters

Parameter Type Default Description
vehicle_type string average small, medium, large, average
vehicle_type string petrol petrol, diesel, hybrid, phev, bev

Override Parameters

Parameter Type Description
distance_km number Override calculated distance

Output Parameters

Parameter Type Default Description
equivalents boolean false Include real-world equivalents

Transport Modes

Value Description
auto Automatically detect best mode
flight Commercial aviation
rail Train travel
car Personal car
bus Coach/bus
ferry Passenger ferry
taxi Taxi/rideshare

Cabin Classes (Flights)

Value Multiplier Description
economy 1.0x Standard economy class
premium_economy 1.6x Premium economy / economy plus
business 2.9x Business class
first 4.0x First class

Fuel Types (Car/Taxi)

Value Description
petrol Petrol/gasoline (default)
diesel Diesel
hybrid Hybrid (HEV)
phev Plug-in hybrid
bev Battery electric vehicle

Response

{
  "data": {
    "type": "travel_emission",
    "id": "2214775f-b096-47df-88c9-6d4a17c97054",
    "attributes": {
      "emissions": {
        "co2e": 175.548,
        "co2e_unit": "kg",
        "co2e_calculation_method": "ipcc_ar6_gwp100",
        "co2e_grams": 175548,
        "per_passenger_kg": 175.548,
        "per_passenger_g": 175548,
        "equivalents": {
          "trees_yearly": {
            "value": 8.36,
            "label": "trees needed to absorb this CO2 in a year"
          },
          "driving_km": {
            "value": 1032.6,
            "label": "km driven in an average car"
          },
          "smartphone_charges": {
            "value": 21944,
            "label": "smartphone charges"
          }
        },
        "source_trail": [
          {
            "data_category": "emission_factor",
            "name": "Short-Haul Flight - Economy Class",
            "source": "DEFRA / ICAO",
            "source_dataset": "Greenhouse gas reporting: conversion factors 2025",
            "year": "2025",
            "region": "GB"
          }
        ]
      },
      "direct_emissions": {
        "co2e": 140.44,
        "co2e_unit": "kg",
        "description": "Tank-to-wheel / tailpipe emissions"
      },
      "indirect_emissions": {
        "co2e": 35.11,
        "co2e_unit": "kg",
        "description": "Well-to-tank / upstream fuel production emissions"
      },
      "journey": {
        "passengers": 1,
        "return_trip": false,
        "mode": "flight",
        "cabin_class": "economy"
      },
      "vehicle": {
        "requested": "auto",
        "class_used": "Short-Haul Flight - Economy Class"
      },
      "route": {
        "type": "direct",
        "total_distance_km": 1396,
        "transport_mode": "flight",
        "origin": {
          "input": "Edinburgh",
          "resolved": "City of Edinburgh, Scotland, United Kingdom",
          "country_code": "GB",
          "lat": 55.9533,
          "lon": -3.1883
        },
        "destination": {
          "input": "Lyon",
          "resolved": "Lyon, France",
          "country_code": "FR",
          "lat": 45.764,
          "lon": 4.8357
        }
      },
      "geography": {
        "origin_country": "GB",
        "destination_country": "FR",
        "border_crossing": true
      },
      "notices": [
        {
          "message": "DEFRA emission factors include radiative forcing effects for aviation.",
          "code": "radiative_forcing_included",
          "severity": "info"
        }
      ]
    }
  },
  "meta": {
    "methodology": "DEFRA 2025 / ICAO",
    "emission_factors_year": 2025,
    "standards_compliance": {
      "GHG_Protocol": "Scope 3 Category 6 (Business Travel)"
    },
    "distance_method": "haversine_with_detour_factor",
    "includes_radiative_forcing": true,
    "calculated_at": "2026-02-07T14:30:00Z"
  }
}

Response Fields

emissions

Field Type Description
co2e number Total CO2 equivalent in kg
co2e_unit string Always kg
per_passenger_kg number Emissions per passenger
per_passenger_g number Emissions per passenger in grams
equivalents object Real-world comparisons (if requested)
source_trail array Audit trail of emission factors

journey

Field Type Description
passengers integer Number of passengers
return_trip boolean Whether return is included
mode string Transport mode used
cabin_class string Cabin class (flights only)

route

Field Type Description
total_distance_km number Total journey distance
transport_mode string Transport mode
origin object Geocoded origin
destination object Geocoded destination

Examples

Flight - Economy Class

curl "https://api.emissions.dev/v1/travel/emissions?\
origin_country=GB&\
origin_location=London&\
destination_country=US&\
destination_location=New+York&\
transport_mode=flight&\
cabin_class=economy" \
  -H "Authorization: Bearer em_live_xxxx"

Flight - Business Class with Return

curl "https://api.emissions.dev/v1/travel/emissions?\
origin_country=GB&\
origin_location=London&\
destination_country=JP&\
destination_location=Tokyo&\
transport_mode=flight&\
cabin_class=business&\
return_trip=true" \
  -H "Authorization: Bearer em_live_xxxx"

Rail Journey

curl "https://api.emissions.dev/v1/travel/emissions?\
origin_country=GB&\
origin_location=London&\
destination_country=FR&\
destination_location=Paris&\
transport_mode=rail" \
  -H "Authorization: Bearer em_live_xxxx"

Car Journey - Petrol

curl "https://api.emissions.dev/v1/travel/emissions?\
origin_country=GB&\
origin_location=Manchester&\
destination_country=GB&\
destination_location=Birmingham&\
transport_mode=car&\
vehicle_type=petrol&\
passengers=2" \
  -H "Authorization: Bearer em_live_xxxx"

Electric Car

curl "https://api.emissions.dev/v1/travel/emissions?\
origin_country=NO&\
origin_location=Oslo&\
destination_country=NO&\
destination_location=Bergen&\
transport_mode=car&\
vehicle_type=bev&\
passengers=4" \
  -H "Authorization: Bearer em_live_xxxx"

Ferry Crossing

curl "https://api.emissions.dev/v1/travel/emissions?\
origin_country=GB&\
origin_location=Dover&\
destination_country=FR&\
destination_location=Calais&\
transport_mode=ferry" \
  -H "Authorization: Bearer em_live_xxxx"

Bus/Coach

curl "https://api.emissions.dev/v1/travel/emissions?\
origin_country=GB&\
origin_location=London&\
destination_country=GB&\
destination_location=Edinburgh&\
transport_mode=bus" \
  -H "Authorization: Bearer em_live_xxxx"

Multiple Passengers with Equivalents

curl "https://api.emissions.dev/v1/travel/emissions?\
origin_country=GB&\
origin_location=London&\
destination_country=ES&\
destination_location=Barcelona&\
transport_mode=flight&\
passengers=4&\
equivalents=true" \
  -H "Authorization: Bearer em_live_xxxx"

Code Examples

JavaScript

const response = await fetch(
  'https://api.emissions.dev/v1/travel/emissions?' + new URLSearchParams({
    origin_country: 'GB',
    origin_location: 'London',
    destination_country: 'FR',
    destination_location: 'Paris',
    transport_mode: 'flight',
    cabin_class: 'business',
    passengers: 2
  }),
  {
    headers: {
      'Authorization': `Bearer ${process.env.EMISSIONS_API_KEY}`
    }
  }
);

const data = await response.json();
const emissions = data.data.attributes.emissions;

console.log(`Total: ${emissions.co2e} kg CO2e`);
console.log(`Per passenger: ${emissions.per_passenger_kg} kg CO2e`);

Python

import requests

response = requests.get(
    'https://api.emissions.dev/v1/travel/emissions',
    params={
        'origin_country': 'GB',
        'origin_location': 'London',
        'destination_country': 'FR',
        'destination_location': 'Paris',
        'transport_mode': 'flight',
        'cabin_class': 'business',
        'passengers': 2
    },
    headers={
        'Authorization': f'Bearer {api_key}'
    }
)

data = response.json()
emissions = data['data']['attributes']['emissions']

print(f"Total: {emissions['co2e']} kg CO2e")
print(f"Per passenger: {emissions['per_passenger_kg']} kg CO2e")

PHP

$response = Http::withToken($apiKey)
    ->get('https://api.emissions.dev/v1/travel/emissions', [
        'origin_country' => 'GB',
        'origin_location' => 'London',
        'destination_country' => 'FR',
        'destination_location' => 'Paris',
        'transport_mode' => 'flight',
        'cabin_class' => 'business',
        'passengers' => 2,
    ]);

$data = $response->json();
$emissions = $data['data']['attributes']['emissions'];

echo "Total: {$emissions['co2e']} kg CO2e\n";
echo "Per passenger: {$emissions['per_passenger_kg']} kg CO2e\n";

Complete Trip Emissions

Combine with the Hotel API for full business trip emissions:

# Step 1: Calculate flight emissions
curl "https://api.emissions.dev/v1/travel/emissions?\
origin_country=GB&\
origin_location=London&\
destination_country=AE&\
destination_location=Dubai&\
transport_mode=flight&\
return_trip=true" \
  -H "Authorization: Bearer em_live_xxxx"

# Step 2: Calculate hotel emissions
curl "https://api.emissions.dev/v1/hotel/emissions?\
country=AE&\
nights=4" \
  -H "Authorization: Bearer em_live_xxxx"

# Step 3: Sum co2e values for total trip emissions
# Both report GHG Protocol Scope 3 Category 6

Errors

Invalid Transport Mode

{
  "error": {
    "code": "validation_error",
    "message": "The selected transport_mode is invalid.",
    "field": "transport_mode",
    "status": 422
  }
}

Invalid Cabin Class

{
  "error": {
    "code": "validation_error",
    "message": "The selected cabin_class is invalid.",
    "field": "cabin_class",
    "status": 422
  }
}

Missing Country

{
  "error": {
    "code": "validation_error",
    "message": "The origin_country field is required.",
    "field": "origin_country",
    "status": 422
  }
}