July 20, 2026
New Features
- Interview Lifecycle Webhooks: Two new webhook events close long-standing gaps in the interview event stream. Previously, retries and cancellations produced no webhook at all — integrators saw repeated
interview.startedevents with no explanation for the gaps between them, and an interview that exhausted its call attempts never emitted a terminal event.interview.rescheduled— Sent when a call attempt does not produce a completed interview and a follow-up attempt has been scheduled. Register with"INTERVIEW_RESCHEDULED".- Two-attempt shape: Because this event sits between call attempts, it does not carry a single
callAttemptId. Instead it splitspreviousAttempt(withcallAttemptId, mappedstatus, rawendedReason,durationSeconds,attemptNumber) andnextAttempt(withcallAttemptId,scheduledAt,attemptNumber). reason: A stable vocabulary —CANDIDATE_REQUEST,NO_ANSWER,BUSY,VOICEMAIL,TECHNICAL_FAILURE,API_REQUEST, orADMIN. Branch on this rather than on the rawpreviousAttempt.endedReason, which is diagnostic only.API_REQUESTmeans you moved the attempt viaPATCH /interviews/{id}/call-attempts/{attemptId};ADMINmeans InstaView staff moved it from the internal admin panel.- Moves vs. retries: the
PATCHreschedule endpoint moves an existing attempt rather than ending one and creating another, so forreason: "API_REQUEST"(andADMIN) the samecallAttemptIdappears on both sides of the payload. Every other reason yields two distinct attempts. candidateRequest: Present only when the candidate asked to be called back. Includes their verbatimrawTextand atimeResolvedflag — whenfalse, the requested time could not be interpreted and a default slot was used instead, meaning the candidate is not expecting a call atscheduledAt.retryCount/maxAttempts: How close the interview is to exhausting its retry budget.maxAttemptsis omitted for candidate-requested reschedules, which do not spend that budget.
- Two-attempt shape: Because this event sits between call attempts, it does not carry a single
interview.cancelled— Sent when an interview reaches a terminal state without completing. Register with"INTERVIEW_CANCELLED".reason:MAX_ATTEMPTS_EXCEEDED(every permitted attempt made without reaching the candidate),CANDIDATE_NOT_INTERESTED(declined during the call, with the finer-grained outcome inreasonDetail),USER_REQUEST(cancelled from the InstaView dashboard), orADMIN(cancelled by InstaView staff from the internal admin panel).- No
API_REQUESTvalue: the public API has no interview-level cancel endpoint.DELETE /interviews/{id}removes the interview outright and cancels its pending webhook deliveries, so nointerview.cancelledevent is emitted for it. - Also carries
attemptsMade,cancelledBy, andlastCallAttemptId(absent when the interview was cancelled before any call was placed).
- Event ordering: Every interview now emits exactly one terminal event —
interview.completed,interview.cancelled, orinterview.failed. See the Webhooks guide for representative sequences.
Behavior Changes
- Interviews that exhaust their call attempts are now
CANCELLED, notFAILED: Reaching the retry ceiling means we stopped trying to reach the candidate, not that the platform malfunctioned, so the interview status now reflects that and stays consistent with theinterview.cancelledwebhook emitted alongside it. Individual call attempts are still recorded asFAILED. If you filter or report onFAILEDinterviews, note that this cohort has moved.
Documentation
- Webhook event types corrected: The webhook resource reference previously documented event types as numeric IDs (
events: [3, 0]). The API has always accepted string constants ("INTERVIEW_COMPLETED"); the reference has been corrected throughout. - OpenAPI response schema completed: The
eventsenum on webhook responses was missingsourcing.completed,sourcing.failed,enrich.completed, andenrich.failed. Generated clients would have rejected valid responses containing those labels.