Find an API

Search public APIs with auth details & Postman guides

← All APIs

OpenSky Network API

opensky-network.org · Data

Data No Auth Free & Open Aviation Flight Tracking Transport

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

Get Postman ↗
  1. No API key needed for basic use
  2. GET https://opensky-network.org/api/states/all — all live flights
  3. Each state vector: [icao24, callsign, origin_country, lon, lat, altitude, velocity, ...]
  4. Filter by bounding box: ?lamin=lat_min&lomin=lon_min&lamax=lat_max&lomax=lon_max
  5. Create a free account for higher daily limits

Open documentation ↗