# API Routes Reference **Project:** star-auth-system (new_starr backend) **Base URL:** `/api` **Last updated:** 2026-06-20 --- ## Legend | Symbol | Meaning | |--------|---------| | ๐Ÿ”“ | Public โ€” no authentication required | | ๐Ÿ”‘ | Requires valid JWT (`authenticate`) | | ๐Ÿ‘ค | Requires role: `user / staff / admin` (`requireClient`) | | ๐Ÿง‘โ€๐Ÿ’ผ | Requires role: `staff / admin` (`requireStaff`) | | ๐Ÿ‘‘ | Requires role: `admin` only (`requireAdmin`) | | ๐ŸŒ | `originGuard` exempt โ€” accessible from any client (monitoring tools, browser media elements) | | โšก | Rate-limited separately (`sensitiveOpsLimiter`) | > All routes except Health and `GET /api/auth/google*` are protected by `originGuard` > (requires `Sec-Fetch-Site` header; mutations also require `Origin` in allowlist). --- ## ๐Ÿฅ Health > ๐ŸŒ No auth ยท No originGuard โ€” designed for monitoring tools, load balancers, Kubernetes probes ``` GET /api/health Dashboard โ€” app info, system info, all service connections (human-readable) GET /api/health/ready Readiness โ€” compact 200/503 for machines (Kubernetes, deploy scripts) ``` --- ## ๐Ÿ” Auth > ๐Ÿ”“ Public โ€” no authentication required unless noted ``` GET /api/auth/csrf-token CSRF token for cookie-based clients POST /api/auth/register Create account (sends OTP email) POST /api/auth/verify-otp Verify OTP โ†’ auto-login POST /api/auth/resend-otp Resend OTP email POST /api/auth/login Login with email + password POST /api/auth/refresh Exchange refresh token for new access token POST /api/auth/logout ๐Ÿ”‘ Invalidate current session POST /api/auth/change-password ๐Ÿ”‘ โšก Change password GET /api/auth/google Initiate Google OAuth GET /api/auth/google/callback Google OAuth callback GET /api/auth/google/failed OAuth failure fallback ``` --- ## ๐Ÿ‘ค Client > ๐Ÿ”‘ ๐Ÿ‘ค `authenticate โ†’ requireClient` applied to all routes below unless noted ### Profile & Sessions ``` GET /api/client/profile Own profile PUT /api/client/profile Update own profile POST /api/client/profile/avatar Upload avatar DELETE /api/client/profile/avatar Delete avatar GET /api/client/sessions Own active sessions DELETE /api/client/sessions/:id Revoke a session GET /api/client/achievements Own achievements ``` ### Media ``` GET /api/client/media/stream/:token ๐ŸŒ๐Ÿ”“ Stream S3 asset (JWT auth via URL param, no headers) POST /api/client/media/token ๐Ÿ”‘ Issue a short-lived media token for an S3 asset ``` ### Notifications ``` GET /api/client/notifications/unseen ๐Ÿ”“* Unseen count (* softAuthenticate โ€” returns 0 if unauthenticated) GET /api/client/notifications Paginated notification list PATCH /api/client/notifications/seen-all Mark all notifications seen PATCH /api/client/notifications/:id/seen Mark one notification seen ``` ### Tiers & Payments ``` GET /api/client/tiers/me My active tier GET /api/client/tiers/me/history My tier history GET /api/client/tiers/me/payments My payment history GET /api/client/tiers/plans All available plans POST /api/client/tiers/checkout/order โšก Create PayPal order (tier upgrade) POST /api/client/tiers/checkout/capture โšก Capture PayPal payment POST /api/client/tiers/checkout/cancel โšก Cancel PayPal order POST /api/client/tiers/checkout/refund โšก Request refund ``` ### Courses ``` GET /api/client/courses Paginated course list GET /api/client/courses/uuid/:uuid Course by UUID GET /api/client/courses/unit/uuid/:uuid Unit by UUID GET /api/client/courses/unit/uuid/:uuid/lessons Lessons by unit UUID GET /api/client/courses/lesson/uuid/:uuid Lesson by UUID GET /api/client/courses/:courseId Single course GET /api/client/courses/:courseId/units/:unitId Single unit GET /api/client/courses/:courseId/units/:unitId/lessons/:lessonId Single lesson GET /api/client/courses/:courseId/units/:unitId/quiz Unit quiz (no answers) GET /api/client/courses/:courseId/assessment Course assessment (no answers) POST /api/client/courses/:courseId/units/:unitId/quiz/:quizId/submit Submit unit quiz POST /api/client/courses/:courseId/assessment/:assessmentId/submit Submit course assessment ``` ### Course Purchases ``` GET /api/client/course-purchases My course purchases POST /api/client/course-purchases/order โšก Create PayPal order (course purchase) POST /api/client/course-purchases/capture โšก Capture payment POST /api/client/course-purchases/cancel โšก Cancel order ``` ### Groups & Tasks ``` GET /api/client/groups My groups GET /api/client/groups/:groupId Single group GET /api/client/groups/:groupId/task-lists Task lists (?status=ongoing|done|overdue) GET /api/client/groups/:groupId/task-lists/:taskListId Single task list GET /api/client/groups/:groupId/task-lists/:taskListId/tasks/:taskId Task + requirements + latest completion GET /api/client/groups/:groupId/task-lists/:taskListId/tasks/:taskId/progress Full progress snapshot GET /api/client/groups/:groupId/task-lists/:taskListId/tasks/:taskId/completions/latest Latest completion GET /api/client/groups/:groupId/task-lists/:taskListId/tasks/:taskId/completions Full completion history POST /api/client/groups/:groupId/task-lists/:taskListId/tasks/:taskId/completions โšก Submit task completion GET /api/client/groups/:groupId/task-lists/:taskListId/tasks/:taskId/completions/:completionId/files/:fileId/stream Stream a completion file GET /api/client/groups/:groupId/task-lists/:taskListId/tasks/:taskId/completions/:completionId/files/:fileId/download Download a completion file POST /api/client/groups/:groupId/task-lists/:taskListId/tasks/:taskId/upload โšก Upload file to S3 (returns file metadata) POST /api/client/groups/:groupId/task-lists/:taskListId/tasks/:taskId/requirements/:requirementId/visit โšก UPSERT link visit POST /api/client/groups/:groupId/task-lists/:taskListId/tasks/:taskId/requirements/:requirementId/progress โšก UPSERT lesson progress ``` ### Advertisements ``` GET /api/client/advertisements/active Active advertisement (?type=hero) POST /api/client/advertisements/:advertisementId/click Track ad click ``` ### Certificates ``` GET /api/client/certificates/:courseUuid Download course completion certificate ``` --- ## ๐Ÿง‘โ€๐Ÿ’ผ Staff > ๐Ÿ”‘ ๐Ÿง‘โ€๐Ÿ’ผ `authenticate โ†’ requireStaff` ``` GET /api/staff/users Paginated user list (non-admins only) GET /api/staff/users/:id Single non-admin user PUT /api/staff/users/:id/status Activate or deactivate a user GET /api/staff/users/:id/sessions User's active sessions ``` --- ## ๐Ÿ‘‘ Admin > ๐Ÿ”‘ ๐Ÿ‘‘ `authenticate โ†’ requireAdmin โ†’ adminLimiter` applied to all routes below ### Dashboard ``` GET /api/admin/dashboard/users User stats overview GET /api/admin/dashboard/groups Group stats overview ``` ### Profile ``` GET /api/admin/profile Own admin profile PUT /api/admin/profile Update own profile POST /api/admin/profile/avatar Upload avatar DELETE /api/admin/profile/avatar Delete avatar ``` ### Users ``` GET /api/admin/users Paginated user list GET /api/admin/users/field-values Filter field values (for dropdowns) GET /api/admin/users/archived Archived/deactivated users POST /api/admin/users/staff โšก Create a staff account POST /api/admin/users/bulk/restore โšก Bulk restore users DELETE /api/admin/users/bulk โšก Bulk deactivate users GET /api/admin/users/:id Single user PUT /api/admin/users/:id โšก Update user DELETE /api/admin/users/:id โšก Deactivate user POST /api/admin/users/:id/restore โšก Restore user GET /api/admin/users/:id/sessions User's active sessions DELETE /api/admin/users/:id/sessions/:sid โšก Terminate a user session GET /api/admin/users/:id/achievements User's achievements ``` ### Groups ``` GET /api/admin/groups Paginated group list GET /api/admin/groups/field-values Filter field values GET /api/admin/groups/archived Archived groups POST /api/admin/groups/bulk/restore โšก Bulk restore groups DELETE /api/admin/groups/bulk โšก Bulk deactivate groups POST /api/admin/groups โšก Create group GET /api/admin/groups/:gid Single group PUT /api/admin/groups/:gid โšก Update group PATCH /api/admin/groups/:gid/deactivate โšก Deactivate group PATCH /api/admin/groups/:gid/restore โšก Restore group GET /api/admin/groups/:gid/users Users in group GET /api/admin/groups/:gid/users/add Users not yet in group (for add dialog) POST /api/admin/groups/:gid/users โšก Add user to group DELETE /api/admin/groups/:gid/users โšก Remove user from group ``` ### Assets ``` GET /api/admin/assets Paginated asset list GET /api/admin/assets/archived Archived assets GET /api/admin/assets/field-values Filter field values POST /api/admin/assets Upload asset (file + optional thumbnail) DELETE /api/admin/assets/bulk โšก Bulk archive assets PATCH /api/admin/assets/bulk-restore Bulk restore assets GET /api/admin/assets/:assetId Single asset PATCH /api/admin/assets/:assetId โšก Update asset PATCH /api/admin/assets/:assetId/restore โšก Restore asset DELETE /api/admin/assets/:assetId โšก Archive asset ``` ### Courses ``` GET /api/admin/courses Paginated course list POST /api/admin/courses Create course GET /api/admin/courses/field-values Filter field values GET /api/admin/courses/flat All courses (flat list, no pagination) GET /api/admin/courses/units-flat All units (flat list) GET /api/admin/courses/lessons-flat All lessons (flat list) GET /api/admin/courses/archives Archived courses DELETE /api/admin/courses/bulk Bulk archive courses PATCH /api/admin/courses/restore/bulk Bulk restore courses GET /api/admin/courses/archives/:courseId Archived course detail GET /api/admin/courses/:courseId Single course PUT /api/admin/courses/:courseId Update course DELETE /api/admin/courses/:courseId Archive course PATCH /api/admin/courses/:courseId/restore Restore course GET /api/admin/courses/:courseId/instructors Course instructors PUT /api/admin/courses/:courseId/instructors Sync instructors (replace) GET /api/admin/courses/:courseId/prerequisites Course prerequisites PUT /api/admin/courses/:courseId/prerequisites Sync prerequisites (replace) GET /api/admin/courses/:courseId/field-values Unit filter field values ``` #### Course Assessment ``` GET /api/admin/courses/:courseId/assessment Assessment POST /api/admin/courses/:courseId/assessment Create assessment GET /api/admin/courses/:courseId/assessment/archives Archived assessment PATCH /api/admin/courses/:courseId/assessment/:assessmentId Update assessment DELETE /api/admin/courses/:courseId/assessment/:assessmentId Delete assessment PATCH /api/admin/courses/:courseId/assessment/:assessmentId/restore Restore assessment GET /api/admin/courses/:courseId/assessment/:assessmentId/questions Questions POST /api/admin/courses/:courseId/assessment/:assessmentId/questions Create question DELETE /api/admin/courses/:courseId/assessment/:assessmentId/questions/bulk Bulk archive questions PATCH /api/admin/courses/:courseId/assessment/:assessmentId/questions/restore/bulk Bulk restore questions GET /api/admin/courses/:courseId/assessment/:assessmentId/questions/archives/:questionId Archived question PATCH /api/admin/courses/:courseId/assessment/:assessmentId/questions/:questionId Update question DELETE /api/admin/courses/:courseId/assessment/:assessmentId/questions/:questionId Delete question PATCH /api/admin/courses/:courseId/assessment/:assessmentId/questions/:questionId/restore Restore question ``` #### Units ``` GET /api/admin/courses/:courseId/units Unit list POST /api/admin/courses/:courseId/units Create unit GET /api/admin/courses/:courseId/units/archives Archived units DELETE /api/admin/courses/:courseId/units/bulk Bulk archive units PATCH /api/admin/courses/:courseId/units/restore/bulk Bulk restore units GET /api/admin/courses/:courseId/units/archives/:unitId Archived unit detail GET /api/admin/courses/:courseId/units/:unitId Single unit PUT /api/admin/courses/:courseId/units/:unitId Update unit DELETE /api/admin/courses/:courseId/units/:unitId Archive unit PATCH /api/admin/courses/:courseId/units/:unitId/restore Restore unit GET /api/admin/courses/:courseId/units/:unitId/field-values Lesson filter field values ``` #### Unit Quiz ``` GET /api/admin/courses/:courseId/units/:unitId/quiz Quiz POST /api/admin/courses/:courseId/units/:unitId/quiz Create quiz GET /api/admin/courses/:courseId/units/:unitId/quiz/archives Archived quiz PATCH /api/admin/courses/:courseId/units/:unitId/quiz/:quizId Update quiz DELETE /api/admin/courses/:courseId/units/:unitId/quiz/:quizId Delete quiz PATCH /api/admin/courses/:courseId/units/:unitId/quiz/:quizId/restore Restore quiz GET /api/admin/courses/:courseId/units/:unitId/quiz/:quizId/questions Questions POST /api/admin/courses/:courseId/units/:unitId/quiz/:quizId/questions Create question DELETE /api/admin/courses/:courseId/units/:unitId/quiz/:quizId/questions/bulk Bulk archive questions PATCH /api/admin/courses/:courseId/units/:unitId/quiz/:quizId/questions/restore/bulk Bulk restore questions GET /api/admin/courses/:courseId/units/:unitId/quiz/:quizId/questions/archives/:questionId Archived question PATCH /api/admin/courses/:courseId/units/:unitId/quiz/:quizId/questions/:questionId Update question DELETE /api/admin/courses/:courseId/units/:unitId/quiz/:quizId/questions/:questionId Delete question PATCH /api/admin/courses/:courseId/units/:unitId/quiz/:quizId/questions/:questionId/restore Restore question ``` #### Lessons ``` GET /api/admin/courses/:courseId/units/:unitId/lessons Lesson list POST /api/admin/courses/:courseId/units/:unitId/lessons Create lesson GET /api/admin/courses/:courseId/units/:unitId/lessons/archives Archived lessons DELETE /api/admin/courses/:courseId/units/:unitId/lessons/bulk Bulk archive lessons PATCH /api/admin/courses/:courseId/units/:unitId/lessons/restore/bulk Bulk restore lessons GET /api/admin/courses/:courseId/units/:unitId/lessons/archives/:lessonId Archived lesson detail GET /api/admin/courses/:courseId/units/:unitId/lessons/:lessonId Single lesson PUT /api/admin/courses/:courseId/units/:unitId/lessons/:lessonId Update lesson DELETE /api/admin/courses/:courseId/units/:unitId/lessons/:lessonId Archive lesson PATCH /api/admin/courses/:courseId/units/:unitId/lessons/:lessonId/restore Restore lesson GET /api/admin/courses/:courseId/units/:unitId/lessons/:lessonId/page Lesson page content PUT /api/admin/courses/:courseId/units/:unitId/lessons/:lessonId/page Upsert lesson page content ``` ### Task Lists ``` GET /api/admin/task-lists Paginated task list collection GET /api/admin/task-lists/archived Archived task lists GET /api/admin/task-lists/field-values Filter field values POST /api/admin/task-lists โšก Create task list POST /api/admin/task-lists/bulk-archive โšก Bulk archive task lists POST /api/admin/task-lists/bulk-restore โšก Bulk restore task lists GET /api/admin/task-lists/:taskListId Single task list PATCH /api/admin/task-lists/:taskListId โšก Update task list DELETE /api/admin/task-lists/:taskListId โšก Archive task list PATCH /api/admin/task-lists/:taskListId/restore โšก Restore task list ``` #### Task List โ†’ Groups ``` GET /api/admin/task-lists/:taskListId/groups Groups assigned to this task list POST /api/admin/task-lists/:taskListId/groups/assign โšก Assign groups POST /api/admin/task-lists/:taskListId/groups/unassign โšก Unassign groups ``` #### Task List โ†’ Tasks ``` GET /api/admin/task-lists/:taskListId/tasks Task list's tasks GET /api/admin/task-lists/:taskListId/tasks/archived Archived tasks GET /api/admin/task-lists/:taskListId/tasks/field-values Filter field values POST /api/admin/task-lists/:taskListId/tasks โšก Create task POST /api/admin/task-lists/:taskListId/tasks/bulk-archive โšก Bulk archive tasks POST /api/admin/task-lists/:taskListId/tasks/bulk-restore โšก Bulk restore tasks GET /api/admin/task-lists/:taskListId/tasks/:taskId Single task PATCH /api/admin/task-lists/:taskListId/tasks/:taskId โšก Update task DELETE /api/admin/task-lists/:taskListId/tasks/:taskId โšก Archive task PATCH /api/admin/task-lists/:taskListId/tasks/:taskId/restore โšก Restore task ``` #### Task List โ†’ Tasks โ†’ Completions ``` GET /api/admin/task-lists/:taskListId/tasks/:taskId/completions All completions GET /api/admin/task-lists/:taskListId/tasks/:taskId/completions/user/:userId Completions by user POST /api/admin/task-lists/:taskListId/tasks/:taskId/completions/bulk-archive โšก Bulk archive POST /api/admin/task-lists/:taskListId/tasks/:taskId/completions/bulk-restore โšก Bulk restore GET /api/admin/task-lists/:taskListId/tasks/:taskId/completions/:completionId Single completion DELETE /api/admin/task-lists/:taskListId/tasks/:taskId/completions/:completionId โšก Archive completion PATCH /api/admin/task-lists/:taskListId/tasks/:taskId/completions/:completionId/restore โšก Restore completion ``` ### Tiers ``` GET /api/admin/tiers Paginated tier/plan list POST /api/admin/tiers Create plan GET /api/admin/tiers/field-values Filter field values POST /api/admin/tiers/bulk/archive Bulk archive plans POST /api/admin/tiers/bulk/restore Bulk restore plans GET /api/admin/tiers/payments All payments (paginated) GET /api/admin/tiers/payments/field-values Payment filter field values GET /api/admin/tiers/payments/:id Single payment record GET /api/admin/tiers/users/:id/tiers Tiers assigned to a user POST /api/admin/tiers/users/tiers/grant โšก Manually grant a tier to a user PATCH /api/admin/tiers/users/tiers/:tid/revoke โšก Revoke a user's tier GET /api/admin/tiers/:id Single plan PUT /api/admin/tiers/:id Update plan DELETE /api/admin/tiers/:id Archive plan POST /api/admin/tiers/:id/restore Restore plan GET /api/admin/tiers/:id/courses Courses in this plan POST /api/admin/tiers/:id/courses Sync courses in plan (replace) ``` ### Categories ``` GET /api/admin/categories All categories POST /api/admin/categories Create category GET /api/admin/categories/:id Single category PUT /api/admin/categories/:id Update category DELETE /api/admin/categories/:id Archive category POST /api/admin/categories/:id/restore Restore category ``` ### Products ``` GET /api/admin/products/courses/:courseId/product Course product pricing PUT /api/admin/products/courses/:courseId/product Upsert course product DELETE /api/admin/products/courses/:courseId/product Remove course product GET /api/admin/products/courses/:courseId/categories Course categories POST /api/admin/products/courses/:courseId/categories Sync course categories (replace) ``` ### Advertisements ``` GET /api/admin/advertisements Paginated list GET /api/admin/advertisements/archived Archived advertisements GET /api/admin/advertisements/field-values Filter field values POST /api/admin/advertisements Create advertisement DELETE /api/admin/advertisements/bulk โšก Bulk archive PATCH /api/admin/advertisements/bulk-restore Bulk restore GET /api/admin/advertisements/:advertisementId Single advertisement PATCH /api/admin/advertisements/:advertisementId โšก Update advertisement PATCH /api/admin/advertisements/:advertisementId/restore โšก Restore advertisement DELETE /api/admin/advertisements/:advertisementId โšก Archive advertisement ``` ### Notifications ``` GET /api/admin/notifications Paginated notification list GET /api/admin/notifications/unseen Unseen count PATCH /api/admin/notifications/seen-all Mark all seen PATCH /api/admin/notifications/:id/seen Mark one seen ``` --- ## Route Count Summary | Scope | Routes | |---------|--------| | Health | 2 | | Auth | 11 | | Client | 43 | | Staff | 4 | | Admin | 113 | | **Total** | **173** |