# Airport Data API: IATA, ICAO, Runways, Coordinates (`conserving_celerytop/airport-reference-data-api`) Actor

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.

- **URL**: https://apify.com/conserving_celerytop/airport-reference-data-api.md
- **Developed by:** [Don Mangu](https://apify.com/conserving_celerytop) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 airport records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

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:

```json
{
  "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

| 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:

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

All airports in Cyprus with scheduled airline service:

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

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

```json
{
  "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:

```json
{
  "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:

```json
{
  "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).

# Actor input Schema

## `codes` (type: `array`):

Enter one code per line: an IATA code such as TLV, an ICAO code such as LLBG, or an OurAirports ident. A code that matches no airport returns one not_found row. Leave empty to search with the filters below.

## `countries` (type: `array`):

Enter one country per line, as a two-letter ISO code such as IL or GB, or the country name as OurAirports spells it, such as Israel. Leave empty to include every country.

## `regions` (type: `array`):

Enter one region per line, as an ISO region code such as IL-M or US-CA, or the region name. Leave empty to include every region.

## `types` (type: `array`):

Return only these airport types. Leave empty to return every type except closed airports.

## `searchText` (type: `string`):

Words that must all appear at the start of a word in the airport name or the city, for example kennedy or tel aviv. Case and accents do not matter.

## `scheduledService` (type: `string`):

Keep only airports that OurAirports marks as having scheduled airline service (yes) or not (no).

## `latitude` (type: `number`):

Latitude of the centre point for a nearby search, from -90 to 90, for example 32.0114. Fill in latitude, longitude and radius together.

## `longitude` (type: `number`):

Longitude of the centre point for a nearby search, from -180 to 180, for example 34.8867.

## `radiusKm` (type: `number`):

Search radius around the centre point, in kilometres, from 1 to 5000. The distance is measured in a straight line over the earth surface.

## `includeRunways` (type: `boolean`):

Add the list of runways to each airport row, with runwayCount and longestRunwayFt. Runways are embedded in the airport row and are not charged separately.

## `maxResults` (type: `integer`):

Return at most this many rows in total, including not_found rows. Each row returned is one charged result. OurAirports lists about 86,000 airports.

## Actor input object example

```json
{
  "codes": [
    "TLV",
    "JFK"
  ],
  "scheduledService": "any",
  "includeRunways": false,
  "maxResults": 25
}
```

# Actor output Schema

## `airports` (type: `string`):

No description

## `stats` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "codes": [
        "TLV",
        "JFK"
    ],
    "maxResults": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("conserving_celerytop/airport-reference-data-api").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "codes": [
        "TLV",
        "JFK",
    ],
    "maxResults": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("conserving_celerytop/airport-reference-data-api").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "codes": [
    "TLV",
    "JFK"
  ],
  "maxResults": 25
}' |
apify call conserving_celerytop/airport-reference-data-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,conserving_celerytop/airport-reference-data-api"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/SsVszqhOuXZqieyy3/builds/BcIYHKVj9CC6pZwYr/openapi.json
