> ## Documentation Index
> Fetch the complete documentation index at: https://docs.beta.b3os.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Open-Meteo

The io.b3os/open-meteo pack: 6 actions with call snippets, fixture outputs, connection setup and error codes, generated from version 1.0.0.

`io.b3os/open-meteo` 1.0.0 · `weather`, `geocoding` · MIT

Weather for any coordinate on Earth from the Open-Meteo API: current conditions, hourly and daily forecasts up to 16 days, historical weather back to 1940, air quality, and place search to turn a name into coordinates. Keyless: no connection needed. Open-Meteo's free tier is for non-commercial use under 10,000 calls a day; commercial use needs your own Open-Meteo plan. For US locations, io.b3os/nws (the National Weather Service) adds official alerts.

Every call's result carries `upstream_status` and `timing`: `validate_ms`, `inject_ms`, `render_ms`, `upstream_ms`, `map_ms` and `total_ms`. `upstream` is the service's time; the others are B3OS's own ([call actions](/actions/call)). The snippets below show no timing values, because a fixture records none.

## Connection

No credential: a keyless public API. Calls name no connection.

Hosts it reaches: `api.open-meteo.com`, `geocoding-api.open-meteo.com`, `air-quality-api.open-meteo.com`, `archive-api.open-meteo.com`.

## Actions

| Action | Effect | MCP tool | Title |
|---|---|---|---|
| [`search-places`](/actions/catalog/open-meteo#open-meteo-search-places) | read | `open-meteo__search-places` | Search places |
| [`get-current-weather`](/actions/catalog/open-meteo#open-meteo-get-current-weather) | read | `open-meteo__get-current-weather` | Get current weather |
| [`get-daily-forecast`](/actions/catalog/open-meteo#open-meteo-get-daily-forecast) | read | `open-meteo__get-daily-forecast` | Get daily forecast |
| [`get-hourly-forecast`](/actions/catalog/open-meteo#open-meteo-get-hourly-forecast) | read | `open-meteo__get-hourly-forecast` | Get hourly forecast |
| [`get-historical-weather`](/actions/catalog/open-meteo#open-meteo-get-historical-weather) | read | `open-meteo__get-historical-weather` | Get historical weather |
| [`get-air-quality`](/actions/catalog/open-meteo#open-meteo-get-air-quality) | read | `open-meteo__get-air-quality` | Get air quality |

search-places

**Search places.** Find places by name and get their coordinates, country code, region and time zone, best match first. Use it first when you only have a place name: every weather action in this pack takes latitude and longitude.

Ref `io.b3os/open-meteo/search-places@1.0.0` · effect `read` · no connection · MCP tool `open-meteo__search-places`

**curl**

```bash
    curl -s https://beta-api.b3os.org/v1/actions/call \
      -H "Authorization: Bearer $B3OS_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
          "ref": "io.b3os/open-meteo/search-places@1",
          "input": {"name": "Eugene", "count": 2}
        }'
    ```
  **TypeScript**

```ts
    import { B3OS } from "@b3os/sdk";

    const b3os = new B3OS();
    const result = await b3os.actions.call({
      ref: "io.b3os/open-meteo/search-places@1",
      input: { name: "Eugene", count: 2 },
    });
    console.log(result.output);
    ```
  **Python**

```python
    from b3os import B3OS

    b3os = B3OS()
    result = b3os.actions.call({
        "ref": "io.b3os/open-meteo/search-places@1",
        "input": {"name": "Eugene", "count": 2},
    })
    print(result["output"])
    ```
  **MCP**

```json
    {
      "method": "tools/call",
      "params": {
        "name": "open-meteo__search-places",
        "arguments": {"name": "Eugene", "count": 2}
      }
    }
    ```

    Expose the pack as tools with `--packs open-meteo` on the local server or `?packs=open-meteo` on the remote URL, and the agent calls `open-meteo__search-places` with the action's input. The tool needs no connection. Without exposing the pack, `actions_call` takes the same input with `ref`.

Output, labeled `fixture`: Search places (response recorded 2026-10-26). From the bundle's `fixtures/search-places.json`, not a live call.

```json
{
  "places": [
    {
      "id": 5725846,
      "name": "Eugene",
      "latitude": 44.05207,
      "longitude": -123.08675,
      "country_code": "US",
      "region": "Oregon",
      "timezone": "America/Los_Angeles",
      "population": 176654
    },
    {
      "id": 4385819,
      "name": "Eugene",
      "latitude": 38.35281,
      "longitude": -92.40379,
      "country_code": "US",
      "region": "Missouri",
      "timezone": "America/Chicago",
      "population": 156
    }
  ]
}
```

When the service answers with an error, the call fails with [`upstream_error`](/errors#upstream_error) and `pack_error.code` is one of:

| `pack_error.code` | Service status | Retryable | Message |
|---|---|---|---|
| `invalid_request` | 400 | no | built from the service's response |
| `rate_limited` | 429 | yes | Open-Meteo rate limit reached (the free tier allows 10,000 calls a day per client). |

get-current-weather

**Get current weather.** Current conditions at a coordinate: temperature, feels-like temperature, humidity, precipitation, cloud cover, wind and a plain-words description of the WMO weather code. Values are model data updated every 15 minutes, in the units you ask for.

Ref `io.b3os/open-meteo/get-current-weather@1.0.0` · effect `read` · no connection · MCP tool `open-meteo__get-current-weather`

**curl**

```bash
    curl -s https://beta-api.b3os.org/v1/actions/call \
      -H "Authorization: Bearer $B3OS_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
          "ref": "io.b3os/open-meteo/get-current-weather@1",
          "input": {"latitude": 44.05, "longitude": -123.09}
        }'
    ```
  **TypeScript**

```ts
    import { B3OS } from "@b3os/sdk";

    const b3os = new B3OS();
    const result = await b3os.actions.call({
      ref: "io.b3os/open-meteo/get-current-weather@1",
      input: { latitude: 44.05, longitude: -123.09 },
    });
    console.log(result.output);
    ```
  **Python**

```python
    from b3os import B3OS

    b3os = B3OS()
    result = b3os.actions.call({
        "ref": "io.b3os/open-meteo/get-current-weather@1",
        "input": {"latitude": 44.05, "longitude": -123.09},
    })
    print(result["output"])
    ```
  **MCP**

```json
    {
      "method": "tools/call",
      "params": {
        "name": "open-meteo__get-current-weather",
        "arguments": {"latitude": 44.05, "longitude": -123.09}
      }
    }
    ```

    Expose the pack as tools with `--packs open-meteo` on the local server or `?packs=open-meteo` on the remote URL, and the agent calls `open-meteo__get-current-weather` with the action's input. The tool needs no connection. Without exposing the pack, `actions_call` takes the same input with `ref`.

Output, labeled `fixture`: Get current weather (response recorded 2026-10-26). From the bundle's `fixtures/get-current-weather.json`, not a live call.

```json
{
  "time": "2026-10-26T00:00",
  "timezone": "America/Los_Angeles",
  "temperature": 10.2,
  "apparent_temperature": 8.8,
  "relative_humidity_percent": 90,
  "precipitation": 0,
  "cloud_cover_percent": 100,
  "wind_speed": 7.1,
  "wind_direction_degrees": 149,
  "is_day": false,
  "weather_code": 3,
  "conditions": "Overcast",
  "units": {"temperature": "°C", "precipitation": "mm", "wind_speed": "km/h"}
}
```

When the service answers with an error, the call fails with [`upstream_error`](/errors#upstream_error) and `pack_error.code` is one of:

| `pack_error.code` | Service status | Retryable | Message |
|---|---|---|---|
| `invalid_request` | 400 | no | built from the service's response |
| `rate_limited` | 429 | yes | Open-Meteo rate limit reached (the free tier allows 10,000 calls a day per client). |

get-daily-forecast

**Get daily forecast.** Daily forecast for up to 16 days at a coordinate: high and low temperature, precipitation total and maximum probability, maximum wind, sunrise, sunset and conditions in words. The days come as parallel arrays: index i of every list in days describes the date days.date[i].

Ref `io.b3os/open-meteo/get-daily-forecast@1.0.0` · effect `read` · no connection · MCP tool `open-meteo__get-daily-forecast`

**curl**

```bash
    curl -s https://beta-api.b3os.org/v1/actions/call \
      -H "Authorization: Bearer $B3OS_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
          "ref": "io.b3os/open-meteo/get-daily-forecast@1",
          "input": {"latitude": 52.52, "longitude": 13.41, "days": 3}
        }'
    ```
  **TypeScript**

```ts
    import { B3OS } from "@b3os/sdk";

    const b3os = new B3OS();
    const result = await b3os.actions.call({
      ref: "io.b3os/open-meteo/get-daily-forecast@1",
      input: { latitude: 52.52, longitude: 13.41, days: 3 },
    });
    console.log(result.output);
    ```
  **Python**

```python
    from b3os import B3OS

    b3os = B3OS()
    result = b3os.actions.call({
        "ref": "io.b3os/open-meteo/get-daily-forecast@1",
        "input": {"latitude": 52.52, "longitude": 13.41, "days": 3},
    })
    print(result["output"])
    ```
  **MCP**

```json
    {
      "method": "tools/call",
      "params": {
        "name": "open-meteo__get-daily-forecast",
        "arguments": {"latitude": 52.52, "longitude": 13.41, "days": 3}
      }
    }
    ```

    Expose the pack as tools with `--packs open-meteo` on the local server or `?packs=open-meteo` on the remote URL, and the agent calls `open-meteo__get-daily-forecast` with the action's input. The tool needs no connection. Without exposing the pack, `actions_call` takes the same input with `ref`.

Output, labeled `fixture`: Get daily forecast (response recorded 2026-10-26). From the bundle's `fixtures/get-daily-forecast.json`, not a live call.

```json
{
  "timezone": "Europe/Berlin",
  "days": {
    "date": ["2026-10-26", "2026-10-27", "2026-10-28"],
    "temperature_max": [13.2, 15.4, 13.7],
    "temperature_min": [7.7, 7.9, 8.6],
    "precipitation_sum": [0, 0, 2],
    "precipitation_probability_max_percent": [5, 3, 32],
    "wind_speed_max": [17.6, 12.4, 11.3],
    "sunrise": ["2026-10-26T06:51", "2026-10-27T06:53", "2026-10-28T06:55"],
    "sunset": ["2026-10-26T16:48", "2026-10-27T16:46", "2026-10-28T16:44"],
    "weather_code": [3, 3, 61],
    "conditions": ["Overcast", "Overcast", "Slight rain"]
  },
  "units": {"temperature": "°C", "precipitation": "mm", "wind_speed": "km/h"}
}
```

When the service answers with an error, the call fails with [`upstream_error`](/errors#upstream_error) and `pack_error.code` is one of:

| `pack_error.code` | Service status | Retryable | Message |
|---|---|---|---|
| `invalid_request` | 400 | no | built from the service's response |
| `rate_limited` | 429 | yes | Open-Meteo rate limit reached (the free tier allows 10,000 calls a day per client). |

get-hourly-forecast

**Get hourly forecast.** Hour-by-hour forecast for the next 1 to 168 hours at a coordinate: temperature, precipitation and its probability, cloud cover, wind and conditions in words. Parallel arrays: index i of every list in hours describes the hour hours.time[i] (local time).

Ref `io.b3os/open-meteo/get-hourly-forecast@1.0.0` · effect `read` · no connection · MCP tool `open-meteo__get-hourly-forecast`

**curl**

```bash
    curl -s https://beta-api.b3os.org/v1/actions/call \
      -H "Authorization: Bearer $B3OS_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
          "ref": "io.b3os/open-meteo/get-hourly-forecast@1",
          "input": {"latitude": 35.68, "longitude": 139.69, "hours": 4}
        }'
    ```
  **TypeScript**

```ts
    import { B3OS } from "@b3os/sdk";

    const b3os = new B3OS();
    const result = await b3os.actions.call({
      ref: "io.b3os/open-meteo/get-hourly-forecast@1",
      input: { latitude: 35.68, longitude: 139.69, hours: 4 },
    });
    console.log(result.output);
    ```
  **Python**

```python
    from b3os import B3OS

    b3os = B3OS()
    result = b3os.actions.call({
        "ref": "io.b3os/open-meteo/get-hourly-forecast@1",
        "input": {"latitude": 35.68, "longitude": 139.69, "hours": 4},
    })
    print(result["output"])
    ```
  **MCP**

```json
    {
      "method": "tools/call",
      "params": {
        "name": "open-meteo__get-hourly-forecast",
        "arguments": {"latitude": 35.68, "longitude": 139.69, "hours": 4}
      }
    }
    ```

    Expose the pack as tools with `--packs open-meteo` on the local server or `?packs=open-meteo` on the remote URL, and the agent calls `open-meteo__get-hourly-forecast` with the action's input. The tool needs no connection. Without exposing the pack, `actions_call` takes the same input with `ref`.

Output, labeled `fixture`: Get hourly forecast (response recorded 2026-10-26). From the bundle's `fixtures/get-hourly-forecast.json`, not a live call.

```json
{
  "timezone": "Asia/Tokyo",
  "hours": {
    "time": [
      "2026-10-26T16:00",
      "2026-10-26T17:00",
      "2026-10-26T18:00",
      "2026-10-26T19:00"
    ],
    "temperature": [16.7, 16.5, 16.4, 16.3],
    "precipitation_probability_percent": [100, 100, 100, 100],
    "precipitation": [3.3, 3.4, 1.7, 3.8],
    "cloud_cover_percent": [88, 74, 84, 93],
    "wind_speed": [4.6, 3.1, 2.9, 4.4],
    "weather_code": [63, 63, 61, 63],
    "conditions": ["Moderate rain", "Moderate rain", "Slight rain", "Moderate rain"]
  },
  "units": {"temperature": "°C", "precipitation": "mm", "wind_speed": "km/h"}
}
```

When the service answers with an error, the call fails with [`upstream_error`](/errors#upstream_error) and `pack_error.code` is one of:

| `pack_error.code` | Service status | Retryable | Message |
|---|---|---|---|
| `invalid_request` | 400 | no | built from the service's response |
| `rate_limited` | 429 | yes | Open-Meteo rate limit reached (the free tier allows 10,000 calls a day per client). |

get-historical-weather

**Get historical weather.** Daily weather observed (reanalysis) between two past dates at a coordinate, from 1940 up to about five days ago: high and low temperature, precipitation total, maximum wind and conditions in words. At most 366 days per call. Parallel arrays: index i of every list in days describes days.date[i].

Ref `io.b3os/open-meteo/get-historical-weather@1.0.0` · effect `read` · no connection · MCP tool `open-meteo__get-historical-weather`

**curl**

```bash
    curl -s https://beta-api.b3os.org/v1/actions/call \
      -H "Authorization: Bearer $B3OS_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
          "ref": "io.b3os/open-meteo/get-historical-weather@1",
          "input": {
            "latitude": 44.05,
            "longitude": -123.09,
            "start_date": "2026-01-01",
            "end_date": "2026-01-03",
            "temperature_unit": "fahrenheit",
            "precipitation_unit": "inch"
          }
        }'
    ```
  **TypeScript**

```ts
    import { B3OS } from "@b3os/sdk";

    const b3os = new B3OS();
    const result = await b3os.actions.call({
      ref: "io.b3os/open-meteo/get-historical-weather@1",
      input: {
        latitude: 44.05,
        longitude: -123.09,
        start_date: "2026-01-01",
        end_date: "2026-01-03",
        temperature_unit: "fahrenheit",
        precipitation_unit: "inch",
      },
    });
    console.log(result.output);
    ```
  **Python**

```python
    from b3os import B3OS

    b3os = B3OS()
    result = b3os.actions.call({
        "ref": "io.b3os/open-meteo/get-historical-weather@1",
        "input": {
            "latitude": 44.05,
            "longitude": -123.09,
            "start_date": "2026-01-01",
            "end_date": "2026-01-03",
            "temperature_unit": "fahrenheit",
            "precipitation_unit": "inch",
        },
    })
    print(result["output"])
    ```
  **MCP**

```json
    {
      "method": "tools/call",
      "params": {
        "name": "open-meteo__get-historical-weather",
        "arguments": {
          "latitude": 44.05,
          "longitude": -123.09,
          "start_date": "2026-01-01",
          "end_date": "2026-01-03",
          "temperature_unit": "fahrenheit",
          "precipitation_unit": "inch"
        }
      }
    }
    ```

    Expose the pack as tools with `--packs open-meteo` on the local server or `?packs=open-meteo` on the remote URL, and the agent calls `open-meteo__get-historical-weather` with the action's input. The tool needs no connection. Without exposing the pack, `actions_call` takes the same input with `ref`.

Output, labeled `fixture`: Get historical weather (response recorded 2026-10-26). From the bundle's `fixtures/get-historical-weather.json`, not a live call.

```json
{
  "timezone": "America/Los_Angeles",
  "days": {
    "date": ["2026-01-01", "2026-01-02", "2026-01-03"],
    "temperature_max": [41.5, 51.6, 56.4],
    "temperature_min": [32.2, 40.5, 39.9],
    "precipitation_sum": [0.539, 0.11, 0.602],
    "wind_speed_max": [5.6, 10.2, 22.4],
    "weather_code": [61, 61, 63],
    "conditions": ["Slight rain", "Slight rain", "Moderate rain"]
  },
  "units": {"temperature": "°F", "precipitation": "inch", "wind_speed": "km/h"}
}
```

When the service answers with an error, the call fails with [`upstream_error`](/errors#upstream_error) and `pack_error.code` is one of:

| `pack_error.code` | Service status | Retryable | Message |
|---|---|---|---|
| `invalid_request` | 400 | no | built from the service's response |
| `rate_limited` | 429 | yes | Open-Meteo rate limit reached (the free tier allows 10,000 calls a day per client). |

get-air-quality

**Get air quality.** Current air quality at a coordinate from the CAMS models: US and European AQI, PM2.5, PM10, ozone, nitrogen dioxide, sulphur dioxide and carbon monoxide in micrograms per cubic metre. Coverage is global at about 11 km resolution, finer over Europe.

Ref `io.b3os/open-meteo/get-air-quality@1.0.0` · effect `read` · no connection · MCP tool `open-meteo__get-air-quality`

**curl**

```bash
    curl -s https://beta-api.b3os.org/v1/actions/call \
      -H "Authorization: Bearer $B3OS_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
          "ref": "io.b3os/open-meteo/get-air-quality@1",
          "input": {"latitude": 34.05, "longitude": -118.24}
        }'
    ```
  **TypeScript**

```ts
    import { B3OS } from "@b3os/sdk";

    const b3os = new B3OS();
    const result = await b3os.actions.call({
      ref: "io.b3os/open-meteo/get-air-quality@1",
      input: { latitude: 34.05, longitude: -118.24 },
    });
    console.log(result.output);
    ```
  **Python**

```python
    from b3os import B3OS

    b3os = B3OS()
    result = b3os.actions.call({
        "ref": "io.b3os/open-meteo/get-air-quality@1",
        "input": {"latitude": 34.05, "longitude": -118.24},
    })
    print(result["output"])
    ```
  **MCP**

```json
    {
      "method": "tools/call",
      "params": {
        "name": "open-meteo__get-air-quality",
        "arguments": {"latitude": 34.05, "longitude": -118.24}
      }
    }
    ```

    Expose the pack as tools with `--packs open-meteo` on the local server or `?packs=open-meteo` on the remote URL, and the agent calls `open-meteo__get-air-quality` with the action's input. The tool needs no connection. Without exposing the pack, `actions_call` takes the same input with `ref`.

Output, labeled `fixture`: Get air quality (response recorded 2026-10-26). From the bundle's `fixtures/get-air-quality.json`, not a live call.

```json
{
  "time": "2026-10-26T00:00",
  "timezone": "America/Los_Angeles",
  "us_aqi": 69,
  "european_aqi": 70,
  "pm2_5": 25.1,
  "pm10": 25.8,
  "ozone": 0,
  "nitrogen_dioxide": 80.7,
  "sulphur_dioxide": 4.3,
  "carbon_monoxide": 359
}
```

When the service answers with an error, the call fails with [`upstream_error`](/errors#upstream_error) and `pack_error.code` is one of:

| `pack_error.code` | Service status | Retryable | Message |
|---|---|---|---|
| `invalid_request` | 400 | no | built from the service's response |
| `rate_limited` | 429 | yes | Open-Meteo rate limit reached (the free tier allows 10,000 calls a day per client). |