climatememory dezvoltatori

Referința API

API Meteo

Prognoze globale până la 15 zile de la ECMWF și de la modelele naționale de înaltă rezoluție, corectate pentru altitudinea reală a terenului dumneavoastră. Un singur scope — meteo — acoperă toată pagina.

Prognoză#

GEThttps://api.climatememory.com/v1/forecastscope: meteo1 credit

Prognoză orară și zilnică pentru orice coordonată.

Parametri

ParametruTipImplicitDescriere
latfloatLatitudine, de la −90 la 90. Obligatoriu.
lonfloatLongitudine, de la −180 la 180. Obligatoriu.
daysint7Se acceptă 1–16, dar orizontul servit e de 15 zile, deci un 16 întoarce 15. Zilele 11–15 sunt o tendință, nu o prognoză — vedeți mai jos.
elevationfloat (m)Altitudinea reală a punctului dumneavoastră. Dați-o și temperatura e corectată pentru diferența față de relieful netezit al modelului. De obicei valorează 1–3 °C în zone deluroase.
timezoneIANA zoneUTCZona după care sunt tăiate agregatele zilnice și decalajul pe care îl poartă înapoi fiecare marcaj de timp.
hourlycsvallSubset de câmpuri orare, pentru a micșora răspunsul. Numele sunt cele din referința câmpurilor.
include_dailybooltrueInclude blocul zilnic.

Răspuns

{
  "latitude": 48.85,
  "longitude": 2.35,
  "timezone": "Europe/Paris",
  "grid": {
    "latitude": 48.85, "longitude": 2.35,
    "distance_km": 0.42, "resolution_km": 1.3
  },
  "elevation": {
    "applied": true,
    "model_elevation_m": 91.0,
    "location_elevation_m": 113,
    "temperature_offset_c": -0.14
  },
  "source": {
    "model": "mf_arome",
    "model_run": "20260801T00Z",
    "reference_time": "2026-08-01T00:00:00+00:00",
    "data_age_hours": 3.95,
    "stale": false,
    "attribution": "Data: Météo-France (etalab-2.0)"
  },
  "hourly": {
    "time": ["2026-08-01T00:00:00+02:00", "..."],
    "temperature_2m": [18.1, 17.9, 17.6, "..."],
    "apparent_temperature": [17.4, "..."],
    "weather_code": [0, 1, 2, "..."]
  },
  "daily": {
    "date": ["2026-08-01", "..."],
    "temperature_2m_max": [26.6, "..."],
    "temperature_2m_min": [16.2, "..."],
    "precipitation_sum": [0.0, "..."],
    "uv_index_max": [7.6, "..."],
    "sunrise": ["2026-08-01T06:24:00+02:00", "..."],
    "sunset": ["2026-08-01T21:24:00+02:00", "..."],
    "daylight_hours": [15.0, "..."]
  }
}

Blocul grid merită citit. distance_km vă spune cât de departe e centrul celulei modelului de punctul cerut, iar resolution_km cât de grosieră e celula aceea. Împreună vă spun cât de literal să luați cifrele: 0,4 km de la o celulă de 1,3 km înseamnă strada dumneavoastră; 12 km de la o celulă de 28 km înseamnă regiunea dumneavoastră.

Blocul elevation spune ce s-a făcut, nu ce s-a cerut. applied: false înseamnă că nu a avut loc nicio corecție — fie nu ați transmis elevation, fie relieful modelului se potrivea deja. Nu presupuneți niciodată că s-a aplicat corecția doar pentru că ați cerut-o.

Micșorarea răspunsului

Blocul orar complet pentru 15 zile înseamnă circa 32 de câmpuri × 360 de ore. Dacă desenați trei dintre ele, cereți trei:

GET /v1/forecast?lat=48.85&lon=2.35&days=3
    &hourly=temperature_2m,precipitation,weather_code
    &include_daily=false

Același preț — costul stă în citirea arhivei, nu în serializare — dar a zecea parte din octeți și vizibil mai rapid de parsat pe telefon.

Prognoză pe oraș#

GEThttps://api.climatememory.com/v1/forecast/city/{country}/{slug}scope: meteo1 credit

Același răspuns, rezolvat prin catalogul de orașe.

Preferați asta coordonatelor brute oriunde puteți. Catalogul oferă două lucruri pe care o coordonată nu le poate oferi: altitudinea adevărată a orașului, astfel încât corecția de relief se aplică fără să o dați dumneavoastră, și fusul lui orar, astfel încât agregatele zilnice sunt tăiate pe ziua locală corectă.

GET /v1/forecast/city/dz/alger      # slug francez
GET /v1/forecast/city/dz/algiers    # slug englez — același oraș
GET /v1/forecast/city/fr/paris

country este un cod ISO-3166-1 alpha-2, cu litere mici. slug ignoră diacriticele: bejaia găsește Béjaïa. Un slug necunoscut întoarce 404 city_not_found cu un vector suggestions — arătați-l în loc de o fundătură.

Toți parametrii de interogare de la /v1/forecast rămân valabili, în afară de lat, lon și elevation, pe care le dă catalogul. Transmiterea unui timezone îl suprascrie pe cel al orașului, ceea ce aproape niciodată nu e ce vreți.

Nu fixați în cod sluguri ghicite. Rezolvați numele o dată prin /v1/geocode, păstrați țara și slugul întoarse și folosiți-le pe acelea. Geocodarea nu costă credite, deci a face asta ca la carte e gratis.

Condiții curente#

GEThttps://api.climatememory.com/v1/currentscope: meteo1 credit

Condițiile de chiar acum pentru o coordonată, interpolate între pașii modelului.

GEThttps://api.climatememory.com/v1/current/city/{country}/{slug}scope: meteo1 credit

Același lucru, prin catalogul de orașe.

Temperatura, umiditatea, vântul și presiunea sunt interpolate liniar la momentul curent, între cei doi pași ai modelului care îl încadrează.

Precipitațiile nu se interpolează, și asta e intenționat. O valoare orară de precipitații e un total pe un interval, nu o citire într-un moment. Interpolarea ei ar inventa ploaie într-un minut în care modelul a pus-o în altă oră. În schimb primiți valoarea pasului care conține momentul — un număr real despre un interval real.

Folosiți asta pentru un afișaj „chiar acum”. Pentru orice veți compara în timp, folosiți /v1/forecast și citiți ora dorită: seria e stabilă, în timp ce acum se mișcă sub dumneavoastră între două apeluri.

Referința câmpurilor#

GEThttps://api.climatememory.com/v1/fieldsfără cheie0 credite

Același tabel în JSON, cu unități și cu marcarea câmpurilor implicite. Fără cheie.

Câmpuri orare

21 dintre ele se întorc implicit. Restul sunt ale dumneavoastră la cerere — numiți-le în hourly=, separate prin virgulă — și sunt ținute deoparte din cauza costului, nu a îndoielii: fiecare câmp stocat e o citire comprimată separată, deci un răspuns implicit care le-ar aduce pe toate 45 i-ar face pe toți să plătească pentru cei câțiva care vor grosimea zăpezii.

GET /v1/forecast?lat=45.19&lon=5.72&hourly=temperature_2m,snow_line_altitude,soil_temperature_8cm

Un câmp pe care un model nu îl publică se întoarce ca null pe porțiunea de prognoză a acelui model, în loc să dispară din răspuns — deci un lanț care începe pe AROME și continuă pe ICON-EU întoarce visibility peste tot, nul în primele 51 de ore. Un nume de câmp necunoscut înseamnă 400 unknown_field, cu cea mai apropiată potrivire sugerată; înainte era ignorat în tăcere.

CâmpUnitateNote
temperature_2m°CCorectată pentru relief când altitudinea e cunoscută
apparent_temperature°CFormularea Steadman; valabilă pe tot intervalul
relative_humidity_2m%
dewpoint_2m°C
precipitationmmTotal pe pas, decumulat
precipitation_probability_proxy%Euristică, nu o probabilitate de ansamblu. Vedeți mai jos.
weather_codeOMMCod de pictogramă, cu praguri pe mm/h, nu pe totalul pasului
cloud_cover%
wind_speed_10mm/s
wind_direction_10m°Direcția din care bate vântul
wind_gust_10mm/sMaximul pe pas
pressure_mslhPaRedusă la nivelul mării
surface_pressurehPaLa altitudinea locului
shortwave_radiationW/m²Media pe pas
uv_index0–11+Estimat. Vedeți mai jos.
capeJ/kgPotențial de furtună
is_day0/1
visibilitymDoar ICON-EU și ICON-D2
cloud_cover_low%Doar modelele ICON
cloud_cover_mid%Doar modelele ICON
cloud_cover_high%Doar modelele ICON
precipitation_typeOMMDoar ECMWF Cereți-l în hourly=
snow_depthmCât e depus, nu cât cade. Doar ICON Cereți-l în hourly=
snow_water_equivalentmmCât dă stratul de zăpadă la topire. Doar ICON Cereți-l în hourly=
snow_line_altitudemVedeți zăpadă. ICON-EU și ICON-D2 Cereți-l în hourly=
freezing_level_altitudemIzoterma de 0 °C. Doar ICON Cereți-l în hourly=
soil_temperature_0cm°CSuprafață. Doar ICON global și ICON-EU Cereți-l în hourly=
soil_temperature_8cm°CZona rădăcinilor, stratul 7–28 cm. Doar ICON global și ICON-EU Cereți-l în hourly=
shortwave_radiation_directW/m²Componenta directă. Doar ICON Cereți-l în hourly=
shortwave_radiation_diffuseW/m²Componenta difuză. Doar ICON Cereți-l în hourly=
solar_elevation°Calculat din marcajul de timp și coordonată Cereți-l în hourly=
solar_azimuth°Calculat din marcajul de timp și coordonată Cereți-l în hourly=
temperature_2m_max°CPe pas, acolo unde modelul îl publică Cereți-l în hourly=
temperature_2m_min°CPe pas, acolo unde modelul îl publică Cereți-l în hourly=
skin_temperature°CSuprafața solului, nu aerul Cereți-l în hourly=
heat_index°CNWS din SUA. Sub 27 °C întoarce temperatura simplă Cereți-l în hourly=
wind_chill°CEnvironment Canada. Peste 10 °C întoarce temperatura simplă Cereți-l în hourly=
wind_speed_100mm/sAplicații în energia eoliană Cereți-l în hourly=
wind_direction_100m°Cereți-l în hourly=
wind_beaufort0–12Cereți-l în hourly=
cloud_cover_octas0–8Cereți-l în hourly=
snowfallmmEchivalent în apă, nu grosimea zăpezii proaspete Cereți-l în hourly=
total_column_water_vapourkg/m²Cereți-l în hourly=
pressure_tendencyhPaCereți-l în hourly=
weather_descriptiontextCereți-l în hourly=

Câmpuri zilnice

date, temperature_2m_max, temperature_2m_min, temperature_2m_mean, precipitation_sum, wind_speed_max, wind_gust_max, shortwave_radiation_sum (MJ/m²), uv_index_max, sunrise, sunset, daylight_hours, weather_code.

Agregate pe zile calendaristice locale, nu pe UTC. O zi parțială la oricare capăt al intervalului este omisă în loc să fie raportată cu un maxim înșelător — deci o cerere de 7 zile poate întoarce pe bună dreptate 6 rânduri zilnice.

Două câmpuri sunt estimări și preferăm s-o spunem decât să aflați.

uv_index e derivat din înălțimea soarelui și din radiația de bandă largă, nu dintr-o coloană de ozon. Acuratețe de circa ±1 unitate — destul pentru „pune-ți o pălărie”, nu pentru o afirmație medicală.

precipitation_probability_proxy e o estimare, nu o probabilitate. Un model determinist nu are dispersie din care s-o derive. Se numește _proxy ca nimeni să nu-l confunde cu produsul de ansamblu servit de /v1/probability, care e o frecvență reală peste 51 de membri.

Combină doi termeni. Primul întreabă dacă ploaia celulei ajunge la punctul dumneavoastră: rata stocată e o medie pe toată celula de grilă, deci la 28 km — 780 km² — o medie slabă poate fi o aversă reală peste o mică parte din ea. Luând distribuția sub-grilă a ratelor drept Weibull, cu o formă dată de mărimea celulei și de media proprie a modelului, se obține în formă închisă șansa ca un punct din celulă să depășească 0,1 mm/h. Al doilea termen limitează ce poate pretinde un cer acoperit, aproape saturat, acolo unde modelul nu pune deloc ploaie în celulă. Ambii sunt apoi scalați cu cât merită crezută o rulare la acel termen, motiv pentru care aceeași cantitate de ploaie se citește mai jos în ziua 9 decât în ziua 1.

Prin urmare același loc se poate citi diferit din două modele, și așa și trebuie: o celulă de 2,2 km și una de 28 km chiar nu sunt de acord ce înseamnă o medie slabă. Aplicațiile de consum care dau un singur număr ascund asta.

Modele și rezoluție#

GEThttps://api.climatememory.com/v1/modelsfără cheie0 credite

Ce modele sunt active, ce acoperă fiecare, cât de proaspăt e fiecare. Fără cheie.

Servim cel mai fin model care acoperă punctul dumneavoastră și termenul dumneavoastră. Nu alegeți niciodată unul; alegerea e raportată în source.model, ca să știți mereu care a răspuns.

Modelele de înaltă rezoluție sunt toate de scurtă durată — la 1 km atmosfera devine haotică în două zile, deci o prognoză mai lungă n-ar avea sens — iar rezoluția coboară deci în trepte pe măsură ce prognoza avansează:

ziua 0 ────── ziua 2 ────── ziua 5 ──────────────── ziua 15
  AROME 1,3 km (Franța)
  ICON-D2 2,2 km (Germania, Alpi, Benelux)
  HRRR 3 km (SUA și sudul Canadei)
              ICON-EU 6,5 km (Europa)
                          ICON 13 km · ECMWF 28 km (global)
                                              AIFS (doar tendință)
source.modelModelRezoluțieRulăriOrizont
mf_aromeMétéo-France AROME1.3 km8/zi51 h
dwd_icon_d2DWD ICON-D22.2 km4/zi48 h
noaa_hrrrNOAA HRRR3 km4/zi48 h
dwd_icon_euDWD ICON-EU6.5 km2/zi120 h
dwd_iconDWD ICON13 km2/zi180 h
ecmwf_ifsECMWF IFS28 km2/zi240 h
ecmwf_aifsECMWF AIFS28 km2/zi360 h
ecmwf_waveECMWF wave28 km2/zi240 h

Tranzițiile peste marginea domeniului unui model sunt estompate reciproc, astfel încât două localități de o parte și de alta a unei granițe nu diferă niciodată printr-un salt.

Zilele 11–15 sunt o tendință, nu o prognoză. La distanța aceea, priceperea se apropie de climatologie. O publicăm pentru că e cerută; luați-o ca direcție de evoluție și, dacă o afișați, spuneți-o.

/v1/models nu cere cheie, ceea ce îl face potrivit de interogat dintr-o pagină de stare sau de verificat înainte să cumpărați: raportează cea mai recentă rulare a fiecărui model și vechimea ei, deci la „sunt datele proaspete?” se poate răspunde fără să cheltuiți un credit.

Probabilități de ansamblu#

GEThttps://api.climatememory.com/v1/probabilityscope: meteo1 credit

Percentile și probabilități de ploaie din ansamblul ECMWF cu 51 de membri.

O prognoză unică spune 22 °C joi. Aceea e o presupunere prezentată ca un fapt. Endpointul acesta răspunde la întrebarea pe baza căreia decideți de fapt: cât de sigur e și ce probabilitate de ploaie merită luată în calcul.

Se calculează din ansamblul ECMWF — același model rulat de 50 de ori din condiții inițiale ușor diferite. Acolo unde rulările sunt de acord, prognoza e sigură. Acolo unde se împrăștie, însăși atmosfera e incertă și niciun model, oricât de bun, nu vă poate spune mai mult.

{
  "members": 50,
  "hourly": {
    "time": ["2026-08-01T00:00:00+00:00"],
    "temperature_2m_p10": [26.4],
    "temperature_2m_p50": [26.78],
    "temperature_2m_p90": [27.3],
    "temperature_2m_spread": [0.4],
    "precipitation_probability_0_1mm": [10.0],
    "precipitation_probability_1_0mm": [0.0],
    "precipitation_probability_5_0mm": [0.0],
    "precipitation_probability_10_0mm": [0.0],
    "precipitation_p90": [0.1]
  }
}

Cum se citește

p10 și p90 încadrează 80 % din mijlocul membrilor: unul din zece se așteaptă să fie mai frig decât p10, unul din zece mai cald decât p90. Un spread de 0,4 °C e o situație așezată, în care puteți avea încredere; 3 °C înseamnă că modelele nu sunt de acord și ar trebui să le spuneți asta utilizatorilor în loc să alegeți unul.

Pragurile de ploaie sunt decizii, nu cifre rotunde — 0,1 mm înseamnă ud, cât de cât, 1 mm înseamnă ia-ți o haină, 5 și 10 mm înseamnă asta e o problemă. precipitation_p90 e cazul nefavorabil: doar un membru din zece e mai ploios.

Doar două variabile, temperatură și precipitații. Adăugarea norilor, a vântului și a presiunii ar dubla lățimea de bandă a întregii platforme pentru cifre pe baza cărora nu decide nimeni nimic.

Calitatea aerului#

GEThttps://api.climatememory.com/v1/air-qualityscope: meteo1 credit

Pulberi, ozon, NO₂, SO₂, CO și praf saharian, de la Copernicus CAMS.

Acesta e endpointul care contează cel mai mult în nordul Africii și în Mediterana. Un episod de praf duce PM10 peste o mie de micrograme pe metru cub zile la rând, ceea ce e o decizie de sănătate, nu o cifră, și e slab acoperit de serviciile gratuite pentru consumatori.

{
  "current": {
    "pm2_5": 38.7,
    "band": "poor",
    "who_guidelines_ug_m3": {"pm2_5": 15.0, "pm10": 45.0,
                             "nitrogen_dioxide": 25.0, "ozone": 100.0}
  },
  "hourly": {
    "time": ["2026-08-01T00:00:00+00:00"],
    "pm2_5": [38.7], "pm10": [85.8], "ozone": [43.4],
    "nitrogen_dioxide": [19.0], "dust_aod_550nm": [0.24]
  },
  "units": {"pm2_5": "ug/m3", "pm10": "ug/m3", "dust_aod_550nm": "1"}
}

Toate concentrațiile sunt în µg/m³, unitatea în care se raportează peste tot calitatea aerului. dust_aod_550nm e o adâncime optică și nu are unitate: peste circa 0,5 cerul e vizibil cețos, peste 1,0 soarele e estompat.

Valorile-ghid pe termen scurt ale OMS călătoresc în fiecare răspuns, ca o cifră să poată fi plasată fără să fie căutată. band urmează indicele european al calității aerului pentru PM2,5: bună, acceptabilă, moderată, slabă, foarte slabă, extrem de slabă.

Zăpada și limita zăpezii#

Patru câmpuri, și răspund la întrebări diferite. snowfall e cât cade; restul descriu ce e la sol și unde.

Cereți-le pe nume — nu sunt în răspunsul implicit:

GET /v1/forecast?lat=45.19&lon=5.72&hourly=snowfall,snow_depth,snow_water_equivalent,snow_line_altitude,freezing_level_altitude
CâmpUnitateCe vă spune
snow_depthmCât e depus. Douăzeci de centimetri pot să cadă și să se topească, sau să se așeze peste optzeci deja existenți.
snow_water_equivalentmmCât dă la topire. Jumătate de metru de zăpadă pufoasă și jumătate de metru de zăpadă tasată sunt lucruri foarte diferite.
snow_line_altitudemAltitudinea peste care precipitațiile cad sub formă de zăpadă.
freezing_level_altitudemÎnălțimea izotermei de 0 °C, de regulă cu câteva sute de metri deasupra limitei zăpezii.

Limita zăpezii e cea care merită citită. „Plouă la 800 m și ninge la 1200” e o informație pe care o stațiune de schi, o administrație rutieră sau un șofer pot acționa; „3 mm de precipitații” nu este. Contează și în nordul Africii — Atlasul are domenii de schi la Chréa și Tikjda, iar podișurile înalte de la Sétif, Batna și Djelfa stau peste 1000 m.

Ghețarii raportează zeci de metri de grosime a zăpezii, pentru că așa reprezintă modelul gheața permanentă, nu pentru că ar fi o eroare de măsurare. Cea mai groasă zăpadă sezonieră de pe Pământ e în jur de 11 m — tratați orice depășește asta ca gheață, nu ca vreme.

Acestea vin de la ICON-ul DWD, care acoperă lumea la 13 km. Datele deschise ale ECMWF publică grosimea zăpezii, dar nu limita zăpezii, deci ăsta e unul dintre locurile unde modelul mai grosier e cel mai util. snow_line_altitude e un produs regional: ICON-EU și ICON-D2 îl publică, ICON global nu, deci în afara Europei primiți nivelul de îngheț și grosimea, dar nu și limita.

Marin — starea mării#

GEThttps://api.climatememory.com/v1/marinescope: meteo1 credit

Înălțimea, direcția și perioada valurilor din modelul de valuri ECMWF, în toată lumea, până la 10 zile.

{
  "hourly": {
    "time": ["2026-08-01T00:00:00+00:00"],
    "wave_height": [0.32],
    "wave_direction": [264.3],
    "wave_period": [3.79],
    "wave_peak_period": [4.21]
  }
}

Înălțimea valurilor este înălțimea semnificativă — media treimii celor mai înalte valuri, cam ce raportează un observator pe mare. Valurile individuale ajung la aproximativ dublul ei, și acela e numărul care contează dacă hotărâți dacă ieșiți în larg. Direcția e cea din care vin valurile, ca la vânt.

Un punct pe uscat întoarce 404 not_at_sea, nu o listă de valori nule. Modelul de valuri nu are valoare pe uscat prin construcție, iar a spune asta e mai util decât un răspuns care se citește ca o defecțiune de serviciu. Dacă lăsați utilizatorii să pună un pin pe hartă, tratați explicit acest cod.

Râuri#

GEThttps://api.climatememory.com/v1/hydrologyscope: meteo1 credit

Debitul râurilor de la Copernicus GloFAS pe o rețea hidrografică de 0,05°, până la 10 zile.

Răspunde la ceva ce niciun model meteo nu poate: nu câtă ploaie cade în amonte, ci câtă apă ajunge aici — un număr diferit, despărțit de ploaie printr-un bazin, printr-o stare de umiditate a solului și printr-o zi-două de timp de propagare.

{
  "disclaimer": "Information only. Only national and regional authorities
                 are authorised to issue flood warnings.",
  "daily": {
    "time": ["2026-08-01T00:00:00+00:00"],
    "river_discharge": [4.953],
    "soil_wetness_index": [0.448]
  }
}
CâmpÎnțeles
river_dischargeDebitul mediu în m³/s pe cele 24 de ore care se încheie la momentul acela. Zero înseamnă că modelul nu are niciun râu în acea celulă, nu că un râu a secat.
soil_wetness_indexSaturația bazinului, de la 0 uscat la 1 saturat. Valorile mari înseamnă că ploaia următoare se scurge în loc să se infiltreze.

Aceasta nu este o avertizare de inundații și nu poate fi prezentată ca atare. Licența Copernicus rezervă avertizările de inundații autorităților naționale și regionale în aria lor de responsabilitate, și așa e corect — cei autorizați să avertizeze sunt și cei care pot închide un drum și evacua un sat.

Debit în m³/s, da. O alertă, o culoare de severitate sau un îndemn la acțiune, nu, oricum ar arăta cifrele în ziua respectivă. Declinarea răspunderii călătorește în corpul fiecărui răspuns, nu doar aici, și e acolo ca să ajungă la utilizatorii dumneavoastră chiar dacă pagina asta n-a ajuns.