Carbon Sky Index · API

22,000 aircraft. 2 million flights. One endpoint.

Programmatic access to tank-to-wake private-aviation emissions — every tail, flight, airport, route and event behind Carbon Sky Index, as clean JSON.

Beta · access is application-based · docs last updated June 2026

ESG & Scope 3

Auditable, flight-level CO₂ for corporate aviation — feed Scope 3 category 6 reporting and travel-policy disclosure with a defensible, methodology-backed source.

Editorial & investigative

Who flew where, when, and what it emitted. Power newsroom trackers and accountability reporting with the same data behind our event and spike pages.

Aviation finance & lessor intelligence

Utilisation, route patterns and emissions intensity per tail and per type — diligence signal for lessors, financiers and asset managers.

Authentication

Every request is authenticated with an API key passed in the X-API-Key header. Keys are issued per organisation on approval — there is no public sign-up, and there is no gating on the data itself once you have a key.

Authenticated request
curl https://api.carbonskyindex.com/v1/aircraft/N628AL \
  --header "X-API-Key: $CSI_API_KEY"
Base URLhttps://api.carbonskyindex.com/v1
Auth headerX-API-Key: <your-key>
Formatapplication/json
Rate limit120 requests / minute (beta)
VersioningPath-pinned — /v1 is stable
Endpoints7 resources

All endpoints are GET and return JSON. Expand any row for an example response.

Webhooks

Subscribe to flight.completed and spike.detected events to receive a signed POST to your endpoint as soon as new activity is processed. Every delivery shares the same envelope.

FieldTypeDescription
eventstringEvent type, e.g. flight.completed or spike.detected.
idstringStable identifier for the delivery.
createdintegerUnix timestamp (seconds) when the event fired.
dataobjectThe event payload — shape matches the related GET resource.
Example delivery
POST https://your-app.example.com/csi-hook
Content-Type: application/json
X-CSI-Signature: t=1714780800,v1=4f1e…

{
  "event": "spike.detected",
  "id": "evt_9f2a…",
  "created": 1714780800,
  "data": {
    "entity_type": "airport",
    "entity_code": "KTEB",
    "co2_change_pct": 214
  }
}
Your endpoint responds
HTTP/1.1 200 OK

{ "received": true }

Verify the X-CSI-Signature header against the raw request body before trusting a delivery. The signature is an HMAC-SHA256 of {timestamp}.{body} keyed with your signing secret.

verify.js
const crypto = require('crypto');

// Verify the X-CSI-Signature header against the raw request body.
function verify(rawBody, header, secret) {
  const [tPart, vPart] = header.split(',');
  const timestamp = tPart.split('=')[1];
  const signature = vPart.split('=')[1];

  const expected = crypto
    .createHmac('sha256', secret)
    .update(timestamp + '.' + rawBody)
    .digest('hex');

  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expected),
  );
}
How the Figures Are Calculated

Every CO₂ figure the API returns is tank-to-wake, computed per flight from the observed ADS-B track and the aircraft type — not modelled from schedules or averages.

We match each flight to an aircraft type, derive distance from the flown track, apply type-specific fuel-burn and a tank-to-wake emissions factor, and benchmark against the route and type. Aggregates — airport, route, event — sum these per-flight figures over a window, with baselines drawn from the surrounding period. Coverage depends on ADS-B visibility and may understate activity at poorly-covered fields.

Read the full methodology →

Ready to integrate?

Tell us about your workflow and we'll issue a key. Access is application-based — most institutional and editorial use cases are approved quickly.