Base path /api. Bearer token in Authorization, or the httpOnly cookie set at
login. Interactive docs at /docs outside production.
| Method | Path | Notes |
|---|---|---|
| POST | /auth/register |
Creates the account, profile and settings |
| POST | /auth/login |
Returns an access token; sets refresh cookie |
| POST | /auth/refresh |
Rotates the refresh token — single use |
| POST | /auth/logout |
Revokes the refresh token |
| POST | /auth/password-reset/request |
Always 202, never reveals whether the account exists |
| POST | /auth/password-reset/confirm |
Revokes all sessions on success |
| GET/PATCH | /auth/me, /auth/me/profile, /auth/me/settings |
| Method | Path | Notes |
|---|---|---|
| POST | /session/start |
Returns the session and the coach's opening line |
| POST | /session/{id}/message |
One coached turn |
| POST | /session/{id}/end |
Summary, streak and totals |
| GET | /session/{id}, /session |
Transcript; recent sessions |
A turn returns the coach's reply plus corrections[] (original / corrected /
natural / professional / executive, category, severity, explanation),
practice_required, repeat_sentence, follow_up_question, and measured
fillers. The structured payload is rendered as UI — never shown as raw JSON.
| Method | Path | Notes |
|---|---|---|
| GET | /speech/providers |
Where speech runs; whether the client transcribes |
| POST | /speech/transcribe |
Audio or a browser transcript. With create_turn=true this is the whole voice loop in one call |
| POST | /speech/evaluate |
Scores an answer, bounded by what was measured |
| POST | /speech/tts |
Audio, or voice settings for client-side synthesis |
GET /dashboard · GET /learning-plan · GET /learning-plan/today?quick= ·
POST /learning-plan/day/{n}/regenerate|complete|mission ·
GET/POST /vocabulary · POST /vocabulary/{id}/review · POST /phrases ·
GET /mistakes · GET /mistakes/recurring · GET /progress ·
GET /progress/series/{skill} · POST /progress/rollup
GET/PUT /training/thinking, POST /training/thinking/advance ·
POST /training/rapid/start, /rapid/{id}/answer ·
POST /training/shadowing/line, /shadowing/attempt ·
POST /training/challenge/start, /challenge/{id}/submit ·
GET /training/storytelling/prompt, POST /training/storytelling/analyse ·
GET /training/explain/topics, /explain/plan, /listening ·
GET /training/roleplay/scenarios, POST /training/roleplay/start,
/roleplay/{id}/turn, /roleplay/{id}/debrief ·
POST /training/interview/start, /emergency/start ·
GET /training/disagreement/drills, POST /training/disagreement/check
GET /assessment/sections (includes the published CEFR bands and score weights) ·
POST /assessment/start, /{id}/submit, /{id}/complete · GET /assessment/results ·
GET /reports/daily|weekly|history|comparison|final|certificate ·
GET /achievements, POST /achievements/evaluate
GET /privacy/export · DELETE /privacy/conversations|recordings|memory ·
POST /privacy/account/delete (password required) · POST /privacy/logout-everywhere
GET /admin/users, PATCH /admin/users/{id} · GET/PUT /admin/prompts[/{name}] ·
GET /admin/providers|config|usage|audit|scenarios|vocabulary ·
PATCH /admin/scenarios/{code} · POST /admin/vocabulary
- Ownership failures return 404, not 403, so IDs are not confirmed.
- Metrics always carry
confidenceandmethod;value: nullwithconfidence: "unavailable"is a valid, expected answer. - Rate limits: 10/min auth, 60/min speech and turns, 20/min destructive privacy.
- Errors are
{"detail": "..."}. Validation errors are FastAPI's 422 shape.