API Reference
REST access to live and historical aircraft positions, served from our own receiver network.
All endpoints live under a single base URL:
https://planetrack.ai/v1
Requests are metered in credits. Every response includes a meta block showing what the call cost and how many credits you have left this month.
Authentication
All API requests require an API key, sent in the X-API-Key header:
curl -H "X-API-Key: pt_live_your_api_key_here" \
https://planetrack.ai/v1/live
Credits & Plans
Each call is charged a fixed number of credits. Credits reset monthly.
Credit Costs
| Endpoint | Credits per Call |
|---|---|
GET /v1/live |
10 |
GET /v1/aircraft/{icao24}/track |
20 |
GET /v1/flights/{callsign}/history |
20 |
GET /v1/usage |
Free |
Plans
| Plan | Price | Credits/Month | History Lookback | Commercial Use |
|---|---|---|---|---|
| Free | $0 | 2,000 | 7 days | No (personal use) |
| Starter | $29/month | 100,000 | 90 days | Yes |
| Pro | $199/month | 1,000,000 | Up to 12 months | Yes |
Lookback on every plan is capped by the start of our archive: position collection began 2025-08-18.
Need a single aircraft's full history rather than API access? One-off data extracts start at £29 with no account needed.
Rate Limits
Rate limits are per API key and apply on top of your monthly credit allowance:
| Tier | Requests/Second | Requests/Day |
|---|---|---|
| Free | 1 | 100 |
| Starter | 10 | 10,000 |
| Pro | 100 | 100,000 |
If you exceed either limit the API returns 429 Too Many Requests. Back off and retry; no credits are charged for rate-limited calls.
Error Handling
The API returns standard HTTP status codes:
| Code | Meaning |
|---|---|
200 |
Success |
400 |
Bad Request: invalid parameters |
401 |
Unauthorized: missing or invalid X-API-Key header |
402 |
Payment Required: monthly credits exhausted. Upgrade your plan or wait for the monthly reset. Check /v1/usage (free) to see your balance. |
404 |
Not Found: resource doesn't exist |
429 |
Too Many Requests: per-second or per-day rate limit exceeded. No credits are charged; retry after backing off. |
500 |
Internal Server Error |
API v1 Endpoints
Get the current position of all tracked aircraft.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
bbox |
string | No | Bounding box filter: "min_lat,min_lon,max_lat,max_lon" |
limit |
integer | No | Max aircraft to return |
Example Request
curl -H "X-API-Key: YOUR_API_KEY" \
"https://planetrack.ai/v1/live?bbox=49.0,-8.0,61.0,2.0&limit=100"
Example Response
{
"data": [
{
"icao24": "4076a3",
"callsign": "BAW123",
"lat": 51.4712,
"lon": -0.4527,
"altitude": 36000,
"speed": 447,
"heading": 284,
"vertical_rate": 0,
"squawk": "2201",
"last_seen": "2026-08-12T10:15:04Z"
}
],
"meta": {
"count": 1,
"credits_charged": 10,
"credits_remaining": 99850
}
}
Get the position track for a specific aircraft. Lookback depth depends on your plan: 7 days on Free, 90 days on Starter, up to 12 months on Pro.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
icao24 |
string (path) | Yes | ICAO 24-bit hex address, e.g. 4076a3 |
date |
string | No | Day to fetch (YYYY-MM-DD, default today). Must be within your plan's lookback window. |
Example Request
curl -H "X-API-Key: YOUR_API_KEY" \
"https://planetrack.ai/v1/aircraft/4076a3/track?date=2026-08-11"
Example Response
{
"data": {
"icao24": "4076a3",
"date": "2026-08-11",
"points": [
{
"time": "2026-08-11T09:02:15Z",
"lat": 51.4700,
"lon": -0.4543,
"altitude": 1200,
"speed": 175,
"heading": 270
}
]
},
"meta": {
"credits_charged": 20,
"credits_remaining": 99830
}
}
Get past flights for a callsign. Lookback depth depends on your plan: 7 days on Free, 90 days on Starter, up to 12 months on Pro.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
callsign |
string (path) | Yes | Flight callsign, e.g. BAW123 |
days |
integer | No | How many days back to search (default 7, capped by your plan's lookback window) |
Example Request
curl -H "X-API-Key: YOUR_API_KEY" \
"https://planetrack.ai/v1/flights/BAW123/history?days=30"
Example Response
{
"data": [
{
"date": "2026-08-11",
"callsign": "BAW123",
"icao24": "4076a3",
"first_seen": "2026-08-11T09:02:15Z",
"last_seen": "2026-08-11T16:48:51Z"
}
],
"meta": {
"count": 1,
"credits_charged": 20,
"credits_remaining": 99810
}
}
Check your current plan and credit balance. This call never charges credits, so poll it as often as you like.
Example Request
curl -H "X-API-Key: YOUR_API_KEY" \
"https://planetrack.ai/v1/usage"
Example Response
{
"data": {
"plan": "api_starter",
"credits_limit": 100000,
"credits_used": 12760,
"credits_remaining": 87240,
"resets_at": "2026-09-01T00:00:00Z"
},
"meta": {
"credits_charged": 0,
"credits_remaining": 87240
}
}
Code Examples
Python
import requests
API_KEY = "pt_live_your_api_key"
BASE_URL = "https://planetrack.ai/v1"
headers = {"X-API-Key": API_KEY}
# Get live aircraft over the UK
response = requests.get(
f"{BASE_URL}/live",
params={"bbox": "49.0,-8.0,61.0,2.0", "limit": 100},
headers=headers,
)
body = response.json()
print(f"Found {body['meta']['count']} aircraft "
f"({body['meta']['credits_remaining']} credits left)")
for plane in body["data"][:5]:
print(f"{plane['callsign']}: {plane['lat']}, {plane['lon']}")
JavaScript (Node.js)
const API_KEY = 'pt_live_your_api_key';
const BASE_URL = 'https://planetrack.ai/v1';
async function getLiveAircraft() {
const response = await fetch(`${BASE_URL}/live?limit=100`, {
headers: { 'X-API-Key': API_KEY }
});
const body = await response.json();
console.log(`Found ${body.meta.count} aircraft (${body.meta.credits_remaining} credits left)`);
body.data.slice(0, 5).forEach(plane => {
console.log(`${plane.callsign}: ${plane.lat}, ${plane.lon}`);
});
}
getLiveAircraft();
curl
# Get live aircraft (10 credits)
curl -H "X-API-Key: pt_live_your_api_key" \
"https://planetrack.ai/v1/live?limit=10" | jq
# Get an aircraft's track (20 credits)
curl -H "X-API-Key: pt_live_your_api_key" \
"https://planetrack.ai/v1/aircraft/4076a3/track" | jq
# Check your credit balance (free)
curl -H "X-API-Key: pt_live_your_api_key" \
"https://planetrack.ai/v1/usage" | jq
SDKs
Official SDKs for Python, JavaScript, Ruby, and PHP are in development. The API is plain HTTPS and JSON, so any standard HTTP client works in the meantime; the examples above cover the common cases.
Support
Email [email protected]. Include the endpoint, timestamp, and response code of any failing call, and the first characters of your key (never the full key). We run the receiver network and the API ourselves and read every message.
The free tier includes 2,000 credits per month. No card required.
Create a key View pricing