Open-Meteo Weather Scraper — Forecast, History, Air Quality
Pricing
from $0.35 / 1,000 result items
Open-Meteo Weather Scraper — Forecast, History, Air Quality
Weather data for AI agents without an API key: current, hourly/16-day daily forecast, ERA5 history since 1940, air quality (AQI, PM2.5, pollen), marine waves, CMIP6 climate projections, ensemble spread, river discharge — for any city or coordinates. 200+ variables, model selection, units, timezone.
Pricing
from $0.35 / 1,000 result items
Rating
0.0
(0)
Developer
Samat Makatov
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
14 hours ago
Last modified
Categories
Share
Weather Scraper — current, forecast, history, air quality, marine & climate (Open-Meteo)
Weather data for agents, dashboards and models without an API key, browser or proxy. One actor covers the whole Open-Meteo family: current conditions, hourly and 16-day daily forecasts (24 selectable models), ERA5 history back to 1940, air quality (European/US AQI, PM2.5, NO₂, pollen), marine waves and currents, CMIP6 climate projections to 2050, ensemble spread and river discharge — for any city name or lat,lon. 200+ variables, your units and timezone, one row per timestamp or a compact series per location.
Use cases
- Agro & irrigation planning —
historywithet0_fao_evapotranspiration,precipitation_sum,shortwave_radiation_sumper field for the season;dailywithsoil_moisture_0_to_10cm_meanandgrowing_degree_days_base_0_limit_50for the next two weeks. - Logistics / delivery risk — hourly
precipitation_probability,wind_gusts_10m,visibility,snowfallfor depots and routes;ensemblespread to know how certain the forecast is. - Retail demand & staffing — 16-day
temperature_2m_max,weather_codeper store city; historical weather to explain last year's sales. - Health & ESG reporting —
airQuality(PM2.5, ozone,us_aqi) anduv_index_maxfor office locations;climateprojections for 2030–2050 site assessments. - Energy —
shortwave_radiation,direct_normal_irradiance,wind_speed_100m(history) for solar/wind yield estimates. - Marine & tourism —
marinewave height/period andsea_surface_temperaturefor ports, beaches and offshore work windows;floodriver discharge for riverside assets.
Input
| Field | Type | Default | Notes |
|---|---|---|---|
locations | string[] | — | Almaty, Berlin, DE, Paris, France, 40.71,-74.01. One API call each. |
mode | select | daily | current, daily, hourly, history, historyHourly, airQuality, airQualityCurrent, marine, marineHourly, climate, ensemble, flood. |
days | int | 7 | Days ahead (or back for history). Caps: daily/hourly/marine/ensemble 16, airQuality 7, flood 210. |
pastDays | int | — | Forecast modes: prepend 0–92 days of recent data. |
startDate, endDate | date | — | Explicit period (YYYY-MM-DD). History: 1940-01-01 → 2 days ago. Climate: 1950–2050. |
variables | string[] | mode defaults | Open-Meteo variable names for the mode (dictionaries below). Unknown names are skipped with a warning. |
models | string[] | best match | Forecast/ensemble/climate model ids (below). Several forecast models → one column per model. |
includeEnsembleMembers | bool | false | Ensemble: add <var>_values arrays. |
units | select | metric | metric (°C, km/h, mm) or imperial (°F, mph, inch). |
temperatureUnit / windSpeedUnit / precipitationUnit | select | — | `celsius |
timezone | string | auto | IANA name or auto (local time per location). |
geocodeLanguage | string | en | Language for place matching / labels. |
geocodeCountry | string | — | ISO-2 country filter for all place-name lookups. |
cellSelection | select | land | land, sea, nearest grid cell (coasts). |
airQualityDomain | select | auto | cams_europe (11 km) or cams_global (40 km). |
layout | select | rows | rows (one row per timestamp) or compact (one row per location with arrays — 1 billed item). |
maxItems | int | 20000 | Hard cap on rows. |
Reference
Modes → endpoint, granularity, range
| mode | endpoint | rows | range |
|---|---|---|---|
current | forecast | 1 per location | now (15-min update) |
daily | forecast | 1 per day | ≤16 ahead, ≤92 back |
hourly | forecast | 1 per hour | ≤16 ahead, ≤92 back |
history | archive (ERA5/ERA5-Land, 9–25 km) | 1 per day | 1940 → T-2 days |
historyHourly | archive | 1 per hour | 1940 → T-2 days |
airQuality | air-quality (CAMS) | 1 per hour | ≤7 ahead, ≤92 back |
airQualityCurrent | air-quality | 1 per location | now |
marine | marine | 1 per day | ≤16 ahead |
marineHourly | marine | 1 per hour | ≤16 ahead |
climate | climate (CMIP6 HighResMIP) | 1 per day | 1950–2050 |
ensemble | ensemble | 1 per day (+min/max/mean/spread over 30–50 members) | ≤16 ahead |
flood | flood (GloFAS) | 1 per day | ≤210 ahead |
Variables by mode
current: temperature_2m relative_humidity_2m apparent_temperature is_day precipitation rain showers snowfall weather_code cloud_cover pressure_msl surface_pressure wind_speed_10m wind_direction_10m wind_gusts_10m
daily (forecast): weather_code temperature_2m_max/min/mean apparent_temperature_max/min/mean sunrise sunset daylight_duration sunshine_duration uv_index_max uv_index_clear_sky_max rain_sum showers_sum snowfall_sum precipitation_sum precipitation_hours precipitation_probability_max/min/mean wind_speed_10m_max/min/mean wind_gusts_10m_max/min/mean wind_direction_10m_dominant shortwave_radiation_sum et0_fao_evapotranspiration relative_humidity_2m_max/min/mean dew_point_2m_max/min/mean cloud_cover_max/min/mean pressure_msl_max/min/mean surface_pressure_max/min/mean visibility_max/min/mean cape_max/min/mean vapour_pressure_deficit_max leaf_wetness_probability_mean soil_moisture_0_to_10cm_mean growing_degree_days_base_0_limit_50
hourly (forecast): temperature_2m relative_humidity_2m dew_point_2m apparent_temperature precipitation_probability precipitation rain showers snowfall snow_depth weather_code pressure_msl surface_pressure cloud_cover cloud_cover_low/mid/high visibility evapotranspiration et0_fao_evapotranspiration vapour_pressure_deficit wind_speed_10m/80m/120m/180m wind_direction_10m/80m/120m/180m wind_gusts_10m temperature_80m/120m/180m soil_temperature_0cm/6cm/18cm/54cm soil_moisture_0_to_1cm/1_to_3cm/3_to_9cm/9_to_27cm/27_to_81cm uv_index uv_index_clear_sky is_day sunshine_duration wet_bulb_temperature_2m total_column_integrated_water_vapour cape lifted_index convective_inhibition freezing_level_height boundary_layer_height shortwave_radiation direct_radiation diffuse_radiation direct_normal_irradiance global_tilted_irradiance terrestrial_radiation
history (daily archive): weather_code temperature_2m_max/min/mean apparent_temperature_max/min/mean sunrise sunset daylight_duration sunshine_duration precipitation_sum rain_sum snowfall_sum precipitation_hours wind_speed_10m_max wind_gusts_10m_max wind_direction_10m_dominant shortwave_radiation_sum et0_fao_evapotranspiration
historyHourly: temperature_2m relative_humidity_2m dew_point_2m apparent_temperature precipitation rain snowfall snow_depth weather_code pressure_msl surface_pressure cloud_cover cloud_cover_low/mid/high et0_fao_evapotranspiration vapour_pressure_deficit wind_speed_10m/100m wind_direction_10m/100m wind_gusts_10m soil_temperature_0_to_7cm/7_to_28cm/28_to_100cm/100_to_255cm soil_moisture_0_to_7cm/7_to_28cm/28_to_100cm/100_to_255cm is_day sunshine_duration shortwave_radiation direct_radiation diffuse_radiation direct_normal_irradiance global_tilted_irradiance terrestrial_radiation boundary_layer_height wet_bulb_temperature_2m total_column_integrated_water_vapour cape
airQuality (hourly) / airQualityCurrent: pm10 pm2_5 carbon_monoxide carbon_dioxide* nitrogen_dioxide sulphur_dioxide ozone aerosol_optical_depth dust uv_index uv_index_clear_sky ammonia methane* alder_pollen birch_pollen grass_pollen mugwort_pollen olive_pollen ragweed_pollen (pollen: Europe only) european_aqi european_aqi_pm2_5/pm10/nitrogen_dioxide/ozone/sulphur_dioxide us_aqi us_aqi_pm2_5/pm10/nitrogen_dioxide/ozone/sulphur_dioxide/carbon_monoxide (*hourly only)
marine (daily): wave_height_max wave_direction_dominant wave_period_max wind_wave_height_max wind_wave_direction_dominant wind_wave_period_max wind_wave_peak_period_max swell_wave_height_max swell_wave_direction_dominant swell_wave_period_max swell_wave_peak_period_max
marineHourly: wave_height wave_direction wave_period wind_wave_height/direction/period/peak_period swell_wave_height/direction/period/peak_period ocean_current_velocity ocean_current_direction sea_surface_temperature sea_level_height_msl
climate (daily): temperature_2m_mean/max/min wind_speed_10m_mean/max cloud_cover_mean shortwave_radiation_sum relative_humidity_2m_mean/max/min dew_point_2m_mean/min/max precipitation_sum rain_sum snowfall_sum pressure_msl_mean soil_moisture_0_to_10cm_mean et0_fao_evapotranspiration_sum
ensemble (daily): temperature_2m_max/min/mean precipitation_sum rain_sum snowfall_sum wind_speed_10m_max wind_gusts_10m_max shortwave_radiation_sum weather_code — each also emitted as _min, _max, _mean, _spread, _members.
flood (daily): river_discharge river_discharge_mean/median/max/min/p25/p75
Models
| mode | ids |
|---|---|
forecast (current, daily, hourly) | best_match · ecmwf_ifs025 · ecmwf_aifs025 · gfs_seamless · gfs_global · gfs_hrrr · icon_seamless · icon_global · icon_eu · icon_d2 · gem_seamless · gem_global · meteofrance_seamless · meteofrance_arpege_world · jma_seamless · jma_msm · metno_seamless · knmi_seamless · dmi_seamless · ukmo_seamless · cma_grapes_global · bom_access_global · kma_seamless · italia_meteo_arpae_icon_2i |
ensemble | icon_seamless (default) · icon_global · icon_eu · icon_d2 · gfs_seamless · gfs025 · gfs05 · ecmwf_ifs025 · ecmwf_aifs025 · gem_global · bom_access_global_ensemble · ukmo_global_ensemble_20km · ukmo_uk_ensemble_2km · meteoswiss_icon_ch1 · meteoswiss_icon_ch2 |
climate | EC_Earth3P_HR (default) · CMCC_CM2_VHR4 · FGOALS_f3_H · HiRAM_SIT_HR · MRI_AGCM3_2_S · MPI_ESM1_2_XR · NICAM16_8S |
WMO weather codes (weather_code → weather)
0 Clear sky · 1 Mainly clear · 2 Partly cloudy · 3 Overcast · 45 Fog · 48 Rime fog · 51/53/55 Drizzle light/moderate/dense · 56/57 Freezing drizzle · 61/63/65 Rain slight/moderate/heavy · 66/67 Freezing rain · 71/73/75 Snowfall slight/moderate/heavy · 77 Snow grains · 80/81/82 Rain showers slight/moderate/violent · 85/86 Snow showers · 95 Thunderstorm · 96/99 Thunderstorm with hail
Examples
Two-week outlook for store cities (default variables)
{ "locations": ["Almaty", "Astana", "Shymkent"], "mode": "daily", "days": 14, "geocodeCountry": "KZ" }
Season history for agronomy (per field, daily)
{"locations": ["54.87,69.15", "53.28,69.39"],"mode": "history","startDate": "2026-04-01","endDate": "2026-08-31","variables": ["temperature_2m_mean", "precipitation_sum", "et0_fao_evapotranspiration", "shortwave_radiation_sum", "wind_speed_10m_max"]}
Delivery-risk hours for the next 2 days
{ "locations": ["Berlin, DE", "Hamburg, DE"], "mode": "hourly", "days": 2, "variables": ["temperature_2m", "precipitation_probability", "precipitation", "snowfall", "wind_gusts_10m", "visibility", "weather_code"] }
Air quality now for office locations
{ "locations": ["Almaty", "Tashkent", "Bishkek"], "mode": "airQualityCurrent" }
Forecast certainty: ensemble spread + two models side by side
{ "locations": ["Almaty"], "mode": "ensemble", "days": 7, "models": ["ecmwf_ifs025"] }
{ "locations": ["Almaty"], "mode": "daily", "days": 7, "models": ["ecmwf_ifs025", "gfs_seamless", "icon_seamless"], "variables": ["temperature_2m_max", "precipitation_sum"] }
Climate projection for a site (July 2040)
{ "locations": ["Almaty"], "mode": "climate", "startDate": "2040-07-01", "endDate": "2040-07-31", "models": ["MRI_AGCM3_2_S"] }
Output
Daily row (default variables):
{"input": "Almaty","location": "Almaty, Almaty, Kazakhstan","lat": 43.26889,"lon": 76.95067,"elevation": 794,"country": "Kazakhstan","countryCode": "KZ","timezone": "Asia/Almaty","utcOffsetSeconds": 18000,"mode": "daily","date": "2026-09-13","weather_code": 2,"temperature_2m_max": 30,"temperature_2m_min": 19.9,"precipitation_sum": 0,"precipitation_probability_max": 0,"wind_speed_10m_max": 8.2,"wind_gusts_10m_max": 25.2,"uv_index_max": 5.95,"sunrise": "2026-09-13T05:29","sunset": "2026-09-13T18:06","weather": "Partly cloudy","tempMax": 30,"tempMin": 19.9,"precipitation": 0,"windMax": 8.2,"units": { "temperature_2m_max": "°C", "precipitation_sum": "mm", "wind_speed_10m_max": "km/h" },"sourceUrl": "https://api.open-meteo.com/v1/forecast?latitude=43.25&longitude=76.91&daily=…","fetchedAt": "2026-09-12T23:51:57.792Z"}
| Field | Description |
|---|---|
input, location | What you passed and the resolved place (name, admin1, country). |
lat, lon, elevation | Grid-cell coordinates/elevation used by the model. |
country, countryCode, timezone, utcOffsetSeconds | From the geocoder / API. |
mode, date or time | Granularity; time is local time unless timezone is set. |
<variable> | Every requested variable under its Open-Meteo name (multi-model: <variable>_<model>; ensemble: _min/_max/_mean/_spread/_members). |
weather | Text for weather_code. |
temp, feelsLike, humidity, tempMax, tempMin, precipitation, windMax, uvIndexMax, precipProbability(Max), windSpeed, windDir, cloudCover, pressure, weatherCode | Legacy aliases kept for v0.1 users. |
units | Unit per variable, as reported by the API. |
sourceUrl, fetchedAt | Exact API call and timestamp. |
layout: "compact" rows have granularity, series (parallel arrays incl. time) and units. Failed locations (not geocodable, API error) are not rows and are not charged: they are listed in the SUMMARY key-value record { mode, locations, rows, variables, models, range, errors[{location, error}], errorCount } and in the run's status message; the run fails only when no location returned data.
Use it from code / agents
curl -X POST "https://api.apify.com/v2/acts/yadroo~open-meteo-weather/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H 'Content-Type: application/json' -d '{"locations":["Almaty"],"mode":"current"}'
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('yadroo/open-meteo-weather').call({ locations: ['Berlin, DE'], mode: 'hourly', days: 2, layout: 'compact' });const { items } = await client.dataset(run.defaultDatasetId).listItems();
from apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("yadroo/open-meteo-weather").call(run_input={"locations": ["54.87,69.15"], "mode": "history", "startDate": "2026-04-01", "endDate": "2026-08-31", "variables": ["precipitation_sum", "et0_fao_evapotranspiration"]})items = client.dataset(run["defaultDatasetId"]).list_items().items
MCP: connect https://mcp.apify.com and call the yadroo/open-meteo-weather tool with the same JSON.
Pricing
Pay per event: $0.001 per run start + $0.0005 per row. A 16-day daily forecast for 10 cities = 160 rows ≈ $0.081; 5 months of daily history for 20 fields ≈ 3 000 rows ≈ $1.50; hourly 16-day runs are cheaper with layout: "compact" (1 row per location).
Limits & FAQ
- Freshness. Forecasts update hourly (current every 15 min); ERA5 history lags ~2 days (the actor clamps
endDate); air quality hourly. - Resolution. Best-match forecast 1–11 km depending on region; history 9–25 km; climate 20–50 km.
lat/lonin the output are the grid cell actually used. - Place not found? Use
City, CC,geocodeCountry, or coordinates. Ambiguous names resolve to the most populous match. - Rate limits. Open-Meteo's free tier allows ~10 000 calls/day per IP; the actor makes one call per location and retries 429/5xx three times with backoff. Failed locations are recorded, the run fails only if nothing was fetched.
- Ensemble size. ICON 40 members, GFS 31, ECMWF 51 —
_memberstells you how many were present. - Licence. Data by Open-Meteo.com, CC BY 4.0 — attribute "Weather data by Open-Meteo.com". Non-commercial free use; commercial users should subscribe to Open-Meteo's API plan.
- Roadmap. 15-minutely forecast, solar-panel tilt/azimuth inputs, elevation override, previous-runs comparison.
Made by Yadroo · Sibling actors: osm-geocode · public-holidays · world-bank-indicators · ip-intel