- Access token: JWT signed with
JWT_SECRET, includessub,email,role,exp. - Refresh token: opaque UUID stored server-side in Redis with TTL.
- Roles:
user: can manage own profile, interviews, schedules, and analytics.admin: has all user permissions and access to platform analytics endpoints.
draft: interview is created, not started.scheduled: interview hasscheduled_atin the future.in_progress: active chat session.completed: interview finished with final report.cancelled: cancelled before completion.
Allowed transitions:
draft -> scheduleddraft -> in_progressscheduled -> in_progressscheduled -> cancelledin_progress -> completeddraft -> cancelled
Base path: /api/v1
POST /auth/signup- request:
{ "email": "x@y.com", "password": "...", "role": "user|admin" } - response:
{ "id": "...", "email": "...", "role": "user" }
- request:
POST /auth/login- request:
{ "email": "...", "password": "..." } - response:
{ "access_token": "...", "refresh_token": "...", "token_type": "bearer" }
- request:
POST /auth/refresh- request:
{ "refresh_token": "..." } - response:
{ "access_token": "...", "token_type": "bearer" }
- request:
GET /profile/mePUT /profile/me- request:
{ "years_experience": 2, "tech_stacks": ["python", "angular"], "target_role": "SDE-2", "target_company": "Any" }
- request:
POST /interviews- request:
{ "domain": "dsa|cs_fundamentals|lld|hld", "difficulty": "easy|medium|hard|expert", "scheduled_at": "optional-iso8601" }
- request:
POST /interviews/{id}/startPOST /interviews/{id}/messages- request:
{ "content": "candidate answer..." } - response includes rubric score + next question.
- request:
POST /interviews/{id}/end- response includes final report.
GET /interviews/{id}/result
GET /schedules/upcomingPUT /schedules/{interview_id}/reschedulePOST /schedules/{interview_id}/cancel
GET /analytics/meGET /admin/analytics(adminonly)
Service: InterviewEngineService
GenerateNextQuestion(GenerateNextQuestionRequest) returns (GenerateNextQuestionResponse)EvaluateAnswer(EvaluateAnswerRequest) returns (EvaluateAnswerResponse)FinalizeInterviewReport(FinalizeInterviewReportRequest) returns (FinalizeInterviewReportResponse)
The chat-service is the only externally reachable service. All AI operations are proxied through gRPC.