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.
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, strait-of-hormuz, gulf-of-finland, india-pakistan-border, taiwan-strait, south-china-sea, 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, osm, osm-dark | 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. osm is OpenStreetMap, served by OpenFreeMap: the style to use on air and in print, free to publish with its credit. osm-dark is the same map in dark colours, with the same credit. |
lang | auto, en, no, uk, pl, tr, es, fr, de, ar, zh, he, ru, ja, fi | 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.
Some region charts mark sourced events with numbered badges: up to three on the 30- and 90-day views, five on the last year and two long-term shifts on all days, plus any event at the chart's highest point. The series carries them as events, each with its date, category, label, source and the views that mark it. A marker means an event happened around a change, not that it caused it.
Bulk data
To download many days at once, such as a month, a year or every saved day, use the downloads page instead of requesting them 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% and r from 10%, each with at least 2 affected aircraft (1 affected aircraft is always g), 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). Requests from other sites and scripts are limited to 120 a minute from one address; past that the API answers 429 with a Retry-After header. 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 13 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.
