AIRAC API Documentation

Comprehensive aviation data API for waypoints, navaids, airways, airports, and procedures

RESTful JSON API Updated Every AIRAC Cycle Fast & Reliable

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 documentation focuses on the public API contract: parameters, validation rules, response shapes, and caching behavior. Query endpoints return live results for the current AIRAC cycle, while example payloads are representative rather than exhaustive.

Key Features

  • RESTful JSON API
  • No authentication required
  • AIRAC cycle-aware caching for show endpoints
  • Global aviation data coverage

Contract Highlights

  • Page-based pagination with real total and has_more values
  • Spatial filters match exact geometry after spatial prefiltering
  • Point and bounds validation errors are returned as structured JSON
  • Global search groups results by entity type instead of returning one mixed ranked list

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

GET /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&region=K2

Example Response:

{
    "status": "success",
    "data": [
        {
            "identifier": "ROKME",
            "latitude": 34.156667,
            "longitude": -117.327222,
            "name": "ROKME",
            "type": {
                "code": "C",
                "description": "Combined named intersection and RNAV"
            },
            "coordinates": {
                "lat": 34.156667,
                "lon": -117.327222
            },
            "url": "https://airac.net/api/v1/waypoints/K2/ROKME",
            "region": "K2"
        }
    ],
    "pagination": {
        "page": 1,
        "per_page": 50,
        "total": 1,
        "has_more": false
    }
}

Find Nearby Waypoints

GET /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

GET /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": "C",
            "description": "Combined named intersection and RNAV"
        },
        "coordinates": {
            "lat": 34.156667,
            "lon": -117.327222
        },
        "url": "https://airac.net/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

GET /airways

Returns one entry per airway designator. Each entry includes the unique starting ICAO regions available for region-scoped detail lookup.

Parameters:

Parameter Type Description
identifier string Airway identifier (e.g., "J1")
type string Route designator prefix (for example V, J, Q, T, L, S, N, U, Y, Z)
level string Flight level (low, high)
fix string Find airways containing this fix

Example Request:

GET /api/v1/airways?identifier=W56

Example Response:

{
    "status": "success",
    "data": [
        {
            "identifier": "W56",
            "regions": [
                "SA",
                "UL",
                "VA",
                "ZG"
            ],
            "type": "W",
            "url": "https://airac.net/api/v1/airways/W56"
        }
    ]
}

Get Specific Airway

GET /airways/{identifier}

Returns airway details including all segments. Use the optional starting ICAO region to separate unrelated airways that reuse the same designator.

Query Parameters:

region string Optional one- or two-character alphanumeric starting ICAO region from the airway listing

Example Request:

GET /api/v1/airways/W56?region=ZG

The region parameter identifies an airway by the ICAO region of its first ordered segment. The response includes the airway's complete segment sequence, including segments in other regions. Airways with the same designator and starting region are returned as a single merged airway.

Find Route Between Fixes

GET /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

GET /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": "https://airac.net/api/v1/airports/KLAX",
            "links": {
                "procedures": "https://airac.net/api/v1/airports/KLAX/procedures"
            },
            "iata": "LAX",
            "elevation_ft": 125,
            "city": "Los Angeles",
            "state": "CA",
            "country": "US"
        }
    ]
}

Find Nearby Airports

GET /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

GET /airports/{icao}

Accepts ICAO, IATA, or LID airport codes.

Example Request:

GET /api/v1/airports/KLAX

Procedures

Search Procedures

GET /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": "https://airac.net/api/v1/airports/KLAX",
            "identifier": "LOOP1",
            "type": {
                "code": "SID",
                "description": "Standard Instrument Departure"
            },
            "name": "LOOP ONE",
            "url": "https://airac.net/api/v1/procedures/KLAX/LOOP1",
            "links": {
                "transitions": "https://airac.net/api/v1/procedures/KLAX/LOOP1/transitions"
            },
            "runway": "25L"
        }
    ]
}

Get Specific Procedure

GET /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.

Altitude Restrictions:

Segments may include altitude_ft and altitude_restriction (at, at_or_above, at_or_below, or between). Altitudes are expressed in feet.

For between restrictions, minimum_altitude_ft and maximum_altitude_ft provide the inclusive lower and upper limits when both source altitudes are available. The existing altitude_ft field continues to contain the upper limit for compatibility. Both range fields are omitted if either source altitude is missing.

These fields apply to segments in common_route, transitions, runway_transitions, and the segments array returned for a specific transition. For example, an ANJLL segment on KLAX BIGBR3 includes:

{
    "fix_identifier": "ANJLL",
    "altitude_ft": 29000,
    "altitude_restriction": "between",
    "minimum_altitude_ft": 24000,
    "maximum_altitude_ft": 29000,
    "speed_kts": 280
}

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": "https://airac.net/api/v1/airports/KPDX",
        "identifier": "HELNS6",
        "type": {
            "code": "STAR",
            "description": "Standard Terminal Arrival Route"
        },
        "name": "HELNS SIX",
        "url": "https://airac.net/api/v1/procedures/KPDX/HELNS6",
        "common_route": [
            {
                "sequence": 10,
                "fix_identifier": "HELNS",
                "fix_url": "https://airac.net/api/v1/waypoints/HELNS",
                "fix_coordinates": { "lat": 46.9523, "lon": -122.3096 }
            },
            {
                "sequence": 20,
                "fix_identifier": "KRATR",
                "fix_url": "https://airac.net/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

GET /procedures/{airport}/{identifier}/transitions

Example Request:

GET /api/v1/procedures/KLAX/LOOP1/transitions

Routes

Router Parser

GET /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 database
  • airway_not_found - Airway identifier not found
  • airway_endpoints_not_found - Entry or exit waypoints for airway not specified
  • waypoints_not_on_airway - Entry/exit waypoints not found on specified airway
  • procedure_not_found - SID/STAR procedure not found at airport
  • procedure_no_segments - Procedure found but has no route segments
  • procedure_waypoint_not_found - Waypoint in procedure could not be resolved
  • nat_track_not_supported - NAT tracks are not currently supported

Airspace

Spatial filters accept either a point (lat and lon) or a bounding box (min_lat, max_lat, min_lon, max_lon). Point and bounds filters use exact geometry matches after a spatial prefilter. For bounds validation, min_lat must be less than or equal to max_lat. For longitude wrapping, antimeridian-wrapping bounds are supported when min_lon is greater than max_lon. Controlled and restricted airspace bounds may span at most 30 degrees of latitude, 60 degrees of longitude, and 900 square degrees; split larger regions into tiles.

Search Controlled Airspace

GET /airspace/controlled

Search for controlled airspace areas (Class A, B, C, D, E).

Parameters:

Parameter Type Required Description
type string Exact airspace type code
classification string Airspace class (A, B, C, D, E)
name string Airspace name (partial match)
icao string ICAO region code
airport string Airport ICAO code (e.g., "KLAX")
altitude_ft integer Return airspace that contains this altitude in feet
min_lat float Bounding box south latitude
max_lat float Bounding box north latitude
min_lon float Bounding box west longitude; may be greater than max_lon to wrap the antimeridian
max_lon float Bounding box east longitude
page integer Page number
per_page integer Results per page

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

GET /airspace/restricted

Search for restricted, prohibited, warning, and alert areas.

Parameters:

Parameter Type Required Description
type string Type (A, C, D, M, P, R, T, W)
designation string Area designation (e.g., "R-2501")
name string Airspace name (partial match)
icao string ICAO region code
altitude_ft integer Return airspace that contains this altitude in feet
min_lat float Bounding box south latitude
max_lat float Bounding box north latitude
min_lon float Bounding box west longitude; may be greater than max_lon to wrap the antimeridian
max_lon float Bounding box east longitude
page integer Page number
per_page integer Results per page

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": "https://airac.net/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

GET /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": "https://airac.net/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

GET /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
type string Region type: F (FIR), U (UIR), or B (combined FIR/UIR)
lat float Latitude for point containment lookup; use with lon
lon float Longitude for point containment lookup; use with lat
min_lat float Bounding box south latitude
max_lat float Bounding box north latitude
min_lon float Bounding box west longitude; may be greater than max_lon to wrap the antimeridian
max_lon float Bounding box east longitude
page integer Page number
per_page integer Results per page

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": "https://airac.net/api/v1/airspace/fir/KZLA",
            "country_code": "US",
            "is_subregion": false
        }
    ]
}

Get Specific FIR/UIR

GET /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

GET /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": "https://airac.net/api/v1/countries/US"
        }
    ]
}

Get Country

GET /countries/{code}

Retrieve a specific country by ISO 2-letter code.

Example Request:

GET /api/v1/countries/US

List States for Country

GET /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

GET /states

Retrieve a paginated list of all states/provinces.

Example Request:

GET /api/v1/states?page=1

Get State

GET /states/{country}/{state}

Retrieve a specific state by country and state codes.

Example Request:

GET /api/v1/states/US/CA

Response Format

Success Response

{
    "status": "success",
    "data": {
        // Response data
    }
}

Paginated Response

{
    "status": "success",
    "data": [...],
    "pagination": {
        "page": 1,
        "per_page": 50,
        "total": 125,
        "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
VOR/DME VOR with Distance Measuring Equipment
DME Distance Measuring Equipment
TACAN Tactical Air Navigation
VORTAC VOR with Tactical Air Navigation
NDB Non-Directional Beacon
NDB/DME Non-Directional Beacon with Distance Measuring Equipment

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

Be respectful of server resources
Set meaningful User-Agent headers
Cache responses appropriately

Technical Guidelines

Handle errors with exponential backoff
Honor caching headers and pagination metadata
Use JSON API, not HTML scraping

User-Agent Requirements

Please use a descriptive User-Agent header that identifies your application:

Good Examples

MyFlightTracker/1.0 (https://myapp.com; [email protected]) 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 ([email protected])" \
     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_more to determine if additional pages exist
  • • Page numbering starts at 1

Rate Limits

Currently, there are no enforced rate limits. No rate limit headers are emitted today, but we still ask that you be respectful of server resources.

Best Practice: Cache successful responses when appropriate and retry transient network or 5xx failures conservatively.

Questions & Support

If you have questions about the API or need assistance:

Please include your User-Agent string when reporting issues