Skip to content
OpenTrain AIOpenTrain AIOpenTrain AIDocs

Ask OpenTrain

Answers from the documentation, with sources.

What would you like to do with OpenTrain?

AI answers can be mistaken. Check the linked sources. Don’t include private account information.

Open app

DEVELOPER DOCUMENTATION

Get Proposal

Read one proposal in depth: bid, AI-interview score and summary, location/identity verification, assessment results, and contract state.

GET/api/public/v1/proposals/{proposalId}

Reads a single proposal in full — everything from GET /jobs/{id}/proposals plus the AI-interview block, location/identity verification, labeling-assessment results, and the contract created if you already hired. This is the deep-dive step of the candidate evaluation flow.

Candidate identity stays masked pre-hire (first name + last initial). Resume files, personal emails, phone numbers, and payment details are never returned — see privacy. For the full interview transcript, use GET /proposals/{proposalId}/interview.

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

proposalIdstringpathrequired

The proposal ID, e.g. from the proposals list.

proposalobject
proposal
idstring

Proposal ID.

jobIdstring

The job this proposal belongs to.

jobTitlestring

Job title (denormalized for convenience).

createdAtstring

ISO submission timestamp.

updatedAtstring

ISO last-change timestamp.

statusobject

{raw, label} — machine value (e.g. SHORTLISTED) plus display label.

bidobject

{amountUsd, unit, labelerHourlyRateUsd} — the candidate’s asking rate and its unit.

candidateobject

Privacy-safe candidate summary: {id, profileSlug, displayName, firstName, lastNameInitial, profileTitle, profilePhotoUrl, countryCode, country, talentType, highestEarningsUsd, reviewCount} — same shape as the proposals list. Use id or profileSlug with GET /freelancers/{idOrSlug} for the full profile.

metricsobject

{interviewScore, matchScore} — AI-interview score and job-match score, null when not available.

aiInterviewobject | null

null when the candidate has not taken the AI interview.

aiInterview
scorenumber | null

Normalized interview score.

summarystring | null

AI-written summary of the interview.

transcriptAvailableboolean

true when a transcript exists — fetch it via GET /proposals/{proposalId}/interview.

verificationobject
verification
locationobject

{status, method, checkedAt}status is PASSED, FAILED, or NOT_RECORDED; method is GPS, ID_DOCUMENT, or MIXED_SIGNALS (null when NOT_RECORDED); checkedAt is an ISO timestamp or null.

identityobject

{verified}true when the candidate completed identity verification.

openLabelobject | null

Latest result from OpenTrain’s built-in labeling assessment, when the candidate completed one for this proposal: {status, score, employerRating, completedAt} (each null-able). null when no assessment exists.

contractobject | null

{id, status} with status of ACTIVE or ENDED when you already hired from this proposal — track it via GET /contracts/{id}. null pre-hire.

StatuscodeMeaning
400BAD_REQUESTMissing proposalId
401UNAUTHORIZEDMissing or invalid token
403FORBIDDENMissing proposals:read scope, or the proposal is on another account’s job
404NOT_FOUNDNo such proposal