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

Start Proposal Conversation

Open (or reuse) the pre-hire direct-message thread with a candidate. Employer-first; idempotent.

POST/api/public/v1/proposals/{proposalId}/conversation

Opens the pre-hire direct-message thread for one of your proposals so you can talk to the candidate before hiring. Idempotent: if the thread already exists, you get the same conversationId back with created: false. Once you have the ID, send with POST /messages and read with GET /messages.

Proposal conversations are employer-first: only the job owner can open the thread, and the candidate cannot reply until the employer has sent the first message. This endpoint never creates any other kind of conversation — job threads come from hiring.

Requirements: messages:write scope + the public_api_messaging_writes feature + a claimed account (unclaimed accounts get 403 with details.reason: "account_claim_required" and a claimUrl). The proposal must be on a job you own.

proposalIdstringpathrequired

The proposal whose thread to open.

No body.

okboolean

true on success.

conversationIdstring

The conversation to use with the messages endpoints.

proposalIdstring

The proposal ID.

jobIdstring

The job the proposal belongs to.

createdboolean

true when a new thread was created, false when an existing one was returned.

StatuscodeMeaning
400BAD_REQUESTMissing proposalId
401UNAUTHORIZEDMissing or invalid token
403FORBIDDENMissing messages:write scope, feature disabled, account not claimed (details.reason: "account_claim_required", details.claimUrl), the proposal is on another account’s job, or you are the candidate (details.reason: "employer_first_message_required" — only the employer opens the thread)
404NOT_FOUNDNo such proposal
409CONFLICTProposal is not ready for messaging — details.reason: "proposal_not_ready_for_messaging" (e.g. missing invited user or linked job)