Airports API
Retrieve detailed airport information including runways, NOTAMs, and operational data for performance calculations.
Overview
The Airports API provides comprehensive airport data required for performance calculations. Airport data is retrieved based on the selected aircraft profile, as different aircraft types have different airport databases with specific obstacle clearance procedures and engine failure procedures.
Airport availability depends on the
aircraft type, not the user's subscription. This
is because obstacles, engine failure procedures, and climb
gradients may differ between aircraft types. Use the
availableAirport array from the aircraft response to
determine which airports can be queried for a specific aircraft.
Data Access Levels
The Airports API provides different levels of data based on your subscription tier. The amount of airport data returned depends on your access level.
| Level | Description | Included Data |
|---|---|---|
| SIMPLE | Basic airport and runway data | Core airport info, runway dimensions, basic procedures, NOTAM status |
| MEDIUM | Extended operational data | All SIMPLE data plus: PCN, surface type, MACG, GA acceleration altitude, aircraft lineup data, database changelog |
| FULL | Complete database access | All MEDIUM data plus: obstacle data, detailed terrain analysis (Reserved for VPT internal projects) |
Important: Obstacle details are not provided to third-party integrations. Obstacles are used internally during performance calculations but will not be included in the API response. This data is reserved exclusively for Virtual Performance Tool's own applications.
Get Airport
Retrieves detailed airport information for performance calculations.
Request Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
query |
string |
Required | Must be "airport" |
data.aircraft |
string |
Required |
Aircraft profile filename (from
allowedAircrafts)
|
data.userRegistration |
string|null |
Required | User registration value (or null) |
data.virtualAirline |
string|null |
Required | Virtual airline value (or null) |
data.icao |
string |
Required | Airport ICAO code (e.g., "EBBR") |
Request Body
{
"query": "airport",
"data": {
"aircraft": "320-212-CFM56-5A3.json",
"userRegistration": null,
"virtualAirline": null,
"icao": "EBBR"
}
}
cURL Example
curl -X POST "https://api.virtualperformancetool.com/api" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json" \
-H "X-API-Version: 1.3.6" \
-d '{
"query": "airport",
"data": {
"aircraft": "320-212-CFM56-5A3.json",
"userRegistration": null,
"virtualAirline": null,
"icao": "EBBR"
}
}'
Response (SIMPLE Access)
Basic airport data without extended operational details:
{
"apiVersion": "1.3.6",
"airport": {
"icao": "EBBR",
"iata": "BRU",
"name": "BRUSSELS NATIONAL",
"country": "BELGIUM",
"altitude": "175",
"procedure": "PANS-OPS",
"longestRunwayLength": "11935",
"city": "BRUSSELS",
"lat": 50.902,
"lon": 4.499,
"latDeg": "N50°54'7\"",
"lonDeg": "E4°29'56\"",
"databaseDate": "18/09/2024 16:11:04",
"notamMonitored": true,
"databaseLastCheck": "1970-01-01 00:00:00",
"notam": null,
"availableRunwaysTakeoff": [
{
"runway": "07L",
"rwyQfu": "64",
"tora": "11935",
"lda": "10990",
"slopeTora": "-0.21",
"brElev": "124",
"efp": "Maintain 064° to 25 NM and HOLD...",
"efpLong": "STD.",
"comments": "T/O FROM RWY HEAD",
"width": 147.6378,
"isClosed": false,
"closedNotam": null,
"availableIntx": [
{
"runway": "07LI1",
"taxi": "A6",
"tora": "8677",
"comments": "T/O FROM \"A6\"**T/O SHIFT 993M"
}
// ... additional intersections
]
},
{
"runway": "25R",
"rwyQfu": "244",
"tora": "11935",
"lda": "10954",
"slopeTora": "0.21",
"brElev": "99",
"efp": "Maintain 244° to 25 NM and HOLD...",
"efpLong": "STD.",
"isClosed": false,
"availableIntx": [ /* ... */ ]
}
// ... additional runways (01, 07R, 19, 25L)
],
"availableRunwaysLanding": [
// Similar structure to takeoff runways
]
}
}
Response (MEDIUM Access)
Extended data including PCN, surface type, and changelog:
{
"apiVersion": "1.3.6",
"airport": {
"icao": "EBBR",
"iata": "BRU",
"name": "BRUSSELS NATIONAL",
"country": "BELGIUM",
"altitude": "175",
"procedure": "PANS-OPS",
// ... same core fields as SIMPLE ...
"availableRunwaysTakeoff": [
{
"runway": "07L",
"rwyQfu": "64",
"tora": "11935",
"lda": "10990",
"slopeTora": "-0.21",
"slopeAsda": "-0.21",
"slopeLda": "-0.20",
"brElev": "124",
"efp": "Maintain 064° to 25 NM and HOLD...",
"efpLong": "STD.",
"comments": "T/O FROM RWY HEAD",
"aircraftLineup": "'737-800' 035.40 086.60 'F'",
"gaAccAlt": "1500",
"width": 147.6378,
"pcn": "80/F/A/W/T",
"surface": "0.0",
"surfaceText": "Hard",
"macg": [
{ "gradient": 2.5, "label": "" }
],
"isClosed": false,
"closedNotam": null,
"availableIntx": [
{
"runway": "07LI1",
"taxi": "A6",
"tora": "8677",
"slopeTora": "-0.22",
"pcn": "80/F/A/W/T",
"surfaceText": "Hard",
"macg": [ { "gradient": 2.5, "label": "" } ]
// ... additional fields
}
]
},
{
"runway": "25R",
"rwyQfu": "244",
"tora": "11935",
"pcn": "80/F/A/W/T",
"surfaceText": "Hard",
"macg": [ { "gradient": 2.5, "label": "" } ],
"availableIntx": [ /* ... */ ]
}
// ... additional runways
],
"availableRunwaysLanding": [ /* ... */ ],
"changelog": {
"airportChanged": "BRU (EBBR) - BRUSSELS NATIONAL",
"airportDate": "2024-11-05 20:09:44",
"runwayChanged": [
{ "id": "RUNWAY 07L", "comment": "PCN changed (now PCN/80/F/A/W/T)" },
{ "id": "RUNWAY 25R", "comment": "PCN changed (now PCN/80/F/A/W/T)" }
// ... additional changes
]
}
}
}
MEDIUM access adds: pcn, surface,
surfaceText, macg (Minimum Aircraft
Climb Gradient), gaAccAlt (Go-Around Acceleration
Altitude), aircraftLineup, and the
changelog section.
Airport Info (Lightweight)
Returns a small set of public airport metadata for a given ICAO
code — ICAO, IATA, name, country, geographic coordinates,
and field elevation. This is a lightweight read-only endpoint
intended for autocomplete dropdowns, map markers, briefing
tooltips, and any UI that does not need the full performance
payload returned by airport.
Data is sourced from the B7378 aircraft
database (the broadest airport coverage VPT maintains). If an
ICAO code is not present in B7378 the endpoint returns
AIRPORT_NOT_FOUND.
Authentication
JWT required. Any airport_data developer key level
(SIMPLE / MEDIUM / FULL) is sufficient.
Request Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
query |
string |
Required | Must be "airportInfo" |
data.icao |
string |
Required |
Airport ICAO code, 3–4 alphanumeric characters (e.g.
"EBBR")
|
Request Body
{
"query": "airportInfo",
"data": { "icao": "EBBR" }
}
cURL Example
curl -X POST "https://api.virtualperformancetool.com/api/" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_JWT" \
-d '{
"query": "airportInfo",
"data": { "icao": "EBBR" },
"api_key": "YOUR_API_KEY",
"dev_key": "YOUR_DEV_KEY",
"api_version": "1.3.6"
}'
Response Fields
| Field | Type | Description |
|---|---|---|
airport.icao |
string |
ICAO code (uppercase) |
airport.iata |
string|null |
IATA code, or null if unassigned |
airport.name |
string |
Airport name |
airport.country |
string|null |
Country name, or null when unknown |
airport.coordinates.latitude |
number|null |
Decimal degrees (WGS-84) |
airport.coordinates.longitude |
number|null |
Decimal degrees (WGS-84) |
airport.elevation |
integer|null |
Field elevation in feet (MSL) |
Success Response
{
"success": true,
"airport": {
"icao": "EBBR",
"iata": "BRU",
"name": "BRUSSELS NATIONAL",
"country": "BELGIUM",
"coordinates": {
"latitude": 50.9014,
"longitude": 4.4844
},
"elevation": 184
}
}
Error Codes
-
AUTH_REQUIRED— missing or invalid JWT (HTTP 401) -
INVALID_ICAO— ICAO is missing or not 3–4 alphanumeric characters (HTTP 400) -
AIRPORT_NOT_FOUND— the ICAO is not present in the B7378 database (HTTP 404)
Response Sections
The airport response contains several sections providing detailed airport and runway information.
Airport Information
General airport data and location information.
| Field | Type | Description |
|---|---|---|
icao |
string |
ICAO airport code |
iata |
string |
IATA airport code |
name |
string |
Airport name |
country |
string |
Country name |
city |
string |
City name |
altitude |
string |
Airport elevation in feet |
procedure |
string |
Approach procedure type (e.g., "PANS-OPS") |
lat |
number |
Latitude in decimal degrees |
lon |
number |
Longitude in decimal degrees |
latDeg |
string |
Latitude in degrees/minutes/seconds format (e.g.,
"N50°54'7\"")
|
lonDeg |
string |
Longitude in degrees/minutes/seconds format (e.g.,
"E4°29'56\"")
|
longestRunwayLength |
string |
Length of the longest runway in feet |
databaseDate |
string |
Database version date |
databaseLastCheck |
string |
Last database update check (UTC) |
notamMonitored |
boolean |
Whether NOTAMs are actively monitored for this airport |
notam |
object|null |
Requires developer key + user subscription access.
Categorized NOTAMs object containing
international, military, and
obstacles arrays. See
NOTAM Object for structure.
|
Available Runways - Takeoff
The availableRunwaysTakeoff array contains runways
available for takeoff operations.
Core Fields (SIMPLE + MEDIUM)
| Field | Type | Description |
|---|---|---|
runway |
string |
Required for API calculations. Runway
identifier with intersection suffix (e.g., "07L",
"07LI1"). Send this value to the Performance API.
|
rwyId |
string |
Base runway identifier for display purposes (e.g.,
"07L")
|
runwayDisplay |
string |
Formatted display name for the runway |
rwyQfu |
string |
Runway magnetic heading |
taxi |
string |
Taxiway intersection name (empty for full runway) |
tora |
string |
Takeoff Run Available (feet) |
lda |
string |
Landing Distance Available (feet) |
clw |
string |
Clearway (feet) |
stw |
string |
Stopway (feet) |
slopeTora |
string |
Average runway slope for TORA (%) |
slopeAsda |
string |
Average runway slope for ASDA (%) |
slopeLda |
string |
Average runway slope for LDA (%) |
brElev |
string |
Brake release elevation (feet) |
width |
number |
Runway width (feet) |
efp |
string |
Engine Failure Procedure (computed with user preferences) |
efpLong |
string |
Engine Failure Procedure (raw code, e.g., "STD.")
|
comments |
string |
Runway comments and restrictions |
icao |
string |
Required for API calculations. Airport ICAO code to send to the Performance API. |
isClosed |
boolean |
Whether runway is closed (from NOTAM) |
closedNotam |
object|null |
NOTAM closure details if runway is closed (see closedNotam structure below) |
closedNotamFull |
string|null |
Full formatted NOTAM text if runway is closed |
availableIntx |
array |
Available intersection departures (same structure) |
Additional Fields (MEDIUM only)
| Field | Type | Description |
|---|---|---|
aircraftLineup |
string |
Aircraft lineup position data (Unknown) |
gaAccAlt |
string |
Go-Around Acceleration Altitude (feet) |
pcn |
string |
Pavement Classification Number (e.g.,
"80/F/A/W/T")
|
surface |
string |
Surface type code |
surfaceText |
string |
Surface type description (e.g., "Hard") |
macg |
array |
Minimum Aircraft Climb Gradient requirements |
MACG Object
| Field | Type | Description |
|---|---|---|
gradient |
number |
Required climb gradient (%) |
label |
string |
Gradient condition or label |
closedNotam Object
When isClosed is true, the
closedNotam object contains NOTAM closure details:
| Field | Type | Description |
|---|---|---|
id |
string |
Internal NOTAM identifier |
icao |
string |
Airport ICAO code |
runway |
string |
Affected runway designator |
runwayOpp |
string |
Opposite runway designator |
notamId |
string |
Official NOTAM reference number (e.g.,
"A0290/26")
|
notamText |
string |
Short NOTAM text (e.g.,
"RWY 02/20 CLSD. AVBL PPR 10MIN")
|
notamFormattedText |
string |
Full formatted NOTAM text in ICAO format |
periodFrom |
string |
NOTAM validity start (UTC datetime) |
periodTo |
string |
NOTAM validity end (UTC datetime) |
startTime |
string |
Daily start time (HH:mm:ss) |
endTime |
string |
Daily end time (HH:mm:ss) |
daily |
string |
Daily recurrence flag ("1" = daily pattern)
|
weekDays |
string |
Active days of week (e.g., "SUN",
"MON,TUE")
|
used |
string |
Internal usage counter |
Available Runways - Landing
The availableRunwaysLanding array contains runways
available for landing operations. The structure is identical to
availableRunwaysTakeoff with the same fields.
Landing runways contain the same fields as takeoff runways. The
primary difference is contextual: lda is the relevant
distance for landing operations.
NOTAM Object
The notam object contains categorized NOTAMs for the
airport. This field is only available if the developer key and user
subscription grant NOTAM access.
The notam field is only returned when both your
developer key and the user's subscription include NOTAM access. If
not authorized, this field will be null.
NOTAM Categories
| Category | Type | Description |
|---|---|---|
international |
array |
General international NOTAMs (aerodrome, taxiway, runway, approach, etc.) |
military |
array |
Military NOTAMs including US DOD procedural NOTAMs |
obstacles |
array |
Obstacle-related NOTAMs (cranes, temporary structures, etc.) |
NOTAM Object Structure
Each NOTAM in the category arrays contains the following fields:
| Field | Type | Description |
|---|---|---|
notamNumber |
string |
Official NOTAM reference number (e.g.,
"A0290/26")
|
icaoLocation |
string |
ICAO location code for this NOTAM |
type |
string |
NOTAM type code: "N" (New),
"R" (Replaced), "C" (Canceled)
|
typeExplanation |
string |
Human-readable type: "New",
"Replaced", "Canceled"
|
notamText |
string |
Short NOTAM text content |
notamFormattedText |
string |
Full formatted NOTAM text in ICAO format with line breaks |
effectiveStart |
string |
NOTAM effective start datetime (UTC, format:
"YYYY-MM-DD HH:mm:ss")
|
effectiveEnd |
string |
NOTAM effective end datetime (UTC). Permanent NOTAMs show
"9999-12-31 23:59:59"
|
minimumFL |
string |
Minimum flight level affected (e.g., "000")
|
maximumFL |
string |
Maximum flight level affected (e.g., "999")
|
NOTAM Example
{
"notam": {
"International": [
{
"notamNumber": "A0290/26",
"icaoLocation": "LEBL",
"type": "N",
"typeExplanation": "New",
"notamText": "RWY 02/20 CLSD. AVBL PPR 10MIN",
"notamFormattedText": "A0290/26 NOTAMN\nQ) LECB/QMRLC/IV/NBO/A /000/999/4118N00205E005\nA) LEBL B) 2601191500 C) 2601251800\nD) 19 1500-1800, 25 1500-1800\nE) RWY 02/20 CLSD. AVBL PPR 10MIN",
"effectiveStart": "2026-01-19 15:00:00",
"effectiveEnd": "2026-01-25 18:00:00",
"minimumFL": "000",
"maximumFL": "999"
},
{
"notamNumber": "A2755/24",
"icaoLocation": "LEBL",
"type": "N",
"typeExplanation": "New",
"notamText": "TYPE D ACFT OR HIGHER FOR GENERAL AVIATION AND BUSINESS TFC...",
"notamFormattedText": "A2755/24 NOTAMN\nQ) LECB/QFALT/I /NBO/A /000/999/4118N00205E005\nA) LEBL...",
"effectiveStart": "2024-04-18 21:59:00",
"effectiveEnd": "9999-12-31 23:59:59",
"minimumFL": "000",
"maximumFL": "999"
}
],
"Military": [
{
"notamNumber": "V0021/26",
"icaoLocation": "LEBL",
"type": "N",
"typeExplanation": "New",
"notamText": "[US DOD PROCEDURAL NOTAM] INSTRUMENT APPROACH PROCEDURE AMENDMENT RNP Y RWY 24R...",
"notamFormattedText": "V0021/26 NOTAMN\nQ) LECB/QPICH/I/BO/A/000/999/4117N00205E005\nA) LEBL...",
"effectiveStart": "2026-01-13 16:46:00",
"effectiveEnd": "2026-02-18 23:01:00",
"minimumFL": "000",
"maximumFL": "999"
}
],
"Obstacles": [
{
"notamNumber": "A0160/26",
"icaoLocation": "LEBL",
"type": "N",
"typeExplanation": "New",
"notamText": "OBST (CRANE ERECTED) HGT 25M, LOCATED AT COORD: 411719.60N 0020404.80E",
"notamFormattedText": "A0160/26 NOTAMN\nQ) LECB/QOBCE/IV/M /A /000/999/4118N00205E005\nA) LEBL...",
"effectiveStart": "2026-01-12 07:00:00",
"effectiveEnd": "2026-01-31 19:00:00",
"minimumFL": "000",
"maximumFL": "999"
}
]
}
}
N (New): A new NOTAM.
R (Replaced): Replaces a previous NOTAM
(reference shown in formatted text).
C (Canceled): Cancels a previous NOTAM.
Permanent: NOTAMs with
effectiveEnd of
"9999-12-31 23:59:59" are permanent.
Changelog Section
The changelog object contains recent changes to airport
data, useful for tracking updates.
The changelog helps identify recent changes to runway data. This can be useful for alerting users about updated runway lengths or procedures.
Error Responses
| Error | Cause |
|---|---|
Invalid API request. |
Missing icao parameter |
The requested aircraft profile does not exist.
|
Invalid aircraft profile specified |
This aircraft is not allowed with your subscription at this
airport.
|
Subscription does not include this aircraft/airport combination |
This airport does not exist or is not approved for your
aircraft / subscription.
|
Airport not found or not available for the user |