API-Überblick¶
Die Kamerplanter-API ist eine REST-API, die auf FastAPI basiert. Alle Endpunkte geben JSON zurück und folgen etablierten HTTP-Konventionen. Eine interaktive Dokumentation mit Swagger UI steht unter /api/v1/docs bereit.
Basis-URL¶
In Produktionsumgebungen wird die API über Traefik als Ingress-Controller unter der konfigurierten Domain erreichbar.
Interaktive Dokumentation¶
| URL | Inhalt |
|---|---|
/api/v1/docs | Swagger UI — alle Endpunkte direkt ausprobieren |
/api/v1/redoc | ReDoc — lesbare Referenzdokumentation |
/api/v1/openapi.json | OpenAPI-Schema (JSON) — für Code-Generierung |
Deployment-Modi¶
Das Verhalten der API hängt vom konfigurierten Deployment-Modus ab. Den aktuellen Modus liefert der Mode-Endpunkt:
full (Standard)¶
Vollständiger Betrieb mit Authentifizierung, Mandantenverwaltung und DSGVO-Funktionen. Alle Auth-Endpunkte sind aktiv. Jede Anfrage muss authentifiziert sein (außer health, mode und öffentliche OAuth-Callbacks).
light¶
Aktiviert durch KAMERPLANTER_MODE=light. Kein Login erforderlich — alle Endpunkte sind ohne Authentifizierung zugänglich. Geeignet für lokale Einzelnutzer-Installationen ohne Multi-Tenant-Bedarf. Die Auth-Router (/auth/...) sind in diesem Modus deaktiviert.
Light-Modus nicht für produktiven Multi-User-Betrieb
Im Light-Modus gibt es keine Zugriffskontrolle. Setzen Sie diesen Modus ausschließlich für isolierte lokale Instanzen ein.
URL-Struktur¶
Die API unterscheidet zwischen globalen Ressourcen und mandantengebundenen Ressourcen.
Globale Ressourcen¶
Stammdaten wie Pflanzenarten, botanische Familien und IPM-Referenzdaten sind global — sie gehören keinem einzelnen Mandanten.
GET /api/v1/species/
GET /api/v1/species/{key}
GET /api/v1/botanical-families/
GET /api/v1/cultivars/
GET /api/v1/ipm/pests/
GET /api/v1/starter-kits/
Mandantengebundene Ressourcen¶
Alle nutzerspezifischen Daten (Pflanzen, Durchläufe, Sensoren, Tanks usw.) sind einem Mandanten zugeordnet und werden über den Mandanten-Slug in der URL adressiert:
Beispiele:
GET /api/v1/t/mein-garten/plant-instances/
POST /api/v1/t/mein-garten/planting-runs/
GET /api/v1/t/mein-garten/tanks/
GET /api/v1/t/mein-garten/tasks/
Der Tenant-Slug wird bei der Registrierung automatisch aus dem Nutzernamen generiert (persönlicher Mandant). Für Gemeinschaftsgärten kann ein separater Mandant angelegt werden.
Health-Endpunkte¶
Die Health-Endpunkte erfordern keine Authentifizierung und sind für Kubernetes-Liveness- und Readiness-Probes vorgesehen:
GET /api/v1/health/live → {"status": "alive"}
GET /api/v1/health/ready → {"status": "ready", "database": true}
GET /api/health → {"status": "healthy", "version": "...", "mode": "..."}
Endpunkt-Übersicht¶
Die folgende Tabelle listet alle verfügbaren Router-Gruppen. Im Full-Modus sind auth-, oidc-providers- und platform-admin-Routen zusätzlich aktiv.
| Gruppe | Pfad-Präfix | Beschreibung | REQ |
|---|---|---|---|
| Authentifizierung | /auth | Login, Registrierung, Token, OAuth (nur full) | REQ-023 |
| Nutzer | /users | Eigenes Profil, Passwort ändern | REQ-023 |
| Mandanten | /tenants | Mandanten-CRUD, Mitgliedschaften | REQ-024 |
| Mandanten-Scope | /t/{slug}/... | Alle mandantengebundenen Ressourcen | REQ-024 |
| Botanische Familien | /botanical-families | Pflanzenfamilien-Stammdaten | REQ-001 |
| Arten | /species | Pflanzenarten-Stammdaten | REQ-001 |
| Sorten | /cultivars | Kultursorten | REQ-001 |
| Standorte | /sites, /locations, /slots | Standort- und Slothierarchie | REQ-002 |
| Substrate | /substrates | Substrattypen und -chargen | REQ-019 |
| Pflanzeninstanzen | /plant-instances | Einzelpflanzen-Tracking | REQ-001 |
| Phasensteuerung | /phases, /growth-phases | Wachstumsphasen und Übergänge | REQ-003 |
| Pflanzdurchläufe | /planting-runs | Batch-Verwaltung | REQ-013 |
| Tanks | /tanks | Tankzustände und Füllungen | REQ-014 |
| Düngemittel | /fertilizers | Düngemittel-Stammdaten | REQ-004 |
| Nährstoffpläne | /nutrient-plans | EC-basierte Nahrungspläne | REQ-004 |
| Gießereignisse | /watering-events | Bewässerungsprotokoll | REQ-004 |
| IPM | /ipm | Schädlings- und Krankheitsverwaltung | REQ-010 |
| Ernte | /harvest | Erntedokumentation und Karenz-Gate | REQ-007 |
| Aufgaben | /tasks | Aufgabenplanung und Workflows | REQ-006 |
| Pflegeerinnerungen | /care-reminders | Automatische Pflegepläne | REQ-022 |
| Kalender | /calendar | iCal-Feeds und Kalenderevents | REQ-015 |
| Onboarding | /onboarding | Einrichtungsassistent | REQ-020 |
| Starter-Kits | /starter-kits | Vorkonfigurierte Pakete | REQ-020 |
| Nutzerpräferenzen | /user-preferences | Erfahrungsstufe, Sprache | REQ-021 |
| Berechnung | /calculations | EC/VPD-Berechnungen | REQ-004 |
| Anreicherung | /enrichment | GBIF/Perenual-Datenanreicherung | REQ-011 |
| Import | /imports | CSV-Import für Stammdaten | REQ-012 |
| Companion-Planting | /companion-planting | Mischkultur-Empfehlungen | REQ-028 |
| Fruchtfolge | /crop-rotation | Rotationsvalidierung | REQ-002 |
| Health | /health | Liveness und Readiness | — |
Anfrage- und Antwortformat¶
Alle Request-Bodies und Responses verwenden application/json. Eine explizite Content-Type: application/json-Kopfzeile ist für POST/PUT/PATCH-Anfragen erforderlich.
Paginierung¶
Listenendpunkte unterstützen skip und limit als Query-Parameter:
Standardwerte: skip=0, limit=100 (je nach Endpunkt variierend).
Datumsformat¶
Alle Datums- und Zeitangaben folgen ISO 8601 im UTC-Format:
Rate Limiting¶
Zur Missbrauchsvermeidung sind sensible Endpunkte mit Rate Limits versehen:
| Endpunkt-Gruppe | Standard-Limit |
|---|---|
Auth-Endpunkte (/auth/login, /auth/register) | 20 Anfragen/Minute pro IP |
| Allgemeine API-Endpunkte | 100 Anfragen/Minute |
Bei Überschreitung antwortet die API mit HTTP 429 Too Many Requests.
CORS-Konfiguration¶
Erlaubte Origins werden über die Umgebungsvariable CORS_ORIGINS als kommagetrennte Liste konfiguriert:
Standardmäßig sind http://localhost:3000 und http://localhost:5173 (Vite-Dev-Server) erlaubt.
Sicherheits-Header¶
Jede API-Antwort enthält folgende Sicherheits-Header:
| Header | Wert |
|---|---|
X-Content-Type-Options | nosniff |
X-Frame-Options | DENY |
Referrer-Policy | strict-origin-when-cross-origin |
Permissions-Policy | camera=(), microphone=(), geolocation=() |
Strict-Transport-Security | Aktiv (nur außerhalb des Debug-Modus) |
Siehe auch¶
- Authentifizierung — Token-Workflow und API-Keys
- Fehlerbehandlung — Fehlerstruktur und Fehlercodes
- Lokale Entwicklungsumgebung — Backend lokal starten