---
title: "Upload Campaign Resume"
method: POST
path: "/api/interview/join/{token}/resume"
tags: ["interview-join"]
---

# Upload Campaign Resume

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

## 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}/resume`
- Auth: none declared

Campaign candidate provides their resume on the lobby (before Start) —
a FILE or PASTED TEXT. Replaces the interview's synthetic resume_text with
the real thing (so the brain personalizes the opener) and stores the
parsed structure on the candidate so it shows in the recruiter's
dashboard. Both writes matter: without the second, has_resume stays false
and the recruiter never sees it.

Paste is supported because this endpoint absorbed the /screen page's
resume step — that page took pasted text, and dropping the option would
have shut out candidates who don't have a file to hand.

Public + token-scoped, and GATED to campaign screenings only
(metadata.source == 'campaign_screen') — a normal interview's token can
never reach this write path.

## Path parameters

- `token` string, required

## 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)
