KOHAMI Docs
ReferenceREST API

REST API

Cette page est l'index du catalogue REST. Phase A pose la structure et fournit un exemple. Phase B documente l'ensemble des endpoints jalon-par-jalon avec le composant EndpointReference.

Approche

La référence est manuelle (cf. ADR Phase A) plutôt qu'auto-générée depuis l'OpenAPI. Justification :

  • Le composant EndpointReference permet d'inclure du contexte métier (invariants, idempotency, rate limits, exemples curl, JS, Kotlin) que l'OpenAPI ne capture pas
  • La cadence d'évolution back-end est lente (un jalon par mois en moyenne), la rédaction manuelle reste tenable
  • Le snapshot OpenAPI brut reste exposé pour outillage (Postman, generators), voir section ci-dessous

Spec OpenAPI brute

Pour les outils qui consomment de l'OpenAPI 3.0 (Postman, openapi-generator, kreya, ...) :

  • Statique embarqué dans la doc : /openapi.json
  • Endpoint live dev : curl https://api-dev.195-154-239-8.sslip.io/docs-json | jq
  • Téléchargement direct : openapi.json

Endpoints actuels (snapshot Jalon 2)

MéthodePathDescription
GET/healthLiveness probe, { status: "ok" }
POST/realtime/tokenIssue un token LiveKit accessToken pour un senior authentifié
POST/v1/auth/loginLogin senior, aidant ou admin
POST/v1/auth/refreshRotation du refresh token
POST/v1/auth/2fa/enrollProvisionne le secret TOTP (aidant, admin)
POST/v1/auth/2fa/verifyVérifie le code TOTP
POST/v1/auth/password-reset/requestDemande de réinitialisation par email
POST/v1/auth/password-reset/applyApplique un token de réinitialisation
GET/v1/profileProfil du senior connecté
GET/v1/consentsCatégories de consentement actives
PUT/v1/consentsMise à jour des consentements granulaires
POST/v1/alerts/button-pressedIngestion bouton d'alerte (idempotency requis)
GET/v1/alerts/trail/:seniorIdTrail d'alertes (aidant scope, RLS)
GET/v1/admin/alerts/recentDashboard admin, alertes récentes
POST/v1/admin/caregivers/:id/reactivation-noticeRéactiver un aidant désactivé
GET/v1/onboarding/caregiver-configConfiguration aidant onboarding
PUT/v1/onboarding/caregiver-configMise à jour configuration onboarding
POST/v1/onboarding/postponeReporter l'étape d'onboarding en cours
POST/v1/onboarding/resumeReprendre l'onboarding après un report
GET/v1/assistance/sessionsListe sessions d'assistance
GET/v1/export/user-dataExport RGPD complet (ZIP signé)

Vues admin par senior (dashboard /seniors/:id)

MéthodePathDescription
GET/v1/admin/seniors/:seniorId/caregivers/cascadeVue cascade 3 tiers + dernier trail (PII masquée, INV-T07b)
GET/v1/admin/seniors/:seniorId/remindersRappels à venir (fenêtre ?within_days=, filtre ?kind=)
GET/v1/admin/seniors/:seniorId/reminders/allVue brute table reminders (tous statuses + tous kinds + passé + futur), filtres opt-in ?status=, ?kind=, ?from=, ?to=. Pagination cursor base64url (created_at DESC, id DESC), ?limit=1..200 (default 50)
GET/v1/admin/seniors/:seniorId/mood-entriesJournal humeur brut, 1 row / capture mood_scores. Filtres ?source= (enum per_turn, end_of_day, manual_entry, onboarding_j7), ?from=, ?to=. Pagination cursor (recorded_at DESC, id DESC), ?limit=1..200
GET/v1/admin/seniors/:seniorId/absence-modeÉtat du mode absence (INV-S07)
PUT/v1/admin/seniors/:seniorId/absence-modeActiver / désactiver le mode absence ({ active, until? }, until requis si active=true et strictement futur)
POST/v1/admin/seniors/:seniorId/mood-entries/seed-testDev seed du journal humeur ({ days?: 1..30 default 7 }). Bloqué en prod sauf ALLOW_TEST_SEED_IN_PROD=true. Rate-limit 10 / actor / heure

Administration users + stats

MéthodePathDescription
GET/v1/admin/usersListe users paginée (?cursor=&limit=1..100 default 50). Filtres ?role= (enum senior, aidant, admin), ?include_deleted= (enum true, false, default false), ?search= (1..256, trim, ILIKE %search% case-insensitive sur users.email + seniors.display_name). La réponse expose total_count (COUNT(*) OVER (), respecte les filtres)
GET/v1/admin/users/:idDétail user
PUT/v1/admin/users/:idModifier role / senior_id
DELETE/v1/admin/users/:idSoft-delete RGPD
GET/v1/admin/users/:id/exportExport JSON minimal (full export = BLOC-14)
POST/v1/admin/stats/tokens/seed-testDev seed token_usage. Body : days_back? (1..90, default 30), models? (array string), flux? (array enum cache, memory, agent). Réponse : senior_id, days_back, models, flux, seeded_count, tokens_used_total, cost_eur_micros_total. Bloqué en prod sauf ALLOW_TEST_SEED_IN_PROD=true. Rate-limit 5 / actor / heure

La liste n'est pas exhaustive. Phase B remplit EndpointReference pour chaque endpoint.

Exemple, EndpointReference

Cet exemple illustre le format ciblé pour Phase B :

POST/v1/auth/login

Échange email + password (+ TOTP pour aidant/admin) contre une paire accessToken + refreshToken JWT.

Auth
Public
Idempotency
Optional
Rate limit
5/min/IP

Request body

ChampTypeRequisNotes
emailstringOuiFormat RFC 5322
passwordstringOuiMin 12 caractères
role"senior" | "aidant" | "admin"OuiDétermine 2FA
totpCodestringConditionnelRequis pour aidant/admin

Response body

ChampTypeNotes
accessTokenstringJWT 15 min
refreshTokenstringJWT 7 jours (senior) ou 24h (aidant/admin)
expiresInnumberSecondes
requiresTwoFactortruePrésent si TOTP attendu

Error codes

HTTPCauseBody
400Payload mal formé{ message: "Validation failed", details: [...] }
401Email ou password invalide{ message: "Invalid credentials" }
409TOTP requis mais non fourni{ requiresTwoFactor: true }
429Rate limit dépasséHeader Retry-After

Évolutions à venir

Phase B remplira la page avec une EndpointReference par endpoint et la regroupera par bounded context (auth, conversation, security, profile, administration). Voir la liste prévisionnelle dans DESIGN-V2.md Section 9.