Прескочи на садржај

API v1 · OpenAPI 3.1

API и отворени подаци о водостајима Дунава

Бесплатни JSON API за водостаје Дунава: станице са праговима LDC/HDC, дневни низови, GeoJSON и уговор OpenAPI 3.1, са ограничењима захтева и примерима кода.

Основни URL
https://danubealert.arcm.ro/api/v1
Аутентификација
Authorization: Bearer <key>

Бесплатан API кључ →OpenAPI 3.1 уговор

Преглед

Јавни API v1 даје хидролошке податке слива Дунава у JSON формату: станице са праговима LDC/HDC, мерења и прогнозе, званичне прагове, критичне тачке пловидбе, хидролошке билтене, GeoJSON и стање извора. Цео уговор: /api/v1/openapi.json (OpenAPI 3.1).

Планови и ограничења

Анонимно (без заглавља): 60 захтева у минуту, CORS * на GET. Са интеграторским кључем (Authorization: Bearer <кључ>): 600 захтева у минуту. Кључеве бесплатно правите у свом налогу. Неисправан, непознат или опозван кључ добија 401 (WWW-Authenticate: Bearer error="invalid_token"), а не анониман приступ; опозвани кључ одмах престаје да ради.

  • Анонимно

    60захтева / минуту

    Без заглавља, CORS * на GET — довољно да испробаш сваку руту.

  • Бесплатан API кључ

    600захтева / минуту

    Authorization: Bearer <кључ>, креиран у налогу, приказан једном.

  • Захтевне руте

    10захтева / минуту

    Серије и извози ( observations, export ), по кључу или IP-у.

Пример

Последњи дневни водостај станице, преко curl-а и TypeScript-а.

curl
curl -sS "https://danubealert.arcm.ro/api/v1/stations/budapest/observations"
TypeScript
// Данашњи водостај у Будимпешти
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 }

Крајње тачке

Све руте јавног API-ја v1, само читање ( GET ), са параметрима и захтевом спремним за покретање.

Примери по рути

Свака рута у наставку има извршиви захтев curl, JavaScript и Python, свој лимит захтева и блок `_attribution` који мораш приказати.

Блок `_attribution`
{
  "source": "National hydrological services of the Danube basin (see /v1/meta/sources)",
  "url": "https://danubealert.com/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.com/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"
}

Станице

  • GET/api/v1/alerts/confirmЛинк за потврду упозорења или дневног извештаја послат имејлом: ништа не укључује, отвара страницу за потврду

    Линк из имејла за потврду упозорења или дневног извештаја, који се шаље док налог још није доказао своју адресу. **Не укључује ништа** ( скенери линкова у фирмама сами отварају имејлове ): прегледач се води на јавну страницу `/{lang}/alerts/confirm`, са једним дугметом које шаље `POST /alerts/confirm`. Са `format=json` ( или `Accept: application/json` ) враћа само стање: 200 са `status` `pending` / `active`, 404 за неважећи токен.

    Параметри

    • 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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • POST/api/v1/alerts/confirmУкључује упозорење или дневни извештај са странице за потврду ( једини корак који га активира )

    Једини корак који укључује претплату ( `activ = true` ): дугме странице за потврду или клијент, са токеном у упиту ( `t` ) или у телу ( `{ "t": "…" }` ). Покреће се само претплата која још чека; она коју је корисник у међувремену искључио из налога остаје искључена. Овде се доказује и адреса налога. Прегледач се води на јавну страницу претплате ( „укључена” ), клијент добија JSON ( `kind`: `alert` / `report` ).

    Параметри

    • tquery
  • GET/api/v1/basin-precipitationЗбир падавина за 24 / 72 ч по подсливу, везан за станицу низводно

    Киша сакупљена у последња завршена 24 ч и 72 ч, по подсливу: тачка израчунавања је станица на горњем току, а ред је везан за станицу низводно — претходни сигнал раста нивоа тамо. Сатни низ долази из отвореног временског извора ( CC BY 4.0, види `_attribution` ); `window_end` је тренутак до којег су сати сабрани ( искључиво ), а `hours_24h` / `hours_72h` кажу колико је сати са вредношћу ушло у сваки прозор. Подслив чије је извршавање пало задржава последњи `window_end`.

    Параметри

    • 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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/countries/{code}/stationsСтанице једне земље

    Исти редови као `/stations`, филтрирани по земљи; сваки има блок `quality` ( референтни извор, последње очитавање, стање G3 и нула водомера ).

    Параметри

    • 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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/report/todayДан у једном објекту: стање слива, шта се данас мења, станице изнад / испод прагова, прогноза за 24–72 ч

    Дневни извештај као један објект, за страницу `/{lang}/today` ( UX-9 ). `basin` је тачно агрегат „Данашња ситуација” ( укупно и редови по земљи ), `changes` је блок F4 ( варијација у 24 ч, талас Q74, одступање D2 ), `thresholds` наводи станице са свежим очитавањем испод LDC / изнад HDC ( са прагом, нивоом и разликом ), а `forecast` даје прогнозу **24–72 ч** из G2 ( извор, издање, хоризонт извора, мин–макс опсег по хоризонту и `orientativ` ), само за станице са значајном прогнозом: достиже праг или се помера најмање 25 см у односу на садашњи ниво. Списак је ограничен ( 12 по сливу, 3 по земљи ), са укупним пре ограничења; дани 4–5 ( +96 / +120 ч ) нису део извештаја.

    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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/stationsСписак станица

    Страничени списак станица, са нивоом, прогнозом и блоком `quality` у сваком реду: референтни извор, време последњег очитавања, стање G3 ( свеже / „старо очитавање” / без података ) и нула водомера ( национална / друга / апсолутна / непозната ).

    Параметри

    • 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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/stations/{slug}Станица, њени прагови LDC/HDC и одступање дана од климатологије

    Страница станице: прагови LDC/HDC, координате, свежина референтног извора ( Q88 ), покривеност низа од 365 дана ( Q94 ), блок `quality` — референтни извор, последње очитавање, стање G3 и нула водомера ( H4 ) —, блок `anomaly` — одступање данашњег нивоа од климатологије дана ( D1 ), одсутан испод 10 референтних година — и, кад станица има прогнозу, блок `forecast` са извором, `horizon_hours` ( докле прогноза досеже ) и хоризонтима са њиховим мин–макс опсегом ( G2, UX-11 §8.1 стр. 6 ).

    Параметри

    • 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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/stations/{slug}/eventsИсторијске поплаве и суше једне станице

    Велике поплаве и суше документоване за станицу, најновије прво ( година, затим дан врха ). Сваки ред има врсту, годину, дан врха кад га извор објави, вредност на водомеру станице са његовом јединицом, код извора, институцију и јавни URL. `?tip=viitura|seceta` филтрира врсту. Редови долазе из уредничке колекције `evenimente-istorice`, где су извор и доказ сваког реда обавезни. `_attribution.data_updated_at` је најновији датум провере враћених редова.

    Параметри

    • 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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/stations/{slug}/neighborsСуседи узводно / низводно и ушћа

    Параметри

    • 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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v2/stationsСписак станица ( v2, курсор + поља + формат )

    Исти подаци као `/v1/stations`, са уговором списка v2: страничење курсором типа keyset, `fields=` и `format=json|csv|geojson`. Одговор се може кеширати (`ETag`, `Last-Modified`, `Cache-Control`), а `If-None-Match` враћа `304`.

    Параметри

    • 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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/wizardПодаци чаробњака за упозорења: деонице, земље, реке и претрага

    Деонице Дунава од извора до ушћа ( по земљама, са распоном километара и станицама деонице ) и реке сваке земље, поређане по броју станица. Са `q` претражују се станице и реке по имену; дијакритици и ћирилица су прихваћени; `limit` ( 1–50 ) ограничава листе. Кеширано као остали каталог.

    Параметри

    • qquery
    • limitquery
    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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

Мерења и прогнозе

  • GET/api/v1/forecast/accuracyТачност званичних прогноза у односу на измерене вредности, по извору и периоду ( +24 / +48 / +72 ч )10/min

    Бектест редова из `forecasts` у односу на стварна очитавања из `readings`, по извору × хоризонту ( +24 / +48 / +72 ч ): просечна апсолутна грешка ( `mae_cm` ), пристрасност са знаком ( `bias_cm`, позитивно = прогноза је била превисока ) и проценат очитавања унутар објављеног мин–макс опсега ( `within_band_pct`, само на узорцима са опсегом ). Списак има све изворе са прогнозом у прозору, укључујући оне без парова још ( `samples: 0`, `null` просеци ). Подразумевани прозор: 90 дана после циљног тренутка; свака прогноза се пореди са најближим очитавањем унутар ±6 ч, преферирајући низ издаваоца, иначе референтни извор станице. Без очитавања у прозору, прогноза не улази у узорак. Без `station`, агрегат је за цео слив; са `station`, само за тражену станицу — исте бројке као `/stations/{slug}/forecast-accuracy`. Тежак крајњи пункт: 10 захтева/мин.

    Параметри

    • 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"])

    Лимит захтева: Захтевна рута: 10 захтева/минуту, и са кључем.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/measurementsТемпература воде, проток, температура ваздуха

    Параметри

    • 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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/observationsПоређење до 6 станица у једном одговору10/min

    Иста правила као код осматрања једне станице; `interval` је подразумевано `daily`, а ограничење захтева је тешко ( 10/мин ).

    Параметри

    • 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"])

    Лимит захтева: Захтевна рута: 10 захтева/минуту, и са кључем.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/stations/{slug}/climatologyКлиматологија по дану у години из целог низа: просек, медијана и перцентили10/min

    Референтни низ станице за сваки календарски дан ( `MM-DD` ): из целе историје дневног збира, колико је година допринело, просек, медијана, перцентили 10 / 25 / 75 / 90, минимум, максимум и стандардна девијација. Вредност дана је прво очитавање локалног дана из стварног референтног извора станице. Основа за „данас је X см испод уобичајеног за овај дан”; само одступање је у блоку `anomaly` странице станице и у `GET /summary/today`.

    Параметри

    • 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"])

    Лимит захтева: Захтевна рута: 10 захтева/минуту, и са кључем.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/stations/{slug}/dischargeНиз протока ( м³/с )

    Низ протока из табеле `masuratori` ( мерна величина `debit` ), који пишу националне хидролошке службе. Један одговор садржи само један извор ( `source` ): без `source=` узима се извор најновијег мерења протока, да се низови различитих извора не би мешали. `interval=hourly|daily` агрегира просеком. Тежак крајњи пункт: 10 захтева/минут анонимно.

    Параметри

    • 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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/stations/{slug}/forecastПрогноза станице ( где постоји )

    Последње издање из једног извора ( `source` ); низови различитих извора се не мешају. `horizon_hours` каже докле досеже прогноза издања ( од +48 ч до +120 ч, зависно од извора ), а сваки хоризонт има опсег мин–макс који извор објављује ( `level_min_cm` / `level_max_cm`, `null` где га не даје ). Дани 4–5 ( +96 / +120 ч ) имају `orientativ: true`: појављују се у подацима, али не покрећу упозорења — мотор користи само 24–72 ч.

    Параметри

    • 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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/stations/{slug}/forecast-accuracyТачност прогнозе на једној станици, по извору и периоду: колико је прогноза овде добра10/min

    Бектест прогноза издатих за станицу из путање, у односу на њена стварна очитавања, по извору × хоризонту ( +24 / +48 / +72 ч ): просечна апсолутна грешка ( `mae_cm` ), пристрасност са знаком ( `bias_cm`, позитивно = прогноза је била превисока ) и проценат очитавања унутар објављеног мин–макс опсега ( `within_band_pct` ). Списак има **све изворе са прогнозом** за станицу у прозору; извор без иједног пара прогноза–очитавање ипак се појављује, са `samples: 0` и `null` просецима. Подразумевани прозор: 90 дана после циљног тренутка; очитавање се узима на ±6 ч, преферирајући низ издаваоца, иначе референтни извор станице. Исте бројке као `/forecast/accuracy?station=<slug>`. Тежак крајњи пункт: 10 захтева/мин.

    Параметри

    • 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"])

    Лимит захтева: Захтевна рута: 10 захтева/минуту, и са кључем.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/stations/{slug}/iceЛедене појаве из националних билтена, уједначене по станици и дану

    Зимске појаве објављене у националним билтенима, уједначене по станици и дану. Данашњи извор је дневни национални билтен: колона `L` ( индекс 0–8 ) постаје `code`, а `phenomena` садржи канонске енглеске кодове ( `ice_floe`, `ice_bridge`, `shore_ice`… ). Дан са индексом 0 је стварно осматрање ( `ice: false`, `code: 0`, `phenomena: []` ), не недостатак података. RO / BG / RS / HU не објављују појаву по станици у дневном билтену ( види опис извора ), па се овде не појављују.

    Параметри

    • 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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/stations/{slug}/observationsНиз водостаја ( см )10/min

    Тежак крајњи пункт за дугу анонимну историју: 10 захтева/минут ( §3 ). Подразумевано је низ **референтног извора** станице ( национални извор; `source` у телу ). Историја је слојевита: `source=` тражи низ одређеног извора, а `include_legacy=true` додаје блок `legacy` са legacy низом ( други водомер: `level_cm` како га извор објављује, `level_cm_aligned` сведен на нулу националног водомера кад је нула позната ). Низови се у `data` не мешају.

    Параметри

    • 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"])

    Лимит захтева: Захтевна рута: 10 захтева/минуту, и са кључем.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/stations/{slug}/percentileПерцентил данашње вредности у односу на исти дан у последњих 30 година10/min

    Ниво последњег дана ( прво очитавање локалног дана, референтни извор ) у односу на исти календарски дан у последњих 30 година. `percentile` је 0…100, `category` је једна од very_low / low / normal / high / very_high; испод 10 референтних година `percentile` је null. Један упит над прозором година, не један по дану.

    Параметри

    • 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"])

    Лимит захтева: Захтевна рута: 10 захтева/минуту, и са кључем.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/stations/{slug}/recordsИсторијски рекорди10/min

    Параметри

    • 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"])

    Лимит захтева: Захтевна рута: 10 захтева/минуту, и са кључем.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/stations/{slug}/same-dayИсти дан ранијих година10/min

    Параметри

    • 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"])

    Лимит захтева: Захтевна рута: 10 захтева/минуту, и са кључем.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/stations/{slug}/winterЗимске појаве и дебљина леда

    Зимска осматрања објављена за станицу, најновија прво: текст појаве и/или дебљина леда у см. Без осматрања, списак је празан.

    Параметри

    • 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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/summary/low-waterНиски водостаји: узастопни дани испод LDC, по сектору, са историјом и поређењем

    Хидролошка суша на Дунаву, по секторима ( земље реке, од узводно ка низводно ): за изабрану годину, најдужи непрекинути период испод LDC неке станице у сектору, рекордна станица, колико је станица имало ниске водостаје, станица-дани испод LDC, историја сектора и поређење са референтним годинама 2003, 2015, 2018 и 2022. Иста правила као картица „Ниски водостаји” на `/{lang}/statistics`: прагови се оцењују на референтном очитавању из збира, а дан који недостаје прекида период.

    Параметри

    • 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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/summary/todayДанашња ситуација: водостаји, прагови, прогнозе, одступања дана и шта се данас мења у сливу

    Дневни агрегат, по свакој земљи: колико је станица испод LDC и изнад HDC ( са процентом станица које имају прагове ), колико их нема очитавање у последњих 48 ч, тренд у 24 ч ( расте / опада / стабилно ) и прогноза за следећих 24–72 ч. D2 додаје одступање од уобичајеног за дан ( климатологија D1 ): колико је станица изнад p75, испод p25 или у уобичајеном опсегу, и ранг највећих стандардизованих одступања. F4 додаје „шта се данас мења”: прве значајне промене из варијације у 24 ч, из таласа Q74 ( време путовања узводно → низводно ) и из одступања D2, по сливу ( `changes` ) и по земљи ( `changes_by_country` ). Иста правила као страница `/{lang}/today`: прагови се оцењују на свежем референтном очитавању, а прогноза долази из једног издања.

    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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

Реке и земље

  • GET/api/v1/countriesЗемље у сливу
    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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/riversРеке у сливу и број њихових станица
    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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/rivers/{rau}Граф реке: ушће, притоке, земље

    Параметри

    • 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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v2/countriesЗемље у сливу, страничење курсором ( v2 )

    Земље из регистра слива, са именима на језицима производа; курсор је ISO код.

    Параметри

    • 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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v2/riversРеке у сливу, страничење курсором ( v2 )

    Реке из регистра станица, са бројем станица по земљи. Курсор је нормализовани код реке; `fields=` и `format=json|csv|geojson` важе исто на свим списковима v2.

    Параметри

    • 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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

Извози

  • GET/api/v1/export/country/{cod}Извоз CSV / JSON по земљи10/min

    Параметри

    • 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"])

    Лимит захтева: Захтевна рута: 10 захтева/минуту, и са кључем.

    И извоз садржи `_attribution`, са лиценцом у `_attribution.license` (CC BY 4.0); прикажи `_attribution.source`, `_attribution.url` и лиценцу поред датотеке.

  • GET/api/v1/export/dailyДневни извоз CSV / JSON по земљи10/min

    Датотека претходног дана за једну земљу слива, са лиценцом CC BY 4.0 и навођењем извора. CSV их ставља у заглавља `Link`, `X-Attribution*` и `X-License*`; JSON у `_attribution` ( укључујући `license` ). Одговор се може кеширати: `ETag`, `Last-Modified`, `Cache-Control`, а `If-None-Match` враћа 304 са истим заглављима.

    Параметри

    • 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"])

    Лимит захтева: Захтевна рута: 10 захтева/минуту, и са кључем.

    И извоз садржи `_attribution`, са лиценцом у `_attribution.license` (CC BY 4.0); прикажи `_attribution.source`, `_attribution.url` и лиценцу поред датотеке.

  • GET/api/v1/export/rangeИзвоз дугих периода за истраживаче ( CSV / Parquet, страничење курсором и лиценца за сваки ред )10/min

    Једна страница дневног збира (`readings_daily`) за период `from`–`to`, само из извора са изричитом лиценцом за даљу дистрибуцију ( регистар лиценци Q90 ). Сваки ред има колону `license` извора; потпуно навођење и URL услова су у манифесту `/export/range/licenses` и у заглављима `X-License` / `X-Attribution` / `Link`. Страничење иде преко `cursor` ( `X-Next-Cursor`, `Link: rel="next"` ), везаног за филтере отиском: две узастопне странице не понављају и не прескачу редове. Без кључа: највише 366 дана и 500 редова по страници; с кључем (`Authorization: Bearer`): 20 година и 5 000 редова по страници. Извоз је тежак крајњи пункт ( 10 захтева/минут ).

    Параметри

    • 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"])

    Лимит захтева: Захтевна рута: 10 захтева/минуту, и са кључем.

    И извоз садржи `_attribution`, са лиценцом у `_attribution.license` (CC BY 4.0); прикажи `_attribution.source`, `_attribution.url` и лиценцу поред датотеке.

  • GET/api/v1/export/range/licensesЛиценце извора и начин навођења за извоз периода

    Манифест извора који се могу појавити у `GET /export/range`: само они са изричитом лиценцом за даљу дистрибуцију, сваки са институцијом, лиценцом, URL-ом услова, навођењем, извршеном трансформацијом ( дневни збир ) и датумом провере. Одбијен или непознат извор не појављује се у манифесту и не извози се.

    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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    И извоз садржи `_attribution`, са лиценцом у `_attribution.license` (CC BY 4.0); прикажи `_attribution.source`, `_attribution.url` и лиценцу поред датотеке.

  • GET/api/v1/export/river/{rau}Извоз CSV / JSON по реци10/min

    Параметри

    • 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"])

    Лимит захтева: Захтевна рута: 10 захтева/минуту, и са кључем.

    И извоз садржи `_attribution`, са лиценцом у `_attribution.license` (CC BY 4.0); прикажи `_attribution.source`, `_attribution.url` и лиценцу поред датотеке.

Прагови, пловидба, билтени

  • GET/api/v1/bulletinsХидролошки билтени по земљи

    Параметри

    • 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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/navigationКритичне тачке и ограничења пловидбе

    Само активни редови; истекла ограничења ( прошао `data_end` ) се више не враћају, а ограничења долазе само из сачуваних званичних извора. Одговор је сортиран по rkm.

    Параметри

    • 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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/thresholdsЗванични прагови ( LDC/HDC, RNW/HSW, одбрана од поплава )

    Само активни прагови ( архивске вредности остају у платформи са `activ: false` и не објављују се ). `station` је slug станице; непознат slug враћа 404.

    Параметри

    • 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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v2/bulletinsХидролошки билтени, страничење курсором ( v2 )

    Национални билтени, најновији прво; `country` филтрира, курсор је id билтена.

    Параметри

    • 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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v2/navigationПловидба, један страничени списак ( v2 )

    Критичне тачке и активна ограничења у једном списку, сваки ред са `kind` (`punct_critic` или `restrictie` ); курсор саставља `kind:id`. Геометрија постоји на тачкама.

    Параметри

    • 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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v2/thresholdsЗванични прагови, страничење курсором ( v2 )

    Активни прагови, са `station` ( slug ) као филтером; курсор је id прага. Непознат slug враћа 404, као у v1.

    Параметри

    • 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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

Епизоде упозорења

  • GET/api/v1/episodesЈавне епизоде LDC/HDC

    Параметри

    • 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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/episodes/{id}Једна епизода упозорења

    Параметри

    • 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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

GeoJSON

  • GET/api/v1/geojson/riversПловна линија Дунава + Сава / Тиса
    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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/geojson/stationsFeatureCollection станица

    Параметри

    • 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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

Извори и квалитет података

  • GET/api/v1/meta/availabilityМесечна доступност по извору ( 12 месеци ): дани са подацима и последња преузимања

    Јавни извештај „транспарентност података”: по један месец за сваки извор, за последњих 12 календарских месеци, са избројаним данима (`days`, текући месец само до јуче), данима са најмање једним очитавањем (`days_with_data`) и њиховим процентом. `last_7_days` даје извршавања и неуспехе последњих 7 дана из дневника Q62 (`runs` / `failures`; `null` = нема дневника). Само бројке: без порука о грешци, без URL-ова, без детаља станице. Без дневног збира ( инстанца без уноса ) `sources` је празан, не „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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/meta/healthСтање извора
    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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/meta/qualityКвалитет података по станици: сумњива очитавања и стање извора

    Агрегат по станици: број сумњивих очитавања ( одступање преко прага од медијане суседа ±6 ч ), последње очитавање и стање извора које га је донело ( `source_state`: `ok`, `eroare`, `stale` — „без очитавања у року” ).

    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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v1/meta/sourcesПоследње ажурирање по извору

    Један ред по извору преузимања: последње успешно извршавање, његово стање, SLA, **последње писање**, **прочитани редови и записана очитавања у последња 24 ч**, **доступност током 7 и 30 дана**, **просечно кашњење** података ( просечна старост најсвежијег очитавања, током 7 дана ) и **последња грешка** ( сачувана и после повратка извора ). `stare` може бити `cazuta` кад извор није ништа уписао више од 2 × свог интервала, а `eroare` значи да је последње извршавање пало **и** да су претходни подаци изашли из SLA-а извора; мрежни прекид док су подаци још у року оставља `stare` непромењен ( грешка остаје у `ultima_eroare` ). `uptime_7d` / `uptime_30d` су разломци 0–1; `null` = прозор се не може израчунати или `readings` тренутно није доступан, не „савршен извор”.

    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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

  • GET/api/v2/meta/sourcesИзвори података, страничење курсором ( v2 )

    Последње извршавање и квалитет током времена по извору; курсор је код извора. Поља су она из `/v1/meta/sources`.

    Параметри

    • 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"])

    Лимит захтева: Анонимно: 60 захтева/минуту (клизећи прозор); са `Authorization: Bearer <кључ>`: 600/минуту.

    Одговор садржи `_attribution`; прикажи `_attribution.source` и `_attribution.url` поред података.

Ограничење захтева

Клизни прозор од 60 секунди; низ мерења је захтевна крајња тачка (10 у минуту). Изнад ограничења: 429 са retry_after_seconds у телу и заглављима Retry-After и X-RateLimit-*. Одбијени захтеви не троше следећи прозор.

Ограничење захтева
ЗаглављеЗначење
X-RateLimit-Limit60 / 600 / 3000 / 10
X-RateLimit-Remaining0 … limit
Retry-Afters ( 429 )
429 · retry_after_secondsJSON

Типизирани TypeScript клијент

Типови генерисани директно из уговора — свака рута, параметар и одговор, без ручно писаних модела.

TypeScript
npx openapi-typescript https://danubealert.arcm.ro/api/v1/openapi.sr.json -o danubealert.d.ts

import type { paths } from './danubealert'
type Observatii = paths['/stations/{slug}/observations']['get']['responses']['200']['content']['application/json']

Извоз отворених података

Датотеке претходног дана, један ред по станици, за сваку земљу слива, у CSV или JSON формату. Одговори се могу чувати у кешу (ETag, Last-Modified, Cache-Control); лиценца и навођење извора налазе се у заглављима датотеке и у блоку _attribution у JSON-у.

Лиценца: Creative Commons Attribution 4.0 International · Навођење извора: DanubeAlert и националне хидролошке службе · Претходни дан, у временској зони земље.

Конфигуратор виџета

Водостај станице на вашем сајту: изаберите станицу, тему, језик и брендинг, погледајте виџет уживо и копирајте iframe код у било који CMS.

Твоји виџети у три корака

Изабери врсту и подешавања — преглед и исечак се одмах ажурирају.

Тема
Величина

Преглед ( минијатура )

Исечак за уметање

<iframe
  src="https://danubealert.arcm.ro/embed/v1/station?slug=achleiten&theme=auto&lang=rs&accent=00BABE"
  title="Danube water level — Ахлајтен"
  width="100%"
  height="300"
  style="border:0;max-width:640px;"
  loading="lazy"
  referrerpolicy="strict-origin-when-cross-origin"
></iframe>

Цео уговор: /api/v1/openapi.sr.json · /api/v1/openapi.json · Подаци: националне хидролошке службе, преко DanubeAlert-а