# OpenSky Flight Scraper — Live Aircraft & ADS-B Data (`logiover/opensky-flight-scraper`) Actor

Scrape live aircraft states and flight history from OpenSky Network. Extract icao24, callsign, position, altitude, velocity, heading for aviation analytics, flight tracking, and ATC research. No API key, no login.

- **URL**: https://apify.com/logiover/opensky-flight-scraper.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Flight Scraper — Live Aircraft, ADS-B Data & Real-Time Positions

Scrape real-time aircraft positions and live ADS-B data from a global grid of aviation centers — keyless, no login, thousands of aircraft per single run.

### What does OpenSky Flight Scraper do?

OpenSky Flight Scraper pulls live aircraft state data from a real-time ADS-B (Automatic Dependent Surveillance–Broadcast) feed covering 52 major aviation centers worldwide. Each run sends concurrent requests to multiple regional endpoints, deduplicates aircraft by ICAO24 hex address, and pushes thousands of clean records to your dataset in seconds.

The engine works without any API key or authentication — just run it. Under the hood it queries a global grid spanning Europe, North America, the Middle East, Asia, Africa, Oceania, and South America. You can scrape the entire world (default) or focus on a bounding box or a single custom center point. Each aircraft record includes tail number (registration), aircraft type code, ICAO24 hex, flight callsign, precise lat/lon, barometric altitude, ground speed, heading, and vertical rate — everything you need for flight tracking, research, or analytics pipelines.

Duplicate aircraft are automatically filtered: if an aircraft appears in range of two adjacent grid centers, only one record is pushed. The result is a clean, deduplicated snapshot of global air traffic.

### Who is it for?

- **Aviation researchers and data scientists** who need periodic global flight snapshots for modeling, routing, or traffic studies.
- **Flight tracking developers** building apps that display live aircraft on a map — without paying per API call.
- **Logistics and cargo companies** monitoring specific regions for inbound freight aircraft.
- **Airport operations teams** wanting a programmable data feed of airspace activity near their facility.
- **Journalists and analysts** covering aviation events, flight patterns, or airspace incidents.

### Use cases

- Build a live flight map dashboard pulling thousands of aircraft positions every few minutes.
- Monitor aircraft traffic in a specific region (Europe, APAC, North America) for capacity planning.
- Analyze commercial vs. private vs. cargo aircraft ratios by aircraft type codes.
- Track specific airlines by filtering results on callsign prefix (BAW=British Airways, UAL=United, etc.).
- Export daily snapshots to Google Sheets or a database for longitudinal traffic trend analysis.

### Why use OpenSky Flight Scraper?

- **Completely keyless**: no API account, no signup, no credentials required from you.
- **16 output fields per aircraft**: ICAO24, callsign, registration, type, lat/lon, altitude (baro + geo), speed, heading, vertical rate, squawk, category, region, and timestamp.
- **Global coverage**: 52 aviation centers across 6 continents; one default run captures 1,000–6,000+ aircraft.
- **Bounding box or center-point filtering**: focus on a country, region, or arbitrary lat/lon + radius.
- **Export to CSV, JSON, Excel, Google Sheets**: built-in Apify export formats.
- **Pay-per-result**: charged only for actual aircraft records, not compute time.

### What data can you extract?

Each aircraft record contains:

| Field | Type | Description |
|-------|------|-------------|
| `icao24` | string | 24-bit ICAO Mode S transponder address (hex) |
| `callsign` | string | Flight callsign or airline designator (trimmed) |
| `registration` | string | Aircraft tail number (e.g. G-VIIE, N12345) |
| `aircraftType` | string | ICAO type code (B738, A320, B77W, C172, etc.) |
| `longitude` | number | WGS-84 longitude in decimal degrees |
| `latitude` | number | WGS-84 latitude in decimal degrees |
| `baroAltitude` | number | Barometric altitude in meters |
| `geoAltitude` | number | GPS/geometric altitude in meters |
| `onGround` | string | "true" if on ground, "false" if airborne |
| `velocity` | string | Ground speed in m/s |
| `trueTrack` | string | Track angle in degrees (0=north, 90=east) |
| `verticalRate` | string | Climb/descent rate in m/s (positive=climbing) |
| `squawk` | string | ATC transponder squawk code |
| `category` | string | ADS-B emitter category (A1=light, A3=medium, A5=heavy) |
| `snapshotTime` | string | Unix timestamp of this data snapshot |
| `region` | string | Nearest aviation center label (e.g. London, Paris, Tokyo) |

**Example output record:**

```json
{
  "icao24": "4005bd",
  "callsign": "BAW19N",
  "registration": "G-VIIE",
  "aircraftType": "B772",
  "longitude": -2.576523,
  "latitude": 51.740671,
  "baroAltitude": 7521,
  "geoAltitude": 7986,
  "onGround": "false",
  "velocity": "223",
  "trueTrack": "278.35",
  "verticalRate": "7",
  "squawk": "7761",
  "category": "A5",
  "snapshotTime": "1783521184",
  "region": "London"
}
````

### How to use

#### Option A: Full global snapshot (default)

1. Open the actor input form.
2. Leave all fields at defaults (mode = `liveStates`, no bbox, no center point).
3. Click **Run**. The actor queries all 52 global grid centers concurrently.
4. When finished, download your dataset as JSON, CSV, or Excel.

**Input example:**

```json
{
  "mode": "liveStates"
}
```

#### Option B: Bounding box (regional focus)

Specify `lamin`, `lomin`, `lamax`, `lomax` to restrict the scraper to grid centers that fall inside your bounding box.

**Input example — Europe only:**

```json
{
  "mode": "liveStates",
  "lamin": 35,
  "lomin": -15,
  "lamax": 72,
  "lomax": 45
}
```

#### Option C: Single center point

Set `centerLat` and `centerLon` to query one specific location. Adjust `radius` (in nautical miles, default 100) as needed.

**Input example — Dubai airspace:**

```json
{
  "mode": "liveStates",
  "centerLat": 25.2,
  "centerLon": 55.4,
  "radius": 150
}
```

### Input parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `mode` | string | `liveStates` | Scraping mode — currently only `liveStates` is supported |
| `lamin` | number | — | Minimum latitude for bounding box filter |
| `lomin` | number | — | Minimum longitude for bounding box filter |
| `lamax` | number | — | Maximum latitude for bounding box filter |
| `lomax` | number | — | Maximum longitude for bounding box filter |
| `centerLat` | number | — | Latitude of a single custom center point |
| `centerLon` | number | — | Longitude of a single custom center point |
| `radius` | integer | `100` | Search radius in nautical miles (max ~150) |
| `proxy` | object | — | Optional Apify proxy configuration |

**Full input JSON:**

```json
{
  "mode": "liveStates",
  "lamin": 35,
  "lomin": -15,
  "lamax": 72,
  "lomax": 45,
  "radius": 100
}
```

### Output example

```json
{
  "icao24": "4070e3",
  "callsign": "EXS22AP",
  "registration": "G-JZHO",
  "aircraftType": "B738",
  "longitude": -2.447724,
  "latitude": 51.38118,
  "baroAltitude": 1120,
  "geoAltitude": 1280,
  "onGround": "false",
  "velocity": "108",
  "trueTrack": "340.44",
  "verticalRate": "-6",
  "squawk": "5310",
  "category": "A3",
  "snapshotTime": "1783521184",
  "region": "London"
}
```

### Tips for best results

- **Use bounding box to cut runtime**: for a continental region (Europe, North America), specifying a bbox reduces queries from 52 to 8–14 centers and returns results faster.
- **Schedule every 5–10 minutes** for near-real-time tracking — the data refreshes roughly every 8–12 seconds at source.
- **Filter airborne only**: post-process with `onGround === "false"` to exclude parked aircraft.
- **Filter by callsign prefix** to track a specific airline: BAW = British Airways, UAL = United, DLH = Lufthansa.
- **Use `aircraftType`** to separate heavy jets (B77W, A388) from regional (E190, CRJ9) or light (C172) aircraft.
- **Altitude in feet**: baroAltitude and geoAltitude are output in meters; multiply by 3.28084 to convert to feet.
- **`region` field** tells you which grid center detected the aircraft — useful for geographic grouping without geocoding.
- **Custom center + radius** is ideal for monitoring a specific airport's approach and departure corridor.
- **Large radius above 150nm** may time out — keep radius at 100–120nm for reliability.
- **Run during peak hours** (06:00–22:00 UTC) to maximize aircraft counts; overnight snapshots are thinner.

### Integrations

| Integration | How |
|-------------|-----|
| **Google Sheets** | Use the built-in Apify → Google Sheets integration to stream rows on each run finish. |
| **Slack** | Set a webhook to send run completion alerts with aircraft count. |
| **Zapier / Make** | Trigger downstream workflows (email, CRM, database write) when a run completes. |
| **Webhooks** | POST to any URL on run success — pass `defaultDatasetId` to fetch the data. |
| **Scheduler** | Apify scheduler runs the actor every N minutes for continuous tracking. |

### API usage

**cURL:**

```bash
curl -X POST "https://api.apify.com/v2/acts/logiover~opensky-flight-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mode":"liveStates","lamin":35,"lomin":-15,"lamax":72,"lomax":45}'
```

**Node.js (Apify client):**

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('logiover~opensky-flight-scraper').call({
  mode: 'liveStates',
  lamin: 35, lomin: -15, lamax: 72, lomax: 45,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, 'aircraft');
```

**Python:**

```python
from apify_client import ApifyClient
client = ApifyClient(token='YOUR_TOKEN')
run = client.actor('logiover~opensky-flight-scraper').call(run_input={
    'mode': 'liveStates', 'lamin': 35, 'lomin': -15, 'lamax': 72, 'lomax': 45
})
items = client.dataset(run['defaultDatasetId']).iterate_items()
for aircraft in items:
    print(aircraft['callsign'], aircraft['latitude'], aircraft['longitude'])
```

### Use with AI agents (MCP)

This actor is accessible via the Apify MCP server, letting AI agents query live flight data during reasoning. Example prompt for an AI agent:

> "Run the OpenSky Flight Scraper for the European bounding box (lamin=35, lomin=-15, lamax=72, lomax=45). Then tell me how many heavy (category A5) aircraft are currently airborne over Europe, and list the top 5 by altitude."

Connect via: `npx @apify/mcp-server --token YOUR_TOKEN`

### FAQ

#### Does this require an API key or account?

No. The actor uses publicly accessible ADS-B data endpoints with no key, login, or registration required from you.

#### How many aircraft will one run return?

A full global run typically returns 1,000–6,000+ unique aircraft depending on time of day. European or North American bbox runs return 500–1,500. A single city center at 100nm returns 50–300.

#### How often is the data updated?

The underlying ADS-B receivers refresh every 8–12 seconds. Since this actor takes a single snapshot, schedule it on Apify every 5–10 minutes for near-real-time tracking.

#### Why does `originCountry` show null?

This actor uses a low-latency ADS-B feed that provides registration (tail number) but not country of registration as a named field. You can infer country from the registration prefix: G-=UK, D-=Germany, N=USA, F-=France, etc.

#### What does the `category` field mean?

ADS-B emitter categories: A1=light (under 15,500 lb), A2=small, A3=medium, A5=heavy (over 300,000 lb), B1=glider, C0=surface vehicle. Most commercial jets are A3 or A5.

#### Some fields are null — why?

Not all aircraft transmit all fields via ADS-B. Older transponders (Mode C) do not broadcast registration or aircraft type. Military aircraft often suppress many fields.

#### Can I get historical flight data?

No — this actor captures live snapshots only. For historical data, consider Apify's scheduling features to build your own archive by running the actor periodically.

#### Can I filter by airline or aircraft type?

Not in-actor — filter post-run. Use Apify's dataset filtering or export to a spreadsheet and filter on `callsign` prefix or `aircraftType`.

#### Will a very large radius (200nm+) work?

Radii above roughly 150nm can cause timeouts due to response size. Keep `radius` at 100–120nm for reliable results.

#### Is this scraping within the API's terms of use?

The data source is a publicly accessible, free-to-use ADS-B network. No authentication or rate-limit bypassing is performed. Review the source terms of service before using data commercially.

#### What is the fastest way to get just one airport's traffic?

Use `centerLat` + `centerLon` + `radius: 50` to focus on the immediate airport area. For example, Heathrow: `{"centerLat":51.477,"centerLon":-0.461,"radius":50}`.

#### Can I run this at scale for multiple regions simultaneously?

Yes — create multiple Apify tasks, each with a different bbox, and trigger them in parallel. Or use one run with a large bbox and let the built-in grid handle it.

### Is it legal?

ADS-B broadcasts are public radio signals transmitted by aircraft on 1090 MHz and freely received by anyone with appropriate equipment. This actor accesses a public, unauthenticated API that aggregates community-received ADS-B data. No private data, passenger information, or proprietary feeds are accessed. Use the extracted data in accordance with the applicable terms of service of the data source and your local regulations. This tool is intended for research, analytics, and development purposes.

### Related scrapers

- **[B2B Lead Scraper](https://apify.com/logiover/b2b-lead-scraper)** — Extract business leads with contact details from OpenStreetMap across any industry and country.
- **[ComTrade Data Scraper](https://apify.com/logiover/comtrade-trade-data-scraper)** — Pull import/export statistics from the UN Comtrade database for trade flow analysis.
- **[Google Flights Scraper](https://apify.com/logiover/google-flights-scraper)** — Search and extract flight prices, routes, and availability from Google Flights.

# Actor input Schema

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

Pick a world region to scan live aircraft over its busiest airports. 'Worldwide' scans the full global grid. Leave as default (Worldwide) to get live flights everywhere. To scan a precise area instead, use the bounding box or custom center fields below.

## `maxResults` (type: `integer`):

Maximum number of unique aircraft to return. Default 500 keeps empty/worldwide runs fast and cheap. Raise it (up to 20000) to capture every aircraft in view.

## `lamin` (type: `number`):

Minimum latitude for a bounding-box filter (e.g. 40). When all four bbox fields are set, only grid centers inside the box are queried. Leave empty to use the Region selector instead.

## `lomin` (type: `number`):

Minimum longitude for a bounding-box filter (e.g. -10). Use together with the other three bbox fields.

## `lamax` (type: `number`):

Maximum latitude for a bounding-box filter (e.g. 60). Use together with the other three bbox fields.

## `lomax` (type: `number`):

Maximum longitude for a bounding-box filter (e.g. 30). Use together with the other three bbox fields.

## `centerLat` (type: `number`):

Latitude of a single custom center point. Use with Center Longitude and Search Radius for a focused area search.

## `centerLon` (type: `number`):

Longitude of a single custom center point. Use with Center Latitude and Search Radius.

## `radius` (type: `integer`):

Radius in nautical miles around each grid center (or custom center). Default 100nm. Max ~250nm before responses get too large.

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

Apify proxy settings. Defaults to Apify Proxy (AUTO). The adsb.lol API is open, so a direct connection is used automatically as a fallback if the proxy fails.

## Actor input object example

```json
{
  "region": "worldwide",
  "maxResults": 500,
  "radius": 100,
  "proxy": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All records extracted by this run. Open the Dataset tab to browse, filter, and export as CSV, JSON, or Excel.

# 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 = {
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/opensky-flight-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 = { "proxy": { "useApifyProxy": True } }

# Run the Actor and wait for it to finish
run = client.actor("logiover/opensky-flight-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call logiover/opensky-flight-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=logiover/opensky-flight-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "OpenSky Flight Scraper — Live Aircraft & ADS-B Data",
        "description": "Scrape live aircraft states and flight history from OpenSky Network. Extract icao24, callsign, position, altitude, velocity, heading for aviation analytics, flight tracking, and ATC research. No API key, no login.",
        "version": "1.0",
        "x-build-id": "hLckCtHGDTGaBCDyM"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/logiover~opensky-flight-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-logiover-opensky-flight-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/logiover~opensky-flight-scraper/runs": {
            "post": {
                "operationId": "runs-sync-logiover-opensky-flight-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/logiover~opensky-flight-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-logiover-opensky-flight-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "region": {
                        "title": "Region",
                        "enum": [
                            "worldwide",
                            "europe",
                            "northAmerica",
                            "middleEastAsia",
                            "africa",
                            "oceania",
                            "southAmerica"
                        ],
                        "type": "string",
                        "description": "Pick a world region to scan live aircraft over its busiest airports. 'Worldwide' scans the full global grid. Leave as default (Worldwide) to get live flights everywhere. To scan a precise area instead, use the bounding box or custom center fields below.",
                        "default": "worldwide"
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "maximum": 20000,
                        "type": "integer",
                        "description": "Maximum number of unique aircraft to return. Default 500 keeps empty/worldwide runs fast and cheap. Raise it (up to 20000) to capture every aircraft in view.",
                        "default": 500
                    },
                    "lamin": {
                        "title": "Min Latitude (bounding box, optional)",
                        "minimum": -90,
                        "maximum": 90,
                        "type": "number",
                        "description": "Minimum latitude for a bounding-box filter (e.g. 40). When all four bbox fields are set, only grid centers inside the box are queried. Leave empty to use the Region selector instead."
                    },
                    "lomin": {
                        "title": "Min Longitude (bounding box, optional)",
                        "minimum": -180,
                        "maximum": 180,
                        "type": "number",
                        "description": "Minimum longitude for a bounding-box filter (e.g. -10). Use together with the other three bbox fields."
                    },
                    "lamax": {
                        "title": "Max Latitude (bounding box, optional)",
                        "minimum": -90,
                        "maximum": 90,
                        "type": "number",
                        "description": "Maximum latitude for a bounding-box filter (e.g. 60). Use together with the other three bbox fields."
                    },
                    "lomax": {
                        "title": "Max Longitude (bounding box, optional)",
                        "minimum": -180,
                        "maximum": 180,
                        "type": "number",
                        "description": "Maximum longitude for a bounding-box filter (e.g. 30). Use together with the other three bbox fields."
                    },
                    "centerLat": {
                        "title": "Center Latitude (optional)",
                        "minimum": -90,
                        "maximum": 90,
                        "type": "number",
                        "description": "Latitude of a single custom center point. Use with Center Longitude and Search Radius for a focused area search."
                    },
                    "centerLon": {
                        "title": "Center Longitude (optional)",
                        "minimum": -180,
                        "maximum": 180,
                        "type": "number",
                        "description": "Longitude of a single custom center point. Use with Center Latitude and Search Radius."
                    },
                    "radius": {
                        "title": "Search Radius (nautical miles)",
                        "minimum": 10,
                        "maximum": 250,
                        "type": "integer",
                        "description": "Radius in nautical miles around each grid center (or custom center). Default 100nm. Max ~250nm before responses get too large.",
                        "default": 100
                    },
                    "proxy": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Apify proxy settings. Defaults to Apify Proxy (AUTO). The adsb.lol API is open, so a direct connection is used automatically as a fallback if the proxy fails.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
