Webhook event
A candidate's AI Interview was scored
candidate.interview_completedSent once, when an applicant who was already reported finishes their AI Interview and it is scored: on a job that screens the resume first and then interviews. It carries the recording, transcript and chapters in `interview`, and the updated score and summary. A `candidate.status_changed` event is also sent if the interview changed the status. On a job that interviews applicants, `candidate.screened` already carries the interview, so this event is not sent.
Alfa sends this event to your webhook endpoint as a signed POST. How to verify and acknowledge webhooks
Headers
Alfa-Signaturestringrequired`t=<unix seconds>,v1=<hex HMAC-SHA256 of "<t>.<raw body>">`, keyed with the endpoint's signing secret. Reject a request whose signature does not match or whose timestamp is more than 5 minutes from your clock.
Payload
idstringrequiredThe event id. Deliveries can repeat; ignore an id you have already processed.
type"candidate.interview_completed"requiredSent once, when an applicant who was already reported finishes their AI Interview and it is scored: on a job that screens the resume first and then interviews. It carries the recording, transcript and chapters in `interview`, and the updated score and summary. A `candidate.status_changed` event is also sent if the interview changed the status. On a job that interviews applicants, `candidate.screened` already carries the interview, so this event is not sent.
apiVersion"v1"requiredThe API version the payload follows.
occurredAtstringrequiredWhen the event happened.
organizationIdstringrequiredThe company the event belongs to (its Company ID).
jobIdinteger | nullrequiredAlfa's id for the job.
externalJobIdstring | nullrequiredThe ATS job the Alfa job is linked to.
candidateobject | nullrequiredThe candidate as of this event.
Show fields
candidateIdstringrequiredAlfa's id for the candidate: `app_…` for an applicant, `src_…` for a candidate Alfa sourced.
externalCandidateIdstring | nullrequiredYour candidate id, for applicants you sent through applicant intake.
externalApplicationIdstring | nullrequiredYour application id, for applicants you sent through applicant intake.
firstNamestring | nullrequiredFirst name.
lastNamestring | nullrequiredLast name.
emailstring | nullrequiredEmail address.
phonestring | nullrequiredPhone number, when known.
linkedinUrlstring | nullrequiredLinkedIn profile URL, when known.
source"application" | "sourced"required`application` for an applicant, `sourced` for a candidate Alfa found and approached.
channel"linkedin" | "indeed" | "totaljobs" | "cv_library" | "glassdoor" | "monster" | "ziprecruiter" | "other_job_board" | "google" | "social_media" | "company_website" | "referral" | "ats" | "alfa_network" | "direct" | "sourced" | "other"requiredWhere the candidate came from: the job board or other channel an applicant applied through, `ats` for an applicant you sent, or `sourced` for a candidate Alfa found and approached. An applicant with no tracking is counted as `alfa_network`, or `direct` for a company that does not use Alfa outreach.
status"shortlisted" | "suitable" | "not_suitable" | "sourced_potential"required`shortlisted`: a recruiter shortlisted them. `suitable` or `not_suitable`: the screening outcome. `sourced_potential`: a sourced candidate who fits the job.
statusUpdatedAtstringrequiredWhen the status last changed. Keep the newest one you receive.
scorenumber | nullrequiredThe candidate score from 0 to 100; for a sourced candidate, the sourcing score.
summarystring | nullrequiredAlfa's summary of the candidate against the job.
resumeUrlstring | nullrequiredA signed link to the resume PDF, valid for 24 hours. Null when there is none.
profileUrlstringrequiredThe candidate's page in Alfa, for signed-in recruiters.
interviewobject | nullrequiredThe candidate's AI Interview, on jobs that interview applicants. Null until it is completed.
Show fields
completedAtstringrequiredWhen the candidate finished the AI Interview.
durationSecondsinteger | nullrequiredHow long the interview lasted.
audioOnlybooleanrequiredWhether the candidate took the interview without video.
videoUrlstring | nullrequiredA signed link to the interview recording, valid for 24 hours. Null until the recording is ready.
chaptersobject[]requiredThe recording split into topics.
Show fields
startSecondsnumberrequiredWhere the chapter starts in the recording.
titlestringrequiredWhat the candidate talks about.
transcriptobject[]requiredThe interview, turn by turn.
Show fields
speaker"interviewer" | "candidate"required`interviewer` for Alfa's AI interviewer, `candidate` for the candidate.
textstringrequiredWhat was said.
startSecondsnumberrequiredWhen it was said, from the start of the recording.
resumeobject | nullrequiredThe candidate's resume as structured data, read from the resume file. Null when Alfa holds no resume, which is always the case for a sourced candidate.
Show fields
headlinestring | nullrequiredThe current or most recent job title.
currentEmployerstring | nullrequiredThe current employer.
locationstring | nullrequiredWhere the candidate lives.
yearsExperiencenumber | nullrequiredYears of work experience.
summarystring | nullrequiredThe resume's own summary.
skillsstring[]requiredSkills listed on the resume.
experienceobject[]requiredWork history, most recent first.
Show fields
employerstring | nullrequiredThe employer.
titlestring | nullrequiredThe job title.
locationstring | nullrequiredWhere the job was.
startDatestring | nullrequiredWhen it started, as written on the resume.
endDatestring | nullrequiredWhen it ended; null for a current job.
descriptionstring | nullrequiredWhat the candidate did.
educationobject[]requiredEducation.
Show fields
institutionstring | nullrequiredThe school or university.
degreestring | nullrequiredThe qualification.
fieldOfStudystring | nullrequiredThe subject.
startYearstring | nullrequiredWhen it started.
endYearstring | nullrequiredWhen it ended.
qualificationsobject[]requiredCertificates and licenses.
Show fields
namestring | nullrequiredThe certificate or licence.
issuerstring | nullrequiredWho issued it.
languagesstring[]requiredLanguages, with proficiency when stated.
Responses
- 200Any 2xx status acknowledges the event. Anything else, a redirect or no answer within 10 seconds is retried with exponential backoff for 24 hours.