{"openapi":"3.1.0","info":{"title":"Marine-API — rubberduck software","description":"Europäische Küstendaten-API: Gezeiten + Gezeitenstrom (FES). Öffentliche Endpunkte unter /v1 (API-Key-pflichtig).","version":"1.0.0"},"paths":{"/v1/status":{"get":{"tags":["Marine-API v1"],"summary":"Öffentlicher API-/Modul-Status (ohne Key)","description":"Live-Verfügbarkeit je Modul für die öffentliche Status-Seite (kein Key nötig).\nGezeiten/Strömung = Modell im RAM → immer betriebsbereit; Pegel/Meldungen/Schleusen hängen an\nder Revier-DB → ein Verbindungstest entscheidet ihren Status.","operationId":"v1_status_v1_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/tides":{"get":{"tags":["Marine-API v1"],"summary":"Gezeiten (Höhe) am Punkt","description":"LAT-bezogene Tidenkurve + HW/NW-Extrema für den Punkt (globales FES-Modell).","operationId":"v1_tides_v1_tides_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"title":"Lat"}},{"name":"lon","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"title":"Lon"}},{"name":"days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":14,"minimum":1},{"type":"null"}],"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/currents":{"get":{"tags":["Marine-API v1"],"summary":"Gezeitenstrom (Set & Drift) am Punkt","description":"Stündliches Set & Drift + Kenter-/Max-Punkte (FES2014a, tiefengemittelt).","operationId":"v1_currents_v1_currents_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"title":"Lat"}},{"name":"lon","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"title":"Lon"}},{"name":"hours","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":240,"minimum":1},{"type":"null"}],"title":"Hours"}},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Unix-Startzeit — richtet das Fenster an der Tidenkurve aus","title":"Start"},"description":"Unix-Startzeit — richtet das Fenster an der Tidenkurve aus"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/currents-field":{"get":{"tags":["Marine-API v1"],"summary":"Strömungs-Vektorfeld (Bbox)","description":"u/v-Vektorgitter über eine Bbox zu einem Zeitpunkt (für Karten-Overlays).","operationId":"v1_field_v1_currents_field_get","parameters":[{"name":"n","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"title":"N"}},{"name":"s","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"title":"S"}},{"name":"e","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"title":"E"}},{"name":"w","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"title":"W"}},{"name":"t","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"T"}},{"name":"cols","in":"query","required":false,"schema":{"type":"integer","maximum":48,"minimum":4,"default":22,"title":"Cols"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me":{"get":{"tags":["Marine-API v1"],"summary":"Key-Info &amp; Kontingent","operationId":"v1_me_v1_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/warnings-health":{"get":{"tags":["Marine-API v1"],"summary":"Ertrag je Meldungsquelle","description":"Wann hat jede Quelle zuletzt INHALT geliefert — nicht: wann lief der Ingest.\n\nHintergrund (09.09.): Die Schnittstellenuebersicht las bis dahin `updated_at` der Meldungen.\nDas fassen die Uebersetzungs- und Geocoding-Laeufe jeden Durchgang an, weshalb Quellen ohne\nfrische Daten acht Wochen lang gruen aussahen. `ts_ertrag` steigt nur, wenn die Quelle\ntatsaechlich Meldungen geliefert hat, und friert sonst sichtbar ein.","operationId":"v1_warnings_health_v1_warnings_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/warnings":{"get":{"tags":["Marine-API v1"],"summary":"Revier-/Schifffahrtsmeldungen im Gebiet","description":"Aktive Meldungen ALLER Quellen für `bbox` ODER `lat`+`lon`+`radius` (read-only aus revier_news).","operationId":"v1_warnings_v1_warnings_get","parameters":[{"name":"bbox","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"minLat,minLon,maxLat,maxLon","title":"Bbox"},"description":"minLat,minLon,maxLat,maxLon"},{"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":"radius","in":"query","required":false,"schema":{"type":"number","maximum":500,"minimum":1,"description":"km (bei lat/lon)","default":50,"title":"Radius"},"description":"km (bei lat/lon)"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"de","title":"Lang"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"csv: quelle-Filter","title":"Source"},"description":"csv: quelle-Filter"},{"name":"closed_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Closed Only"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"epoch: nur updated_at >=","title":"Since"},"description":"epoch: nur updated_at >="},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20000,"minimum":1,"default":200,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"full","in":"query","required":false,"schema":{"type":"boolean","description":"KW-intern: ganze revier_news-Form (inkl. unverortet + Rohfelder)","default":false,"title":"Full"},"description":"KW-intern: ganze revier_news-Form (inkl. unverortet + Rohfelder)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/warnings/status":{"get":{"tags":["Marine-API v1"],"summary":"Meldungs-Quellen — Health","description":"Health je Quelle (last_update/age/count/ok) — Grundlage für Kielwassers Leitwarte.","operationId":"v1_warnings_status_v1_warnings_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/locks":{"get":{"tags":["Marine-API v1"],"summary":"Schleusen im Gebiet (Betrieb/Infrastruktur)","description":"Schleusen + Betriebszeiten/Infrastruktur für `bbox` ODER `lat`+`lon`+`radius` (read-only).","operationId":"v1_locks_v1_locks_get","parameters":[{"name":"bbox","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"minLat,minLon,maxLat,maxLon","title":"Bbox"},"description":"minLat,minLon,maxLat,maxLon"},{"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":"radius","in":"query","required":false,"schema":{"type":"number","maximum":500,"minimum":1,"default":50,"title":"Radius"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"de","title":"Lang"}},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"csv: land-Filter","title":"Country"},"description":"csv: land-Filter"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20000,"minimum":1,"default":200,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"full","in":"query","required":false,"schema":{"type":"boolean","description":"interner Voll-Datensatz: Rohfelder je Schleuse + closures[]","default":false,"title":"Full"},"description":"interner Voll-Datensatz: Rohfelder je Schleuse + closures[]"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/locks/status":{"get":{"tags":["Marine-API v1"],"summary":"Schleusen je Land — Health","operationId":"v1_locks_status_v1_locks_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/levels":{"get":{"tags":["Marine-API v1"],"summary":"Pegel/Wasserstände im Gebiet","description":"Aktuelle Pegelstände amtlicher Messnetze für `bbox` ODER `lat`+`lon`+`radius`.\n\nWert in cm; `datum` nennt den Bezug (Pegelnull/NAP/DVR90/mAOD/RH2000/MSL/Mittelwasser),\n`trend` die Änderung (cm) zum Vorlauf, `measured` die Messzeit (epoch).\n\nAn der deutschen Küste kommt `forecast` dazu — die amtliche Wasserstandsvorhersage des Bundes\n(BSH, §1 SeeAufG, CC BY 4.0). Sie beantwortet das, was eine Rohzahl in cm über Pegelnull offen\nlässt: `vs_mean_water` (wie viel über/unter normal — an der Ostsee die einzige brauchbare\nEinordnung, weil es dort keine Tide gibt), `above_chart_datum` (Bezug der Seekarte), `surge`\n(Windstau gegenüber der astronomischen Vorhersage), `events` (nächste HW/NW mit amtlichem und\nastronomischem Wert — die Differenz ist der erwartete Stau) und mit `forecast=full` die\nVorhersagekurve in Stundenwerten, 72 h voraus.","operationId":"v1_levels_v1_levels_get","parameters":[{"name":"bbox","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"minLat,minLon,maxLat,maxLon","title":"Bbox"},"description":"minLat,minLon,maxLat,maxLon"},{"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":"radius","in":"query","required":false,"schema":{"type":"number","maximum":500,"minimum":1,"description":"km (bei lat/lon)","default":50,"title":"Radius"},"description":"km (bei lat/lon)"},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"csv: Messnetz-Filter (PEGELONLINE,RWS,DMI,EA,SMHI,KV,FMI,IMGW,IOC,BSH)","title":"Source"},"description":"csv: Messnetz-Filter (PEGELONLINE,RWS,DMI,EA,SMHI,KV,FMI,IMGW,IOC,BSH)"},{"name":"forecast","in":"query","required":false,"schema":{"type":"string","pattern":"^(off|summary|full)$","description":"Vorhersage: off | summary (Standard) | full (mit Kurve)","default":"summary","title":"Forecast"},"description":"Vorhersage: off | summary (Standard) | full (mit Kurve)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/levels/status":{"get":{"tags":["Marine-API v1"],"summary":"Pegel-Messnetze — Health","description":"Health je Messnetz (last_update/age/count/ok).","operationId":"v1_levels_status_v1_levels_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/shelter":{"get":{"tags":["Marine-API v1"],"summary":"Hafenschutz (Windschutz je Marina)","description":"Marinas mit Windschutz-Richtungen + Nacht-/Wellen-Scores (eigene Berechnung, read-only).","operationId":"v1_shelter_v1_shelter_get","parameters":[{"name":"bbox","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"minLat,minLon,maxLat,maxLon","title":"Bbox"},"description":"minLat,minLon,maxLat,maxLon"},{"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":"radius","in":"query","required":false,"schema":{"type":"number","maximum":500,"minimum":1,"default":50,"title":"Radius"}},{"name":"protected_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"csv Richtungen (n,ne,e,se,s,sw,w,nw) — nur Häfen, die aus ALLEN schützen","title":"Protected From"},"description":"csv Richtungen (n,ne,e,se,s,sw,w,nw) — nur Häfen, die aus ALLEN schützen"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/shelter/status":{"get":{"tags":["Marine-API v1"],"summary":"Hafenschutz — Abdeckung/Health","operationId":"v1_shelter_status_v1_shelter_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"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"}}}}