action0-open-meteo-api
Fully typed Python clients for the Open-Meteo weather APIs, built on action0-client: every endpoint is a typed operation dataclass that runs synchronously, on asyncio or on Twisted — the backend you plug in decides, and the static types follow along.
The code is generated from Open-Meteo's official OpenAPI schemas by action0-client-openapi and checked in — this project doubles as the worked real-world example of that generator (see How this library was generated).
uv add "action0-open-meteo-api[httpx]"
from action0.open_meteo.forecast import ForecastClient, GetV1Forecast, GetV1ForecastHourlyItem
from action0.client.backends.requests import RequestsBackend
client = ForecastClient(RequestsBackend()) # https://api.open-meteo.com
weather = client.send(
GetV1Forecast(
latitude="48.21",
longitude="16.37",
hourly=[GetV1ForecastHourlyItem.TEMPERATURE_2M, GetV1ForecastHourlyItem.RAIN],
forecast_days=1,
)
)
print(weather.hourly.temperature_2m) # [17.2, 16.8, ...]
from action0.client.backends.httpx import AsyncHttpxBackend
client = ForecastClient(AsyncHttpxBackend())
weather = await client.send(GetV1Forecast(latitude="48.21", longitude="16.37"))
One subpackage per Open-Meteo service, each client preset to its base URL:
Subpackage (action0.open_meteo....) |
Client | API |
|---|---|---|
forecast |
ForecastClient |
api.open-meteo.com — weather forecasts |
historical_weather |
HistoricalWeatherClient |
archive-api.open-meteo.com — 1940 → today |
air_quality |
AirQualityClient |
air-quality-api.open-meteo.com |
marine |
MarineClient |
marine-api.open-meteo.com — waves & swell |
ensemble |
EnsembleClient |
ensemble-api.open-meteo.com — ensemble members |
seasonal |
SeasonalClient |
seasonal-api.open-meteo.com — up to 9 months |
climate |
ClimateClient |
climate-api.open-meteo.com — climate change projections |
flood |
FloodClient |
flood-api.open-meteo.com — river discharge |
elevation |
ElevationClient |
api.open-meteo.com/v1/elevation |
geocoding |
GeocodingClient |
geocoding-api.open-meteo.com — place name → coordinates |
Enumerable request parameters are generated enums (IDE completion knows
the legal weather variables), dates are datetime.date, and every JSON
answer parses into plain typed dataclasses — mypy strict, pyright and ty
pass on the generated code. Even the error path is typed: Open-Meteo's
documented 400 answer raises a generated BadRequestError carrying the
parsed reason. The Open-Meteo APIs are free for
non-commercial use without an API key (terms);
commercial subscriptions pass their key as the operations' apikey
field.
Requires Python 3.11 or newer.
Full documentation including the API reference: https://laughinjar.github.io/action0-open-meteo-api/
Development
Uses uv: uv run pytest runs the tests,
uv run ruff format && uv run ruff check formats and lints, uv run mypy, uv run pyright and uv run ty check type-check (all strict —
on the generated code too). The generated subpackages under
src/action0/open_meteo/ are regenerated from the schemas in
schemas/ with bash tools/regenerate.sh — never edited by hand.
AI disclosure
This library was developed with substantial help from Claude (Anthropic), under human direction and review. The client code itself is generated by action0-client-openapi from Open-Meteo's OpenAPI schemas.
License
MIT — see LICENSE. Open-Meteo data and APIs are subject to Open-Meteo's terms (CC BY 4.0 attribution).
Metadata
Release files for action0-open-meteo-api 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| action0_open_meteo_api-0.1.0.tar.gz | 228.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| action0_open_meteo_api-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 307.0 kB
Release files / action0_open_meteo_api-0.1.0.tar.gz
| Download URL | action0_open_meteo_api-0.1.0.tar.gz |
|---|---|
| Size | 228.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
60633839a2b0bff7000e46b927859867f06a02bbd71d79be43687d125da194bc
|
|
BLAKE2b-256 checksum How to use checksums |
e98e157c0ec694a86dc9f2970b3ac1a810f371ed7d636e1f3e7d4ee7a6eab8eb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 15, 2026.
Transparency logRelease files / action0_open_meteo_api-0.1.0-py3-none-any.whl
| Download URL | action0_open_meteo_api-0.1.0-py3-none-any.whl |
|---|---|
| Size | 78.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
126f318921d6a4b6c7b5e5c02428ae7213c9ac61257b765249883e6c521386e6
|
|
BLAKE2b-256 checksum How to use checksums |
09d72313abec14e9b8b81236a3564688570e1e17b02db0c0610b7f524b8e57f5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 15, 2026.
Transparency log