Wetter API
Free, JSON-based weather API powered by DWD (Deutscher Wetterdienst) and Open-Meteo. Get current conditions, multi-day forecasts, and location search. No API key required.
Current Weather
Returns current weather conditions for a given location. The :location parameter accepts a city name (e.g. Berlin) or coordinates as lat,lon (e.g. 52.52,13.40).
Parameters
| Parameter | Type | Description |
|---|---|---|
:location | string required | City name or lat,lon coordinates |
Example Request
GET /api/v1/weather/Berlin
Response
{
"location": {
"name": "Berlin",
"lat": 52.52,
"lon": 13.40,
"country": "de"
},
"current": {
"temperature": 10,
"humidity": 65,
"wind_speed": 12.3,
"wind_direction": "SW",
"wind_direction_degrees": 225,
"pressure": 1020.5,
"cloud_cover": 40,
"condition": "partly-cloudy-day",
"condition_text": "Teilweise bewölkt",
"precipitation": 0,
"visibility": 35600,
"dew_point": 4.2
},
"source": "DWD",
"timestamp": "2026-04-01T16:00:00Z"
}
Response Fields
| Field | Type | Description |
|---|---|---|
location.name | string | Resolved location name |
location.lat | number | Latitude |
location.lon | number | Longitude |
location.country | string | ISO country code (e.g. de) |
current.temperature | number | Temperature in °C |
current.humidity | number | Relative humidity in % |
current.wind_speed | number | Wind speed in km/h |
current.wind_direction | string | Compass direction (N, NNO, NO, ONO, O, ...) |
current.pressure | number | Sea-level pressure in hPa |
current.cloud_cover | number | Cloud cover in % |
current.condition | string | Machine-readable condition code |
current.condition_text | string | Human-readable condition (German) |
current.precipitation | number | Precipitation in mm (last 10 min) |
current.visibility | number | Visibility in meters |
current.dew_point | number | Dew point in °C |
source | string | Data provider (DWD or Open-Meteo) |
timestamp | string | ISO 8601 observation time |
Try it
Forecast
Returns a multi-day weather forecast with daily summaries and hourly breakdowns. The :location parameter accepts a city name or lat,lon coordinates.
Parameters
| Parameter | Type | Description |
|---|---|---|
:location | string required | City name or lat,lon coordinates |
days | integer optional | Number of forecast days (1–16, default: 7) |
Example Request
GET /api/v1/forecast/Munich?days=3
Response
{
"location": {
"name": "München",
"lat": 48.14,
"lon": 11.58,
"country": "de"
},
"days": 3,
"daily": [
{
"date": "2026-04-01",
"temperature_min": 4.2,
"temperature_max": 12.8,
"humidity_avg": 62,
"wind_speed_max": 18.5,
"precipitation_sum": 0.0,
"condition": "partly-cloudy-day",
"condition_text": "Teilweise bewölkt",
"hours": [
{
"time": "2026-04-01T00:00:00...",
"temperature": 5.1,
"humidity": 78,
"wind_speed": 8.2,
"wind_direction": "W",
"precipitation": 0,
"cloud_cover": 30,
"condition": "clear-night",
"condition_text": "Klar"
}
// ... 23 more hours
]
}
// ... more days
],
"timestamp": "2026-04-01T16:00:00.000Z"
}
Daily Summary Fields
| Field | Type | Description |
|---|---|---|
date | string | Date in YYYY-MM-DD format |
temperature_min | number | Minimum temperature in °C |
temperature_max | number | Maximum temperature in °C |
humidity_avg | number | Average relative humidity in % |
wind_speed_max | number | Maximum wind speed in km/h |
precipitation_sum | number | Total precipitation in mm |
condition | string | Dominant weather condition code |
condition_text | string | Human-readable condition (German) |
hours | array | 24 hourly data points (see below) |
Try it
Location Search
Search for locations by name. Returns up to 5 matching results with coordinates and country info. Useful for building autocomplete or letting users pick the correct location.
Parameters
| Parameter | Type | Description |
|---|---|---|
q | string required | Search query (min. 2 characters) |
Example Request
GET /api/v1/search?q=Hamburg
Response
{
"query": "Hamburg",
"results": [
{
"name": "Hamburg",
"full_name": "Hamburg, Deutschland",
"lat": 53.55,
"lon": 9.99,
"country": "de"
}
],
"count": 1
}
Response Fields
| Field | Type | Description |
|---|---|---|
query | string | The original search query |
results[].name | string | Short location name |
results[].full_name | string | Full display name with region/country |
results[].lat | number | Latitude |
results[].lon | number | Longitude |
results[].country | string | ISO country code |
count | number | Number of results returned |
Try it
Pollen Forecast
Returns current pollen concentrations and 7-day hourly forecast for 6 pollen types. Data is sourced from the Open-Meteo Air Quality API. European locations only during pollen season.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
lat | number | Yes | Latitude (-90 to 90) |
lon | number | Yes | Longitude (-180 to 180) |
Response
Returns current pollen levels and hourly forecast arrays. All values are in grains/m³.
| Pollen Type | Field | Description |
|---|---|---|
| Grass | grass_pollen | Grass pollen (Gräser) |
| Birch | birch_pollen | Birch pollen (Birke) |
| Alder | alder_pollen | Alder pollen (Erle) |
| Mugwort | mugwort_pollen | Mugwort pollen (Beifuß) |
| Ragweed | ragweed_pollen | Ragweed pollen (Ambrosia) |
| Olive | olive_pollen | Olive pollen (Olive) |
Severity Scale
| Level | Birch/Alder/Olive | Grass | Mugwort/Ragweed |
|---|---|---|---|
| Keine (0) | < 10 gr/m³ | < 5 gr/m³ | < 5 gr/m³ |
| Gering (1) | 10 – 50 | 5 – 20 | 5 – 15 |
| Mittel (2) | 50 – 200 | 20 – 50 | 15 – 40 |
| Hoch (3) | 200 – 400 | 50 – 100 | 40 – 80 |
| Sehr hoch (4) | > 400 | > 100 | > 80 |
Example Response
{
"current": {
"time": "2026-04-03T14:00",
"alder_pollen": 0.4,
"birch_pollen": 218.9,
"grass_pollen": 0.0,
"mugwort_pollen": 0.0,
"olive_pollen": 0.0,
"ragweed_pollen": 0.0
},
"hourly": {
"time": ["2026-04-03T00:00", "2026-04-03T01:00", ...],
"birch_pollen": [346.0, 268.9, 218.9, ...],
"grass_pollen": [0.0, 0.0, 0.0, ...],
...
}
}
Try it
Water Levels
Returns official river water levels (Pegelstände) near a location, sourced from PEGELONLINE (German Federal Waterways and Shipping Administration, WSV). Covers ~690 gauges on federal waterways in Germany only — locations elsewhere return an empty list. Levels are measured relative to each station's gauge datum (Pegelnullpunkt), not water depth, so values near 0 or below are valid readings during extreme low water.
Parameters
| Parameter | Type | Description |
|---|---|---|
:location | string required | City name or lat,lon coordinates |
radius | number | Search radius in km (default 25, max 60) |
Example Request
GET /api/v1/water-levels/Köln?radius=25
Response
{
"location": {
"name": "Köln",
"lat": 50.94,
"lon": 6.96,
"country": "de"
},
"radius_km": 25,
"count": 2,
"stations": [
{
"uuid": "a6ee8177-107b-47dd-bcfd-30960ccc6e9c",
"name": "Köln",
"water": "Rhein",
"lat": 50.936949,
"lon": 6.9633,
"river_km": 688,
"distance_km": 0.4,
"level": 46,
"unit": "cm",
"gauge_zero_m": 35.038,
"state": "low",
"flood_state": "normal",
"timestamp": "2026-08-17T12:00:00+02:00"
}
],
"source": "PEGELONLINE / WSV",
"timestamp": "2026-08-18T09:00:00.000Z"
}
Response Fields
| Field | Type | Description |
|---|---|---|
stations[].uuid | string | PEGELONLINE station id |
stations[].name | string | Gauge (station) name |
stations[].water | string | River or canal name |
stations[].river_km | number | Position along the waterway in km |
stations[].distance_km | number | Distance from the resolved location in km |
stations[].level | number | Current water level (relative to the gauge datum), may be null |
stations[].unit | string | Unit of level (usually cm) |
stations[].gauge_zero_m | number | Gauge datum (Pegelnullpunkt) in m above NHN; water surface elevation = gauge_zero_m + level/100 |
stations[].state | string | low | normal | high | unknown — classification vs. long-term mean low/high water (MNW/MHW). unknown is typical for canals and impounded reaches |
stations[].flood_state | string | high when the highest navigable water level (HSW) is exceeded — flooding |
stations[].timestamp | string | ISO 8601 time of the measurement |
Try it
RSS Feeds
Subscribe to weather data as RSS 2.0 feeds in any feed reader. Each feed type is location-specific; :location accepts a city name or lat,lon coordinates. Feeds are served as application/rss+xml and cached for 10 minutes.
Feed Types
| Type | Items | Description |
|---|---|---|
forecast | 7 days | Daily weather forecast (min/max temp, condition, precipitation, wind, UV) |
warnings | per alert | Official DWD severe-weather warnings (one item per active alert) |
pollen | up to 3 days | Pollen forecast (DWD: 8 species incl. Esche & Roggen for Germany, otherwise Open-Meteo) |
German aliases are accepted too: vorhersage, warnungen, pollenflug.
Examples
# 7-day forecast for Berlin
https://your-domain.com/rss/forecast/Berlin
# Severe-weather warnings by coordinates
https://your-domain.com/rss/warnings/51.05,13.74
# Pollen forecast for Dresden
https://your-domain.com/rss/pollen/Dresden
Code Examples
Copy-paste examples for common languages and tools. Replace your-domain.com with the actual hostname.
# Current weather for Berlin
curl "https://your-domain.com/api/v1/weather/Berlin"
# 5-day forecast for coordinates
curl "https://your-domain.com/api/v1/forecast/52.52,13.40?days=5"
# Search locations
curl "https://your-domain.com/api/v1/search?q=Frankfurt"
// Current weather
const response = await fetch('https://your-domain.com/api/v1/weather/Berlin');
const data = await response.json();
console.log(`${data.location.name}: ${data.current.temperature}°C`);
console.log(`Condition: ${data.current.condition_text}`);
console.log(`Wind: ${data.current.wind_speed} km/h ${data.current.wind_direction}`);
// 7-day forecast
const forecast = await fetch('https://your-domain.com/api/v1/forecast/Berlin?days=7');
const forecastData = await forecast.json();
forecastData.daily.forEach(day => {
console.log(`${day.date}: ${day.temperature_min}°C - ${day.temperature_max}°C`);
});
import requests
# Current weather
r = requests.get("https://your-domain.com/api/v1/weather/Berlin")
data = r.json()
print(f"{data['location']['name']}: {data['current']['temperature']}°C")
print(f"{data['current']['condition_text']}")
# 3-day forecast
r = requests.get("https://your-domain.com/api/v1/forecast/Berlin", params={"days": 3})
forecast = r.json()
for day in forecast["daily"]:
print(f"{day['date']}: {day['temperature_min']}°C to {day['temperature_max']}°C")
Error Handling
All error responses follow a consistent JSON format with an error field and an optional message with details.
{
"error": "Location not found",
"message": "Could not resolve the given location. Try a city name or lat,lon coordinates."
}
HTTP Status Codes
| Code | Meaning | Description |
|---|---|---|
200 | OK | Successful request |
400 | Bad Request | Missing or invalid parameters |
404 | Not Found | Location could not be resolved |
500 | Internal Error | Server-side error |
502 | Bad Gateway | Upstream weather data unavailable |
Condition Codes
The condition field uses these values:
| Code | German Text | Description |
|---|---|---|
clear-day | Klar | Clear sky (daytime) |
clear-night | Klar | Clear sky (nighttime) |
partly-cloudy-day | Teilweise bewölkt | Partly cloudy (daytime) |
partly-cloudy-night | Teilweise bewölkt | Partly cloudy (nighttime) |
cloudy | Bewölkt | Overcast / heavy clouds / fog |
rain | Regen | Rain / drizzle / showers |
sleet | Schneeregen | Sleet / freezing rain |
snow | Schnee | Snow / snow grains |
thunderstorm | Gewitter | Thunderstorm |
dry | Trocken | Dry / clear (generic) |
Rate Limits
Fair Use Policy
This API is currently free and does not enforce strict rate limits. We kindly ask that you use it responsibly:
- Cache responses on your end when possible (data updates roughly every 10 minutes)
- Avoid sending more than 60 requests per minute from a single client
- Do not use this API for high-traffic production applications without prior arrangement
Data Sources
Weather data is sourced from DWD (Deutscher Wetterdienst) via Bright Sky and Open-Meteo as a worldwide fallback. Location data comes from OpenStreetMap Nominatim. The source field in responses indicates which provider was used.
Caching
Responses are cached server-side: current weather for 10 minutes, forecasts for 30 minutes, and geocoding results for 24 hours. You will always receive reasonably fresh data.