get_selection
Get one selection record with its timeline
All MCP toolsRead
Start with list_selections, then open one here: one of the person's OWN selection records — the record's seat is a job (jobId) or the agreed terms (agreementId), exactly one, with the pair's chat (threadId) when one is open — with its full history (candidacy_transitions, oldest first) and its interview slots (all statuses, starts_at ascending, with the person's own response on each — respond with respond_interview_slot). Someone else's, cross-organization, and nonexistent ids refuse identically (no existence oracle).
Input schema
{
"type": "object",
"properties": {
"personId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "The person the selection record belongs to (persons.id)."
},
"candidacyId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "The selection record to read (candidacies.id)."
}
},
"required": [
"personId",
"candidacyId"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Output schema
{
"type": "object",
"properties": {
"selection": {
"type": "object",
"properties": {
"candidacyId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "The selection record (candidacies.id)."
},
"jobId": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
{
"type": "null"
}
],
"description": "The job this selection record is on (jobs.id) when the seat is a job's; null on the agreed terms."
},
"agreementId": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
{
"type": "null"
}
],
"description": "The agreed terms this selection record is on (agreements.id) when the seat is the agreement's; null on a job seat — exactly one of jobId / agreementId is set (ADR-0229)."
},
"origin": {
"type": "string",
"enum": [
"external"
],
"description": "Candidacy origin: \"external\" (the selection record opened from outside the organization). The state machine never conditions on it."
},
"state": {
"type": "string",
"enum": [
"applied",
"screening_passed",
"interviewing",
"offered",
"accepted",
"converted",
"withdrawn",
"declined"
],
"description": "Candidacy state: the active pipeline \"applied\" → \"screening_passed\" → \"interviewing\" → \"offered\" → \"accepted\" → \"converted\", plus the terminal negatives \"withdrawn\" (seeker-initiated) and \"declined\" (hirer-initiated)."
},
"profileVersion": {
"anyOf": [
{
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "The profile_versions.version pinned when the record opened (int >= 1); null when the person had no profile version yet."
},
"appliedAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"description": "When the selection record opened (applied), ISO 8601 datetime (UTC)."
},
"stateChangedAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"description": "When the current state was entered, ISO 8601 datetime (UTC)."
},
"jobTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The job's title at read time; null on the agreed terms."
},
"jobPublished": {
"type": "boolean",
"description": "Published ⇔ true (the ADR-0082 visibility fact) — false marks a no-longer-published job, and is always false on the agreed terms (no posting)."
},
"threadId": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
{
"type": "null"
}
],
"description": "The pair's chat when one is open (threads.id) — the agreed terms live there; get_conversation reads it. Null when the pair has no chat."
},
"transitions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"from": {
"type": "string",
"enum": [
"applied",
"screening_passed",
"interviewing",
"offered",
"accepted",
"converted",
"withdrawn",
"declined"
],
"description": "Candidacy state: the active pipeline \"applied\" → \"screening_passed\" → \"interviewing\" → \"offered\" → \"accepted\" → \"converted\", plus the terminal negatives \"withdrawn\" (seeker-initiated) and \"declined\" (hirer-initiated)."
},
"to": {
"type": "string",
"enum": [
"applied",
"screening_passed",
"interviewing",
"offered",
"accepted",
"converted",
"withdrawn",
"declined"
],
"description": "Candidacy state: the active pipeline \"applied\" → \"screening_passed\" → \"interviewing\" → \"offered\" → \"accepted\" → \"converted\", plus the terminal negatives \"withdrawn\" (seeker-initiated) and \"declined\" (hirer-initiated)."
},
"occurredAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"description": "When the transition happened, ISO 8601 datetime (UTC)."
},
"actorToken": {
"description": "Opaque subject_token of the actor who drove the transition, if any.",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"required": [
"from",
"to",
"occurredAt"
],
"additionalProperties": false,
"description": "A candidacy state transition event: from/to must be an allowed pair in the canonical transition table (self-transitions are never allowed)."
},
"description": "The selection record's history (candidacy_transitions), oldest first — the locked event shape; opening (applied) is not a transition, so a fresh record has none."
},
"slots": {
"type": "array",
"items": {
"type": "object",
"properties": {
"slotId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "The interview slot (interview_slots.id)."
},
"candidacyId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "The candidacy this slot hangs off (candidacies.id) — the selection record the company's first proposal on the mutual pair opened; the slot's one parent."
},
"status": {
"type": "string",
"enum": [
"proposed",
"confirmed",
"cancelled"
],
"description": "Interview slot status: \"proposed\", \"confirmed\" (at most one UNDECIDED per candidacy; decided past ones remain as the record), or \"cancelled\". Nothing leaves cancelled."
},
"startsAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"description": "When the slot starts, ISO 8601 datetime (UTC)."
},
"endsAt": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
{
"type": "null"
}
],
"description": "When the slot ends, ISO 8601 datetime (UTC); null when open-ended."
},
"candidateResponse": {
"anyOf": [
{
"type": "string",
"enum": [
"accepted",
"declined"
],
"description": "Candidate response to an interview slot: \"accepted\" or \"declined\" (does not fit their schedule). Mutable — the latest response wins; absent (null) means no response yet. A confirmed slot takes no response; the person's verb there is the interview cancel."
},
{
"type": "null"
}
],
"description": "The candidate's latest response: accepted, declined, or null (no response yet). A declined slot refuses confirmation until the response changes."
},
"respondedAt": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
{
"type": "null"
}
],
"description": "When the latest response was recorded, ISO 8601 (UTC); null when unresponded."
},
"candidateVerdict": {
"anyOf": [
{
"type": "string",
"enum": [
"continue",
"withdraw"
],
"description": "Candidate post-interview intent: \"continue\" (stay in this selection process) or \"withdraw\" (leave it). Absent (null) means no intent recorded yet; withdraw co-occurs with the withdrawn transition."
},
{
"type": "null"
}
],
"description": "The candidate's post-interview intent: continue, withdraw, or null (not recorded yet). Meaningful only once the confirmed slot's start has passed."
},
"candidateVerdictAt": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
{
"type": "null"
}
],
"description": "When the candidate intent was recorded, ISO 8601 (UTC); null when unrecorded."
},
"employerVerdict": {
"anyOf": [
{
"type": "string",
"enum": [
"passed",
"declined"
],
"description": "Employer interview verdict: \"passed\" (state unchanged) or \"declined\" (co-occurs with the declined transition). Absent (null) means no verdict recorded yet."
},
{
"type": "null"
}
],
"description": "The employer's verdict on the completed interview: passed, declined, or null (not recorded yet)."
},
"employerVerdictAt": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
{
"type": "null"
}
],
"description": "When the employer verdict was recorded, ISO 8601 (UTC); null when unrecorded."
},
"contact": {
"anyOf": [
{
"type": "object",
"properties": {
"phone": {
"description": "Phone number in customary domestic notation, e.g. \"03-1234-5678\" or \"+81 3 1234 5678\" — digits, \"+\", \"-\", spaces and parentheses only; never normalized or verified.",
"type": "string",
"pattern": "^(?=.*[0-9])[0-9+(](?:[0-9+\\-() ]*[0-9)])?$"
},
"email": {
"description": "Contact email address for enquiries about this posting.",
"type": "string",
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"note": {
"type": "string",
"pattern": "^\\S(?:[\\s\\S]*\\S)?$",
"description": "One line beside the channels — the department, the person in charge, reception hours — trimmed and non-empty."
}
},
"additionalProperties": false,
"description": "Employer contact for the posting: phone and/or email (at least one), plus an optional one-line note. Published as posting content — no disclosure gate."
},
{
"type": "null"
}
],
"description": "The employer's day-of contact stated for THIS interview at proposal (ADR-0217) — the raw statement, not the resolution: null when none was stated, in which case the posting's contact is the day-of contact."
},
"cancelledAt": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
{
"type": "null"
}
],
"description": "When a confirmed interview was cancelled, ISO 8601 (UTC) — recorded with who and when; a proposed slot's withdrawal and the expiry sweep leave it null."
},
"cancelledBy": {
"anyOf": [
{
"type": "string",
"enum": [
"candidate",
"employer"
],
"description": "Which side cancelled the confirmed interview: \"candidate\" or \"employer\". Absent (null) when the slot was not a cancelled confirmed interview — a proposed slot's withdrawal and the expiry sweep record no side."
},
{
"type": "null"
}
],
"description": "Which side cancelled the confirmed interview — recorded with who and when; a proposed slot's withdrawal and the expiry sweep leave it null."
},
"candidateAvailabilityNote": {
"anyOf": [
{
"type": "string",
"maxLength": 256
},
{
"type": "null"
}
],
"description": "The candidate's own words about the times that suit them, written beside a declined response or beside their own cancellation of a confirmed interview; null when they said nothing."
}
},
"required": [
"slotId",
"candidacyId",
"status",
"startsAt",
"endsAt",
"candidateResponse",
"respondedAt",
"candidateVerdict",
"candidateVerdictAt",
"employerVerdict",
"employerVerdictAt",
"contact",
"cancelledAt",
"cancelledBy",
"candidateAvailabilityNote"
],
"additionalProperties": false,
"description": "One interview slot's scheduling state: proposed, confirmed (at most one UNDECIDED per candidacy; decided past interviews remain as confirmed rows), or cancelled — plus the candidate's latest response, the post-interview result pair, and the cancellation record (who and when) of a cancelled confirmed interview."
},
"description": "The selection record's interview slots, all statuses, (starts_at, id) ascending — the same rows the employer pipeline sees, with the candidate's own response on each."
}
},
"required": [
"candidacyId",
"jobId",
"agreementId",
"origin",
"state",
"profileVersion",
"appliedAt",
"stateChangedAt",
"jobTitle",
"jobPublished",
"threadId",
"transitions",
"slots"
],
"additionalProperties": false,
"description": "The selection record detail: the list entry plus the pair's chat, its ordered history and interview slots."
}
},
"required": [
"selection"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}