Chmi APIhydro.chmi.cz ↗
Access real-time water levels, flow rates, temperatures, and flood alerts for 562+ Czech river stations via the hydro.chmi.cz API.
What is the Chmi API?
This API exposes hydrological monitoring data from 562+ Czech river gauging stations operated by the Czech Hydrometeorological Institute (CHMI). Three endpoints cover station listing, detailed per-station measurements, and name/river/region search. The get_station_detail endpoint returns time-series water height, flow rate, and temperature alongside SPA flood alert thresholds and, for category A stations, forecast data.
curl -X GET 'https://api.parse.bot/scraper/15cf20c7-b5f9-4478-b30f-590ae117ed50/get_stations?page=all' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace hydro-chmi-cz-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
from parse_apis.czech_hydrometeorological_institute_chmi_water_monitoring_api import CHMI, Page, StationSummary, Station
chmi = CHMI()
# List first page of stations using the Page enum
stations = chmi.stationsummaries.list(page=Page.PAGE_1)
for station in stations:
print(station.station_name, station.river, station.water_height_cm, station.status)
# Search for stations on a specific river
results = chmi.stationsummaries.search(query="Vltava")
for station in results:
print(station.station_id, station.station_name, station.flow_rate_m3s)
# Get detailed data for a station by navigating from a summary
first = next(iter(results))
detail = first.details()
print(detail.metadata.station_name, detail.metadata.river, detail.metadata.region)
for measurement in detail.measured_data:
print(measurement.datetime, measurement.water_height_cm, measurement.flow_rate_m3s)
for alert in detail.spa_limits:
print(alert.level, alert.value)
List monitoring stations with their current measurements. Returns station metadata, current water level, flow rate, status, and tendency. Supports pagination (50 per page) or retrieving all stations at once. Pagination via integer page numbers (1-12); 'all' returns the full station list in one call.
| Param | Type | Description |
|---|---|---|
| page | string | Page number (1-12) or 'all' for all stations. Each page has ~50 stations. |
{
"type": "object",
"fields": {
"stations": "array of station objects with station_id, station_name, river, category, region, status, spa_limits, last_measurement_time, water_height_cm, flow_rate_m3s, tendency",
"total_stations": "integer count of stations returned"
},
"sample": {
"data": {
"stations": [
{
"river": "Labe",
"region": "Královéhradecký kraj",
"status": "Normální stav",
"category": "B",
"tendency": "Tendence : Setrvalý stav",
"spa_limits": "165 / 200 / 220 [cm]",
"station_id": "307053",
"station_name": "Špindlerův Mlýn",
"flow_rate_m3s": "0.547",
"water_height_cm": "90",
"last_measurement_time": "10. 06. 22:10"
}
],
"total_stations": 50
},
"status": "success"
}
}About the Chmi API
Station Listing and Search
The get_stations endpoint returns up to 50 stations per page (pages 1–12) or all stations at once using page=all. Each station object includes station_id, station_name, river, category, region, status, spa_limits, last_measurement_time, and current water level and flow readings. The search_stations endpoint accepts a free-text query and performs case-insensitive substring matching across station names, river names, and region names — useful for filtering to a specific basin such as Labe or Vltava, or a municipality like Praha.
Station Detail and Time Series
The get_station_detail endpoint takes a station_id (obtained from get_stations) and returns several structured sections. The metadata object includes station_name, river, category, elevation, region, current_status, tendency, classification, basin_code, and municipality. The measured_data array provides timestamped readings of water_height_cm, flow_rate_m3s, temperature_celsius, and status. Note that temperature data is not available at all stations. The graph_time_series object gives the full historical series with millisecond timestamps alongside date strings, water height, and flow rate.
Flood Alerts and Forecasts
Each station exposes spa_limits — an array of flood alert level objects mapping SPA levels to threshold values in centimetres. For category A stations only, a forecast_data array is also returned with predicted datetime, water_height_cm, and flow_rate_m3s. Non-category-A stations return an empty forecast array. Station tendency (rising, falling, stable) is surfaced in both the listing and the detail metadata, which makes it straightforward to build alerting logic on top of the current status fields.
The Chmi API is a managed, monitored endpoint for hydro.chmi.cz — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when hydro.chmi.cz changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official hydro.chmi.cz API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Track live water levels at upstream stations to give downstream operators early flood warning using
spa_limitsthresholds - Aggregate current
flow_rate_m3sreadings across all Vltava basin stations for hydropower or irrigation dashboards - Monitor
tendencyfields fromget_stationsto detect rapidly rising rivers across multiple regions in a single poll - Pull
temperature_celsiustime series fromget_station_detailfor ecological or fisheries research on specific rivers - Use
forecast_datafrom category A stations to display short-term water height predictions in a public flood-awareness app - Search stations by municipality name via
search_stationsto build location-specific water condition widgets - Compare
measured_datahistorical series across stations to analyze the hydrological impact of rainfall events
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does the Czech Hydrometeorological Institute provide an official developer API?+
What does `get_station_detail` return that `get_stations` does not?+
get_stations endpoint returns a current snapshot per station. get_station_detail adds the full measured_data time series (multiple timestamped rows of water height, flow rate, temperature, and status), the graph_time_series object with millisecond-precision timestamps, SPA flood alert thresholds in the spa_limits array, and forecast_data for category A stations.Is temperature data available for every station?+
temperature_celsius within measured_data vary by station — many stations do not instrument water temperature, so that field will be absent or null for those locations. The station category and metadata do not explicitly flag which stations record temperature, so you need to check the data in practice.Does the API cover precipitation, groundwater, or water quality data?+
How is pagination handled, and what is the total station count?+
get_stations endpoint returns approximately 50 stations per page across pages 1–12, covering 562+ stations in total. Pass page=all to retrieve every station in a single response. The total_stations field in the response confirms the count returned by each call.