API v1 · OpenAPI 3.1
Donaupegel-API und offene Daten
Kostenlose JSON-API für Donaupegel: Messstellen mit LDC/HDC-Schwellen, Tagesreihen, GeoJSON und ein OpenAPI-3.1-Vertrag, mit Limits und Codebeispielen.
- Basis-URL
- https://danubealert.arcm.ro/api/v1
- Authentifizierung
- Authorization: Bearer <key>
Überblick
Die öffentliche v1-API liefert die hydrologischen Daten des Donaueinzugsgebiets als JSON: Pegel mit LDC/HDC-Schwellen, Messwerte und Prognosen, amtliche Schwellenwerte, kritische Stellen der Schifffahrt, hydrologische Berichte, GeoJSON und den Status der Quellen. Der vollständige Vertrag: /api/v1/openapi.json (OpenAPI 3.1).
Tarife und Limits
Anonym (ohne Header): 60 Anfragen pro Minute, CORS * auf GET. Mit Integrator-Schlüssel (Authorization: Bearer <Schlüssel>): 600 Anfragen pro Minute. Schlüssel erstellen Sie kostenlos in Ihrem Konto. Ein fehlerhafter, unbekannter oder widerrufener Schlüssel erhält 401 (WWW-Authenticate: Bearer error="invalid_token") statt anonymen Zugriffs; ein widerrufener Schlüssel funktioniert sofort nicht mehr.
Anonym
60Anfragen / Minute
Ohne Header, CORS * auf GET — genug, um jede Route zu testen.
Kostenloser API-Schlüssel
600Anfragen / Minute
Authorization: Bearer <Schlüssel>, im Konto erstellt, nur einmal angezeigt.
Schwere Routen
10Anfragen / Minute
Zeitreihen und Exporte ( observations, export ), pro Schlüssel oder IP.
Beispiel
Der letzte Tageswert eines Pegels, mit curl und mit TypeScript.
curl -sS "https://danubealert.arcm.ro/api/v1/stations/budapest/observations"// Der heutige Wasserstand in Budapest
const r = await fetch('https://danubealert.arcm.ro/api/v1/stations/budapest/observations?interval=daily&from=2026-10-01', {
headers: { Authorization: `Bearer ${process.env.DANUBEALERT_KEY}` },
})
const { data } = await r.json()
console.log(data.at(-1)) // { observed_at: "2026-10-21T00:00:00Z", level_cm: 468 }Endpunkte
Alle Routen der öffentlichen API v1, nur lesend ( GET ), mit Parametern und einer ausführbaren Anfrage.
Beispiele je Route
Jede Route hat unten eine ausführbare curl-, JavaScript- und Python-Anfrage, ihr Ratenlimit und den `_attribution`-Block, den du anzeigen musst.
{
"source": "National hydrological services of the Danube basin (see /v1/meta/sources)",
"url": "https://danubealert.arcm.ro/en/about",
"data_updated_at": "2026-10-21T00:00:00Z"
}{
"source": "National hydrological services of the Danube basin (see /v1/meta/sources)",
"url": "https://danubealert.arcm.ro/en/about",
"license": {
"id": "CC-BY-4.0",
"name": "Creative Commons Attribution 4.0 International",
"url": "https://creativecommons.org/licenses/by/4.0/"
},
"data_updated_at": "2026-10-21T00:00:00Z"
}Pegel
GET
/api/v1/alerts/confirmDer per E-Mail verschickte Bestätigungslink einer Warnung oder eines Tagesberichts: Er schaltet nichts ein, sondern öffnet die BestätigungsseiteDer Link in der Bestätigungs-E-Mail einer Warnung oder eines Tagesberichts, verschickt, solange das Konto seine Adresse noch nicht nachgewiesen hat. **Er schaltet nichts ein** ( Link-Scanner von Firmen öffnen E-Mails von selbst ): Der Browser wird auf die öffentliche Seite `/{lang}/alerts/confirm` geführt, mit einer einzigen Schaltfläche, die `POST /alerts/confirm` ausführt. Mit `format=json` ( oder `Accept: application/json` ) wird nur der Zustand zurückgegeben: 200 mit `status` `pending` / `active`, 404 für ein ungültiges Token.
Parameter
- t*query
- formatquery
curl curl -sS "https://danubealert.arcm.ro/api/v1/alerts/confirm?t=t"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/alerts/confirm?t=t') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/alerts/confirm?t=t", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
POST
/api/v1/alerts/confirmSchaltet die Warnung oder den Tagesbericht auf der Bestätigungsseite ein ( der einzige Schritt, der sie aktiviert )Der einzige Schritt, der das Abonnement einschaltet ( `activ = true` ): die Schaltfläche der Bestätigungsseite oder ein Client, mit dem Token in der Query ( `t` ) oder im Rumpf ( `{ "t": "…" }` ). Nur ein noch wartendes Abonnement startet; eines, das inzwischen im Konto ausgeschaltet wurde, bleibt aus. Hier wird auch die Adresse des Kontos nachgewiesen. Der Browser wird auf die öffentliche Seite des Abonnements geführt ( „eingeschaltet“ ), ein Client erhält JSON ( `kind`: `alert` / `report` ).
Parameter
- tquery
GET
/api/v1/basin-precipitationNiederschlagssumme über 24 / 72 h je Teileinzugsgebiet, der Messstelle flussab zugeordnetDer Regen der letzten abgeschlossenen 24 h und 72 h, je Teileinzugsgebiet: der Berechnungspunkt ist eine Messstelle am Oberlauf, und die Zeile ist mit der Messstelle flussab verknüpft — das Vorläufersignal eines Wasserstandsanstiegs dort. Die Stundenreihe stammt aus einer offenen Wetterquelle ( CC BY 4.0, siehe `_attribution` ); `window_end` ist der Zeitpunkt, bis zu dem die Stunden summiert sind ( exklusiv ), und `hours_24h` / `hours_72h` sagen, wie viele Stunden mit Wert in jedes Fenster eingegangen sind. Ein Teileinzugsgebiet, dessen Lauf fehlgeschlagen ist, behält sein letztes `window_end`.
Parameter
- stationquery
- riverquery
curl curl -sS "https://danubealert.arcm.ro/api/v1/basin-precipitation"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/basin-precipitation') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/basin-precipitation", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/countries/{code}/stationsMessstellen eines LandesDieselben Zeilen wie `/stations`, nach Land gefiltert; jede hat den Block `quality` ( Referenzquelle, letzter Messwert, G3-Zustand und Pegelnullpunkt ).
Parameter
- code*path
curl curl -sS "https://danubealert.arcm.ro/api/v1/countries/HU/stations"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/countries/HU/stations') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/countries/HU/stations", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/report/todayDer Tag in einem Objekt: Lage im Einzugsgebiet, was sich heute ändert, Messstellen über / unter den Schwellen, Prognose für 24–72 hDer Tagesbericht als ein einziges Objekt, für die Seite `/{lang}/today` ( UX-9 ). `basin` ist genau das Aggregat „Die Lage heute“ ( die Summe und die Zeilen je Land ), `changes` ist der Block F4 ( die 24-h-Variation, die Q74-Welle, die D2-Abweichung ), `thresholds` listet die Messstellen mit frischem Messwert unter LDC / über HDC ( mit Schwelle, Wasserstand und Differenz ), und `forecast` liefert die **24–72 h**-Prognose aus G2 ( Quelle, Ausgabe, Horizont der Quelle, Min–Max-Band je Horizont und `orientativ` ), nur für Messstellen mit einer signifikanten Prognose: Sie erreicht eine Schwelle oder bewegt sich mindestens 25 cm gegenüber dem aktuellen Wasserstand. Die Liste ist begrenzt ( 12 je Einzugsgebiet, 3 je Land ), mit der Summe vor der Begrenzung; die Tage 4–5 ( +96 / +120 h ) sind nicht Teil des Berichts.
curl curl -sS "https://danubealert.arcm.ro/api/v1/report/today"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/report/today') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/report/today", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/stationsListe der MessstellenDie paginierte Liste der Messstellen, mit Wasserstand, Prognose und dem Block `quality` in jeder Zeile: Referenzquelle, Zeitpunkt des letzten Messwerts, G3-Zustand ( aktuell / „alter Messwert“ / keine Daten ) und Pegelnullpunkt ( national / anderer / absolut / unbekannt ).
Parameter
- countryquery
- riverquery
- qquery
- limitquery
- next_cursorquery
- sortquery
curl curl -sS "https://danubealert.arcm.ro/api/v1/stations"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/stations') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/stations", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/stations/{slug}Eine Messstelle, ihre LDC/HDC-Schwellen und die Abweichung des Tages von der KlimatologieDie Messstellenseite: die LDC/HDC-Schwellen, die Koordinaten, die Aktualität der Referenzquelle ( Q88 ), die Abdeckung der Reihe über 365 Tage ( Q94 ), der Block `quality` — Referenzquelle, letzter Messwert, G3-Zustand und Pegelnullpunkt ( H4 ) —, der Block `anomaly` — die Abweichung des heutigen Wasserstands von der Klimatologie des Tages ( D1 ), unter 10 Referenzjahren nicht vorhanden — und, wenn die Messstelle eine Prognose hat, der Block `forecast` mit Quelle, `horizon_hours` ( wie weit die Prognose reicht ) und den Horizonten mit ihrem Min–Max-Band ( G2, UX-11 §8.1 S. 6 ).
Parameter
- slug*path
curl curl -sS "https://danubealert.arcm.ro/api/v1/stations/budapest"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/stations/budapest') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/stations/budapest", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/stations/{slug}/eventsHistorische Hochwasser und Dürren einer MessstelleDie für die Messstelle dokumentierten großen Hochwasser und Dürren, die neuesten zuerst ( Jahr, dann der Scheiteltag ). Jede Zeile enthält Art, Jahr, den Scheiteltag, wenn die Quelle ihn veröffentlicht, den Wert am Pegel der Messstelle mit seiner Einheit, den Quellcode, die Institution und die öffentliche URL. `?tip=viitura|seceta` filtert die Art. Die Zeilen stammen aus der redaktionellen Sammlung `evenimente-istorice`, in der Quelle und Beleg jeder Zeile Pflicht sind. `_attribution.data_updated_at` ist das neueste Prüfdatum der zurückgegebenen Zeilen.
Parameter
- slug*path
- tipquery
- limitquery
curl curl -sS "https://danubealert.arcm.ro/api/v1/stations/budapest/events"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/stations/budapest/events') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/stations/budapest/events", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/stations/{slug}/neighborsNachbarn flussauf / flussab und MündungenParameter
- slug*path
curl curl -sS "https://danubealert.arcm.ro/api/v1/stations/budapest/neighbors"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/stations/budapest/neighbors') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/stations/budapest/neighbors", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v2/stationsMessstellenliste ( v2, Cursor + Felder + Format )Dieselben Daten wie `/v1/stations`, mit dem v2-Listenvertrag: Keyset-Cursor-Paginierung, `fields=` und `format=json|csv|geojson`. Die Antwort ist cachefähig (`ETag`, `Last-Modified`, `Cache-Control`), und `If-None-Match` liefert `304`.
Parameter
- countryquery
- riverquery
- qquery
- limitquery
- next_cursorquery
- fieldsquery
- formatquery
curl curl -sS "https://danubealert.arcm.ro/api/v2/stations"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v2/stations') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v2/stations", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/wizardDaten für den Alarm-Assistenten: Abschnitte, Länder, Flüsse und SucheDonauabschnitte von der Quelle bis zur Mündung ( je Land, mit Kilometerbereich und den Pegeln des Abschnitts ) und die Flüsse jedes Landes, nach Pegelanzahl geordnet. Mit `q` werden Pegel und Flüsse nach Namen gesucht; Diakritika und Kyrillisch werden toleriert; `limit` ( 1–50 ) begrenzt die Listen. Gecacht wie der übrige Katalog.
Parameter
- qquery
- limitquery
- partequery
- taraquery
- langquery
curl curl -sS "https://danubealert.arcm.ro/api/v1/wizard"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/wizard') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/wizard", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
Messungen und Prognosen
GET
/api/v1/forecast/accuracyTreffsicherheit der amtlichen Prognosen gegenüber den Messwerten, nach Quelle und Vorhersagezeit ( +24 / +48 / +72 h )10/minBacktest der Zeilen aus `forecasts` gegen die tatsächlichen Messwerte aus `readings`, je Quelle × Horizont ( +24 / +48 / +72 h ): mittlerer absoluter Fehler ( `mae_cm` ), vorzeichenbehafteter Bias ( `bias_cm`, positiv = die Prognose lag zu hoch ) und der Anteil der Messwerte im veröffentlichten Min–Max-Band ( `within_band_pct`, nur bei Stichproben mit Band ). Die Liste enthält alle Quellen mit Prognose im Fenster, auch jene noch ohne Paare ( `samples: 0`, `null`-Mittelwerte ). Standardfenster: 90 Tage nach dem Zielzeitpunkt; jede Prognose wird mit dem nächstgelegenen Messwert innerhalb ±6 h verglichen, wobei die Reihe des Herausgebers bevorzugt wird, sonst die Referenzquelle der Messstelle. Ohne Messwert im Fenster geht die Prognose nicht in die Stichprobe ein. Ohne `station` gilt das Aggregat für das ganze Einzugsgebiet; mit `station` nur für die angefragte Messstelle — dieselben Zahlen wie `/stations/{slug}/forecast-accuracy`. Schwerer Endpunkt: 10 Anfragen/Min.
Parameter
- stationquery
- daysquery
curl curl -sS "https://danubealert.arcm.ro/api/v1/forecast/accuracy"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/forecast/accuracy') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/forecast/accuracy", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Schwere Route: 10 Anfragen/Minute, auch mit Schlüssel.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/measurementsWassertemperatur, Abfluss, LufttemperaturParameter
- station*query
- measurequery
- fromquery
- toquery
curl curl -sS "https://danubealert.arcm.ro/api/v1/measurements?station=budapest"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/measurements?station=budapest') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/measurements?station=budapest", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/observationsBis zu 6 Messstellen in einer Antwort vergleichen10/minDieselben Regeln wie bei den Beobachtungen einer Messstelle; `interval` ist standardmäßig `daily` und das Ratenlimit ist das schwere ( 10/min ).
Parameter
- stations*query
- fromquery
- toquery
- intervalquery
- riverquery
curl curl -sS "https://danubealert.arcm.ro/api/v1/observations?stations=budapest%2Cmohacs"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/observations?stations=budapest%2Cmohacs') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/observations?stations=budapest%2Cmohacs", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Schwere Route: 10 Anfragen/Minute, auch mit Schlüssel.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/stations/{slug}/climatologyKlimatologie nach Tag des Jahres aus der gesamten Reihe: Mittel, Median und Perzentile10/minDie Referenzreihe der Messstelle für jeden Kalendertag ( `MM-DD` ): aus der gesamten Geschichte des Tages-Rollups, wie viele Jahre beigetragen haben, Mittelwert, Median, die Perzentile 10 / 25 / 75 / 90, Minimum, Maximum und Standardabweichung. Der Wert eines Tages ist der erste Messwert des lokalen Tages aus der tatsächlichen Referenzquelle der Messstelle. Die Grundlage für „heute liegt der Pegel X cm unter dem Tagesnormal“; die Abweichung selbst steht im Block `anomaly` der Messstellenseite und in `GET /summary/today`.
Parameter
- slug*path
- dayquery
- limitquery
curl curl -sS "https://danubealert.arcm.ro/api/v1/stations/budapest/climatology"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/stations/budapest/climatology') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/stations/budapest/climatology", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Schwere Route: 10 Anfragen/Minute, auch mit Schlüssel.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/stations/{slug}/dischargeAbfluss-Zeitreihe ( m³/s )Die Abflussreihe aus der Tabelle `masuratori` ( die Messgröße `debit` ), geschrieben von den nationalen hydrologischen Diensten. Eine Antwort enthält eine einzige Quelle ( `source` ): ohne `source=` wird die Quelle der neuesten Abflussmessung genommen, damit Reihen verschiedener Quellen nicht vermischt werden. `interval=hourly|daily` aggregiert über den Mittelwert. Schwerer Endpunkt: 10 Anfragen/Minute anonym.
Parameter
- slug*path
- sourcequery
- fromquery
- toquery
- intervalquery
- formatquery
curl curl -sS "https://danubealert.arcm.ro/api/v1/stations/budapest/discharge"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/stations/budapest/discharge') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/stations/budapest/discharge", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/stations/{slug}/forecastPrognose der Messstelle ( wo vorhanden )Die letzte Ausgabe aus einer einzigen Quelle ( `source` ); Reihen verschiedener Quellen werden nicht vermischt. `horizon_hours` sagt, wie weit die Prognose der Ausgabe reicht ( je nach Quelle von +48 h bis +120 h ), und jeder Horizont hat das von der Quelle veröffentlichte Min–Max-Band ( `level_min_cm` / `level_max_cm`, `null` wo sie keines angibt ). Die Tage 4–5 ( +96 / +120 h ) tragen `orientativ: true`: sie erscheinen in den Daten, lösen aber keine Warnungen aus — die Engine nutzt nur 24–72 h.
Parameter
- slug*path
curl curl -sS "https://danubealert.arcm.ro/api/v1/stations/budapest/forecast"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/stations/budapest/forecast') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/stations/budapest/forecast", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/stations/{slug}/forecast-accuracyTreffsicherheit der Prognose an einer Messstelle, nach Quelle und Vorhersagezeit: wie gut sie hier ist10/minBacktest der für die Messstelle im Pfad ausgegebenen Prognosen gegen ihre tatsächlichen Messwerte, je Quelle × Horizont ( +24 / +48 / +72 h ): mittlerer absoluter Fehler ( `mae_cm` ), vorzeichenbehafteter Bias ( `bias_cm`, positiv = die Prognose lag zu hoch ) und der Anteil der Messwerte im veröffentlichten Min–Max-Band ( `within_band_pct` ). Die Liste enthält **alle Quellen mit Prognose** für die Messstelle im Fenster; eine Quelle ohne ein einziges Prognose-Messwert-Paar erscheint trotzdem, mit `samples: 0` und `null`-Mittelwerten. Standardfenster: 90 Tage nach dem Zielzeitpunkt; der Messwert wird bei ±6 h genommen, wobei die Reihe des Herausgebers bevorzugt wird, sonst die Referenzquelle der Messstelle. Dieselben Zahlen wie `/forecast/accuracy?station=<slug>`. Schwerer Endpunkt: 10 Anfragen/Min.
Parameter
- slug*path
- daysquery
curl curl -sS "https://danubealert.arcm.ro/api/v1/stations/budapest/forecast-accuracy"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/stations/budapest/forecast-accuracy') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/stations/budapest/forecast-accuracy", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Schwere Route: 10 Anfragen/Minute, auch mit Schlüssel.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/stations/{slug}/iceEiserscheinungen aus den nationalen Berichten, je Messstelle und Tag vereinheitlichtDie in den nationalen Berichten veröffentlichten Winterphänomene, je Messstelle und Tag vereinheitlicht. Die heutige Quelle ist ein täglicher nationaler Bericht: die Spalte `L` ( Index 0–8 ) wird zu `code`, und `phenomena` enthält die kanonischen englischen Codes ( `ice_floe`, `ice_bridge`, `shore_ice`… ). Ein Tag mit Index 0 ist eine echte Beobachtung ( `ice: false`, `code: 0`, `phenomena: []` ), keine fehlenden Daten. RO / BG / RS / HU veröffentlichen das Phänomen im Tagesbericht nicht je Messstelle ( siehe Beschreibung der Quellen ), daher erscheinen sie hier nicht.
Parameter
- slug*path
- limitquery
- fromquery
- toquery
curl curl -sS "https://danubealert.arcm.ro/api/v1/stations/budapest/ice"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/stations/budapest/ice') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/stations/budapest/ice", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/stations/{slug}/observationsPegel-Zeitreihe ( cm )10/minEin schwerer Endpunkt für lange anonyme Historie: 10 Anfragen/Minute ( §3 ). Standardmäßig ist die Reihe die **Referenzquelle** der Messstelle ( die nationale Quelle; `source` im Rumpf ). Die Historie ist geschichtet: `source=` fordert die Reihe einer bestimmten Quelle, und `include_legacy=true` fügt den Block `legacy` mit der Legacy-Reihe hinzu ( ein anderer Pegel: `level_cm` wie die Quelle ihn veröffentlicht, `level_cm_aligned` auf den Nullpunkt des nationalen Pegels gebracht, wenn der Nullpunkt bekannt ist ). Die Reihen werden in `data` nie vermischt.
Parameter
- slug*path
- sourcequery
- include_legacyquery
- fromquery
- toquery
- intervalquery
- formatquery
curl curl -sS "https://danubealert.arcm.ro/api/v1/stations/budapest/observations"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/stations/budapest/observations') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/stations/budapest/observations", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Schwere Route: 10 Anfragen/Minute, auch mit Schlüssel.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/stations/{slug}/percentilePerzentil des heutigen Werts gegenüber demselben Tag der letzten 30 Jahre10/minDer Wasserstand des letzten Tages ( erster Messwert des lokalen Tages, Referenzquelle ) im Vergleich zum selben Kalendertag der letzten 30 Jahre. `percentile` reicht von 0 bis 100, `category` ist eines von very_low / low / normal / high / very_high; unter 10 Referenzjahren ist `percentile` null. Eine einzige Abfrage über das Jahrfenster, nicht eine pro Tag.
Parameter
- slug*path
curl curl -sS "https://danubealert.arcm.ro/api/v1/stations/budapest/percentile"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/stations/budapest/percentile') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/stations/budapest/percentile", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Schwere Route: 10 Anfragen/Minute, auch mit Schlüssel.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/stations/{slug}/recordsHistorische Rekorde10/minParameter
- slug*path
curl curl -sS "https://danubealert.arcm.ro/api/v1/stations/budapest/records"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/stations/budapest/records') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/stations/budapest/records", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Schwere Route: 10 Anfragen/Minute, auch mit Schlüssel.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/stations/{slug}/same-dayDerselbe Tag in früheren Jahren10/minParameter
- slug*path
curl curl -sS "https://danubealert.arcm.ro/api/v1/stations/budapest/same-day"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/stations/budapest/same-day') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/stations/budapest/same-day", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Schwere Route: 10 Anfragen/Minute, auch mit Schlüssel.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/stations/{slug}/winterWinterphänomene und EisdickeDie für die Messstelle veröffentlichten Winterbeobachtungen, die neuesten zuerst: der Text des Phänomens und/oder die Eisdicke in cm. Ohne Beobachtungen ist die Liste leer.
Parameter
- slug*path
- limitquery
curl curl -sS "https://danubealert.arcm.ro/api/v1/stations/budapest/winter"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/stations/budapest/winter') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/stations/budapest/winter", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/summary/low-waterNiederwasser: aufeinanderfolgende Tage unter LDC, nach Abschnitt, mit Verlauf und VergleichHydrologische Dürre an der Donau, nach Abschnitt ( die Länder des Flusses, von flussauf nach flussab ): für das gewählte Jahr der längste ununterbrochene Zeitraum unter LDC einer Messstelle im Abschnitt, die Rekordmessstelle, wie viele Messstellen Niedrigwasser hatten, die Messstellen-Tage unter LDC, der Verlauf des Abschnitts und der Vergleich mit den Referenzjahren 2003, 2015, 2018 und 2022. Dieselben Regeln wie die Registerkarte „Niederwasser“ auf `/{lang}/statistics`: Schwellen werden am Referenzmesswert aus dem Rollup beurteilt, und ein fehlender Tag bricht den Zeitraum.
Parameter
- yearquery
curl curl -sS "https://danubealert.arcm.ro/api/v1/summary/low-water"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/summary/low-water') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/summary/low-water", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/summary/todayDie Lage heute: Pegel, Schwellen, Prognosen, die Auffälligkeiten des Tages und was sich heute im Einzugsgebiet ändertDas Tagesaggregat je Land: wie viele Messstellen unter LDC und über HDC liegen ( mit dem Anteil der Messstellen mit Schwellen ), wie viele in den letzten 48 h keinen Messwert haben, der 24-h-Trend ( steigend / fallend / stabil ) und die Prognose für die nächsten 24–72 h. D2 ergänzt die Abweichung vom Tagesnormal ( die Klimatologie D1 ): wie viele Messstellen über p75, unter p25 oder im normalen Bereich liegen, und die Rangliste der größten standardisierten Abweichungen. F4 ergänzt „was sich heute ändert“: die ersten signifikanten Änderungen aus der 24-h-Variation, aus der Q74-Welle ( Laufzeit flussauf → flussab ) und aus der D2-Abweichung, je Einzugsgebiet ( `changes` ) und je Land ( `changes_by_country` ). Dieselben Regeln wie die Seite `/{lang}/today`: Schwellen werden am frischen Referenzmesswert beurteilt, und die Prognose stammt aus einer einzigen Ausgabe.
curl curl -sS "https://danubealert.arcm.ro/api/v1/summary/today"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/summary/today') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/summary/today", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
Flüsse und Länder
GET
/api/v1/countriesLänder im Einzugsgebietcurl curl -sS "https://danubealert.arcm.ro/api/v1/countries"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/countries') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/countries", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/riversFlüsse im Einzugsgebiet und die Zahl ihrer Messstellencurl curl -sS "https://danubealert.arcm.ro/api/v1/rivers"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/rivers') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/rivers", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/rivers/{rau}Flussgraph: Mündung, Zuflüsse, LänderParameter
- rau*path
curl curl -sS "https://danubealert.arcm.ro/api/v1/rivers/sava"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/rivers/sava') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/rivers/sava", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v2/countriesLänder des Einzugsgebiets, mit Cursor-Paginierung ( v2 )Die Länder des Einzugsgebietsregisters, mit Namen in den Sprachen des Produkts; der Cursor ist der ISO-Code.
Parameter
- limitquery
- next_cursorquery
- fieldsquery
- formatquery
curl curl -sS "https://danubealert.arcm.ro/api/v2/countries"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v2/countries') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v2/countries", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v2/riversFlüsse des Einzugsgebiets, mit Cursor-Paginierung ( v2 )Die Flüsse im Messstellenregister, mit der Zahl der Messstellen je Land. Der Cursor ist der normalisierte Flusscode; `fields=` und `format=json|csv|geojson` gelten auf allen v2-Listen gleich.
Parameter
- limitquery
- next_cursorquery
- fieldsquery
- formatquery
curl curl -sS "https://danubealert.arcm.ro/api/v2/rivers"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v2/rivers') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v2/rivers", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
Exporte
GET
/api/v1/export/country/{cod}CSV- / JSON-Export nach Land10/minParameter
- cod*path
- formatquery
curl curl -sS "https://danubealert.arcm.ro/api/v1/export/country/HU"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/export/country/HU') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/export/country/HU", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Schwere Route: 10 Anfragen/Minute, auch mit Schlüssel.
Auch der Export enthält `_attribution`, mit der Lizenz in `_attribution.license` (CC BY 4.0); zeige `_attribution.source`, `_attribution.url` und die Lizenz neben der Datei.
GET
/api/v1/export/dailyTäglicher CSV- / JSON-Export nach Land10/minDie Datei des Vortags für ein Land des Einzugsgebiets, mit Lizenz CC BY 4.0 und Quellenangabe. Die CSV legt sie in die Kopfzeilen `Link`, `X-Attribution*` und `X-License*`, die JSON in `_attribution` ( einschließlich `license` ). Die Antwort ist cachefähig: `ETag`, `Last-Modified`, `Cache-Control`, und `If-None-Match` liefert 304 mit denselben Kopfzeilen.
Parameter
- country*query
- formatquery
curl curl -sS "https://danubealert.arcm.ro/api/v1/export/daily?country=HU"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/export/daily?country=HU') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/export/daily?country=HU", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Schwere Route: 10 Anfragen/Minute, auch mit Schlüssel.
Auch der Export enthält `_attribution`, mit der Lizenz in `_attribution.license` (CC BY 4.0); zeige `_attribution.source`, `_attribution.url` und die Lizenz neben der Datei.
GET
/api/v1/export/rangeExport langer Zeiträume für die Forschung ( CSV / Parquet, mit Cursor-Paginierung und Lizenz je Zeile )10/minEine Seite des Tages-Rollups (`readings_daily`) über den Zeitraum `from`–`to`, nur aus Quellen mit ausdrücklicher Weiterverbreitungslizenz ( das Q90-Lizenzregister ). Jede Zeile enthält die Spalte `license` der Quelle; die vollständige Quellenangabe und die URL der Bedingungen stehen im Manifest `/export/range/licenses` und in den Kopfzeilen `X-License` / `X-Attribution` / `Link`. Die Paginierung erfolgt mit `cursor` ( `X-Next-Cursor`, `Link: rel="next"` ), über einen Fingerabdruck an die Filter gebunden: zwei aufeinanderfolgende Seiten wiederholen und überspringen keine Zeilen. Ohne Schlüssel: höchstens 366 Tage und 500 Zeilen pro Seite; mit Schlüssel (`Authorization: Bearer`): 20 Jahre und 5 000 Zeilen pro Seite. Der Export ist ein schwerer Endpunkt ( 10 Anfragen/Minute ).
Parameter
- from*query
- to*query
- countryquery
- formatquery
- limitquery
- cursorquery
curl curl -sS "https://danubealert.arcm.ro/api/v1/export/range?from=2026-01-01&to=2026-10-23"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/export/range?from=2026-01-01&to=2026-10-23') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/export/range?from=2026-01-01&to=2026-10-23", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Schwere Route: 10 Anfragen/Minute, auch mit Schlüssel.
Auch der Export enthält `_attribution`, mit der Lizenz in `_attribution.license` (CC BY 4.0); zeige `_attribution.source`, `_attribution.url` und die Lizenz neben der Datei.
GET
/api/v1/export/range/licensesLizenzen und Quellenangaben der Quellen für den Zeitraum-ExportDas Manifest der Quellen, die in `GET /export/range` erscheinen können: nur jene mit ausdrücklicher Weiterverbreitungslizenz, jede mit Institution, Lizenz, URL der Bedingungen, Quellenangabe, der vorgenommenen Umwandlung ( Tagesaggregat ) und dem Prüfdatum. Eine abgelehnte oder unbekannte Quelle erscheint nicht im Manifest und wird nicht exportiert.
curl curl -sS "https://danubealert.arcm.ro/api/v1/export/range/licenses"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/export/range/licenses') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/export/range/licenses", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Auch der Export enthält `_attribution`, mit der Lizenz in `_attribution.license` (CC BY 4.0); zeige `_attribution.source`, `_attribution.url` und die Lizenz neben der Datei.
GET
/api/v1/export/river/{rau}CSV- / JSON-Export nach Fluss10/minParameter
- rau*path
- formatquery
curl curl -sS "https://danubealert.arcm.ro/api/v1/export/river/sava"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/export/river/sava') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/export/river/sava", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Schwere Route: 10 Anfragen/Minute, auch mit Schlüssel.
Auch der Export enthält `_attribution`, mit der Lizenz in `_attribution.license` (CC BY 4.0); zeige `_attribution.source`, `_attribution.url` und die Lizenz neben der Datei.
Schwellen, Schifffahrt, Berichte
GET
/api/v1/bulletinsHydrologische Berichte nach LandParameter
- countryquery
curl curl -sS "https://danubealert.arcm.ro/api/v1/bulletins"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/bulletins') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/bulletins", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/navigationKritische Stellen und Einschränkungen der SchifffahrtNur die aktiven Zeilen; abgelaufene Einschränkungen ( ein vergangenes `data_end` ) werden nicht mehr zurückgegeben, und Einschränkungen stammen nur aus den aufbewahrten amtlichen Quellen. Die Antwort ist nach rkm sortiert.
Parameter
- riverquery
curl curl -sS "https://danubealert.arcm.ro/api/v1/navigation"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/navigation') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/navigation", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/thresholdsAmtliche Schwellen ( LDC/HDC, RNW/HSW, Hochwasser-Warnstufen )Nur die aktiven Schwellen ( archivierte Werte bleiben mit `activ: false` in der Plattform und werden nicht veröffentlicht ). `station` ist der Slug der Messstelle; ein unbekannter Slug liefert 404.
Parameter
- stationquery
- pagequery
- limitquery
curl curl -sS "https://danubealert.arcm.ro/api/v1/thresholds"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/thresholds') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/thresholds", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v2/bulletinsHydrologische Berichte, mit Cursor-Paginierung ( v2 )Die nationalen Berichte, die neuesten zuerst; `country` filtert, der Cursor ist die Berichts-ID.
Parameter
- countryquery
- limitquery
- next_cursorquery
- fieldsquery
- formatquery
curl curl -sS "https://danubealert.arcm.ro/api/v2/bulletins"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v2/bulletins') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v2/bulletins", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v2/navigationSchifffahrt, eine paginierte Liste ( v2 )Kritische Stellen und aktive Einschränkungen in einer einzigen Liste, jede Zeile mit `kind` (`punct_critic` oder `restrictie` ); der Cursor setzt sich aus `kind:id` zusammen. Geometrie gibt es bei Punkten.
Parameter
- riverquery
- limitquery
- next_cursorquery
- fieldsquery
- formatquery
curl curl -sS "https://danubealert.arcm.ro/api/v2/navigation"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v2/navigation') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v2/navigation", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v2/thresholdsAmtliche Schwellen, mit Cursor-Paginierung ( v2 )Die aktiven Schwellen, mit `station` ( Slug ) als Filter; der Cursor ist die Schwellen-ID. Ein unbekannter Slug liefert 404, wie in v1.
Parameter
- stationquery
- limitquery
- next_cursorquery
- fieldsquery
- formatquery
curl curl -sS "https://danubealert.arcm.ro/api/v2/thresholds"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v2/thresholds') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v2/thresholds", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
Warnepisoden
GET
/api/v1/episodesÖffentliche LDC/HDC-EpisodenParameter
- countryquery
- typequery
- limitquery
- next_cursorquery
curl curl -sS "https://danubealert.arcm.ro/api/v1/episodes"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/episodes') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/episodes", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/episodes/{id}Eine Warn-EpisodeParameter
- id*path
curl curl -sS "https://danubealert.arcm.ro/api/v1/episodes/1"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/episodes/1') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/episodes/1", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GeoJSON
GET
/api/v1/geojson/riversSchiffbare Donaulinie + Save / Theißcurl curl -sS "https://danubealert.arcm.ro/api/v1/geojson/rivers"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/geojson/rivers') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/geojson/rivers", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/geojson/stationsFeatureCollection der MessstellenParameter
- countryquery
curl curl -sS "https://danubealert.arcm.ro/api/v1/geojson/stations"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/geojson/stations') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/geojson/stations", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
Quellen und Datenqualität
GET
/api/v1/meta/availabilityMonatliche Verfügbarkeit je Quelle ( 12 Monate ): Tage mit Daten und die letzten AbrufeDer öffentliche Bericht „Datentransparenz“: ein Monat je Quelle über die letzten 12 Kalendermonate, mit den gezählten Tagen (`days`, der laufende Monat nur bis gestern), den Tagen mit mindestens einem Messwert (`days_with_data`) und ihrem Prozentsatz. `last_7_days` liefert die Läufe und Fehlschläge der letzten 7 Tage aus dem Q62-Journal (`runs` / `failures`; `null` = kein Journal). Nur Zahlen: keine Fehlermeldungen, keine URLs, keine Messstellendetails. Ohne das Tages-Rollup ( Instanz ohne Ingest ) ist `sources` leer, nicht „0 %“.
curl curl -sS "https://danubealert.arcm.ro/api/v1/meta/availability"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/meta/availability') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/meta/availability", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/meta/healthZustand der Quellencurl curl -sS "https://danubealert.arcm.ro/api/v1/meta/health"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/meta/health') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/meta/health", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/meta/qualityDatenqualität je Messstelle: verdächtige Messwerte und Zustand der QuelleAggregat je Messstelle: die Zahl der verdächtigen Messwerte ( Abweichung über einer Schwelle vom Median der Nachbarn ±6 h ), der letzte Messwert und der Zustand der Quelle, die ihn geliefert hat ( `source_state`: `ok`, `eroare`, `stale` — „keine Messwerte im Termin“ ).
curl curl -sS "https://danubealert.arcm.ro/api/v1/meta/quality"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/meta/quality') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/meta/quality", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v1/meta/sourcesLetzte Aktualisierung je DatenquelleEine Zeile je Crawl-Quelle: der letzte erfolgreiche Lauf, ihr Zustand, der SLA, **der letzte Schreibvorgang**, **die gelesenen Zeilen und die geschriebenen Messwerte der letzten 24 h**, **die Uptime über 7 und 30 Tage**, **die mittlere Verzögerung** der Daten ( das mittlere Alter des frischesten Messwerts über 7 Tage ) und **der letzte Fehler** ( auch nach der Rückkehr der Quelle aufbewahrt ). `stare` kann `cazuta` sein, wenn die Quelle seit mehr als 2 × ihrem Intervall nichts geschrieben hat, und `eroare` bedeutet, dass der letzte Lauf fehlgeschlagen ist **und** die Daten davor den SLA der Quelle verletzt haben; ein Netzausfall, solange die Daten noch im Termin sind, lässt `stare` unverändert ( der Fehler bleibt in `ultima_eroare` ). `uptime_7d` / `uptime_30d` sind Brüche 0–1; `null` = das Fenster ist nicht berechenbar oder `readings` ist gerade nicht verfügbar, nicht „perfekte Quelle“.
curl curl -sS "https://danubealert.arcm.ro/api/v1/meta/sources"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v1/meta/sources') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v1/meta/sources", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
GET
/api/v2/meta/sourcesDatenquellen, mit Cursor-Paginierung ( v2 )Der letzte Lauf und die Qualität über die Zeit je Quelle; der Cursor ist der Quellcode. Die Felder sind jene von `/v1/meta/sources`.
Parameter
- limitquery
- next_cursorquery
- fieldsquery
- formatquery
curl curl -sS "https://danubealert.arcm.ro/api/v2/meta/sources"JavaScript const r = await fetch('https://danubealert.arcm.ro/api/v2/meta/sources') if (!r.ok) throw new Error(`HTTP ${r.status}`) const body = await r.json() console.log(body) console.log(body._attribution.source, body._attribution.url)Python import requests r = requests.get("https://danubealert.arcm.ro/api/v2/meta/sources", timeout=30) r.raise_for_status() body = r.json() print(body) print(body["_attribution"]["source"], body["_attribution"]["url"])Ratenlimit: Anonym: 60 Anfragen/Minute (gleitendes Fenster); mit `Authorization: Bearer <Schlüssel>`: 600/Minute.
Die Antwort enthält `_attribution`; zeige `_attribution.source` und `_attribution.url` neben den Daten.
Ratenbegrenzung
Gleitendes 60-Sekunden-Fenster; die Messreihe ist ein schwerer Endpunkt (10 pro Minute). Über dem Limit: 429 mit retry_after_seconds im Body sowie Retry-After- und X-RateLimit-*-Headern. Abgelehnte Anfragen zählen nicht für das nächste Fenster.
| Header | Bedeutung |
|---|---|
| X-RateLimit-Limit | 60 / 600 / 3000 / 10 |
| X-RateLimit-Remaining | 0 … limit |
| Retry-After | s ( 429 ) |
| 429 · retry_after_seconds | JSON |
Typisierter TypeScript-Client
Direkt aus dem Vertrag generierte Typen — jede Route, jeder Parameter und jede Antwort, ohne handgeschriebene Modelle.
npx openapi-typescript https://danubealert.arcm.ro/api/v1/openapi.de.json -o danubealert.d.ts
import type { paths } from './danubealert'
type Observatii = paths['/stations/{slug}/observations']['get']['responses']['200']['content']['application/json']Open-Data-Export
Die Dateien des Vortags, eine Zeile pro Pegel, für jedes Land des Einzugsgebiets, als CSV oder JSON. Die Antworten sind cachefähig (ETag, Last-Modified, Cache-Control); Lizenz und Namensnennung stehen in den Kopfzeilen der Datei und im _attribution-Block des JSON.
- Albanien ALCSVJSON
- Österreich ATCSVJSON
- Bosnien und Herzegowina BACSVJSON
- Bulgarien BGCSVJSON
- Schweiz CHCSVJSON
- Tschechien CZCSVJSON
- Deutschland DECSVJSON
- Kroatien HRCSVJSON
- Ungarn HUCSVJSON
- Italien ITCSVJSON
- Moldau MDCSVJSON
- Montenegro MECSVJSON
- Nordmazedonien MKCSVJSON
- Polen PLCSVJSON
- Rumänien ROCSVJSON
- Serbien RSCSVJSON
- Slowenien SICSVJSON
- Slowakei SKCSVJSON
- Ukraine UACSVJSON
Lizenz: Creative Commons Attribution 4.0 International · Namensnennung: DanubeAlert und die nationalen hydrologischen Dienste · Der Vortag, in der Zeitzone des Landes.
Widget-Konfigurator
Der Wasserstand eines Pegels auf Ihrer eigenen Website: Pegel, Design, Sprache und Branding wählen, das Widget live sehen und den iframe-Code in jedes CMS kopieren.
Deine Widgets in drei Schritten
Typ und Einstellungen wählen — Vorschau und Snippet aktualisieren sich sofort.
Vorschau ( Miniatur )
Einzufügendes Snippet
<iframe
src="https://danubealert.arcm.ro/embed/v1/station?slug=achleiten&theme=auto&lang=de&accent=00BABE"
title="Danube water level — Achleiten"
width="100%"
height="300"
style="border:0;max-width:640px;"
loading="lazy"
referrerpolicy="strict-origin-when-cross-origin"
></iframe>Vollständiger Vertrag: /api/v1/openapi.de.json · /api/v1/openapi.json · Daten: die nationalen hydrologischen Dienste, über DanubeAlert