---
title: "End Interview Call"
method: POST
path: "/api/interview/join/{token}/end"
tags: ["interview-join"]
---

# End Interview Call

`POST /api/interview/join/{token}/end`

## Request

- Base URL: `https://api.thebetterhire.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.thebetterhire.ai/api/interview/join/{token}/end`
- Auth: none declared

Mark the interview as ended — 'completed' if it ran, 'failed' if it didn't.

Called when the candidate ends the call or the call ends naturally. The
candidate page posts {"ai_spoke": bool}: a screening where the AI never
said a word is a dead call (e.g. the voice provider failed to start), not
a finished interview. Marking it 'failed' keeps the candidate's status
surfaces honest instead of leaving a zombie 'completed' with no transcript
or score. The Vapi end-of-call webhook stays authoritative when it fires;
this also covers calls that died before any webhook arrived at all.

## Path parameters

- `token` string, required

## Request body

- object, nullable

## Response `200`

Successful Response

- unknown

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/thebetterhire/apis/interanalysis-b2b-api.md) · [All operations](https://skmtc.dev/thebetterhire/apis/interanalysis-b2b-api/llms.txt) · [OpenAPI document](https://skmtc.dev/thebetterhire/apis/interanalysis-b2b-api/revisions/c8ad03e900ea?raw)
