Read the data

Last updated

The public API returns the hexagons the map draws, for the latest update or a saved day, without raw aircraft positions. The full schema is in OpenAPI 3.1.

Latest window

GET https://api.gpsinterference.com/v1/interference/latest

GET https://api.gpsinterference.com/interference.json is the same document, which the map uses. It holds one UTC day of flights, history_date, and is rebuilt once a day at about 05:00 UTC.

One UTC day

GET https://api.gpsinterference.com/v1/interference/YYYY-MM-DD

The map as it stood at that UTC day's last update (not a count of only that date's flights), with the same fields as the latest summary plus archive_date and complete. complete is false while the day is still today and may be replaced; a finished day never changes. A date with no saved map returns 404 and {"error":"no archive"}.

GET https://api.gpsinterference.com/v1/interference/days lists every saved day: date, updated and hexes (a count), without polygons.

Hexagon fields

FieldMeaning
hCell id, column_row on the Web Mercator hexagon grid.
gDistinct aircraft in the cell whose NACp stayed above 7.
bDistinct aircraft that reported NACp 7 or lower at least once in the cell.
pShare affected, in percent, to one decimal place: 100 × b ÷ (g + b). The colour is taken from this.
cg under 3%, y from 3% to 10%, r over 10%, taken from the rounded p.
polyRing of [latitude, longitude] pairs, in degrees.

Cells are flat-topped hexagons on the Web Mercator grid with a 0.34° longitude radius (about 38 km centre to corner at the equator, 22 km at 54°N). Cells with fewer than 3 aircraft are left out.

bands (summaries from November 2026 on) splits the same counts by barometric altitude: edges_ft is [5000, 15000, 30000] and hexes holds four lists, for below 5,000 ft, 5,000–15,000 ft, 15,000–30,000 ft and above 30,000 ft. Each entry is { h, g, b }, with the polygon and share taken from the hexagon of the same h in the main list (p = 100 × b ÷ (g + b), the same cut-offs for c). A band leaves out cells with fewer than 3 aircraft in that band. An aircraft that changes band inside a cell is counted in each, so the four bands do not add up to the main counts; aircraft on the ground or with no altitude are only in the main counts.

Top-level fields: history_date is the UTC day the flights were on; updated is when the summary was written (UTC); grid is mercator-r0.34; window_minutes is 1440, one day; sources is adsb.lol-globe-history plus the adsb.lol release it was built from, such as adsb.lol-prod-0. Summaries saved before November 2026 may lack history_date and carry polled_points, grid_points and failed_points from the old live collection.

Caching, CORS and limits

The latest summary, today's saved day and the date index are sent with cache-control: public, max-age=60. A finished day is sent with max-age=86400.

Browser CORS is allowed only for https://gpsinterference.com and https://www.gpsinterference.com, so another website cannot read the JSON from its visitors' browsers; curl and server-side requests are unaffected. There is no fixed rate limit, but very frequent requests may be throttled. The data changes once a day, so follow the cache headers rather than polling.

Attribution

Aircraft data from adsb.lol globe history, shared under the Open Database License (ODbL). Cite https://gpsinterference.com. Low reported accuracy is not confirmed jamming and does not identify a source. Basemap tiles are separate and are not part of this API.

Citing the data

Cite the saved day you used: the latest map changes every day, but a saved day does not.

APA

GPSInterference.com. (2026). GPS interference hexagon data [Data set]. https://gpsinterference.com/docs

One saved day:

GPSInterference.com. (2026). GPS interference hexagon data, 25 October 2026 [Data set]. https://api.gpsinterference.com/v1/interference/2026-10-25

BibTeX

@dataset{gpsinterference_2026,
  author       = {{GPSInterference.com}},
  title        = {GPS Interference Hexagon Data},
  year         = {2026},
  publisher    = {GPSInterference.com},
  url          = {https://gpsinterference.com/docs},
  note         = {Built from ADS-B flight tracks from adsb.lol globe history, available under the Open Database License (ODbL). Low reported accuracy (NACp 7 or lower) is not confirmed jamming. For one UTC day, use https://api.gpsinterference.com/v1/interference/YYYY-MM-DD}
}

Examples

curl -sS "https://api.gpsinterference.com/v1/interference/latest"
curl -sS "https://api.gpsinterference.com/v1/interference/2026-10-25"

In JavaScript, on this site or a server:

const res = await fetch("https://api.gpsinterference.com/v1/interference/latest");
if (!res.ok) throw new Error(String(res.status));
const data = await res.json();
// data.hexes[i] is { h, g, b, p, c, poly }

The methodology explains how the counts are made.

Embedding the map

The live map is free to embed. Paste this where it should appear:

<iframe src="https://gpsinterference.com/embed" width="640" height="400"
        style="border:0;width:100%;max-width:960px" loading="lazy"
        title="Live GPS interference map"></iframe>
<p>Live map: <a href="https://gpsinterference.com/">GPS Interference</a></p>

Set it up below and copy the code, or add the options yourself.

Options

Add any of these to https://gpsinterference.com/embed, joined with &:

OptionValuesWhat it does
regionbaltic-sea, eastern-europe, black-sea, eastern-mediterranean, middle-east, east-asia, finland, estonia, latvia, lithuania, kaliningrad, poland, norway, romania, turkey, cyprus, israel, lebanon, south-korea, sweden, denmark, germany, iceland, united-kingdom, ukraine, belarus, moldova, bulgaria, georgia, armenia, azerbaijan, greece, egypt, iran, iraq, syria, jordan, saudi-arabia, united-arab-emirates, qatarOpens on that region, fitted to the size of the frame.
bboxsouth,west,north,eastOpens on any area, in degrees, for example bbox=30,-120,40,-105.
lat, lon, zoomnumbersOpens on a centre and zoom instead of an area.
lock1Keeps readers inside the area: they can pan and zoom within it, but not away from it.
styledark (default), light, streets, satelliteThe map the hexagons sit on: dark, a clean light map for white pages, streets, or satellite with borders and place names. Maps by MapTiler.
nameson, off (default)Place names on the map.
altall (default), low, mid, high, cruiseShows only aircraft in one altitude band: below 5,000 ft, 5,000–15,000 ft, 15,000–30,000 ft or above 30,000 ft (barometric). Days saved before altitudes were recorded show all aircraft.
controlsonShows the style, names and altitude switches, so readers can change them.
dateYYYY-MM-DDShows a saved day instead of the latest map, for a story about that day.