{"openapi":"3.0.3","info":{"title":"Noah Matic – Public API","version":"1.0.0","description":"Öffentliche, rein lesende API. Keine Authentifizierung, CORS offen, maximal 120 Anfragen pro Minute und IP.\n\nJede Antwort hat ein `data`-Feld; Listen mit Blätterfunktion zusätzlich ein `meta`-Feld mit `total`, `offset` und `limit`.\n\nDeaktivierte Module antworten mit **404** — das ist kein Fehler, sondern bedeutet, dass es diesen Inhalt auf dieser Installation nicht gibt. Ebenso werden als privat markierte Orte und ein ausgeblendeter Orgasmus-Counter hier gar nicht erst ausgeliefert."},"servers":[{"url":"https://noahmatic.de","description":"Diese Installation"}],"tags":[{"name":"Meta","description":"Über die API selbst"},{"name":"Profil","description":"Person, Körper, Vorlieben"},{"name":"Medien","description":"Fotos, Videos, Texte"},{"name":"Standort","description":"GPS-Tracking"},{"name":"Sonstiges","description":"Bewertungen, Links, Zeitstrahl"}],"paths":{"/api/v1":{"get":{"summary":"Einstiegspunkt mit Endpunktliste","tags":["Meta"],"responses":{"200":{"description":"Erfolg","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"documentation":{"type":"string"},"openapi":{"type":"string"}}},"meta":{"type":"object","nullable":true}}}}}},"404":{"description":"Modul deaktiviert","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"429":{"description":"Rate-Limit erreicht","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/api/v1/stats":{"get":{"summary":"Zähler über alle Inhalte","tags":["Meta"],"responses":{"200":{"description":"Erfolg","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"photos":{"type":"integer"},"videos":{"type":"integer"},"stories":{"type":"integer"},"kinks":{"type":"integer"},"toys":{"type":"integer"},"gpsPoints":{"type":"integer"}}},"meta":{"type":"object","nullable":true}}}}}},"404":{"description":"Modul deaktiviert","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"429":{"description":"Rate-Limit erreicht","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/api/v1/profile":{"get":{"summary":"Steckbrief und Biografie","tags":["Profil"],"responses":{"200":{"description":"Erfolg","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"name":{"type":"string"},"bio":{"type":"string"},"location":{"type":"string"},"profession":{"type":"string"},"profileImage":{"type":"string"}}},"meta":{"type":"object","nullable":true}}}}}},"404":{"description":"Modul deaktiviert","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"429":{"description":"Rate-Limit erreicht","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/api/v1/bodystats":{"get":{"summary":"Körpermaße","tags":["Profil"],"responses":{"200":{"description":"Erfolg","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"value":{"type":"string"},"featured":{"type":"boolean"}}}},"meta":{"type":"object","nullable":true}}}}}},"404":{"description":"Modul deaktiviert","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"429":{"description":"Rate-Limit erreicht","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/api/v1/kinks":{"get":{"summary":"Vorlieben mit normalisiertem Score (0–100)","tags":["Profil"],"parameters":[{"name":"flat","in":"query","schema":{"type":"boolean"},"description":"true = flache Liste statt nach Kategorien gruppiert"}],"responses":{"200":{"description":"Erfolg","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"category":{"type":"string"},"items":{"type":"array"}}}},"meta":{"type":"object","nullable":true}}}}}},"404":{"description":"Modul deaktiviert","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"429":{"description":"Rate-Limit erreicht","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/api/v1/toys":{"get":{"summary":"Toy-Sammlung, Kapazität und Orgasmus-Counter","tags":["Profil"],"responses":{"200":{"description":"Erfolg","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"},"insertableLengthCm":{"type":"number"},"maxDiameterCm":{"type":"number"},"remoteControllable":{"type":"boolean"},"achieved":{"type":"boolean"}}}},"meta":{"type":"object","nullable":true}}}}}},"404":{"description":"Modul deaktiviert","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"429":{"description":"Rate-Limit erreicht","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/api/v1/status":{"get":{"summary":"Aktuelle Stimmung und Geilheitslevel","tags":["Profil"],"responses":{"200":{"description":"Erfolg","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"horniness":{"type":"integer"},"mood":{"type":"string"},"activity":{"type":"string"},"updatedAt":{"type":"string"}}},"meta":{"type":"object","nullable":true}}}}}},"404":{"description":"Modul deaktiviert","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"429":{"description":"Rate-Limit erreicht","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/api/v1/photos":{"get":{"summary":"Fotos, neueste zuerst","tags":["Medien"],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":50,"maximum":200},"description":"Anzahl Einträge"},{"name":"offset","in":"query","schema":{"type":"integer","default":0},"description":"Versatz für Blättern"},{"name":"tag","in":"query","schema":{"type":"string"},"description":"Nur Einträge mit diesem Tag (siehe /tags)"}],"responses":{"200":{"description":"Erfolg","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"url":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"takenAt":{"type":"string"},"uploadedAt":{"type":"string"}}}},"meta":{"type":"object","nullable":true}}}}}},"404":{"description":"Modul deaktiviert","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"429":{"description":"Rate-Limit erreicht","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/api/v1/videos":{"get":{"summary":"Videos, neueste zuerst","tags":["Medien"],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":50,"maximum":200},"description":"Anzahl Einträge"},{"name":"offset","in":"query","schema":{"type":"integer","default":0},"description":"Versatz für Blättern"},{"name":"tag","in":"query","schema":{"type":"string"},"description":"Nur Einträge mit diesem Tag (siehe /tags)"}],"responses":{"200":{"description":"Erfolg","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"url":{"type":"string"},"thumbnail":{"type":"string"},"takenAt":{"type":"string"}}}},"meta":{"type":"object","nullable":true}}}}}},"404":{"description":"Modul deaktiviert","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"429":{"description":"Rate-Limit erreicht","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/api/v1/tags":{"get":{"summary":"Tag-Vokabular mit Trefferzahlen","tags":["Medien"],"responses":{"200":{"description":"Erfolg","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"},"nsfw":{"type":"boolean"},"photoCount":{"type":"integer"},"videoCount":{"type":"integer"}}}},"meta":{"type":"object","nullable":true}}}}}},"404":{"description":"Modul deaktiviert","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"429":{"description":"Rate-Limit erreicht","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/api/v1/stories":{"get":{"summary":"Geschichten","tags":["Medien"],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":50,"maximum":200},"description":"Anzahl Einträge"},{"name":"offset","in":"query","schema":{"type":"integer","default":0},"description":"Versatz für Blättern"},{"name":"tag","in":"query","schema":{"type":"string"},"description":"Nur Einträge mit diesem Tag (siehe /tags)"}],"responses":{"200":{"description":"Erfolg","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"content":{"type":"string"},"publishedAt":{"type":"string"}}}},"meta":{"type":"object","nullable":true}}}}}},"404":{"description":"Modul deaktiviert","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"429":{"description":"Rate-Limit erreicht","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/api/v1/location/current":{"get":{"summary":"Aktuelle Position","tags":["Standort"],"responses":{"200":{"description":"Erfolg","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"},"timestamp":{"type":"string"},"ageMinutes":{"type":"integer"},"stale":{"type":"boolean"},"city":{"type":"string"},"batteryPercent":{"type":"integer"}}},"meta":{"type":"object","nullable":true}}}}}},"404":{"description":"Modul deaktiviert","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"429":{"description":"Rate-Limit erreicht","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/api/v1/location/day":{"get":{"summary":"Ein Tag als Aufenthalte und Wege","tags":["Standort"],"parameters":[{"name":"date","in":"query","schema":{"type":"string","example":"2026-03-25"},"description":"YYYY-MM-DD; ohne Angabe heute (oder der letzte Tag mit Daten)"}],"responses":{"200":{"description":"Erfolg","content":{"application/json":{"schema":{"type":"object","properties":{"date":{"type":"string"},"stops":{"type":"array"},"moves":{"type":"array"},"stats":{"type":"object"}}}}}},"404":{"description":"Modul deaktiviert","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"429":{"description":"Rate-Limit erreicht","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/api/v1/location/places":{"get":{"summary":"Häufig besuchte Orte mit Zeitmustern","tags":["Standort"],"responses":{"200":{"description":"Erfolg","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"},"name":{"type":"string"},"visitCount":{"type":"integer"},"pattern":{"type":"object"}}}}}}},"404":{"description":"Modul deaktiviert","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"429":{"description":"Rate-Limit erreicht","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/api/v1/links":{"get":{"summary":"Profile auf anderen Plattformen","tags":["Sonstiges"],"responses":{"200":{"description":"Erfolg","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"platform":{"type":"string"},"username":{"type":"string"},"url":{"type":"string"},"nsfw":{"type":"boolean"},"verified":{"type":"boolean"}}}},"meta":{"type":"object","nullable":true}}}}}},"404":{"description":"Modul deaktiviert","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"429":{"description":"Rate-Limit erreicht","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/api/v1/ratings":{"get":{"summary":"Bewertungen nach Kategorie","tags":["Sonstiges"],"responses":{"200":{"description":"Erfolg","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"average":{"type":"number"},"voteCount":{"type":"integer"}}}},"meta":{"type":"object","nullable":true}}}}}},"404":{"description":"Modul deaktiviert","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"429":{"description":"Rate-Limit erreicht","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/api/v1/timeline":{"get":{"summary":"Meilensteine","tags":["Sonstiges"],"responses":{"200":{"description":"Erfolg","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"}}}},"meta":{"type":"object","nullable":true}}}}}},"404":{"description":"Modul deaktiviert","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"429":{"description":"Rate-Limit erreicht","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}}}}