Overview
The AIRAC API provides access to worldwide aviation navigation data including waypoints, navaids, airways, airports, and procedures. Data is updated every AIRAC cycle (28 days) to ensure accuracy and compliance with current aviation standards.
Note: This API aggregates data from multiple authoritative sources including government aviation authorities, commercial navigation data providers, and certified aeronautical databases to provide comprehensive global coverage.
Key Features
- RESTful JSON API
- No authentication required
- AIRAC cycle-aware caching
- Global aviation data coverage
Data Sources
- FAA NASR & CIFP data
- Jeppesen NavData
- International sources
- Updated every 28 days
- Quality-assured data
View Complete Data Source List
Primary Navigation Data
- • FAA NASR (National Airspace System Resources)
- • CIFP (Coded Instrument Flight Procedures)
- • Jeppesen NavData
- • Lido Navigation Data
- • ARINC Navigation Database
International Sources
- • NavCanada FIS
- • AirServices Australia
- • Aisweb Brazil API
- • New Zealand AIP (XML)
- • ForeFlight GIS VFR Capture
Base URL
https://airac.net/api/v1
All API endpoints are relative to this base URL.
AIRAC Cycle
All API responses include AIRAC cycle information in the headers:
- X-AIRAC-Cycle:
- Current AIRAC cycle (e.g., "2512")
- X-AIRAC-Effective-Date:
- Cycle effective date in ISO 8601 format
- X-AIRAC-Expiration-Date:
- Cycle expiration date in ISO 8601 format
Get Current AIRAC Cycle
GET/airac/current
Returns the current AIRAC cycle information including effective dates and days remaining.
Example Request
curl -H "Accept: application/json" \
https://airac.net/api/v1/airac/current
Example Response
{
"status": "success",
"data": {
"cycle": "2512",
"effective_date": "2025-11-27T00:00:00+00:00",
"expiration_date": "2025-12-25T00:00:00+00:00",
"is_current": true,
"days_remaining": 3
}
}
Caching
Show endpoints (specific resource lookups) include cache headers that expire at the end of the current AIRAC cycle:
- Cache-Control
- Public caching with max-age until cycle expiration
- ETag
- Entity tag for conditional requests
- Last-Modified
- AIRAC cycle effective date
- Expires
- AIRAC cycle expiration date
Note: Query endpoints (searches and listings) are not cached to ensure fresh results.
Waypoints
Search Waypoints
/waypoints
Parameters:
| Parameter | Type | Description |
|---|---|---|
identifier |
string | Waypoint identifier (e.g., "ROKME") |
region |
string | ICAO region code (e.g., "K2") |
type |
string | Waypoint type code (C, I, N, R, U, V, W) |
name |
string | Waypoint name (partial match) |
page |
integer | Page number (default: 1) |
per_page |
integer | Results per page (default: 50, max: 100) |
Example Request:
GET /api/v1/waypoints?identifier=ROKME®ion=K2
Example Response:
{
"status": "success",
"data": [
{
"identifier": "ROKME",
"latitude": 34.156667,
"longitude": -117.327222,
"name": "ROKME",
"type": {
"code": "REP-PT",
"description": "Reporting Point"
},
"coordinates": {
"lat": 34.156667,
"lon": -117.327222
},
"url": "http://localhost:8000/api/v1/waypoints/K2/ROKME",
"region": "K2"
}
],
"pagination": {
"page": 1,
"per_page": 50,
"total": null,
"has_more": false
}
}
Find Nearby Waypoints
/waypoints/nearby
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
latitude |
float | ✓ | Center latitude |
longitude |
float | ✓ | Center longitude |
radius |
float | ✓ | Search radius in nautical miles |
Example Request:
GET /api/v1/waypoints/nearby?latitude=33.9425&longitude=-118.4081&radius=20
Get Specific Waypoint
/waypoints/{identifier}
Query Parameters:
region |
string | Optional region code for disambiguation |
Example Request:
GET /api/v1/waypoints/ROKME // Returns all waypoints named ROKME
GET /api/v1/waypoints/K2/ROKME // Returns specific waypoint in region K2
Example Response:
{
"status": "success",
"data": {
"identifier": "ROKME",
"latitude": 34.156667,
"longitude": -117.327222,
"name": "ROKME",
"type": {
"code": "REP-PT",
"description": "Reporting Point"
},
"coordinates": {
"lat": 34.156667,
"lon": -117.327222
},
"url": "http://localhost:8000/api/v1/waypoints/K2/ROKME",
"region": "K2"
}
}
Note: When multiple waypoints share the same identifier, the API returns an array. Use the region in the path to get a specific waypoint.
Airways
Search Airways
/airways
Parameters:
| Parameter | Type | Description |
|---|---|---|
identifier |
string | Airway identifier (e.g., "J1") |
type |
string | Airway type (V, J, Q, T, L, S) |
level |
string | Flight level (low, high) |
fix |
string | Find airways containing this fix |
Example Request:
GET /api/v1/airways?identifier=J1
Example Response:
{
"status": "success",
"data": [
{
"identifier": "J1",
"type": "J",
"url": "http://localhost:8000/api/v1/airways/J1",
"minimum_altitude_ft": 18000,
"maximum_altitude_ft": 45000
}
]
}
Get Specific Airway
/airways/{identifier}
Returns airway details including all segments.
Example Request:
GET /api/v1/airways/J1
Find Route Between Fixes
/airways/route
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
from |
string | ✓ | Starting fix identifier |
to |
string | ✓ | Ending fix identifier |
Example Request:
GET /api/v1/airways/route?from=LAX&to=SFO
Airports
Search Airports
/airports
Parameters (at least one required):
| Parameter | Type | Description |
|---|---|---|
identifier |
string | ICAO/IATA/LID code |
name |
string | Airport name (partial match) |
city |
string | City name (partial match) |
country |
string | Country code |
type |
string | Airport type |
min_runway_length |
integer | Minimum runway length in feet |
Example Request:
GET /api/v1/airports?city=Los%20Angeles
Example Response:
{
"status": "success",
"data": [
{
"icao": "KLAX",
"name": "Los Angeles International Airport",
"latitude": 33.9425,
"longitude": -118.4081,
"coordinates": {
"lat": 33.9425,
"lon": -118.4081
},
"url": "http://localhost:8000/api/v1/airports/KLAX",
"links": {
"procedures": "http://localhost:8000/api/v1/airports/KLAX/procedures"
},
"iata": "LAX",
"elevation_ft": 125,
"city": "Los Angeles",
"state": "CA",
"country": "US"
}
]
}
Find Nearby Airports
/airports/nearby
Same parameters as waypoints/nearby endpoint.
Example Request:
GET /api/v1/airports/nearby?latitude=33.9425&longitude=-118.4081&radius=30
Get Specific Airport
/airports/{icao}
Accepts ICAO (4-letter) or IATA (3-letter) codes.
Example Request:
GET /api/v1/airports/KLAX
Procedures
Search Procedures
/procedures
Parameters (airport or type required):
| Parameter | Type | Description |
|---|---|---|
airport |
string | Airport ICAO code |
identifier |
string | Procedure identifier |
type |
string | Procedure type (SID, STAR, APP) |
runway |
string | Runway identifier |
fix |
string | Find procedures containing this fix |
Example Request:
GET /api/v1/procedures?airport=KLAX&type=SID
Example Response:
{
"status": "success",
"data": [
{
"airport": "KLAX",
"airport_url": "http://localhost:8000/api/v1/airports/KLAX",
"identifier": "LOOP1",
"type": {
"code": "SID",
"description": "Standard Instrument Departure"
},
"name": "LOOP ONE",
"url": "http://localhost:8000/api/v1/procedures/KLAX/LOOP1",
"links": {
"transitions": "http://localhost:8000/api/v1/procedures/KLAX/LOOP1/transitions"
},
"runway": "25L"
}
]
}
Get Specific Procedure
/procedures/{airport}/{identifier}
Returns procedure details. Without a transition parameter, returns a structured format showing all transitions and the common route. With a transition parameter, returns only that specific transition's segments.
Query Parameters:
transition |
string | Optional - specific transition (e.g., "SEA", "RW28L") |
Example Request (Structured):
GET /api/v1/procedures/KPDX/HELNS6
Example Response (Structured):
{
"status": "success",
"data": {
"airport": "KPDX",
"airport_url": "http://localhost:8000/api/v1/airports/KPDX",
"identifier": "HELNS6",
"type": {
"code": "STAR",
"description": "Standard Terminal Arrival Route"
},
"name": "HELNS SIX",
"url": "http://localhost:8000/api/v1/procedures/KPDX/HELNS6",
"common_route": [
{
"sequence": 10,
"fix_identifier": "HELNS",
"fix_url": "http://localhost:8000/api/v1/waypoints/HELNS",
"fix_coordinates": { "lat": 46.9523, "lon": -122.3096 }
},
{
"sequence": 20,
"fix_identifier": "KRATR",
"fix_url": "http://localhost:8000/api/v1/waypoints/KRATR",
"fix_coordinates": { "lat": 46.2761, "lon": -122.4939 }
}
],
"transitions": {
"SEA": [
{ "sequence": 10, "fix_identifier": "SEA" },
{ "sequence": 20, "fix_identifier": "BUWZO" },
{ "sequence": 30, "fix_identifier": "HELNS" }
],
"BUWZO": [
{ "sequence": 10, "fix_identifier": "BUWZO" },
{ "sequence": 20, "fix_identifier": "HELNS" }
]
},
"runway_transitions": {
"28L": [
{ "sequence": 10, "fix_identifier": "BTG" },
{ "sequence": 20, "fix_identifier": "KPDX" }
]
},
"available_transitions": ["SEA", "BUWZO"],
"available_runways": ["03", "10B", "21", "28L", "28R"]
}
}
Example Request (Specific Transition):
GET /api/v1/procedures/KPDX/HELNS6?transition=SEA
Example Response (Specific Transition):
{
"status": "success",
"data": {
"airport": "KPDX",
"identifier": "HELNS6",
"type": { "code": "STAR", "description": "Standard Terminal Arrival Route" },
"transition": "SEA",
"segments": [
{
"sequence": 10,
"path_terminator": "TF",
"fix_identifier": "SEA"
},
{
"sequence": 20,
"path_terminator": "TF",
"fix_identifier": "BUWZO",
"fix_coordinates": { "lat": 46.9523, "lon": -122.3096 }
}
]
}
}
Get Procedure Transitions
/procedures/{airport}/{identifier}/transitions
Example Request:
GET /api/v1/procedures/KLAX/LOOP1/transitions
Routes
Router Parser
/routes/parse
Parse a route string, calculating distances and bearings between waypoints.
Query Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
origin |
string | ✓ | Origin airport ICAO code (4 letters) |
destination |
string | ✓ | Destination airport ICAO code (4 letters) |
route |
string | ✓ | Route string (max 2000 characters) |
departure_runway |
string | Departure runway (e.g., 07R, 25L). Optional but recommended for proper SID selection | |
arrival_runway |
string | Arrival runway (e.g., 27L, 09R). Optional but recommended for proper STAR selection |
Supported Route Elements:
- Waypoints: 2-5 letter identifiers (e.g., DOTSS, CIVET)
- Airways: Letter followed by numbers (e.g., J5, V23, Q822) - automatically expanded to include all intermediate waypoints
- Coordinates: Lat/Lon in format DDNDDW (e.g., 51N020W) or DDMMN/DDDMMW
- SID/STAR procedures: Alphanumeric identifiers (e.g., OBOK3D, LOGA2H) - automatically expanded to include all procedure waypoints
- NAT Tracks: NAT followed by letter or number (e.g., NATA, NATB, NAT1)
Route Processing Features:
- Airway Expansion: Airways are automatically expanded to show all intermediate waypoints between entry and exit points
- SID/STAR Expansion: Procedures are expanded to show all waypoints in the departure/arrival routing
- Runway Transitions: When departure/arrival runways are provided, appropriate runway-specific transitions are selected for SIDs/STARs
- Duplicate Removal: Consecutive duplicate waypoints are automatically removed
- Distance & Bearing: Calculates great circle distance (nm) and true bearing between each waypoint pair
Example Request:
GET /api/v1/routes/parse?origin=EDDF&destination=EGLL&route=OBOK3D%20OBOKA%20Z29%20TORNU%20BREDA%20ABNED%20L980%20LOGAN%20LOGA2H&departure_runway=07C&arrival_runway=09L
Example Response:
{
"status": "success",
"data": {
"origin": "EDDF",
"destination": "EGLL",
"total_distance": 410.2,
"segments": [
{
"from": {
"identifier": "EDDF",
"name": "Frankfurt/Main",
"type": "airport",
"coordinates": {
"lat": 50.033333,
"lon": 8.570556
}
},
"to": {
"identifier": "DF08C",
"name": "DF08C",
"type": "waypoint",
"coordinates": {
"lat": 50.049167,
"lon": 8.628056
},
"via": "OBOK3D"
},
"distance": 3.2,
"bearing": 070,
"cumulative_distance": 3.2
},
{
"from": {
"identifier": "DF08C",
"name": "DF08C",
"type": "waypoint",
"coordinates": {
"lat": 50.049167,
"lon": 8.628056
}
},
"to": {
"identifier": "DF149",
"name": "DF149",
"type": "waypoint",
"coordinates": {
"lat": 50.142778,
"lon": 8.696111
},
"via": "OBOK3D"
},
"distance": 7.2,
"bearing": 035,
"cumulative_distance": 10.4
},
// ... additional segments showing expanded SID waypoints, airway waypoints, and STAR waypoints ...
],
"errors": []
}
}
Note: Errors are non-blocking. The navlog will still be generated for valid segments.
Error Types:
airport_not_found- Origin or destination airport not found (critical error)waypoint_not_found- Waypoint identifier not found in databaseairway_not_found- Airway identifier not foundairway_endpoints_not_found- Entry or exit waypoints for airway not specifiedwaypoints_not_on_airway- Entry/exit waypoints not found on specified airwayprocedure_not_found- SID/STAR procedure not found at airportprocedure_no_segments- Procedure found but has no route segmentsprocedure_waypoint_not_found- Waypoint in procedure could not be resolvednat_track_not_supported- NAT tracks are not currently supported
Airspace
Search Controlled Airspace
/airspace/controlled
Search for controlled airspace areas (Class A, B, C, D, E).
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
classification |
string | Airspace class (A, B, C, D, E) | |
name |
string | Airspace name (partial match) | |
airport |
string | Airport ICAO code (e.g., "KLAX") | |
page |
integer | Page number |
Example Request:
GET /api/v1/airspace/controlled?classification=B&airport=KLAX
Example Response:
{
"status": "success",
"data": [
{
"type": "D",
"name": "LOS ANGELES",
"classification": "B",
"center": "KLAX",
"lower_limit": {
"value": 0,
"unit": "ft",
"reference": "ground",
"text": "GND"
},
"upper_limit": {
"value": 10000,
"unit": "ft",
"reference": "msl",
"text": "10000 ft MSL"
}
}
]
}
Search Restricted Airspace
/airspace/restricted
Search for restricted, prohibited, warning, and alert areas.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
type |
string | Type (R-Restricted, P-Prohibited, W-Warning, A-Alert) | |
designation |
string | Area designation (e.g., "R-2501") | |
active |
boolean | Only show currently active areas |
Example Request:
GET /api/v1/airspace/restricted?type=R
Example Response:
{
"status": "success",
"data": [
{
"type": { "code": "R", "description": "Restricted Area" },
"designation": "2501",
"name": "Fort Irwin",
"url": "http://localhost:8000/api/v1/airspace/restricted/2501",
"lower_limit": {
"value": 0,
"unit": "ft",
"reference": "ground",
"text": "SFC"
},
"upper_limit": {
"value": null,
"unit": null,
"reference": "unlimited",
"text": "Unlimited"
},
"controlling_agency": "ZLA ARTCC",
"active_by_notam": true
}
]
}
Get Restricted Airspace by Designation
/airspace/restricted/{designation}
Retrieve restricted airspace information by its designation identifier.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
designation |
string | ✓ | Airspace designation (e.g., "500", "2501") |
Example Request:
GET /api/v1/airspace/restricted/500
Example Response:
{
"status": "success",
"data": {
"type": { "code": "R", "description": "Restricted Area" },
"designation": "500",
"name": "NOTO",
"url": "http://localhost:8000/api/v1/airspace/restricted/500",
"lower_limit": {
"value": 4000,
"unit": "ft",
"reference": "agl",
"text": "04000 ft AGL"
},
"upper_limit": {
"value": 19000,
"unit": "ft",
"reference": "standard",
"text": "FL190"
}
}
}
Search FIR/UIR Regions
/airspace/fir
Search for Flight Information Regions (FIR) and Upper Information Regions (UIR).
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
identifier |
string | FIR identifier (e.g., "KZLA") | |
name |
string | FIR name (partial match) | |
country |
string | Country code |
Example Request:
GET /api/v1/airspace/fir?identifier=KZLA
Example Response:
{
"status": "success",
"data": [
{
"identifier": "KZLA",
"name": "Los Angeles Center",
"type": {
"code": "FIR",
"description": "Flight Information Region"
},
"url": "http://localhost:8000/api/v1/airspace/fir/KZLA",
"country_code": "US",
"is_subregion": false
}
]
}
Get Specific FIR/UIR
/airspace/fir/{identifier}
Retrieve detailed information about a specific FIR/UIR region.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
identifier |
string | ✓ | FIR identifier |
Example Request:
GET /api/v1/airspace/fir/KZLA
Reference Data
List All Countries
/countries
Retrieve a paginated list of all countries.
Example Request:
GET /api/v1/countries?page=1
Example Response:
{
"status": "success",
"data": [
{
"code": "US",
"name": "United States",
"url": "http://localhost:8000/api/v1/countries/US"
}
]
}
Get Country
/countries/{code}
Retrieve a specific country by ISO 2-letter code.
Example Request:
GET /api/v1/countries/US
List States for Country
/countries/{country}/states
Retrieve all states/provinces for a specific country.
Example Request:
GET /api/v1/countries/US/states
Example Response:
{
"status": "success",
"data": [
{
"state_code": "CA",
"name": "California",
"country_code": "US",
"country": {
"code": "US",
"name": "United States"
}
}
]
}
List All States/Provinces
/states
Retrieve a paginated list of all states/provinces.
Example Request:
GET /api/v1/states?page=1
Get State
/states/{country}/{state}
Retrieve a specific state by country and state codes.
Example Request:
GET /api/v1/states/US/CA
Global Search
Search Across All Data Types
/search
Search across all data types (waypoints, navaids, airways, airports, procedures) with a single query.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
q |
string | ✓ | Search query (minimum 2 characters) |
types |
array | Entity types to search (waypoint, navaid, airway, airport, procedure) |
Example Request:
GET /api/v1/search?q=LAX
Example Response:
{
"status": "success",
"data": {
"waypoints": [],
"navaids": [
{
"identifier": "LAX",
"name": "LOS ANGELES",
"type": { "code": "VOR/DME" },
"coordinates": { "lat": 33.935556, "lon": -118.431944 }
}
],
"airways": [],
"airports": [
{
"icao": "KLAX",
"iata": "LAX",
"name": "Los Angeles International Airport"
}
],
"procedures": []
}
}
Response Format
| Parameter | Type | Required | Description |
|---|---|---|---|
query |
string | ✓ | Search query (min 2 chars) |
types[] |
array | Entity types to search (waypoint, navaid, airport) | |
limit |
integer | Max results per type (default: 10, max: 50) |
Example Request:
GET /api/v1/search?query=LAX
Example Response:
{
"status": "success",
"data": {
"airports": [
{
"icao": "KLAX",
"name": "Los Angeles International Airport"
}
],
"navaids": [
{
"identifier": "LAX",
"name": "LOS ANGELES",
"type": "VOR"
}
],
"waypoints": []
}
}
Response Format
Success Response
{
"status": "success",
"data": {
// Response data
}
}
Paginated Response
{
"status": "success",
"data": [...],
"pagination": {
"page": 1,
"per_page": 50,
"total": null,
"has_more": true
}
}
Error Response
{
"status": "error",
"message": "Error description"
}
Data Types
Waypoint Types
| Code | Description |
|---|---|
C |
Combined named intersection and RNAV |
I |
Unnamed, charted intersection |
N |
NDB navaid as waypoint |
R |
Named intersection |
U |
Uncharted airway intersection |
V |
VFR waypoint |
W |
RNAV waypoint |
Navaid Types
| Type | Description |
|---|---|
VOR |
VHF Omnidirectional Range |
VORDME |
VOR/DME |
DME |
Distance Measuring Equipment |
TACAN |
Tactical Air Navigation |
VORTAC |
VOR/TACAN |
NDB |
Non-Directional Beacon |
Procedure Types
| Type | Description |
|---|---|
SID |
Standard Instrument Departure |
STAR |
Standard Terminal Arrival Route |
APP |
Instrument Approach Procedure |
Usage Guidelines
To ensure a great experience for all users, please follow these guidelines:
Best Practices
Technical Guidelines
User-Agent Requirements
Please use a descriptive User-Agent header that identifies your application:
Good Examples
MyFlightTracker/1.0 (https://myapp.com; contact@myapp.com)
AviationStats/2.1 (+https://github.com/username/repo)
RouteAnalyzer/1.0 (Discord: username#1234)
FlightPlannerPro/3.0 (https://flightplanner.pro)
AeroDataBot/1.5 (Twitter: @aerodatabot)
Bad Examples
curl/7.64.1
python-requests/2.28.0
Mozilla/5.0 (compatible)
Java/1.8.0
axios/0.27.2
Accessing JSON Data
All API endpoints return JSON data. Always include the Accept header:
curl -H "Accept: application/json" \
-H "User-Agent: MyApp/1.0 (contact@myapp.com)" \
https://airac.net/api/v1/waypoints
Pagination
The API uses page-based pagination for list endpoints:
GET /api/v1/waypoints?page=2&per_page=100
Important Notes
- • Default page size is 50 items
- • Maximum page size is 100 items
-
•
Check
has_moreto determine if additional pages exist - • Page numbering starts at 1
Rate Limits
Currently, there are no enforced rate limits. However, we ask that you be respectful of server resources.
If rate limits are implemented in the future, standard HTTP headers will be used:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 59
X-RateLimit-Reset: 1640995200
Best Practice: Implement proper handling for 429 (Too Many Requests) responses with exponential backoff.
Questions & Support
If you have questions about the API or need assistance:
Please include your User-Agent string when reporting issues