{"openapi":"3.1.0","info":{"title":"maunawai.info Trinkwasser-API","description":"Öffentliche, quellenverlinkte Trinkwasserdaten für Deutschland: Versorgungszonen,\nAnalysewerte (inkl. PFAS-20), versionierte TrinkwV-Grenzwerte und Provenienz\n(Original-Dokument, Ausgabestand, Abrufdatum).\n\n**Authentifizierung:** Header `X-Api-Key`. Free Tier: 1000 Requests/Tag.\nDie API dient primär unseren eigenen Systemen; externer Zugang auf Antrag:\n`POST /v1/keys/antrag` (E-Mail + Verwendungszweck, Key nach Prüfung per E-Mail).\nOhne Key abrufbar: `/v1/parameters` (Teaser) und `/v1/export/plz-zonen` (ODbL-Schicht).\n\n**Lizenzhinweis (Platzhalter, anwaltliche Prüfung ausstehend):**\nDas PLZ↔Zonen-Mapping (`/v1/lookup`-Zuordnung) basiert auf OpenStreetMap-Daten\nund steht unter **ODbL** — Attribution „© maunawai.info / © OpenStreetMap contributors\".\nDie Messwerte-Datenbank (Analysewerte, Historie, Provenienz) ist **proprietär**;\nNutzung gemäß API-Terms (folgen). Alle Messwerte stammen aus den verlinkten\nPflichtveröffentlichungen der Wasserversorger (§ 46 TrinkwV); Angaben nicht amtlich.\n","contact":{"name":"MAUNAWAI","url":"https://maunawai.info/"},"version":"1.0.0-beta"},"paths":{"/v1/lookup":{"get":{"tags":["Lookup"],"summary":"PLZ-Lookup: Zonen + Versorger + Ambiguität","operationId":"lookup_v1_lookup_get","parameters":[{"name":"plz","in":"query","required":true,"schema":{"type":"string","minLength":5,"maxLength":5,"pattern":"^\\d{5}$","description":"Deutsche Postleitzahl","title":"Plz"},"description":"Deutsche Postleitzahl"},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"API-Key (siehe /v1/parameters für Teaser ohne Key)","title":"X-Api-Key"},"description":"API-Key (siehe /v1/parameters für Teaser ohne Key)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Lookup V1 Lookup Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/zones/{zone_id}":{"get":{"tags":["Zonen"],"summary":"Zone + aktuelle Kernwerte + Provenienz","operationId":"zone_detail_v1_zones__zone_id__get","parameters":[{"name":"zone_id","in":"path","required":true,"schema":{"type":"integer","title":"Zone Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"API-Key (siehe /v1/parameters für Teaser ohne Key)","title":"X-Api-Key"},"description":"API-Key (siehe /v1/parameters für Teaser ohne Key)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Zone Detail V1 Zones  Zone Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/zones/{zone_id}/measurements":{"get":{"tags":["Zonen"],"summary":"Zeitreihe/alle Datenpunkte einer Zone","operationId":"zone_measurements_v1_zones__zone_id__measurements_get","parameters":[{"name":"zone_id","in":"path","required":true,"schema":{"type":"integer","title":"Zone Id"}},{"name":"parameter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter-Code, z.B. pfas_summe_20","title":"Parameter"},"description":"Parameter-Code, z.B. pfas_summe_20"},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"API-Key (siehe /v1/parameters für Teaser ohne Key)","title":"X-Api-Key"},"description":"API-Key (siehe /v1/parameters für Teaser ohne Key)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Zone Measurements V1 Zones  Zone Id  Measurements Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/suppliers/{supplier_id}":{"get":{"tags":["Versorger"],"summary":"Versorger + Zonen","operationId":"supplier_detail_v1_suppliers__supplier_id__get","parameters":[{"name":"supplier_id","in":"path","required":true,"schema":{"type":"integer","title":"Supplier Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"API-Key (siehe /v1/parameters für Teaser ohne Key)","title":"X-Api-Key"},"description":"API-Key (siehe /v1/parameters für Teaser ohne Key)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Supplier Detail V1 Suppliers  Supplier Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/export/plz-zonen":{"get":{"tags":["Export"],"summary":"ODbL-Export: komplettes PLZ↔Zonen-Mapping (ohne Key)","description":"Die offene Schicht (PLAN.md §5): das PLZ↔Versorgungszonen-Mapping ist\nOSM-abgeleitet und steht vollständig unter ODbL — bewusst ohne API-Key.","operationId":"export_plz_zonen_v1_export_plz_zonen_get","parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|csv)$","description":"json oder csv","default":"json","title":"Format"},"description":"json oder csv"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Export Plz Zonen V1 Export Plz Zonen Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/keys/antrag":{"post":{"tags":["Keys"],"summary":"API-Zugang beantragen","description":"Zugang wird geprüft; bei Annahme kommt der Key per E-Mail.","operationId":"key_antrag_v1_keys_antrag_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZugangsAntrag"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Key Antrag V1 Keys Antrag Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/parameters":{"get":{"tags":["Parameter"],"summary":"Parameter-Register (ohne Key abrufbar)","description":"Teaser-Endpoint: benötigt keinen API-Key.","operationId":"parameters_v1_parameters_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Parameters V1 Parameters Get"}}}}}}},"/v1/parameters/{code}/limits":{"get":{"tags":["Parameter"],"summary":"Versionierte Grenzwerte eines Parameters","operationId":"parameter_limits_v1_parameters__code__limits_get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"API-Key (siehe /v1/parameters für Teaser ohne Key)","title":"X-Api-Key"},"description":"API-Key (siehe /v1/parameters für Teaser ohne Key)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Parameter Limits V1 Parameters  Code  Limits Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"ZugangsAntrag":{"properties":{"email":{"type":"string","maxLength":254,"title":"Email"},"zweck":{"type":"string","maxLength":1000,"minLength":10,"title":"Zweck","description":"Wofür soll die API genutzt werden?"}},"type":"object","required":["email","zweck"],"title":"ZugangsAntrag"}}}}