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.

https://your-domain.com/api/v1

Current Weather

GET /api/v1/weather/:location

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

ParameterTypeDescription
:locationstring requiredCity 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

FieldTypeDescription
location.namestringResolved location name
location.latnumberLatitude
location.lonnumberLongitude
location.countrystringISO country code (e.g. de)
current.temperaturenumberTemperature in °C
current.humiditynumberRelative humidity in %
current.wind_speednumberWind speed in km/h
current.wind_directionstringCompass direction (N, NNO, NO, ONO, O, ...)
current.pressurenumberSea-level pressure in hPa
current.cloud_covernumberCloud cover in %
current.conditionstringMachine-readable condition code
current.condition_textstringHuman-readable condition (German)
current.precipitationnumberPrecipitation in mm (last 10 min)
current.visibilitynumberVisibility in meters
current.dew_pointnumberDew point in °C
sourcestringData provider (DWD or Open-Meteo)
timestampstringISO 8601 observation time

Try it

Forecast

GET /api/v1/forecast/:location

Returns a multi-day weather forecast with daily summaries and hourly breakdowns. The :location parameter accepts a city name or lat,lon coordinates.

Parameters

ParameterTypeDescription
:locationstring requiredCity name or lat,lon coordinates
daysinteger optionalNumber 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

FieldTypeDescription
datestringDate in YYYY-MM-DD format
temperature_minnumberMinimum temperature in °C
temperature_maxnumberMaximum temperature in °C
humidity_avgnumberAverage relative humidity in %
wind_speed_maxnumberMaximum wind speed in km/h
precipitation_sumnumberTotal precipitation in mm
conditionstringDominant weather condition code
condition_textstringHuman-readable condition (German)
hoursarray24 hourly data points (see below)

Try it

Pollen Forecast

GET /api/pollen

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

NameTypeRequiredDescription
latnumberYesLatitude (-90 to 90)
lonnumberYesLongitude (-180 to 180)

Response

Returns current pollen levels and hourly forecast arrays. All values are in grains/m³.

Pollen TypeFieldDescription
Grassgrass_pollenGrass pollen (Gräser)
Birchbirch_pollenBirch pollen (Birke)
Alderalder_pollenAlder pollen (Erle)
Mugwortmugwort_pollenMugwort pollen (Beifuß)
Ragweedragweed_pollenRagweed pollen (Ambrosia)
Oliveolive_pollenOlive pollen (Olive)

Severity Scale

LevelBirch/Alder/OliveGrassMugwort/Ragweed
Keine (0)< 10 gr/m³< 5 gr/m³< 5 gr/m³
Gering (1)10 – 505 – 205 – 15
Mittel (2)50 – 20020 – 5015 – 40
Hoch (3)200 – 40050 – 10040 – 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

GET /api/v1/water-levels/:location

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

ParameterTypeDescription
:locationstring requiredCity name or lat,lon coordinates
radiusnumberSearch 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

FieldTypeDescription
stations[].uuidstringPEGELONLINE station id
stations[].namestringGauge (station) name
stations[].waterstringRiver or canal name
stations[].river_kmnumberPosition along the waterway in km
stations[].distance_kmnumberDistance from the resolved location in km
stations[].levelnumberCurrent water level (relative to the gauge datum), may be null
stations[].unitstringUnit of level (usually cm)
stations[].gauge_zero_mnumberGauge datum (Pegelnullpunkt) in m above NHN; water surface elevation = gauge_zero_m + level/100
stations[].statestringlow | normal | high | unknown — classification vs. long-term mean low/high water (MNW/MHW). unknown is typical for canals and impounded reaches
stations[].flood_statestringhigh when the highest navigable water level (HSW) is exceeded — flooding
stations[].timestampstringISO 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.

GET /rss/:type/:location

Feed Types

TypeItemsDescription
forecast7 daysDaily weather forecast (min/max temp, condition, precipitation, wind, UV)
warningsper alertOfficial DWD severe-weather warnings (one item per active alert)
pollenup to 3 daysPollen 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

CodeMeaningDescription
200OKSuccessful request
400Bad RequestMissing or invalid parameters
404Not FoundLocation could not be resolved
500Internal ErrorServer-side error
502Bad GatewayUpstream weather data unavailable

Condition Codes

The condition field uses these values:

CodeGerman TextDescription
clear-dayKlarClear sky (daytime)
clear-nightKlarClear sky (nighttime)
partly-cloudy-dayTeilweise bewölktPartly cloudy (daytime)
partly-cloudy-nightTeilweise bewölktPartly cloudy (nighttime)
cloudyBewölktOvercast / heavy clouds / fog
rainRegenRain / drizzle / showers
sleetSchneeregenSleet / freezing rain
snowSchneeSnow / snow grains
thunderstormGewitterThunderstorm
dryTrockenDry / 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.

Wetter API v1 — Powered by DWD, Open-Meteo & OpenStreetMap