KOSAVA v7 OpenData
Agencija za zaštitu životne sredine SEPA — API Documentation
Портал омогућава приступ подацима о квалитету ваздуха и метеоролошким параметрима из мрежа за праћење. API је доступан искључиво за читање: нема уписа података, нема аутентикације и нема ограничења броја захтева. Сви приказани подаци припадају организацији назначеној на самом порталу.
Аутентикација
Овај API не захтева аутентикацију. Сви ендпоинти су јавно доступни. Нема API кључева, токена нити сесијских колачића. Једноставно шаљите HTTP GET захтеве на било који ендпоинт наведен испод.
Метод аутентикације
Нема
Акредитиви нису потребни ни за један ендпоинт. Портал је дизајниран као отворени ресурс јавних података за јавну употребу.
Конфигурација сервера
KEY_PREFIX & EXPECTED_SCHEMA_VERSION
Ово су серверске променљиве окружења које оператор поставља при постављању. Оне везују портал за именски простор података једне организације и примењују компатибилност снимка — нису API параметри.
Base URL и формат одговора
Основна URL адреса зависи од окружења. Све путање у овој документацији су релативне у односу на корен портала. За локалну развојну инстанцу основна URL адреса је обично http://localhost:8000.
Формат одговора
JSON (application/json)
Сви ендпоинти података враћају Content-Type: application/json. Ендпоинт за извоз (/portal/export) враћа бинарно преузимање датотеке. HTML руте портала враћају text/html.
Прозори мерења
1h · 1d · 7d · 14d · 30d
Снимак садржи унапред агрегисане податке за пет временских прозора. Нису сви прозори присутни у сваком снимку — проверите поље supported_windows на GET /meta.
Кодови грешака
Све грешке се враћају као JSON са пољем које описује проблем. Health ендпоинти враћају поља уместо тога.
Успех
Захтев је успешан. Тело одговора садржи тражене податке.
Неисправни параметри
Један или више обавезних параметара упита недостаје, празан је, није валидан цео број (за ID-еве), или има неподржану вредност (за window или format).
Ресурс није пронађен
Организација, станица, компонента или тражени подаци мерења не постоје у активном снимку или немају јавно доступних података.
Сервис недоступан
Redis је недоступан, показивач активног снимка недостаје, или верзија шеме снимка не одговара EXPECTED_SCHEMA_VERSION. Портал није спреман за послуживање података.
Health
Лагане пробе за оркестраторе контејнера и баласере оптерећења. Ниједан ендпоинт не захтева аутентикацију нити приступа подацима мерења.
Потврђује да је процес жив и да HTTP сервер прихвата везе. Овај ендпоинт не изводи никакав I/O и увек враћа 200 OK док год процес ради. Користите као пробу живости контејнера.
Одговори
| Статус | Опис | Пример тела |
|---|---|---|
| 200 | Процес је жив | {"status":"ok","check":"live"} |
Примери кода
curl -s http://opendata.kosava.cloud/health/live
import requests resp = requests.get("http://opendata.kosava.cloud/health/live") print(resp.json()) # {"status": "ok", "check": "live"}
const resp = await fetch("http://opendata.kosava.cloud/health/live"); const data = await resp.json(); console.log(data); // { status: "ok", check: "live" }
Проверава да ли је Redis конекција исправна и да ли верзија активног снимка одговара EXPECTED_SCHEMA_VERSION. Враћа 200 са snapshot_id када је спреман. Враћа 503 када Redis није доступан, показивач снимка недостаје или верзија шеме није компатибилна. Користите као пробу спремности контејнера и здравствену капију баласера оптерећења.
Одговори
| Статус | Опис | Пример тела |
|---|---|---|
| 200 | Redis доступан, снимак компатибилан | {"status":"ok","check":"ready","snapshot_id":"snap_20240101_120000"} |
| 503 | Redis недоступан или некомпатибилна шема | {"status":"error","check":"ready","detail":"..."} |
Примери кода
curl -s http://opendata.kosava.cloud/health/ready
import requests resp = requests.get("http://opendata.kosava.cloud/health/ready") if resp.status_code == 200: print("Ready:", resp.json()["snapshot_id"]) else: print("Not ready:", resp.json()["detail"])
const resp = await fetch("http://opendata.kosava.cloud/health/ready"); const data = await resp.json(); if (resp.ok) console.log("Snapshot:", data.snapshot_id); else console.error("Not ready:", data.detail);
Метаподаци
Ендпоинти за откривање структуре скупа података: организације, мреже за праћење, станице и компоненте мерења. Почните овде да сазнате које ID-еве користити у упитима мерења. Сви метаподаци долазе из активног Redis снимка и само су за читање.
Враћа манифест тренутно активног Redis снимка: временску ознаку генерисања, подржане прозоре мерења и агрегатне бројеве за организације, мреже, станице, компоненте и редове мерења. Користите supported_windows да сазнате које вредности прозора су важеће за упите мерења.
Одговори
| Статус | Опис |
|---|---|
| 200 | Објекат манифеста активног снимка |
| 503 | Снимак недоступан или некомпатибилан |
Примери кода
curl -s http://opendata.kosava.cloud/meta | python3 -m json.tool
import requests meta = requests.get("http://opendata.kosava.cloud/meta").json() print("Snapshot:", meta["generated_at"]) print("Windows:", meta["supported_windows"]) print("Stations:", meta["counts"]["stations"])
const meta = await fetch("/meta").then(r => r.json()); console.log(meta.supported_windows); // ["1h","1d","7d","14d","30d"] console.log(meta.counts.stations); // 12
Враћа све организације у активном снимку. Пошто је једна инстанца портала везана за једну организацију путем KEY_PREFIX, ова листа обично садржи тачно један унос. Сваки објекат укључује organization_id, name и short_name.
Одговори
| Статус | Опис |
|---|---|
| 200 | Низ објеката организација |
| 503 | Снимак недоступан |
Примери кода
curl -s http://opendata.kosava.cloud/organizations
orgs = requests.get("http://opendata.kosava.cloud/organizations").json() org_id = orgs[0]["organization_id"] # typically 1 org
const orgs = await fetch("/organizations").then(r => r.json()); const orgId = orgs[0].organization_id;
Враћа све мреже за праћење дефинисане у активном снимку. Мреже групишу станице унутар именованог програма мерења или географског подручја. Сваки објекат укључује network_id, network_code, name и short_name.
Одговори
| Статус | Опис |
|---|---|
| 200 | Низ објеката мрежа |
| 503 | Снимак недоступан |
Примери кода
curl -s http://opendata.kosava.cloud/networks
networks = requests.get("http://opendata.kosava.cloud/networks").json() for n in networks: print(n["network_code"], "-", n["name"])
const networks = await fetch("/networks").then(r => r.json()); networks.forEach(n => console.log(n.network_code, n.name));
Враћа све јавне станице за праћење у свим организацијама и мрежама у активном снимку. Сваки објекат укључује station_id, station_name, station_code, organization_id, network_id, network_code и географска поља као што су city и municipality где су доступна. За филтрирање по организацији користите GET /{organization_id}/stations.
Одговори
| Статус | Опис |
|---|---|
| 200 | Низ објеката станица |
| 503 | Снимак недоступан |
Примери кода
curl -s http://opendata.kosava.cloud/stations
stations = requests.get("http://opendata.kosava.cloud/stations").json() for s in stations: print(s["station_id"], s["station_name"], s["city"])
const stations = await fetch("/stations").then(r => r.json()); console.log(`${stations.length} stations found`);
Враћа све компоненте мерења (загађивачи и метеоролошки параметри) дефинисане у активном снимку. Сваки објекат укључује component_id, short_name и unit. Овде се појављују само јавно видљиве компоненте. Метеоролошки параметри укључују брзину ветра, температуру, влажност и падавине; параметри загађења укључују честице (PM10, PM2.5) и гасовите загађиваче.
Одговори
| Статус | Опис |
|---|---|
| 200 | Низ објеката компоненти |
| 503 | Снимак недоступан |
Примери кода
curl -s http://opendata.kosava.cloud/components
components = requests.get("http://opendata.kosava.cloud/components").json() pm10 = next(c for c in components if c["short_name"] == "PM10") print(pm10["component_id"], pm10["unit"]) # 1001 ug/m3
const components = await fetch("/components").then(r => r.json()); const pm10 = components.find(c => c.short_name === "PM10"); console.log(pm10.component_id, pm10.unit);
Враћа све јавне станице за праћење за одређену организацију. Облик одговора је идентичан GET /stations, али филтриран по датом organization_id. Враћа 404 ако организација не постоји или нема јавних станица у активном снимку.
Параметри путање
| Назив | Тип | Обавезно | Опис |
|---|---|---|---|
organization_id |
integer | да | ID организације. Добити са GET /organizations. |
Одговори
| Статус | Опис |
|---|---|
| 200 | Низ објеката станица за организацију |
| 404 | Организација није пронађена или нема јавних станица |
| 503 | Снимак недоступан |
Примери кода
curl -s http://opendata.kosava.cloud/1/stations
org_id = 1 stations = requests.get( f"http://opendata.kosava.cloud/{org_id}/stations" ).json() print(f"{len(stations)} stations in org {org_id}")
const orgId = 1; const stations = await fetch(`/${orgId}/stations`).then(r => r.json()); console.log(`${stations.length} stations`);
Враћа детаљне метаподатке за једну станицу, укључујући листу јавних компоненти мерења (public_components) доступних за ту станицу. Сваки унос компоненте укључује component_id, short_name и unit. Ово је полазна тачка за откривање које компоненте могу бити упитане путем ендпоината мерења. Враћа 404 ако организација или станица не постоје у активном снимку.
Параметри путање
| Назив | Тип | Обавезно | Опис |
|---|---|---|---|
organization_id |
integer | да | ID организације. Добити са GET /organizations. |
station_id |
integer | да | ID станице. Добити са GET /stations. |
Одговори
| Статус | Опис |
|---|---|
| 200 | Објекат метаподатака станице са уграђеним низом public_components |
| 404 | Организација или станица нису пронађене |
| 503 | Снимак недоступан |
Примери кода
curl -s http://opendata.kosava.cloud/1/stations/101/meta
meta = requests.get( "http://opendata.kosava.cloud/1/stations/101/meta" ).json() for comp in meta["public_components"]: print(comp["component_id"], comp["short_name"], comp["unit"])
const meta = await fetch("/1/stations/101/meta").then(r => r.json()); meta.public_components.forEach(c => console.log(c.component_id, c.short_name, c.unit) );
Мерења
Ендпоинти за преузимање временских серија података о мерењима животне средине. Све вредности су унапред израчунате у активном Redis снимку — нема агрегације у реалном времену. Користите ендпоинте метаподатака да бисте прво пронашли важеће ID-еве организације, станице и компоненте.
Враћа нормализоване податке временских серија за једну компоненту на једној станици током траженог временског прозора. Сва четири параметра упита су обавезна. Одговор укључује назив станице, детаље компоненте, коришћени прозор и низ points сортиран узлазно по датуму и времену. Свака тачка има date (ГГГГ-ММ-ДД), time (ЧЧ:ММ) и нумеричку вредност value. Параметар window мора бити један од: 1h, 1d, 7d, 14d, 30d — и мора бити присутан у supported_windows снимка.
Параметри упита
| Назив | Тип | Обавезно | Опис | Пример |
|---|---|---|---|---|
organization_id |
integer | да | ID организације | 1 |
station_id |
integer | да | ID станице | 101 |
component_id |
integer | да | ID компоненте | 1001 |
window |
string | да | Временски прозор. Један од: 1h 1d 7d 14d 30d | 1d |
Одговори
| Статус | Опис |
|---|---|
| 200 | Нормализовано тело временских серија са низом points |
| 400 | Недостаје, празан или неисправан параметар; неподржана вредност прозора |
| 404 | Станица или компонента није пронађена, или нема података за прозор |
| 503 | Снимак недоступан |
Примери кода
curl -s \ "http://opendata.kosava.cloud/measurements?organization_id=1&station_id=101&component_id=1001&window=1d"
import requests resp = requests.get( "http://opendata.kosava.cloud/measurements", params={ "organization_id": 1, "station_id": 101, "component_id": 1001, "window": "1d", }, ) resp.raise_for_status() data = resp.json() print(f"{data['station_name']} — {data['component_short_name']} ({data['unit']})") for pt in data["points"]: print(pt["date"], pt["time"], pt["value"])
const params = new URLSearchParams({ organization_id: "1", station_id: "101", component_id: "1001", window: "1d", }); const resp = await fetch(`/measurements?${params}`); if (!resp.ok) throw new Error(await resp.text()); const data = await resp.json(); console.log(`${data.station_name} — ${data.component_short_name} (${data.unit})`); data.points.forEach(pt => console.log(pt.date, pt.time, pt.value));
Враћа сва мерења компоненти забележена у последњем сату за одређену станицу. Тело одговора садржи низ hours где сваки унос има date (ISO-8601 стринг датума), time (ЧЧ:ММ) и листу components. Сваки унос компоненте укључује component_id и нумеричку вредност value. Враћа 404 ако станица не постоји или нема података за последњи сат.
Параметри путање
| Назив | Тип | Обавезно | Опис |
|---|---|---|---|
organization_id |
integer | да | ID организације |
station_id |
integer | да | ID станице |
Одговори
| Статус | Опис |
|---|---|
| 200 | Тело за последњи сат са низом hours, сваки садржи листу components |
| 404 | Станица није пронађена или нема података за последњи сат |
| 503 | Снимак недоступан |
Примери кода
curl -s http://opendata.kosava.cloud/1/stations/101/measurements/last_hour
data = requests.get( "http://opendata.kosava.cloud/1/stations/101/measurements/last_hour" ).json() for hour in data["hours"]: print(hour["date"], hour["time"]) for comp in hour["components"]: print(" component", comp["component_id"], "=", comp["value"])
const data = await fetch("/1/stations/101/measurements/last_hour") .then(r => r.json()); data.hours.forEach(hour => { console.log(hour.date, hour.time); hour.components.forEach(c => console.log(" component", c.component_id, "=", c.value)); });
Враћа сва мерења компоненти забележена током последњих 24 сата за одређену станицу. Структура тела идентична је last_hour: низ hours где сваки унос има date, time и components. Све јавно изложене компоненте станице су укључене у сваки сатни унос где постоје подаци. Враћа 404 ако станица не постоји или нема података за последњих 24 сата.
Параметри путање
| Назив | Тип | Обавезно | Опис |
|---|---|---|---|
organization_id |
integer | да | ID организације |
station_id |
integer | да | ID станице |
Одговори
| Статус | Опис |
|---|---|
| 200 | Тело за последњих 24 сата са низом hours до 24 сатна уноса |
| 404 | Станица није пронађена или нема података за последњих 24 сата |
| 503 | Снимак недоступан |
Примери кода
curl -s http://opendata.kosava.cloud/1/stations/101/measurements/last_24h
data = requests.get( "http://opendata.kosava.cloud/1/stations/101/measurements/last_24h" ).json() print(f"{len(data['hours'])} hours of data")
const data = await fetch("/1/stations/101/measurements/last_24h") .then(r => r.json()); console.log(`${data.hours.length} hours of data`);
Извоз
Преузмите временске серије мерења као структурисану датотеку. Подржани формати су CSV (UTF-8), XLSX (Excel) и ODS (LibreOffice Calc). Извезена датотека садржи све контекстуалне колоне — организација, мрежа, станица, компонента, датум, време, јединица и нумеричка вредност.
Гради и стримује датотеку табеле за преузимање која садржи податке временских серија мерења за једну компоненту наједној станици. Свих пет параметара упита је обавезно. Прозор 1h није подржан за извоз. Извезена датотека садржи један ред по тачки мерења са колонама: organization_id, organization_name, station_id, station_name, station_code, network_id, network_code, date, time, component_id, component_short_name, unit, value. Нумеричке вредности су форматиране на две децимале.
Параметри упита
| Назив | Тип | Обавезно | Опис | Пример |
|---|---|---|---|---|
organization_id |
integer | да | ID организације | 1 |
station_id |
integer | да | ID станице | 101 |
component_id |
integer | да | ID компоненте | 1001 |
window |
string | да | Временски прозор. Један од: 1d 7d 14d 30d (1h није подржан) | 7d |
format |
string | да | Формат датотеке. Један од: csv xlsx ods | csv |
Одговори
| Статус | Content-Type | Опис |
|---|---|---|
| 200 | text/csv / application/vnd.openxmlformats-officedocument.spreadsheetml.sheet / application/vnd.oasis.opendocument.spreadsheet |
Преузимање датотеке са Content-Disposition: attachment |
| 400 | application/json | Недостаје/неисправан параметар или неподржан прозор/формат |
| 404 | application/json | Станица или компонента није пронађена, или нема података за прозор |
| 503 | application/json | Снимак недоступан |
Примери кода
# Download as CSV curl -OJ \ "http://opendata.kosava.cloud/portal/export?organization_id=1&station_id=101&component_id=1001&window=7d&format=csv" # Download as XLSX curl -OJ \ "http://opendata.kosava.cloud/portal/export?organization_id=1&station_id=101&component_id=1001&window=7d&format=xlsx"
import requests, re resp = requests.get( "http://opendata.kosava.cloud/portal/export", params={ "organization_id": 1, "station_id": 101, "component_id": 1001, "window": "7d", "format": "csv", }, ) resp.raise_for_status() # Extract filename from Content-Disposition header cd = resp.headers.get("Content-Disposition", "") m = re.search(r'filename="(.+?)"', cd) filename = m.group(1) if m else "export.csv" with open(filename, "wb") as f: f.write(resp.content) print(f"Saved: {filename}")
const params = new URLSearchParams({ organization_id: "1", station_id: "101", component_id: "1001", window: "7d", format: "csv", }); const resp = await fetch(`/portal/export?${params}`); if (!resp.ok) throw new Error(await resp.text()); const blob = await resp.blob(); const cd = resp.headers.get("content-disposition") ?? ""; const filename = (cd.match(/filename="(.+?)"/) ?? [])[1] ?? "export.csv"; // Trigger browser download const a = document.createElement("a"); a.href = URL.createObjectURL(blob); a.download = filename; a.click();
HVD API (/api/v1)
Јавни HVD-compliant API namespace у складу са Спроводбеном уредбом Комисије (EU) 2023/138 и SEPA HVD профилом. Све руте враћају машински читљив JSON са стандардизованим пољима: data_status=preliminary, aggregation_type=hourly_mean, time_start_utc/time_end_utc у ISO 8601 UTC формату. Постојећи /meta, /stations и /measurements уговор остаје нетакнут ради компатибилности.
Враћа комплетан HVD дескриптор: schema_version, dataset_version, snapshot_id, retention_days, декларисани data_status (preliminary), aggregation_type (hourly_mean), supported_windows, applicable_legislation (ELI линк на 2023/138), лиценцу, и линкове на правне странице (license, terms, qos, contact, dataset) и документацију (docs, redoc, openapi). Погодно за harvester-е и клијентске интеграционе провере.
Одговори
| Статус | Опис |
|---|---|
| 200 | Пун HVD дескриптор са лиценцом, retention политиком и линковима. |
| 503 | Снимак недоступан или некомпатибилан |
Примери кода
curl -s http://opendata.kosava.cloud/api/v1/metadata | python3 -m json.tool
import requests m = requests.get("http://opendata.kosava.cloud/api/v1/metadata").json() print(m["data_status"], m["retention_days"]) print(m["applicable_legislation"])
const meta = await fetch("/api/v1/metadata").then(r => r.json()); console.log(meta.license, meta.retention_days);
Враћа све monitoring станице у HVD облику (Компонента A стандарда). Свака станица носи station_id (string), station_name, latitude/longitude, municipality, station_type (traffic/urban/background/industrial/rural/other), operator, active, last_updated_utc и опциона поља (elevation_m, address, start_date, end_date, notes). Подржани филтери: active, municipality (case-insensitive), station_type, bbox (min_lon,min_lat,max_lon,max_lat).
Параметри упита
| Назив | Тип | Обавезно | Опис |
|---|---|---|---|
active | boolean | не | Филтер на активне станице. true враћа само активне, false само неактивне. |
municipality | string | не | Филтер по имену општине, case-insensitive exact match. |
station_type | string | не | Филтер по HVD enum типу станице (traffic, urban, background, industrial, rural, other). |
bbox | string | не | Bounding box "min_lon,min_lat,max_lon,max_lat" у WGS84. Враћа станице унутар boxa. |
Примери кода
curl -s "http://opendata.kosava.cloud/api/v1/stations?municipality=Kikinda"
stations = requests.get( "http://opendata.kosava.cloud/api/v1/stations", params={"bbox": "19,44,21,46"}, ).json() for s in stations: print(s["station_id"], s["station_name"], s["municipality"])
const stations = await fetch("/api/v1/stations?active=true").then(r => r.json()); stations.forEach(s => console.log(s.station_id, s.municipality));
Враћа контролисани речник мерних параметара (Компонента B стандарда). Сваки запис има parameter_code (нпр. PM10, PM2.5, NO2, O3, SO2), parameter_name, unit и фиксни averaging_period=1h. Опционо: cas_number, description.
Одговори
| Статус | Опис |
|---|---|
| 200 | Низ HVD parameter записа. |
| 503 | Снимак недоступан или некомпатибилан |
Примери кода
curl -s http://opendata.kosava.cloud/api/v1/parameters
params = requests.get("http://opendata.kosava.cloud/api/v1/parameters").json() codes = [p["parameter_code"] for p in params] # ['SO2', 'PM10', 'O3', 'NO2', 'PM2.5', ...]
const params = await fetch("/api/v1/parameters").then(r => r.json());
Враћа сатно упрошечена мерења у HVD облику (Компонента C). Сваки record има station_id, parameter_code, time_start_utc, time_end_utc, value, unit, data_status=preliminary, aggregation_type=hourly_mean, published_at_utc, updated_at_utc, coverage. Прозор се аутоматски сече на rolling 30 дана; meta блок одговора наводи requested_window и actual_window плус out_of_retention_window flag. Без филтера враћа све станице × све параметре (може бити велики payload).
Параметри упита
| Назив | Тип | Обавезно | Опис |
|---|---|---|---|
from | datetime | не | Почетак прозора, ISO 8601 datetime (нпр. 2026-04-01T00:00:00Z). Без TZ третира се као UTC. Default: generated_at - retention_days. |
to | datetime | не | Крај прозора, ISO 8601 datetime. Без TZ третира се као UTC. Default: generated_at. |
station_id | string | не | Филтер на једну станицу. HVD station_id је string верзија интерног ID-а. |
parameter_code | string | не | Филтер на један параметар (нпр. PM10, PM2.5, NO2). |
Примери кода
curl -s "http://opendata.kosava.cloud/api/v1/observations?station_id=1¶meter_code=PM10"
obs = requests.get( "http://opendata.kosava.cloud/api/v1/observations", params={ "from": "2026-04-01T00:00:00Z", "to": "2026-04-08T00:00:00Z", "parameter_code": "PM2.5", }, ).json() print(obs["meta"]["actual_window"]) print(len(obs["data"]), "records")
const q = new URLSearchParams({station_id: "1", parameter_code: "PM10"}); const resp = await fetch(`/api/v1/observations?${q}`).then(r => r.json()); console.log(resp.meta.out_of_retention_window);
Враћа листу bulk ресурса за активни snapshot. Сваки запис има name, format, content_type, size_bytes, sha256, download_url. Bundle укључује stations.csv/geojson, parameters.csv/json, observations CSV и Parquet (краћи ~13× од CSV-а), README.md са data dictionary-јем и CHECKSUMS.sha256. Lazy on-demand build са snapshot-id keyed cache-ом.
Одговори
| Статус | Опис |
|---|---|
| 200 | Индекс bulk пакета са SHA256 сумама. |
| 503 | Снимак недоступан или некомпатибилан |
Примери кода
curl -s http://opendata.kosava.cloud/api/v1/bulk | python3 -m json.tool
index = requests.get("http://opendata.kosava.cloud/api/v1/bulk").json() for r in index["resources"]: print(r["name"], r["size_bytes"], r["sha256"])
const idx = await fetch("/api/v1/bulk").then(r => r.json()); console.log(idx.snapshot_id, idx.resources.length);
Сервира један bulk фајл као attachment. Response заглавља укључују Content-Disposition (attachment; filename="..."), Content-Length, Content-Type и X-Content-SHA256 (мора се подударати са sha256 у индексу).
Параметри путање
| Назив | Тип | Обавезно | Опис |
|---|---|---|---|
filename | string | да | Име bulk ресурса из индекса (нпр. observations_hourly_preliminary_last30days.parquet). |
Одговори
| Статус | Опис |
|---|---|
| 200 | Bulk фајл као attachment са Content-Disposition и X-Content-SHA256 заглављима. |
| 404 | Тражени фајл не постоји у тренутном bulk пакету. |
| 503 | Снимак недоступан или некомпатибилан |
Примери кода
curl -O http://opendata.kosava.cloud/api/v1/bulk/observations_hourly_preliminary_last30days.parquet
import requests, pyarrow.parquet as pq from io import BytesIO data = requests.get("http://opendata.kosava.cloud/api/v1/bulk/observations_hourly_preliminary_last30days.parquet").content table = pq.read_table(BytesIO(data)) print(table.num_rows, table.column_names)
const blob = await fetch("/api/v1/bulk/stations.geojson").then(r => r.blob()); // feed blob to Leaflet, OpenLayers, etc.
Враћа DCAT-AP HVD каталог као application/ld+json са @context и @graph од 16 нодова: један dcat:Catalog, foaf:Organization (publisher) и vcard:Organization (контакт), три dcat:Dataset (stations, parameters, observations), девет dcat:Distribution (API + CSV/GeoJSON/JSON/Parquet по датасету), један dcat:DataService. Сваки Dataset/Distribution носи dcatap:applicableLegislation (ELI 2023/138) и dcatap:hvdCategory (Earth observation and environment). Погодно за harvest на EU/националним порталима.
Одговори
| Статус | Опис |
|---|---|
| 200 | DCAT-AP HVD каталог као application/ld+json са 16-node @graph. |
| 503 | Снимак недоступан или некомпатибилан |
Примери кода
curl -s -H "Accept: application/ld+json" http://opendata.kosava.cloud/api/v1/dcat
cat = requests.get("http://opendata.kosava.cloud/api/v1/dcat").json() datasets = [n for n in cat["@graph"] if n.get("@type") == "dcat:Dataset"] print(len(datasets), "datasets")
const cat = await fetch("/api/v1/dcat").then(r => r.json()); // JSON-LD compatible with rdflib, jsonld.js, Apache Jena
Речник поља (HVD Секција 11)
Структурни речник сваког поља из три компоненте скупа података. Дефиниције су доступне машински читљиво на endpoint-у /api/v1/data-dictionary и овде у три језика. Константне вредности и референце између компоненти су назначене у табелама.
Враћа JSON са дефиницијама свих поља у три компоненте (stations, parameters, observations) плус листу забрањених поља. Погодан за клијентске валидације и аутоматску генерацију форми/документације.
Параметри упита
| Назив | Тип | Обавезно | Опис |
|---|---|---|---|
language |
string | не | Језик дефиниција. Један од: sr-Latn, sr-Cyrl, en. Default: sr-Latn. |
Забрањена поља (HVD Секција 5.3.2): validated, qa_flag, compliance, exceedance
Идентификација и геолокација мерних места. Endpoint /api/v1/stations враћа листу са свим пољима испод; bulk дистрибуције су stations.csv и stations.geojson.
| Назив | Тип | Обавезно | Константа | Референца | Опис |
|---|---|---|---|---|---|
station_id |
string | да | Јединствени идентификатор мерне станице. Стабилан кроз време и кроз snapshot генерације; служи као примарни кључ за станицу у свим дистрибуцијама и као референца у observations.station_id. | ||
station_name |
string | да | Човекољудско име станице (нпр. „Кикинда Центар"). Може садржавати локалну транслитерацију. | ||
station_code |
string | не | Операторски код станице (нпр. „RS1002A") који се често користи у извештајним системима. Додатно стабилан identifier; није део HVD обавезног скупа али се емитује ради интероперабилности. | ||
latitude |
decimal | да | Географска ширина станице у WGS84 координатном систему, децимални степен. | ||
longitude |
decimal | да | Географска дужина станице у WGS84 координатном систему, децимални степен. | ||
municipality |
string | да | Назив општине у којој се станица налази. Може бити null када извор података не располаже овом информацијом (поље обавезно постоји у шеми). | ||
station_type |
enum | да | Тип локације станице по HVD класификацији. Дозвољене вредности: traffic, urban, background, industrial, rural, other. Може бити null ако тип није познат. | ||
operator |
string | да | Назив организације која оперише станицом. Тренутно се изводи из organization.name на нивоу portal инстанце. | ||
active |
boolean | да | Да ли станица тренутно активно емитује мерења. true ако је станица присутна у активном snapshot-у и оперативна; false ако је заустављена или ван мреже. | ||
last_updated_utc |
datetime | да | Тренутак последњег ажурирања метаподатака станице у ISO 8601 UTC формату. Тренутно се изводи из manifest.generated_at (snapshot-level timestamp). | ||
elevation_m |
decimal | не | Надморска висина станице у метрима. Опционо поље, null ако није доступно. | ||
address |
string | не | Поштанска или улична адреса станице. Опционо поље, null ако није доступно. | ||
start_date |
date | не | Датум почетка рада станице у ISO 8601 формату (YYYY-MM-DD). Опционо поље. | ||
end_date |
date | не | Датум престанка рада станице у ISO 8601 формату. null ако станица још ради. | ||
notes |
string | не | Слободан текст са додатним напоменама о станици. Опционо поље. | ||
network_id |
integer | не | Идентификатор мерне мреже којој станица припада. Није део HVD обавезног скупа али се емитује ради навигације по мрежама. | ||
network_code |
string | не | Операторски код мерне мреже. Није део HVD обавезног скупа. |
Контролисани речник мерних величина. Endpoint /api/v1/parameters враћа низ; bulk дистрибуције су parameters.csv и parameters.json.
| Назив | Тип | Обавезно | Константа | Референца | Опис |
|---|---|---|---|---|---|
parameter_code |
string | да | Шифра параметра (нпр. PM10, PM2.5, NO2, O3, SO2). Стабилан кључ који се референцира из observations.parameter_code. | ||
parameter_name |
string | да | Пуно човекољудско име параметра (нпр. „Particulate matter <= 2.5 um"). Тренутно fallback-ује на parameter_code док snapshot не почне да емитује component.name (v1.3.0). | ||
unit |
string | да | Јединица мере у UCUM или сличној нотацији (нпр. „ug.m-3" за микрограме по кубном метру). Конзистентна између parameters и observations дистрибуција. | ||
averaging_period |
string | да | 1h |
Период упрошечавања вредности. Константно „1h" у v1.0 — све вредности су сатни просеци. | |
cas_number |
string | не | CAS број загађивача (нпр. „10102-44-0" за NO2). Опционо, null ако није доступно. | ||
description |
string | не | Слободан текст са додатним описом параметра. Опционо поље. |
Сатно упрошечена мерења са свим станицама и параметрима у rolling 30-day прозору. Endpoint /api/v1/observations враћа JSON са data + meta блоком; bulk дистрибуције су observations_hourly_preliminary_last30days.csv и .parquet.
| Назив | Тип | Обавезно | Константа | Референца | Опис |
|---|---|---|---|---|---|
station_id |
string | да | stations.station_id |
Идентификатор мерне станице. Референца на stations.station_id; мора постојати у истом snapshot-у. | |
parameter_code |
string | да | parameters.parameter_code |
Шифра параметра. Референца на parameters.parameter_code; мора постојати у истом snapshot-у. | |
time_start_utc |
datetime | да | Почетак сатног интервала (укључиво) у ISO 8601 UTC формату са Z суфиксом. Временски опсег записа је [time_start_utc, time_end_utc). | ||
time_end_utc |
datetime | да | Крај сатног интервала (искључиво) у ISO 8601 UTC формату. Увек time_start_utc + 1h. | ||
value |
decimal | да | Сатна концентрација параметра на станици, у јединици назначеној пољем unit. null ако мерење није доступно за дати интервал. | ||
unit |
string | да | parameters.unit |
Јединица мере за поље value. Конзистентно са parameters.unit за исти parameter_code. | |
data_status |
string | да | preliminary |
Статус валидације податка. Константно „preliminary" — подаци нису прошли формалну QA/QC валидацију и нису намењени регулаторној процени. | |
aggregation_type |
string | да | hourly_mean |
Тип агрегације вредности. Константно „hourly_mean" — вредност представља просек у 60-минутном интервалу [time_start_utc, time_end_utc). | |
published_at_utc |
datetime | да | Тренутак првог објављивања вредности у ISO 8601 UTC. У v1.0 изводи се из manifest.generated_at (snapshot-level); per-record верзија долази са snapshot v1.3.0. | ||
updated_at_utc |
datetime | да | Тренутак последње измене вредности у ISO 8601 UTC. Ако вредност никад није мењана, једнако published_at_utc. Тренутно snapshot-level; per-record верзија долази са snapshot v1.3.0. | ||
coverage |
decimal | не | Релативна покривеност сатног интервала у опсегу [0, 1]. Вредност 1.0 значи пуну покривеност (60/60 минута), 0.5 значи пола интервала. null ако систем не располаже овом информацијом (поље обавезно постоји у шеми). |
Правне и оперативне странице
Правни оквири и оперативна обележавања која портал јавно објављује ради HVD compliance-а. Свака страница је доступна на сва три језика и у обе теме.
Опис скупа података
HVD-style опис скупа по Секцији 9.2 стандарда: наслов, сажетак, дистрибуције (API + bulk + DCAT), правни основ.
Лиценца
Лиценца отворених података по Закону о е-управи (члан 26), функционално еквивалентна CC BY: слободно коришћење уз навођење извора.
Услови коришћења
Услови коришћења API-ја: лиценца, preliminary disclaimer, 30-day retention, одрицање од регулаторне одговорности, контакт.
QoS критеријуми
Циљна месечна доступност 99%, без rate limit-а у v1.0, најава одржавања 24h унапред, snapshot се освежава једном дневно.
Контакт
Контакт информације за питања о подацима, техничкој подршци и правним аспектима.