Candidate Flow
Device Check
Pre-interview camera and microphone verification to ensure a smooth live session.
Before joining the live interview, candidates complete a device pre-check to verify that their camera and microphone are working correctly. This prevents technical issues mid-interview and sets audio levels for the AI interview agent.
Page: /interview/pre-check/:token
The pre-check page verifies three requirements before enabling the Start Interview button:
| Check | Status | Requirement |
|---|---|---|
| Camera | Pass / Fail | getUserMedia video stream accessible |
| Microphone | Pass / Fail | getUserMedia audio stream accessible, non-zero level detected |
| Browser | Pass / Fail | WebSocket support (all modern browsers pass) |
Check Flow
text
/interview/pre-check/abc123token
│
├── Request camera + microphone permissions
│ └── navigator.mediaDevices.getUserMedia({ video: true, audio: true })
│
├── Show live camera preview (muted)
│
├── Analyze audio level via AnalyserNode
│ └── Pass if RMS > threshold over 3 seconds
│
├── All 3 checks pass → "Start Interview" button enabled
│
└── POST /candidate-access/abc123token/start
└── { x-session-token: sessionToken }
└── Response: { sessionId, tenantId, wsUrl }
└── Navigate → /interview/<sessionId>POST /candidate-access/:token/start
Called after all device checks pass. Creates the live session and returns the WebSocket URL and session ID needed to connect to the Vert.x edge.
bash
curl -X POST http://localhost:3009/api/v1/candidate-access/abc123token/start \
-H "x-session-token: session-jwt-token"Response 201
{
"sessionId": "session-uuid",
"tenantId": "tenant-uuid",
"wsUrl": "ws://localhost:8080"
}Device Check States
| State | Icon | Action Available |
|---|---|---|
| Not tested | Gray circle | Test Device button |
| Testing | Spinner | None (in progress) |
| Pass | Green check | Retest button |
| Fail | Red X | Fix & Retry button |
Permission Denied Handling
If the browser blocks camera/microphone access, the page shows actionable instructions specific to the browser (Chrome, Firefox, Safari).
| Browser | Fix Instructions |
|---|---|
| Chrome | Click the lock icon in the address bar → Allow camera and microphone |
| Firefox | Click the shield icon → Permissions → Allow camera and microphone |
| Safari | System Preferences → Privacy & Security → Camera/Microphone → Allow |
sessionStorage Written
typescript
// After start call succeeds, written by the pre-check page
sessionStorage.setItem('interview_tenant_id', data.tenantId);
// Navigate to live interview
router.push(`/interview/${data.sessionId}`);The pre-check page does not record any video or audio. The camera preview is rendered locally only (muted, no upload). Audio level analysis happens in-browser via the Web Audio API.
Was this page helpful?