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

List Job Proposals

List proposals submitted to a job you own, with bids, AI-interview scores, and candidate summaries.

GET/api/public/v1/jobs/{id}/proposals

Lists the proposals on one of your jobs, newest first — each with the candidate’s bid, AI-interview score, and a privacy-safe candidate summary. This is the entry point of the candidate evaluation flow: list here, then drill into GET /proposals/{id} and the interview transcript.

Candidate identity is masked pre-hire: first name + last initial, no contact details. Personal emails are never exposed at any stage — see privacy.

Requirements: proposals:read scope. The job must be yours (403 otherwise). Works pre-claim.

idstringpathrequired

Your job’s ID.

statusstringquery

Filter by proposal status: UNREVIEWED, SHORTLISTED, MAYBE, HIRED, DECLINED, NOT_A_FIT, or RESUME_SENT. Case-insensitive; spaces and hyphens are normalized to underscores. Invalid values return 400 with details.supportedStatuses.

limitnumberquery
Default: 25

Page size, max 100. Below 1 → 400.

cursorstringquery

Pagination cursor (a proposal ID) from a previous response’s nextCursor.

proposalsobject[]

Proposals ordered by creation date, newest first.

proposal entry
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. UNREVIEWED) 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}. 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.

nextCursorstring | null

Pass back as cursor for the next page; null at the end.

StatuscodeMeaning
400BAD_REQUESTInvalid status (details.supportedStatuses) or limit below 1
401UNAUTHORIZEDMissing or invalid token
403FORBIDDENMissing proposals:read scope, or the job belongs to another account
404NOT_FOUNDNo such job