| メソッド | パス | 用途 |
| POST | /login | ログイン {id, password} → {access_token, refresh_token} |
| POST | /token/refresh | {refresh_token} → 新しい access_token |
| POST | /logout | {refresh_token} を無効化 |
| GET | /userinfo | {id, name, password_changed_at} ※要認証 |
| PUT | /password | パスワード変更 {current_password, new_password} → 204 ※要認証 |
| POST | /password/reset | {id, secret_word, new_password} → 204 |
| GET | /projects | プロジェクト一覧 [{id, name}] ※要認証 |
| POST | /projects | 作成 {id, name, files[], folders[]} → {version} |
| GET | /projects/{id} | 取得 {files[], folders[], version}(404 あり) |
| PUT | /projects/{id} | 保存 {files[], folders[], base_version} → {version}。版が進んでいると 409 で {current} を返す |
| PATCH | /projects/{id} | 名前変更 {name} → 204 |
| DELETE | /projects/{id} | 削除 → 204(本家フロントは未使用) |
| GET | /projects/{id}/materials | 教材一覧 [{id, name, kind, folder, updated_at}] |
| GET | /materials/{id}/content | 教材本体を Blob で取得(OpenAPI 未記載・フロントのみ使用) |
| POST | /logs/semantic | 学習ログ送信 {session_id, entries[]} → 204 ※要認証(本家フロントは IndexedDB に保存のみで未送信) |
| POST 他 | /staff/*, /admin/* | 教員・管理者用(学生用フロントは未使用) |