archive.spots.radio
Amateur radio reception reports: one station hears another and reports it, and each report is one row. About 124 billion rows, published as Parquet files on plain HTTPS URLs. Free, public, no registration, no API key.
2008-03-11 22:02Z 30m K1JT (FN20qi) heard by WD4KPD -21 dB
The oldest full day in the archive: the first day of WSPR, thirteen rows, Joe Taylor K1JT among the senders. Everything since is here too.
| stream | contents | coverage | rows | size |
|---|---|---|---|---|
| pskr | PSK Reporter spots, 95% FT8 | 2018-11-01 onward, with gaps | 111.7 bn | 836 GB |
| wspr | WSPR beacon reports | 2008-03-11 onward, continuous | 12.5 bn | 72 GB |
Any tool that reads Parquet over HTTP works. With DuckDB, a day is just a URL, and only the needed byte ranges are fetched, so this reads a small slice of a 476 MB file and returns in seconds:
SELECT mode, count(*) AS spots, median(snr_db) AS median_snr
FROM read_parquet('https://archive.spots.radio/pskr/daily/day=2026-09-01/spots.parquet')
WHERE band = '6m'
GROUP BY mode ORDER BY spots DESC LIMIT 5;
FT8 13785 -14.0 WSPR 969 -20.0 MSK144 538 2.0 FT4 533 -18.0 Q65 286 -21.0
Run on 2026-09-04; the output above is what it returned. Every example in these pages is run before it is published.
Rows are sorted by band, then sender callsign, then time, so a band-filtered query only reads the row groups holding that band. For questions spanning months or years, the rollups answer from one small file instead of thousands of daily ones.
pskr/daily/day=YYYY-MM-DD/spots.parquet one file per UTC day wspr/daily/day=YYYY-MM-DD/spots.parquet one file per UTC day rollups/band_hour/<stream>/all.parquet whole archive by hour, band, mode rollups/station_day/<stream>/... whole archive by callsign and day integrity/<stream>/day=YYYY-MM-DD/day.json per-day accounting manifest/pskr.json, manifest/wspr.json which days exist
There is no directory listing; the manifest is how you discover days. Note that a listed day is not always a day with data: 127 pskr days in 2025 and early 2026 have a valid but empty file, because the only source covering that period has nothing for them. The README documents the schema of every file, which columns exist in which era, the coverage gaps, and verified query patterns for multi-day and whole-archive work.
Spot counts are not comparable across years. PSK Reporter has at times limited how often the same path could be re-reported, and the limit changed: measured reports per active path per hour ran about 1.6 to the end of 2020, about 1.24 from January 2021, about 6.2 from April 2023, and about 1.24 again from 2024-12-26. A rise or cliff in spot volume across those dates is reporting policy, not propagation. Normalise by paths, or count distinct stations, or stay within one era. The README shows how, and lists the other caveats: derived locators and country codes, per-era schema differences, and the exact coverage gaps.
This archive repackages other people's work. The pskr stream is data from PSK Reporter, created and run by Philip Gladstone, published here with his agreement; the 2018-2019 and 2021-2024 spans reached us through HamSCI at the University of Scranton (Zenodo record 13362701 and the CEDAR Madrigal database, collected under NASA grant 80NSSC21K1772 and subject to the CEDAR Rules of the Road), and the 2024-2026 span through wsprdaemon. The wspr stream originates from WSPRnet and was largely copied from wspr.live. Credit them in anything you build from this.