Flightradar24 - Live Aircraft, Airport Boards & Flight History
Pricing
from $1.00 / 1,000 flight records
Flightradar24 - Live Aircraft, Airport Boards & Flight History
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.
Pricing
from $1.00 / 1,000 flight records
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
12
Total users
7
Monthly active users
5 days ago
Last modified
Categories
Features
Share
Flightradar24 Scraper: Live Flights, Airport Boards & Flight History
Flightradar24 Live Flight Tracker turns Flightradar24 into a clean flight data API. Track every aircraft inside a map area right now, pull an airport's departures or arrivals board, or look up the full history of an aircraft registration or a flight number, all returned in one unified schema so live positions, board rows and history legs sit in the same table. Paste Flightradar24 links instead of building queries by hand, add flight detail enrichment for full route and delay data, then export to JSON, CSV or Excel, or pull results straight into your app through the API.
Why This Scraper?
- Three views, one schema. Live positions, airport boards and aircraft or flight history all come back with the same field set, so you can join them without writing a mapper.
- Four ways in. Search a map area, pull an airport board, look up a registration or flight number, or paste Flightradar24 links and let the actor resolve them.
- One filter set for every mode. Flight number, registration, airline, origin, destination and altitude filters apply identically to live, board, history and pasted-link results.
- Optional flight detail enrichment. Turn on full airport names, terminal and gate, scheduled, estimated and real times, delay and the recorded position trail for live aircraft, billed only when you use it.
- Built for recurring monitoring. Incremental mode returns only new and changed flights on scheduled runs, ignoring position, altitude, speed and heading noise so a moving aircraft is not reported as changed on those alone.
- Resume without double paying. Point a new run at a previous run or dataset id and already collected flights are skipped rather than re-charged.
- A refused run fails loudly. If every request is rejected, the run stops with a clear message instead of reporting a successful empty search.
Use Cases
- Flight tracking apps and dashboards: feed live positions and airport boards into your own map, alerting tool or status page.
- Delay and disruption monitoring: watch a flight number or a whole airport board on a schedule and get only the status, gate and time changes.
- Aviation research and analytics: build historical datasets of routes, aircraft and delays for a registration, an airline or an airport.
- Travel and logistics coordination: track a specific aircraft or flight number across its full history of past and scheduled legs.
- Media and spotting communities: pull live traffic over a region or an airport's board for reporting and content.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
recordType | "live" (also "board", "history") |
id | `"live |
fr24Id | "1a2b3c4d" |
callsign / flightNumber | "EXA321" / "EX321" |
registration / icao24 | "N321EX" / "ABCDEF" |
aircraftCode / aircraftModel | "B738" / "Boeing 737-800" |
airlineName / airlineIata / airlineIcao | "Example Airways" / "EX" / "EXA" |
originIata / originName / originCity / originCountry | "LHR" / "Heathrow Airport" / "London" / "United Kingdom" |
destinationIata / destinationName / destinationCity / destinationCountry | "JFK" / "John F Kennedy International Airport" / "New York" / "United States" |
latitude / longitude | 45.5 / -30.2 |
altitudeFt / groundSpeedKts / headingDeg | 37000 / 460 / 270 |
verticalSpeedFpm / onGround / isGlider / squawk / radarCode | 0 / false / false / "2000" / "T-EXMP1" |
positionTimestamp / positionUpdatedAt | 1777645320 / "2026-05-01T14:22:00Z" |
statusText / statusGeneric / statusType / statusLive | "Estimated 17:42" / "estimated" / "arrival" / true |
scheduledDeparture / estimatedDeparture / realDeparture | scheduled, estimated and actual departure times |
scheduledArrival / estimatedArrival / realArrival / etaAt | scheduled, estimated, actual and ETA arrival times |
delaySeconds / durationSeconds / divertedTo | 720 / null / null |
originTerminal / originGate / destinationTerminal / destinationGate | "5" / "A12" / "8" / null (with flight detail enrichment on) |
originIcao / originLatitude / originLongitude (same for destination) | "EGLL" / 51.47 / -0.46 |
boardAirportIata / boardMode | "LHR" / "departures" (airport board records only) |
trail / trailPoints | recorded position trail and its point count (with flight detail enrichment on) |
queryScope / flightUrl | "live-feed" (or "airport:LHR:departures", "reg:N321EX") / link to the flight's Flightradar24 page |
changeType / changedFields / firstSeenAt / lastSeenAt / scrapedAt | "NEW", "UPDATED", "UNCHANGED", "REAPPEARED" or "EXPIRED", with the fields that changed (incremental mode only); scrapedAt is the scrape time as ISO 8601, e.g. "2026-05-01T14:22:05Z" |
lat / lon / heading / altitude / speed / vertical_rate / aircraft_type / airline_iata / airline_icao / origin / destination / flight / timestamp | alias fields: same values as latitude, longitude, headingDeg, altitudeFt, groundSpeedKts, verticalSpeedFpm, aircraftCode, the airline codes, originIata, destinationIata, flightNumber and positionUpdatedAt |
mapUrl / queriedBbox | link to the position on the Flightradar24 map / the bounding box that returned the row (live mode) |
Fields a given mode cannot know are present and null rather than missing, so a table of live, board and history rows never comes back ragged.
How to Use
- Pick a mode:
live(map area),airport(departures or arrivals board),history(aircraft or flight number) orurl(paste links). - Fill in the fields for that mode, and add any flight number, registration, airline, route or altitude filters you need.
- Set Max flights to control run size and cost, then click Start.
- Download the dataset as JSON, CSV or Excel, or read it through the API.
Live traffic over western Europe:
{"mode": "live","bounds": ["55.0,45.0,-6.0,10.0"],"maxItems": 50}
Heathrow departures, the whole board:
{"mode": "airport","airports": ["LHR"],"boardMode": "departures","maxItems": 0}
Everything a particular aircraft has flown:
{"mode": "history","historyQueries": ["G-TUKR"],"fetchBy": "reg","maxItems": 0}
Approach traffic into London only, below 10,000 ft, with full detail:
{"mode": "live","bounds": ["51.7,51.2,-0.6,0.3"],"maxAltitudeFt": 10000,"includeOnGround": false,"fetchDetails": true,"maxItems": 0}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/flightradar24-live-flight-tracker").call(run_input={"mode": "airport", "airports": ["LHR"], "boardMode": "departures", "maxItems": 50})for flight in client.dataset(run["defaultDatasetId"]).iterate_items():print(flight["flightNumber"], flight["statusText"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/flightradar24-live-flight-tracker').call({mode: 'airport', airports: ['LHR'], boardMode: 'departures', maxItems: 50,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
How Max flights shapes a run with several targets
One cap, Max flights, controls the whole run: live positions, board rows and history legs all count against it together. With several bounding boxes, airports or aircraft in one run, the cap is shared out evenly across the remaining targets so an early target cannot use up the whole budget and starve the rest. An airport board is walked page by page up to the airport's own declared total; aircraft history is walked until the source reports no more pages. Raise Max flights, or set it to 0, to remove the cap.
Resume and recurring updates
- Resume (
resumeFromRunId) continues one interrupted run: paste its run or dataset id and the actor skips everything already collected there, so you don't pay twice. - Incremental mode (
incrementalMode) is for scheduled runs over the same targets. Each record is classifiedNEW,UPDATED(withchangedFields),UNCHANGED(suppressed and not billed unlessemitUnchangedis on),REAPPEAREDorEXPIRED(only after a run that scanned the whole target set, and only withemitExpired). Change detection ignores position, altitude, speed, vertical speed, heading, position time and trail, because those change on every scrape by construction; a change in any other field (status, times, gate, terminal, route, aircraft, airline, squawk or receiving station) is reported asUPDATED.ignoreFieldsForChangeslets you add your own top-level field names to that ignored list (the fields are still returned on every row).stateKeynames or shares the stored state; leave it empty and the actor derives one automatically from your targets and filters. With incremental mode off, output is exactly as before.
URL mode
Links are read for the airport or aircraft they name, not fetched. Supported shapes:
| Shape | Example | Scraped as |
|---|---|---|
| Airport departures | https://www.flightradar24.com/data/airports/lhr/departures | Departures board |
| Airport arrivals | https://www.flightradar24.com/data/airports/lhr/arrivals | Arrivals board |
| Airport (bare, same target as departures) | https://www.flightradar24.com/data/airports/lhr | Departures board |
| Airport board page | https://www.flightradar24.com/data/airports/lhr/departures?page=2 | Board, starting at page 2 |
| Legacy airport link (same target as departures) | https://www.flightradar24.com/airport/lhr | Departures board |
| Aircraft registration | https://www.flightradar24.com/data/aircraft/g-tukr | Flight history of that aircraft |
| Flight number | https://www.flightradar24.com/data/flights/ba117 | Flight history of that flight number |
Any other link is skipped with a warning naming it, and the run is reported as incomplete. Behaviour change: the urls field now ships with one example per distinct target as its default (five links: departures, arrivals, departures page 2, aircraft registration, flight number; the bare and legacy airport links are accepted but resolve to the departures target, so they are not repeated), so a url-mode run with the field left untouched scrapes those five examples instead of nothing. The legacy /airport/<iata> link is now supported and ?page=N is honoured as the start page.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify, Settings, Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where items should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | live | live, airport, history, or url. Also accepted as aliases: bbox (same as live), airports (same as airport) and registrations (same as history; when History queries is empty, the registrations list is used). |
bounds | array | ["55.0,45.0,-6.0,10.0"] | Map area bounding boxes, each north,south,west,east in decimal degrees (live mode). |
preset | string | (none) | Live mode: ready-made map area. It replaces the untouched default map area; any area you changed or added in Map areas is kept as well. Options: world, us, europe, asia, russia, nyc, london, moscow, almaty, tokyo. |
bboxes | array | (none) | Alias of bounds. These boxes replace the untouched default map area; any area you changed or added in Map areas is kept as well. |
airports | array | ["LHR"] | Three letter IATA airport codes (airport mode). |
boardMode | string | departures | departures, arrivals, or both for each airport above. |
historyQueries | array | ["G-TUKR"] | Aircraft registrations or flight numbers (history mode). |
fetchBy | string | reg | Whether historyQueries entries are reg (registration) or flight (flight number or callsign; callsign is accepted too). With mode registrations, an empty historyQueries falls back to registrations. |
urls | array | five example links, one per distinct target (see URL mode) | Flightradar24 links (url mode). Leaving the field untouched scrapes the five example links; clear it and add your own to scrape only those. |
flightNumbers | array | (none) | Keep only these flight numbers or callsigns. Applies to every mode. |
registrations | array | (none) | Keep only these aircraft registrations. Applies to every mode. |
airlines | array | (none) | Keep only these airlines, by ICAO or IATA code. Applies to every mode. |
originAirports | array | (none) | Keep only flights departing from these airports. Applies to every mode. |
destinationAirports | array | (none) | Keep only flights arriving at these airports. Applies to every mode. |
onlyAirlineIatas | array | (none) | Keep only flights whose flight number starts with one of these two-character airline codes, such as BA. Applies to every mode. |
minAltitudeFt | integer | (none) | Keep only aircraft at or above this altitude. Rows that cannot know an altitude are kept. |
maxAltitudeFt | integer | (none) | Keep only aircraft at or below this altitude. Rows that cannot know an altitude are kept. |
includeOnGround | boolean | true | Turn off to return airborne aircraft only. |
includeGliders | boolean | true | Turn off to exclude gliders. |
sortBy | string | (none) | Order the dataset by altitudeFt, groundSpeedKts, scheduledDeparture, delaySeconds or lastSeenAt; rows without a value come last. Rows are held until the run ends. |
sortOrder | string | asc | asc or desc, used with sortBy. |
maxItems | integer | 50 | Stop after this many flight records across the whole run (0 = no limit). |
fetchDetails | boolean | false | Live mode only: add full route names, times, delay and the position trail per flight, billed once per enriched flight. |
includeTrail | boolean | true | With flight detail on, include the recorded position trail. |
resumeFromRunId | string | (none) | Continue one interrupted run without re-collecting or re-charging its flights. |
incrementalMode | boolean | false | Return only new and changed records on scheduled runs. |
ignoreFieldsForChanges | array | [] | Extra field names that must not trigger UPDATED (incremental mode only). |
stateKey | string | (none) | Name or share an incremental-mode state; leave empty for an automatically derived key. |
emitUnchanged | boolean | false | Also return (and bill) unchanged flights, marked UNCHANGED. |
emitExpired | boolean | false | Also return (and bill) flights no longer found after a complete scan, marked EXPIRED. |
proxy | object | Apify Proxy | Connection settings. |
proxyConfiguration | object | (none) | Alias of proxy, used only when proxy is empty. |
mcpConnectors | array | (none) | Optional: send a summary of each record to apps you authorized under Integrations. |
notionParentPageUrl | string | (none) | Notion connector only: page under which one child page per flight is created. |
maxNotifyListings | integer | 50 | Cap on items exported to each connector per run. Never changes the dataset. |
Output Example
Sample shape: values are illustrative placeholders, not from a live record.
{"id": "live|1a2b3c4d","recordType": "live","fr24Id": "1a2b3c4d","callsign": "EXA321","flightNumber": "EX321","registration": "N321EX","icao24": "ABCDEF","squawk": "2000","radarCode": "T-EXMP1","aircraftCode": "B738","aircraftModel": "Boeing 737-800","airlineName": "Example Airways","airlineIata": "EX","airlineIcao": "EXA","originIata": "LHR","originIcao": "EGLL","originName": "Heathrow Airport","originCity": "London","originCountry": "United Kingdom","originLatitude": 51.47,"originLongitude": -0.46,"originTerminal": "5","originGate": "A12","destinationIata": "JFK","destinationIcao": "KJFK","destinationName": "John F Kennedy International Airport","destinationCity": "New York","destinationCountry": "United States","destinationLatitude": 40.64,"destinationLongitude": -73.78,"destinationTerminal": "8","destinationGate": null,"latitude": 45.5,"longitude": -30.2,"altitudeFt": 37000,"groundSpeedKts": 460,"verticalSpeedFpm": 0,"headingDeg": 270,"onGround": false,"isGlider": false,"positionTimestamp": 1777645320,"positionUpdatedAt": "2026-05-01T14:22:00Z","statusText": "Estimated 17:42","statusLive": true,"statusGeneric": "estimated","statusType": "arrival","divertedTo": null,"scheduledDeparture": "2026-05-01T09:00:00Z","scheduledArrival": "2026-05-01T17:30:00Z","estimatedDeparture": "2026-05-01T09:15:00Z","estimatedArrival": "2026-05-01T17:42:00Z","realDeparture": "2026-05-01T09:18:00Z","realArrival": null,"etaAt": "2026-05-01T17:42:00Z","delaySeconds": 720,"durationSeconds": null,"boardAirportIata": null,"boardMode": null,"queryScope": "live-feed","trail": [{"latitude": 45.5,"longitude": -30.2,"altitudeFt": 37000,"groundSpeedKts": 460,"headingDeg": 270,"timestamp": 1777645320,"recordedAt": "2026-05-01T14:22:00Z"},{"latitude": 45.6,"longitude": -29.9,"altitudeFt": 37000,"groundSpeedKts": 458,"headingDeg": 270,"timestamp": 1777645260,"recordedAt": "2026-05-01T14:21:00Z"}],"trailPoints": 2,"flightUrl": "https://www.flightradar24.com/EXA321/1a2b3c4d","scrapedAt": "2026-05-01T14:22:05Z"}
Plan Requirement
The default Apify datacenter proxy was checked against the live site and served live positions, airport boards and flight history, so no extra setup is needed. The site does put a bot-check page in front of some non-Apify datacenter ranges. If it serves that page on an Apify datacenter connection, the actor switches once, for the rest of that run, to residential exits and logs: "The default connection was challenged. Switching to the higher-tier Apify proxy group for the rest of this run; that traffic is billed to your Apify proxy usage." Residential traffic is billed to your own Apify proxy usage, not as an extra actor event. You can also pick the residential group yourself under Connection. If the account is not allowed to use the chosen connection, the actor warns once and continues on a backup gateway, where coverage can be limited.
FAQ
How much does it cost?
You pay per flight record returned, with flight detail enrichment billed only when you switch it on. The Pricing tab shows the current rates. Use Max flights to cap the cost of any run.
Is it legal to scrape Flightradar24?
This actor collects only publicly available flight data. You are responsible for how you use it: follow Flightradar24's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution.
Can I get only new or changed flights on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new and updated records, and unchanged ones are not billed.
Why does coverage of a given aircraft vary?
Flightradar24's own coverage depends on receiver reach in that area, and some military and private aircraft are not broadcast at all. A gap in coverage is a source limitation, not a failed run.
Why did my run fail instead of returning an empty dataset?
If the site refuses every request, the run stops with a clear message so "no flights right now" is never confused with "nothing could be read". If the cause was a bot-check page, the message says so ("The site served a bot-check page on N attempt(s) (not an empty result set); try the Residential proxy group."). If the run had already switched to residential exits, the message instead says the page was served on N attempt(s), including on residential exits, and suggests trying again later or supplying your own proxy URLs. Run it again in a few minutes. If only some targets could be read, you still get what was found.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
๐ More scrapers you might like
Pair this actor with these related scrapers from the same team:
| โ๏ธ Award Flight Scraper Scrape award flight availability from Flightpoints.com and Roame.travel by route and... | ๐จ Klook Scraper Scrape Klook activities, tours, attractions and travel experiences from search pages or... |
| ๐ท๏ธ Wildberries Scraper Scrape Wildberries marketplace: product search with prices (wallet vs retail), discounts... | ๐จ Hostelworld Scraper Scrape Hostelworld hostels, hotels, guesthouses, B&Bs, apartments and campsites by city... |
| ๐งฉ Yandex Search Scraper Scrape Yandex web, image and video search results with URLs, snippets and organic... | ๐ผ NIJobs Scraper Scrape NIJobs.com listings across Northern Ireland by keyword, location, salary, posted... |
๐ Browse all abotapi scrapers
๐ฌ Support
- ๐ Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- ๐ ๏ธ Need another site, extra fields or a private build? Email contact@abotapi.com.
- โญ Enjoying it? A quick review on the actor page helps other users find it.