-
Notifications
You must be signed in to change notification settings - Fork 0
ADL API
The Aggregate Demand List (ADL) API provides access to real-time and historical flight data.
Returns current flight snapshot.
Parameters:
| Name | Type | Description |
|---|---|---|
dest |
string | Filter by destination (ICAO) |
orig |
string | Filter by origin (ICAO) |
artcc |
string | Filter by ARTCC |
airline |
string | Filter by airline code |
phase |
string | Filter by flight phase |
limit |
int | Max results (default: 1000) |
Example:
GET /api/adl/current.php?dest=KJFK&phase=cruise
Response:
{
"success": true,
"timestamp": "2026-01-10T14:30:00Z",
"count": 47,
"flights": [
{
"id": 12345,
"callsign": "DAL123",
"departure": "KATL",
"arrival": "KJFK",
"aircraft": "B739",
"altitude": 35000,
"groundspeed": 480,
"latitude": 39.5234,
"longitude": -74.1234,
"heading": 045,
"phase": "cruise",
"eta": "2026-01-10T15:45:00Z",
"route": "KAJIN J209 SBJ J60 RBV"
}
]
}Returns detailed single flight information.
Parameters:
| Name | Type | Description |
|---|---|---|
id |
int | Flight ID |
callsign |
string | Flight callsign |
Response includes:
- Full flight details
- Parsed route waypoints
- Trajectory history
- EDCT if assigned
Returns aggregate flight statistics.
Response:
{
"success": true,
"stats": {
"total_flights": 1523,
"by_phase": {
"preflight": 234,
"taxi_out": 45,
"departure": 89,
"cruise": 892,
"descent": 156,
"approach": 67,
"taxi_in": 40
},
"by_artcc": {
"ZNY": 145,
"ZDC": 132,
"ZTL": 198
}
}
}Returns historical flight snapshots.
Parameters:
| Name | Type | Description |
|---|---|---|
from |
datetime | Start time (ISO 8601) |
to |
datetime | End time (ISO 8601) |
airport |
string | Filter by airport |
interval |
int | Snapshot interval (minutes) |
Returns flight trajectory points.
Parameters:
| Name | Type | Description |
|---|---|---|
flight_id |
int | Flight ID |
from |
datetime | Start time |
to |
datetime | End time |
Returns boundary crossing data.
Parameters:
| Name | Type | Description |
|---|---|---|
boundary |
string | ARTCC or sector ID |
from |
datetime | Start time |
to |
datetime | End time |
direction |
string | entry, exit, or both |
| Phase | Description |
|---|---|
preflight |
Flight plan filed, not moving |
taxi_out |
Moving on ground pre-departure |
departure |
Airborne, climbing |
cruise |
Level flight |
descent |
Descending |
approach |
Final approach |
taxi_in |
On ground post-arrival |
arrived |
Parked at gate |
| Code | Description |
|---|---|
| 400 | Invalid parameters |
| 401 | Authentication required |
| 404 | Flight not found |
| 500 | Server error |
Query traffic demand at navigation fixes, airway segments, and route segments.
Returns flights passing through a specific navigation fix.
Parameters:
| Name | Type | Description |
|---|---|---|
fix |
string | Navigation fix identifier (required) |
minutes |
int | Time window in minutes (default: 60, max: 720) |
dep_tracon |
string | Filter by departure TRACON |
arr_tracon |
string | Filter by arrival TRACON |
format |
string | 'list' (default) or 'count' |
Example:
GET /api/adl/demand/fix?fix=MERIT&minutes=45&dep_tracon=N90
Response:
{
"fix": "MERIT",
"time_window_minutes": 45,
"filters": { "dep_tracon": "N90" },
"count": 12,
"generated_utc": "2026-01-15T14:30:00Z",
"flights": [
{
"flight_uid": "abc123",
"callsign": "DAL456",
"departure": "KLGA",
"destination": "KORD",
"aircraft_type": "B739",
"eta_at_fix": "2026-01-15T14:45:00Z",
"minutes_until_fix": 15,
"phase": "cruise"
}
]
}Returns flights on an airway segment between two fixes.
Parameters:
| Name | Type | Description |
|---|---|---|
airway |
string | Airway identifier (required, e.g., J48, V1) |
from_fix |
string | Segment start fix (required) |
to_fix |
string | Segment end fix (required) |
minutes |
int | Time window in minutes (default: 60, max: 720) |
format |
string | 'list' (default) or 'count' |
Example:
GET /api/adl/demand/airway?airway=J48&from_fix=LANNA&to_fix=MOL&minutes=180
Response:
{
"airway": "J48",
"segment": { "from": "LANNA", "to": "MOL" },
"time_window_minutes": 180,
"count": 8,
"generated_utc": "2026-01-15T14:30:00Z",
"flights": [
{
"flight_uid": "def456",
"callsign": "UAL789",
"departure": "KBOS",
"destination": "KORD",
"entry_eta": "2026-01-15T15:00:00Z",
"exit_eta": "2026-01-15T15:12:00Z",
"segment_minutes": 12,
"direction": "forward"
}
]
}Returns flights passing through two fixes in sequence (airway or direct).
Unlike the airway endpoint, this does not require flights to have filed via an airway. It finds any flights whose parsed route includes both fixes, useful for VATSIM where pilots often file direct (DCT) routes.
Parameters:
| Name | Type | Description |
|---|---|---|
from_fix |
string | First fix (required) |
to_fix |
string | Second fix (required) |
minutes |
int | Time window in minutes (default: 60, max: 720) |
format |
string | 'list' (default) or 'count' |
Example:
GET /api/adl/demand/segment?from_fix=CAM&to_fix=GONZZ&minutes=180
Response:
{
"segment": { "from": "CAM", "to": "GONZZ" },
"time_window_minutes": 180,
"count": 5,
"generated_utc": "2026-01-15T22:00:00Z",
"flights": [
{
"flight_uid": "ghi789",
"callsign": "AAL123",
"departure": "KMIA",
"destination": "KJFK",
"entry_eta": "2026-01-15T22:15:00Z",
"exit_eta": "2026-01-15T22:28:00Z",
"segment_minutes": 13,
"direction": "forward",
"on_airway": "J48"
}
]
}Returns time-bucketed demand counts for multiple monitors in a single call. Efficiently queries traffic demand for multiple fixes/segments, returning counts grouped into time buckets.
Parameters:
| Name | Type | Description |
|---|---|---|
monitors |
JSON | Array of monitor definitions (required) |
bucket_minutes |
int | Time bucket size (default: 15, min: 5, max: 60) |
horizon_hours |
int | Projection horizon in hours (default: 4, max: 12) |
Monitor Types:
| Type | Required Fields | Description |
|---|---|---|
fix |
fix |
Traffic through a navigation fix |
segment |
from, to
|
Traffic between two fixes |
airway |
airway |
All traffic on an airway |
airway_segment |
airway, from, to
|
Traffic on an airway segment |
via_fix |
via, via_type, filter
|
Filtered traffic (by airport/tracon/artcc) |
Flight Filters (optional):
Any monitor can include a flight_filter object with:
-
airline- Callsign prefix (e.g., "UAL", "AAL") -
aircraft_type- Aircraft type (e.g., "B738", "A320") -
aircraft_category- "HEAVY", "LARGE", or "SMALL" -
origin- Departure airport -
destination- Arrival airport
Example:
GET /api/adl/demand/batch?monitors=[{"type":"fix","fix":"MERIT"},{"type":"segment","from":"CAM","to":"GONZZ"}]&bucket_minutes=15&horizon_hours=4
Response:
{
"generated_utc": "2026-01-15T22:00:00Z",
"bucket_minutes": 15,
"horizon_hours": 4,
"buckets": [
{ "index": 0, "start": "2026-01-15T22:00:00Z", "label": "+0" },
{ "index": 1, "start": "2026-01-15T22:15:00Z", "label": "+15" }
],
"monitors": [
{
"id": "fix_MERIT",
"type": "fix",
"fix": "MERIT",
"lat": 40.123,
"lon": -73.456,
"counts": [12, 8, 15, 6],
"total": 41
}
]
}CRUD operations for shared demand monitors. Monitors persist across sessions and can be shared between users.
GET - List all active monitors
{
"monitors": [
{
"id": 1,
"key": "fix_MERIT",
"type": "fix",
"definition": {"fix": "MERIT"},
"label": "MERIT",
"created_by": "user@example.com",
"created_utc": "2026-01-15T14:30:00Z"
}
]
}POST - Create a new monitor
Request body:
{
"type": "fix",
"definition": {"fix": "MERIT"},
"label": "MERIT",
"created_by": "user@example.com"
}DELETE - Remove a monitor
Parameters: id (monitor ID) or monitor_key (monitor key string)
Returns individual flights captured by a demand monitor. Use this to see exactly which flights are being counted.
Parameters:
| Name | Type | Description |
|---|---|---|
type |
string | Monitor type (required): fix, segment, airway, airway_segment, via_fix |
fix |
string | Fix name (for type=fix) |
from |
string | From fix (for type=segment/airway_segment) |
to |
string | To fix (for type=segment/airway_segment) |
airway |
string | Airway name (for type=airway/airway_segment) |
via |
string | Via fix/airway (for type=via_fix) |
via_type |
string | 'fix' or 'airway' (for type=via_fix) |
filter_type |
string | airport/tracon/artcc (for type=via_fix) |
filter_code |
string | Filter code (for type=via_fix) |
direction |
string | arr/dep/both (for type=via_fix) |
minutes_ahead |
int | Time window (default: 60, max: 720) |
airline |
string | Filter by airline prefix |
aircraft_type |
string | Filter by aircraft type |
aircraft_category |
string | Filter by category (HEAVY, LARGE, SMALL) |
Example:
GET /api/adl/demand/details?type=fix&fix=MERIT&minutes_ahead=60
Response:
{
"monitor_id": "fix_MERIT",
"monitor_type": "fix",
"minutes_ahead": 60,
"flights": [
{
"flight_uid": 12345,
"callsign": "AAL123",
"departure": "KJFK",
"destination": "KBOS",
"aircraft_type": "A320",
"eta_utc": "2026-01-15T22:30:00Z",
"minutes_until": 15,
"phase": "enroute",
"status": "before"
}
],
"total_count": 12
}Position Status:
| Status | Description |
|---|---|
before |
Flight hasn't reached the fix/segment yet |
in |
Flight is currently within the segment |
after |
Flight has passed the fix/segment |
- API Reference - Complete API overview
- TMI API - Traffic management APIs
- Data Flow - How flight data is processed
PERTI - Virtual Air Traffic Control System Command Center Production Site | GitHub | Report Issue
Last updated: 2026-02-25
Home Navigation Helper (NEW)
Comprehensive Guides
Getting Started
Architecture
Algorithms & Processing
- Algorithms Overview
- Algorithm ETA Calculation
- Algorithm Trajectory Tiering
- Algorithm Zone Detection
- Algorithm Route Parsing
- Algorithm Data Refresh
SWIM API (Public/External)
- SWIM API
- SWIM Routes API
- SWIM Playbook API
- SWIM Route Data Integration
- Building Route Processing
- CDM Connector Guide
PERTI API (Internal)
Features
Walkthroughs
Operations
Development
Analysis
- Analysis (index)
- ETA Accuracy (Jan-Mar 2026)
Reference