# OpenSky Live Aircraft Tracker (ADS-B State Vectors) (`scrapers_lat/opensky-live-aircraft-scraper`) Actor

Track every aircraft in the air right now via ADS-B. Query by bounding box, region preset or ICAO24 hex ids and get live position, altitude, speed, heading, squawk and identity as clean decoded fields. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/scrapers\_lat/opensky-live-aircraft-scraper.md
- **Developed by:** [Scrapers Lat](https://apify.com/scrapers_lat) (community)
- **Categories:** Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.32 / 1,000 results

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

[![OpenSky Live Aircraft Tracker (ADS-B State Vectors)](https://scrapers.lat/banners/opensky-live-aircraft-scraper.png)](https://apify.com/scrapers_lat/opensky-live-aircraft-scraper)

## OpenSky Live Aircraft Tracker (ADS-B State Vectors)

Here is one real result, with every field the actor returns:

```json
{
  "icao24": "44028a",
  "callsign": "EJU62FU",
  "originCountry": "Austria",
  "longitude": -0.6368,
  "latitude": 51.1368,
  "baroAltitudeM": 3009.9,
  "baroAltitudeFt": 9875,
  "geoAltitudeM": 3169.92,
  "geoAltitudeFt": 10400,
  "onGround": false,
  "velocityMs": 141.29,
  "velocityKnots": 275,
  "trueTrack": 248,
  "headingCardinal": "WSW",
  "verticalRateMs": 7.48,
  "verticalRateFtMin": 1472,
  "squawk": "5245",
  "spi": false,
  "positionSource": 0,
  "positionSourceLabel": "ADS-B",
  "category": null,
  "categoryLabel": null,
  "timePosition": 1786872409,
  "timePositionIso": "2026-08-16T09:26:49.000Z",
  "lastContact": 1786872409,
  "lastContactIso": "2026-08-16T09:26:49.000Z",
  "stateTimestamp": "2026-08-16T09:26:49.000Z",
  "sensors": null,
  "queriedRegion": "uk_ireland",
  "observedAt": "2026-08-16T09:26:59.204Z",
  "registration": "HB-JCO",
  "aircraftType": "C Series 300",
  "manufacturer": "Bombardier",
  "operator": "Swiss International Air Lines",
  "operatorCountry": "Switzerland",
  "photoUrl": "https://airport-data.com/images/aircraft/001/682/001682490.jpg",
  "airlineName": "British Airways",
  "flightIata": "BA178",
  "originAirport": "John F Kennedy International Airport",
  "originIata": "JFK",
  "destinationAirport": "London Heathrow Airport",
  "destinationIata": "LHR",
  "error": null
}
```

Track every aircraft in the air right now with a live flight tracker built on ADS-B state vectors. Point the actor at a bounding box, a named region preset, or a list of specific aircraft, and it returns one clean record per aircraft with live position, altitude, speed, heading, squawk and identity. The raw ADS-B state vector is decoded into labeled and derived fields, so you get altitude in both meters and feet, speed in knots, a cardinal compass heading, and a human-readable aircraft category label with no extra parsing. Two optional enrichments turn a raw transponder hex into a real identified aircraft (tail number, type, manufacturer and operating airline) and a bare callsign into a full flight route (airline, origin and destination airports).

**📥 [Input](https://apify.com/scrapers_lat/opensky-live-aircraft-scraper/input-schema) · 📤 [Output](https://apify.com/scrapers_lat/opensky-live-aircraft-scraper/output-schema) · 💰 [Pricing](https://apify.com/scrapers_lat/opensky-live-aircraft-scraper/pricing) · ▶️ [Examples](https://apify.com/scrapers_lat/opensky-live-aircraft-scraper/examples)**

![Apify](https://img.shields.io/badge/Platform-Apify-1CE1CE?logo=apify\&logoColor=white)
![Coverage](https://img.shields.io/badge/Coverage-Worldwide-blue)
![Output](https://img.shields.io/badge/Output-JSON%20%7C%20CSV%20%7C%20Excel-orange)
![Billing](https://img.shields.io/badge/Billing-Pay%20per%20result-brightgreen)

### Table of contents

- [What it does](#what-it-does)
- [Use cases](#use-cases)
- [Quickstart](#quickstart)
- [Input reference](#input-reference)
- [Output reference](#output-reference)
- [Example output record](#example-output-record)
- [Run via API and CLI](#run-via-api-and-cli)
- [Fetch results](#fetch-results)
- [Billing and limits](#billing-and-limits)
- [FAQ and troubleshooting](#faq-and-troubleshooting)

### What it does

The actor queries the OpenSky Network live state vector feed, decodes every aircraft it returns, and writes one normalized record per aircraft to the run's dataset. It resolves your target airspace in one of three ways, applies the optional airborne filter, deduplicates by aircraft, and caps the output at your `maxAircraft` value.

Each raw state vector is decoded into named fields and enriched with derived values so you can sort, map and analyze immediately:

- Altitude in meters and feet (`baroAltitudeFt`, `geoAltitudeFt`).
- Ground speed in knots (`velocityKnots`) alongside meters per second.
- Vertical rate in feet per minute (`verticalRateFtMin`).
- Cardinal compass heading (`headingCardinal`, for example `WSW`) from the true track.
- Human-readable `positionSourceLabel` (ADS-B, ASTERIX, MLAT, FLARM) and `categoryLabel`.
- ISO timestamps for the position, last contact and the snapshot itself.

This is a live snapshot tool. It reports where aircraft are at the moment of the run.

Two optional paid add-ons enrich each aircraft from the keyless adsbdb reference database:

- **Aircraft identity** (`withAircraftMetadata`): resolves the ICAO24 hex to its registration (tail number), aircraft type, manufacturer, operator (airline) and operator country, plus a photo URL.
- **Flight route** (`withFlightRoute`): resolves the callsign to its scheduled route, so `BAW178` becomes British Airways, JFK to LHR, with IATA flight number and airport codes.

### Use cases

- Live flight tracking and aircraft tracking over any region, bounding box or country.
- Turn an ADS-B transponder hex (ICAO24) into a real aircraft: tail number, type, manufacturer and operating airline.
- Resolve a flight callsign to its route: airline name, origin and destination airport with IATA codes.
- Airspace monitoring and geofence alerts for airports, borders and no-fly zones.
- Fleet and airline tracking: filter live aircraft by operator, aircraft type or region.
- Aviation data feeds for dashboards, maps and analytics that need real-time plane positions.
- Spotting and OSINT research on specific aircraft by ICAO24 hex or callsign.
- Build a flight radar style map with altitude, speed, heading and squawk for every aircraft in view.

### Quickstart

Open the actor, paste this into the input, and press Run. It returns 10 aircraft currently over the United Kingdom and Ireland.

```json
{
  "region": "uk_ireland",
  "onlyAirborne": true,
  "maxAircraft": 10
}
```

Every input field is optional. With an empty input the actor scans the `europe` region preset. Provide a bounding box or an ICAO24 list for finer control.

### Input reference

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `region` | enum | no | `europe` | Predefined airspace to scan. One of `europe`, `north_america`, `south_america`, `usa`, `uk_ireland`, `mediterranean`, `worldwide`. `worldwide` uses no bounding box and returns a large result set. Ignored when a bounding box or ICAO24 list is provided. |
| `latMin` | string | no | (empty) | Bounding box south edge in decimal degrees (-90 to 90). Provide all four bounding box fields to override the region preset. |
| `lonMin` | string | no | (empty) | Bounding box west edge in decimal degrees (-180 to 180). |
| `latMax` | string | no | (empty) | Bounding box north edge in decimal degrees (-90 to 90). |
| `lonMax` | string | no | (empty) | Bounding box east edge in decimal degrees (-180 to 180). |
| `icao24List` | string\[] | no | (empty) | Specific aircraft ICAO24 transponder hex ids, for example `a835af`, `4b1806`. When provided, only these aircraft are returned. Highest precedence. |
| `onlyAirborne` | boolean | no | `false` | When `true`, aircraft reported on the ground are filtered out. |
| `withAircraftMetadata` | boolean | no | `false` | Optional paid add-on. Resolves each aircraft hex to its registration (tail number), type, manufacturer, operator and operator country plus a photo URL. Billed only per aircraft that is identified ($0.012 each). Disabled for free Apify plans. |
| `withFlightRoute` | boolean | no | `false` | Optional paid add-on. Resolves each callsign to its scheduled route (airline, IATA flight number, origin and destination airports and IATA codes). Billed only per callsign with a resolved route ($0.012 each). Disabled for free Apify plans. |
| `maxAircraft` | integer | no | `100` | Maximum aircraft to return. Free Apify accounts are capped at 10 per run. |
| `proxyConfiguration` | object | no | Apify Residential | Proxy settings. Residential is enabled by default and recommended, because OpenSky does not accept requests from datacenter IP ranges. |

Precedence when more than one target is given: `icao24List` wins, then an explicit bounding box (all four fields set), then the `region` preset.

### Output reference

One dataset item per aircraft. Types: `string`, `number`, `integer`, `boolean`, `string[]`, or `null` when the source value is absent.

| Field | Type | Description |
|---|---|---|
| `icao24` | string | Unique ICAO24 transponder address in hex. Stable per airframe. |
| `callsign` | string | Flight callsign as broadcast, trimmed, or `null` when not transmitted. |
| `originCountry` | string | Country inferred from the transponder address range. |
| `longitude` | number | Last known longitude in decimal degrees. |
| `latitude` | number | Last known latitude in decimal degrees. |
| `baroAltitudeM` | number | Barometric altitude in meters. |
| `baroAltitudeFt` | integer | Barometric altitude in feet (derived). |
| `geoAltitudeM` | number | Geometric (GPS) altitude in meters. |
| `geoAltitudeFt` | integer | Geometric (GPS) altitude in feet (derived). |
| `onGround` | boolean | `true` when the aircraft reports being on the ground. |
| `velocityMs` | number | Ground speed in meters per second. |
| `velocityKnots` | integer | Ground speed in knots (derived). |
| `trueTrack` | integer | Track over ground in degrees clockwise from geographic north. |
| `headingCardinal` | string | Cardinal compass direction of travel, for example `N`, `NE`, `WSW` (derived). |
| `verticalRateMs` | number | Vertical rate in meters per second. Positive is climbing. |
| `verticalRateFtMin` | integer | Vertical rate in feet per minute (derived). |
| `squawk` | string | Transponder squawk (Mode A) code, or `null`. |
| `spi` | boolean | Special purpose indicator flag. |
| `positionSource` | integer | Position source code: `0` ADS-B, `1` ASTERIX, `2` MLAT, `3` FLARM. |
| `positionSourceLabel` | string | Human-readable position source (derived). |
| `category` | integer | Aircraft category code, or `null` when not broadcast. |
| `categoryLabel` | string | Human-readable aircraft category, for example `Large (75000 to 300000 lbs)` (derived). |
| `timePosition` | integer | Unix time of the last position update. |
| `timePositionIso` | string | ISO 8601 timestamp of the last position update (derived). |
| `lastContact` | integer | Unix time of the last message received from the aircraft. |
| `lastContactIso` | string | ISO 8601 timestamp of the last message received (derived). |
| `stateTimestamp` | string | ISO 8601 timestamp of the state snapshot returned by OpenSky. |
| `sensors` | integer\[] | Sensor ids that received messages, when available, otherwise `null`. |
| `queriedRegion` | string | Region preset used for the query, or `null` for bounding box and ICAO24 modes. |
| `observedAt` | string | ISO 8601 timestamp of when the record was collected. |
| `registration` | string | Aircraft registration / tail number. Populated by the `withAircraftMetadata` add-on, otherwise `null`. |
| `aircraftType` | string | Aircraft type / model. `withAircraftMetadata` add-on. |
| `manufacturer` | string | Aircraft manufacturer. `withAircraftMetadata` add-on. |
| `operator` | string | Registered owner / operating airline. `withAircraftMetadata` add-on. |
| `operatorCountry` | string | Operator country name. `withAircraftMetadata` add-on. |
| `photoUrl` | string | Aircraft photo URL. `withAircraftMetadata` add-on. |
| `airlineName` | string | Operating airline name for the callsign. Populated by the `withFlightRoute` add-on, otherwise `null`. |
| `flightIata` | string | IATA flight number for the callsign. `withFlightRoute` add-on. |
| `originAirport` | string | Origin airport name. `withFlightRoute` add-on. |
| `originIata` | string | Origin airport IATA code. `withFlightRoute` add-on. |
| `destinationAirport` | string | Destination airport name. `withFlightRoute` add-on. |
| `destinationIata` | string | Destination airport IATA code. `withFlightRoute` add-on. |
| `error` | string | `null` on success. On a failed run, a single item with a populated `error` field is written instead. |

#### Derived field notes

- Feet, knots and feet-per-minute are computed from the source SI values (`meters × 3.28084`, `m/s × 1.94384`, `m/s × 196.85`) and rounded to whole numbers.
- `headingCardinal` maps `trueTrack` onto a 16-point compass rose.
- `categoryLabel` follows the OpenSky aircraft category list. Many aircraft do not broadcast a category, in which case `category` and `categoryLabel` are `null`.

### Example output record

Real record from a live run (input `{"region": "uk_ireland", "onlyAirborne": true, "maxAircraft": 10}`):

```json
{
  "icao24": "500402",
  "callsign": "T7ZAM",
  "originCountry": "San Marino",
  "longitude": 0.1545,
  "latitude": 51.3083,
  "baroAltitudeM": 7338.06,
  "baroAltitudeFt": 24075,
  "geoAltitudeM": 7650.48,
  "geoAltitudeFt": 25100,
  "onGround": false,
  "velocityMs": 238.84,
  "velocityKnots": 464,
  "trueTrack": 97,
  "headingCardinal": "E",
  "verticalRateMs": 9.1,
  "verticalRateFtMin": 1791,
  "squawk": "5257",
  "spi": false,
  "positionSource": 0,
  "positionSourceLabel": "ADS-B",
  "category": null,
  "categoryLabel": null,
  "timePosition": 1786872409,
  "timePositionIso": "2026-08-16T09:26:49.000Z",
  "lastContact": 1786872409,
  "lastContactIso": "2026-08-16T09:26:49.000Z",
  "stateTimestamp": "2026-08-16T09:26:49.000Z",
  "sensors": null,
  "queriedRegion": "uk_ireland",
  "observedAt": "2026-08-16T09:26:59.288Z",
  "error": null
}
```

### Run via API and CLI

Start a run and wait for it to finish, then read the dataset. Replace `<TOKEN>` with your Apify API token.

Run synchronously and get dataset items in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~opensky-live-aircraft-scraper/run-sync-get-dataset-items?token=<TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"region":"europe","onlyAirborne":true,"maxAircraft":100}'
```

Start a run asynchronously:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~opensky-live-aircraft-scraper/runs?token=<TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"latMin":"49.5","lonMin":"-11.0","latMax":"61.0","lonMax":"2.0","maxAircraft":200}'
```

Apify CLI:

```bash
apify call scrapers_lat/opensky-live-aircraft-scraper \
  --input '{"icao24List":["a835af","4b1806"]}'
```

### Fetch results

Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing `format`:

```bash
## JSON
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"

## CSV
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"

## Paginate large datasets
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"
```

`<DATASET_ID>` is returned as `defaultDatasetId` in the run object. Use `offset` and `limit` to page through large result sets. `clean=true` drops empty and internal fields.

### Billing and limits

- **Pay per result.** You are charged per aircraft record returned (`result` event). See the [pricing tab](https://apify.com/scrapers_lat/opensky-live-aircraft-scraper/pricing) for the current per-result price.
- **No charge on failure.** If a run errors or is rate-limited by the source, the actor writes a single item with a populated `error` field and does not charge for it. Empty runs cost nothing.
- **Aircraft identity add-on** (`aircraft_metadata`, $0.012). Opt-in via `withAircraftMetadata`, default off. Charged only per aircraft that is successfully identified (registration, type, operator). No match means no charge. Disabled for free Apify plans.
- **Flight route add-on** (`flight_route`, $0.012). Opt-in via `withFlightRoute`, default off. Charged only per callsign with a resolved route (airline, origin, destination). Unknown callsign means no charge. Disabled for free Apify plans.
- **Spend cap respected.** Set `maxTotalChargeUsd` on the run; once reached, the actor stops emitting and charging further billable results and add-ons.
- **Free Apify plans** are capped at 10 aircraft per run, and the paid add-ons are disabled. Upgrade for a higher `maxAircraft` and to enable enrichments.

### FAQ and troubleshooting

**A run returned 0 aircraft. Why?**
No aircraft were in the requested airspace at that moment, or your ICAO24 ids are not currently being tracked. Widen the bounding box, choose a busier region, or try again. Zero-result runs are not charged.

**Why do I need the Residential proxy?**
The OpenSky Network does not accept requests from datacenter IP ranges, so the actor routes through Apify Residential proxy by default. Leave the default proxy setting in place for reliable results.

**How fresh is the data?**
It is a live snapshot at run time. OpenSky anonymous access serves current state vectors at roughly 10-second time resolution. Each record carries `lastContactIso` and `stateTimestamp` so you know exactly how recent the position is.

**Can I get historical flights or tracks?**
No. This actor returns live states only. OpenSky historical endpoints (past flights and tracks) require an authenticated account and return HTTP 403 for anonymous access, so they are out of scope here.

**Can I get the flight route (origin and destination)?**
Yes. Enable the `withFlightRoute` add-on and each aircraft with a callsign is resolved to its scheduled route: airline name, IATA flight number, and origin and destination airports with IATA codes. Unknown callsigns are left as `null` and are not charged.

**How do I turn a transponder hex into a real aircraft?**
Enable the `withAircraftMetadata` add-on. Each ICAO24 hex is resolved to its registration (tail number), type, manufacturer, operator and operator country plus a photo URL. Hexes with no reference match are left as `null` and are not charged.

**I got a rate-limit message. What happened?**
OpenSky anonymous access is rate-limited (roughly 400 requests per day across the network). If the quota is hit, the actor retries once with backoff and, if still limited, writes an unbilled `error` row instead of crashing. Wait a short while and run again.

**Why is `callsign`, `category`, or `squawk` null?**
Not every aircraft broadcasts every field. Missing source values are returned as `null`, never invented. Aircraft category in particular is frequently absent from ADS-B transmissions.

**Is this an official OpenSky tool?**
No. This actor is independent and has no affiliation with the OpenSky Network. It reads only data that is publicly available through the OpenSky live states API. Use it in accordance with the OpenSky Network terms of use.

### More scrapers at scrapers.lat

Built and maintained by [scrapers.lat](https://scrapers.lat), where we publish scrapers for public platforms: company registries, government data, aviation, finance, e-commerce and more. Browse the catalog or request a custom scraper at [scrapers.lat](https://scrapers.lat).

***

> Independent tool, not affiliated with the OpenSky Network. Accesses only publicly available OpenSky live states data. Use in accordance with the OpenSky Network terms of use.

# Actor input Schema

## `region` (type: `string`):

Quickly select a predefined airspace to scan. Worldwide returns all aircraft OpenSky can see (large result set). Use a bounding box or ICAO24 list instead for finer control. Ignored when a bounding box or ICAO24 list is provided.

## `latMin` (type: `string`):

Bounding box south edge (decimal degrees, -90 to 90). Provide all four bounding box fields to override the region preset.

## `lonMin` (type: `string`):

Bounding box west edge (decimal degrees, -180 to 180).

## `latMax` (type: `string`):

Bounding box north edge (decimal degrees, -90 to 90).

## `lonMax` (type: `string`):

Bounding box east edge (decimal degrees, -180 to 180).

## `icao24List` (type: `array`):

Optional list of specific aircraft ICAO24 transponder hex ids (for example a835af, 4b1806). When provided, only these aircraft are returned (highest precedence, overrides bounding box and region).

## `onlyAirborne` (type: `boolean`):

When on, aircraft reported as on the ground are filtered out and only airborne aircraft are returned.

## `withAircraftMetadata` (type: `boolean`):

Optional paid add-on. When on, each aircraft hex is resolved to its real identity: tail number (registration), aircraft type, manufacturer, operator (airline) and operator country, plus a photo URL. Billed only for aircraft that are successfully identified ($0.012 each). Disabled for free Apify plans.

## `withFlightRoute` (type: `boolean`):

Optional paid add-on. When on, each callsign is resolved to its scheduled route: airline name, IATA flight number, and origin/destination airport names and IATA codes (for example British Airways, LHR to JFK). Billed only for callsigns with a resolved route ($0.012 each). Disabled for free Apify plans.

## `maxAircraft` (type: `integer`):

Maximum number of aircraft to return. Free Apify accounts are capped at 10 per run.

## `proxyConfiguration` (type: `object`):

Proxy settings. Apify Residential proxy is enabled by default and recommended, since the OpenSky Network does not accept requests from datacenter IP ranges.

## Actor input object example

```json
{
  "region": "europe",
  "onlyAirborne": false,
  "withAircraftMetadata": false,
  "withFlightRoute": false,
  "maxAircraft": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (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 = {
    "maxAircraft": 100,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapers_lat/opensky-live-aircraft-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 = {
    "maxAircraft": 100,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapers_lat/opensky-live-aircraft-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 '{
  "maxAircraft": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call scrapers_lat/opensky-live-aircraft-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapers_lat/opensky-live-aircraft-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/YTLSHRX4Tc9H8UqkZ/builds/6NzK0QWzNOWSvvAPZ/openapi.json
