← Портал

API Документација

KOSAVA v7 OpenData

Agencija za zaštitu životne sredine SEPA — API Documentation

Портал омогућава приступ подацима о квалитету ваздуха и метеоролошким параметрима из мрежа за праћење. API је доступан искључиво за читање: нема уписа података, нема аутентикације и нема ограничења броја захтева. Сви приказани подаци припадају организацији назначеној на самом порталу.

v1.2.0 Само за читање Без аутентикације

Аутентикација

Овај 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 ендпоинти враћају поља уместо тога.

200 OK

Успех

Захтев је успешан. Тело одговора садржи тражене податке.

400 Bad Request

Неисправни параметри

Један или више обавезних параметара упита недостаје, празан је, није валидан цео број (за ID-еве), или има неподржану вредност (за window или format).

404 Not Found

Ресурс није пронађен

Организација, станица, компонента или тражени подаци мерења не постоје у активном снимку или немају јавно доступних података.

503 Service Unavailable

Сервис недоступан

Redis је недоступан, показивач активног снимка недостаје, или верзија шеме снимка не одговара EXPECTED_SCHEMA_VERSION. Портал није спреман за послуживање података.

Health

Лагане пробе за оркестраторе контејнера и баласере оптерећења. Ниједан ендпоинт не захтева аутентикацију нити приступа подацима мерења.

GET /health/live Провера живости процеса

Потврђује да је процес жив и да 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" }
GET /health/ready Провера спремности снимка

Проверава да ли је 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 снимка и само су за читање.

GET /meta Манифест снимка

Враћа манифест тренутно активног 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
GET /organizations Списак свих организација

Враћа све организације у активном снимку. Пошто је једна инстанца портала везана за једну организацију путем 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;
GET /networks Списак свих мрежа

Враћа све мреже за праћење дефинисане у активном снимку. Мреже групишу станице унутар именованог програма мерења или географског подручја. Сваки објекат укључује 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));
GET /stations Списак свих станица

Враћа све јавне станице за праћење у свим организацијама и мрежама у активном снимку. Сваки објекат укључује 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`);
GET /components Списак свих компоненти мерења

Враћа све компоненте мерења (загађивачи и метеоролошки параметри) дефинисане у активном снимку. Сваки објекат укључује 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 /{"{organization_id}"}/stations Списак станица организације

Враћа све јавне станице за праћење за одређену организацију. Облик одговора је идентичан 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`);
GET /{"{organization_id}"}/stations/{"{station_id}"}/meta Метаподаци станице и јавне компоненте

Враћа детаљне метаподатке за једну станицу, укључујући листу јавних компоненти мерења (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-еве организације, станице и компоненте.

GET /measurements Временска серија за компоненту станице

Враћа нормализоване податке временских серија за једну компоненту на једној станици током траженог временског прозора. Сва четири параметра упита су обавезна. Одговор укључује назив станице, детаље компоненте, коришћени прозор и низ 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));
GET /{"{organization_id}"}/stations/{"{station_id}"}/measurements/last_hour Мерења из последњег сата

Враћа сва мерења компоненти забележена у последњем сату за одређену станицу. Тело одговора садржи низ 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));
});
GET /{"{organization_id}"}/stations/{"{station_id}"}/measurements/last_24h Мерења последњих 24 сата

Враћа сва мерења компоненти забележена током последњих 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). Извезена датотека садржи све контекстуалне колоне — организација, мрежа, станица, компонента, датум, време, јединица и нумеричка вредност.

GET /portal/export Преузми податке мерења као датотеку

Гради и стримује датотеку табеле за преузимање која садржи податке временских серија мерења за једну компоненту наједној станици. Свих пет параметара упита је обавезно. Прозор 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
400application/jsonНедостаје/неисправан параметар или неподржан прозор/формат
404application/jsonСтаница или компонента није пронађена, или нема података за прозор
503application/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 уговор остаје нетакнут ради компатибилности.

GET /api/v1/metadata HVD дескриптор скупа података

Враћа комплетан 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);
GET /api/v1/stations HVD станице

Враћа све 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).

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

НазивТипОбавезноОпис
activebooleanнеФилтер на активне станице. true враћа само активне, false само неактивне.
municipalitystringнеФилтер по имену општине, case-insensitive exact match.
station_typestringнеФилтер по HVD enum типу станице (traffic, urban, background, industrial, rural, other).
bboxstringне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));
GET /api/v1/parameters HVD речник параметара

Враћа контролисани речник мерних параметара (Компонента 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());
GET /api/v1/observations HVD сатне неверификоване вредности

Враћа сатно упрошечена мерења у 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).

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

НазивТипОбавезноОпис
fromdatetimeнеПочетак прозора, ISO 8601 datetime (нпр. 2026-04-01T00:00:00Z). Без TZ третира се као UTC. Default: generated_at - retention_days.
todatetimeнеКрај прозора, ISO 8601 datetime. Без TZ третира се као UTC. Default: generated_at.
station_idstringнеФилтер на једну станицу. HVD station_id је string верзија интерног ID-а.
parameter_codestringнеФилтер на један параметар (нпр. 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);
GET /api/v1/bulk HVD bulk download индекс

Враћа листу 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);
GET /api/v1/bulk/{filename} Download bulk ресурса

Сервира један bulk фајл као attachment. Response заглавља укључују Content-Disposition (attachment; filename="..."), Content-Length, Content-Type и X-Content-SHA256 (мора се подударати са sha256 у индексу).

Параметри путање

НазивТипОбавезноОпис
filenamestringдаИме bulk ресурса из индекса (нпр. observations_hourly_preliminary_last30days.parquet).

Одговори

СтатусОпис
200Bulk фајл као 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.
GET /api/v1/dcat DCAT-AP HVD JSON-LD каталог

Враћа 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/националним порталима.

Одговори

СтатусОпис
200DCAT-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 и овде у три језика. Константне вредности и референце између компоненти су назначене у табелама.

GET /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

§5.1 Станице (HVD Компонента A)

Идентификација и геолокација мерних места. 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 обавезног скупа.
§5.2 Параметри (HVD Компонента B)

Контролисани речник мерних величина. 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 не Слободан текст са додатним описом параметра. Опционо поље.
§5.3 Сатне неверификоване вредности (HVD Компонента C)

Сатно упрошечена мерења са свим станицама и параметрима у 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 ако систем не располаже овом информацијом (поље обавезно постоји у шеми).
KOSAVA v7 OpenData — API v1.2.0 — Read-Only Public Data Portal — Swagger UIReDoc