Every endpoint expects
Authorization: Bearer <api-key>. See API reference → Authentication.
0. (Optional) List current available jobs
CallGET /jobs.
Query params: pageIndex (default 1), pageSize (default 20, max 100).
qodeJobId in step 2 if found.
1. Create a job → get qodeJobId
Call POST /jobs.
title, description. Optional: language (default EN).
Send
description as rich text — HTML markup (<p>, <ul>, <br>) or at least explicit \n line breaks, minimum 700 characters. The JD is stored and rendered as-is (JD PDF, interview context), so a single flattened plain-text line loses all formatting. It must state a workplace type (On-site/Remote/Hybrid) and a location — a description missing either returns 422 naming what to add.data.qodeJobId — used in steps 2 and 3.
2. Create an interview for a candidate
CallPOST /interviews.
interview_link to the candidate.
3. Get the list of meetings for a qodeJobId
Call GET /interviews?qodeJobId=<id>.
Returns the list of interviews/meetings for that job, each with a meetingId. Needed for step 4.
Status field: isCompleted (enum) per meeting:
Only call step 4 for meetings where
isCompleted is COMPLETED or PARTIALLY_COMPLETE.
4. Get details for a meetingId
Call GET /interviews/{meetingId}/report.
Call this only for meetings with isCompleted = COMPLETED or PARTIALLY_COMPLETE (from step 3) — INCOMPLETED/null meetings have no report data.
Response data fields of interest:
completedAt— set once the interview is finishedtranscript— full scored report (overallScore,skillScore,feedbackSummary,hiringDecision,questionSummary, etc.)
isCompleted is null/INCOMPLETED in step 3): every 30–60s, timeout after ~15 min, retry on 5xx with backoff.