confirm_interview_slot

Confirm an interview slot

All MCP toolsWrite

Confirm one of a candidacy's proposed slots (at most ONE UNDECIDED confirmed slot per candidacy — while a confirmed slot has no recorded employer verdict, another confirm refuses naming it; record the previous interview's result or cancel the slot first. Decided past slots never block). A slot the candidate explicitly declined refuses: propose another slot or wait for a changed response. Passes while the job is published; an unpublished job refuses (job_not_published). A record on the agreed terms names no job and passes. Pass the slot's own candidacyId: a slot that is not one of that candidacy's slots refuses as not found. candidacyId may be OMITTED (a slot proposed from the conversation with propose_conversation_interview_slot) — the slot then resolves through its own selection record and the gate stays the same per-job publish state. Nothing is charged at confirmation — the credit was used when the pair became mutual.

Input schema

{
  "type": "object",
  "properties": {
    "candidacyId": {
      "description": "The candidacy the slot belongs to (candidacies.id); may be omitted — the slot resolves through its own record.",
      "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)$"
    },
    "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 proposed slot to confirm (interview_slots.id)."
    }
  },
  "required": [
    "slotId"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output schema

{
  "type": "object",
  "properties": {
    "slot": {
      "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."
    }
  },
  "required": [
    "slot"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false
}

On this page