> ## Documentation Index
> Fetch the complete documentation index at: https://opentrain.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Get Interview Transcript

> Read the full sanitized AI-interview transcript for a proposal, message by message.

Returns the complete AI-interview transcript for a proposal — every exchange between the AI interviewer and the candidate, oldest first — plus the score and summary. Check `aiInterview.transcriptAvailable` on [`GET /proposals/{proposalId}`](/docs/developers/api-reference/proposals/get) first; this endpoint returns `404` when no interview is recorded.

Transcripts are sanitized before they leave the platform: contact details and other personal identifiers are scrubbed — see [privacy](/docs/developers/concepts/privacy-and-work-email).

**Requirements:** `proposals:read` scope. The proposal must be on a job you own (`403` otherwise). Works pre-claim.

## Request

<ParamField path="proposalId" type="string" required>
  The proposal ID.
</ParamField>

## Response

<ResponseField name="interview" type="object">
  <Expandable title="interview" defaultOpen>
    <ResponseField name="proposalId" type="string">
      The proposal this interview belongs to.
    </ResponseField>

    <ResponseField name="interviewId" type="string">
      The interview record's ID.
    </ResponseField>

    <ResponseField name="score" type="number | null">
      Normalized interview score (same value as `aiInterview.score` on the proposal detail).
    </ResponseField>

    <ResponseField name="summary" type="string | null">
      AI-written summary of the interview.
    </ResponseField>

    <ResponseField name="messages" type="object[]">
      Transcript entries ordered oldest first.

      <Expandable title="message entry">
        <ResponseField name="id" type="string">
          Message ID.
        </ResponseField>

        <ResponseField name="role" type="string">
          `interviewer` (the AI) or `candidate`.
        </ResponseField>

        <ResponseField name="content" type="string">
          Sanitized message text.
        </ResponseField>

        <ResponseField name="sentAt" type="string">
          ISO timestamp.
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

## Errors

| Status | `code`         | Meaning                                                                                   |
| ------ | -------------- | ----------------------------------------------------------------------------------------- |
| `400`  | `BAD_REQUEST`  | Missing `proposalId`                                                                      |
| `401`  | `UNAUTHORIZED` | Missing or invalid token                                                                  |
| `403`  | `FORBIDDEN`    | Missing `proposals:read` scope, or the proposal is on another account's job               |
| `404`  | `NOT_FOUND`    | No such proposal, or no AI interview is recorded for this proposal (`details.proposalId`) |

<RequestExample>
  ```bash curl theme={null}
  curl -sS https://app.opentrain.ai/api/public/v1/proposals/<PROPOSAL_ID>/interview \
    -H "Authorization: Bearer $OT_API_TOKEN"
  ```

  ```bash CLI theme={null}
  opentrain proposals get --proposal-id <PROPOSAL_ID> --interview --json
  ```

  ```json MCP: opentrain_get_proposal theme={null}
  {
    "proposalId": "<PROPOSAL_ID>",
    "includeInterview": true
  }
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "interview": {
      "proposalId": "<PROPOSAL_ID>",
      "interviewId": "<INTERVIEW_ID>",
      "score": 86,
      "summary": "Strong grasp of sentiment-labeling edge cases; clear communication; native Spanish speaker with prior social-media annotation experience.",
      "messages": [
        {
          "id": "<MESSAGE_ID_1>",
          "role": "interviewer",
          "content": "Tell me about your experience labeling sentiment in social media posts.",
          "sentAt": "2026-06-11T15:20:00.000Z"
        },
        {
          "id": "<MESSAGE_ID_2>",
          "role": "candidate",
          "content": "I spent two years annotating Spanish-language tweets for a sentiment model, including sarcasm and mixed-sentiment cases.",
          "sentAt": "2026-06-11T15:21:00.000Z"
        }
      ]
    }
  }
  ```

  ```json 404 (no interview) theme={null}
  {
    "error": "No AI interview is recorded for this proposal",
    "code": "NOT_FOUND",
    "requestId": "<REQUEST_ID>",
    "details": {
      "proposalId": "<PROPOSAL_ID>"
    }
  }
  ```
</ResponseExample>
