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
x-api-key on every request (direct subscription). Learn more →https://data.skylinkapi.com/v3.1/carbon/estimate| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
departure_icao | string | Pair mode | - | Departure airport ICAO, e.g. EGLL. Required with arrival_icao unless callsign is set |
arrival_icao | string | Pair mode | - | Arrival airport ICAO, e.g. KJFK. Required with departure_icao unless callsign is set |
callsign | string | Callsign mode | - | Flight callsign, e.g. BAW117. Resolves route and distance automatically |
aircraft_type | string | No | inferred | ICAO type code, e.g. B77W, A320. Omit to infer from callsign or use category average |
passengers | integer | No | category default | Passenger count (1–900). Omit to use the aircraft category's typical seat count |
include_rfi | boolean | No | false | Include 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
| Field | Type | Required | Null? | Description |
|---|---|---|---|---|
departure_icao | string | Yes | Never | Departure ICAO code |
arrival_icao | string | Yes | Never | Arrival ICAO code |
aircraft_type | string | null | No | Yes | ICAO type used, if known |
aircraft_category | string | Yes | Never | Emission-factor category — e.g. wide_body_large (long-haul wide-body), narrow_body_medium (typical single-aisle jet) |
distance_km | number | Yes | Never | Route distance in kilometres |
distance_nm | number | Yes | Never | Route distance in nautical miles |
passengers | integer | Yes | Never | Passenger count used in the calculation |
passengers_source | string | Yes | Never | "provided" or "category_default" |
co2_kg_total | number | Yes | Never | Total flight CO₂ in kilograms |
co2_kg_per_passenger | number | Yes | Never | CO₂ per passenger in kilograms |
rfi_applied | boolean | Yes | Never | Whether RFI was included in equivalent fields |
rfi_factor | number | Yes | Never | RFI multiplier (1.9 when applied) |
co2_equivalent_kg_total | number | null | No | Yes | Total climate impact kg when include_rfi=true |
co2_equivalent_kg_per_passenger | number | null | No | Yes | Per-passenger climate impact kg when RFI applied |
methodology | string | Yes | Never | Methodology identifier, e.g. ICAO-Doc9988 |
confidence | string | Yes | Never | high, medium, or low — reflects distance/aircraft certainty |
distance_source | string | Yes | Never | haversine or historical track source when callsign mode resolves a flown path |
notes | string | Yes | Never | Human-readable note about RFI and calculation mode |
callsign | string | No | Yes | Echoed callsign when callsign mode was used |
callsign_resolved | boolean | No | Yes | Whether the callsign mapped to a known route |
route_confidence | string | No | Yes | Route-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 = NoneIntegration
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.
Your SkyLink licence key, for keys bought direct from skylinkapi.com.
In: header
Query Parameters
Departure airport ICAO code (e.g. 'EGLL'). Required unless callsign is provided.
Arrival airport ICAO code (e.g. 'KJFK'). Required unless callsign is provided.
Flight callsign (e.g. 'BAW123'). Resolves route and distance automatically.
ICAO aircraft type code (e.g. 'B77W', 'A320'). Omit to infer from callsign or use category average.
Number of passengers. Omit to use the aircraft category's typical seat count.
Include Radiative Forcing Index (total climate impact, not just CO2)
falseResponse 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": {}
}
]
}