Airport Data API: IATA, ICAO, Runways, Coordinates
Pricing
from $0.70 / 1,000 airport records
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
Maintained by CommunityActor 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
- Click Try for free. No API key is needed.
- In Airport codes, enter one IATA or ICAO code per line. Or leave it empty and use the filters.
- Optionally set Countries, Regions, Airport types, Name or city text (searchText) and Scheduled service. A row must pass every filter you fill in.
- For a nearby search, fill in Latitude, Longitude and Radius in km together. Rows are sorted by distance and carry distanceKm.
- Switch on Include runways if you need runway data.
- Set Max results. The default is 100.
- 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
| Field | Meaning |
|---|---|
| id, ident | OurAirports id, and the OurAirports identifier. The ident is the ICAO code where one exists |
| icaoCode, iataCode, gpsCode, localCode | Codes as published. Many airports have no IATA or ICAO code, so these can be null |
| type | large_airport, medium_airport, small_airport, heliport, seaplane_base, balloonport or closed |
| name, municipality | Airport name and the city it serves, as published |
| latitude, longitude, elevationFt | Position in decimal degrees and elevation in feet. Elevation can be null |
| continent, countryCode, countryName, regionCode, regionName | Place codes from the data, with names from countries.csv and regions.csv |
| scheduledService | true when OurAirports marks the airport as having scheduled airline service |
| homeUrl, wikipediaUrl, keywords | Website, Wikipedia page and search words, or null |
| distanceKm | Straight-line distance from your point, only in a nearby search |
| runwayCount, longestRunwayFt, runways | Only with Include runways. The longest runway ignores runways marked closed. Runways are listed longest first |
| query, matchedBy | Which code you entered matched this row, and whether it matched as iata, icao or ident |
| sourceUpdated, retrievedAt | Last-Modified time of the file when the host sends one, and the time the Actor downloaded it |
| source, licence, resultStatus | OurAirports, 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:
| Name | iataCode | ident | type | distanceKm |
|---|---|---|---|---|
| Ben Gurion International Airport | TLV | LLBG | large_airport | 0 |
| Tel Nof Air Base | null | LLEK | medium_airport | 20.1 |
| Ramat David Air Base | null | LLRD | medium_airport | 77.7 |
| Bar Yehuda Airfield | MTZ | LLMZ | medium_airport | 89.6 |
| Uri Michaeli Haifa International Airport | HFA | LLHA | medium_airport | 90 |
| Nevatim Air Base | VTM | LLNV | medium_airport | 90.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.
Related Actors
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).