# Flightradar24 - Live Aircraft, Airport Boards & Flight History (`abotapi/flightradar24-live-flight-tracker`) Actor

Live aircraft positions by map area (callsign, lat/lng, altitude, speed, vertical speed, heading, squawk, registration, aircraft type, route, airline), airport departure and arrival boards, and aircraft or flight number history with times, delays and status, in one unified schema.

- **URL**: https://apify.com/abotapi/flightradar24-live-flight-tracker.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Categories:**
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 flight 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Flightradar24 Live Flight Tracker & Airport Boards

Track aircraft in the air right now, pull any airport's departures and arrivals board, and look up
the full flight history of an aircraft or a flight number. Three very different views of the same
world, returned in **one unified schema** so you can join them without writing a mapper.

Most flight trackers on the Store do exactly one of these. This one does all three, adds a real
change-detection mode for scheduled monitoring, and returns the recorded position trail that snapshot
scrapers cannot give you.

***

### What you get

| Mode | What it returns |
|---|---|
| **Live positions** | Every aircraft inside one or more map areas: callsign, flight number, registration, ICAO 24 bit address, latitude, longitude, altitude, ground speed, vertical speed, heading, squawk, aircraft type, airline, origin and destination, ground state |
| **Airport board** | An airport's departures or arrivals, walked past page 1 to the airport's own declared total: flight number, airline, route, aircraft, scheduled, estimated and actual times, terminal, gate, live status |
| **Aircraft / flight history** | Every past and scheduled leg for a tail number or a flight number, with full route, airports with coordinates, timings and status |
| **Paste links** | Give it `flightradar24.com/data/...` links and it resolves each one into the right mode above |

Turn on **flight detail enrichment** in live mode and every aircraft also gets full airport names,
cities and countries, terminal and gate, scheduled, estimated and real departure and arrival times,
delay, flight duration, and the **recorded position trail** (latitude, longitude, altitude, speed,
heading and timestamp per point).

***

### Quick start

Live traffic over western Europe, 50 aircraft:

```json
{
  "mode": "live",
  "bounds": ["55.0,45.0,-6.0,10.0"],
  "maxItems": 50
}
```

Heathrow departures, the whole board:

```json
{
  "mode": "airport",
  "airports": ["LHR"],
  "boardMode": "departures",
  "maxItems": 0
}
```

Everything a particular aircraft has flown:

```json
{
  "mode": "history",
  "historyQueries": ["G-TUKR"],
  "fetchBy": "reg",
  "maxItems": 0
}
```

Approach traffic into London only, below 10,000 ft, with full detail and trails:

```json
{
  "mode": "live",
  "bounds": ["51.7,51.2,-0.6,0.3"],
  "maxAltitudeFt": 10000,
  "includeOnGround": false,
  "fetchDetails": true,
  "maxItems": 0
}
```

***

### Map areas

A map area is a bounding box written as `north,south,west,east` in decimal degrees. Add as many as
you like; each is fetched as its own scope.

| Region | Bounding box |
|---|---|
| Western Europe | `55.0,45.0,-6.0,10.0` |
| Continental USA | `49.0,24.0,-125.0,-66.0` |
| Greater London | `51.7,51.2,-0.6,0.3` |
| New York area | `41.2,40.4,-74.5,-73.4` |
| Japan | `45.6,30.9,128.5,146.0` |
| Gulf region | `27.0,22.5,50.0,57.0` |

***

### Filters

Every filter applies to **every mode**, including pasted links, because URL mode resolves each link
and then runs the same scrape path the other modes use.

- **Flight numbers or callsigns**, **aircraft registrations**, **airlines** (ICAO or IATA)
- **Origin** and **destination** airports (IATA or ICAO)
- **Minimum** and **maximum altitude** in feet
- **Include aircraft on the ground** and **include gliders** toggles

A row that cannot know a value is never dropped by that filter. An airport board row carries no
altitude, so an altitude filter leaves board rows alone instead of silently turning into a mode
filter.

***

### Recurring monitoring

Two separate features, both in the **Resume & recurring updates** section:

- **Resume from a previous run** continues ONE interrupted crawl. Paste the previous run or dataset
  ID and already collected flights are skipped, not re-charged.
- **Incremental mode** is for a schedule. The first run returns everything as `NEW`; later runs
  return only `NEW`, `UPDATED` and `REAPPEARED`. Optional toggles add `UNCHANGED` and `EXPIRED` rows
  (both bill extra rows, so both default to off).

#### What counts as a change

**Change detection deliberately ignores position, altitude, ground speed, vertical speed and
heading.** A flying aircraft reports new values for all of those every few seconds, so if they drove
change detection every row would come back `UPDATED` on every run, which is the same as having no
change detection at all, and you would be billed for the whole set every time.

Those values are still returned **in full, with their current value, on every row**. What triggers
`UPDATED` is a real event: a status change, a new estimated or actual time, a delay, a gate or
terminal change, a route change, or a different aircraft or airline.

`EXPIRED` is only ever produced after a run that genuinely finished scanning its targets. A run that
was cut short by the Max flights cap, a resumed run, a run where a target failed, and a run that
scanned nothing at all will all skip expiry detection rather than wrongly marking live flights gone.

***

### Output

One record shape for every mode, so a table never comes back ragged. Fields a given mode cannot know
are present and `null` rather than missing.

```json
{
  "id": "live|416346ed",
  "recordType": "live",
  "fr24Id": "416346ed",
  "callsign": "TOM8HB",
  "flightNumber": "BY733",
  "registration": "G-TUKR",
  "icao24": "407F96",
  "squawk": null,
  "aircraftCode": "B738",
  "aircraftModel": "Boeing 737-8K5",
  "airlineName": "TUI",
  "airlineIata": "X3",
  "airlineIcao": "TUI",
  "originIata": "AGA",
  "originName": "Agadir Al Massira Airport",
  "originCity": "Agadir",
  "originCountry": "Morocco",
  "destinationIata": "MAN",
  "destinationName": "Manchester Airport",
  "destinationCity": "Manchester",
  "destinationCountry": "United Kingdom",
  "latitude": 50.6383,
  "longitude": -1.4173,
  "altitudeFt": 36000,
  "groundSpeedKts": 487,
  "verticalSpeedFpm": 64,
  "headingDeg": 1,
  "onGround": false,
  "positionUpdatedAt": "2026-08-28T00:50:15Z",
  "statusText": "Delayed 05:07",
  "statusLive": true,
  "scheduledDeparture": "2026-08-27T20:55:00Z",
  "realDeparture": "2026-08-27T22:52:21Z",
  "scheduledArrival": "2026-08-28T00:45:00Z",
  "estimatedArrival": "2026-08-28T01:27:28Z",
  "etaAt": "2026-08-28T01:27:28Z",
  "delaySeconds": 71,
  "trailPoints": 240,
  "flightUrl": "https://www.flightradar24.com/TOM8HB/416346ed",
  "scrapedAt": "2026-08-28T00:50:30Z"
}
```

`trail` holds the recorded track when detail enrichment is on:

```json
"trail": [
  { "latitude": 50.6066, "longitude": -1.4189, "altitudeFt": 36000,
    "groundSpeedKts": 488, "headingDeg": 1, "recordedAt": "2026-08-28T00:50:00Z" }
]
```

In incremental mode each row also carries `changeType`, `changedFields`, `firstSeenAt` and
`lastSeenAt`.

***

### Pricing

You are charged for:

- **Flight record**, charged per row returned, whichever mode produced it.
- **Flight detail enrichment** (lives in the Output & limits input section), charged once per flight only when you turn detail on. If the detail
  lookups start failing, enrichment switches itself off for the rest of the run and nothing further
  is charged; base rows keep flowing.
- **Actor start**, charged once per run.

Nothing is charged for an empty or failed run.

***

### Connection

Apify Proxy is recommended, and the default connection works on every plan. If a particular network
gives you empty results, pick another connection in the Connection section.

***

### Notes and limits

- A run whose requests were all rejected **fails** rather than reporting success with zero rows, so a
  connection problem can never be mistaken for an empty search.
- Airport boards are walked page by page up to the airport's own declared total, bounded by your Max
  flights cap.
- Aircraft history does not publish a total row count, so that walk continues until the source says
  there are no more pages.
- Live positions are a snapshot at request time. For continuous tracking, schedule the actor and use
  incremental mode.
- Coverage of any given aircraft depends on receiver coverage in that area; some military and private
  aircraft are not broadcast at all.

### Send results into your apps (MCP connectors)

Optionally pipe results straight into Notion, Linear, Airtable or any MCP server, from the
**Export to your apps (MCP connectors, optional)** section of the input. It is a side channel only:
the dataset is never changed, and a connector failure never fails the run.

#### Input parameters

| Parameter | What it does |
|---|---|
| `mcpConnectors` | The MCP connectors this run exports into (Notion, Linear, Airtable, Apify). Leave it empty and nothing is exported. |
| `notionParentPageUrl` | Notion connector only: the page under which one child page per flight is created. Required when `mcpConnectors` includes Notion, ignored otherwise. |
| `maxNotifyListings` | How many items are exported to each connector in one run, default 50. Caps the export only; it never changes what the dataset returns. |

# Actor input Schema

## `mode` (type: `string`):

Live positions: every aircraft currently inside one or more map areas. Airport board: an airport's departures or arrivals. Aircraft or flight history: past and scheduled legs for a registration or a flight number. Paste links: flightradar24.com/data/... URLs.

## `bounds` (type: `array`):

One or more bounding boxes, each written as north,south,west,east in decimal degrees. Examples: 55.0,45.0,-6.0,10.0 (western Europe), 49.0,24.0,-125.0,-66.0 (continental USA), 51.7,51.2,-0.6,0.3 (Greater London). Leave empty to use western Europe.

## `airports` (type: `array`):

One or more three letter IATA airport codes, for example LHR, JFK, SIN, DXB. Each airport is walked for the board type selected below.

## `boardMode` (type: `string`):

Which side of the board to return for every airport above. Choosing Both walks departures and arrivals as two separate scopes.

## `historyQueries` (type: `array`):

One or more aircraft registrations (for example G-TUKR, N12345) or flight numbers (for example BA117, TOM8HB), matching the lookup type selected below.

## `fetchBy` (type: `string`):

Whether the entries above are aircraft registrations (tail numbers) or flight numbers.

## `urls` (type: `array`):

Paste airport board or aircraft links, for example https://www.flightradar24.com/data/airports/lhr/departures or https://www.flightradar24.com/data/aircraft/g-tukr or https://www.flightradar24.com/data/flights/ba117 . Multiple links are supported.

## `flightNumbers` (type: `array`):

Keep only flights whose flight number or callsign is in this list, for example BA117, TOM8HB. Leave empty to keep every flight.

## `registrations` (type: `array`):

Keep only these aircraft registrations (tail numbers), for example G-TUKR. Leave empty to keep every aircraft.

## `airlines` (type: `array`):

Keep only flights operated by these airlines, given as ICAO codes (BAW, TUI, DLH) or IATA codes (BA, X3, LH). Leave empty to keep every airline.

## `originAirports` (type: `array`):

Keep only flights departing from these airports, given as IATA or ICAO codes. Leave empty to keep every origin.

## `destinationAirports` (type: `array`):

Keep only flights arriving at these airports, given as IATA or ICAO codes. Leave empty to keep every destination.

## `minAltitudeFt` (type: `integer`):

Keep only aircraft at or above this altitude in feet. Applies to rows that report an altitude (live positions); board and history rows are unaffected. Leave empty for no minimum.

## `maxAltitudeFt` (type: `integer`):

Keep only aircraft at or below this altitude in feet. Useful for watching approach and departure traffic. Leave empty for no maximum.

## `includeOnGround` (type: `boolean`):

On by default. Turn off to return airborne aircraft only, which also stops ground traffic being requested at all in live mode.

## `includeGliders` (type: `boolean`):

On by default. Turn off to exclude gliders, which also stops them being requested at all in live mode.

## `maxItems` (type: `integer`):

Maximum number of flight records to return across the whole run, counting live positions, board rows and history legs together. Use 0 for unlimited.

## `fetchDetails` (type: `boolean`):

Off by default, and only used in live mode. When on, every live aircraft is also looked up individually to add full airport names, cities and countries, terminal and gate, scheduled, estimated and real departure and arrival times, delay, flight duration and the recorded position trail. Each enriched flight is charged a small surcharge on top of the per flight charge. If the lookups start failing, enrichment is switched off automatically for the rest of the run and nothing extra is charged. Turn on to look up each live aircraft's full flight detail. This costs one extra request per aircraft and is billed as a small surcharge per enriched flight.

## `includeTrail` (type: `boolean`):

On by default, and only used when flight detail enrichment above is on. Adds the recorded track (latitude, longitude, altitude, speed, heading and timestamp per point) to each enriched flight. Turn off for smaller records when you only need the current position.

## `resumeFromRunId` (type: `string`):

Paste a previous run ID or dataset ID to continue a large crawl without returning or charging for flights already collected there. Use this after an interrupted run. For recurring monitoring of the same targets, use Incremental mode below instead.

## `incrementalMode` (type: `boolean`):

Turn this on for recurring monitoring. The first run returns everything as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED flights. Important: change detection deliberately ignores position, altitude, speed, vertical speed and heading, because a flying aircraft reports new values every few seconds and every row would otherwise be UPDATED on every run. Those values are still returned in full on every row; what triggers UPDATED is a real event such as a status, gate, terminal, delay, time, route, aircraft or airline change. State is kept separately for each target and filter setup; use State key to name or deliberately share a campaign.

## `stateKey` (type: `string`):

Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently configured runs. Leave empty to let the actor derive a key automatically from the targets and filters, so two different setups never mix state.

## `emitUnchanged` (type: `boolean`):

Off by default. Turn on to also return flights that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you want the full snapshot every run.

## `emitExpired` (type: `boolean`):

Off by default. Turn on to also return flights that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned its targets, never when Max flights capped it, when Resume was used, or when nothing was scanned. This returns, and bills, extra synthetic rows.

## `proxy` (type: `object`):

Apify Proxy. Leave the default unless a particular network gives you empty results, in which case pick another connection here.

## `mcpConnectors` (type: `array`):

Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a rich page per item export; other connectors get a best effort write or digest. Leave empty to skip; never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL or id of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "live",
  "bounds": [
    "55.0,45.0,-6.0,10.0"
  ],
  "airports": [
    "LHR"
  ],
  "boardMode": "departures",
  "historyQueries": [
    "G-TUKR"
  ],
  "fetchBy": "reg",
  "urls": [
    "https://www.flightradar24.com/data/airports/lhr/departures"
  ],
  "includeOnGround": true,
  "includeGliders": true,
  "maxItems": 50,
  "fetchDetails": false,
  "includeTrail": true,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "proxy": {
    "useApifyProxy": true
  },
  "maxNotifyListings": 50
}
```

# Actor output Schema

## `overview` (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 = {
    "mode": "live",
    "bounds": [
        "55.0,45.0,-6.0,10.0"
    ],
    "airports": [
        "LHR"
    ],
    "historyQueries": [
        "G-TUKR"
    ],
    "urls": [
        "https://www.flightradar24.com/data/airports/lhr/departures"
    ],
    "incrementalMode": false,
    "emitUnchanged": false,
    "emitExpired": false,
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/flightradar24-live-flight-tracker").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 = {
    "mode": "live",
    "bounds": ["55.0,45.0,-6.0,10.0"],
    "airports": ["LHR"],
    "historyQueries": ["G-TUKR"],
    "urls": ["https://www.flightradar24.com/data/airports/lhr/departures"],
    "incrementalMode": False,
    "emitUnchanged": False,
    "emitExpired": False,
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/flightradar24-live-flight-tracker").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 '{
  "mode": "live",
  "bounds": [
    "55.0,45.0,-6.0,10.0"
  ],
  "airports": [
    "LHR"
  ],
  "historyQueries": [
    "G-TUKR"
  ],
  "urls": [
    "https://www.flightradar24.com/data/airports/lhr/departures"
  ],
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call abotapi/flightradar24-live-flight-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,abotapi/flightradar24-live-flight-tracker"
        }
    }
}

```

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/K0l4QdPR5fb6f7j1j/builds/Vsy7ZJnVt75o40wxz/openapi.json
