Embed the map
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.
Source: GPSInterference.com, https://gpsinterference.com/docs. Free to reuse with this credit and a link.
Embedding the map
The live map is free to embed. It suits news sites, research projects, blogs and course pages that want a live, citable map without having to build one.
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>Use the builder below and copy the code, or add the options by hand.
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, south-southeast-asia, western-europe, balkans, oceania, africa, americas, finland, estonia, latvia, lithuania, kaliningrad, poland, norway, romania, turkey, cyprus, israel, lebanon, south-korea, north-korea, japan, china, taiwan, philippines, vietnam, south-africa, morocco, algeria, kenya, senegal, tunisia, botswana, india, pakistan, myanmar, thailand, cambodia, malaysia, singapore, indonesia, 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, austria, russia, persian-gulf, united-states, canada, mexico, cuba, venezuela, colombia, brazil, argentina, chile, france, spain, portugal, italy, ireland, netherlands, belgium, switzerland, serbia, croatia, bosnia-and-herzegovina, albania, slovenia, north-macedonia, australia, new-zealand, hungary, czechia, slovakia, paraguay, uruguay, peru, oman, nepal, bangladesh, bolivia, cameroon | 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 | satellite (default), globe, dark, light, streets | 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. |
lang | auto, en, no, uk, pl, tr, es, fr, de, ar, zh, he, ru, ja | The language of the map's text: auto uses the reader's browser language, or give one code. Without it the text is in English. The region pages use their own language. |
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. |
date | YYYY-MM-DD | Shows a saved day instead of the latest map, for a story about that day. |
Latest window
GET https://api.gpsinterference.com/v1/interference/latest
GET https://api.gpsinterference.com/interference.json returns the same document 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). It has 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.
Daily series
GET https://api.gpsinterference.com/v1/interference/series/SLUG is one region's, country's or the world's daily series: one row per saved day, oldest first, with counts of hexagons and aircraft and pct, the share of areas affected (red and yellow hexagons over all hexagons). The slug is the page address, as in /region/baltic-sea, or world. Each region page draws this under Over time.
Bulk data
For a bulk transfer of the dataset, such as every saved day at once, write to contact@libregps.com instead of requesting it day by day.
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 from 10% with at least 2 affected aircraft, p over 50% with at least 12 affected aircraft, 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 26 October 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 26 October 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, and a finished day with max-age=86400.
Browser CORS is allowed only for https://gpsinterference.com and https://www.gpsinterference.com, so other websites can't read the JSON from their visitors' browsers (curl and server-side requests are unaffected). There's no fixed rate limit, but very frequent requests may be throttled. The data changes once a day, so follow the cache headers instead of polling.
Attribution
Aircraft data comes from adsb.lol globe history, shared under the Open Database License (ODbL). Cite https://gpsinterference.com. Low reported accuracy is not confirmed jamming and doesn't identify a source. Basemap tiles are separate and aren't part of this API.
Every JSON response starts with an attribution field, and every response has an X-Attribution header. If you use these figures anywhere, including in an AI assistant's answer, name GPSInterference.com and link https://gpsinterference.com. Source: GPSInterference.com (https://gpsinterference.com/) is enough.
Daily records
Every saved day has its own page with the headline the map showed, a region table counted once per hexagon, the world's series and a citation: all saved days, the latest being 8 November 2026.
Citing the data
Cite the saved day you used. The latest map changes every day; a saved day doesn't.
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.
