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
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.
Makes a free key on the spot: {"api_key": "…", "limit": "13000 requests / 10s"}.
What your key has used. The key itself is the password.
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}.
Deletes your key for good.
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"
}
| Field | Type | Meaning |
|---|---|---|
id | string | The sonde's serial number. For NOAA readings, the weather station's id (for example GMM00010393). |
time, tsunix | string, number | When it was measured, in UTC. |
temp | number | Air temperature in °C. Readings below 0 °C are left out. |
alt | number | Height in metres. For a balloon, where the sensor was. For NOAA, the station's height. |
pressure, humidity | number or null | hPa and percent. Some sources do not report them. |
lat, lon | number | Position in degrees. |
source | array | The 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
Live radiosonde telemetry from a volunteer receiver network, mostly in central Europe. Updated every minute. source is the sonde type, such as ["RS41"].
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
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.
| Setting | What it does |
|---|---|
min_lat max_lat min_lon max_lon | Only readings inside this box. |
max_age_hours | Only readings newer than this. |
limit_results | At most this many readings. |
dedupe_by_station | One reading per sonde or station: the newest. |
temp_/humidity_/pressure_/altitude_ min_threshold, max_threshold | Drop readings outside a range. |
…_decimal_places, temp_round_to_integer | Round the numbers. |
temp_convert_units | Temperatures in °F instead of °C. |
…_hide_if_null, strip_null_fields | Skip readings or fields that are missing. |
sort_by_time_desc, pretty_print, include_metadata | Order 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}'