OpenSky Network API
opensky-network.org · Data
Real-time and historical flight tracking data from 6,000+ sensors worldwide. 30+ trillion ADS-B messages. Free for non-commercial research. No API key required for basic access.
Authentication
No authentication requiredFree to use with no key needed.
Sample Requests
GET
Get all live flights
Get all current aircraft positions worldwide.
https://opensky-network.org/api/states/all
Hover any highlighted part to learn what it does
curl -X GET "https://opensky-network.org/api/states/all"
import requests
response = requests.get(
"https://opensky-network.org/api/states/all",
)
print(response.json())const url = 'https://opensky-network.org/api/states/all'; const response = await fetch(url); const data = await response.json(); console.log(data);
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
targetURL := "https://opensky-network.org/api/states/all"
req, _ := http.NewRequest("GET", targetURL, nil)
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}require "net/http"
require "json"
uri = URI("https://opensky-network.org/api/states/all")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"
req = Net::HTTP::Get.new(uri)
res = http.request(req)
puts JSON.parse(res.body)<?php
$url = "https://opensky-network.org/api/states/all";
$opts = ["http" => [
"method" => "GET",
]];
$ctx = stream_context_create($opts);
$res = file_get_contents($url, false, $ctx);
print_r(json_decode($res, true));
GET
Flights in bounding box
Get flights over Switzerland.
https://opensky-network.org/api/states/all?lamax=47.8229&lamin=45.8389&lomax=10.5226&lomin=5.9962
Hover any highlighted part to learn what it does
curl -X GET "https://opensky-network.org/api/states/all?lamax=47.8229&lamin=45.8389&lomax=10.5226&lomin=5.9962"
import requests
params = {
"lamax": "47.8229",
"lamin": "45.8389",
"lomax": "10.5226",
"lomin": "5.9962"
}
response = requests.get(
"https://opensky-network.org/api/states/all",
params=params,
)
print(response.json())const url = new URL('https://opensky-network.org/api/states/all');
url.searchParams.set('lamax', '47.8229');
url.searchParams.set('lamin', '45.8389');
url.searchParams.set('lomax', '10.5226');
url.searchParams.set('lomin', '5.9962');
const response = await fetch(url);
const data = await response.json();
console.log(data);package main
import (
"fmt"
"io"
"net/http"
"net/url"
)
func main() {
baseURL, _ := url.Parse("https://opensky-network.org/api/states/all")
q := baseURL.Query()
q.Set("lamax", "47.8229")
q.Set("lamin", "45.8389")
q.Set("lomax", "10.5226")
q.Set("lomin", "5.9962")
baseURL.RawQuery = q.Encode()
targetURL := baseURL.String()
req, _ := http.NewRequest("GET", targetURL, nil)
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}require "net/http"
require "json"
uri = URI("https://opensky-network.org/api/states/all")
uri.query = URI.encode_www_form({
"lamax" => "47.8229",
"lamin" => "45.8389",
"lomax" => "10.5226",
"lomin" => "5.9962"
})
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"
req = Net::HTTP::Get.new(uri)
res = http.request(req)
puts JSON.parse(res.body)<?php
$url = "https://opensky-network.org/api/states/all?" . http_build_query([
"lamax" => "47.8229",
"lamin" => "45.8389",
"lomax" => "10.5226",
"lomin" => "5.9962"
]);
$opts = ["http" => [
"method" => "GET",
]];
$ctx = stream_context_create($opts);
$res = file_get_contents($url, false, $ctx);
print_r(json_decode($res, true));Postman Setup Guide
- No API key needed for basic use
- GET https://opensky-network.org/api/states/all — all live flights
- Each state vector: [icao24, callsign, origin_country, lon, lat, altitude, velocity, ...]
- Filter by bounding box: ?lamin=lat_min&lomin=lon_min&lamax=lat_max&lomax=lon_max
- Create a free account for higher daily limits