# Open-Meteo Weather Scraper — Forecast, History, Air Quality (`yadroo/open-meteo-weather`) Actor

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.

- **URL**: https://apify.com/yadroo/open-meteo-weather.md
- **Developed by:** [Samat Makatov](https://apify.com/yadroo) (community)
- **Categories:** AI, Travel, Developer tools
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.35 / 1,000 result items

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## 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** — `history` with `et0_fao_evapotranspiration`, `precipitation_sum`, `shortwave_radiation_sum` per field for the season; `daily` with `soil_moisture_0_to_10cm_mean` and `growing_degree_days_base_0_limit_50` for the next two weeks.
- **Logistics / delivery risk** — hourly `precipitation_probability`, `wind_gusts_10m`, `visibility`, `snowfall` for depots and routes; `ensemble` spread to know how certain the forecast is.
- **Retail demand & staffing** — 16-day `temperature_2m_max`, `weather_code` per store city; historical weather to explain last year's sales.
- **Health & ESG reporting** — `airQuality` (PM2.5, ozone, `us_aqi`) and `uv_index_max` for office locations; `climate` projections for 2030–2050 site assessments.
- **Energy** — `shortwave_radiation`, `direct_normal_irradiance`, `wind_speed_100m` (history) for solar/wind yield estimates.
- **Marine & tourism** — `marine` wave height/period and `sea_surface_temperature` for ports, beaches and offshore work windows; `flood` river 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|fahrenheit`, `kmh|ms|mph|kn`, `mm|inch` — override the preset. |
| `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)**

```json
{ "locations": ["Almaty", "Astana", "Shymkent"], "mode": "daily", "days": 14, "geocodeCountry": "KZ" }
```

**Season history for agronomy (per field, daily)**

```json
{
  "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**

```json
{ "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**

```json
{ "locations": ["Almaty", "Tashkent", "Bishkek"], "mode": "airQualityCurrent" }
```

**Forecast certainty: ensemble spread + two models side by side**

```json
{ "locations": ["Almaty"], "mode": "ensemble", "days": 7, "models": ["ecmwf_ifs025"] }
```

```json
{ "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)**

```json
{ "locations": ["Almaty"], "mode": "climate", "startDate": "2040-07-01", "endDate": "2040-07-31", "models": ["MRI_AGCM3_2_S"] }
```

### Output

Daily row (default variables):

```json
{
  "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

```bash
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"}'
```

```js
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();
```

```python
from apify_client import ApifyClient
client = 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`/`lon` in 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 — `_members` tells 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](https://apify.com/yadroo/osm-geocode) · [public-holidays](https://apify.com/yadroo/public-holidays) · [world-bank-indicators](https://apify.com/yadroo/world-bank-indicators) · [ip-intel](https://apify.com/yadroo/ip-intel)

# Actor input Schema

## `locations` (type: `array`):

Place names (optionally `City, CC` or `City, Country` to disambiguate) or `lat,lon` pairs. One API call per location.

## `mode` (type: `string`):

Which Open-Meteo endpoint and granularity. Each mode has its own variable dictionary (see README); defaults are sensible for the mode.

## `days` (type: `integer`):

Forecast days ahead (daily/hourly/marine ≤16, airQuality ≤7, flood ≤210) or days back for history/historyHourly. Ignored when startDate/endDate are set.

## `units` (type: `string`):

Preset; individual unit fields below override it.

## `variables` (type: `array`):

Open-Meteo variable names valid for the chosen mode, e.g. daily: `temperature_2m_max`, `precipitation_sum`, `et0_fao_evapotranspiration`; hourly: `temperature_2m`, `soil_moisture_0_to_1cm`, `shortwave_radiation`. Unknown names are skipped with a warning. Empty = mode defaults. Full lists in README.

## `models` (type: `array`):

Forecast modes: `best_match` (default), `ecmwf_ifs025`, `gfs_seamless`, `icon_seamless`, `gem_seamless`, `meteofrance_seamless`, `jma_seamless`, `ukmo_seamless`… Several models → one column per model (`temperature_2m_max_gfs_seamless`). Climate: `EC_Earth3P_HR` (default), `MRI_AGCM3_2_S`, `CMCC_CM2_VHR4`… Ensemble: `icon_seamless` (default), `gfs_seamless`, `ecmwf_ifs025`…

## `includeEnsembleMembers` (type: `boolean`):

Ensemble mode: add `<var>_values` arrays with every member besides min/max/mean/spread.

## `startDate` (type: `string`):

YYYY-MM-DD. History: archive from 1940-01-01. Forecast modes: up to ~92 days back and 16 ahead. Climate: 1950–2050.

## `endDate` (type: `string`):

YYYY-MM-DD (inclusive). History defaults to 2 days ago (ERA5 latency).

## `pastDays` (type: `integer`):

Prepend N days of recent observations/analysis to a forecast (daily, hourly, airQuality, marine, ensemble, flood).

## `timezone` (type: `string`):

`auto` = local time of each location; or an IANA name like `Asia/Almaty`, `UTC`.

## `temperatureUnit` (type: `string`):

Overrides the preset.

## `windSpeedUnit` (type: `string`):

Overrides the preset.

## `precipitationUnit` (type: `string`):

Overrides the preset.

## `geocodeLanguage` (type: `string`):

Language for place-name matching and the returned `location` label, e.g. `ru`, `kk`, `de`.

## `geocodeCountry` (type: `string`):

ISO-3166 alpha-2, e.g. `KZ` — restrict all place-name lookups to one country.

## `cellSelection` (type: `string`):

Which model grid cell to use for coastal locations.

## `airQualityDomain` (type: `string`):

Air-quality modes only.

## `layout` (type: `string`):

Compact is cheaper for long hourly ranges (1 billed item per location).

## `maxItems` (type: `integer`):

Hard cap on dataset rows.

## Actor input object example

```json
{
  "locations": [
    "Almaty",
    "Berlin, DE",
    "40.71,-74.01"
  ],
  "mode": "daily",
  "days": 7,
  "units": "metric",
  "includeEnsembleMembers": false,
  "timezone": "auto",
  "temperatureUnit": "",
  "windSpeedUnit": "",
  "precipitationUnit": "",
  "geocodeLanguage": "en",
  "cellSelection": "land",
  "airQualityDomain": "auto",
  "layout": "rows",
  "maxItems": 20000
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "locations": [
        "Almaty",
        "Berlin, DE",
        "40.71,-74.01"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("yadroo/open-meteo-weather").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "locations": [
        "Almaty",
        "Berlin, DE",
        "40.71,-74.01",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("yadroo/open-meteo-weather").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "locations": [
    "Almaty",
    "Berlin, DE",
    "40.71,-74.01"
  ]
}' |
apify call yadroo/open-meteo-weather --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,yadroo/open-meteo-weather"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/V1NgzIM5HA1NY8DNC/builds/be7Zo5gds3fZaNoXO/openapi.json
