Obscura

Flight Activity

Aircraft positions and flights from the OpenSky network of ADS-B receivers.

flight_activity — the dataset name to pass to the Obscura API.

Category Physical Columns 7 Refresh Every 6 hours Point-in-time available_date

What one row means

One point-in-time aircraft-count snapshot for one configured bounding-box region (USA or Europe), taken by polling OpenSky Network's keyless `states/all` API: the total number of aircraft state vectors currently visible, split into airborne vs on-ground, as of the instant OpenSky's server computed that states-of-the-world response.

One row per (region, event_time).

Point-in-time availability

Every Obscura dataset carries available_date: the calendar day the publisher made the row available, day-of, with no session rounding. It is the one column a backtest filters on, and it means the same thing on every dataset in the catalog.

For flight_activity: snapshot: available_date = captured_date, a STORED GENERATED column (migration 000205). WHY THAT IS THE DAY IT BECAME AVAILABLE: OpenSky's keyless states/all serves CURRENT state only — it answers 403 'Authenticate to get historical data' for any past time= — so there is no archive and no dissemination event to be early or late against. This series exists only because it was captured, and the day it was captured is the day it was obtainable. captured_date replaced a generated `(event_time AT TIME ZONE 'UTC')::date`: substantively the same day (event_time is OpenSky's server-side instant for the response we polled) but unnameable as a capture day, which is how `Availability::Snapshot` came to cover six different expressions. Existing rows were backfilled from exactly that expression, so no stored value moved.

Refresh cadence

Obscura refreshes flight_activity every 6 hours — the most frequent scheduled job that re-collects or re-exports it. This is Obscura's own pipeline cadence, not the upstream publisher's release schedule; when a row became public is recorded per row in available_date.

Schema — 7 columns

The full public column list for flight_activity, with the meaning of every field. The same schema is served unauthenticated at https://api.obscura.trade/v1/catalog/flight_activity.

ColumnTypeDescription
regiontext · not nullConfigured region label from OpenSkyArgs.regions (e.g. "USA", "Europe"), naming the fixed lat/lon bounding box the states/all query was scoped to. Part of the composite primary key alongside event_time.
event_timetimestamp with time zone · not nullOpenSky's own server-side snapshot instant for this states/all response, taken verbatim from the JSON `time` field — the moment OpenSky computed the set of visible aircraft, not our request/receive time. Source of available_date's date-part.
aircraft_totalbigint · not nullCount of aircraft state vectors returned in the `states` array of the states/all response for this region's bounding box at event_time; 0 when the API returns a null/empty states array. Equals airborne + on_ground by construction.
airbornebigint · not nullaircraft_total minus on_ground — the count of state vectors whose on_ground flag was false or absent. An economic-activity proxy: active flight volume over the region at the snapshot instant.
on_groundbigint · not nullCount of state vectors in the response whose on_ground boolean flag is true — aircraft OpenSky's ADS-B/Mode-S receivers see as stationary/taxiing on an airport surface within the bounding box.
captured_datedate · not nullThe UTC calendar day the collector POLLED states/all for this region — the date-part of the response's own instant on a live run, the bronze object's capture day on a replay. available_date is generated directly from it: OpenSky serves no history, so the day we asked is the only day this aircraft count could have been obtained.
available_datedatePUBLIC-availability date = captured_date. STORED generated column, read-only — the calendar day OpenSky served this states/all response to us. Since the response is itself the only artifact and there is no archive to fetch a past day from, that IS the day it became available.

Access flight_activity

Two delivery paths, one identifier. Both require an Obscura account and an active subscription; the catalog entry and the schema above are public.

import obscura

client = obscura.Client("obs_live_…")

df = client.query(
    dataset="flight_activity",
    start="2024-01-01",
)

Create a free account Browse all 95 datasets

Frequently asked questions

What is in the flight_activity dataset?

Aircraft positions and flights from the OpenSky network of ADS-B receivers. One point-in-time aircraft-count snapshot for one configured bounding-box region (USA or Europe), taken by polling OpenSky Network's keyless `states/all` API: the total number of aircraft state vectors currently visible, split into airborne vs on-ground, as of the instant OpenSky's server computed that states-of-the-world response.

How do I avoid look-ahead bias with flight_activity?

Filter on flight_activity.available_date, the day the publisher made the row public. For this dataset that date is derived as follows — snapshot: available_date = captured_date, a STORED GENERATED column (migration 000205). WHY THAT IS THE DAY IT BECAME AVAILABLE: OpenSky's keyless states/all serves CURRENT state only — it answers 403 'Authenticate to get historical data' for any past time= — so there is no archive and no dissemination event to be early or late against. This series exists only because it was captured, and the day it was captured is the day it was obtainable. captured_date replaced a generated `(event_time AT TIME ZONE 'UTC')::date`: substantively the same day (event_time is OpenSky's server-side instant for the response we polled) but unnameable as a capture day, which is how `Availability::Snapshot` came to cover six different expressions. Existing rows were backfilled from exactly that expression, so no stored value moved. A query of the form WHERE available_date <= '<as-of date>' never sees a row before it existed.

In what formats can I get flight_activity?

As a Parquet bulk export (POST https://api.obscura.trade/v1/download) or as JSON from the typed query API (POST https://api.obscura.trade/v1/query), both with dataset="flight_activity". The column schema is public at https://api.obscura.trade/v1/catalog/flight_activity.

How often is flight_activity updated?

Obscura refreshes flight_activity on a every 6 hours schedule — that is the most frequent scheduled job that re-collects or re-exports the table. It is Obscura's own pipeline cadence, not the upstream publisher's release schedule; when the publisher makes a row available is described by the availability rule above, and is recorded per row in available_date.

Related datasets

NWS AlertsActive weather alerts and warnings from the U.S. National Weather Service. USGS EarthquakesEarthquakes worldwide with location, depth and magnitude, from the USGS. Weather DailyDaily weather by city worldwide from Open-Meteo: temperature, precipitation, wind and more. Weather HourlyHourly weather by city worldwide from Open-Meteo.