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
| Field | Meaning |
|---|---|
h | Cell id, column_row on the Web Mercator hexagon grid. |
g | Distinct aircraft in the cell whose NACp stayed above 7. |
b | Distinct aircraft that reported NACp 7 or lower at least once in the cell. |
p | Share affected, in percent, to one decimal place: 100 × b ÷ (g + b). The colour is taken from this. |
c | g under 3%, y from 3% to 10%, r over 10%, taken from the rounded p. |
poly | Ring 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/docsOne saved day:
GPSInterference.com. (2026). GPS interference hexagon data, 25 October 2026 [Data set]. https://api.gpsinterference.com/v1/interference/2026-10-25BibTeX
@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 &:
| Option | Values | What it does |
|---|---|---|
region | baltic-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, qatar | Opens on that region, fitted to the size of the frame. |
bbox | south,west,north,east | Opens on any area, in degrees, for example bbox=30,-120,40,-105. |
lat, lon, zoom | numbers | Opens on a centre and zoom instead of an area. |
lock | 1 | Keeps readers inside the area: they can pan and zoom within it, but not away from it. |
style | dark (default), light, streets, satellite | The map the hexagons sit on: dark, a clean light map for white pages, streets, or satellite with borders and place names. Maps by MapTiler. |
names | on, off (default) | Place names on the map. |
alt | all (default), low, mid, high, cruise | Shows 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. |
controls | on | Shows the style, names and altitude switches, so readers can change them. |
date | YYYY-MM-DD | Shows a saved day instead of the latest map, for a story about that day. |