curl -sS https://app.opentrain.ai/api/public/v1/proposals/<PROPOSAL_ID>/interview \
-H "Authorization: Bearer $OT_API_TOKEN"
opentrain proposals get --proposal-id <PROPOSAL_ID> --interview --json
{
"proposalId": "<PROPOSAL_ID>",
"includeInterview": true
}
{
"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"
}
]
}
}
{
"error": "No AI interview is recorded for this proposal",
"code": "NOT_FOUND",
"requestId": "<REQUEST_ID>",
"details": {
"proposalId": "<PROPOSAL_ID>"
}
}
Proposals
Get Interview Transcript
Read the full sanitized AI-interview transcript for a proposal, message by message.
GET
/
api
/
public
/
v1
/
proposals
/
{proposalId}
/
interview
curl -sS https://app.opentrain.ai/api/public/v1/proposals/<PROPOSAL_ID>/interview \
-H "Authorization: Bearer $OT_API_TOKEN"
opentrain proposals get --proposal-id <PROPOSAL_ID> --interview --json
{
"proposalId": "<PROPOSAL_ID>",
"includeInterview": true
}
{
"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"
}
]
}
}
{
"error": "No AI interview is recorded for this proposal",
"code": "NOT_FOUND",
"requestId": "<REQUEST_ID>",
"details": {
"proposalId": "<PROPOSAL_ID>"
}
}
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} 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.
Requirements: proposals:read scope. The proposal must be on a job you own (403 otherwise). Works pre-claim.
Request
string
required
The proposal ID.
Response
object
Hide interview
Hide interview
string
The proposal this interview belongs to.
string
The interview record’s ID.
number | null
Normalized interview score (same value as
aiInterview.score on the proposal detail).string | null
AI-written summary of the interview.
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) |
curl -sS https://app.opentrain.ai/api/public/v1/proposals/<PROPOSAL_ID>/interview \
-H "Authorization: Bearer $OT_API_TOKEN"
opentrain proposals get --proposal-id <PROPOSAL_ID> --interview --json
{
"proposalId": "<PROPOSAL_ID>",
"includeInterview": true
}
{
"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"
}
]
}
}
{
"error": "No AI interview is recorded for this proposal",
"code": "NOT_FOUND",
"requestId": "<REQUEST_ID>",
"details": {
"proposalId": "<PROPOSAL_ID>"
}
}
⌘I