Zum Inhalt springen

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>

Kostenlosen API-Schlüssel holen →OpenAPI-3.1-Vertrag

Ü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
curl -sS "https://danubealert.arcm.ro/api/v1/stations/budapest/observations"
TypeScript
// 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.

`_attribution`-Block
{
  "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"
}
_attribution · /export/daily
{
  "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ätigungsseite

    Der 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 zugeordnet

    Der 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 Landes

    Dieselben 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 h

    Der 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 Messstellen

    Die 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 Klimatologie

    Die 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 Messstelle

    Die 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ündungen

    Parameter

    • 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 Suche

    Donauabschnitte 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/min

    Backtest 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, Lufttemperatur

    Parameter

    • 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/min

    Dieselben 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/min

    Die 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/min

    Backtest 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 vereinheitlicht

    Die 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/min

    Ein 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/min

    Der 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/min

    Parameter

    • 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/min

    Parameter

    • 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 Eisdicke

    Die 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 Vergleich

    Hydrologische 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 ändert

    Das 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 Einzugsgebiet
    curl
    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 Messstellen
    curl
    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änder

    Parameter

    • 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/min

    Parameter

    • 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/min

    Die 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/min

    Eine 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-Export

    Das 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/min

    Parameter

    • 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 Land

    Parameter

    • 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 Schifffahrt

    Nur 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-Episoden

    Parameter

    • 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-Episode

    Parameter

    • 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 Messstellen

    Parameter

    • 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 Abrufe

    Der ö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 Quellen
    curl
    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 Quelle

    Aggregat 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 Datenquelle

    Eine 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.

Ratenbegrenzung
HeaderBedeutung
X-RateLimit-Limit60 / 600 / 3000 / 10
X-RateLimit-Remaining0 … limit
Retry-Afters ( 429 )
429 · retry_after_secondsJSON

Typisierter TypeScript-Client

Direkt aus dem Vertrag generierte Typen — jede Route, jeder Parameter und jede Antwort, ohne handgeschriebene Modelle.

TypeScript
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.

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.

Thema
Größe

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