Airport Data API: IATA, ICAO, Runways, Coordinates avatar

Airport Data API: IATA, ICAO, Runways, Coordinates

Pricing

from $0.70 / 1,000 airport records

Go to Apify Store
Airport Data API: IATA, ICAO, Runways, Coordinates

Airport Data API: IATA, ICAO, Runways, Coordinates

Look up airports by IATA or ICAO code, filter by country, region, type and name, or find airports near a point. One row per airport with coordinates, elevation and optional runways. Data from OurAirports (public domain). Independent tool, not affiliated with OurAirports.

Pricing

from $0.70 / 1,000 airport records

Rating

0.0

(0)

Developer

Don Mangu

Don Mangu

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

14 days ago

Last modified

Categories

Share

Use this airport data API to look up airports by IATA or ICAO code, or to list them by country, region, type, name or distance, for $1.00 per 1,000 airport rows.

Type a list of codes such as TLV and JFK, or leave the codes empty and filter, for example "every large airport in Cyprus" or "airports within 100 km of Tel Aviv". Each result is one row from the OurAirports open data: name, IATA, ICAO and local codes, coordinates, elevation, city, country, region, type, scheduled service flag and website. Switch on Include runways to add every runway with length, width, surface, lighting and both end points. The Actor reads the current OurAirports files on every run, so the data is as fresh as the daily OurAirports export. You need no login, no API key and no proxy.

This is an unofficial tool built by an independent developer. It is not affiliated with, endorsed by or operated by OurAirports or any airport, airline or aviation authority.

Sample output

One row per airport. This is a real row from a run on 7 October 2026, without runways:

{
"id": 4411,
"ident": "LLBG",
"icaoCode": "LLBG",
"iataCode": "TLV",
"gpsCode": "LLBG",
"localCode": null,
"type": "large_airport",
"name": "Ben Gurion International Airport",
"latitude": 32.011398,
"longitude": 34.8867,
"elevationFt": 135,
"continent": "AS",
"countryCode": "IL",
"countryName": "Israel",
"regionCode": "IL-M",
"regionName": "Central District",
"municipality": "Tel Aviv",
"scheduledService": true,
"homeUrl": "http://www.iaa.gov.il/Rashat/en-US/Airports/BenGurion/",
"wikipediaUrl": "https://en.wikipedia.org/wiki/Ben_Gurion_International_Airport",
"keywords": null,
"distanceKm": null,
"runwayCount": null,
"longestRunwayFt": null,
"runways": null,
"query": "TLV",
"matchedBy": "iata",
"sourceUpdated": null,
"retrievedAt": "2026-10-07T06:46:36.316Z",
"source": "OurAirports (ourairports.com)",
"licence": "Public domain",
"resultStatus": "ok"
}

How to get airport data with this Actor

  1. Click Try for free. No API key is needed.
  2. In Airport codes, enter one IATA or ICAO code per line. Or leave it empty and use the filters.
  3. Optionally set Countries, Regions, Airport types, Name or city text (searchText) and Scheduled service. A row must pass every filter you fill in.
  4. For a nearby search, fill in Latitude, Longitude and Radius in km together. Rows are sorted by distance and carry distanceKm.
  5. Switch on Include runways if you need runway data.
  6. Set Max results. The default is 100.
  7. Click Start, open the Overview view, and export as JSON, CSV or Excel.

Typical uses:

  • Turn a column of IATA codes in a travel or logistics sheet into names, cities, countries and coordinates.
  • Build a list of all airports with scheduled service in one country.
  • Find the airports near a hotel, a factory or an event.
  • Check runway length and surface for charter, cargo or drone planning research.
  • Fill an airport dropdown or an autocomplete index.

What you get

FieldMeaning
id, identOurAirports id, and the OurAirports identifier. The ident is the ICAO code where one exists
icaoCode, iataCode, gpsCode, localCodeCodes as published. Many airports have no IATA or ICAO code, so these can be null
typelarge_airport, medium_airport, small_airport, heliport, seaplane_base, balloonport or closed
name, municipalityAirport name and the city it serves, as published
latitude, longitude, elevationFtPosition in decimal degrees and elevation in feet. Elevation can be null
continent, countryCode, countryName, regionCode, regionNamePlace codes from the data, with names from countries.csv and regions.csv
scheduledServicetrue when OurAirports marks the airport as having scheduled airline service
homeUrl, wikipediaUrl, keywordsWebsite, Wikipedia page and search words, or null
distanceKmStraight-line distance from your point, only in a nearby search
runwayCount, longestRunwayFt, runwaysOnly with Include runways. The longest runway ignores runways marked closed. Runways are listed longest first
query, matchedByWhich code you entered matched this row, and whether it matched as iata, icao or ident
sourceUpdated, retrievedAtLast-Modified time of the file when the host sends one, and the time the Actor downloaded it
source, licence, resultStatusOurAirports, public domain, and ok or not_found

The Actor adds no data from other sources. Every value comes from the four OurAirports files airports.csv, runways.csv, countries.csv and regions.csv.

Pricing

Pay per event: $1.00 per 1,000 airport rows on the Free plan, with lower prices on Bronze, Silver and Gold plans. The start of a run costs $0.00005. A code that matches no airport returns one not_found row and counts as one result, because the lookup was done. Runways are part of the airport row and cost nothing extra. A run that cannot read the OurAirports files is not charged.

Worked example: looking up 5 codes returns 5 rows and costs 5 x $0.001 = $0.005, plus the start fee. Listing all 25,081 airports in the United States, with runways, costs 25,081 x $0.001 = $25.08 on the Free plan. Listing the 1,175 large airports in the world costs $1.18.

Input examples

Look up codes and add runways:

{
"codes": ["TLV", "LHR", "JFK", "DXB", "SIN"],
"includeRunways": true
}

All airports in Cyprus with scheduled airline service:

{
"countries": ["Cyprus"],
"scheduledService": "yes"
}

Large and medium airports within 100 km of Tel Aviv, nearest first:

{
"latitude": 32.0114,
"longitude": 34.8867,
"radiusKm": 100,
"types": ["large_airport", "medium_airport"],
"maxResults": 10
}

That nearby input returned these six rows on 7 October 2026:

NameiataCodeidenttypedistanceKm
Ben Gurion International AirportTLVLLBGlarge_airport0
Tel Nof Air BasenullLLEKmedium_airport20.1
Ramat David Air BasenullLLRDmedium_airport77.7
Bar Yehuda AirfieldMTZLLMZmedium_airport89.6
Uri Michaeli Haifa International AirportHFALLHAmedium_airport90
Nevatim Air BaseVTMLLNVmedium_airport90.1

Output example with runways

A real row for the code RPN with Include runways on. The second runway is marked closed, so it does not count for longestRunwayFt:

{
"id": 4419,
"ident": "LLIB",
"icaoCode": "LLIB",
"iataCode": "RPN",
"gpsCode": "LLIB",
"localCode": null,
"type": "medium_airport",
"name": "Rosh Pina Airport",
"latitude": 32.980999,
"longitude": 35.571899,
"elevationFt": 884,
"continent": "AS",
"countryCode": "IL",
"countryName": "Israel",
"regionCode": "IL-Z",
"regionName": "Northern District",
"municipality": "Rosh Pina",
"scheduledService": false,
"homeUrl": null,
"wikipediaUrl": "https://en.wikipedia.org/wiki/Rosh_Pina_Airport",
"keywords": "Mahanayim Ben Yaakov Airport",
"distanceKm": null,
"runwayCount": 2,
"longestRunwayFt": 3625,
"runways": [
{
"id": 236936,
"lengthFt": 3625,
"widthFt": 100,
"surface": "ASP",
"lighted": true,
"closed": false,
"lowEnd": {
"ident": "15",
"latitude": 32.987202,
"longitude": 35.5681,
"elevationFt": 884,
"headingDegT": 150,
"displacedThresholdFt": 90
},
"highEnd": {
"ident": "33",
"latitude": 32.978401,
"longitude": 35.574001,
"elevationFt": 878,
"headingDegT": 330,
"displacedThresholdFt": 320
}
},
{
"id": 236935,
"lengthFt": 3190,
"widthFt": 100,
"surface": "ASP",
"lighted": false,
"closed": true,
"lowEnd": {
"ident": "05",
"latitude": 32.977699,
"longitude": 35.566002,
"elevationFt": null,
"headingDegT": 54,
"displacedThresholdFt": null
},
"highEnd": {
"ident": "23",
"latitude": 32.982899,
"longitude": 35.574501,
"elevationFt": null,
"headingDegT": 234,
"displacedThresholdFt": null
}
}
],
"query": "RPN",
"matchedBy": "iata",
"sourceUpdated": null,
"retrievedAt": "2026-10-07T06:50:18.143Z",
"source": "OurAirports (ourairports.com)",
"licence": "Public domain",
"resultStatus": "ok"
}

A code that matches nothing returns a not_found row. This is a real row for the code XXX:

{
"id": null,
"ident": null,
"icaoCode": null,
"iataCode": null,
"gpsCode": null,
"localCode": null,
"type": null,
"name": null,
"latitude": null,
"longitude": null,
"elevationFt": null,
"continent": null,
"countryCode": null,
"countryName": null,
"regionCode": null,
"regionName": null,
"municipality": null,
"scheduledService": null,
"homeUrl": null,
"wikipediaUrl": null,
"keywords": null,
"distanceKm": null,
"runwayCount": null,
"longestRunwayFt": null,
"runways": null,
"query": "XXX",
"matchedBy": null,
"sourceUpdated": null,
"retrievedAt": "2026-10-07T06:46:41.792Z",
"source": "OurAirports (ourairports.com)",
"licence": "Public domain",
"resultStatus": "not_found"
}

Run it every day

OurAirports publishes new files every day, so a scheduled run keeps a list current. In the Apify Console, open Schedules, create a schedule with the cron expression 0 6 * * *, and add this Actor with your input. Use a dataset export, a webhook, or an integration with Make, Zapier or n8n to send the rows on. You can also call the Actor from your own code with the Apify API.

FAQ

Where does the data come from? From the open data files that OurAirports publishes on GitHub: airports.csv, runways.csv, countries.csv and regions.csv. The repository describes them as "updated daily". The Actor downloads each file once per run and reads it as a stream. It never uses the member comments file.

Is it legal to use? OurAirports states on its data page: "All data is released to the Public Domain, and comes with no guarantee of accuracy or fitness for use." Credit is welcome but not required, and this README gives it. Data: OurAirports (public domain).

How accurate is it? As accurate as the OurAirports export, which volunteers maintain. Positions, elevations and runway data can be wrong or out of date. Do not use this data for navigation, flight planning or any safety decision. Use official aviation sources for those.

How do codes match? An IATA or ICAO code is matched first. Only when no airport has that IATA or ICAO code does the Actor try the OurAirports ident. This order matters: in the file read on 7 October 2026, 365 IATA codes are also the ident of a different airport, for example NCL is the IATA code of Newcastle International and the ident of a heliport in the United States. Each row has matchedBy so you can see which rule applied. If two of your codes point to the same airport, it is returned once.

Why is iataCode or icaoCode null? Many airports have no such code. The file read on 7 October 2026 has 86,215 airports. 9,051 have an IATA code and 10,531 have an ICAO code. Of the 42,800 small airports, 4,230 have an IATA code, and none of the 13,562 closed airports has one.

Are closed airports included? Only when you choose the Closed airport type, or when you look up a code. The file has 13,562 closed airports, and they would crowd out the results of a country search.

How do country and region filters work? Use the two-letter ISO code or the name as OurAirports spells it. If a name is not found, the run stops with a message that lists close names and charges nothing. Regions use ISO codes such as IL-M or US-CA, or the region name.

What does Name or city text match? Every word you type must be the start of a word in the airport name or the city. Case and accents do not matter. "kennedy" finds John F. Kennedy International Airport, and "ben gur" finds Ben Gurion.

What are the limits? Up to 500 codes, 100 countries and 100 regions per run, a radius of up to 5,000 km, and up to 100,000 results. Max results counts all rows, including not_found rows. The output order is nearest first in a nearby search, otherwise larger airport types first, then by ident.

Why is sourceUpdated null? GitHub does not send a Last-Modified header for raw files today, so the Actor has nothing to copy. The field fills in on its own if the host adds the header. retrievedAt always tells you when the file was downloaded.

What if the run fails? If GitHub is down, a file is much larger than expected or the column names change, the run stops with a clear message and charges nothing. Run it again later.

For weather at airport coordinates in the United States, the same author has NWS Weather API: Forecast, Observations and Alerts. Other public-data Actors by the same author are listed on the author's Store profile.

I built this Actor myself as an independent developer. Data: OurAirports (public domain).