Candidate Flow

Candidate Flow

The end-to-end candidate experience from receiving an interview link to completing the live AI interview.

When a recruiter approves an interview plan, the system generates a time-limited, token-based interview link and sends it to the candidate. The candidate follows a guided two-step flow: device pre-check to confirm camera and microphone are working, then the live AI-conducted interview session.

Flow Steps

StepPageDescription
1/interview/join/:tokenView interview details and proceed to device check
2/interview/pre-check/:tokenTest camera and microphone before joining
3/interview/:sessionIdLive AI interview — audio + real-time conversation

Guides

Interview Link

The interview link is generated when the recruiter approves the plan. It contains a signed access token that expires in 7 days (configurable per tenant).

text
{YOUR_APP_URL}/interview/join/abc123token
                                    ^^^^^^^^^^^
                                    Access token embedded in URL path
PropertyValue
Token typeURL-safe signed string (UUID-based)
Expiry7 days from generation (configurable)
Auth methodToken itself is the credential — no JWT required
Single-useNo — candidate can rejoin if session disconnects

Live Interview — WebSocket Connection

Once the candidate starts the session, the frontend connects to the Vert.x WebSocket edge. The connection uses sessionId and tenantId as query parameters. Vert.x registers the connection in Redis so agent audio responses can be routed back to the correct WebSocket regardless of which interviewer pod processes the audio.

text
wss://mayaedge.teamcast.ai/ws?sessionId=<session-uuid>&tenantId=<tenant-uuid>

Audio frames sent as JSON text:
  { "type": "AUDIO", "sessionId": "...", "tenantId": "...", "streaming": "start", "data": "" }
  { "type": "AUDIO", "sessionId": "...", "tenantId": "...", "streaming": "chunk", "data": "<base64>" }
  { "type": "AUDIO", "sessionId": "...", "tenantId": "...", "streaming": "end",   "data": "" }
  { "type": "AUDIO", "sessionId": "...", "tenantId": "...", "data": "<base64 full chunk>" }

Messages received from agent:
  { "type": "TRANSCRIPTION",  "text": "..." }          ← live interim transcript
  { "type": "AGENT_RESPONSE", "data": "<base64 PCM L16 24kHz>" } ← agent TTS audio
  { "type": "INTERVIEW_ENDED" }                         ← session complete

Session Storage Keys

The candidate frontend stores session state in sessionStorage (cleared when the browser tab closes):

KeyValueSet At
interview_tokenURL access tokenOn join page load
interview_candidate_nameCandidate full nameOn join page load
interview_positionJob position titleOn join page load
interview_tenant_idTenant UUIDAfter start call
Candidates do not need to create an account. The interview link contains a signed access token that is sufficient to join the session.
Was this page helpful?