# Flightradar24 Flight Detail Scraper (`romy/flightradar24-flight-detail-scraper`) Actor

Get full flight detail from Flightradar24 for one or more flight ids — live status, ETA, route, aircraft, and historical track lookup. No login or API key needed; talks directly to Flightradar24's public API. Split out from romy/flightradar24-all-in-one-api as a focused Actor.

- **URL**: https://apify.com/romy/flightradar24-flight-detail-scraper.md
- **Developed by:** [Romy](https://apify.com/romy) (community)
- **Categories:** Travel
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.12 / 1,000 flight detail fetcheds

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

### What does Flightradar24 Flight Detail Scraper do?

**Flightradar24 Flight Detail Scraper** takes one or more numeric Flightradar24 flight ids and pushes, for each one, in a single merged dataset row:

- **Full flight detail** (aircraft, schedule, progress, flight trail) via the internal gRPC live feed
- **A REST lookup** by hex-converted id — covers flights the gRPC feed itself won't return (already-landed aircraft, ground traffic not currently broadcasting)
- **A batched live-status refresh** (position, squawk, status) fetched once for all input ids together

### Why use Flightradar24 Flight Detail Scraper?

- **Three calls, one row** — gRPC detail, REST lookup, and live status merged per flight id, with the batch status call made once regardless of how many ids you pass
- **No API key, no login** — same anonymous access the official Flightradar24 Android app uses
- **Use cases:** enriching a list of flight ids from a live-feed/top-flights query, tracking dashboards, delay/status monitoring, flight-detail lookups for logistics or research

### How it connects to the parent Actor

This is the flight-detail slice of [Flightradar24 All-in-One API](https://apify.com/romy/flightradar24-all-in-one-api), split out as its own focused Actor. The parent exposes the full internal gRPC feed (`data-feed.flightradar24.com`) and legacy REST API (`mobile.flightradar24.com`) as an always-on Standby API with many more endpoints (live-feed by bounding box, search, airport boards, streaming, playback, nearest-flights). This Actor covers only `/flight-details`, `/flight-lookup`, and `/flights-status`, run per input flight id.

### Input

| Field                | Type      | Description                                                                                                                                     |
| -------------------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| `flightIds`          | integer\[] | Numeric Flightradar24 flight ids. Optional: leave empty and `flightCount` (default 1) currently airborne flights are picked from the live feed. |
| `flightCount`        | integer   | How many flights to auto-pick when `flightIds` is empty (1-20, default 1).                                                                      |
| `includeLookup`      | boolean   | Also fetch each flight via the legacy REST `/clickhandler` lookup. Default `true`.                                                              |
| `includeStatus`      | boolean   | Also fetch a batched live-status refresh for all input ids in one call. Default `true`.                                                         |
| `historyUnixSeconds` | integer   | Optional. Passed to every REST lookup call — looks up each flight's state at a past point in time.                                              |

Example:

```json
{
    "flightIds": [1094013202],
    "includeLookup": true,
    "includeStatus": true
}
```

### Output

One dataset row per flight id:

```json
{
    "flightId": 1094013202,
    "flightIdHex": "41355112",
    "details": {
        "aircraftInfo": {
            "reg": "PK-PWO",
            "type": "A320",
            "fullDescription": "Airbus A320-214",
            "registeredOwners": "Pelita Air"
        },
        "scheduleInfo": {
            "flightNumber": "IP646",
            "scheduledDeparture": "1786921200",
            "actualDeparture": "1786921125"
        },
        "flightProgress": { "progressPct": 65, "flightStage": 3, "delayStatus": 1 },
        "flightTrail": [{ "snapshotId": "1786921371", "lat": -1.34, "lon": 116.72, "altitude": 6175, "spd": 272 }]
    },
    "lookup": {
        "identification": { "id": "41355112", "number": { "default": "IP646" } },
        "aircraft": { "registration": "PK-PWO", "model": { "text": "Airbus A320-214" } }
    },
    "status": { "lat": -5.82, "lon": 111.41, "status": 4, "timestamp": "1786924711" }
}
```

`lookup` and `status` are omitted (`undefined`) when `includeLookup` / `includeStatus` are set to `false`.

### Known limitations

- **The hex-conversion technique for `/flight-lookup`** (`(flightId >>> 0).toString(16)`) is inferred from a source comment in the parent Actor's own REST client — "the hex `flight` id can come from a gRPC `Flight.flightId` converted to hex" — not from any documented Flightradar24 API. It matches the format of real hex ids returned by Flightradar24's own `/search` endpoint (e.g. `"41336b86"`), but Flightradar24 has not published this mapping.
- **Some `aircraftInfo` fields are paywalled by Flightradar24 itself, not by this Actor.** `msn` (serial number), `acAge`/`acBirthDate`, and `countryOfReg` come back empty even though their companion `*Available` flags report `true` — this API calls the feed anonymously, the same way the free tier of the Flightradar24 app does.
- `/flight-lookup`'s `history` depth is limited server-side by Flightradar24 (matches the app's own free-tier window), not by this Actor.
- Live-feed by bounding box, search, airport boards, streaming, and playback are covered by the parent [Flightradar24 All-in-One API](https://apify.com/romy/flightradar24-all-in-one-api) and its other spin-off Actors, not this one.

### Pricing

This Actor uses **Pay Per Event** billing: charged $0.004 per flight id processed (event `flight-detail`, FREE tier price — lower on paid plans). See the Actor's Pricing tab for current rates.

# Actor input Schema

## `flightIds` (type: `array`):

Numeric Flightradar24 flight ids (from a live-feed, top-flights, or search result). Optional: leave empty and the actor picks currently airborne flight(s) from the live feed (see flightCount) -- a fixed id goes stale once that flight lands.

## `flightCount` (type: `integer`):

How many airborne flights to pick when flightIds is empty (1-20).

## `includeLookup` (type: `boolean`):

Also fetch each flight via the legacy REST /clickhandler endpoint (hex-converted id). Covers flights the gRPC feed itself won't return (e.g. already-landed/ground traffic).

## `includeStatus` (type: `boolean`):

Also fetch a batched live position/status refresh for all input flight ids in a single gRPC call.

## `historyUnixSeconds` (type: `integer`):

Optional. Passed to every REST flight-lookup call to look up each flight's state at a past point in time instead of now.

## Actor input object example

```json
{
  "flightCount": 1,
  "includeLookup": true,
  "includeStatus": true
}
```

# Actor output Schema

## `dataset` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("romy/flightradar24-flight-detail-scraper").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("romy/flightradar24-flight-detail-scraper").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 '{}' |
apify call romy/flightradar24-flight-detail-scraper --silent --output-dataset

```

## MCP server setup

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

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/p0SzbdpJ6snvIycJw/builds/CInNJ9zpgNtJdhQFE/openapi.json
