Multi-model weather forecasting at 2–3 km resolution, aggregated from 10+ operational NWP models. Specialist coverage for the Alpine, Carpathian, Balkans, and Pannonian regions — where global models fall short.
# Forecast for Ljubljana, Slovenia curl "https://meteoapi.eu/api/v1/forecast?latitude=46.05\ &longitude=14.51\ &hourly=temperature_2m,precipitation,\ snow_probability,shortwave_radiation" \ -H "X-API-Key: YOUR_API_KEY"
{
"latitude": 46.05,
"longitude": 14.51,
"elevation": 298.6,
"generationtime_ms": 187.3,
"hourly": {
"time": ["2026-02-27T00:00", ...],
"temperature_2m": [3.4, 2.9, ...],
"precipitation": [0.0, 0.2, ...],
"snow_probability": [12, 18, ...],
"shortwave_radiation": [0, 0, ...]
}
}
Global APIs average data across large grid cells. We combine multiple regional models specifically tuned for complex Alpine and Balkan terrain, then aggregate them into a single, uncertainty-aware forecast.
Eight NWP models run independently and are merged into a single forecast using a weighted aggregation pipeline. A poor ICON run, a late AROME delivery, or a WRF convective miss doesn't ruin your forecast — the other models compensate.
AROME · ICON-D2 · WRF · ALADIN-CZ · ARPEGE · ICON-EUGlobal APIs at 10–25 km resolution give the same forecast to a mountain resort at 1,800 m and the valley 8 km away. Our finest models resolve individual valleys, lake-effect zones, and coastal gradients at 2–3 km — the scale where weather actually matters for operations.
ICON-D2 2 km · AROME-AT 2.5 km · ALADIN-CZ 2.3 km · WRF 3 kmThe Bora, the Foehn, Adriatic snow storms, Pannonian heat extremes, Carpathian valley inversions — these are not edge cases for us. The regional models in our ensemble were developed specifically for Central and South-Eastern European terrain complexity.
AT · SI · HR · BA · RS · CZ · SK · HU · RO · IT · DEEvery coordinate is resolved against the ETOPO2022 digital elevation model at 1.8 km resolution. Temperature, snow line, and wind forecasts are corrected for your exact terrain altitude — not the flat-earth approximation of the nearest model grid point.
ETOPO2022 · 1.8 km DEM · Bilinear interpolationKnow the confidence, not just the value. Snow probability uses a two-factor survival model (temperature + wet-bulb). Thunderstorm probability combines CAPE, wind shear, and cold-front detection. Precipitation probability is derived from multi-model agreement — all available on Pro and above.
snow_probability · thunderstorm_probability · precipitation_probability
Column-oriented JSON with identical parameter names and units to the
Open-Meteo API. Existing integrations migrate in minutes.
Rate-limit headers (X-RateLimit-Remaining) on every response.
CORS enabled — works directly from the browser.
Add &description=true to any daily forecast request and receive
a plain-English weather summary alongside the data — generated by an LLM from
the aggregated forecast. Ideal for dashboards, notifications, and end-user apps
that need human-readable weather text without writing parsing logic.
8+ NWP model runs are downloaded from official national meteorological services every 1–6 hours and ingested into a local PostgreSQL database.
Your coordinates are matched to the nearest grid point in each model. DEM altitude lookup corrects the target elevation for all models simultaneously.
Available models are merged using weighted column aggregation. Derived parameters — snow probability, thunderstorm risk, weather symbols — are computed from the blended output.
The unified forecast is cached per coordinate and invalidated automatically when new model data arrives. Cached responses are served in under 50 ms; fresh aggregations complete in a few seconds.
Coverage spans from the Iberian Peninsula to the Ural foothills, with highest model density over Central and South-Eastern Europe.
Variables are unlocked per plan, not priced individually. Every plan includes all variables in its tier and below.
temperature_2m — °Cdewpoint_2m — °Crelative_humidity_2m — %pressure_msl — hPawind_speed_10m — km/hwind_direction_10m — °wind_gusts_10m — km/hprecipitation — mmcloud_cover — %cloud_cover_low/mid/high — %weather_code — WMO 4677is_day — 0/1snow_line — m a.s.l.wet_bulb_temperature_2m — °Cshortwave_radiation — W/m²temperature_850hPa — °Cprecipitation_probability — %freezing_level — m a.s.l.thunderstorm_code — WMOfog_code — WMOsnow_probability — % (two-factor survival model)thunderstorm_probability — % (CAPE + shear)precipitation_max — mm (spatial max)cape — J/kg (mixed-layer)Paid plans have no daily call limit — throughput is governed by per-minute rate limits and the number of locations, not an arbitrary daily counter. A single solar plant and a national energy trader have very different needs; the plans reflect that.
For universities, research institutes, NWP verification groups, and data scientists. Reduced pricing and unlimited locations for academic and non-commercial use. Covers NWP verification, thesis work, and grant-funded projects without the cost of a Pro plan. Strictly non-commercial; free tier requires institutional email and project description.
For SaaS companies, digital agencies, and app developers who embed weather data in their own products and distribute it to end users. The only plan that includes commercial redistribution rights and optional white-labelling. Requires a signed commercial agreement.
# Demo key — no signup, free tier limits apply export METEO_KEY="met_ca5ec55ea95d823440dd706fad8a3a0\ 600ff57427004920141358c767bd3290c" curl "https://meteoapi.eu/api/v1/forecast\ ?latitude=47.81&longitude=13.05\ &hourly=temperature_2m,precipitation,\ wind_speed_10m,wind_gusts_10m" \ -H "X-API-Key: $METEO_KEY" | python3 -m json.tool
import requests, pandas as pd resp = requests.get( "https://meteoapi.eu/api/v1/forecast", params={ "latitude": 47.81, "longitude": 13.05, "hourly": "temperature_2m,precipitation,\ snow_probability,shortwave_radiation", }, headers={"X-API-Key": "YOUR_API_KEY"}, timeout=15, ) resp.raise_for_status() data = resp.json()["hourly"] df = pd.DataFrame(data) df["time"] = pd.to_datetime(df["time"]) df = df.set_index("time") print(df.head())