GROUNDCHECK

API

Real weather-balloon measurements from around the world, free and read-only. No sign-up needed. An optional free key raises the limit a lot. Back to the weather app.

Quick start

curl {BASE}/api/data

That returns every recent ground-level reading as JSON, newest first. Without a key you get 30 requests per 60 seconds per address.

Get a free key (13,000 requests per 10 seconds)

curl -X POST {BASE}/api/keys/new

Prefer a button to a command? Get a key on this page.

curl {BASE}/api/data -H "X-API-Key: YOUR_KEY"
curl "{BASE}/api/data?key=YOUR_KEY"

Right now

Load the live numbers from the API. It counts as one request.

Endpoints

GET/api/data

All current ground-level readings, newest first. Only temperatures at or above 0 °C and sensor heights up to about 980 m are included. With a key, your key's settings filter and reshape the answer.

POST/api/keys/new

Makes a free key on the spot: {"api_key": "…", "limit": "13000 requests / 10s"}.

GET/api/keys/KEY/stats

What your key has used. The key itself is the password.

POST/api/keys/KEY/settings

Changes the settings of your key, for example {"label":"mine","min_lat":47,"max_lat":55.1,"max_age_hours":48}. Also pauses or resumes it with {"paused": true}.

POST/api/keys/KEY/revoke

Deletes your key for good.

GET/api/keys/settings/schema

The list of all 30 settings with their types and defaults.

Limits and errors

Over the limit you get 429 with a Retry-After header. A paused key gets 403. A key that does not exist is treated like no key at all, so you get the lower limit. Everything is GET or POST JSON, and any website may call it (CORS is open).

What a reading looks like

{
  "id": "Y0943402",                 // sonde serial, or the weather station for NOAA readings
  "time": "2026-10-12T14:08:28Z",   // UTC
  "tsunix": 1791814108,             // the same time in Unix seconds
  "temp": 12.7,                     // degrees C, never below 0
  "alt": 474.9,                     // metres above sea level
  "pressure": 959.8,                // hPa, or null
  "humidity": 90,                   // percent, or null
  "lat": 51.772308,
  "lon": 9.25355,
  "source": ["RS41", "SondeHub"]    // see "Where the readings come from"
}
FieldTypeMeaning
idstringThe sonde's serial number. For NOAA readings, the weather station's id (for example GMM00010393).
time, tsunixstring, numberWhen it was measured, in UTC.
tempnumberAir temperature in °C. Readings below 0 °C are left out.
altnumberHeight in metres. For a balloon, where the sensor was. For NOAA, the station's height.
pressure, humiditynumber or nullhPa and percent. Some sources do not report them.
lat, lonnumberPosition in degrees.
sourcearrayThe instrument or the archive it came from. The last entry names the network: SondeHub or IGRA. Readings with only an instrument name come from the live sonde.mine.nu feed.

Where the readings come from

sonde.mine.nu / zeesen.mine.nu

Live radiosonde telemetry from a volunteer receiver network, mostly in central Europe. Updated every minute. source is the sonde type, such as ["RS41"].

SondeHub

An open worldwide database of radiosonde telemetry. Groundcheck keeps the ground-level frame of each sonde every 5 hours, so it covers many more countries, with a delay of about 5 hours. source ends with "SondeHub". Thank you to the volunteers who run the receivers. sondehub.org

NOAA IGRA

The Integrated Global Radiosonde Archive: the official soundings of about 650 weather-service stations in more than 100 countries, one reading per station per day (the sounding nearest 12:00 UTC). Public domain, from NOAA NCEI. Each station is refreshed about once a week, so readings can be up to a week late. source is ["IGRA"]. NOAA IGRA

If you use the data, please credit sonde.mine.nu, SondeHub and NOAA NCEI.

Key settings

These apply only to requests that carry your key. Every setting is optional. GET /api/keys/settings/schema lists them all.

SettingWhat it does
min_lat max_lat min_lon max_lonOnly readings inside this box.
max_age_hoursOnly readings newer than this.
limit_resultsAt most this many readings.
dedupe_by_stationOne reading per sonde or station: the newest.
temp_/humidity_/pressure_/altitude_ min_threshold, max_thresholdDrop readings outside a range.
…_decimal_places, temp_round_to_integerRound the numbers.
temp_convert_unitsTemperatures in °F instead of °C.
…_hide_if_null, strip_null_fieldsSkip readings or fields that are missing.
sort_by_time_desc, pretty_print, include_metadataOrder and layout of the answer.

Example: Europe only, last 24 hours, one reading per station

curl -X POST {BASE}/api/keys/YOUR_KEY/settings \
  -d '{"min_lat":35,"max_lat":72,"min_lon":-12,"max_lon":45,"max_age_hours":24,"dedupe_by_station":true}'