{"openapi":"3.1.0","info":{"title":"nano Weather API","description":"Weather for Germany from Deutscher Wetterdienst open data (CC BY 4.0). One call per screen: `/v1/weather` returns the blocks a client asks for.","version":"0.1.0"},"servers":[{"url":"https://api.nano-wetter.de"}],"paths":{"/v2/weather":{"get":{"tags":["weather"],"summary":"Everything for one location","operationId":"weather_v1_weather_get","parameters":[{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":90,"minimum":-90},{"type":"null"}],"description":"Latitude, WGS84","title":"Lat"},"description":"Latitude, WGS84"},{"name":"lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":180,"minimum":-180},{"type":"null"}],"description":"Longitude, WGS84","title":"Lon"},"description":"Longitude, WGS84"},{"name":"station","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"DWD station id; with lat+lon it pins only `current`","title":"Station"},"description":"DWD station id; with lat+lon it pins only `current`"},{"name":"place_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Not supported in v1","title":"Place Id"},"description":"Not supported in v1"},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated blocks: current, minutely, hourly, daily, warnings, health, environment, climate, text","title":"Include"},"description":"Comma-separated blocks: current, minutely, hourly, daily, warnings, health, environment, climate, text"},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":240,"minimum":1,"description":"Hours of `hourly` from the current hour on (1–240). Beyond ~48 h the product is MOSMIX only; what exists is returned (the point product reaches 264 h from local midnight).","default":48,"title":"Hours"},"description":"Hours of `hourly` from the current hour on (1–240). Beyond ~48 h the product is MOSMIX only; what exists is returned (the point product reaches 264 h from local midnight)."},{"name":"past_hours","in":"query","required":false,"schema":{"type":"integer","maximum":72,"minimum":0,"description":"Past hours before the current hour in `hourly` (0–72), filled with measured values of the location's station (`hourly.kind` = observation), else the forecast issued for them (`forecast`).","default":0,"title":"Past Hours"},"description":"Past hours before the current hour in `hourly` (0–72), filled with measured values of the location's station (`hourly.kind` = observation), else the forecast issued for them (`forecast`)."},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":10,"minimum":1,"default":10,"title":"Days"}},{"name":"tz","in":"query","required":false,"schema":{"type":"string","default":"Europe/Berlin","title":"Tz"}},{"name":"units","in":"query","required":false,"schema":{"type":"string","pattern":"^(metric|imperial)$","default":"metric","title":"Units"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","pattern":"^(de|en)$","default":"de","title":"Lang"}},{"name":"variant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Product variant (restricted): an alias (`stable`, `candidate`, `experimental`) or a model profile name (/v1/meta/models). Default `stable`.","title":"Variant"},"description":"Product variant (restricted): an alias (`stable`, `candidate`, `experimental`) or a model profile name (/v1/meta/models). Default `stable`."},{"name":"elevation","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":5000,"minimum":-500},{"type":"null"}],"description":"True elevation of the location in metres (e.g. from the device). Temperatures are height-corrected from the model terrain to it (0.65 °C/100 m). Default: model terrain of the cell.","title":"Elevation"},"description":"True elevation of the location in metres (e.g. from the device). Temperatures are height-corrected from the model terrain to it (0.65 °C/100 m). Default: model terrain of the cell."}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WeatherResponse"}}},"headers":{"RateLimit-Policy":{"description":"Limits of the key (IETF draft), e.g. `\"burst\";q=20;w=1, \"month\";q=500000;w=2592000`; mobile keys add `\"install\"`.","schema":{"type":"string"}},"RateLimit":{"description":"What is left, e.g. `\"burst\";r=17;t=1, \"month\";r=412345;t=86400` (`t` = seconds until reset).","schema":{"type":"string"}},"X-Request-Id":{"description":"Request id (echoes a sane incoming `X-Request-Id`).","schema":{"type":"string"}},"ETag":{"description":"Weak validator `W/\"…\"` of the request and the data versions it reads (build, observations, radar issue, warnings) within a 5-minute window. Send it back in `If-None-Match` for a 304.","schema":{"type":"string"}},"Cache-Control":{"description":"`private, max-age=<s>`: seconds until the answer may have changed (at most 60).","schema":{"type":"string"}}}},"304":{"description":"Not modified: `If-None-Match` matched the current `ETag` (no body; metered like a 200).","headers":{"RateLimit-Policy":{"description":"Limits of the key (IETF draft), e.g. `\"burst\";q=20;w=1, \"month\";q=500000;w=2592000`; mobile keys add `\"install\"`.","schema":{"type":"string"}},"RateLimit":{"description":"What is left, e.g. `\"burst\";r=17;t=1, \"month\";r=412345;t=86400` (`t` = seconds until reset).","schema":{"type":"string"}},"X-Request-Id":{"description":"Request id (echoes a sane incoming `X-Request-Id`).","schema":{"type":"string"}},"ETag":{"description":"Weak validator `W/\"…\"` of the request and the data versions it reads (build, observations, radar issue, warnings) within a 5-minute window. Send it back in `If-None-Match` for a 304.","schema":{"type":"string"}},"Cache-Control":{"description":"`private, max-age=<s>`: seconds until the answer may have changed (at most 60).","schema":{"type":"string"}}}},"400":{"description":"Invalid or missing parameters (`invalid-parameters`, `missing-location`, `invalid-timezone`, …).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"API key missing, invalid (`unauthorized`), revoked (`key-revoked`), expired (`key-expired`) or its app archived (`app-archived`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key may not make this request: not in the plan (`plan-feature-missing`, e.g. history, radar, non-default variants), not in the key's scopes (`scope-missing`), `origin-not-allowed`, `bundle-required` (app key bound to bundle ids, no bundle header), `bundle-not-allowed`, `organization-disabled`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown station, outside coverage, or no data for this request.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Burst limit (`rate-limited`, retry after `Retry-After` seconds) or monthly quota of the organization (`quota-exceeded`, `Retry-After` = seconds until the next month, UTC). See the `RateLimit` headers.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying: until the burst bucket has a token (`rate-limited`, at least 1), or until the next month, UTC (`quota-exceeded`).","required":true,"schema":{"type":"integer","minimum":1}},"RateLimit-Policy":{"description":"Limits of the key (IETF draft), e.g. `\"burst\";q=20;w=1, \"month\";q=500000;w=2592000`; mobile keys add `\"install\"`.","schema":{"type":"string"}},"RateLimit":{"description":"What is left, e.g. `\"burst\";r=17;t=1, \"month\";r=412345;t=86400` (`t` = seconds until reset).","schema":{"type":"string"}},"X-Request-Id":{"description":"Request id (echoes a sane incoming `X-Request-Id`).","schema":{"type":"string"}}}},"503":{"description":"Data not available right now (e.g. DWD unreachable, nothing stored yet), or the server is busy (`overloaded`: too many requests in progress or no response in time; retry after `Retry-After` seconds).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying (`overloaded`: 2, `auth-unavailable`: 5). Absent on 503s that are not transient.","schema":{"type":"integer"}}}}},"security":[{"ApiKeyHeader":[]},{"BearerAuth":[]},{"ApiKeyQuery":[]}]}},"/v2/meta/conditions":{"get":{"tags":["meta"],"summary":"Condition codes with labels and symbols","operationId":"meta_conditions_v1_meta_conditions_get","parameters":[{"name":"tz","in":"query","required":false,"schema":{"type":"string","default":"Europe/Berlin","title":"Tz"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConditionsResponse"}}}},"503":{"description":"Data not available right now (e.g. DWD unreachable, nothing stored yet), or the server is busy (`overloaded`: too many requests in progress or no response in time; retry after `Retry-After` seconds).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying (`overloaded`: 2, `auth-unavailable`: 5). Absent on 503s that are not transient.","schema":{"type":"integer"}}}}},"security":[]}},"/v2/meta/freshness":{"get":{"tags":["meta"],"summary":"Issue time and age of every ingested dataset","operationId":"meta_freshness_v1_meta_freshness_get","parameters":[{"name":"tz","in":"query","required":false,"schema":{"type":"string","default":"Europe/Berlin","title":"Tz"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FreshnessResponse"}}}},"503":{"description":"Data not available right now (e.g. DWD unreachable, nothing stored yet), or the server is busy (`overloaded`: too many requests in progress or no response in time; retry after `Retry-After` seconds).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying (`overloaded`: 2, `auth-unavailable`: 5). Absent on 503s that are not transient.","schema":{"type":"integer"}}}}},"security":[]}},"/v2/meta/verification":{"get":{"tags":["meta"],"summary":"Published verification scores against DWD stations","description":"Mean absolute error and bias of each model profile against hourly DWD station observations\n(from the 10-minute values), by variable and lead time, over the last 48 complete hours\n(recomputed hourly from the forecast archive). Keys are profile names (each with its own history)\nand the variant aliases, resolved now: `stable` is what /v1/weather serves by default.","operationId":"meta_verification_v1_meta_verification_get","parameters":[{"name":"tz","in":"query","required":false,"schema":{"type":"string","default":"Europe/Berlin","title":"Tz"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationResponse"}}}},"503":{"description":"Data not available right now (e.g. DWD unreachable, nothing stored yet), or the server is busy (`overloaded`: too many requests in progress or no response in time; retry after `Retry-After` seconds).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying (`overloaded`: 2, `auth-unavailable`: 5). Absent on 503s that are not transient.","schema":{"type":"integer"}}}}},"security":[]}},"/v2/meta/accuracy":{"get":{"tags":["meta"],"summary":"nano against the plain DWD forecast, measured","description":"The public accuracy report (compare/accuracy.py), recomputed hourly: at the 100 comparison\nplaces nano and other forecasts (DWD MOSMIX at the nearest station, MET Norway) against the\nplaces' DWD truth stations, by variable and lead time, each opponent on the hours it shares\nwith nano, with consumer metrics, the head-to-head per opponent and a daily series; plus the\nchampion's verification at all DWD stations. Every number carries its pair count. No key.","operationId":"meta_accuracy_v1_meta_accuracy_get","parameters":[{"name":"tz","in":"query","required":false,"schema":{"type":"string","default":"Europe/Berlin","title":"Tz"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccuracyResponse"}}}},"503":{"description":"Data not available right now (e.g. DWD unreachable, nothing stored yet), or the server is busy (`overloaded`: too many requests in progress or no response in time; retry after `Retry-After` seconds).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying (`overloaded`: 2, `auth-unavailable`: 5). Absent on 503s that are not transient.","schema":{"type":"integer"}}}}},"security":[]}},"/v2/radar/grid":{"get":{"tags":["radar"],"summary":"Precipitation grid series (RV), compressed","operationId":"radar_grid_v1_radar_grid_get","parameters":[{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":90,"minimum":-90},{"type":"null"}],"title":"Lat"}},{"name":"lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":180,"minimum":-180},{"type":"null"}],"title":"Lon"}},{"name":"station","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Station"}},{"name":"distance","in":"query","required":false,"schema":{"type":"integer","maximum":600000,"minimum":1000,"description":"Crop radius in metres","default":100000,"title":"Distance"},"description":"Crop radius in metres"},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"tz","in":"query","required":false,"schema":{"type":"string","description":"Time zone of `meta.generated`; frame times stay UTC","default":"Europe/Berlin","title":"Tz"},"description":"Time zone of `meta.generated`; frame times stay UTC"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RadarGridResponse"}}},"headers":{"RateLimit-Policy":{"description":"Limits of the key (IETF draft), e.g. `\"burst\";q=20;w=1, \"month\";q=500000;w=2592000`; mobile keys add `\"install\"`.","schema":{"type":"string"}},"RateLimit":{"description":"What is left, e.g. `\"burst\";r=17;t=1, \"month\";r=412345;t=86400` (`t` = seconds until reset).","schema":{"type":"string"}},"X-Request-Id":{"description":"Request id (echoes a sane incoming `X-Request-Id`).","schema":{"type":"string"}}}},"400":{"description":"Invalid or missing parameters (`invalid-parameters`, `missing-location`, `invalid-timezone`, …).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"API key missing, invalid (`unauthorized`), revoked (`key-revoked`), expired (`key-expired`) or its app archived (`app-archived`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key may not make this request: not in the plan (`plan-feature-missing`, e.g. history, radar, non-default variants), not in the key's scopes (`scope-missing`), `origin-not-allowed`, `bundle-required` (app key bound to bundle ids, no bundle header), `bundle-not-allowed`, `organization-disabled`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown station, outside coverage, or no data for this request.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Burst limit (`rate-limited`, retry after `Retry-After` seconds) or monthly quota of the organization (`quota-exceeded`, `Retry-After` = seconds until the next month, UTC). See the `RateLimit` headers.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying: until the burst bucket has a token (`rate-limited`, at least 1), or until the next month, UTC (`quota-exceeded`).","required":true,"schema":{"type":"integer","minimum":1}},"RateLimit-Policy":{"description":"Limits of the key (IETF draft), e.g. `\"burst\";q=20;w=1, \"month\";q=500000;w=2592000`; mobile keys add `\"install\"`.","schema":{"type":"string"}},"RateLimit":{"description":"What is left, e.g. `\"burst\";r=17;t=1, \"month\";r=412345;t=86400` (`t` = seconds until reset).","schema":{"type":"string"}},"X-Request-Id":{"description":"Request id (echoes a sane incoming `X-Request-Id`).","schema":{"type":"string"}}}},"503":{"description":"Data not available right now (e.g. DWD unreachable, nothing stored yet), or the server is busy (`overloaded`: too many requests in progress or no response in time; retry after `Retry-After` seconds).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying (`overloaded`: 2, `auth-unavailable`: 5). Absent on 503s that are not transient.","schema":{"type":"integer"}}}}},"security":[{"ApiKeyHeader":[]},{"BearerAuth":[]},{"ApiKeyQuery":[]}]}},"/v2/health":{"get":{"tags":["health"],"summary":"Pollen, UV index, Biowetter, heat warnings for a location (daily DWD health products)","operationId":"health_v1_health_get","parameters":[{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":90,"minimum":-90},{"type":"null"}],"title":"Lat"}},{"name":"lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":180,"minimum":-180},{"type":"null"}],"title":"Lon"}},{"name":"station","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Station"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","pattern":"^(de|en)$","default":"de","title":"Lang"}},{"name":"tz","in":"query","required":false,"schema":{"type":"string","default":"Europe/Berlin","title":"Tz"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}},"headers":{"RateLimit-Policy":{"description":"Limits of the key (IETF draft), e.g. `\"burst\";q=20;w=1, \"month\";q=500000;w=2592000`; mobile keys add `\"install\"`.","schema":{"type":"string"}},"RateLimit":{"description":"What is left, e.g. `\"burst\";r=17;t=1, \"month\";r=412345;t=86400` (`t` = seconds until reset).","schema":{"type":"string"}},"X-Request-Id":{"description":"Request id (echoes a sane incoming `X-Request-Id`).","schema":{"type":"string"}}}},"400":{"description":"Invalid or missing parameters (`invalid-parameters`, `missing-location`, `invalid-timezone`, …).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"API key missing, invalid (`unauthorized`), revoked (`key-revoked`), expired (`key-expired`) or its app archived (`app-archived`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key may not make this request: not in the plan (`plan-feature-missing`, e.g. history, radar, non-default variants), not in the key's scopes (`scope-missing`), `origin-not-allowed`, `bundle-required` (app key bound to bundle ids, no bundle header), `bundle-not-allowed`, `organization-disabled`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown station, outside coverage, or no data for this request.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Burst limit (`rate-limited`, retry after `Retry-After` seconds) or monthly quota of the organization (`quota-exceeded`, `Retry-After` = seconds until the next month, UTC). See the `RateLimit` headers.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying: until the burst bucket has a token (`rate-limited`, at least 1), or until the next month, UTC (`quota-exceeded`).","required":true,"schema":{"type":"integer","minimum":1}},"RateLimit-Policy":{"description":"Limits of the key (IETF draft), e.g. `\"burst\";q=20;w=1, \"month\";q=500000;w=2592000`; mobile keys add `\"install\"`.","schema":{"type":"string"}},"RateLimit":{"description":"What is left, e.g. `\"burst\";r=17;t=1, \"month\";r=412345;t=86400` (`t` = seconds until reset).","schema":{"type":"string"}},"X-Request-Id":{"description":"Request id (echoes a sane incoming `X-Request-Id`).","schema":{"type":"string"}}}},"503":{"description":"Data not available right now (e.g. DWD unreachable, nothing stored yet), or the server is busy (`overloaded`: too many requests in progress or no response in time; retry after `Retry-After` seconds).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying (`overloaded`: 2, `auth-unavailable`: 5). Absent on 503s that are not transient.","schema":{"type":"integer"}}}}},"security":[{"ApiKeyHeader":[]},{"BearerAuth":[]},{"ApiKeyQuery":[]}]}},"/v2/stations":{"get":{"tags":["stations"],"summary":"Stations near a location, with the recommendation","operationId":"stations_v1_stations_get","parameters":[{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":90,"minimum":-90},{"type":"null"}],"title":"Lat"}},{"name":"lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":180,"minimum":-180},{"type":"null"}],"title":"Lon"}},{"name":"station","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Station"}},{"name":"radius_km","in":"query","required":false,"schema":{"type":"number","maximum":100,"exclusiveMinimum":0,"default":30,"title":"Radius Km"}},{"name":"network","in":"query","required":false,"schema":{"type":"string","default":"observation","title":"Network"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"elevation","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":5000,"minimum":-500},{"type":"null"}],"description":"True elevation of the location in metres (as in /v1/weather). Default: model terrain of the cell.","title":"Elevation"},"description":"True elevation of the location in metres (as in /v1/weather). Default: model terrain of the cell."},{"name":"tz","in":"query","required":false,"schema":{"type":"string","default":"Europe/Berlin","title":"Tz"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StationsResponse"}}},"headers":{"RateLimit-Policy":{"description":"Limits of the key (IETF draft), e.g. `\"burst\";q=20;w=1, \"month\";q=500000;w=2592000`; mobile keys add `\"install\"`.","schema":{"type":"string"}},"RateLimit":{"description":"What is left, e.g. `\"burst\";r=17;t=1, \"month\";r=412345;t=86400` (`t` = seconds until reset).","schema":{"type":"string"}},"X-Request-Id":{"description":"Request id (echoes a sane incoming `X-Request-Id`).","schema":{"type":"string"}}}},"400":{"description":"Invalid or missing parameters (`invalid-parameters`, `missing-location`, `invalid-timezone`, …).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"API key missing, invalid (`unauthorized`), revoked (`key-revoked`), expired (`key-expired`) or its app archived (`app-archived`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key may not make this request: not in the plan (`plan-feature-missing`, e.g. history, radar, non-default variants), not in the key's scopes (`scope-missing`), `origin-not-allowed`, `bundle-required` (app key bound to bundle ids, no bundle header), `bundle-not-allowed`, `organization-disabled`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown station, outside coverage, or no data for this request.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Burst limit (`rate-limited`, retry after `Retry-After` seconds) or monthly quota of the organization (`quota-exceeded`, `Retry-After` = seconds until the next month, UTC). See the `RateLimit` headers.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying: until the burst bucket has a token (`rate-limited`, at least 1), or until the next month, UTC (`quota-exceeded`).","required":true,"schema":{"type":"integer","minimum":1}},"RateLimit-Policy":{"description":"Limits of the key (IETF draft), e.g. `\"burst\";q=20;w=1, \"month\";q=500000;w=2592000`; mobile keys add `\"install\"`.","schema":{"type":"string"}},"RateLimit":{"description":"What is left, e.g. `\"burst\";r=17;t=1, \"month\";r=412345;t=86400` (`t` = seconds until reset).","schema":{"type":"string"}},"X-Request-Id":{"description":"Request id (echoes a sane incoming `X-Request-Id`).","schema":{"type":"string"}}}},"503":{"description":"Data not available right now (e.g. DWD unreachable, nothing stored yet), or the server is busy (`overloaded`: too many requests in progress or no response in time; retry after `Retry-After` seconds).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying (`overloaded`: 2, `auth-unavailable`: 5). Absent on 503s that are not transient.","schema":{"type":"integer"}}}}},"security":[{"ApiKeyHeader":[]},{"BearerAuth":[]},{"ApiKeyQuery":[]}]}},"/v2/radar/volume":{"get":{"tags":["radar"],"summary":"3D radar and clouds: manifest of the NANO3D v2 frames around a location","description":"Crop per layer (`precip`: dBZ and hydrometeor class; `clouds`: cloud liquid/ice extinction\nand cloud cover), channel encodings, and one entry per frame (`layer`, valid `timestamp`,\n`kind` observed|nowcast|model|analysis, `url`, estimated `bytes`), ascending; plus the URLs of\nsurfaces, features, wind and terrain. Frames are NANO3D v2 binaries: 80-byte little-endian\nheader, zlib payload of sparse 8 × 8 × 4 bricks (occupancy bitmap, then per present brick the\nincluded channels), optional flow block. The full format is in docs/radar-3d.md.\n\nData: DWD radar sweeps (`sweep_vol_z`, `zdr`, `rhohv`, `phidp`) and composites (`hymecng`,\n`vii`, `hx`), ICON-D2 freezing level (Deutscher Wetterdienst, CC BY 4.0); terrain BKG DGM200\n(dl-de/by-2-0).","operationId":"radar_volume_v1_radar_volume_get","parameters":[{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":90,"minimum":-90},{"type":"null"}],"description":"Required unless scope=germany","title":"Lat"},"description":"Required unless scope=germany"},{"name":"lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":180,"minimum":-180},{"type":"null"}],"description":"Required unless scope=germany","title":"Lon"},"description":"Required unless scope=germany"},{"name":"distance","in":"query","required":false,"schema":{"type":"integer","minimum":1000,"description":"Half-width of the crop in metres; at most 250000 at 1 km resolution, 600000 at 2 km","default":100000,"title":"Distance"},"description":"Half-width of the crop in metres; at most 250000 at 1 km resolution, 600000 at 2 km"},{"name":"resolution","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Horizontal cell size in metres: 1000, 2000 or 4000 (default 1000; scope=germany: 4000)","title":"Resolution"},"description":"Horizontal cell size in metres: 1000, 2000 or 4000 (default 1000; scope=germany: 4000)"},{"name":"scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"`germany`: the whole grid at 4 km (lat/lon optional)","title":"Scope"},"description":"`germany`: the whole grid at 4 km (lat/lon optional)"},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"First valid time (default: now − 2 h)","title":"From"},"description":"First valid time (default: now − 2 h)"},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Last valid time (default: now + 12 h)","title":"To"},"description":"Last valid time (default: now + 12 h)"},{"name":"tz","in":"query","required":false,"schema":{"type":"string","description":"Time zone of `meta.generated`; frame times stay UTC","default":"Europe/Berlin","title":"Tz"},"description":"Time zone of `meta.generated`; frame times stay UTC"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RadarVolumeResponse"}}},"headers":{"RateLimit-Policy":{"description":"Limits of the key (IETF draft), e.g. `\"burst\";q=20;w=1, \"month\";q=500000;w=2592000`; mobile keys add `\"install\"`.","schema":{"type":"string"}},"RateLimit":{"description":"What is left, e.g. `\"burst\";r=17;t=1, \"month\";r=412345;t=86400` (`t` = seconds until reset).","schema":{"type":"string"}},"X-Request-Id":{"description":"Request id (echoes a sane incoming `X-Request-Id`).","schema":{"type":"string"}}}},"400":{"description":"Invalid or missing parameters (`invalid-parameters`, `missing-location`, `invalid-timezone`, …).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"API key missing, invalid (`unauthorized`), revoked (`key-revoked`), expired (`key-expired`) or its app archived (`app-archived`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key may not make this request: not in the plan (`plan-feature-missing`, e.g. history, radar, non-default variants), not in the key's scopes (`scope-missing`), `origin-not-allowed`, `bundle-required` (app key bound to bundle ids, no bundle header), `bundle-not-allowed`, `organization-disabled`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown station, outside coverage, or no data for this request.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Burst limit (`rate-limited`, retry after `Retry-After` seconds) or monthly quota of the organization (`quota-exceeded`, `Retry-After` = seconds until the next month, UTC). See the `RateLimit` headers.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying: until the burst bucket has a token (`rate-limited`, at least 1), or until the next month, UTC (`quota-exceeded`).","required":true,"schema":{"type":"integer","minimum":1}},"RateLimit-Policy":{"description":"Limits of the key (IETF draft), e.g. `\"burst\";q=20;w=1, \"month\";q=500000;w=2592000`; mobile keys add `\"install\"`.","schema":{"type":"string"}},"RateLimit":{"description":"What is left, e.g. `\"burst\";r=17;t=1, \"month\";r=412345;t=86400` (`t` = seconds until reset).","schema":{"type":"string"}},"X-Request-Id":{"description":"Request id (echoes a sane incoming `X-Request-Id`).","schema":{"type":"string"}}}},"503":{"description":"Data not available right now (e.g. DWD unreachable, nothing stored yet), or the server is busy (`overloaded`: too many requests in progress or no response in time; retry after `Retry-After` seconds).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying (`overloaded`: 2, `auth-unavailable`: 5). Absent on 503s that are not transient.","schema":{"type":"integer"}}}}},"security":[{"ApiKeyHeader":[]},{"BearerAuth":[]},{"ApiKeyQuery":[]}]}},"/v2/radar/volume/frame/{layer}/{timestamp}":{"get":{"tags":["radar"],"summary":"3D radar and clouds: one NANO3D v2 frame","description":"One frame of `layer` (`precip` or `clouds`) at valid time `timestamp`, cropped to `bbox`\n(snapped outward to 8-cell bricks). Observed frames are immutable; nowcast/model/analysis\nframes carry `max-age` until the next cycle/run and an `ETag` (304 on `If-None-Match`).","operationId":"radar_volume_frame_v1_radar_volume_frame__layer___timestamp__get","parameters":[{"name":"layer","in":"path","required":true,"schema":{"type":"string","title":"Layer"}},{"name":"timestamp","in":"path","required":true,"schema":{"type":"string","title":"Timestamp"}},{"name":"bbox","in":"query","required":true,"schema":{"type":"string","description":"minLat,maxLat,minLon,maxLon as in the manifest's URLs","title":"Bbox"},"description":"minLat,maxLat,minLon,maxLon as in the manifest's URLs"},{"name":"resolution","in":"query","required":false,"schema":{"type":"integer","default":1000,"title":"Resolution"}},{"name":"channels","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated subset of the layer's channels, e.g. `dbz`","title":"Channels"},"description":"Comma-separated subset of the layer's channels, e.g. `dbz`"}],"responses":{"200":{"description":"Binary (zlib payload, see docs/radar-3d.md)","content":{"application/octet-stream":{"schema":{"type":"string","contentMediaType":"application/octet-stream"}}},"headers":{"RateLimit-Policy":{"description":"Limits of the key (IETF draft), e.g. `\"burst\";q=20;w=1, \"month\";q=500000;w=2592000`; mobile keys add `\"install\"`.","schema":{"type":"string"}},"RateLimit":{"description":"What is left, e.g. `\"burst\";r=17;t=1, \"month\";r=412345;t=86400` (`t` = seconds until reset).","schema":{"type":"string"}},"X-Request-Id":{"description":"Request id (echoes a sane incoming `X-Request-Id`).","schema":{"type":"string"}}}},"400":{"description":"Invalid or missing parameters (`invalid-parameters`, `missing-location`, `invalid-timezone`, …).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"API key missing, invalid (`unauthorized`), revoked (`key-revoked`), expired (`key-expired`) or its app archived (`app-archived`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key may not make this request: not in the plan (`plan-feature-missing`, e.g. history, radar, non-default variants), not in the key's scopes (`scope-missing`), `origin-not-allowed`, `bundle-required` (app key bound to bundle ids, no bundle header), `bundle-not-allowed`, `organization-disabled`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown station, outside coverage, or no data for this request.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Burst limit (`rate-limited`, retry after `Retry-After` seconds) or monthly quota of the organization (`quota-exceeded`, `Retry-After` = seconds until the next month, UTC). See the `RateLimit` headers.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying: until the burst bucket has a token (`rate-limited`, at least 1), or until the next month, UTC (`quota-exceeded`).","required":true,"schema":{"type":"integer","minimum":1}},"RateLimit-Policy":{"description":"Limits of the key (IETF draft), e.g. `\"burst\";q=20;w=1, \"month\";q=500000;w=2592000`; mobile keys add `\"install\"`.","schema":{"type":"string"}},"RateLimit":{"description":"What is left, e.g. `\"burst\";r=17;t=1, \"month\";r=412345;t=86400` (`t` = seconds until reset).","schema":{"type":"string"}},"X-Request-Id":{"description":"Request id (echoes a sane incoming `X-Request-Id`).","schema":{"type":"string"}}}},"503":{"description":"Data not available right now (e.g. DWD unreachable, nothing stored yet), or the server is busy (`overloaded`: too many requests in progress or no response in time; retry after `Retry-After` seconds).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying (`overloaded`: 2, `auth-unavailable`: 5). Absent on 503s that are not transient.","schema":{"type":"integer"}}}}},"security":[{"ApiKeyHeader":[]},{"BearerAuth":[]},{"ApiKeyQuery":[]}]}},"/v2/radar/volume/surfaces/{timestamp}":{"get":{"tags":["radar"],"summary":"3D radar: NANO2D surfaces of a time step","description":"NANO2D layers available at `timestamp` (see the manifest's `surfaces.layers`): radar\n`echo_top`, `beam_floor`, `ground_class`, `vil`; ICON-D2 `freezing_level`; `snow_line`,\n`cloud_base`, `cloud_top` once the cloud workstream provides them. Absent layers are left\nout.","operationId":"radar_volume_surfaces_v1_radar_volume_surfaces__timestamp__get","parameters":[{"name":"timestamp","in":"path","required":true,"schema":{"type":"string","title":"Timestamp"}},{"name":"bbox","in":"query","required":true,"schema":{"type":"string","description":"minLat,maxLat,minLon,maxLon as in the manifest's URLs","title":"Bbox"},"description":"minLat,maxLat,minLon,maxLon as in the manifest's URLs"},{"name":"resolution","in":"query","required":false,"schema":{"type":"integer","default":1000,"title":"Resolution"}}],"responses":{"200":{"description":"Binary (zlib payload, see docs/radar-3d.md)","content":{"application/octet-stream":{"schema":{"type":"string","contentMediaType":"application/octet-stream"}}},"headers":{"RateLimit-Policy":{"description":"Limits of the key (IETF draft), e.g. `\"burst\";q=20;w=1, \"month\";q=500000;w=2592000`; mobile keys add `\"install\"`.","schema":{"type":"string"}},"RateLimit":{"description":"What is left, e.g. `\"burst\";r=17;t=1, \"month\";r=412345;t=86400` (`t` = seconds until reset).","schema":{"type":"string"}},"X-Request-Id":{"description":"Request id (echoes a sane incoming `X-Request-Id`).","schema":{"type":"string"}}}},"400":{"description":"Invalid or missing parameters (`invalid-parameters`, `missing-location`, `invalid-timezone`, …).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"API key missing, invalid (`unauthorized`), revoked (`key-revoked`), expired (`key-expired`) or its app archived (`app-archived`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key may not make this request: not in the plan (`plan-feature-missing`, e.g. history, radar, non-default variants), not in the key's scopes (`scope-missing`), `origin-not-allowed`, `bundle-required` (app key bound to bundle ids, no bundle header), `bundle-not-allowed`, `organization-disabled`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown station, outside coverage, or no data for this request.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Burst limit (`rate-limited`, retry after `Retry-After` seconds) or monthly quota of the organization (`quota-exceeded`, `Retry-After` = seconds until the next month, UTC). See the `RateLimit` headers.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying: until the burst bucket has a token (`rate-limited`, at least 1), or until the next month, UTC (`quota-exceeded`).","required":true,"schema":{"type":"integer","minimum":1}},"RateLimit-Policy":{"description":"Limits of the key (IETF draft), e.g. `\"burst\";q=20;w=1, \"month\";q=500000;w=2592000`; mobile keys add `\"install\"`.","schema":{"type":"string"}},"RateLimit":{"description":"What is left, e.g. `\"burst\";r=17;t=1, \"month\";r=412345;t=86400` (`t` = seconds until reset).","schema":{"type":"string"}},"X-Request-Id":{"description":"Request id (echoes a sane incoming `X-Request-Id`).","schema":{"type":"string"}}}},"503":{"description":"Data not available right now (e.g. DWD unreachable, nothing stored yet), or the server is busy (`overloaded`: too many requests in progress or no response in time; retry after `Retry-After` seconds).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying (`overloaded`: 2, `auth-unavailable`: 5). Absent on 503s that are not transient.","schema":{"type":"integer"}}}}},"security":[{"ApiKeyHeader":[]},{"BearerAuth":[]},{"ApiKeyQuery":[]}]}},"/v2/radar/volume/terrain":{"get":{"tags":["radar"],"summary":"3D radar: NANO2D terrain height (BKG DGM200)","description":"NANO2D layer `height` (uint16 m above sea level; mean per cell), immutable. Terrain:\n© GeoBasis-DE / BKG 2026 (Daten verändert), dl-de/by-2-0.","operationId":"radar_volume_terrain_v1_radar_volume_terrain_get","parameters":[{"name":"bbox","in":"query","required":true,"schema":{"type":"string","description":"minLat,maxLat,minLon,maxLon as in the manifest's URLs","title":"Bbox"},"description":"minLat,maxLat,minLon,maxLon as in the manifest's URLs"},{"name":"resolution","in":"query","required":false,"schema":{"type":"integer","default":1000,"title":"Resolution"}}],"responses":{"200":{"description":"Binary (zlib payload, see docs/radar-3d.md)","content":{"application/octet-stream":{"schema":{"type":"string","contentMediaType":"application/octet-stream"}}},"headers":{"RateLimit-Policy":{"description":"Limits of the key (IETF draft), e.g. `\"burst\";q=20;w=1, \"month\";q=500000;w=2592000`; mobile keys add `\"install\"`.","schema":{"type":"string"}},"RateLimit":{"description":"What is left, e.g. `\"burst\";r=17;t=1, \"month\";r=412345;t=86400` (`t` = seconds until reset).","schema":{"type":"string"}},"X-Request-Id":{"description":"Request id (echoes a sane incoming `X-Request-Id`).","schema":{"type":"string"}}}},"400":{"description":"Invalid or missing parameters (`invalid-parameters`, `missing-location`, `invalid-timezone`, …).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"API key missing, invalid (`unauthorized`), revoked (`key-revoked`), expired (`key-expired`) or its app archived (`app-archived`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key may not make this request: not in the plan (`plan-feature-missing`, e.g. history, radar, non-default variants), not in the key's scopes (`scope-missing`), `origin-not-allowed`, `bundle-required` (app key bound to bundle ids, no bundle header), `bundle-not-allowed`, `organization-disabled`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown station, outside coverage, or no data for this request.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Burst limit (`rate-limited`, retry after `Retry-After` seconds) or monthly quota of the organization (`quota-exceeded`, `Retry-After` = seconds until the next month, UTC). See the `RateLimit` headers.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying: until the burst bucket has a token (`rate-limited`, at least 1), or until the next month, UTC (`quota-exceeded`).","required":true,"schema":{"type":"integer","minimum":1}},"RateLimit-Policy":{"description":"Limits of the key (IETF draft), e.g. `\"burst\";q=20;w=1, \"month\";q=500000;w=2592000`; mobile keys add `\"install\"`.","schema":{"type":"string"}},"RateLimit":{"description":"What is left, e.g. `\"burst\";r=17;t=1, \"month\";r=412345;t=86400` (`t` = seconds until reset).","schema":{"type":"string"}},"X-Request-Id":{"description":"Request id (echoes a sane incoming `X-Request-Id`).","schema":{"type":"string"}}}},"503":{"description":"Data not available right now (e.g. DWD unreachable, nothing stored yet), or the server is busy (`overloaded`: too many requests in progress or no response in time; retry after `Retry-After` seconds).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying (`overloaded`: 2, `auth-unavailable`: 5). Absent on 503s that are not transient.","schema":{"type":"integer"}}}}},"security":[{"ApiKeyHeader":[]},{"BearerAuth":[]},{"ApiKeyQuery":[]}]}},"/v2/radar/volume/wind/{timestamp}":{"get":{"tags":["radar"],"summary":"3D radar: NANO2D wind layers for particle animation (8 km)","description":"NANO2D `u_1km, v_1km, u_3km, … v_9km` (int8 m/s) on the 8 km grid: ICON-D2-RUC wind of the\nclouds frame nearest to `timestamp` (within 30 minutes). Without one, a valid NANO2D without\nlayers.","operationId":"radar_volume_wind_v1_radar_volume_wind__timestamp__get","parameters":[{"name":"timestamp","in":"path","required":true,"schema":{"type":"string","title":"Timestamp"}},{"name":"bbox","in":"query","required":true,"schema":{"type":"string","description":"minLat,maxLat,minLon,maxLon as in the manifest's URLs","title":"Bbox"},"description":"minLat,maxLat,minLon,maxLon as in the manifest's URLs"}],"responses":{"200":{"description":"Binary (zlib payload, see docs/radar-3d.md)","content":{"application/octet-stream":{"schema":{"type":"string","contentMediaType":"application/octet-stream"}}},"headers":{"RateLimit-Policy":{"description":"Limits of the key (IETF draft), e.g. `\"burst\";q=20;w=1, \"month\";q=500000;w=2592000`; mobile keys add `\"install\"`.","schema":{"type":"string"}},"RateLimit":{"description":"What is left, e.g. `\"burst\";r=17;t=1, \"month\";r=412345;t=86400` (`t` = seconds until reset).","schema":{"type":"string"}},"X-Request-Id":{"description":"Request id (echoes a sane incoming `X-Request-Id`).","schema":{"type":"string"}}}},"400":{"description":"Invalid or missing parameters (`invalid-parameters`, `missing-location`, `invalid-timezone`, …).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"API key missing, invalid (`unauthorized`), revoked (`key-revoked`), expired (`key-expired`) or its app archived (`app-archived`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key may not make this request: not in the plan (`plan-feature-missing`, e.g. history, radar, non-default variants), not in the key's scopes (`scope-missing`), `origin-not-allowed`, `bundle-required` (app key bound to bundle ids, no bundle header), `bundle-not-allowed`, `organization-disabled`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown station, outside coverage, or no data for this request.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Burst limit (`rate-limited`, retry after `Retry-After` seconds) or monthly quota of the organization (`quota-exceeded`, `Retry-After` = seconds until the next month, UTC). See the `RateLimit` headers.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying: until the burst bucket has a token (`rate-limited`, at least 1), or until the next month, UTC (`quota-exceeded`).","required":true,"schema":{"type":"integer","minimum":1}},"RateLimit-Policy":{"description":"Limits of the key (IETF draft), e.g. `\"burst\";q=20;w=1, \"month\";q=500000;w=2592000`; mobile keys add `\"install\"`.","schema":{"type":"string"}},"RateLimit":{"description":"What is left, e.g. `\"burst\";r=17;t=1, \"month\";r=412345;t=86400` (`t` = seconds until reset).","schema":{"type":"string"}},"X-Request-Id":{"description":"Request id (echoes a sane incoming `X-Request-Id`).","schema":{"type":"string"}}}},"503":{"description":"Data not available right now (e.g. DWD unreachable, nothing stored yet), or the server is busy (`overloaded`: too many requests in progress or no response in time; retry after `Retry-After` seconds).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying (`overloaded`: 2, `auth-unavailable`: 5). Absent on 503s that are not transient.","schema":{"type":"integer"}}}}},"security":[{"ApiKeyHeader":[]},{"BearerAuth":[]},{"ApiKeyQuery":[]}]}},"/v2/radar/volume/features/{timestamp}":{"get":{"tags":["radar"],"summary":"3D radar: convective cells and mesocyclones of a time step","description":"KONRAD3D cells (tracks, hail flags, motion, lightning, mesocyclone index) and mesocyclones\nof the 5-minute cycle at `timestamp`, or of the newest cycle up to 10 minutes before it\n(`source_cycle`); empty lists when none is stored. Cells and mesocyclones are filtered to\n`bbox` (25 km margin).","operationId":"radar_volume_features_v1_radar_volume_features__timestamp__get","parameters":[{"name":"timestamp","in":"path","required":true,"schema":{"type":"string","title":"Timestamp"}},{"name":"bbox","in":"query","required":true,"schema":{"type":"string","description":"minLat,maxLat,minLon,maxLon as in the manifest's URLs","title":"Bbox"},"description":"minLat,maxLat,minLon,maxLon as in the manifest's URLs"},{"name":"tz","in":"query","required":false,"schema":{"type":"string","description":"Time zone of `meta.generated`; times stay UTC","default":"Europe/Berlin","title":"Tz"},"description":"Time zone of `meta.generated`; times stay UTC"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RadarFeaturesResponse"}}},"headers":{"RateLimit-Policy":{"description":"Limits of the key (IETF draft), e.g. `\"burst\";q=20;w=1, \"month\";q=500000;w=2592000`; mobile keys add `\"install\"`.","schema":{"type":"string"}},"RateLimit":{"description":"What is left, e.g. `\"burst\";r=17;t=1, \"month\";r=412345;t=86400` (`t` = seconds until reset).","schema":{"type":"string"}},"X-Request-Id":{"description":"Request id (echoes a sane incoming `X-Request-Id`).","schema":{"type":"string"}}}},"400":{"description":"Invalid or missing parameters (`invalid-parameters`, `missing-location`, `invalid-timezone`, …).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"API key missing, invalid (`unauthorized`), revoked (`key-revoked`), expired (`key-expired`) or its app archived (`app-archived`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key may not make this request: not in the plan (`plan-feature-missing`, e.g. history, radar, non-default variants), not in the key's scopes (`scope-missing`), `origin-not-allowed`, `bundle-required` (app key bound to bundle ids, no bundle header), `bundle-not-allowed`, `organization-disabled`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown station, outside coverage, or no data for this request.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Burst limit (`rate-limited`, retry after `Retry-After` seconds) or monthly quota of the organization (`quota-exceeded`, `Retry-After` = seconds until the next month, UTC). See the `RateLimit` headers.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying: until the burst bucket has a token (`rate-limited`, at least 1), or until the next month, UTC (`quota-exceeded`).","required":true,"schema":{"type":"integer","minimum":1}},"RateLimit-Policy":{"description":"Limits of the key (IETF draft), e.g. `\"burst\";q=20;w=1, \"month\";q=500000;w=2592000`; mobile keys add `\"install\"`.","schema":{"type":"string"}},"RateLimit":{"description":"What is left, e.g. `\"burst\";r=17;t=1, \"month\";r=412345;t=86400` (`t` = seconds until reset).","schema":{"type":"string"}},"X-Request-Id":{"description":"Request id (echoes a sane incoming `X-Request-Id`).","schema":{"type":"string"}}}},"503":{"description":"Data not available right now (e.g. DWD unreachable, nothing stored yet), or the server is busy (`overloaded`: too many requests in progress or no response in time; retry after `Retry-After` seconds).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying (`overloaded`: 2, `auth-unavailable`: 5). Absent on 503s that are not transient.","schema":{"type":"integer"}}}}},"security":[{"ApiKeyHeader":[]},{"BearerAuth":[]},{"ApiKeyQuery":[]}]}},"/v2/meta/models":{"get":{"tags":["meta"],"summary":"Forecast model profiles: aliases, versions, parameters","description":"The registry of forecast models. Every forecast comes from a *profile* (model + parameters +\ninputs + post-processors) with a version; `variant=` on /v1/weather takes a profile name or an\nalias (`stable` → the champion). `meta.model` of a /v1/weather response names profile and version.","operationId":"meta_models_v1_meta_models_get","parameters":[{"name":"tz","in":"query","required":false,"schema":{"type":"string","default":"Europe/Berlin","title":"Tz"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelsResponse"}}}},"503":{"description":"Data not available right now (e.g. DWD unreachable, nothing stored yet), or the server is busy (`overloaded`: too many requests in progress or no response in time; retry after `Retry-After` seconds).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying (`overloaded`: 2, `auth-unavailable`: 5). Absent on 503s that are not transient.","schema":{"type":"integer"}}}}},"security":[]}},"/v2/history":{"get":{"tags":["history"],"summary":"Measured past values (hourly or daily) from a station","operationId":"history_v1_history_get","parameters":[{"name":"start","in":"query","required":true,"schema":{"type":"string","description":"ISO date (local day) or date-time","title":"Start"},"description":"ISO date (local day) or date-time"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO date (inclusive) or date-time; default now","title":"End"},"description":"ISO date (inclusive) or date-time; default now"},{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":90,"minimum":-90},{"type":"null"}],"title":"Lat"}},{"name":"lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":180,"minimum":-180},{"type":"null"}],"title":"Lon"}},{"name":"station","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"DWD station id","title":"Station"},"description":"DWD station id"},{"name":"resolution","in":"query","required":false,"schema":{"type":"string","pattern":"^(hourly|daily)$","default":"daily","title":"Resolution"}},{"name":"tz","in":"query","required":false,"schema":{"type":"string","default":"Europe/Berlin","title":"Tz"}},{"name":"units","in":"query","required":false,"schema":{"type":"string","pattern":"^(metric|imperial)$","default":"metric","title":"Units"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryResponse"}}},"headers":{"RateLimit-Policy":{"description":"Limits of the key (IETF draft), e.g. `\"burst\";q=20;w=1, \"month\";q=500000;w=2592000`; mobile keys add `\"install\"`.","schema":{"type":"string"}},"RateLimit":{"description":"What is left, e.g. `\"burst\";r=17;t=1, \"month\";r=412345;t=86400` (`t` = seconds until reset).","schema":{"type":"string"}},"X-Request-Id":{"description":"Request id (echoes a sane incoming `X-Request-Id`).","schema":{"type":"string"}}}},"400":{"description":"Invalid or missing parameters (`invalid-parameters`, `missing-location`, `invalid-timezone`, …).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"API key missing, invalid (`unauthorized`), revoked (`key-revoked`), expired (`key-expired`) or its app archived (`app-archived`).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The key may not make this request: not in the plan (`plan-feature-missing`, e.g. history, radar, non-default variants), not in the key's scopes (`scope-missing`), `origin-not-allowed`, `bundle-required` (app key bound to bundle ids, no bundle header), `bundle-not-allowed`, `organization-disabled`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown station, outside coverage, or no data for this request.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Burst limit (`rate-limited`, retry after `Retry-After` seconds) or monthly quota of the organization (`quota-exceeded`, `Retry-After` = seconds until the next month, UTC). See the `RateLimit` headers.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying: until the burst bucket has a token (`rate-limited`, at least 1), or until the next month, UTC (`quota-exceeded`).","required":true,"schema":{"type":"integer","minimum":1}},"RateLimit-Policy":{"description":"Limits of the key (IETF draft), e.g. `\"burst\";q=20;w=1, \"month\";q=500000;w=2592000`; mobile keys add `\"install\"`.","schema":{"type":"string"}},"RateLimit":{"description":"What is left, e.g. `\"burst\";r=17;t=1, \"month\";r=412345;t=86400` (`t` = seconds until reset).","schema":{"type":"string"}},"X-Request-Id":{"description":"Request id (echoes a sane incoming `X-Request-Id`).","schema":{"type":"string"}}}},"503":{"description":"Data not available right now (e.g. DWD unreachable, nothing stored yet), or the server is busy (`overloaded`: too many requests in progress or no response in time; retry after `Retry-After` seconds).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying (`overloaded`: 2, `auth-unavailable`: 5). Absent on 503s that are not transient.","schema":{"type":"integer"}}}}},"security":[{"ApiKeyHeader":[]},{"BearerAuth":[]},{"ApiKeyQuery":[]}]}}},"components":{"schemas":{"AccuracyHeadToHead":{"properties":{"rule":{"type":"string","enum":["abs_error_lower","category_match"],"title":"Rule","description":"`abs_error_lower`: of two answers further apart than the variable's tolerance (temperature 1 °C, wind 5 km/h, sunshine 0.15) the closer one wins; `category_match`: where one says wet and the other dry, the one matching the observation wins. Clients must accept unknown values.","x-extensible-enum":true},"wins":{"type":"integer","title":"Wins","description":"Hours nano won."},"losses":{"type":"integer","title":"Losses","description":"Hours the opponent won."},"ties":{"type":"integer","title":"Ties"}},"additionalProperties":true,"type":"object","required":["rule","wins","losses","ties"],"title":"AccuracyHeadToHead"},"AccuracyLead":{"properties":{"from_h":{"type":"integer","title":"From H","description":"Lead-time bucket, first hour."},"to_h":{"type":"integer","title":"To H","description":"Lead-time bucket, last hour (inclusive)."},"results":{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/AccuracyOpponentResult"},{"$ref":"#/components/schemas/AccuracyResult"}]},"type":"object","title":"Results","description":"provider id → its score. `nano`: all its hours; an opponent: the hours it shares with nano, with `nano_same_hours`, shown from 500 pairs."},"head_to_head":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/AccuracyHeadToHead"},"type":"object"},{"type":"null"}],"title":"Head To Head","description":"opponent id → nano against it in this lead bucket (per bucket: the lead decides who wins)."}},"additionalProperties":true,"type":"object","required":["from_h","to_h","results"],"title":"AccuracyLead"},"AccuracyOpponentResult":{"properties":{"n":{"type":"integer","title":"N","description":"Forecast/observation pairs (an opponent: the hours it shares with nano)."},"mae":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mae","description":"Mean absolute error (unit of the variable)."},"bias":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Bias","description":"Mean error, forecast − observed."},"within_1c":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Within 1C","description":"temperature: share of hours with |error| ≤ 1 °C."},"within_5kmh":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Within 5Kmh","description":"wind_speed: share of hours with |error| ≤ 5 km/h."},"category_right":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Category Right","description":"sunshine: share of hours with the category (sunny/mixed/cloudy) right."},"hit_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Hit Rate","description":"precipitation_wet: (hits + correct negatives) / n."},"hits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Hits","description":"Forecast wet, observed wet (≥ `threshold_mm`)."},"misses":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Misses","description":"Forecast dry, observed wet."},"false_alarms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"False Alarms","description":"Forecast wet, observed dry."},"correct_negatives":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Correct Negatives","description":"Forecast dry, observed dry."},"nano_same_hours":{"$ref":"#/components/schemas/AccuracyResult","description":"nano's score on exactly this opponent's hours (the fair comparison)."}},"additionalProperties":true,"type":"object","required":["n","nano_same_hours"],"title":"AccuracyOpponentResult"},"AccuracyPeriod":{"properties":{"from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From","description":"First day (or time) covered."},"to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To","description":"Last day (or time) covered."}},"additionalProperties":true,"type":"object","required":["from","to"],"title":"AccuracyPeriod"},"AccuracyPlaces":{"properties":{"places":{"type":"integer","title":"Places","description":"Comparison places."},"truth_stations":{"type":"integer","title":"Truth Stations","description":"DWD stations used as truth (≤ 12 km, ≤ 150 m height difference)."},"variables":{"items":{"$ref":"#/components/schemas/AccuracyVariable"},"type":"array","title":"Variables"},"series":{"items":{"$ref":"#/components/schemas/AccuracySeriesPoint"},"type":"array","title":"Series","description":"Daily, lead 1–3 h."}},"additionalProperties":true,"type":"object","required":["places","truth_stations","variables","series"],"title":"AccuracyPlaces"},"AccuracyProvider":{"properties":{"id":{"type":"string","enum":["nano","dwd_mosmix_nearest","met_norway"],"title":"Id","description":"`nano`; `dwd_mosmix_nearest`: DWD MOSMIX at the nearest station (as Bright Sky serves it); `met_norway`: MET Norway Locationforecast. Clients must accept unknown values.","x-extensible-enum":true}},"additionalProperties":true,"type":"object","required":["id"],"title":"AccuracyProvider"},"AccuracyReportPeriod":{"properties":{"from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From","description":"First day (or time) covered."},"to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To","description":"Last day (or time) covered."},"window_days":{"type":"integer","title":"Window Days","description":"The rolling window; less is covered until the data reaches back that far."}},"additionalProperties":true,"type":"object","required":["from","to","window_days"],"title":"AccuracyReportPeriod"},"AccuracyResponse":{"properties":{"generated":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generated","description":"When the report was computed (UTC); null before the first run."},"data_until":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data Until","description":"The last valid hour scored (UTC)."},"period":{"$ref":"#/components/schemas/AccuracyReportPeriod"},"truth":{"type":"string","const":"dwd_stations","title":"Truth","description":"Observations used as truth. Clients must accept unknown values.","x-extensible-enum":true},"providers":{"items":{"$ref":"#/components/schemas/AccuracyProvider"},"type":"array","title":"Providers","description":"Providers with data in the report, nano first."},"places":{"$ref":"#/components/schemas/AccuracyPlaces"},"stations":{"anyOf":[{"$ref":"#/components/schemas/AccuracyStations"},{"type":"null"}],"description":"The champion at all DWD stations; null before the first run."},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"meta":{"$ref":"#/components/schemas/Meta"}},"additionalProperties":true,"type":"object","required":["generated","data_until","period","truth","providers","places","stations","attribution","meta"],"title":"AccuracyResponse"},"AccuracyResult":{"properties":{"n":{"type":"integer","title":"N","description":"Forecast/observation pairs (an opponent: the hours it shares with nano)."},"mae":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mae","description":"Mean absolute error (unit of the variable)."},"bias":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Bias","description":"Mean error, forecast − observed."},"within_1c":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Within 1C","description":"temperature: share of hours with |error| ≤ 1 °C."},"within_5kmh":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Within 5Kmh","description":"wind_speed: share of hours with |error| ≤ 5 km/h."},"category_right":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Category Right","description":"sunshine: share of hours with the category (sunny/mixed/cloudy) right."},"hit_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Hit Rate","description":"precipitation_wet: (hits + correct negatives) / n."},"hits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Hits","description":"Forecast wet, observed wet (≥ `threshold_mm`)."},"misses":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Misses","description":"Forecast dry, observed wet."},"false_alarms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"False Alarms","description":"Forecast wet, observed dry."},"correct_negatives":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Correct Negatives","description":"Forecast dry, observed dry."}},"additionalProperties":true,"type":"object","required":["n"],"title":"AccuracyResult"},"AccuracySeriesPoint":{"properties":{"date":{"type":"string","title":"Date","description":"UTC day (YYYY-MM-DD) of the valid hours."},"variable":{"type":"string","title":"Variable"},"lead_from_h":{"type":"integer","title":"Lead From H"},"lead_to_h":{"type":"integer","title":"Lead To H"},"values":{"additionalProperties":{"type":"number"},"type":"object","title":"Values","description":"provider id → the variable's consumer metric that day."},"n":{"additionalProperties":{"type":"integer"},"type":"object","title":"N","description":"provider id → pairs that day."}},"additionalProperties":true,"type":"object","required":["date","variable","lead_from_h","lead_to_h","values","n"],"title":"AccuracySeriesPoint"},"AccuracyStationLead":{"properties":{"from_h":{"type":"integer","title":"From H"},"to_h":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"To H","description":"Inclusive; null for the open last bucket."},"n":{"type":"integer","title":"N"},"mae":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mae"},"bias":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Bias"}},"additionalProperties":true,"type":"object","required":["from_h","to_h","n","mae","bias"],"title":"AccuracyStationLead"},"AccuracyStationVariable":{"properties":{"id":{"type":"string","title":"Id","description":"temperature, wind_speed, wind_gust, precipitation."},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"leads":{"items":{"$ref":"#/components/schemas/AccuracyStationLead"},"type":"array","title":"Leads"}},"additionalProperties":true,"type":"object","required":["id","unit","leads"],"title":"AccuracyStationVariable"},"AccuracyStations":{"properties":{"profile":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile","description":"The profile `stable` serves."},"window_h":{"type":"integer","title":"Window H"},"period":{"$ref":"#/components/schemas/AccuracyPeriod"},"variables":{"items":{"$ref":"#/components/schemas/AccuracyStationVariable"},"type":"array","title":"Variables"}},"additionalProperties":true,"type":"object","required":["profile","window_h","period","variables"],"title":"AccuracyStations"},"AccuracyVariable":{"properties":{"id":{"type":"string","enum":["temperature","precipitation_wet","wind_speed","sunshine"],"title":"Id","description":"Clients must accept unknown values.","x-extensible-enum":true},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit","description":"`°C`, `km/h`, `fraction` (of the hour); null for counts."},"metric":{"type":"string","enum":["within_1c","within_5kmh","category_right","hit_rate"],"title":"Metric","description":"The consumer metric of this variable (the field to headline in `results`). Clients must accept unknown values.","x-extensible-enum":true},"threshold_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Threshold Mm","description":"precipitation_wet: an hour counts as wet from this amount."},"daytime_only":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Daytime Only","description":"sunshine: only hours with the sun ≥ 15° above the horizon."},"categories":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Categories","description":"sunshine: `sunny_from`, `mixed_from` (sunshine share)."},"leads":{"items":{"$ref":"#/components/schemas/AccuracyLead"},"type":"array","title":"Leads","description":"By lead time; buckets without data are left out."}},"additionalProperties":true,"type":"object","required":["id","unit","metric","leads"],"title":"AccuracyVariable"},"Attribution":{"properties":{"provider":{"type":"string","title":"Provider","description":"Data provider: `Deutscher Wetterdienst` (the 3D radar's terrain also names the Bundesamt für Kartographie und Geodäsie)."},"url":{"type":"string","title":"Url","description":"Provider URL."},"license":{"type":"string","title":"License","description":"License of the data, `CC BY 4.0`."},"license_url":{"type":"string","title":"License Url","description":"License URL."},"modified":{"type":"boolean","title":"Modified","description":"True: values were processed (blended, interpolated, aggregated, converted)."},"note":{"type":"string","title":"Note","description":"What was changed."},"datasets":{"items":{"type":"string"},"type":"array","title":"Datasets","description":"DWD datasets that went into this response."}},"additionalProperties":true,"type":"object","required":["provider","url","license","license_url","modified","note","datasets"],"title":"Attribution","description":"Source of the data. Every data response carries one DWD entry; show \"Quelle: Deutscher\nWetterdienst\" in clients."},"Biowetter":{"properties":{"available":{"type":"boolean","const":true,"title":"Available","description":"True: the sub-block has content (see SubBlockUnavailable for false)."},"issued":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Issued","description":"Issue time of the DWD product."},"next_update":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Update","description":"Announced next issue."},"sender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender","description":"Issuing DWD department."},"attribution":{"type":"string","title":"Attribution","description":"`Deutscher Wetterdienst`."},"zone":{"$ref":"#/components/schemas/NamedRef"},"periods":{"items":{"$ref":"#/components/schemas/BiowetterPeriod"},"type":"array","title":"Periods"},"language":{"type":"string","const":"de","title":"Language","description":"Language of the texts (DWD publishes German only)."}},"additionalProperties":true,"type":"object","required":["available","issued","next_update","sender","attribution","zone","periods","language"],"title":"Biowetter","description":"DWD Biowetter forecast of the zone (A–K) containing the point. German only."},"BiowetterEffect":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"},"subeffect":{"anyOf":[{"items":{"$ref":"#/components/schemas/BiowetterItem"},"type":"array"},{"type":"null"}],"title":"Subeffect","description":"Finer effects."}},"additionalProperties":true,"type":"object","title":"BiowetterEffect"},"BiowetterItem":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"}},"additionalProperties":true,"type":"object","title":"BiowetterItem"},"BiowetterPeriod":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"period":{"type":"string","enum":["morning","afternoon"],"title":"Period","description":"Half of the day."},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","description":"DWD label, e.g. `1. Tageshälfte`."},"weather_class":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Weather Class","description":"DWD bioclimatic weather class code."},"effects":{"items":{"$ref":"#/components/schemas/BiowetterEffect"},"type":"array","title":"Effects","description":"Effects (German, as published)."},"recommendations":{"items":{"$ref":"#/components/schemas/BiowetterItem"},"type":"array","title":"Recommendations","description":"Recommendations (German, as published)."}},"additionalProperties":true,"type":"object","required":["date","period","label","weather_class","effects","recommendations"],"title":"BiowetterPeriod"},"BlockUnavailableReason":{"type":"string","enum":["outside_grid","no_product","no_data","no_region","no_radar_coverage","not_implemented","error"],"title":"BlockUnavailableReason","description":"Why a /v1/weather block is null (top-level `unavailable`). Clients must accept unknown values.","x-extensible-enum":true},"Cell":{"properties":{"id":{"type":"string","title":"Id","description":"Track id, stable while the cell is tracked (chained across 5-minute cycles)."},"lat":{"type":"number","title":"Lat","description":"Centroid latitude."},"lon":{"type":"number","title":"Lon","description":"Centroid longitude."},"t":{"type":"string","format":"date-time","title":"T","description":"Detection time (the 5-minute cycle), UTC."},"top_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Top M","description":"Echo top (m above sea level)."},"area_km2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Area Km2","description":"Covered area (km²)."},"max_dbz":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Dbz","description":"Maximum reflectivity (dBZ)."},"severity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Severity","description":"KONRAD3D severity (points, 0 = weak)."},"motion":{"anyOf":[{"$ref":"#/components/schemas/CellMotion"},{"type":"null"}],"description":"Cell motion, null when unknown."},"hail":{"type":"boolean","title":"Hail","description":"Hail (KONRAD3D hail flag or HyMeC hail area)."},"large_hail":{"type":"boolean","title":"Large Hail","description":"Large hail (HyMeC large-hail area or near-ground class)."},"gust_flag":{"type":"boolean","title":"Gust Flag","description":"KONRAD3D gust flag."},"lightning_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lightning Rate","description":"Lightning strokes per minute (KONRAD3D), null without data."},"lightning_jump":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Lightning Jump","description":"Lightning jump in the last 10 minutes, null without lightning data."},"meso_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Meso Index","description":"Mesocyclone severity of an associated mesocyclone, null if none."},"rate_history":{"items":{"$ref":"#/components/schemas/CellRate"},"type":"array","title":"Rate History","description":"Along the track, up to 1 h, oldest first (the last entry is now)."},"track":{"$ref":"#/components/schemas/CellTrack"}},"additionalProperties":true,"type":"object","required":["id","lat","lon","t","top_m","area_km2","max_dbz","severity","motion","hail","large_hail","gust_flag","lightning_rate","lightning_jump","meso_index","rate_history","track"],"title":"Cell"},"CellMotion":{"properties":{"u_m_s":{"type":"number","title":"U M S","description":"Eastward cell motion (m/s)."},"v_m_s":{"type":"number","title":"V M S","description":"Northward cell motion (m/s)."}},"additionalProperties":true,"type":"object","required":["u_m_s","v_m_s"],"title":"CellMotion"},"CellPoint":{"properties":{"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"t":{"type":"string","format":"date-time","title":"T"}},"additionalProperties":true,"type":"object","required":["lat","lon","t"],"title":"CellPoint"},"CellRate":{"properties":{"t":{"type":"string","format":"date-time","title":"T"},"max_dbz":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Dbz"},"vil":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Vil","description":"Cell-based VIL (kg/m²)."},"lightning_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lightning Rate","description":"Strokes per minute."}},"additionalProperties":true,"type":"object","required":["t","max_dbz","vil","lightning_rate"],"title":"CellRate"},"CellTrack":{"properties":{"past":{"items":{"$ref":"#/components/schemas/CellPoint"},"type":"array","title":"Past","description":"Previous centroids along the track (up to 2 h), oldest first."},"forecast":{"items":{"$ref":"#/components/schemas/CellPoint"},"type":"array","title":"Forecast","description":"KONRAD3D centroid forecasts (+5 … +60 min)."}},"additionalProperties":true,"type":"object","required":["past","forecast"],"title":"CellTrack"},"City":{"properties":{"name":{"type":"string","title":"Name"},"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"distance_km":{"type":"number","title":"Distance Km","description":"Distance from the point to the city (km)."}},"additionalProperties":true,"type":"object","required":["name","lat","lon","distance_km"],"title":"City"},"Climate":{"properties":{"available":{"type":"boolean","const":true,"title":"Available","description":"True: the sub-block has content (see SubBlockUnavailable for false)."},"period":{"type":"string","title":"Period","description":"`1991-2020`."},"month":{"type":"integer","maximum":12,"minimum":1,"title":"Month","description":"Month of the normals (local month of now)."},"normal":{"$ref":"#/components/schemas/ClimateNormal"},"units":{"additionalProperties":{"type":"string"},"type":"object","title":"Units","description":"Unit of each normal."},"station":{"$ref":"#/components/schemas/ResolvedStation","description":"The temperature station."},"stations":{"$ref":"#/components/schemas/ClimateStations","description":"Station per variable."},"anomaly":{"anyOf":[{"$ref":"#/components/schemas/ClimateAnomaly"},{"type":"null"}],"description":"Only when today's forecast is available."},"attribution":{"type":"string","title":"Attribution"}},"additionalProperties":true,"type":"object","required":["available","period","month","normal","units","station","stations","attribution"],"title":"Climate","description":"Monthly normals 1991–2020 of the best station per variable (within 50 km). Normals and\nanomaly follow `units`."},"ClimateAnomaly":{"properties":{"temperature":{"type":"number","title":"Temperature","description":"Today's forecast mean temperature minus the monthly normal (K / °F difference)."},"unit":{"type":"string","enum":["K","°F"],"title":"Unit","description":"`K` (metric) or `°F` (imperial, a temperature difference)."},"basis":{"type":"string","title":"Basis"}},"additionalProperties":true,"type":"object","required":["temperature","unit","basis"],"title":"ClimateAnomaly"},"ClimateNormal":{"properties":{"temperature_mean":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Temperature Mean","description":"Monthly mean temperature (°C / °F)."},"precipitation":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Precipitation","description":"Monthly precipitation (mm / in)."},"sunshine":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sunshine","description":"Monthly sunshine (h)."}},"additionalProperties":true,"type":"object","required":["temperature_mean"],"title":"ClimateNormal"},"ClimateStations":{"properties":{"temperature_mean":{"anyOf":[{"$ref":"#/components/schemas/ResolvedStation"},{"type":"null"}]},"precipitation":{"anyOf":[{"$ref":"#/components/schemas/ResolvedStation"},{"type":"null"}]},"sunshine":{"anyOf":[{"$ref":"#/components/schemas/ResolvedStation"},{"type":"null"}]}},"additionalProperties":true,"type":"object","title":"ClimateStations"},"ConditionCode":{"type":"string","enum":["unknown","clear","partly_cloudy","cloudy","overcast","fog","haze","drizzle","light_rain","rain","heavy_rain","freezing_rain","sleet","snow","heavy_snow","thunderstorm","hail","windy"],"title":"ConditionCode","description":"Weather condition code (draft set). Labels and symbol names: GET /v1/meta/conditions. Day/night is the separate `is_day` flag. Clients must accept unknown values.","x-extensible-enum":true},"ConditionInfo":{"properties":{"code":{"$ref":"#/components/schemas/ConditionCode"},"labels":{"$ref":"#/components/schemas/ConditionLabels"},"symbol":{"$ref":"#/components/schemas/ConditionSymbol","description":"Symbol names for day and night."}},"additionalProperties":true,"type":"object","required":["code","labels","symbol"],"title":"ConditionInfo"},"ConditionLabels":{"properties":{"de":{"type":"string","title":"De"},"en":{"type":"string","title":"En"}},"additionalProperties":true,"type":"object","required":["de","en"],"title":"ConditionLabels"},"ConditionSymbol":{"properties":{"day":{"type":"string","title":"Day"},"night":{"type":"string","title":"Night"}},"additionalProperties":true,"type":"object","required":["day","night"],"title":"ConditionSymbol"},"ConditionsResponse":{"properties":{"conditions":{"items":{"$ref":"#/components/schemas/ConditionInfo"},"type":"array","title":"Conditions"},"status":{"type":"string","const":"draft","title":"Status","description":"The code set may still change."},"meta":{"$ref":"#/components/schemas/Meta"}},"additionalProperties":true,"type":"object","required":["conditions","status","meta"],"title":"ConditionsResponse"},"Current":{"properties":{"units":{"additionalProperties":{"type":"string"},"type":"object","title":"Units","description":"Unit of each field, e.g. `{\"temperature\": \"°C\"}`."},"time":{"type":"string","format":"date-time","title":"Time","description":"Time of the answer (now, in `tz`)."},"temperature":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Temperature","description":"Air temperature 2 m (°C / °F), height-corrected to `location.elevation_m`."},"apparent_temperature":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Apparent Temperature","description":"Perceived temperature (°C / °F)."},"dew_point":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dew Point","description":"Dew point 2 m (°C / °F)."},"relative_humidity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Relative Humidity","description":"Relative humidity (%)."},"pressure_msl":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pressure Msl","description":"Pressure reduced to mean sea level (hPa / inHg)."},"wind_speed":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Wind Speed","description":"Wind speed 10 m, 10-minute mean (km/h / mph)."},"wind_direction":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Wind Direction","description":"Wind direction, degrees from which the wind blows (°)."},"wind_gust":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Wind Gust","description":"Maximum gust (km/h / mph)."},"visibility":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Visibility","description":"Visibility (m, integer / mi, 1 decimal)."},"cloud_cover":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cloud Cover","description":"Total cloud cover (%)."},"precipitation_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Precipitation Rate","description":"Precipitation rate now, radar at the exact point (mm/h / in/h)."},"condition":{"anyOf":[{"$ref":"#/components/schemas/ConditionCode"},{"type":"null"}],"description":"Condition classified from the values above."},"precipitation_intensity":{"anyOf":[{"$ref":"#/components/schemas/PrecipitationIntensity"},{"type":"null"}],"description":"Class of `precipitation_rate` (metric, as shown); null when the rate is null."},"precipitation_kind":{"anyOf":[{"$ref":"#/components/schemas/PrecipitationKind"},{"type":"null"}],"description":"`rain` or `snow`: the station's present weather (WMO ww / DWD condition code, ≤ 90 min old) when it reports precipitation, else the kind of `condition`. Absent when unknown or when the intensity is `none`; then the rain column of the scale applies."},"is_day":{"type":"boolean","title":"Is Day","description":"Sun above the horizon at the point now."},"source":{"$ref":"#/components/schemas/CurrentSource"}},"additionalProperties":true,"type":"object","required":["units","time","temperature","apparent_temperature","dew_point","relative_humidity","pressure_msl","wind_speed","wind_direction","wind_gust","visibility","cloud_cover","precipitation_rate","condition","precipitation_intensity","is_day","source"],"title":"Current"},"CurrentSource":{"properties":{"kind":{"type":"string","enum":["observation","model"],"title":"Kind","description":"`observation`: measured at a nearby station; `model`: the forecast value for now (nano's “Modellwert”). Clients must accept unknown values.","x-extensible-enum":true},"station":{"anyOf":[{"type":"string","pattern":"^\\d{5}$"},{"type":"null"}],"title":"Station","description":"DWD id of the chosen (or pinned) station, 5 digits."},"station_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Station Name","description":"Station name."},"distance_km":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distance Km","description":"Distance from the point to the station (km); null for a pinned remote station."},"height_diff_m":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height Diff M","description":"Station height minus the location's elevation (m)."},"pinned":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Pinned","description":"True when the station was pinned with `station=`."},"observed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Observed At","description":"Time of the observation (in `tz`). Only for `kind=observation`."},"stale":{"type":"boolean","title":"Stale","description":"True when a station exists but has no measurement younger than 90 minutes."},"model_fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Model Fields","description":"Fields not measured by the station and filled from the model."},"variant":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variant","description":"Product variant of the model values (only for `kind=model`)."},"precipitation":{"type":"string","enum":["RV","model"],"title":"Precipitation","description":"Source of `precipitation_rate`: `RV` radar analysis at the point, or the model hour. Clients must accept unknown values.","x-extensible-enum":true}},"additionalProperties":true,"type":"object","required":["kind","stale","precipitation"],"title":"CurrentSource"},"Daily":{"properties":{"generated":{"type":"string","format":"date-time","title":"Generated","description":"When the point product was built."},"valid_until":{"type":"string","format":"date-time","title":"Valid Until","description":"When the next build is expected."},"units":{"additionalProperties":{"type":"string"},"type":"object","title":"Units","description":"Unit of each series (`sunshine_duration`, `precipitation_hours`, `daylight_hours` in `h`)."},"date":{"items":{"type":"string","format":"date"},"type":"array","title":"Date","description":"Local calendar day."},"hours_covered":{"items":{"type":"integer"},"type":"array","title":"Hours Covered","description":"Number of forecast hours of the day that went into the aggregates."},"temperature_min":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Temperature Min","description":"Minimum temperature (°C / °F)."},"temperature_max":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Temperature Max","description":"Maximum temperature (°C / °F)."},"apparent_temperature_min":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Apparent Temperature Min","description":"Minimum perceived temperature (°C / °F)."},"apparent_temperature_max":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Apparent Temperature Max","description":"Maximum perceived temperature (°C / °F)."},"precipitation_sum":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Precipitation Sum","description":"Precipitation sum (mm / in)."},"precipitation_hours":{"items":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"array","title":"Precipitation Hours","description":"Number of hours with ≥ 0.1 mm (h)."},"precipitation_probability":{"items":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"array","title":"Precipitation Probability","description":"Maximum of the hourly precipitation probabilities (%)."},"thunderstorm_probability":{"items":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"array","title":"Thunderstorm Probability","description":"Maximum of the hourly thunderstorm probabilities (%)."},"wind_speed_max":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Wind Speed Max","description":"Maximum hourly wind speed (km/h / mph)."},"wind_gust_max":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Wind Gust Max","description":"Maximum gust (km/h / mph)."},"wind_direction_dominant":{"items":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"array","title":"Wind Direction Dominant","description":"Speed-weighted mean wind direction (°)."},"sunshine_duration":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Sunshine Duration","description":"Sunshine duration in hours (h; hourly gives minutes)."},"solar_radiation_sum":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Solar Radiation Sum","description":"Global radiation sum (kWh/m²)."},"ground_frost":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Ground Frost","description":"Minimum temperature 5 cm above ground (°C / °F)."},"condition":{"items":{"anyOf":[{"$ref":"#/components/schemas/ConditionCode"},{"type":"null"}]},"type":"array","title":"Condition","description":"Dominant condition: the most severe precipitation/storm lasting ≥ 2 h (1 h for thunderstorm), else the most frequent daytime sky condition."},"sunrise":{"items":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"type":"array","title":"Sunrise","description":"Sunrise (in `tz`, whole seconds); null in polar day/night."},"sunset":{"items":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"type":"array","title":"Sunset","description":"Sunset (in `tz`)."},"daylight_hours":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Daylight Hours","description":"Time between sunrise and sunset (h)."},"uv_index_max":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Uv Index Max","description":"Daily maximum UV index (ICON-EU, first 3 days, else null)."},"uv_index_max_time":{"items":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"type":"array","title":"Uv Index Max Time","description":"Time of the UV maximum (in `tz`)."},"notes":{"$ref":"#/components/schemas/DailyNotes"},"source":{"items":{"anyOf":[{"$ref":"#/components/schemas/ForecastSourceDataset"},{"$ref":"#/components/schemas/ForecastSourceBuild"},{"$ref":"#/components/schemas/ForecastSourceObservation"},{"$ref":"#/components/schemas/ForecastSourceNowcast"}]},"type":"array","title":"Source","description":"Inputs of the build, then the build itself."}},"additionalProperties":true,"type":"object","required":["generated","valid_until","units","date","hours_covered","temperature_min","temperature_max","apparent_temperature_min","apparent_temperature_max","precipitation_sum","precipitation_hours","precipitation_probability","thunderstorm_probability","wind_speed_max","wind_gust_max","wind_direction_dominant","sunshine_duration","solar_radiation_sum","ground_frost","condition","sunrise","sunset","daylight_hours","uv_index_max","uv_index_max_time","notes","source"],"title":"Daily","description":"Daily values: local calendar days in `tz`, aggregated from the hourly values. All arrays\nhave the length of `date`."},"DailyNotes":{"properties":{"aggregation":{"type":"string","title":"Aggregation","description":"How days are aggregated: local calendar day in `tz`, from the hourly values."},"partial_first_day":{"type":"boolean","title":"Partial First Day","description":"True when the first day has fewer than 24 hours (today, already begun)."}},"additionalProperties":true,"type":"object","required":["aggregation","partial_first_day"],"title":"DailyNotes"},"DatasetFreshness":{"properties":{"dataset":{"type":"string","title":"Dataset"},"run":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Run","description":"Newest stored run."},"age_minutes":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Age Minutes"},"expected_every_minutes":{"type":"integer","title":"Expected Every Minutes"},"state":{"type":"string","enum":["ok","late","stale","missing","off_season"],"title":"State","description":"`ok`: newest run within one interval plus slack (at least 60 min); `late`: within three intervals; `stale`: older; `missing`: no run stored; `off_season`: DWD publishes nothing for this dataset right now (seasonal products such as the pollen grid), so an old run is expected. Clients must accept unknown values.","x-extensible-enum":true},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error"}},"additionalProperties":true,"type":"object","required":["dataset","run","age_minutes","expected_every_minutes","state","last_error"],"title":"DatasetFreshness"},"ElevationSource":{"type":"string","enum":["request","station","icon-d2-hsurf"],"title":"ElevationSource","description":"Where `elevation_m` comes from: the `elevation` request parameter, the pinned station's\nheight, or the ICON-D2 model terrain of the cell (not a DEM)."},"Environment":{"properties":{"fire_danger":{"oneOf":[{"$ref":"#/components/schemas/FireDanger"},{"$ref":"#/components/schemas/SubBlockUnavailable"}],"title":"Fire Danger","discriminator":{"propertyName":"available","mapping":{"false":"#/components/schemas/SubBlockUnavailable","true":"#/components/schemas/FireDanger"}}},"soil":{"oneOf":[{"$ref":"#/components/schemas/Soil"},{"$ref":"#/components/schemas/SubBlockUnavailable"}],"title":"Soil","discriminator":{"propertyName":"available","mapping":{"false":"#/components/schemas/SubBlockUnavailable","true":"#/components/schemas/Soil"}}},"phenology":{"oneOf":[{"$ref":"#/components/schemas/Phenology"},{"$ref":"#/components/schemas/SubBlockUnavailable"}],"title":"Phenology","discriminator":{"propertyName":"available","mapping":{"false":"#/components/schemas/SubBlockUnavailable","true":"#/components/schemas/Phenology"}}}},"additionalProperties":true,"type":"object","required":["fire_danger","soil","phenology"],"title":"Environment"},"FireDanger":{"properties":{"available":{"type":"boolean","const":true,"title":"Available","description":"True: the sub-block has content (see SubBlockUnavailable for false)."},"station":{"$ref":"#/components/schemas/ResolvedStation"},"dates":{"items":{"type":"string","format":"date"},"type":"array","title":"Dates","description":"Local days, today first."},"forest":{"items":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"array","title":"Forest","description":"Waldbrandgefahrenindex 1 … 5."},"grassland":{"items":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"array","title":"Grassland","description":"Graslandfeuerindex 1 … 5."},"scale":{"type":"string","const":"1-5","title":"Scale"},"issued":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Issued","description":"Issue time."},"attribution":{"type":"string","title":"Attribution"}},"additionalProperties":true,"type":"object","required":["available","station","dates","forest","grassland","scale","issued","attribution"],"title":"FireDanger","description":"DWD forest fire danger index and grassland fire index of the best station within 50 km."},"ForecastSourceBuild":{"properties":{"variant":{"type":"string","title":"Variant","description":"Product variant, e.g. `stable`."},"builder":{"type":"string","title":"Builder","description":"Builder name and version, e.g. `blend@1.0.0`."},"build_id":{"type":"string","title":"Build Id","description":"Id of the point-product build."}},"additionalProperties":true,"type":"object","required":["variant","builder","build_id"],"title":"ForecastSourceBuild"},"ForecastSourceDataset":{"properties":{"dataset":{"type":"string","title":"Dataset","description":"Input dataset, e.g. `MOSMIX_L`, `ICON-D2`, `ICON-D2-RUC`."},"run":{"type":"string","format":"date-time","title":"Run","description":"Model run / issue time of the input."},"station":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Station","description":"MOSMIX station id used for this cell (MOSMIX only)."},"distance_km":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distance Km","description":"Distance from the cell to the MOSMIX station (km, MOSMIX only)."},"until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Until","description":"Last valid time this input covers in the blend (ICON-D2 / RUC only)."}},"additionalProperties":true,"type":"object","required":["dataset","run"],"title":"ForecastSourceDataset"},"ForecastSourceNowcast":{"properties":{"nowcast":{"$ref":"#/components/schemas/NowcastApplied","description":"Adjustments of the first hours from radar and observations."}},"additionalProperties":true,"type":"object","required":["nowcast"],"title":"ForecastSourceNowcast"},"ForecastSourceObservation":{"properties":{"station":{"type":"string","pattern":"^\\d{5}$","title":"Station","description":"DWD id of the station."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Station name."},"distance_km":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distance Km","description":"Distance from the location (km; null for a pinned station off the list)."},"height_diff_m":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height Diff M","description":"Station height minus location height (m)."},"kind":{"type":"string","const":"observation","title":"Kind"},"dataset":{"type":"string","const":"obs-hourly","title":"Dataset","description":"Rolling hourly aggregates of DWD 10-minute/SYNOP observations."},"pinned":{"type":"boolean","title":"Pinned","description":"True when the station was pinned with `station=`."},"hours":{"type":"integer","title":"Hours","description":"Number of past hours with `kind` = observation."},"fields":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/ObservationStationRef"},"type":"object"},{"type":"null"}],"title":"Fields","description":"Fields (hourly names) taken from another station in some hours, with the first such station."},"model_fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Model Fields","description":"Fields no station measured in some observed hours; there they keep the forecast issued for the hour."}},"additionalProperties":true,"type":"object","required":["station","name","distance_km","height_diff_m","kind","dataset","pinned","hours"],"title":"ForecastSourceObservation","description":"Past hours (`past_hours`) filled with measurements: the main station (the one `current`\nuses), stations that filled fields it lacks, and fields that stayed product values."},"FreshnessResponse":{"properties":{"datasets":{"items":{"$ref":"#/components/schemas/DatasetFreshness"},"type":"array","title":"Datasets"},"meta":{"$ref":"#/components/schemas/Meta"}},"additionalProperties":true,"type":"object","required":["datasets","meta"],"title":"FreshnessResponse"},"GeoPolygon":{"properties":{"type":{"type":"string","const":"Polygon","title":"Type"},"coordinates":{"items":{"items":{"type":"number"},"type":"array"},"type":"array","title":"Coordinates","description":"Crop corners NW, SW, SE, NE as [lon, lat] (flat ring, like Bright Sky)."}},"additionalProperties":true,"type":"object","required":["type","coordinates"],"title":"GeoPolygon"},"Health":{"properties":{"pollen":{"oneOf":[{"$ref":"#/components/schemas/Pollen"},{"$ref":"#/components/schemas/SubBlockUnavailable"}],"title":"Pollen","discriminator":{"propertyName":"available","mapping":{"false":"#/components/schemas/SubBlockUnavailable","true":"#/components/schemas/Pollen"}}},"uv_index":{"oneOf":[{"$ref":"#/components/schemas/UvIndex"},{"$ref":"#/components/schemas/SubBlockUnavailable"}],"title":"Uv Index","discriminator":{"propertyName":"available","mapping":{"false":"#/components/schemas/SubBlockUnavailable","true":"#/components/schemas/UvIndex"}}},"biowetter":{"oneOf":[{"$ref":"#/components/schemas/Biowetter"},{"$ref":"#/components/schemas/SubBlockUnavailable"}],"title":"Biowetter","discriminator":{"propertyName":"available","mapping":{"false":"#/components/schemas/SubBlockUnavailable","true":"#/components/schemas/Biowetter"}}},"thermal_hazard":{"oneOf":[{"$ref":"#/components/schemas/ThermalHazard"},{"$ref":"#/components/schemas/SubBlockUnavailable"}],"title":"Thermal Hazard","discriminator":{"propertyName":"available","mapping":{"false":"#/components/schemas/SubBlockUnavailable","true":"#/components/schemas/ThermalHazard"}}},"heat_trend":{"oneOf":[{"$ref":"#/components/schemas/HeatTrend"},{"$ref":"#/components/schemas/SubBlockUnavailable"}],"title":"Heat Trend","discriminator":{"propertyName":"available","mapping":{"false":"#/components/schemas/SubBlockUnavailable","true":"#/components/schemas/HeatTrend"}}},"pollen_concentration":{"oneOf":[{"$ref":"#/components/schemas/PollenConcentration"},{"$ref":"#/components/schemas/SubBlockUnavailable"}],"title":"Pollen Concentration","discriminator":{"propertyName":"available","mapping":{"false":"#/components/schemas/SubBlockUnavailable","true":"#/components/schemas/PollenConcentration"}}}},"additionalProperties":true,"type":"object","required":["pollen","uv_index","biowetter","thermal_hazard","heat_trend","pollen_concentration"],"title":"Health"},"HealthLocation":{"properties":{"lat":{"type":"number","title":"Lat","description":"Latitude, WGS84."},"lon":{"type":"number","title":"Lon","description":"Longitude, WGS84."},"tz":{"type":"string","title":"Tz","description":"IANA time zone of all times in the response."}},"additionalProperties":true,"type":"object","required":["lat","lon","tz"],"title":"HealthLocation"},"HealthResponse":{"properties":{"pollen":{"oneOf":[{"$ref":"#/components/schemas/Pollen"},{"$ref":"#/components/schemas/SubBlockUnavailable"}],"title":"Pollen","discriminator":{"propertyName":"available","mapping":{"false":"#/components/schemas/SubBlockUnavailable","true":"#/components/schemas/Pollen"}}},"uv_index":{"oneOf":[{"$ref":"#/components/schemas/UvIndex"},{"$ref":"#/components/schemas/SubBlockUnavailable"}],"title":"Uv Index","discriminator":{"propertyName":"available","mapping":{"false":"#/components/schemas/SubBlockUnavailable","true":"#/components/schemas/UvIndex"}}},"biowetter":{"oneOf":[{"$ref":"#/components/schemas/Biowetter"},{"$ref":"#/components/schemas/SubBlockUnavailable"}],"title":"Biowetter","discriminator":{"propertyName":"available","mapping":{"false":"#/components/schemas/SubBlockUnavailable","true":"#/components/schemas/Biowetter"}}},"thermal_hazard":{"oneOf":[{"$ref":"#/components/schemas/ThermalHazard"},{"$ref":"#/components/schemas/SubBlockUnavailable"}],"title":"Thermal Hazard","discriminator":{"propertyName":"available","mapping":{"false":"#/components/schemas/SubBlockUnavailable","true":"#/components/schemas/ThermalHazard"}}},"heat_trend":{"oneOf":[{"$ref":"#/components/schemas/HeatTrend"},{"$ref":"#/components/schemas/SubBlockUnavailable"}],"title":"Heat Trend","discriminator":{"propertyName":"available","mapping":{"false":"#/components/schemas/SubBlockUnavailable","true":"#/components/schemas/HeatTrend"}}},"pollen_concentration":{"oneOf":[{"$ref":"#/components/schemas/PollenConcentration"},{"$ref":"#/components/schemas/SubBlockUnavailable"}],"title":"Pollen Concentration","discriminator":{"propertyName":"available","mapping":{"false":"#/components/schemas/SubBlockUnavailable","true":"#/components/schemas/PollenConcentration"}}},"location":{"$ref":"#/components/schemas/HealthLocation"},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"meta":{"$ref":"#/components/schemas/Meta"}},"additionalProperties":true,"type":"object","required":["pollen","uv_index","biowetter","thermal_hazard","heat_trend","pollen_concentration","location","attribution","meta"],"title":"HealthResponse"},"HeatTrend":{"properties":{"available":{"type":"boolean","const":true,"title":"Available","description":"True: the sub-block has content (see SubBlockUnavailable for false)."},"district":{"$ref":"#/components/schemas/HeatTrendDistrict"},"days":{"items":{"$ref":"#/components/schemas/HeatTrendDay"},"type":"array","title":"Days"},"issued":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Issued","description":"Issue time."},"attribution":{"type":"string","title":"Attribution"}},"additionalProperties":true,"type":"object","required":["available","district","days","issued","attribution"],"title":"HeatTrend","description":"DWD 8-day heat warning outlook (hwtrend) of the point's warn district."},"HeatTrendDay":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"level":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Level","description":"hwtrend code 0 … 7 (1–2 heat warnings, 3–7 heat trend)."},"kind":{"anyOf":[{"type":"string","enum":["none","warning","trend"]},{"type":"null"}],"title":"Kind"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","description":"Meaning of the code in `lang`."}},"additionalProperties":true,"type":"object","required":["date","level","kind","label"],"title":"HeatTrendDay"},"HeatTrendDistrict":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"DWD three-letter Warnkreis code."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"warn_cell_id":{"type":"string","title":"Warn Cell Id","description":"District warn cell id (9 digits, string)."}},"additionalProperties":true,"type":"object","required":["id","warn_cell_id"],"title":"HeatTrendDistrict"},"HistoryDaily":{"properties":{"units":{"additionalProperties":{"type":"string"},"type":"object","title":"Units"},"date":{"items":{"type":"string","format":"date"},"type":"array","title":"Date"},"temperature_min":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Temperature Min","description":"°C / °F."},"temperature_max":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Temperature Max","description":"°C / °F."},"temperature_mean":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Temperature Mean","description":"°C / °F."},"precipitation_sum":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Precipitation Sum","description":"mm / in."},"sunshine_duration":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Sunshine Duration","description":"h."},"wind_gust_max":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Wind Gust Max","description":"km/h / mph."},"wind_speed_mean":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Wind Speed Mean","description":"km/h / mph."},"relative_humidity_mean":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Relative Humidity Mean","description":"%."},"cloud_cover_mean":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Cloud Cover Mean","description":"%."},"snow_depth":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Snow Depth","description":"cm / in."},"ground_frost":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Ground Frost","description":"Minimum 5 cm above ground, °C / °F."},"source":{"$ref":"#/components/schemas/HistorySource"},"notes":{"additionalProperties":{"type":"string"},"type":"object","title":"Notes"}},"additionalProperties":true,"type":"object","required":["units","date","temperature_min","temperature_max","temperature_mean","precipitation_sum","sunshine_duration","wind_gust_max","wind_speed_mean","relative_humidity_mean","cloud_cover_mean","snow_depth","ground_frost","source","notes"],"title":"HistoryDaily","description":"Measured daily values (DWD climate day, see `notes`)."},"HistoryHourly":{"properties":{"units":{"additionalProperties":{"type":"string"},"type":"object","title":"Units"},"time":{"items":{"type":"string","format":"date-time"},"type":"array","title":"Time","description":"Start of each hour (in `tz`)."},"temperature":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Temperature","description":"At time (°C / °F)."},"relative_humidity":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Relative Humidity","description":"At time (%)."},"precipitation":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Precipitation","description":"Sum over time … time + 1 h (mm / in)."},"wind_speed":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Wind Speed","description":"Mean over time − 1 h … time (km/h / mph)."},"wind_direction":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Wind Direction","description":"Mean over time − 1 h … time (°)."},"wind_gust":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Wind Gust","description":"Maximum over time … time + 1 h (km/h / mph)."},"sunshine_duration":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Sunshine Duration","description":"Sum over time … time + 1 h (min)."},"cloud_cover":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Cloud Cover","description":"At time (%)."},"pressure_msl":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Pressure Msl","description":"At time (hPa / inHg)."},"source":{"$ref":"#/components/schemas/HistorySource"},"notes":{"additionalProperties":{"type":"string"},"type":"object","title":"Notes","description":"Interval each field covers, by field name."}},"additionalProperties":true,"type":"object","required":["units","time","temperature","relative_humidity","precipitation","wind_speed","wind_direction","wind_gust","sunshine_duration","cloud_cover","pressure_msl","source","notes"],"title":"HistoryHourly","description":"Measured hourly values. `time[i]` is the start of the hour: precipitation, wind_gust and\nsunshine_duration cover `time[i]` … +1 h; temperature, humidity, cloud cover and pressure are\nat `time[i]`; wind speed and direction are DWD's mean of the hour ending at `time[i]`. `notes`\nstates the interval of every field."},"HistoryLocation":{"properties":{"lat":{"type":"number","title":"Lat","description":"Latitude (of the station when only `station` was given)."},"lon":{"type":"number","title":"Lon"},"tz":{"type":"string","title":"Tz"},"elevation_m":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Elevation M","description":"Elevation used for the station choice (m): model terrain, or the station's height."},"elevation_source":{"anyOf":[{"$ref":"#/components/schemas/ElevationSource"},{"type":"null"}],"description":"Source of `elevation_m`."},"station":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Station","description":"Requested station id, else null."}},"additionalProperties":true,"type":"object","required":["lat","lon","tz","elevation_m","elevation_source","station"],"title":"HistoryLocation"},"HistoryRecent":{"properties":{"dataset":{"type":"string","const":"obs-hourly","title":"Dataset"},"station":{"type":"string","pattern":"^\\d{5}$","title":"Station","description":"DWD id of the (first) station used."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}],"title":"From","description":"First filled hour (date-time in `tz`) or day (date)."},"to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}],"title":"To","description":"Last filled hour or day."}},"additionalProperties":true,"type":"object","required":["dataset","station","name","from","to"],"title":"HistoryRecent","description":"Hours (days) after the last CDC value, filled from the rolling hourly observation store\n(DWD's CDC \"recent\" files lag about a day)."},"HistoryResponse":{"properties":{"location":{"$ref":"#/components/schemas/HistoryLocation"},"resolution":{"type":"string","enum":["hourly","daily"],"title":"Resolution"},"start":{"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}],"title":"Start","description":"Start of the range: hourly a date-time in `tz`, daily a date (UTC climate day)."},"end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}],"title":"End","description":"End of the range: hourly exclusive date-time in `tz`, daily the last date included."},"hourly":{"anyOf":[{"$ref":"#/components/schemas/HistoryHourly"},{"type":"null"}],"description":"Present for `resolution=hourly`."},"daily":{"anyOf":[{"$ref":"#/components/schemas/HistoryDaily"},{"type":"null"}],"description":"Present for `resolution=daily`."},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"meta":{"$ref":"#/components/schemas/Meta"}},"additionalProperties":true,"type":"object","required":["location","resolution","start","end","attribution","meta"],"title":"HistoryResponse"},"HistorySource":{"properties":{"kind":{"type":"string","const":"station","title":"Kind"},"dataset":{"type":"string","title":"Dataset","description":"CDC directory, e.g. `CDC observations_germany/climate/hourly`."},"station":{"$ref":"#/components/schemas/HistoryStation","description":"Main station."},"fields":{"additionalProperties":{"$ref":"#/components/schemas/HistoryStation"},"type":"object","title":"Fields","description":"Fields filled from other stations, by field name."},"missing":{"items":{"type":"string"},"type":"array","title":"Missing","description":"Fields without any measurement in the range."},"recent":{"anyOf":[{"$ref":"#/components/schemas/HistoryRecent"},{"type":"null"}],"description":"Present when recent hours/days come from obs-hourly (see `notes.recent`)."}},"additionalProperties":true,"type":"object","required":["kind","dataset","station","fields","missing"],"title":"HistorySource"},"HistoryStation":{"properties":{"id":{"type":"string","pattern":"^\\d{5}$","title":"Id","description":"DWD station id, 5 digits."},"name":{"type":"string","title":"Name"},"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"elevation_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Elevation M"},"distance_km":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distance Km"},"height_diff_m":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height Diff M"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score","description":"Station score (lower is better)."}},"additionalProperties":true,"type":"object","required":["id","name","lat","lon","elevation_m","distance_km","height_diff_m","score"],"title":"HistoryStation"},"HourKind":{"type":"string","enum":["observation","forecast"],"title":"HourKind","description":"What an hour of `hourly` holds: measured values (past hours) or the forecast."},"Hourly":{"properties":{"generated":{"type":"string","format":"date-time","title":"Generated","description":"When the point product was built."},"valid_until":{"type":"string","format":"date-time","title":"Valid Until","description":"When the next build is expected."},"units":{"additionalProperties":{"type":"string"},"type":"object","title":"Units","description":"Unit of each series."},"time":{"items":{"type":"string","format":"date-time"},"type":"array","title":"Time","description":"Start of each hour (in `tz`)."},"kind":{"items":{"$ref":"#/components/schemas/HourKind"},"type":"array","title":"Kind","description":"`observation` or `forecast` per hour (past hours only can be observations)."},"temperature":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Temperature","description":"Air temperature 2 m at time (°C / °F)."},"apparent_temperature":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Apparent Temperature","description":"Perceived temperature at time (°C / °F)."},"dew_point":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Dew Point","description":"Dew point 2 m at time (°C / °F)."},"relative_humidity":{"items":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"array","title":"Relative Humidity","description":"Relative humidity at time (%)."},"pressure_msl":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Pressure Msl","description":"Pressure at mean sea level at time (hPa / inHg)."},"wind_speed":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Wind Speed","description":"Wind speed 10 m at time (km/h / mph)."},"wind_direction":{"items":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"array","title":"Wind Direction","description":"Wind direction at time, degrees from which the wind blows (°)."},"wind_gust":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Wind Gust","description":"Maximum gust within the hour (km/h / mph)."},"precipitation":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Precipitation","description":"Precipitation sum of the hour (mm / in)."},"precipitation_probability":{"items":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"array","title":"Precipitation Probability","description":"Probability of > 0.1 mm within the hour (%)."},"precipitation_probability_1mm":{"items":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"array","title":"Precipitation Probability 1Mm","description":"Probability of > 1 mm within the hour (%)."},"precipitation_probability_5mm":{"items":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"array","title":"Precipitation Probability 5Mm","description":"Probability of > 5 mm within the hour (%)."},"snow_probability":{"items":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"array","title":"Snow Probability","description":"Probability that precipitation falls as snow (%)."},"freezing_rain_probability":{"items":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"array","title":"Freezing Rain Probability","description":"Probability of freezing rain (%)."},"drizzle_probability":{"items":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"array","title":"Drizzle Probability","description":"Probability of drizzle (%)."},"rain_probability":{"items":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"array","title":"Rain Probability","description":"Probability of liquid precipitation (%)."},"thunderstorm_probability":{"items":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"array","title":"Thunderstorm Probability","description":"Probability of a thunderstorm within the hour (%)."},"fog_probability":{"items":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"array","title":"Fog Probability","description":"Probability of fog (%)."},"cloud_cover":{"items":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"array","title":"Cloud Cover","description":"Effective total cloud cover at time (%)."},"cloud_low":{"items":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"array","title":"Cloud Low","description":"Low cloud cover (%)."},"cloud_mid":{"items":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"array","title":"Cloud Mid","description":"Mid-level cloud cover (%)."},"cloud_high":{"items":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"array","title":"Cloud High","description":"High cloud cover (%)."},"visibility":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Visibility","description":"Visibility at time (m, integer / mi)."},"sunshine_duration":{"items":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"array","title":"Sunshine Duration","description":"Sunshine within the hour (min)."},"solar_radiation":{"items":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"array","title":"Solar Radiation","description":"Mean global radiation over the hour (W/m²)."},"snow_depth":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Snow Depth","description":"Snow depth at time (cm / in; ICON-D2 H_SNOW)."},"freezing_level":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Freezing Level","description":"Height of the 0 °C level above sea level at time (m / ft; ICON-D2 HZEROCL)."},"cape":{"items":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"array","title":"Cape","description":"Convective available potential energy, mixed layer (J/kg; ICON-D2 CAPE_ML)."},"lightning_potential":{"items":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"array","title":"Lightning Potential","description":"Lightning potential index (J/kg; ICON-D2 LPI)."},"condition":{"items":{"anyOf":[{"$ref":"#/components/schemas/ConditionCode"},{"type":"null"}]},"type":"array","title":"Condition","description":"Condition of the hour."},"precipitation_intensity":{"items":{"anyOf":[{"$ref":"#/components/schemas/PrecipitationIntensity"},{"type":"null"}]},"type":"array","title":"Precipitation Intensity","description":"Intensity class of the hour's precipitation sum (mm in the hour = mm/h; metric, 1 decimal as shown); null where `precipitation` is null."},"precipitation_kind":{"items":{"anyOf":[{"$ref":"#/components/schemas/PrecipitationKind"},{"type":"null"}]},"type":"array","title":"Precipitation Kind","description":"`rain` or `snow` per hour from the hour's condition (ww, MOSMIX type probabilities or temperature; observed hours: the station's present weather); null when the condition is not precipitation or the intensity is `none` (the rain column applies then)."},"is_day":{"items":{"type":"boolean"},"type":"array","title":"Is Day","description":"Sun above the horizon at time."},"source":{"items":{"anyOf":[{"$ref":"#/components/schemas/ForecastSourceDataset"},{"$ref":"#/components/schemas/ForecastSourceBuild"},{"$ref":"#/components/schemas/ForecastSourceObservation"},{"$ref":"#/components/schemas/ForecastSourceNowcast"}]},"type":"array","title":"Source","description":"Inputs of the build (one item per dataset), then the build itself, then applied nowcast adjustments."}},"additionalProperties":true,"type":"object","required":["generated","valid_until","units","time","kind","temperature","apparent_temperature","dew_point","relative_humidity","pressure_msl","wind_speed","wind_direction","wind_gust","precipitation","precipitation_probability","precipitation_probability_1mm","precipitation_probability_5mm","snow_probability","freezing_rain_probability","drizzle_probability","rain_probability","thunderstorm_probability","fog_probability","cloud_cover","cloud_low","cloud_mid","cloud_high","visibility","sunshine_duration","solar_radiation","snow_depth","freezing_level","cape","lightning_potential","condition","precipitation_intensity","precipitation_kind","is_day","source"],"title":"Hourly","description":"Hourly forecast. `time[i]` is the START of the hour: instant values (temperature, wind,\nclouds, …) are valid at `time[i]`; sums, maxima and probabilities (precipitation, gusts,\nsunshine, radiation, *_probability) cover `time[i]` … `time[i]` + 1 h. All arrays have the\nlength of `time`. With `past_hours`, the first hours lie before the current hour; `kind[i]`\nsays whether hour i holds measurements (`observation`: probabilities and model-only fields\nnull, nothing height-corrected) or the forecast issued for it (`forecast`)."},"LatLon":{"properties":{"lat":{"type":"number","title":"Lat","description":"Latitude, WGS84."},"lon":{"type":"number","title":"Lon","description":"Longitude, WGS84."}},"additionalProperties":true,"type":"object","required":["lat","lon"],"title":"LatLon"},"Localized":{"properties":{"id":{"type":"integer","title":"Id"},"de":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"De"},"en":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"En"},"latin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latin"}},"additionalProperties":true,"type":"object","required":["id"],"title":"Localized"},"Mesocyclone":{"properties":{"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"t":{"type":"string","format":"date-time","title":"T"},"strength":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Strength","description":"DWD meso_intensity."},"top_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Top M","description":"Mesocyclone top (m)."}},"additionalProperties":true,"type":"object","required":["lat","lon","t","strength","top_m"],"title":"Mesocyclone"},"Meta":{"properties":{"api_version":{"type":"string","title":"Api Version","description":"Version of nano-backend that answered."},"variant":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variant","description":"Product variant that answered (/v1/weather only; `stable` unless requested)."},"model":{"anyOf":[{"$ref":"#/components/schemas/ModelRef"},{"type":"null"}],"description":"Model profile and version behind `variant` (/v1/weather only)."},"generated":{"type":"string","format":"date-time","title":"Generated","description":"When the response was built (in `tz`)."}},"additionalProperties":true,"type":"object","required":["api_version","generated"],"title":"Meta","description":"Present on every /v1 JSON response."},"Minutely":{"properties":{"interval":{"type":"string","const":"PT5M","title":"Interval","description":"Spacing of `precipitation_rate` (ISO 8601 duration)."},"units":{"additionalProperties":{"type":"string"},"type":"object","title":"Units","description":"`{\"precipitation_rate\": \"mm/h\"}` (`in/h` with `units=imperial`)."},"start":{"type":"string","format":"date-time","title":"Start","description":"Time of `precipitation_rate[0]`. Value i covers the 5 minutes ending at start + i × 5 min."},"issued_at":{"type":"string","format":"date-time","title":"Issued At","description":"Issue time of the RV run (= `source.issued`); `start` equals it."},"precipitation_rate":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Precipitation Rate","description":"Precipitation rate (mm/h / in/h), 25 values: 0, 5, …, 120 min of lead. Step 0 is the RV analysis; RV to 60 min, then faded linearly into ICON-D2-RUC (see `precipitation_source`)."},"precipitation_intensity":{"items":{"anyOf":[{"$ref":"#/components/schemas/PrecipitationIntensity"},{"type":"null"}]},"type":"array","title":"Precipitation Intensity","description":"Intensity class per step (same length as `precipitation_rate`), on the 10-minute mean of this step and the one before (`pairing`; step 0, the analysis, alone), metric; null where this rate or the one before is null (no radar data). Rain column (RV has no phase)."},"precipitation_source":{"items":{"type":"string","enum":["rv","blend","model"],"x-extensible-enum":true},"type":"array","title":"Precipitation Source","description":"Source per step: `rv` (lead ≤ 60 min, or no model value), `blend` ((1 − w)·RV + w·model, w = (lead − 60)/60), `model` (lead 120 min). Clients must accept unknown values."},"complete":{"type":"boolean","title":"Complete","description":"True when every RV step 0–12 (0–60 min) has radar data. When false (outside the composite, a composite gap or radar outage at the pixel) `rain_start`, `rain_end`, `peak_intensity`, `starts_at`, `ends_at` and `summary` are null: a gap is unknown, never dry."},"precipitation_kind":{"anyOf":[{"items":{"anyOf":[{"$ref":"#/components/schemas/PrecipitationKind"},{"type":"null"}]},"type":"array"},{"type":"null"}],"title":"Precipitation Kind","description":"Reserved: per step `rain`/`snow` from a radar hydrometeor product. Absent until one is ingested."},"rain_start":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Rain Start","description":"Start of the first sustained rain (`rule`: 10-minute mean ≥ 0.3 mm/h for ≥ 3 steps, RV only) beginning within 60 min of the issue; the issue time when it is raining now; null otherwise or when not `complete`."},"rain_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Rain End","description":"Start of the first dry spell of ≥ 20 min after `rain_start`, when it begins within 60 min of the issue; null when there is no rain or the end lies beyond the RV horizon."},"peak_intensity":{"anyOf":[{"$ref":"#/components/schemas/PrecipitationIntensity"},{"type":"null"}],"description":"Highest class of `precipitation_intensity` within 0–60 min (steps 0–12, RV); null when not `complete` (e.g. outside radar coverage)."},"starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts At","description":"`rain_start` unless it is raining now (then null)."},"ends_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ends At","description":"= `rain_end`."},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary","description":"One sentence in `lang` from the same rule, e.g. “Leichter Regen in etwa 20 Minuten”."},"rule":{"type":"string","const":"onset-v1","title":"Rule","description":"The rule behind `rain_start`/`rain_end`/`starts_at`/`ends_at`/`summary` (docs/api-v1.md). A new value means the rule changed."},"pairing":{"type":"string","const":"backward-10min","title":"Pairing","description":"How 5-minute steps pair into the 10-minute means of `precipitation_intensity` and the rule: step k = mean of steps k − 1 and k, step 0 alone."},"source":{"$ref":"#/components/schemas/MinutelySource"}},"additionalProperties":true,"type":"object","required":["interval","units","start","issued_at","precipitation_rate","precipitation_intensity","precipitation_source","complete","rain_start","rain_end","peak_intensity","starts_at","ends_at","summary","rule","pairing","source"],"title":"Minutely"},"MinutelyModelSource":{"properties":{"dataset":{"type":"string","const":"ICON-D2-RUC","title":"Dataset","description":"Model of the 60–120 min fade."},"run":{"type":"string","format":"date-time","title":"Run","description":"Model run used (the newest stored at the RV issue time)."},"resolution":{"type":"string","const":"PT1H","title":"Resolution","description":"Time resolution of the model amounts: hourly (a step's model rate is its hour's amount)."}},"additionalProperties":true,"type":"object","required":["dataset","run","resolution"],"title":"MinutelyModelSource"},"MinutelySource":{"properties":{"dataset":{"type":"string","const":"RV","title":"Dataset","description":"DWD RV radar composite and nowcast."},"issued":{"type":"string","format":"date-time","title":"Issued","description":"Issue time of the RV run."},"stale":{"type":"boolean","title":"Stale","description":"True when the newest RV run is older than 20 minutes."},"model":{"anyOf":[{"$ref":"#/components/schemas/MinutelyModelSource"},{"type":"null"}],"description":"The model faded in over 60–120 min of lead; null when no step uses it (no run, outside the grid)."}},"additionalProperties":true,"type":"object","required":["dataset","issued","stale","model"],"title":"MinutelySource"},"ModelBuild":{"properties":{"build_id":{"type":"string","title":"Build Id","description":"Id of the served build."},"built_at":{"type":"string","format":"date-time","title":"Built At","description":"When it was built."},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version","description":"Profile version that built it (null: built before the model platform)."},"inputs":{"additionalProperties":{"type":"string","format":"date-time"},"type":"object","title":"Inputs","description":"Input dataset → run time."}},"additionalProperties":true,"type":"object","required":["build_id","built_at","version","inputs"],"title":"ModelBuild"},"ModelPostStep":{"properties":{"name":{"type":"string","enum":["carry_over","radar_blend","temperature_nudge","cloud_nudge","condition_classifier"],"title":"Name","description":"Post-processor. New post-processors are a normal model-platform change. Clients must accept unknown values.","x-extensible-enum":true},"stage":{"type":"string","enum":["build","request"],"title":"Stage","description":"`build`: applied when the product is built; `request`: per request (the nowcast layer of `hourly`). Clients must accept unknown values.","x-extensible-enum":true},"version":{"type":"string","title":"Version","description":"Code version of the step."},"params":{"additionalProperties":true,"type":"object","title":"Params","description":"Effective parameters (defaults filled in)."}},"additionalProperties":true,"type":"object","required":["name","stage","version","params"],"title":"ModelPostStep"},"ModelProfile":{"properties":{"name":{"type":"string","title":"Name","description":"Profile name; pass it as `variant=` (or one of its `aliases`)."},"status":{"type":"string","enum":["experimental","challenger","champion","retired"],"title":"Status","description":"`champion`: the profile `stable` points to; `challenger`: candidate to replace it, built and verified alongside; `experimental`: built and verified, no promotion intended yet; `retired`: no longer built. Clients must accept unknown values.","x-extensible-enum":true},"version":{"type":"string","title":"Version","description":"`{name}@{hash}` over model, model version, inputs, parameters and post-processors."},"model":{"type":"string","title":"Model","description":"Model implementation, e.g. `MosmixD2Blend`, `MosmixIdw`."},"model_version":{"type":"string","title":"Model Version","description":"Code version of the model."},"description":{"type":"string","title":"Description"},"aliases":{"items":{"type":"string"},"type":"array","title":"Aliases","description":"Aliases pointing to this profile (`stable`, `candidate`, `experimental`)."},"served":{"type":"boolean","title":"Served","description":"Built and servable on this server."},"default":{"type":"boolean","title":"Default","description":"Served when no `variant` is given."},"inputs":{"items":{"type":"string"},"type":"array","title":"Inputs","description":"DWD datasets the model uses (names as in /v1/meta/freshness)."},"params":{"additionalProperties":true,"type":"object","title":"Params","description":"Effective model parameters (defaults filled in)."},"post":{"items":{"$ref":"#/components/schemas/ModelPostStep"},"type":"array","title":"Post","description":"Post-processors in the order they are applied."},"build":{"anyOf":[{"$ref":"#/components/schemas/ModelBuild"},{"type":"null"}],"description":"The served build (null when none or not served)."}},"additionalProperties":true,"type":"object","required":["name","status","version","model","model_version","description","aliases","served","default","inputs","params","post","build"],"title":"ModelProfile"},"ModelRef":{"properties":{"profile":{"type":"string","title":"Profile","description":"Model profile that made the forecast values (see /v1/meta/models), e.g. `blend`."},"version":{"type":"string","title":"Version","description":"Profile version `{profile}@{hash}` of the served build: changes whenever the model, its parameters, inputs or post-processors change."}},"additionalProperties":true,"type":"object","required":["profile","version"],"title":"ModelRef"},"ModelsResponse":{"properties":{"default_variant":{"type":"string","title":"Default Variant","description":"Variant served without `variant=`."},"aliases":{"additionalProperties":{"type":"string"},"type":"object","title":"Aliases","description":"Alias → profile name."},"profiles":{"items":{"$ref":"#/components/schemas/ModelProfile"},"type":"array","title":"Profiles","description":"Served profiles first (the default first), then the rest."},"meta":{"$ref":"#/components/schemas/Meta"}},"additionalProperties":true,"type":"object","required":["default_variant","aliases","profiles","meta"],"title":"ModelsResponse"},"NamedRef":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Id","description":"Id of the region, zone, district or city."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Name."}},"additionalProperties":true,"type":"object","required":["id"],"title":"NamedRef"},"NowcastApplied":{"properties":{"radar_hours":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Radar Hours","description":"Indexes of the hours whose precipitation was set from the RV nowcast."},"radar_issued":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Radar Issued","description":"Issue time of the RV nowcast used."},"temperature_nudge":{"anyOf":[{"$ref":"#/components/schemas/TemperatureNudge"},{"type":"null"}],"description":"Temperature correction from the current observation, decaying over the first 6 hours."}},"additionalProperties":true,"type":"object","title":"NowcastApplied"},"ObservationStationRef":{"properties":{"station":{"type":"string","pattern":"^\\d{5}$","title":"Station","description":"DWD id of the station."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Station name."},"distance_km":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distance Km","description":"Distance from the location (km; null for a pinned station off the list)."},"height_diff_m":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height Diff M","description":"Station height minus location height (m)."}},"additionalProperties":true,"type":"object","required":["station","name","distance_km","height_diff_m"],"title":"ObservationStationRef"},"ParameterError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Loc","description":"Where: the parameter's location and name, e.g. `[\"query\", \"lat\"]`."},"msg":{"type":"string","title":"Msg","description":"What is wrong, in English."},"type":{"type":"string","title":"Type","description":"Machine-readable error kind (e.g. `missing`, `less_than_equal`, `float_parsing`)."}},"additionalProperties":true,"type":"object","required":["loc","msg"],"title":"ParameterError","description":"One invalid parameter of an `invalid-parameters` problem."},"Phenology":{"properties":{"available":{"type":"boolean","const":true,"title":"Available","description":"True: the sub-block has content (see SubBlockUnavailable for false)."},"since":{"type":"string","format":"date","title":"Since"},"max_km":{"type":"number","title":"Max Km"},"reporting_stations":{"type":"integer","title":"Reporting Stations"},"reports":{"items":{"$ref":"#/components/schemas/PhenologyReport"},"type":"array","title":"Reports"},"reference_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Reference Date","description":"Date of the DWD file."},"attribution":{"type":"string","title":"Attribution"}},"additionalProperties":true,"type":"object","required":["available","since","max_km","reporting_stations","reports","reference_date","attribution"],"title":"Phenology","description":"Plant phases reported by DWD immediate reporters within 50 km in the last 14 days, newest first."},"PhenologyReport":{"properties":{"date":{"type":"string","format":"date","title":"Date","description":"Date the nearest station observed the phase."},"group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group","description":"Plant group (`wild`, `crop`, `fruit`, …)."},"plant":{"$ref":"#/components/schemas/Localized"},"phase":{"$ref":"#/components/schemas/Localized"},"station":{"$ref":"#/components/schemas/PhenologyStation","description":"Nearest reporting station."},"stations":{"type":"integer","title":"Stations","description":"Number of stations within 50 km that reported this plant and phase."},"last_date":{"type":"string","format":"date","title":"Last Date","description":"Newest report of this plant and phase."}},"additionalProperties":true,"type":"object","required":["date","group","plant","phase","station","stations","last_date"],"title":"PhenologyReport"},"PhenologyStation":{"properties":{"id":{"type":"string","title":"Id","description":"Phenology station id (DWD's own numbering for phenology, not a weather station id)."},"name":{"type":"string","title":"Name"},"distance_km":{"type":"number","title":"Distance Km"}},"additionalProperties":true,"type":"object","required":["id","name","distance_km"],"title":"PhenologyStation"},"Pollen":{"properties":{"available":{"type":"boolean","const":true,"title":"Available","description":"True: the sub-block has content (see SubBlockUnavailable for false)."},"issued":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Issued","description":"Issue time of the DWD product."},"next_update":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Update","description":"Announced next issue."},"sender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender","description":"Issuing DWD department."},"attribution":{"type":"string","title":"Attribution","description":"`Deutscher Wetterdienst`."},"region":{"$ref":"#/components/schemas/PollenRegion"},"days":{"items":{"$ref":"#/components/schemas/PollenDay"},"type":"array","title":"Days","description":"Today (local) and the following days."}},"additionalProperties":true,"type":"object","required":["available","issued","next_update","sender","attribution","region","days"],"title":"Pollen","description":"DWD pollen forecast (s31fg) of the pollen region containing the point."},"PollenConcentration":{"properties":{"available":{"type":"boolean","const":true,"title":"Available","description":"True: the sub-block has content (see SubBlockUnavailable for false)."},"grid_point":{"$ref":"#/components/schemas/LatLon"},"species":{"additionalProperties":{"$ref":"#/components/schemas/PollenConcentrationSeries"},"type":"object","title":"Species"},"model_run":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Model Run","description":"ICON-ART run."},"issued":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Issued","description":"Issue time."},"source":{"type":"string","title":"Source"},"attribution":{"type":"string","title":"Attribution"}},"additionalProperties":true,"type":"object","required":["available","grid_point","species","model_run","issued","source","attribution"],"title":"PollenConcentration","description":"ICON-ART daily mean pollen concentration at the nearest 0.0625° grid point; only the\nspecies DWD publishes in season (keys: hazel, alder, birch, grasses, ragweed)."},"PollenConcentrationSeries":{"properties":{"code":{"type":"string","title":"Code","description":"ICON-ART species code, e.g. `POAC`."},"unit":{"type":"string","const":"grains/m³","title":"Unit"},"statistic":{"type":"string","const":"daily_mean","title":"Statistic"},"dates":{"items":{"type":"string","format":"date"},"type":"array","title":"Dates","description":"UTC days."},"values":{"items":{"type":"number"},"type":"array","title":"Values","description":"Daily mean concentration (grains/m³)."}},"additionalProperties":true,"type":"object","required":["code","unit","statistic","dates","values"],"title":"PollenConcentrationSeries"},"PollenDay":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"species":{"$ref":"#/components/schemas/PollenSpecies"}},"additionalProperties":true,"type":"object","required":["date","species"],"title":"PollenDay"},"PollenLevel":{"properties":{"index":{"type":"string","title":"Index","description":"DWD pollen index: `0`, `0-1`, `1`, `1-2`, `2`, `2-3`, `3`."},"severity":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Severity","description":"The index as a number 0 … 3 (half steps)."},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","description":"Label of the index in `lang`."}},"additionalProperties":true,"type":"object","required":["index","severity","label"],"title":"PollenLevel"},"PollenParentRegion":{"properties":{"id":{"type":"integer","title":"Id","description":"DWD pollen region id."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Region name."}},"additionalProperties":true,"type":"object","required":["id","name"],"title":"PollenParentRegion"},"PollenRegion":{"properties":{"id":{"type":"integer","title":"Id","description":"DWD pollen (part-)region id."},"name":{"type":"string","title":"Name","description":"(Part-)region name."},"parent":{"anyOf":[{"$ref":"#/components/schemas/PollenParentRegion"},{"type":"null"}],"description":"The region this part-region belongs to; absent when it is not a part."}},"additionalProperties":true,"type":"object","required":["id","name"],"title":"PollenRegion"},"PollenSpecies":{"properties":{"alder":{"anyOf":[{"$ref":"#/components/schemas/PollenLevel"},{"type":"null"}],"description":"Erle."},"ash":{"anyOf":[{"$ref":"#/components/schemas/PollenLevel"},{"type":"null"}],"description":"Esche."},"birch":{"anyOf":[{"$ref":"#/components/schemas/PollenLevel"},{"type":"null"}],"description":"Birke."},"grasses":{"anyOf":[{"$ref":"#/components/schemas/PollenLevel"},{"type":"null"}],"description":"Gräser."},"hazel":{"anyOf":[{"$ref":"#/components/schemas/PollenLevel"},{"type":"null"}],"description":"Hasel."},"mugwort":{"anyOf":[{"$ref":"#/components/schemas/PollenLevel"},{"type":"null"}],"description":"Beifuß."},"ragweed":{"anyOf":[{"$ref":"#/components/schemas/PollenLevel"},{"type":"null"}],"description":"Ambrosia."},"rye":{"anyOf":[{"$ref":"#/components/schemas/PollenLevel"},{"type":"null"}],"description":"Roggen."}},"additionalProperties":true,"type":"object","title":"PollenSpecies"},"PrecipitationIntensity":{"type":"string","enum":["none","trace","light","moderate","heavy","very_heavy"],"title":"PrecipitationIntensity","description":"Precipitation intensity class of a rate in mm/h (nano_backend.scale; table, sources and\nexamples in docs/api-v1.md \"Precipitation intensity\"). Rain: < 0.1 none, 0.1 trace, 0.3 light,\n2.5 moderate, 10 heavy, 50 very_heavy; snow (water equivalent): < 0.1 none, 0.1 light,\n1 moderate, 5 heavy (no trace, no very_heavy). Lower edges inclusive. Later versions may move\nedges, not rename classes. Clients must accept unknown values.","x-extensible-enum":true},"PrecipitationKind":{"type":"string","enum":["rain","snow"],"title":"PrecipitationKind","description":"Which column of the intensity scale applies: `rain` (also drizzle, freezing rain, showers,\nthunderstorm, hail) or `snow` (also sleet)."},"Problem":{"properties":{"type":{"type":"string","title":"Type","description":"URI of the problem type: `https://api.nano-wetter.de/problems/<slug>` (an identifier, the same on every host), or `about:blank` when the server is configured so."},"code":{"type":"string","title":"Code","description":"The problem slug (`unauthorized`, `quota-exceeded`, …): the stable identifier to match on."},"title":{"type":"string","title":"Title"},"status":{"type":"integer","title":"Status","description":"HTTP status code."},"instance":{"type":"string","title":"Instance","description":"The path the client requested (without the query), e.g. `/v2/weather` through the public edge, `/v1/weather` when called directly."},"detail":{"type":"string","title":"Detail","description":"Human-readable explanation (English). Always present; for `invalid-parameters` it names the parameters, e.g. `Invalid query parameters: lat, lon`."},"errors":{"items":{"$ref":"#/components/schemas/ParameterError"},"type":"array","title":"Errors","description":"Extension member of `invalid-parameters` raised by parameter validation: one entry per invalid parameter. Absent otherwise."},"max_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Days","description":"History: the maximum range."},"max_km":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Km","description":"History: the search radius."}},"additionalProperties":true,"type":"object","required":["type","code","title","status","instance","detail"],"title":"Problem","description":"RFC 9457 problem details (`application/problem+json`)."},"RadarEncoding":{"properties":{"dtype":{"type":"string","const":"uint16","title":"Dtype"},"byte_order":{"type":"string","const":"little","title":"Byte Order"},"compression":{"type":"string","const":"zlib","title":"Compression"},"transport":{"type":"string","const":"base64","title":"Transport"},"layout":{"type":"string","title":"Layout"},"unit":{"type":"string","title":"Unit","description":"`0.01 mm / 5 min`."},"nodata":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Nodata","description":"No-data value, null when outside coverage reads 0."}},"additionalProperties":true,"type":"object","required":["dtype","byte_order","compression","transport","layout","unit","nodata"],"title":"RadarEncoding"},"RadarFeaturesResponse":{"properties":{"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"cells":{"items":{"$ref":"#/components/schemas/Cell"},"type":"array","title":"Cells"},"mesocyclones":{"items":{"$ref":"#/components/schemas/Mesocyclone"},"type":"array","title":"Mesocyclones"},"source_cycle":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Source Cycle","description":"The 5-minute cycle the features come from (≤ 10 min before `timestamp`), null when none is stored."},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"meta":{"$ref":"#/components/schemas/Meta"}},"additionalProperties":true,"type":"object","required":["timestamp","cells","mesocyclones","source_cycle","attribution","meta"],"title":"RadarFeaturesResponse","description":"Convective cells (KONRAD3D) and mesocyclones at a time step."},"RadarFrame":{"properties":{"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"END of the 5-minute interval (UTC)."},"kind":{"type":"string","enum":["analysis","nowcast"],"title":"Kind"},"issued":{"type":"string","format":"date-time","title":"Issued","description":"Issue time of the RV run of this frame (UTC)."},"lead_minutes":{"type":"integer","title":"Lead Minutes","description":"Lead time within its run (0 = analysis)."},"source":{"type":"string","title":"Source","description":"`RV::<issued>`."},"precipitation_5":{"type":"string","title":"Precipitation 5","description":"base64(zlib(uint16 little-endian, row-major, row 0 = north)); 0.01 mm per 5 min."}},"additionalProperties":true,"type":"object","required":["timestamp","kind","issued","lead_minutes","source","precipitation_5"],"title":"RadarFrame"},"RadarGridResponse":{"properties":{"format":{"type":"string","const":"nano-radar-grid","title":"Format"},"version":{"type":"integer","title":"Version"},"issued":{"type":"string","format":"date-time","title":"Issued","description":"Newest RV issue (UTC)."},"radar":{"items":{"$ref":"#/components/schemas/RadarFrame"},"type":"array","title":"Radar","description":"Ascending by timestamp: past analyses, then the newest nowcast."},"bbox":{"items":{"type":"integer"},"type":"array","title":"Bbox","description":"[top_row, left_col, bottom_row, right_col], inclusive DE1200 cell indexes."},"width":{"type":"integer","title":"Width"},"height":{"type":"integer","title":"Height"},"latlon_position":{"additionalProperties":{"type":"number"},"type":"object","title":"Latlon Position","description":"Requested point in crop cells (`x`, `y`, fractional)."},"geometry":{"$ref":"#/components/schemas/GeoPolygon"},"encoding":{"$ref":"#/components/schemas/RadarEncoding"},"projection":{"$ref":"#/components/schemas/RadarProjection"},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"meta":{"$ref":"#/components/schemas/Meta"}},"additionalProperties":true,"type":"object","required":["format","version","issued","radar","bbox","width","height","latlon_position","geometry","encoding","projection","attribution","meta"],"title":"RadarGridResponse","description":"Precipitation frames around the point, compatible with Bright Sky `/radar?format=compressed`.\nFrame times stay UTC whatever `tz` is (nano's decoder expects Bright Sky's format)."},"RadarProjection":{"properties":{"name":{"type":"string","const":"DE1200","title":"Name"},"proj4":{"type":"string","title":"Proj4"},"cell_size_m":{"type":"integer","title":"Cell Size M"},"grid_width":{"type":"integer","title":"Grid Width"},"grid_height":{"type":"integer","title":"Grid Height"},"cell_centre":{"type":"string","title":"Cell Centre"}},"additionalProperties":true,"type":"object","required":["name","proj4","cell_size_m","grid_width","grid_height","cell_centre"],"title":"RadarProjection"},"RadarVolumeResponse":{"properties":{"format":{"type":"string","const":"nano3d","title":"Format"},"version":{"type":"integer","const":2,"title":"Version"},"grid":{"additionalProperties":{"$ref":"#/components/schemas/VolumeGrid"},"type":"object","title":"Grid","description":"Crop per layer (`precip`, `clouds`)."},"layers":{"additionalProperties":{"$ref":"#/components/schemas/VolumeLayer"},"type":"object","title":"Layers","description":"Channels and encodings per layer."},"frames":{"items":{"$ref":"#/components/schemas/VolumeFrameRef"},"type":"array","title":"Frames","description":"Frames of both layers in the window, ascending by time."},"preview":{"anyOf":[{"$ref":"#/components/schemas/VolumePreview"},{"type":"null"}],"description":"First-paint frame, null without observed frames."},"surfaces_url":{"type":"string","title":"Surfaces Url","description":"NANO2D surfaces, `{timestamp}` template."},"surfaces":{"$ref":"#/components/schemas/VolumeSurfaces"},"features_url":{"type":"string","title":"Features Url","description":"Cells and mesocyclones (JSON), `{timestamp}` template."},"wind_url":{"type":"string","title":"Wind Url","description":"NANO2D wind layers (8 km), `{timestamp}` template."},"terrain_url":{"type":"string","title":"Terrain Url","description":"NANO2D terrain height (immutable)."},"generated":{"type":"string","format":"date-time","title":"Generated","description":"When the manifest was made (UTC)."},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"meta":{"$ref":"#/components/schemas/Meta"}},"additionalProperties":true,"type":"object","required":["format","version","grid","layers","frames","preview","surfaces_url","surfaces","features_url","wind_url","terrain_url","generated","attribution","meta"],"title":"RadarVolumeResponse","description":"Manifest of the 3D radar and clouds (docs/radar-3d.md, NANO3D v2). Every URL in it is an absolute\npath with the version prefix the client called (`/v2/radar/volume/…` through api.nano-wetter.de,\n`/v1/radar/volume/…` directly); use it as given against the API's host."},"ResolvedStation":{"properties":{"id":{"type":"string","pattern":"^\\d{5}$","title":"Id","description":"DWD station id, 5 digits."},"name":{"type":"string","title":"Name"},"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"elevation_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Elevation M","description":"Station height (m)."},"distance_km":{"type":"number","title":"Distance Km","description":"Distance from the point (km)."},"height_diff_m":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height Diff M","description":"Station height minus the location's elevation (m)."}},"additionalProperties":true,"type":"object","required":["id","name","lat","lon","elevation_m","distance_km","height_diff_m"],"title":"ResolvedStation"},"Soil":{"properties":{"available":{"type":"boolean","const":true,"title":"Available","description":"True: the sub-block has content (see SubBlockUnavailable for false)."},"station":{"$ref":"#/components/schemas/ResolvedStation"},"date":{"type":"string","format":"date","title":"Date","description":"Day of the values."},"stale":{"type":"boolean","title":"Stale","description":"True when older than the day before yesterday (local)."},"moisture":{"additionalProperties":{"$ref":"#/components/schemas/SoilMoisture"},"type":"object","title":"Moisture","description":"Plant-available water 0–60 cm (% nFK) under `grass`, `winter_cereals`, `maize`."},"temperature":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"object","title":"Temperature","description":"Bare-soil temperature by depth `5cm` … `100cm` (°C / °F)."},"frost_depth":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Frost Depth","description":"Frost penetration depth (cm / in)."},"evapotranspiration_potential":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Evapotranspiration Potential","description":"Potential evapotranspiration over grass (mm / in)."},"units":{"additionalProperties":{"type":"string"},"type":"object","title":"Units","description":"Unit of each field."},"soils":{"additionalProperties":{"type":"string"},"type":"object","title":"Soils","description":"Meaning of the soil keys."},"depth":{"additionalProperties":{"type":"string"},"type":"object","title":"Depth","description":"Depth of moisture and temperature values."},"kind":{"type":"string","const":"model","title":"Kind"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model","description":"DWD model names."},"attribution":{"type":"string","title":"Attribution"}},"additionalProperties":true,"type":"object","required":["available","station","date","stale","moisture","temperature","frost_depth","evapotranspiration_potential","units","soils","depth","kind","model","attribution"],"title":"Soil","description":"DWD modelled soil values (AMBAV/AMBETI) of the best station within 50 km, newest day\n(yesterday; no forecast). Temperature, frost depth and evapotranspiration follow `units`\n(°C/°F, cm/in, mm/in); moisture stays % nFK."},"SoilMoisture":{"properties":{"sand":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sand","description":"Loamy sand (% nFK)."},"loam":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Loam","description":"Silty loam (% nFK)."}},"additionalProperties":true,"type":"object","title":"SoilMoisture"},"StationCandidate":{"properties":{"id":{"type":"string","title":"Id","description":"DWD station id, 5 digits (or registry id when the station has none)."},"name":{"type":"string","title":"Name"},"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"elevation_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Elevation M","description":"Station height (m, 1 decimal)."},"distance_km":{"type":"number","title":"Distance Km","description":"Distance from the location (km, 1 decimal)."},"height_diff_m":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height Diff M","description":"Station height minus the location's elevation (m)."},"score":{"type":"number","title":"Score","description":"abs(height_diff_m) × 0.0065 + distance_km × 0.14; lower is better."},"ids":{"$ref":"#/components/schemas/StationIds"},"networks":{"items":{"type":"string"},"type":"array","title":"Networks","description":"Registry networks the station belongs to."},"last_observation":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Observation","description":"Time of the newest temperature observation (in `tz`)."},"is_reporting":{"type":"boolean","title":"Is Reporting","description":"Newest observation is younger than 90 minutes."},"recommended":{"type":"boolean","title":"Recommended","description":"The station `current` would use."}},"additionalProperties":true,"type":"object","required":["id","name","lat","lon","elevation_m","distance_km","height_diff_m","score","ids","networks","last_observation","is_reporting","recommended"],"title":"StationCandidate"},"StationIds":{"properties":{"dwd":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dwd"},"wmo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wmo"},"mosmix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mosmix"}},"additionalProperties":true,"type":"object","required":["dwd","wmo","mosmix"],"title":"StationIds"},"StationsLocation":{"properties":{"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"elevation_m":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Elevation M","description":"Elevation the height differences refer to (m, as in /v1/weather)."},"elevation_source":{"anyOf":[{"$ref":"#/components/schemas/ElevationSource"},{"type":"null"}],"description":"Where `elevation_m` comes from; null when unknown."}},"additionalProperties":true,"type":"object","required":["lat","lon","elevation_m","elevation_source"],"title":"StationsLocation"},"StationsResponse":{"properties":{"location":{"$ref":"#/components/schemas/StationsLocation"},"network":{"type":"string","title":"Network","description":"Requested network."},"recommended":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recommended","description":"Id of the recommended station."},"scoring":{"anyOf":[{"$ref":"#/components/schemas/StationsScoring"},{"type":"null"}],"description":"Absent when the station registry is not loaded."},"stations":{"items":{"$ref":"#/components/schemas/StationCandidate"},"type":"array","title":"Stations","description":"Candidates within `radius_km`, best score first."},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"meta":{"$ref":"#/components/schemas/Meta"}},"additionalProperties":true,"type":"object","required":["location","network","recommended","stations","attribution","meta"],"title":"StationsResponse"},"StationsScoring":{"properties":{"lapse_rate_per_m":{"type":"number","title":"Lapse Rate Per M"},"distance_weight_per_km":{"type":"number","title":"Distance Weight Per Km"},"score":{"type":"string","title":"Score"}},"additionalProperties":true,"type":"object","required":["lapse_rate_per_m","distance_weight_per_km","score"],"title":"StationsScoring"},"SubBlockUnavailable":{"properties":{"available":{"type":"boolean","const":false,"title":"Available","description":"False: no content (content sub-blocks carry `available: true`)."},"reason":{"$ref":"#/components/schemas/SubBlockUnavailableReason"},"max_km":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Km","description":"Maximum distance searched (km)."},"distance_km":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distance Km","description":"Distance to the nearest city/station (km)."},"nearest_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nearest City","description":"Nearest city (city products: UV index, thermal hazard)."},"nearest_station":{"anyOf":[{"type":"string","pattern":"^\\d{5}$"},{"type":"null"}],"title":"Nearest Station","description":"Nearest DWD station id, 5 digits (station products)."},"region":{"anyOf":[{"$ref":"#/components/schemas/NamedRef"},{"type":"null"}],"description":"Region the point resolved to, if any (pollen, text)."},"zone":{"anyOf":[{"$ref":"#/components/schemas/NamedRef"},{"type":"null"}],"description":"Biowetter zone the point resolved to, if any."},"district":{"anyOf":[{"$ref":"#/components/schemas/NamedRef"},{"type":"null"}],"description":"Warn district the point resolved to, if any (heat trend)."},"city":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"City","description":"City the point resolved to, if any."},"ags":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ags","description":"Municipality key that found no text region."}},"additionalProperties":true,"type":"object","required":["available","reason"],"title":"SubBlockUnavailable","description":"A health/environment/climate/text sub-block without content. Always carries `available:\nfalse` and `reason`; the other fields say what was nearest, so clients can explain it."},"SubBlockUnavailableReason":{"type":"string","enum":["no_region","too_far","no_station","no_data"],"title":"SubBlockUnavailableReason","description":"Why a region/city/station sub-block has no content: the point lies in no region, the\nnearest city or station is farther than `max_km`, or the dataset has no values yet. Clients must accept unknown values.","x-extensible-enum":true},"SurfaceLayer":{"properties":{"name":{"type":"string","title":"Name"},"type":{"type":"string","enum":["uint8","uint16","int8"],"title":"Type"},"encoding":{"additionalProperties":true,"type":"object","title":"Encoding"}},"additionalProperties":true,"type":"object","required":["name","type","encoding"],"title":"SurfaceLayer"},"TemperatureNudge":{"properties":{"delta":{"type":"number","title":"Delta","description":"Observation minus model at the observation time (°C, clamped to ±5)."},"station":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Station","description":"DWD id of the station."},"observed_at":{"type":"string","format":"date-time","title":"Observed At","description":"Time of the observation."},"tau_h":{"type":"number","title":"Tau H","description":"e-folding time of the decay of the correction (h)."},"rain":{"anyOf":[{"$ref":"#/components/schemas/TemperatureNudgeRain"},{"type":"null"}],"description":"Only in profiles with a rain-persistent τ (e.g. `blend-nudge-rain`): a cold deviation by day while it rains decayed with this τ instead of the short one for passing cloud shadows."}},"additionalProperties":true,"type":"object","required":["delta","station","observed_at","tau_h"],"title":"TemperatureNudge"},"TemperatureNudgeRain":{"properties":{"source":{"type":"string","enum":["station","radar"],"title":"Source","description":"Why the point counted as raining: precipitation at the nudging station in the last hour, or the RV radar rate at the point now. Clients must accept unknown values.","x-extensible-enum":true},"tau_h":{"type":"number","title":"Tau H","description":"e-folding time used for the cold deviation under rain (h)."}},"additionalProperties":true,"type":"object","required":["source","tau_h"],"title":"TemperatureNudgeRain"},"Text":{"properties":{"available":{"type":"boolean","const":true,"title":"Available","description":"True: the sub-block has content (see SubBlockUnavailable for false)."},"region":{"$ref":"#/components/schemas/TextRegion"},"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline"},"synopsis":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Synopsis"},"warning_outlook":{"$ref":"#/components/schemas/WarningOutlook"},"days":{"items":{"$ref":"#/components/schemas/TextDay"},"type":"array","title":"Days"},"issued":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Issued","description":"Issue time."},"valid_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid From"},"valid_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid To"},"expired":{"type":"boolean","title":"Expired","description":"True when now is past `valid_to` (DWD has not re-issued in time)."},"office":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Office"},"warning_report":{"anyOf":[{"$ref":"#/components/schemas/WarningReport"},{"type":"null"}],"description":"Newest Warnlagebericht (VHDL30); null when not loaded."},"language":{"type":"string","const":"de","title":"Language"},"attribution":{"type":"string","title":"Attribution"}},"additionalProperties":true,"type":"object","required":["available","region","headline","synopsis","warning_outlook","days","issued","valid_from","valid_to","expired","office","warning_report","language","attribution"],"title":"Text","description":"The forecasters' written regional forecast (VHDL01). German only."},"TextDay":{"properties":{"day":{"type":"integer","title":"Day","description":"0 = today … 3."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"From","description":"Start of the period."},"to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"To","description":"End of the period."},"text":{"type":"string","title":"Text"}},"additionalProperties":true,"type":"object","required":["day","from","to","text"],"title":"TextDay"},"TextRegion":{"properties":{"id":{"type":"string","title":"Id","description":"Text region key, e.g. `Berlin`, `Suedbayern`."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"DWD product code of the region."},"ags":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ags"}},"additionalProperties":true,"type":"object","required":["id","code"],"title":"TextRegion"},"ThermalHazard":{"properties":{"available":{"type":"boolean","const":true,"title":"Available","description":"True: the sub-block has content (see SubBlockUnavailable for false)."},"issued":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Issued","description":"Issue time of the DWD product."},"next_update":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Update","description":"Announced next issue."},"sender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender","description":"Issuing DWD department."},"attribution":{"type":"string","title":"Attribution","description":"`Deutscher Wetterdienst`."},"city":{"$ref":"#/components/schemas/City"},"slots":{"items":{"$ref":"#/components/schemas/ThermalSlot"},"type":"array","title":"Slots"}},"additionalProperties":true,"type":"object","required":["available","issued","next_update","sender","attribution","city","slots"],"title":"ThermalHazard","description":"DWD thermal hazard (Gefühlte Temperatur warning level) of the nearest city (within 80 km)."},"ThermalSlot":{"properties":{"time":{"type":"string","format":"date-time","title":"Time","description":"Time of the slot."},"level":{"type":"string","title":"Level","description":"DWD level as published: `keine`, `gering`, `mittel`, `hoch`, `sehr hoch`, `extrem`."},"rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank","description":"Level as a number 0 … 4."},"label":{"type":"string","title":"Label","description":"Level in `lang`."}},"additionalProperties":true,"type":"object","required":["time","level","rank","label"],"title":"ThermalSlot"},"Unavailable":{"properties":{"current":{"anyOf":[{"$ref":"#/components/schemas/BlockUnavailableReason"},{"type":"null"}]},"minutely":{"anyOf":[{"$ref":"#/components/schemas/BlockUnavailableReason"},{"type":"null"}]},"hourly":{"anyOf":[{"$ref":"#/components/schemas/BlockUnavailableReason"},{"type":"null"}]},"daily":{"anyOf":[{"$ref":"#/components/schemas/BlockUnavailableReason"},{"type":"null"}]},"warnings":{"anyOf":[{"$ref":"#/components/schemas/BlockUnavailableReason"},{"type":"null"}]},"health":{"anyOf":[{"$ref":"#/components/schemas/BlockUnavailableReason"},{"type":"null"}]},"environment":{"anyOf":[{"$ref":"#/components/schemas/BlockUnavailableReason"},{"type":"null"}]},"climate":{"anyOf":[{"$ref":"#/components/schemas/BlockUnavailableReason"},{"type":"null"}]},"text":{"anyOf":[{"$ref":"#/components/schemas/BlockUnavailableReason"},{"type":"null"}]}},"additionalProperties":true,"type":"object","title":"Unavailable","description":"Reason per null block."},"UvDay":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"uv_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Uv Index","description":"Daily maximum UV index."}},"additionalProperties":true,"type":"object","required":["date","uv_index"],"title":"UvDay"},"UvIndex":{"properties":{"available":{"type":"boolean","const":true,"title":"Available","description":"True: the sub-block has content (see SubBlockUnavailable for false)."},"issued":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Issued","description":"Issue time of the DWD product."},"next_update":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Update","description":"Announced next issue."},"sender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender","description":"Issuing DWD department."},"attribution":{"type":"string","title":"Attribution","description":"`Deutscher Wetterdienst`."},"city":{"$ref":"#/components/schemas/City"},"days":{"items":{"$ref":"#/components/schemas/UvDay"},"type":"array","title":"Days"}},"additionalProperties":true,"type":"object","required":["available","issued","next_update","sender","attribution","city","days"],"title":"UvIndex","description":"DWD UV index forecast of the nearest city (within 100 km)."},"VerificationResponse":{"properties":{"computed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Computed At"},"window_hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Window Hours"},"reference":{"type":"string","title":"Reference"},"units":{"additionalProperties":{"type":"string"},"type":"object","title":"Units"},"aliases":{"additionalProperties":{"type":"string"},"type":"object","title":"Aliases","description":"Variant alias → the profile it points to now (its scores are listed under both names)."},"scores":{"additionalProperties":{"additionalProperties":{"items":{"$ref":"#/components/schemas/VerificationScore"},"type":"array"},"type":"object"},"type":"object","title":"Scores","description":"metric → profile name or variant alias → scores by lead time. A profile keeps its own history; an alias shows the profile it points to now (after a promotion `stable` shows the new champion)."},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"meta":{"$ref":"#/components/schemas/Meta"}},"additionalProperties":true,"type":"object","required":["computed_at","window_hours","reference","units","aliases","scores","attribution","meta"],"title":"VerificationResponse"},"VerificationScore":{"properties":{"lead_hours_from":{"type":"integer","title":"Lead Hours From","description":"Lower bound of the lead-time bucket (h)."},"n":{"type":"integer","title":"N","description":"Number of forecast/observation pairs."},"mae":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mae","description":"Mean absolute error (unit of the metric)."},"bias":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Bias","description":"Mean error, forecast minus observation."}},"additionalProperties":true,"type":"object","required":["lead_hours_from","n","mae","bias"],"title":"VerificationScore"},"VolumeChannel":{"properties":{"name":{"type":"string","title":"Name","description":"Channel name, in frame order (`dbz`, `hclass`; `cloud_liquid`, `cloud_ice`, `cloud_cover`)."},"encoding":{"additionalProperties":true,"type":"object","title":"Encoding","description":"How to read the byte: `type` linear (value = v × scale + offset), log10 (β = 10^((v − 1) / 254 · 4 − 2)) or class (codes of the low `mask` bits, `flags` bits); `nodata`, `unit`."}},"additionalProperties":true,"type":"object","required":["name","encoding"],"title":"VolumeChannel"},"VolumeFrameRef":{"properties":{"layer":{"type":"string","enum":["precip","clouds"],"title":"Layer"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Valid time (UTC); observed radar frames: start of the 5-minute scan cycle."},"kind":{"type":"string","enum":["observed","nowcast","model","analysis"],"title":"Kind"},"lead_min":{"type":"integer","title":"Lead Min","description":"Minutes after `run` (0 for observed/analysis)."},"run":{"type":"string","format":"date-time","title":"Run","description":"Source run: radar cycle (observed/nowcast) or model run (model/analysis), UTC."},"sites":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sites","description":"Radar sites in an observed frame, else null."},"url":{"type":"string","title":"Url","description":"Absolute path (with query) of the NANO3D v2 frame, as this client reaches it: `/v1/…` directly, `/v2/…` through api.nano-wetter.de. Call it as given, against the API's host."},"bytes":{"type":"integer","title":"Bytes","description":"Estimated compressed size of the frame (bytes)."}},"additionalProperties":true,"type":"object","required":["layer","timestamp","kind","lead_min","run","sites","url","bytes"],"title":"VolumeFrameRef"},"VolumeGrid":{"properties":{"min_lat":{"type":"number","title":"Min Lat"},"max_lat":{"type":"number","title":"Max Lat"},"min_lon":{"type":"number","title":"Min Lon"},"max_lon":{"type":"number","title":"Max Lon"},"width":{"type":"integer","title":"Width"},"height":{"type":"integer","title":"Height"},"resolution_m":{"type":"integer","title":"Resolution M","description":"Horizontal cell size (m): 1000, 2000 or 4000 (clouds: at least 2000)."},"levels":{"type":"integer","title":"Levels","description":"Number of height slabs (48)."},"level_m":{"type":"number","title":"Level M","description":"Slab thickness (m), 250."},"base_m":{"type":"number","title":"Base M","description":"Height of the lowest slab's bottom above sea level (m), 0."},"brick":{"items":{"type":"integer"},"type":"array","title":"Brick","description":"Brick size x, y, z of the sparse payload: [8, 8, 4]."}},"additionalProperties":true,"type":"object","required":["min_lat","max_lat","min_lon","max_lon","width","height","resolution_m","levels","level_m","base_m","brick"],"title":"VolumeGrid","description":"One layer's crop: rows regular in Web Mercator y between the bounds (row 0 = north),\ncolumns regular in longitude; `levels` slabs of `level_m` metres from `base_m` above sea\nlevel."},"VolumeLayer":{"properties":{"channels":{"items":{"$ref":"#/components/schemas/VolumeChannel"},"type":"array","title":"Channels"},"resolutions":{"items":{"type":"integer"},"type":"array","title":"Resolutions","description":"Resolutions (m) the layer is stored at."}},"additionalProperties":true,"type":"object","required":["channels","resolutions"],"title":"VolumeLayer"},"VolumePreview":{"properties":{"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"url":{"type":"string","title":"Url","description":"Newest observed `precip` frame at 4 km, `dbz` only."}},"additionalProperties":true,"type":"object","required":["timestamp","url"],"title":"VolumePreview"},"VolumeSurfaces":{"properties":{"layers":{"items":{"$ref":"#/components/schemas/SurfaceLayer"},"type":"array","title":"Layers","description":"Layers a surfaces NANO2D may carry (absent ones are left out)."}},"additionalProperties":true,"type":"object","required":["layers"],"title":"VolumeSurfaces"},"WarningFamily":{"type":"string","enum":["thunderstorm","wind","rain","snow","frost","black_ice","thaw","fog","heat","uv","coast","lake","other"],"title":"WarningFamily","description":"Event family derived from the DWD event code. Clients must accept unknown values.","x-extensible-enum":true},"WarningGroup":{"type":"string","enum":["THUNDERSTORM","WIND","TORNADO","RAIN","HAIL","SNOWFALL","SNOWDRIFT","FOG","FROST","SLIPPERINESS","BLACK_ICE","RIME_ICE","THAW","POWERLINEVIBRATION","UV","HEAT","TEST"],"title":"WarningGroup","description":"DWD event group of a warning (CAP `eventCode` `GROUP`), verbatim; values per CAP-DWD profile\nv2.1.14 § 3.3 (`TEST`: II 98/99). Not a closed set: a group DWD adds later is passed through. Clients must accept unknown values.","x-extensible-enum":true},"WarningOutlook":{"properties":{"next_48h":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next 48H","description":"Warning outlook for the next 48 hours."},"later":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Later","description":"Warning outlook beyond."}},"additionalProperties":true,"type":"object","required":["next_48h","later"],"title":"WarningOutlook"},"WarningReport":{"properties":{"regional":{"anyOf":[{"$ref":"#/components/schemas/WarningReportText"},{"type":"null"}],"description":"Report for the region containing the text region."},"germany":{"anyOf":[{"$ref":"#/components/schemas/WarningReportText"},{"type":"null"}],"description":"Report for Germany."}},"additionalProperties":true,"type":"object","required":["regional","germany"],"title":"WarningReport"},"WarningReportText":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"DWD product code, e.g. `DWOG`."},"area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Area"},"issued":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Issued","description":"Issue time."},"office":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Office"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text","description":"Plain text of the Warnlagebericht."}},"additionalProperties":true,"type":"object","required":["code","issued","text"],"title":"WarningReportText"},"WeatherLocation":{"properties":{"lat":{"type":"number","title":"Lat","description":"Latitude, WGS84 (of the pinned station when only `station` was given)."},"lon":{"type":"number","title":"Lon","description":"Longitude, WGS84."},"tz":{"type":"string","title":"Tz","description":"IANA time zone of all local times in the response."},"cell":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cell","description":"ICON-D2 native grid cell of the point (`d2:<index>`); null outside the grid."},"cell_distance_km":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cell Distance Km","description":"Distance from the point to the cell centre (km); null outside the grid."},"elevation_m":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Elevation M","description":"Elevation the temperatures refer to (m, never converted). See `elevation_source`."},"elevation_source":{"anyOf":[{"$ref":"#/components/schemas/ElevationSource"},{"type":"null"}],"description":"Where `elevation_m` comes from; null when unknown."},"model_elevation_m":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Model Elevation M","description":"ICON-D2 model terrain height of the cell (m); null outside the grid."},"station":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Station","description":"The pinned DWD station id (request parameter `station`), else null."},"warn_cell":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Warn Cell","description":"DWD municipality warn cell id (9 digits) of the point."},"ags":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ags","description":"Amtlicher Gemeindeschlüssel (8 digits) of the municipality."},"municipality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Municipality","description":"Municipality (or city quarter) name."},"district":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"District","description":"District (Kreis) name."},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State","description":"Federal state code, e.g. `BE`."}},"additionalProperties":true,"type":"object","required":["lat","lon","tz","cell","cell_distance_km","elevation_m","elevation_source","model_elevation_m","station","warn_cell","ags","municipality","district","state"],"title":"WeatherLocation","description":"Always the same keys; values the point does not have (outside the grid, outside Germany)\nare null."},"WeatherResponse":{"properties":{"location":{"$ref":"#/components/schemas/WeatherLocation"},"current":{"anyOf":[{"$ref":"#/components/schemas/Current"},{"type":"null"}],"description":"Now: station observation or model value."},"minutely":{"anyOf":[{"$ref":"#/components/schemas/Minutely"},{"type":"null"}],"description":"Radar nowcast, 2 hours in 5-minute steps."},"hourly":{"anyOf":[{"$ref":"#/components/schemas/Hourly"},{"type":"null"}],"description":"Hourly forecast (up to `hours`)."},"daily":{"anyOf":[{"$ref":"#/components/schemas/Daily"},{"type":"null"}],"description":"Daily forecast (up to `days`)."},"warnings":{"anyOf":[{"items":{"$ref":"#/components/schemas/WeatherWarning"},"type":"array"},{"type":"null"}],"title":"Warnings","description":"DWD warnings at the point, highest level first. Empty list: no warnings."},"health":{"anyOf":[{"$ref":"#/components/schemas/Health"},{"type":"null"}],"description":"DWD health products."},"environment":{"anyOf":[{"$ref":"#/components/schemas/Environment"},{"type":"null"}],"description":"Fire danger, soil, phenology."},"climate":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/Climate"},{"$ref":"#/components/schemas/SubBlockUnavailable"}],"discriminator":{"propertyName":"available","mapping":{"false":"#/components/schemas/SubBlockUnavailable","true":"#/components/schemas/Climate"}}},{"type":"null"}],"title":"Climate","description":"Climate normals and today's anomaly."},"text":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/Text"},{"$ref":"#/components/schemas/SubBlockUnavailable"}],"discriminator":{"propertyName":"available","mapping":{"false":"#/components/schemas/SubBlockUnavailable","true":"#/components/schemas/Text"}}},{"type":"null"}],"title":"Text","description":"Written regional forecast."},"unavailable":{"anyOf":[{"$ref":"#/components/schemas/Unavailable"},{"type":"null"}],"description":"Present when at least one block is null."},"attribution":{"items":{"$ref":"#/components/schemas/Attribution"},"type":"array","title":"Attribution"},"meta":{"$ref":"#/components/schemas/Meta"}},"additionalProperties":true,"type":"object","required":["location","attribution","meta"],"title":"WeatherResponse","description":"Everything for one location. Only the requested blocks (`include`) are present; a requested\nblock that cannot be answered is null and named in `unavailable`."},"WeatherWarning":{"properties":{"id":{"type":"string","title":"Id","description":"CAP identifier without the language suffix."},"episode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Episode","description":"Stable id across updates of the same warning; null when unknown."},"sequence":{"type":"integer","minimum":1,"title":"Sequence","description":"Update number within the episode (1 = first issue; 1 when unknown)."},"event":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event","description":"Event name in `lang`, e.g. `STURMBÖEN` / `gale-force gusts`."},"event_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Code","description":"DWD event code (II), e.g. `52`."},"family":{"$ref":"#/components/schemas/WarningFamily","description":"Event family derived from the event code."},"level":{"anyOf":[{"type":"integer","maximum":4,"minimum":1},{"type":"null"}],"title":"Level","description":"DWD warning level 1 (minor) … 4 (extreme)."},"severity":{"anyOf":[{"type":"string","enum":["Minor","Moderate","Severe","Extreme","Unknown"]},{"type":"null"}],"title":"Severity","description":"CAP 1.2 severity (DWD: Minor = level 1 … Extreme = level 4)."},"urgency":{"anyOf":[{"type":"string","enum":["Immediate","Expected","Future","Past","Unknown"]},{"type":"null"}],"title":"Urgency","description":"CAP 1.2 urgency; `Future` = pre-warning (Vorabinformation)."},"certainty":{"anyOf":[{"type":"string","enum":["Observed","Likely","Possible","Unlikely","Unknown"]},{"type":"null"}],"title":"Certainty","description":"CAP 1.2 certainty."},"is_prewarning":{"type":"boolean","title":"Is Prewarning","description":"True for a pre-warning (Vorabinformation Unwetter)."},"category":{"anyOf":[{"type":"string","enum":["Geo","Met","Safety","Security","Rescue","Fire","Health","Env","Transport","Infra","CBRNE","Other"]},{"type":"null"}],"title":"Category","description":"CAP 1.2 category (`Met`, `Health`, …)."},"onset":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Onset","description":"Start of the warning."},"expires":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires","description":"End of the warning; null = until further notice."},"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline","description":"Headline in `lang`."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Description in `lang`."},"instruction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instruction","description":"Instructions in `lang`."},"warn_cell":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Warn Cell","description":"Warn cell id through which the warning applies (9 digits, string)."},"area_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Area Name","description":"Name of that warn cell / area."},"groups":{"items":{"$ref":"#/components/schemas/WarningGroup"},"type":"array","title":"Groups","description":"DWD event groups (CAP `eventCode` `GROUP`) exactly as DWD writes them, in DWD's order, e.g. `[\"THUNDERSTORM\", \"WIND\", \"RAIN\"]`. Empty list: DWD sent none."},"parameters":{"additionalProperties":{"type":"string"},"type":"object","title":"Parameters","description":"DWD event parameters (CAP `parameter`): name → value string exactly as DWD sends it, unit in square brackets included, e.g. `{\"gusts\": \"~65 [km/h]\", \"hail\": \"~2 [cm]\"}`. Not parsed: `<A` / `>A` / `~A` / `A-B` mean less than / greater than / about / between (profile v2.1.14 § 2.2.2.18). Known names: profile § 3.2 and docs/api-v1.md. Empty object: DWD sent none."}},"additionalProperties":true,"type":"object","required":["id","episode","sequence","event","event_code","family","level","severity","urgency","certainty","is_prewarning","category","onset","expires","headline","description","instruction","warn_cell","area_name","groups","parameters"],"title":"WeatherWarning","description":"A DWD CAP warning valid at the point (active or upcoming)."}},"securitySchemes":{"ApiKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key","description":"`nw_live_…` / `nw_test_…` (prefix `NANO_KEY_PREFIX`, default `nw`). Required when the server runs with keys (every /v1 endpoint except /v1/meta/*)."},"BearerAuth":{"type":"http","scheme":"bearer","description":"The same key as `Authorization: Bearer …`."},"ApiKeyQuery":{"type":"apiKey","in":"query","name":"key","description":"The same key as `?key=` (avoid: ends up in logs and caches)."}}}}