BYTETOOLS

OpenSky Network API

Free OpenSky Network API: live aircraft positions, altitude, velocity and callsigns worldwide from crowd-sourced ADS-B receivers. Tested curl example.

No API key requiredHTTPSFree tier

Endpoint tested and returned HTTP 200 on 2026-08-19

What is the OpenSky Network API?

The OpenSky Network API provides free live air traffic data — aircraft positions, altitude, velocity, heading and callsigns — collected from a community network of ADS-B receivers worldwide.

OpenSky is a research-oriented, community-run flight tracking network. Anonymous users can query live aircraft state vectors globally, filtered to a bounding box, which is enough to build a working live flight map.

The response format is unusual and catches people out: `states` is an array of arrays, not objects. Each aircraft is a positional array where index 0 is the ICAO24 address, 1 the callsign, 5 longitude, 6 latitude, 7 barometric altitude and so on. You must index by position against the documented field order.

Quick facts

Base URL
https://opensky-network.org/api
Authentication
Anonymous access works with tight limits. A free account raises the allowance considerably.
Rate limit
Anonymous users get roughly 400 credits per day and 10-second resolution; registered users get more.
Pricing
Free for non-commercial and research use. Commercial use requires a separate agreement.
CORS
Not enabled — call it from your server
Official docs
Read the docs

How to use the OpenSky Network API

Every request below was executed against the live API on 2026-08-19, and the response shown is the real body it returned — not an illustration.

1. Live aircraft in a bounding box

GET https://opensky-network.org/api/states/all?lamin=45.8&lomin=5.9&lamax=47.8&lomax=10.5

curl
curl 'https://opensky-network.org/api/states/all?lamin=45.8&lomin=5.9&lamax=47.8&lomax=10.5'
JavaScript (fetch)
const res = await fetch("https://opensky-network.org/api/states/all?lamin=45.8&lomin=5.9&lamax=47.8&lomax=10.5");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

res = requests.get("https://opensky-network.org/api/states/all?lamin=45.8&lomin=5.9&lamax=47.8&lomax=10.5", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200 (truncated)
{
  "time": 1787171296,
  "states": [
    [
      "3455d8",
      "VOE68PJ ",
      "Spain",
      1787171295,
      1787171295,
      6.3517,
      45.9715,
      9448.8,
      false,
      198.45,
      218.47,
      0,
      null,
      9906,
      "1000",
      false,
      0
    ],
    [
      "440181",
      "EJU16RZ ",
      "Austria",
      1787171295,
      1787171295,
      8.6092,
      45.967,
      7444.74,
      false,
      189.52,
      142.94,
      -12.68,
      null,
      7856.22,
      "1000",
      false,
      0
    ],
    [
      "300a86",
      "ITY311  ",
      "Italy",
      1787171295,
      1787171295,
      8.6089,
      45.8202,
      6362.7,
      false,
      201.48,
      146.88,
      -10.73,
      null,
      6728.46,
      "1000",
      false,
      0
    ],
    [
      "3847ff",
      "M01     ",
      "France",
      1787171294,
      1787171295,
      7.5266,
      47.6003,
      null,
      true,
      3.34,
      241.88,
      null,
      null,
      null,
      null,
      false,
      0
    ],
    [
      "44cdd1",
      "BEL6KU  ",
      "Belgium",
      1787171295,
      1787171295,
      8.0221,
      47.6174,
      11887.2,
      false,
      237.12,
      338.89,
      0,
      null,
      12382.5,
      "1000",
      false,
      0
    ],
    [
      "4079a9",
      "TOM543  ",
      "United Kingdom",
      1787171295,
      1787171295,
      9.0246,
      46.0529,
      11582.4,
      false,
      226.91,
      312.15,
      0,
      null,
      12108.18,
      "2743",
      false,
      0
    ],
    [
      "406752",

Parameters

ParameterTypeRequiredDescription
lamin / lamaxfloatOptionalMinimum and maximum latitude of the bounding box. 45.8
lomin / lomaxfloatOptionalMinimum and maximum longitude. 5.9
timeintegerOptionalUnix timestamp for a historical snapshot; 0 or omitted for now. 0
icao24stringOptionalFilter to one aircraft by its ICAO 24-bit address. 3455d8

Response fields

timeinteger
Unix timestamp of the snapshot.
statesarray
Array of ARRAYS, one per aircraft — not objects. Index by position.
states[][0]string
ICAO24 transponder address, the unique aircraft id.
states[][1]string
Callsign, space-padded — trim it before display.
states[][5] / [6]float
Longitude and latitude. Note longitude comes first.
states[][7]float
Barometric altitude in metres, or null when on the ground.
states[][9]float
Ground velocity in metres per second.

What you can build with the OpenSky Network API

  • Build a live flight tracking map for a region
  • Monitor aircraft over a specific airport or area
  • Analyse air traffic density for research
  • Trigger notifications when a specific aircraft is airborne

Common errors and how to fix them

429

Anonymous credit allowance exhausted.

Fix: Register a free account for a higher allowance, and always pass a bounding box rather than querying globally.

Reading states as objects fails

Each state is a positional array, not an object.

Fix: Index by position against the documented field order — states[i][6] is latitude, not a named property.

null values in a state array

Some fields are unavailable for some aircraft.

Fix: Null-check altitude and velocity before plotting; ground vehicles often report nulls.

OpenSky Network API — frequently asked questions

Is OpenSky's flight tracking API free?

Yes for non-commercial and research use. Anonymous access works with tight limits; a free account raises the allowance. Commercial use needs a separate agreement.

Why is the response an array of arrays?

OpenSky returns positional state vectors rather than objects, to keep payloads small. Index by position — 0 is ICAO24, 1 callsign, 5 longitude, 6 latitude, 7 altitude.

How do I avoid hitting the rate limit?

Always pass a bounding box with lamin/lamax/lomin/lomax rather than requesting global state, and poll no more often than every 10 seconds.

Does it cover every aircraft?

No. Coverage depends on community ADS-B receivers, so it is excellent over Europe and North America and patchy over oceans and remote regions. Military aircraft are often absent.

Tools that pair with this API

OpenSky Network is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-19; always check the official documentation before relying on this API in production, as terms and limits can change.