Save up to 17% with yearly billing

See pricing

Carbon Emissions

Per-flight CO₂ estimates using the ICAO Carbon Emissions Calculator methodology (Doc 9988) — the standard for aviation CO₂ calculation. Use this endpoint for traveler-facing carbon labels, ESG reporting, or offset checkout flows where you need auditable inputs (distance, aircraft category, passenger count) alongside the result.

Two query modes are supported:

By airports — provide departure_icao + arrival_icao. Distance defaults to great-circle distance between airport coordinates.

By callsign — provide callsign (e.g. BAW117). SkyLink resolves the route automatically and prefers actual flown distance from a recent matching flight (last 7 days), falling back to great-circle distance when no track is available.

Optional aircraft_type, passengers, and include_rfi refine the estimate. RFI (Radiative Forcing Index) accounts for non-CO₂ warming effects of contrails and ozone using an IPCC factor of 1.9×. When RFI is applied, results are expressed as CO₂e (CO₂ equivalent — total climate impact including RFI).

Important: Set include_rfi=true for full climate-impact reporting, but regulatory and consumer disclosure norms differ on whether to show CO₂ or CO₂e — disclose which figure you display.

Request

Requirements

Auth
x-api-key on every request (direct subscription). Learn more →
GEThttps://data.skylinkapi.com/v3.1/carbon/estimate
ParameterTypeRequiredDefaultDescription
departure_icaostringPair mode-Departure airport ICAO, e.g. EGLL. Required with arrival_icao unless callsign is set
arrival_icaostringPair mode-Arrival airport ICAO, e.g. KJFK. Required with departure_icao unless callsign is set
callsignstringCallsign mode-Flight callsign, e.g. BAW117. Resolves route and distance automatically
aircraft_typestringNoinferredICAO type code, e.g. B77W, A320. Omit to infer from callsign or use category average
passengersintegerNocategory defaultPassenger count (1–900). Omit to use the aircraft category's typical seat count
include_rfibooleanNofalseInclude radiative forcing index in co2_equivalent_kg_* fields

Provide either (departure_icao + arrival_icao) or callsign, not both modes in conflicting ways.

Response

{
  "departure_icao": "EGLL",
  "arrival_icao": "KJFK",
  "aircraft_type": "B77W",
  "aircraft_category": "wide_body_large",
  "distance_km": 5539.8,
  "distance_nm": 2991.3,
  "passengers": 280,
  "passengers_source": "provided",
  "co2_kg_total": 271451.4,
  "co2_kg_per_passenger": 847.3,
  "rfi_applied": false,
  "rfi_factor": 1.9,
  "co2_equivalent_kg_total": null,
  "co2_equivalent_kg_per_passenger": null,
  "methodology": "ICAO-Doc9988",
  "confidence": "high",
  "distance_source": "haversine",
  "notes": "CO2 only. Add include_rfi=true for total climate impact estimate."
}

Estimate object

FieldTypeRequiredNull?Description
departure_icaostringYesNeverDeparture ICAO code
arrival_icaostringYesNeverArrival ICAO code
aircraft_typestring | nullNoYesICAO type used, if known
aircraft_categorystringYesNeverEmission-factor category — e.g. wide_body_large (long-haul wide-body), narrow_body_medium (typical single-aisle jet)
distance_kmnumberYesNeverRoute distance in kilometres
distance_nmnumberYesNeverRoute distance in nautical miles
passengersintegerYesNeverPassenger count used in the calculation
passengers_sourcestringYesNever"provided" or "category_default"
co2_kg_totalnumberYesNeverTotal flight CO₂ in kilograms
co2_kg_per_passengernumberYesNeverCO₂ per passenger in kilograms
rfi_appliedbooleanYesNeverWhether RFI was included in equivalent fields
rfi_factornumberYesNeverRFI multiplier (1.9 when applied)
co2_equivalent_kg_totalnumber | nullNoYesTotal climate impact kg when include_rfi=true
co2_equivalent_kg_per_passengernumber | nullNoYesPer-passenger climate impact kg when RFI applied
methodologystringYesNeverMethodology identifier, e.g. ICAO-Doc9988
confidencestringYesNeverhigh, medium, or low — reflects distance/aircraft certainty
distance_sourcestringYesNeverhaversine or historical track source when callsign mode resolves a flown path
notesstringYesNeverHuman-readable note about RFI and calculation mode
callsignstringNoYesEchoed callsign when callsign mode was used
callsign_resolvedbooleanNoYesWhether the callsign mapped to a known route
route_confidencestringNoYesRoute-resolution confidence when using callsign mode

Important: When include_rfi=false, co2_equivalent_kg_* fields are null — render CO₂ figures only. When include_rfi=true, show both CO₂ and CO₂e and label which is the primary disclosure.

Client types

"""Carbon estimate response models for /carbon/estimate."""from __future__ import annotationsfrom dataclasses import dataclass@dataclassclass CarbonEstimateResponse:    departure_icao: str    arrival_icao: str    aircraft_type: str | None    aircraft_category: str    distance_km: float    distance_nm: float    passengers: int    passengers_source: str    co2_kg_total: float    co2_kg_per_passenger: float    rfi_applied: bool    rfi_factor: float    co2_equivalent_kg_total: float | None    co2_equivalent_kg_per_passenger: float | None    methodology: str    confidence: str    distance_source: str    notes: str    callsign: str | None = None    callsign_resolved: bool | None = None    route_confidence: str | None = None

Integration

Carbon labels in booking flows usually call the estimate once per itinerary leg and cache results for the session. The example below requests an airport-pair estimate with explicit passenger count, maps totals into tonne/kg display strings, and handles include_rfi for sustainability dashboards that report full climate impact.

import osfrom dataclasses import dataclassimport requestsBASE = "https://data.skylinkapi.com/v3.1"HEADERS = {    "x-api-key": os.getenv("SKYLINK_API_KEY", "YOUR_API_KEY")}@dataclassclass CarbonLabel:    route: str    co2_kg_total: float    co2_kg_per_passenger: float    passengers: int    methodology: str    rfi_applied: booldef fetch_carbon_estimate(    *,    departure_icao: str | None = None,    arrival_icao: str | None = None,    callsign: str | None = None,    aircraft_type: str | None = None,    passengers: int | None = None,    include_rfi: bool = False,) -> dict:    """Estimate flight CO2 using ICAO methodology."""    params: dict[str, str | int | bool] = {}    if departure_icao and arrival_icao:        params["departure_icao"] = departure_icao.upper()        params["arrival_icao"] = arrival_icao.upper()    elif callsign:        params["callsign"] = callsign.upper()    else:        raise ValueError("Provide departure_icao+arrival_icao or callsign")    if aircraft_type:        params["aircraft_type"] = aircraft_type.upper()    if passengers is not None:        params["passengers"] = passengers    if include_rfi:        params["include_rfi"] = True    r = requests.get(f"{BASE}/carbon/estimate", headers=HEADERS, params=params, timeout=(10, 20))    r.raise_for_status()    return r.json()def carbon_label(    departure_icao: str,    arrival_icao: str,    *,    passengers: int | None = None,    aircraft_type: str | None = None,) -> CarbonLabel:    data = fetch_carbon_estimate(        departure_icao=departure_icao,        arrival_icao=arrival_icao,        passengers=passengers,        aircraft_type=aircraft_type,    )    return CarbonLabel(        route=f"{data['departure_icao']} → {data['arrival_icao']}",        co2_kg_total=float(data["co2_kg_total"]),        co2_kg_per_passenger=float(data["co2_kg_per_passenger"]),        passengers=int(data["passengers"]),        methodology=data["methodology"],        rfi_applied=bool(data["rfi_applied"]),    )if __name__ == "__main__":    import json    from dataclasses import asdict    label = carbon_label("KJFK", "KLAX", passengers=180, aircraft_type="B738")    print(json.dumps(asdict(label), indent=2))

Implementation notes

Important: API values are in kilograms. Convert to tonnes (÷ 1000) for passenger-facing copy on long-haul routes.

Callsign vs airport pair. Callsign mode can improve distance accuracy when a recent ADS-B track exists; airport-pair mode is simpler for hypothetical bookings.

RFI disclosure. When include_rfi=true, show both CO₂ and CO₂e figures — regulatory contexts differ on whether RFI should be displayed to consumers.

Error responses

For shared platform errors, see Error Handling. Endpoint-specific behavior:

422 — missing route inputs

Returned when neither a valid airport pair nor callsign is provided, or when parameters fail validation.

GET
/carbon/estimate
x-api-key<token>

Your SkyLink licence key, for keys bought direct from skylinkapi.com.

In: header

Query Parameters

departure_icao?|

Departure airport ICAO code (e.g. 'EGLL'). Required unless callsign is provided.

arrival_icao?|

Arrival airport ICAO code (e.g. 'KJFK'). Required unless callsign is provided.

callsign?|

Flight callsign (e.g. 'BAW123'). Resolves route and distance automatically.

aircraft_type?|

ICAO aircraft type code (e.g. 'B77W', 'A320'). Omit to infer from callsign or use category average.

passengers?|

Number of passengers. Omit to use the aircraft category's typical seat count.

include_rfi?Include Rfi

Include Radiative Forcing Index (total climate impact, not just CO2)

Defaultfalse

Response Body

application/json

application/json

curl -X GET "https://data.skylinkapi.com/v3.1/carbon/estimate"
null
{
  "detail": [
    {
      "loc": [
        "string"
      ],
      "msg": "string",
      "type": "string",
      "input": null,
      "ctx": {}
    }
  ]
}