Kurz: was da liegt
Ein JSON-Schnappschuss alle sechs Stunden für 25 deutsche Städte: die Tageshöchsttemperatur-Vorhersage von elf Wettermodellen und die echte DWD-Stationsmessung als Gegenprobe. Alles als statische Dateien — kein Backend, keine Datenbank, keine Abfrage-Parameter. Für den Einstieg reichen die ersten drei Dateien; die übrigen kommen dazu, wenn du mehr willst:
index.json— das Verzeichnis: Schema-Version, Städteliste mit Slugs und Koordinaten, Modell-Liste und welche Vorhersage-Schnappschüsse verfügbar sind.measured.json— die echte Messung: je Stadt die DWD-Station und der gemessene Tageshöchstwert pro Datum (tmax); seit dem 26.09.2026 auchtminundniederschlag, jeweils nur für vollständig gemessene Tage.forecasts/<datum>T<hhmm>Z.json— ein einzelner Vorhersage-Schnappschuss: was die elf Modelle zu diesem Zeitpunkt für die kommenden Tage vorhergesagt haben (tmax, seit dem 26.09.2026 auchtminundniederschlag). Der Dateiname trägt den Ausgabetag (Berlin) und die UTC-Uhrzeit des Laufs, denn gespeichert wird mehrmals am Tag; ältere Dateien im Format<datum>.json(ohne Uhrzeit) bleiben gültig.ensemble/<datum>T<hhmm>Z.json— die Streuung des größten Ensembles (ECMWF IFS, 51 Rechnungen) für den vorhergesagten Tageshöchstwert: je Stadt und Zieltagmin,q25,median,q75,maxund die Zahl der Rechnungenn. Wichtig: Je Rechnung wurde erst der Tageshöchstwert gebildet und danach die Streuung darüber — nicht Minimum und Maximum über alle Stunden, das wäre der Tag-Nacht-Gang und nicht die Unsicherheit. Angeschnittene Tage mit weniger als 20 Stunden bleiben weg. Verzeichnet inindex.jsonunterensembles[](rein additiv — wer das Feld nicht kennt, liest den Index wie bisher). Seit dem 26.09.2026 trägt jeder Tag zusätzlichregen: vonnRechnungen, wie viele eine Tagessumme ab 0,1 mm (ab_0_1) bzw. ab 1 mm (ab_1) hatten. Ausgewertet wird das auf der Seite Der Ensemble-Fächer und in der Regenprobe.warnlage/<datum>T<hhmm>Z.json— Zählung der amtlichen Unwetterwarnungen in 38 europäischen Ländern (Quelle MeteoAlarm/EUMETNET, CC BY 4.0): je Land die Zahl der Warnungen, aufgeschlüsselt nach standardisierter Warnart (arten) und Stufe (stufen), dazu die Zahl betroffener Regionen und die grünen Einträge getrennt. Keine Einzelwarnungen — ein Schnappschuss alle sechs Stunden taugt nicht als Warndienst, wohl aber als Chronik. Aus rund 50 MB Rohfeeds werden so etwa 6 KB. Verzeichnet inindex.jsonunterwarnlagen[]. Ausgewertet auf Warnlage Europa.
Die Details (Herkunft, Aktualisierung, wie Vorhersage und Messung zusammenpassen) stehen auf Daten. Die Modellherkunft und die Grenzen erklärt Methodik & Quellen.
Die URLs
Alles liegt unter https://wetter.kaipfstr.de/data/. Es gibt
kein Verzeichnis-Listing — welche Vorhersage-Dateien existieren, steht
in index.json. Maßgeblich ist das Feld snapshots: eine Liste von
Objekten {file, date, utc} (Dateiname, Ausgabetag, UTC-Zeit des Laufs). Daraus baust
du die URL /data/forecasts/<file>. Zusätzlich gibt es forecasts
— die distinkten Ausgabetage — für einfache Fälle.
- https://wetter.kaipfstr.de/data/index.json Verzeichnis: Städte, Modelle, verfügbare Schnappschüsse.
- https://wetter.kaipfstr.de/data/measured.json Gemessene Tageshöchstwerte je Stadt und Datum (DWD via Bright Sky).
-
https://wetter.kaipfstr.de/data/forecasts/<file>
Ein Vorhersage-Schnappschuss. Den genauen
<file>-Namen (neu z. B.2026-07-19T0630Z.json, älter2026-07-18.json) nimmst du ausindex.json→snapshots[].file.
Beispiele zum Abrufen
Drei Wege, dieselben Dateien zu laden. Die Beispiele spiegeln die reale
Struktur wider — etwa cities.berlin.tmax in measured.json. Der
Slug einer Stadt (z. B. berlin, muenchen, koeln)
steht in index.json unter cities[].slug.
curl (Kommandozeile)
# Verzeichnis holen und ansehen
curl -s https://wetter.kaipfstr.de/data/index.json
# gemessene Tageshöchstwerte fuer Berlin herausziehen (mit jq)
curl -s https://wetter.kaipfstr.de/data/measured.json \
| jq '.cities.berlin.tmax'
# den juengsten Vorhersage-Schnappschuss laden: erst den Dateinamen aus dem
# Verzeichnis holen, dann die Datei. Nicht selbst aus einem Datum zusammenbauen --
# die Namen tragen die Uhrzeit des Laufs.
DATEI=$(curl -s https://wetter.kaipfstr.de/data/index.json | jq -r '.snapshots[-1].file')
curl -s "https://wetter.kaipfstr.de/data/forecasts/$DATEI" \
| jq '.cities.berlin.tmax.icon_seamless'
JavaScript (fetch, im Browser oder in Node)
const basis = "https://wetter.kaipfstr.de/data";
const res = await fetch(`${basis}/measured.json`);
const daten = await res.json();
const berlin = daten.cities.berlin;
console.log(berlin.station.name); // z.B. "Berlin-Friedrichshain/Spree"
console.log(berlin.tmax["2026-07-16"]); // gemessener Tageshöchstwert in Grad C
// CORS ist offen (Access-Control-Allow-Origin: *) — dieser fetch
// funktioniert auch von einer beliebigen fremden Seite aus.
Python (requests)
import requests
basis = "https://wetter.kaipfstr.de/data"
# 1. Verzeichnis: welcher Vorhersage-Schnappschuss ist da?
index = requests.get(f"{basis}/index.json").json()
datei = index["snapshots"][-1]["file"] # juengster Lauf, MIT Uhrzeit im Namen
# 2. Diesen Schnappschuss laden
fc = requests.get(f"{basis}/forecasts/{datei}").json()
berlin = fc["cities"]["berlin"]
tage = berlin["dates"] # Zieltage, zu denen die Reihen passen
for modell, reihe in berlin["tmax"].items():
for tag, wert in zip(tage, reihe):
if wert is not None: # fehlende Werte sind null / None
print(modell, tag, wert)
Die Code-Blöcke sind reiner Anzeigetext — diese Seite führt nichts davon aus. Kopiere sie in deine eigene Umgebung.
Schema der drei Dateitypen
Jede Datei trägt ihre Schema-Version im Feld schema.
Ändert sich das Format grundlegend, ändert sich diese Kennung — darauf kannst
du prüfen. Die folgenden Felder stammen direkt aus den ausgelieferten Dateien.
index.json — Schema wetter.kaipfstr.de/index/1
| Feld | Typ | Bedeutung |
|---|---|---|
schema | String | Schema-Kennung, hier wetter.kaipfstr.de/index/1. |
updated_utc | String | Zeitpunkt der letzten Aktualisierung, ISO 8601 in UTC. |
cities | Array | Liste der Städte. Je Eintrag: slug, name, lat, lon. |
cities[].slug | String | Kurzname der Stadt, zugleich der Schlüssel in measured.json und in den Vorhersagen (z. B. berlin, muenchen). |
cities[].name | String | Anzeigename der Stadt. |
cities[].lat | Zahl | Breitengrad. |
cities[].lon | Zahl | Längengrad. |
models | Array String | Kennungen der einbezogenen Wettermodelle (z. B. icon_seamless, ecmwf_ifs025). |
forecasts | Array String | Die distinkten Ausgabetage JJJJ-MM-TT, rückwärtskompatibel. Nicht zum Bauen von Datei-URLs geeignet — an einem Tag gibt es mehrere Läufe, und die Dateinamen tragen die Uhrzeit. Dafür ist snapshots da. |
snapshots | Array Objekt | Jeder einzelne Lauf mit file (der Dateiname, den du an /data/forecasts/ anhängst), date (Ausgabetag) und utc (Zeit des Laufs). Das ist das Feld, aus dem die URLs kommen. |
measured | String | Pfad zur Messdatei, /data/measured.json. |
license | String | Lizenzhinweis, wie in der Datei hinterlegt (siehe unten). |
measured.json — Schema wetter.kaipfstr.de/measured/1
| Feld | Typ | Bedeutung |
|---|---|---|
schema | String | Schema-Kennung, hier wetter.kaipfstr.de/measured/1. |
updated_utc | String | Zeitpunkt der letzten Aktualisierung, ISO 8601 in UTC. |
source | String | Herkunft der Messung, hier Bright Sky (DWD historical). |
cities | Objekt | Nach Stadt-Slug geschlüsselt: cities.<slug>. |
cities.<slug>.name | String | Anzeigename der Stadt. |
cities.<slug>.station | Objekt | Die DWD-Station des zuletzt abgerufenen Tages: name, dwd_station_id, distance_km. Nicht zwingend die Quelle aller Werte dieser Stadt — siehe stationen. |
cities.<slug>.stationen | Array Objekt | Alle Stationen, die im Lauf der Zeit für diese Stadt geliefert haben, gleiche Felder wie oben. Bright Sky wählt je Tag die nächste Station mit Daten; fällt sie aus, ist es am nächsten Tag eine andere. Steht hier mehr als ein Eintrag, stammen die Werte des Archivs nicht alle von derselben Station. |
….station.name | String | Stationsname (z. B. Berlin-Friedrichshain/Spree). |
….station.dwd_station_id | String | DWD-Stationskennung. |
….station.distance_km | Zahl | Entfernung der Station vom Stadtpunkt in Kilometern. |
cities.<slug>.tmax | Objekt | Nach Datum geschlüsselt: tmax.<JJJJ-MM-TT> = gemessener Tageshöchstwert in Grad Celsius. |
forecasts/<datum>.json — Schema wetter.kaipfstr.de/forecasts/1
| Feld | Typ | Bedeutung |
|---|---|---|
schema | String | Schema-Kennung, hier wetter.kaipfstr.de/forecasts/1. |
issued | String | Ausgabetag des Schnappschusses, JJJJ-MM-TT — passt zum Dateinamen. |
generated_utc | String | Erzeugungszeitpunkt, ISO 8601 in UTC. |
models | Array String | Die Modelle, die in diesem Schnappschuss enthalten sind. |
cities | Objekt | Nach Stadt-Slug geschlüsselt: cities.<slug>. |
cities.<slug>.name | String | Anzeigename der Stadt. |
cities.<slug>.lat / lon | Zahl | Koordinaten der Stadt. |
cities.<slug>.dates | Array String | Die Zieltage JJJJ-MM-TT, auf die sich die Vorhersagereihen beziehen (Reihenfolge = Index der tmax-Arrays). |
cities.<slug>.tmax | Objekt | Nach Modell geschlüsselt: tmax.<modell> = Array der vorhergesagten Tageshöchstwerte in Grad Celsius, in derselben Reihenfolge wie dates. |
….tmax.<modell>[i] | Zahl / null | Vorhergesagter Wert für dates[i]; null, wenn das Modell für diesen Tag keinen Wert liefert. |
Fehlende Werte sind null — nicht jedes Modell reicht
gleich weit in die Zukunft. Rechne immer damit und überspringe null, statt
es als Zahl zu behandeln.
Zugriff, Cache und Grenzen — ehrlich
Was gilt
- CORS
Access-Control-Allow-Origin: *— jede fremde Seite darf die Dateien perfetchladen.- Cache
Cache-Control: public, max-age=3600— eine Stunde. Ein Abruf kann also bis zu einer Stunde alt sein.- Aktualisierung
- Alle sechs Stunden läuft ein neuer Schnappschuss: je eine neue
Datei in
forecasts/,ensemble/undwarnlage/, undindex.jsonwird neu geschrieben.measured.jsonwird ebenfalls bei jedem Lauf neu geschrieben, neue Messwerte bringt es wegen des DWD-Verzugs aber nur für einen Tag je Tag: den abgeschlossenen Vortag, sobald der DWD ihn geprüft hat. Der kommt meist auf zwei Läufe verteilt an, für rund ein Drittel der Städte erst mit dem Lauf gegen Mittag deutscher Zeit; wer nur einmal am Tag abruft, holt ihn deshalb am besten am Nachmittag (Einzelheiten auf Daten). Öfter als alle sechs Stunden abzurufen bringt keine neuen Werte. Bis zum 30.09.2026 stand hier: „Die Dateien ändern sich nur einmal täglich; häufigeres Abrufen bringt keine neuen Werte.“ Das widersprach dem Abschnitt oben und galt seit dem 19.07.2026 nur noch für die Messung; wer danach nur einmal am Tag den jüngsten Lauf holte, übersprang drei von vier. - Schlüssel
- Keiner. Keine Anmeldung, kein Token, keine Registrierung.
- Rate-Limit
- Kein zugesagtes Limit — und keine Garantie. Es ist ein privates, statisch gehostetes Nebenprojekt; sei sparsam, cache lokal, verlass dich nicht auf Dauerverfügbarkeit.
- Format
- Statische JSON-Dateien, keine Abfrage-Parameter, kein Verzeichnis-Listing.
Das ist kein API-Versprechen. Schema-Kennungen und URLs sind stabil gehalten, aber es gibt keine Zusicherung über Verfügbarkeit oder Antwortzeit. Wer darauf aufbaut, sollte einen eigenen Zwischenspeicher führen.
Lizenz & Quellen
Die Vorhersage stammt von
Open-Meteo (Modelldaten) und steht unter
CC BY 4.0. Die Messung ist eine
DWD-Stationsmessung, bezogen über Bright Sky, und
unterliegt der DWD GeoNutzV (Quelle: Deutscher Wetterdienst). Genau so steht
es auch im Feld license von index.json:
CC BY 4.0 (Open-Meteo) / DWD GeoNutzV (Messung).
Verwendest du die Daten weiter, nenne diese Quellen. Die maßgeblichen Nutzungsbedingungen liegen bei der jeweiligen Quelle — siehe die Links oben. Wie die Modelle einbezogen werden und woher jede Zahl kommt, steht unter Methodik & Quellen; was das Archiv genau enthält und wie es entsteht, unter Daten.