Open-Meteo Climate API
Free climate projection API with no key: downscaled CMIP6 model data from 1950 to 2050 at 10 km resolution for any coordinates. Tested example and live response.
Endpoint tested and returned HTTP 200 on 2026-08-21
What is the Open-Meteo Climate API?
The Open-Meteo Climate API is a free, key-free API serving CMIP6 climate model projections from 1950 to 2050. It returns daily temperature, precipitation, wind and humidity variables for any coordinates worldwide, downscaled to roughly 10 km resolution across seven high-resolution climate models.
Climate projections normally live in multi-gigabyte NetCDF files on research portals, behind registration and a steep learning curve. This API turns them into ordinary JSON for a single point: pick coordinates, a date range and a model, and get a daily series back. That is a substantial reduction in effort for anyone building climate risk tooling, agricultural planning or a data journalism piece.
The crucial thing to understand is that this is not a forecast. CMIP6 models simulate a plausible climate under a given emissions scenario — the daily values are statistically realistic, but the value for a specific future date is not a prediction of that date's weather. Use these series for trends, averages and distributions over years, never for what the temperature will be next Tuesday. Comparing several models via the `models` parameter is the standard way to see the spread of that uncertainty.
Quick facts
- Base URL
https://climate-api.open-meteo.com/v1- Authentication
- No API key. Same fair-use terms as the rest of the Open-Meteo family, including commercial use below the daily limit.
- Rate limit
- Roughly 10,000 requests per day per IP on the free tier.
- Pricing
- Free, commercial use included, under the daily cap.
- CORS
- Enabled — callable directly from browser JavaScript
- Official docs
- Read the docs
How to use the Open-Meteo Climate API
Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.
1. Daily maximum temperature for Berlin, first week of 2026
GET https://climate-api.open-meteo.com/v1/climate?latitude=52.52&longitude=13.41&start_date=2026-01-01&end_date=2026-01-05&models=EC_Earth3P_HR&daily=temperature_2m_max
curl 'https://climate-api.open-meteo.com/v1/climate?latitude=52.52&longitude=13.41&start_date=2026-01-01&end_date=2026-01-05&models=EC_Earth3P_HR&daily=temperature_2m_max'const res = await fetch("https://climate-api.open-meteo.com/v1/climate?latitude=52.52&longitude=13.41&start_date=2026-01-01&end_date=2026-01-05&models=EC_Earth3P_HR&daily=temperature_2m_max");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);import requests
res = requests.get("https://climate-api.open-meteo.com/v1/climate?latitude=52.52&longitude=13.41&start_date=2026-01-01&end_date=2026-01-05&models=EC_Earth3P_HR&daily=temperature_2m_max", timeout=20)
res.raise_for_status()
print(res.json()){
"latitude": 52.5,
"longitude": 13.400009,
"generationtime_ms": 5.676746368408203,
"utc_offset_seconds": 0,
"timezone": "GMT",
"timezone_abbreviation": "GMT",
"elevation": 38.0,
"daily_units": {
"time": "iso8601",
"temperature_2m_max": "°C"
},
"daily": {
"time": [
"2026-01-01",
"2026-01-02",
"2026-01-03",
"2026-01-04",
"2026-01-05"
],
"temperature_2m_max": [
0.5,
2.7,
3.9,
2.8,
1.5
]
}
}Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
latitude | float | Required | Latitude in decimal degrees. Snapped to the model grid, so the response echoes back the point actually used. Pairs with `longitude`. 52.52 |
start_date | string | Required | ISO start date. The valid range is 1950-01-01 to 2050-12-31. Pairs with `end_date`. 2026-01-01 |
models | string | Optional | Comma-separated climate models: `EC_Earth3P_HR`, `MRI_AGCM3_2_S`, `CMCC_CM2_VHR4`, `FGOALS_f3_H`, `HiRAM_SIT_HR`, `MPI_ESM1_2_XR`, `NICAM16_8S`. EC_Earth3P_HR |
daily | string | Optional | Comma-separated daily variables such as `temperature_2m_max`, `precipitation_sum`, `windspeed_10m_max`, `relative_humidity_2m_mean`. temperature_2m_max |
temperature_unit | string | Optional | `celsius` or `fahrenheit`. A matching `precipitation_unit` accepts `mm` or `inch`. celsius |
Response fields
latitude / longitudefloat- The model grid point actually used, which differs slightly from your request because the data is gridded at about 10 km.
elevationfloat- Grid cell elevation in metres — relevant, since temperature projections are altitude-sensitive.
daily.timearray- ISO dates, one per value in every other daily array. The arrays are parallel and index-aligned.
daily variablesarray- Each requested variable's daily values, in the same order as `daily.time`.
daily_unitsobject- Unit string for each returned variable, so charts can be labelled from the response itself.
generationtime_msfloat- Server-side generation time. Long date ranges across several models are noticeably slower.
What you can build with the Open-Meteo Climate API
- Model climate risk exposure for a property or infrastructure portfolio
- Project growing-season temperature and rainfall for agricultural planning
- Chart warming trends for a specific location in a data journalism piece
- Compare model spread by requesting several CMIP6 models for the same point
Common errors and how to fix them
400
Date outside the 1950-2050 range, or an unknown model or variable name.
Fix: The error body names the offending parameter. Model ids are case-sensitive and use underscores, as in `EC_Earth3P_HR`.
429
Daily request limit exceeded.
Fix: Long series are expensive — fetch a wide date range once and cache it rather than requesting year by year.
Nulls in a daily array
A variable is unavailable for the selected model.
Fix: Not every model provides every variable. Check the docs' support matrix, or request a different model.
Open-Meteo Climate API — frequently asked questions
Is the Open-Meteo Climate API free?
Yes, free with no API key and no signup, including commercial use below roughly 10,000 requests per day — the same terms as the rest of the Open-Meteo family.
What is CMIP6 data?
The Coupled Model Intercomparison Project Phase 6 is the coordinated set of climate model runs underpinning the IPCC assessment reports. This API serves seven high-resolution CMIP6 models statistically downscaled to about 10 km.
Can I use this to forecast weather in 2050?
No, and the distinction matters. Climate models produce statistically plausible daily values under an emissions scenario, not predictions of specific dates. The output is meaningful as trends, averages and distributions over years — never as a forecast for a given day.
Why do different models give different answers?
Because each makes different assumptions about atmospheric physics and resolution, and that spread is the honest representation of uncertainty. Requesting several models via the `models` parameter and showing the range is more truthful than presenting one model's line as fact.
Tools that pair with this API
JSON to CSV Converter
Convert a JSON array of objects to CSV online. Automatic column headers from the union of all keys, delimiter choice and proper quoting — all in-browser.
Unit Converter
Convert between units of length, weight, temperature, area, volume, speed, time and data storage instantly, with a swap button and common conversion tables.
Percentage Change Calculator
Work out the percentage increase or decrease between an old and a new value. See the absolute change and whether it went up or down, instantly and privately.
Open-Meteo Climate is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.