archive.spots.radio

PSK Reporter and WSPR spot archive

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.

streamcontentscoveragerowssize
pskrPSK Reporter spots, 95% FT82018-11-01 onward, with gaps111.7 bn836 GB
wsprWSPR beacon reports2008-03-11 onward, continuous12.5 bn72 GB

Query it where it sits

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.

What is where

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.

Before you count anything

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.

Where the data comes from

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.