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
4
Total users
2
Monthly active users
14 days ago
Last modified
Categories
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 | "NEW", "UPDATED", "UNCHANGED", "REAPPEARED" or "EXPIRED", with the fields that changed (incremental mode only) |
scrapedAt | "2026-05-01T14:22:05Z" |
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.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.
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. |
bounds | array | ["55.0,45.0,-6.0,10.0"] | Map area bounding boxes, each north,south,west,east in decimal degrees (live mode). |
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). |
urls | array | sample Flightradar24 link | Airport board or aircraft links (url mode). |
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. |
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. |
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. |
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. |
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 proxy setting works out of the box, and the actor rotates connections automatically when one is refused. For large or frequent runs, the residential proxy group gives more headroom; pick it under Connection.
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". 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:
| โ๏ธ Flightpoints & Roame Award Flight Scraper Multi-source award flight availability from Flightpoints.com + Roame.travel. Search any... | ๐งฉ AllTrails Hiking Scraper Scrape AllTrails, the world's largest hiking platform: trails with difficulty, length... |
| ๐ Google Maps Scraper Extract business data from Google Maps at scale. Get names, addresses, phone numbers... | ๐ Rightmove From $1/1K. Fast, reliable Rightmove.co.uk scraper for sale, rent, and sold-price... |
| ๐งฉ Yandex SERP Scraper Scrape Yandex web, image and video results with URLs, snippets and organic rankings for... | ๐ Turo Scraper Collect Turo vehicles by location and trip dates or listing URLs. Get make, model, year... |
๐ Browse all abotapi scrapers
๐ฌ Support & custom scrapers
- ๐ 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 abotapi@proton.me or message Telegram @abotapi.
- โญ Enjoying it? A quick review on the actor page helps other users find it.