tap-openmeteo is a Singer tap for the Open-Meteo weather API.
Built with the Meltano Tap SDK for Singer Taps.
- Multiple Locations: Fetch weather data for any number of locations worldwide
- Comprehensive Weather Data: Hourly, daily, 15-minutely, current conditions, and historical data
- Incremental Syncs: Efficient syncing with support for incremental updates
- Flexible Configuration: Extensive configuration options for weather variables, units, and models
- API Key Support: Optional API key for commercial usage
- Multiple Weather Models: Select specific weather models or use best-match automatic selection
| Stream | Description | Incremental |
|---|---|---|
weather_forecast |
Forecast metadata and configuration | ✓ |
weather_hourly |
Hourly weather variables (up to 16 days forecast) | ✓ |
weather_daily |
Daily weather aggregations | ✓ |
weather_current |
Current weather conditions | ✓ |
weather_minutely_15 |
15-minute resolution data (Central Europe & North America) | ✓ |
weather_historical |
Historical weather data (back to 1940) | ✓ |
Install from source:
pip install git+https://github.com/YOUR_ORG/tap-openmeteo.gitOr with uv:
uv tool install git+https://github.com/YOUR_ORG/tap-openmeteo.git| Setting | Type | Description |
|---|---|---|
locations |
array | List of locations with name, latitude, longitude |
| Setting | Type | Default | Description |
|---|---|---|---|
api_key |
string | - | API key for commercial use |
api_url |
string | https://api.open-meteo.com |
API base URL |
forecast_days |
integer | 7 | Number of forecast days (0-16) |
past_days |
integer | 0 | Include past days in forecast (0-92) |
start_date |
date | - | Start date for historical data |
end_date |
date | - | End date for historical data |
hourly_variables |
array | See below | Hourly weather variables |
daily_variables |
array | See below | Daily weather variables |
current_variables |
array | See below | Current weather variables |
minutely_15_variables |
array | [] | 15-minutely variables |
temperature_unit |
string | celsius |
celsius or fahrenheit |
wind_speed_unit |
string | kmh |
kmh, ms, mph, or kn |
precipitation_unit |
string | mm |
mm or inch |
timezone |
string | auto |
Default timezone for all locations |
models |
array | [] | Specific weather models to use |
cell_selection |
string | land |
Grid cell selection: land, sea, nearest |
streams_to_sync |
array | See below | Which streams to sync |
[
"temperature_2m",
"relative_humidity_2m",
"precipitation",
"weather_code",
"wind_speed_10m",
"wind_direction_10m"
][
"weather_code",
"temperature_2m_max",
"temperature_2m_min",
"precipitation_sum",
"sunrise",
"sunset"
][
"weather_forecast",
"weather_hourly",
"weather_daily"
]temperature_2m,temperature_80m,temperature_120m,temperature_180mrelative_humidity_2m,dew_point_2m,apparent_temperatureprecipitation,precipitation_probability,rain,showers,snowfall,snow_depthweather_code,cloud_cover,cloud_cover_low,cloud_cover_mid,cloud_cover_highpressure_msl,surface_pressure,visibilitywind_speed_10m,wind_speed_80m,wind_speed_120m,wind_speed_180mwind_direction_10m,wind_direction_80m,wind_direction_120m,wind_direction_180mwind_gusts_10msoil_temperature_0cm,soil_temperature_6cm,soil_temperature_18cm,soil_temperature_54cmsoil_moisture_0_to_1cm,soil_moisture_1_to_3cm,soil_moisture_3_to_9cm,soil_moisture_9_to_27cm,soil_moisture_27_to_81cmuv_index,uv_index_clear_sky,is_day,sunshine_durationshortwave_radiation,direct_radiation,diffuse_radiation,direct_normal_irradianceglobal_tilted_irradiance,terrestrial_radiationevapotranspiration,et0_fao_evapotranspiration,vapour_pressure_deficitcape,freezing_level_height
weather_codetemperature_2m_max,temperature_2m_min,temperature_2m_meanapparent_temperature_max,apparent_temperature_min,apparent_temperature_meansunrise,sunset,daylight_duration,sunshine_durationuv_index_max,uv_index_clear_sky_maxprecipitation_sum,rain_sum,showers_sum,snowfall_sumprecipitation_hours,precipitation_probability_maxwind_speed_10m_max,wind_gusts_10m_max,wind_direction_10m_dominantshortwave_radiation_sum,et0_fao_evapotranspiration
{
"locations": [
{
"name": "Berlin",
"latitude": 52.52,
"longitude": 13.41
}
]
}{
"api_key": "your-commercial-api-key",
"api_url": "https://customer-api.open-meteo.com",
"locations": [
{
"name": "Berlin",
"latitude": 52.52,
"longitude": 13.41,
"elevation": 34,
"timezone": "Europe/Berlin"
},
{
"name": "New York",
"latitude": 40.71,
"longitude": -74.01,
"timezone": "America/New_York"
}
],
"forecast_days": 14,
"past_days": 2,
"hourly_variables": [
"temperature_2m",
"relative_humidity_2m",
"apparent_temperature",
"precipitation",
"rain",
"snowfall",
"weather_code",
"cloud_cover",
"wind_speed_10m",
"wind_direction_10m",
"wind_gusts_10m",
"uv_index"
],
"daily_variables": [
"weather_code",
"temperature_2m_max",
"temperature_2m_min",
"apparent_temperature_max",
"apparent_temperature_min",
"sunrise",
"sunset",
"precipitation_sum",
"rain_sum",
"snowfall_sum",
"wind_speed_10m_max",
"wind_gusts_10m_max"
],
"current_variables": [
"temperature_2m",
"relative_humidity_2m",
"apparent_temperature",
"is_day",
"precipitation",
"weather_code",
"cloud_cover",
"wind_speed_10m",
"wind_direction_10m"
],
"temperature_unit": "celsius",
"wind_speed_unit": "kmh",
"precipitation_unit": "mm",
"timezone": "auto",
"streams_to_sync": [
"weather_forecast",
"weather_hourly",
"weather_daily",
"weather_current"
]
}{
"locations": [
{
"name": "Berlin",
"latitude": 52.52,
"longitude": 13.41
}
],
"start_date": "2024-01-01",
"end_date": "2024-01-31",
"hourly_variables": [
"temperature_2m",
"precipitation",
"weather_code"
],
"streams_to_sync": ["weather_historical"]
}# Show version
tap-openmeteo --version
# Show help
tap-openmeteo --help
# Discover streams
tap-openmeteo --config config.json --discover > catalog.json
# Run sync
tap-openmeteo --config config.json --catalog catalog.jsonAdd to your meltano.yml:
plugins:
extractors:
- name: tap-openmeteo
namespace: tap_openmeteo
pip_url: git+https://github.com/celine-eu/tap-openmeteo.git
config:
locations:
- name: Berlin
latitude: 52.52
longitude: 13.41
forecast_days: 7
hourly_variables:
- temperature_2m
- precipitation
- weather_codeRun the pipeline:
meltano run tap-openmeteo target-jsonlThe tap supports incremental syncing for efficient data updates:
- Hourly/Daily/Historical streams: Use timestamp-based replication keys
- State tracking: Maintains sync state between runs
- Configurable lookback: Use
past_daysto include recent historical data
Open-Meteo combines data from multiple national weather services. You can either:
- Use automatic selection (default): Best models are selected for each location
- Specify models: Set
modelsconfig to use specific weather models
Available models include:
ecmwf_ifs025- ECMWF IFS (global)gfs_seamless- NOAA GFS (global)icon_seamless- DWD ICON (Europe)meteofrance_seamless- Météo-Francejma_seamless- JMA (Japan)gem_seamless- GEM (Canada)- And many more regional models
For commercial use:
- Get an API key from Open-Meteo pricing
- Set
api_keyin your configuration - Use
api_url: https://customer-api.open-meteo.com
Free tier is available for non-commercial use without an API key.
# Clone the repository
git clone https://github.com/YOUR_ORG/tap-openmeteo.git
cd tap-openmeteo
# Install with dev dependencies
pip install -e ".[dev]"pytest# Linting
ruff check .
# Type checking
mypy tap_openmeteoApache 2.0
Contributions are welcome! Please open an issue or submit a pull request.