Alerts#
Overview#
The DWD publishes its public weather warnings (“Warnungen”) in the
Common Alerting Protocol (CAP) v1.2 format. Each
warning is a CAP XML document describing a single alert — its event, severity, timing, texts and
affected areas. wetterdienst exposes the DWD full-snapshot products, which bundle one CAP file per
currently active warning, and flattens every alert into a single row.
Warnings are available on two spatial granularities, selected via the granularity argument:
community(default) — per municipality (Gemeinde,COMMUNEUNIONproducts)district— per district (Landkreis,DISTRICTproducts)
and in several languages via the language argument (de, en (default), es, fr, mul).
Because the products are full snapshots, an empty result simply means there are currently no active warnings. The data faithfully follows the official CAP DWD Profile.
Historical snapshots#
DWD keeps a rolling ~48-hour window of timestamped snapshots (there is no long-term archive).
Pass a date to select the warnings that were active at a point in time — the newest snapshot
produced at or before that moment is used. A naive datetime or ISO string is interpreted as UTC. A
date outside the rolling window raises an error. Omit date for the current (latest) snapshot.
from wetterdienst.provider.dwd.alerts import DwdWeatherAlertRequest
# warnings that were active ~6 hours ago
request = DwdWeatherAlertRequest(granularity="district", date="2026-07-26T10:00:00")
result = request.query()
print(result.snapshot) # UTC production time of the selected snapshot
As DataFrame#
DwdWeatherAlertRequest.query() returns a DwdWeatherAlertResult whose .df attribute is a
polars DataFrame with one row per alert. Each row carries the alert/info fields
(event, severity, urgency, certainty, timing, headline, description, …), the DWD event code and
groups, the parameters (an ordered list of {name, value}, since a name such as wind direction
may repeat), the affected warncell_ids / area names, and a GeoJSON MultiPolygon geometry
combining all of the alert’s polygon areas (null for alerts that only reference warn cells without
polygons). The result’s .snapshot attribute holds the UTC production time of the selected snapshot
(None for the latest one).
from wetterdienst.provider.dwd.alerts import DwdWeatherAlertRequest
request = DwdWeatherAlertRequest(granularity="community", language="en")
result = request.query()
print(result.df)
The result can also be rendered directly:
result.to_dict() # {"snapshot": ..., "alerts": [...]} with nested geometry/parameters
result.to_ogc_feature_collection() # GeoJSON FeatureCollection (geometry = MultiPolygon, + snapshot)
result.to_geojson() # GeoJSON string
result.to_csv() # CSV (list columns comma-joined, nested fields JSON-encoded)
CLI#
# all current warnings on community basis as JSON
wetterdienst alerts
# district basis, German, as GeoJSON
wetterdienst alerts --granularity=district --language=de --format=geojson
# warnings active at a past point in time (within the rolling ~48h window)
wetterdienst alerts --granularity=district --date=2026-07-26T10:00:00
# write current warnings to a GeoJSON file
wetterdienst alerts --format=geojson --target=file://alerts.geojson
REST API#
wetterdienst restapi --listen 0.0.0.0:3000
curl "http://localhost:3000/api/alerts?granularity=community&format=geojson"