Skip to main content
Glama

Update interview or position

update_interview
DestructiveIdempotent

[Interviews] Update the configuration of an existing interview/position: name, description, avatar template, recording, scoring, tags, category and the rest of the create-time settings; for a position also its hiring team and recruiter. status is applied as set_interview_state applies it (archiving an active position can e-mail its open applicants; set_interview_state with dry_run previews that); the vacancy lifecycle and the embed key are set with set_interview_state only. A position's steps are changed with set_position_process and update_position_step. Only the fields you send are changed. To change the questions, send questions — the WHOLE list you want the interview to end up with, in order, in the format get_interview_definition returns. OMIT questions and the existing questions are left completely alone; there is no way to change one question on its own: the array get_interview_definition returns is edited and sent back whole. Resending an unchanged array does nothing. On an offline (pre-rendered video) template the questions change only while the interview is draft; on an interactive one also while it is active. Not updated by this tool at all: the welcome and thank-you messages and the instructional-video screen (stored as steps, not questions), and the language, which the existing questions are already written in (no tool changes these: the messages and the video screen are changed in the admin, and another language takes a new interview). tags places a coaching session into a catalogue directory. MULTI-STAGE POSITIONS: the interview-only settings (recording, knowledge_base_store_id, candidate_expectations_json and the like) do not exist at position level and are refused with a 422 naming the field. They live on the AI interview step's own interview (the step's interview_set_id, from get_interview_definition include=process). A null argument counts as not sent and changes nothing, except on three fields where null is the only way to switch something off: candidate_notification_channel (no SMS / WhatsApp), questions_random_subset (ask all questions) and pdf_export_auto_config (no automatic report).

Every argument in full, with examples: get_tool_reference.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "position_id": "<position_id>"
    },
    "name": "update_interview"
  }
}

Input Schema

NameRequiredDescriptionDefault
codeNoExternal code/reference. Blank is stored as null.
nameNoInterview / position name.
tagsNoFree-form tags stored on the interview. Only `active` sessions with visibility `merchant_public` (or the platform's own `public`) are listed.
teamNoMulti-stage positions only (422 on an interview): the complete hiring team you want, replacing the current members (viewers, managed with position access, are kept). An empty array removes everyone. Needs the hiring team switched on for the company (else 403) and access to the position.
typeNoProduct type of the interview. Changing it also re-derives `type_credit` (null for interview/assessment, otherwise interview_coach_manager) unless you send `type_credit` explicitly. Single-stage interviews only.
emojiNoEmoji marker shown in the admin lists. Blank is stored as null.
statusNoNew publication status (preparing and completed are normally set by the platform), applied exactly as set_interview_state applies it: archiving an active position e-mails its candidates with open applications when the position-closed notice is on (set_interview_state previews that with dry_run, and also manages the iframe embed key and the vacancy lifecycle of a position). Refused (422) for the AI interview step of a multi-stage position: its status follows the position.
locationNoInterview location. Blank is stored as null.
llm_modelNoYour model id, e.g. "claude-opus-4-8"; "unknown" if unsure. For analytics.
questionsNoOPTIONAL. Omit this field entirely and the interview's questions are left exactly as they are — questions are only touched when you send the array. When sent, it is the COMPLETE list you want the interview to end up with, in order, in the same format create_interview accepts and get_interview_definition returns: there is no way to change a single question on its own: the array get_interview_definition returns is edited and sent back whole. An empty array is rejected. It is applied as a DIFF, not a replace, so resending the array get_interview_definition gave you changes nothing at all. Each entry is matched against what is stored — first on `external_id`, then on `id`, then on identical content — and: an entry matching an unchanged question keeps that question exactly as it is, including its answer rules and any rendered avatar video; an entry matching a question whose content differs unlinks the old question and creates a new one in its place (fields you omit are carried over from the old one); an entry matching nothing is created; and a stored question no entry matches is unlinked. Questions are shared records, so nothing is ever deleted — removing one only unlinks it from this interview, and an edit is always unlink-old + create-new so the change cannot leak into another interview reusing the same question. Single-stage interviews only; a multi-stage position's interview stages are updated individually.
recordingNoCheating/proctoring detection mode for candidate answers — this is NOT a full session recording. Omit to keep the current mode; `none` switches it off; a null is ignored. Values: `audio_first_5_answers`: Audio-only cheating detection, first 5 answers only | `audio_all`: Audio-only cheating detection on every answer | `video_all`: Audio + video cheating detection on every answer | `video_first_5_answers`: Audio + video cheating detection, first 5 answers only | `none`: Switch cheating detection off.
coach_planNoCoaching-plan stage this item belongs to, used by the coaching-plan progress view. Omit to keep the current stage. A null is ignored: use `other` when no stage fits. Values: `demo`: Demo session | `screening`: Screening-interview practice | `2nd`: Second-interview practice | `3rd`: Third-interview practice | `closing`: Closing / salary-negotiation practice | `job-specific`: Job-specific coaching | `other`: Anything that does not fit the other buckets.
visibilityNoWho can discover and access the interview. Refused (422) for the AI interview step of a multi-stage position: it follows the position. Values: `merchant_public`: Listed on the merchant's public interview list | `merchant_invite`: only candidates explicitly invited | `merchant_unlisted`: Reachable only via a direct link.
descriptionNoShort interview description.
environmentNoWhich of your webhook environments results from this interview are delivered to. Defaults to production. Values: `production`: Live hiring | `uat`: User-acceptance testing - an isolated environment for pre-release verification | `development`: Development/testing | `demo`: Demonstrations and sales trials.
position_idYesId of the interview definition (single-stage) or position definition (multi-stage) to update.
result_viewNoResult screen shown to the candidate after finishing. With any value other than `none`, the candidate sees a results screen where they can provide feedback, record an intro video and edit the transcript, and must then submit the result; the value sets how much score/result detail is shown. Values: `none`: No results screen at all | `minimal`: Minimal results layout, no score shown | `minimal_with_score`: Minimal results layout including the overall score | `advanced`: Advanced results layout with more detail | `full`: Full results layout with all sections | `full_expand_scores`: Full results with every score breakdown expanded.
type_creditNoCredit bucket the session draws from. Only meaningful for candidate-paid coaching/persona sessions; hiring interviews and assessments are merchant-billed and carry null. Values: `resume_check`: Resume Builder credits | `interview_coach_starter`: starter tier | `interview_coach_contributor`: contributor tier | `interview_coach_manager`: manager tier | `cover_letter`: Cover-letter credits.
max_durationNoLive session limit in seconds.
custom_fieldsNoCompany-defined position fields to set, {key: value}; a null value clears that field and keys you omit keep their value. Requires custom fields to be enabled for the company (else 403). Multi-stage positions only: on a single-stage interview the request is refused with 422.
max_followupsNoMaximum number of AI follow-up questions. 0 disables follow-ups; presets are 0-3 (none/low/normal/high) and custom values start at 4; 2 is the template default (Normal).
custom_scoringNoResult-scoring overrides (max_score, early_stop, speech_cadence, ai_pronunciation, sentiment_analysis, ai_assessment_answer, ai_assessment_resume, ai_assessment_session). Merged onto the stored configuration, so keys you omit keep their current value.
interview_toneNoTone — configures the AI avatar's speaking style and the follow-up questions it generates. Case-insensitive; omit to keep the current tone. Values: `relaxed`: Friendly and conversational tone that helps candidates feel at ease | `simple`: Plain language at CEFR A2 level | `professional`: Formal and business-like approach suitable for senior roles | `persuasive`: Engaging style that encourages candidates to elaborate | `exact`: Asks the questions exactly as provided, without rephrasing.
interview_typeNoInterview style — configures the AI avatar and the follow-up questions it generates during the interview. Values: `pre-screening`: quick qualification check focusing on basic requirements and availability | `pre-screening-with-test-questions`: pre-screening plus practical questions to test relevant skills | `second-interview`: deeper dive for candidates who passed initial screening | `remote-freelancer-verification`: verify remote work capabilities and communication skills | `strength-based-interview`: focus on what candidates enjoy and excel at to predict job satisfaction | `potential-based-interview`: assess learning ability and growth potential rather than past experience | `process-verification-from-knowledge-base`: generate questions from your knowledge base documents | `knockout-screening`: a short (about 5 minute) check of the role's must-haves with closed questions.
conversation_idNoThe conversation_id this server returned earlier in this conversation, unchanged, including after later user messages. Omit it if you have none. Recorded for the server developer's analytics.
cover_image_urlNoCover image URL.
seniority_levelNoTarget seniority level for the role; omit to keep the current one. Values: `entry-level`: Early-career or graduate roles | `intermediate`: Some experience required | `senior`: Experienced professional | `managerial`: Team or department lead | `director`: Director-level responsibility | `executive`: C-suite or executive role.
description_longNoLong-form interview description.
interview_salaryNoSalary range shown for the position. Blank is stored as null.
hiring_for_companyNoWho the position is really for. An object with name null/blank means hiring for yourself; { name: 'undisclosed' } for an unnamed external client; or { name: '<company>' } plus optional description/location/sector/company_size.
interview_attemptsNoAllowed candidate attempts (1-20).
interview_categoryNoJob category shown on public listings above the department (free text), e.g. "Ashore". Blank is stored as null.
country_availabilityNoWhich countries the interview / position is open to on the candidate portal, judged by the IP address the candidate opens it from (an unknown location only passes when countries_allowed / countries_allowed_eu are empty). From a closed country it is left out of the portal listings, and a direct link shows "not available in your region". Invited candidates (personal invitation links) and candidates who already started keep access; API and MCP calls themselves are never restricted. An empty object {} = not used, every country.
interview_departmentNoDepartment the position belongs to. Blank is stored as null.
recruiter_profile_idNoProfile id of the recruiter owning this interview or position (`profile_id` (list_users)). Must be an active owner, recruiter or admin of the company (own staff or a sub-merchant grant holder), else 422. An empty string clears it.
allow_human_interviewNoA recruiter may hold the interview instead of the AI. Single-stage interviews only (an interview step of a position carries its own setting, see update_position_step).
interview_template_idNoId of the interview template (avatar/voice) to use.
candidate_expectationsNoFree-text candidate expectations.
pdf_export_auto_configNoAuto-generate a candidate PDF report with these options once the interview completes. null disables auto-export.
recording_full_sessionNoFull interview-session recording (includes the avatar and voice) produced as a single file. Omit to keep the current setting; `none` switches it off; a null is ignored. Values: `audio_all`: Record the whole session audio | `video_all`: Record the whole session video + audio | `none`: Switch the full-session recording off.
required_pronunciationNoRequire pronunciation assessment (restricts to pronunciation-capable languages).
knowledge_base_store_idNoKnowledge base store id the interview draws context from; validated for existence. An empty string unlinks it.
questions_random_subsetNoAsk only a random subset of the questions, as a fraction between 0.01 and 0.9. null asks all questions.
interview_available_tillNoISO date/time after which the interview is no longer available to candidates. An empty string makes it always available.
candidate_expectations_jsonNoStructured candidate expectations (the scoring rubric), bucketed by requirement level (weak/moderate/strong). A null is ignored: send a new rubric to replace it, or regenerate_candidate_expectations together with `questions` to derive it again.
collect_resume_cover_letterNoAsk the candidate for a resume / cover letter: hidden, optional or required. Single-stage interviews only.
candidate_video_introductionNoWhether a candidate video introduction is hidden, optional or required. Send `hidden` to stop asking.
interview_conversation_speedNoConversation pace of the AI avatar. Omit to keep the current pace; `normal` is the default speaking pace. Values: `slower`: The avatar speaks more slowly | `normal`: Default speaking pace | `faster`: The avatar speaks more quickly for a snappier conversation | `fluent`: Talking pace: the avatar answers 300 ms after the candidate stops speaking.
result_enable_edit_transcriptNoAllow editing the transcript on the result view.
candidate_notification_channelNoSMS / WhatsApp notifications to the candidate, sent alongside the e-mails: "reminders" = with both e-mail reminders (day 1 and day 3); "last_reminder" = only with the final day-3 reminder; "all" = invitation, both reminders and the pre-screening-accepted step. null switches them off.
regenerate_candidate_expectationsNoRe-derive the interview-level `candidate_expectations_json` scoring rubric from the resulting question list, the way create_interview derives it at creation time. Only applies when `questions` is sent, the interview type is `interview`, and `candidate_expectations_json` is not also being set explicitly (an explicit value wins).

Output Schema

NameRequiredDescriptionDefault
teamNo
position_idYes
is_multistageYes
questions_diffNo
updated_fieldsYes
_mcp_instructionsNoServer-issued metadata for this conversation.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / questions / description
      Previous value: -"OPTIONAL. Omit this field entirely and the interview's questions are left exactly as they are — questions are only touched when you send the array. When you do send it, send the COMPLETE list you want the interview to end up with, in order, in the same format create_interview accepts and get_interview_definition returns: there is no way to change a single question on its own, so read the interview, edit that array, and send the whole thing back. An empty array is rejected. It is applied as a DIFF, not a replace, so resending the array get_interview_definition gave you changes nothing at all. Each entry is matched against what is stored — first on `external_id`, then on `id`, then on identical content — and: an entry matching an unchanged question keeps that question exactly as it is, including its answer rules and any rendered avatar video; an entry matching a question whose content differs unlinks the old question and creates a new one in its place (fields you omit are carried over from the old one); an entry matching nothing is created; and a stored question no entry matches is unlinked. Questions are shared records, so nothing is ever deleted — removing one only unlinks it from this interview, and an edit is always unlink-old + create-new so the change cannot leak into another interview reusing the same question. Single-stage interviews only; for a multi-stage position, update its interview stages individually."New value: +"OPTIONAL. Omit this field entirely and the interview's questions are left exactly as they are — questions are only touched when you send the array. When sent, it is the COMPLETE list you want the interview to end up with, in order, in the same format create_interview accepts and get_interview_definition returns: there is no way to change a single question on its own: the array get_interview_definition returns is edited and sent back whole. An empty array is rejected. It is applied as a DIFF, not a replace, so resending the array get_interview_definition gave you changes nothing at all. Each entry is matched against what is stored — first on `external_id`, then on `id`, then on identical content — and: an entry matching an unchanged question keeps that question exactly as it is, including its answer rules and any rendered avatar video; an entry matching a question whose content differs unlinks the old question and creates a new one in its place (fields you omit are carried over from the old one); an entry matching nothing is created; and a stored question no entry matches is unlinked. Questions are shared records, so nothing is ever deleted — removing one only unlinks it from this interview, and an edit is always unlink-old + create-new so the change cannot leak into another interview reusing the same question. Single-stage interviews only; a multi-stage position's interview stages are updated individually."
  2. Changed24 schema fields changed
    • changedInput schema / properties / allow_human_interview / description
      Previous value: -"A recruiter may hold the interview instead of the AI. Single-stage interviews only (an interview step of a position carries its own setting, see merchant-position-step-update)."New value: +"A recruiter may hold the interview instead of the AI. Single-stage interviews only (an interview step of a position carries its own setting, see update_position_step)."
    • changedInput schema / properties / coach_plan / description
      Previous value: -"Coaching-plan stage this item belongs to, used by the coaching-plan progress view. Omit to keep the current stage. A null is ignored: use `other` when no stage fits."New value: +"Coaching-plan stage this item belongs to, used by the coaching-plan progress view. Omit to keep the current stage. A null is ignored: use `other` when no stage fits. Values: `demo`: Demo session | `screening`: Screening-interview practice | `2nd`: Second-interview practice | `3rd`: Third-interview practice | `closing`: Closing / salary-negotiation practice | `job-specific`: Job-specific coaching | `other`: Anything that does not fit the other buckets."
    • changedInput schema / properties / country_availability / description
      Previous value: -"Which countries the interview / position is open to on the candidate portal, judged by the IP address the candidate opens it from (an unknown location only passes when countries_allowed / countries_allowed_eu are empty). From a closed country it is left out of the portal listings, and a direct link shows \"not available in your region\". Invited candidates (register_users / invite links) and candidates who already started keep access; API and MCP calls themselves are never restricted. An empty object {} = not used, every country."New value: +"Which countries the interview / position is open to on the candidate portal, judged by the IP address the candidate opens it from (an unknown location only passes when countries_allowed / countries_allowed_eu are empty). From a closed country it is left out of the portal listings, and a direct link shows \"not available in your region\". Invited candidates (personal invitation links) and candidates who already started keep access; API and MCP calls themselves are never restricted. An empty object {} = not used, every country."
    • changedInput schema / properties / description_long / description
      Previous value: -"Long-form interview description (column `interview_description_long`)."New value: +"Long-form interview description."
    • changedInput schema / properties / environment / description
      Previous value: -"Which of your webhook environments results from this interview are delivered to. Defaults to production."New value: +"Which of your webhook environments results from this interview are delivered to. Defaults to production. Values: `production`: Live hiring | `uat`: User-acceptance testing - an isolated environment for pre-release verification | `development`: Development/testing | `demo`: Demonstrations and sales trials."
    • changedInput schema / properties / interview_available_till / description
      Previous value: -"ISO date/time after which the interview is no longer available to candidates. An empty string keeps it always available."New value: +"ISO date/time after which the interview is no longer available to candidates. An empty string makes it always available."
    • changedInput schema / properties / interview_conversation_speed / description
      Previous value: -"Conversation pace of the AI avatar. Omit to keep the current pace; `normal` is the default speaking pace."New value: +"Conversation pace of the AI avatar. Omit to keep the current pace; `normal` is the default speaking pace. Values: `slower`: The avatar speaks more slowly | `normal`: Default speaking pace | `faster`: The avatar speaks more quickly for a snappier conversation | `fluent`: Talking pace: the avatar answers 300 ms after the candidate stops speaking."
    • changedInput schema / properties / interview_template_id / description
      Previous value: -"Id of the interview template (avatar/voice) to use. Must reference an existing interview_templates row."New value: +"Id of the interview template (avatar/voice) to use."
    • changedInput schema / properties / interview_tone / description
      Previous value: -"Tone — configures the AI avatar's speaking style and the follow-up questions it generates. Case-insensitive; omit to default to relaxed."New value: +"Tone — configures the AI avatar's speaking style and the follow-up questions it generates. Case-insensitive; omit to keep the current tone. Values: `relaxed`: Friendly and conversational tone that helps candidates feel at ease | `simple`: Plain language at CEFR A2 level | `professional`: Formal and business-like approach suitable for senior roles | `persuasive`: Engaging style that encourages candidates to elaborate | `exact`: Asks the questions exactly as provided, without rephrasing."
    • changedInput schema / properties / interview_type / description
      Previous value: -"Interview style — configures the AI avatar and the follow-up questions it generates during the interview."New value: +"Interview style — configures the AI avatar and the follow-up questions it generates during the interview. Values: `pre-screening`: quick qualification check focusing on basic requirements and availability | `pre-screening-with-test-questions`: pre-screening plus practical questions to test relevant skills | `second-interview`: deeper dive for candidates who passed initial screening | `remote-freelancer-verification`: verify remote work capabilities and communication skills | `strength-based-interview`: focus on what candidates enjoy and excel at to predict job satisfaction | `potential-based-interview`: assess learning ability and growth potential rather than past experience | `process-verification-from-knowledge-base`: generate questions from your knowledge base documents | `knockout-screening`: a short (about 5 minute) check of the role's must-haves with closed questions."
    • changedInput schema / properties / location / description
      Previous value: -"Interview location (column `interview_location`). Blank is stored as null."New value: +"Interview location. Blank is stored as null."
    • changedInput schema / properties / questions / description
      Previous value: -"OPTIONAL. Omit this field entirely and the interview's questions are left exactly as they are — this endpoint only touches questions when you send the array. When you do send it, send the COMPLETE list you want the interview to end up with, in order, in the same format job-interview-create-from-array accepts and job-interview-get returns: there is no way to change a single question on its own, so read the interview, edit that array, and send the whole thing back. An empty array is rejected. It is applied as a DIFF, not a replace, so resending the array job-interview-get gave you changes nothing at all. Each entry is matched against what is stored — first on `external_id`, then on `id`, then on identical content — and: an entry matching an unchanged question keeps that question exactly as it is, including its answer rules and any rendered avatar video; an entry matching a question whose content differs unlinks the old question and creates a new one in its place (fields you omit are carried over from the old one); an entry matching nothing is created; and a stored question no entry matches is unlinked. Questions are shared records, so nothing is ever deleted — removing one only unlinks it from this interview, and an edit is always unlink-old + create-new so the change cannot leak into another interview reusing the same question. Single-stage interviews only; for a multi-stage position, update its interview stages individually."New value: +"OPTIONAL. Omit this field entirely and the interview's questions are left exactly as they are — questions are only touched when you send the array. When you do send it, send the COMPLETE list you want the interview to end up with, in order, in the same format create_interview accepts and get_interview_definition returns: there is no way to change a single question on its own, so read the interview, edit that array, and send the whole thing back. An empty array is rejected. It is applied as a DIFF, not a replace, so resending the array get_interview_definition gave you changes nothing at all. Each entry is matched against what is stored — first on `external_id`, then on `id`, then on identical content — and: an entry matching an unchanged question keeps that question exactly as it is, including its answer rules and any rendered avatar video; an entry matching a question whose content differs unlinks the old question and creates a new one in its place (fields you omit are carried over from the old one); an entry matching nothing is created; and a stored question no entry matches is unlinked. Questions are shared records, so nothing is ever deleted — removing one only unlinks it from this interview, and an edit is always unlink-old + create-new so the change cannot leak into another interview reusing the same question. Single-stage interviews only; for a multi-stage position, update its interview stages individually."
    • changedInput schema / properties / recording / description
      Previous value: -"Cheating/proctoring detection mode for candidate answers — this is NOT a full session recording. Omit to keep the current setting. A null is ignored: turn it off in the admin console."New value: +"Cheating/proctoring detection mode for candidate answers — this is NOT a full session recording. Omit to keep the current mode; `none` switches it off; a null is ignored. Values: `audio_first_5_answers`: Audio-only cheating detection, first 5 answers only | `audio_all`: Audio-only cheating detection on every answer | `video_all`: Audio + video cheating detection on every answer | `video_first_5_answers`: Audio + video cheating detection, first 5 answers only | `none`: Switch cheating detection off."
    • changedInput schema / properties / recording / enum
      Previous value: -[
      -  "audio_first_5_answers",
      -  "audio_all",
      -  "video_all",
      -  "video_first_5_answers",
      -  null
      -]New value: +[
      +  "audio_first_5_answers",
      +  "audio_all",
      +  "video_all",
      +  "video_first_5_answers",
      +  "none",
      +  null
      +]
    • changedInput schema / properties / recording_full_session / description
      Previous value: -"Full interview-session recording (includes the avatar and voice) produced as a single file. Omit to keep the current setting. A null is ignored: turn it off in the admin console."New value: +"Full interview-session recording (includes the avatar and voice) produced as a single file. Omit to keep the current setting; `none` switches it off; a null is ignored. Values: `audio_all`: Record the whole session audio | `video_all`: Record the whole session video + audio | `none`: Switch the full-session recording off."
    • changedInput schema / properties / recording_full_session / enum
      Previous value: -[
      -  "audio_all",
      -  "video_all",
      -  null
      -]New value: +[
      +  "audio_all",
      +  "video_all",
      +  "none",
      +  null
      +]
    • changedInput schema / properties / recruiter_profile_id / description
      Previous value: -"Profile id of the recruiter owning this interview or position (profile.id). Must be an active owner, recruiter or admin of the company (own staff or a sub-merchant grant holder), else 422. An empty string clears it."New value: +"Profile id of the recruiter owning this interview or position (`profile_id` (list_users)). Must be an active owner, recruiter or admin of the company (own staff or a sub-merchant grant holder), else 422. An empty string clears it."
    • changedInput schema / properties / regenerate_candidate_expectations / description
      Previous value: -"Re-derive the interview-level `candidate_expectations_json` scoring rubric from the resulting question list, the way job-interview-create-from-array derives it at creation time. Only applies when `questions` is sent, the interview type is `interview`, and `candidate_expectations_json` is not also being set explicitly (an explicit value wins)."New value: +"Re-derive the interview-level `candidate_expectations_json` scoring rubric from the resulting question list, the way create_interview derives it at creation time. Only applies when `questions` is sent, the interview type is `interview`, and `candidate_expectations_json` is not also being set explicitly (an explicit value wins)."
    • changedInput schema / properties / result_view / description
      Previous value: -"Result screen shown to the candidate after finishing. With any value other than `none`, the candidate sees a results screen where they can provide feedback, record an intro video and edit the transcript, and must then submit the result; the value sets how much score/result detail is shown."New value: +"Result screen shown to the candidate after finishing. With any value other than `none`, the candidate sees a results screen where they can provide feedback, record an intro video and edit the transcript, and must then submit the result; the value sets how much score/result detail is shown. Values: `none`: No results screen at all | `minimal`: Minimal results layout, no score shown | `minimal_with_score`: Minimal results layout including the overall score | `advanced`: Advanced results layout with more detail | `full`: Full results layout with all sections | `full_expand_scores`: Full results with every score breakdown expanded."
    • changedInput schema / properties / seniority_level / description
      Previous value: -"Target seniority level for the role; auto-detected from the job description when omitted."New value: +"Target seniority level for the role; omit to keep the current one. Values: `entry-level`: Early-career or graduate roles | `intermediate`: Some experience required | `senior`: Experienced professional | `managerial`: Team or department lead | `director`: Director-level responsibility | `executive`: C-suite or executive role."
    • changedInput schema / properties / status / description
      Previous value: -"New publication status (type_interview_status). Refused (422) for the AI interview step of a multi-stage position (visibility sub_item): its status follows the position."New value: +"New publication status (preparing and completed are normally set by the platform), applied exactly as set_interview_state applies it: archiving an active position e-mails its candidates with open applications when the position-closed notice is on (set_interview_state previews that with dry_run, and also manages the iframe embed key and the vacancy lifecycle of a position). Refused (422) for the AI interview step of a multi-stage position: its status follows the position."
    • changedInput schema / properties / tags / description
      Previous value: -"Free-form tags stored on the interview. Only `active` sessions with visibility `public` or `merchant_public` are listed."New value: +"Free-form tags stored on the interview. Only `active` sessions with visibility `merchant_public` (or the platform's own `public`) are listed."
    • changedInput schema / properties / type_credit / description
      Previous value: -"Credit bucket the session draws from. Only meaningful for candidate-paid coaching/persona sessions; hiring interviews and assessments are merchant-billed and carry null."New value: +"Credit bucket the session draws from. Only meaningful for candidate-paid coaching/persona sessions; hiring interviews and assessments are merchant-billed and carry null. Values: `resume_check`: Resume Builder credits | `interview_coach_starter`: starter tier | `interview_coach_contributor`: contributor tier | `interview_coach_manager`: manager tier | `cover_letter`: Cover-letter credits."
    • changedInput schema / properties / visibility / description
      Previous value: -"Who can discover and access the interview. Refused (422) for the AI interview step of a multi-stage position (visibility sub_item): it follows the position."New value: +"Who can discover and access the interview. Refused (422) for the AI interview step of a multi-stage position: it follows the position. Values: `merchant_public`: Listed on the merchant's public interview list | `merchant_invite`: only candidates explicitly invited | `merchant_unlisted`: Reachable only via a direct link."
  3. Changed130 schema fields changed
    • changedInput schema / properties / candidate_expectations_json / description
      Previous value: -"Structured candidate expectations (the scoring rubric), bucketed by requirement level (weak/moderate/strong). A null is ignored: send a new rubric to replace it, or regenerate_candidate_expectations together with `questions` to derive it again. Extra keys are preserved."New value: +"Structured candidate expectations (the scoring rubric), bucketed by requirement level (weak/moderate/strong). A null is ignored: send a new rubric to replace it, or regenerate_candidate_expectations together with `questions` to derive it again."
    • removedInput schema / properties / candidate_expectations_json / properties / moderate / description
      Removed value: -"Requirements expected of a solid, competent candidate."
    • removedInput schema / properties / candidate_expectations_json / properties / strong / description
      Removed value: -"High-bar requirements only standout candidates clear."
    • removedInput schema / properties / candidate_expectations_json / properties / weak / description
      Removed value: -"Baseline requirements every viable candidate should meet (table stakes)."
    • changedInput schema / properties / candidate_notification_channel / description
      Previous value: -"SMS / WhatsApp notifications to the candidate, sent alongside the e-mails: \"reminders\" = with both e-mail reminders (day 1 and day 3); \"last_reminder\" = only with the final day-3 reminder; \"all\" = invitation, both reminders and the pre-screening-accepted step. null switches them off. WhatsApp is tried first, SMS when the number is not on WhatsApp. Available on paid plans (Starter and above) and needs a phone number on the candidate."New value: +"SMS / WhatsApp notifications to the candidate, sent alongside the e-mails: \"reminders\" = with both e-mail reminders (day 1 and day 3); \"last_reminder\" = only with the final day-3 reminder; \"all\" = invitation, both reminders and the pre-screening-accepted step. null switches them off."
    • changedInput schema / properties / coach_plan / description
      Previous value: -"Coaching-plan stage this item belongs to, used by the coaching-plan progress view. Omit to keep the current stage. A null is ignored: use `other` when no stage fits. Options — `demo`: Demo session. | `screening`: Screening-interview practice. | `2nd`: Second-interview practice. | `3rd`: Third-interview practice. | `closing`: Closing / salary-negotiation practice. | `job-specific`: Job-specific coaching. | `other`: Anything that does not fit the other buckets.."New value: +"Coaching-plan stage this item belongs to, used by the coaching-plan progress view. Omit to keep the current stage. A null is ignored: use `other` when no stage fits."
    • removedInput schema / properties / coach_plan / example
      Removed value: -"screening"
    • removedInput schema / properties / country_availability / properties / countries_allowed / description
      Removed value: -"Available ONLY to candidates in these countries (ISO 3166-1 alpha-2)."
    • removedInput schema / properties / country_availability / properties / countries_allowed / example
      Removed value: -[
      -  "PH",
      -  "IN"
      -]
    • removedInput schema / properties / country_availability / properties / countries_allowed_eu / description
      Removed value: -"Adds every EU country (plus EEA and Switzerland) to countries_allowed."
    • removedInput schema / properties / country_availability / properties / countries_blocked / description
      Removed value: -"NOT available to candidates in these countries (ISO 3166-1 alpha-2). Wins over the allowed side."
    • removedInput schema / properties / country_availability / properties / countries_blocked / example
      Removed value: -[
      -  "US"
      -]
    • removedInput schema / properties / country_availability / properties / countries_blocked_eu / description
      Removed value: -"Adds every EU country (plus EEA and Switzerland) to countries_blocked."
    • changedInput schema / properties / custom_fields / description
      Previous value: -"Company-defined position fields to set, {key: value}; a null value clears that field and keys you omit keep their value. Values are checked against the field definitions (option values, YYYY-MM-DD dates, {min, max, currency} ranges, user profile ids). Requires custom fields to be enabled for the company (else 403). Multi-stage positions only: on a single-stage interview the request is refused with 422."New value: +"Company-defined position fields to set, {key: value}; a null value clears that field and keys you omit keep their value. Requires custom fields to be enabled for the company (else 403). Multi-stage positions only: on a single-stage interview the request is refused with 422."
    • removedInput schema / properties / custom_fields / example
      Removed value: -{
      -  "contract_type": "permanent",
      -  "cost_centre": "CC-100"
      -}
    • changedInput schema / properties / description_long / description
      Previous value: -"Long-form interview description (column `interview_description_long`). Rendered as Markdown on the candidate-facing position page, including chips, callouts, cards, columns and buttons — formatting guide: https://developer.jobmojito.com/cookbooks/format-content-with-markdown"New value: +"Long-form interview description (column `interview_description_long`)."
    • changedInput schema / properties / emoji / description
      Previous value: -"Emoji marker shown in the admin lists. Interviews and positions. Blank is stored as null."New value: +"Emoji marker shown in the admin lists. Blank is stored as null."
    • changedInput schema / properties / environment / description
      Previous value: -"Which of your webhook environments results from this interview are delivered to. Defaults to production. Options — `production`: Live hiring. Results reach the webhooks configured as production. This is the default when the field is omitted. | `uat`: User-acceptance testing - an isolated environment for pre-release verification. | `development`: Development/testing. Use for interviews created by a test or preview app so their results never reach the production webhook. | `demo`: Demonstrations and sales trials.."New value: +"Which of your webhook environments results from this interview are delivered to. Defaults to production."
    • removedInput schema / properties / environment / example
      Removed value: -"production"
    • changedInput schema / properties / hiring_for_company / description
      Previous value: -"Who the position is really for. An object with name null/blank means hiring for yourself; { name: 'undisclosed' } for an unnamed external client; or { name: '<company>' } plus optional description/location/sector/company_size. Stored in creation_parameters.hiring_for_company."New value: +"Who the position is really for. An object with name null/blank means hiring for yourself; { name: 'undisclosed' } for an unnamed external client; or { name: '<company>' } plus optional description/location/sector/company_size."
    • removedInput schema / properties / hiring_for_company / example
      Removed value: -{
      -  "name": "undisclosed"
      -}
    • removedInput schema / properties / hiring_for_company / properties / company_size / description
      Removed value: -"Approximate headcount of the end employer."
    • removedInput schema / properties / hiring_for_company / properties / company_size / example
      Removed value: -"100-200"
    • removedInput schema / properties / hiring_for_company / properties / description / description
      Removed value: -"Short description of the end employer, used as background context by the agent."
    • removedInput schema / properties / hiring_for_company / properties / description / example
      Removed value: -"Unimo Enterprises is a leading logistics and supply chain solutions provider."
    • removedInput schema / properties / hiring_for_company / properties / location / description
      Removed value: -"Primary location of the end employer."
    • removedInput schema / properties / hiring_for_company / properties / location / example
      Removed value: -"Sri Lanka"
    • removedInput schema / properties / hiring_for_company / properties / name / description
      Removed value: -"End-employer name. Omit/null when hiring for yourself, 'undisclosed' for an unnamed external client, or the client's company name."
    • removedInput schema / properties / hiring_for_company / properties / name / example
      Removed value: -"Unimo Enterprises"
    • removedInput schema / properties / hiring_for_company / properties / sector / description
      Removed value: -"Industry / sector of the end employer."
    • removedInput schema / properties / hiring_for_company / properties / sector / example
      Removed value: -"Logistics and Supply Chain"
    • changedInput schema / properties / interview_attempts / description
      Previous value: -"Allowed candidate attempts (1-20). Stored as result_scoring.max_retries."New value: +"Allowed candidate attempts (1-20)."
    • removedInput schema / properties / interview_attempts / example
      Removed value: -1
    • removedInput schema / properties / interview_available_till / example
      Removed value: -"2026-12-31"
    • changedInput schema / properties / interview_category / description
      Previous value: -"Job category shown on public listings above the department (free text), e.g. \"Ashore\". Interviews and positions. Blank is stored as null."New value: +"Job category shown on public listings above the department (free text), e.g. \"Ashore\". Blank is stored as null."
    • removedInput schema / properties / interview_category / example
      Removed value: -"Ashore"
    • changedInput schema / properties / interview_conversation_speed / description
      Previous value: -"Conversation pace of the AI avatar. Omit to keep the current pace; `normal` is the default speaking pace. Options — `slower`: The avatar speaks more slowly — easier to follow for non-native speakers. | `normal`: Default speaking pace. | `faster`: The avatar speaks more quickly for a snappier conversation. | `fluent`: Talking pace: the avatar answers 300 ms after the candidate stops speaking. A pause mid-sentence also ends their turn.."New value: +"Conversation pace of the AI avatar. Omit to keep the current pace; `normal` is the default speaking pace."
    • removedInput schema / properties / interview_conversation_speed / example
      Removed value: -"normal"
    • removedInput schema / properties / interview_department / example
      Removed value: -"Engineering"
    • removedInput schema / properties / interview_salary / example
      Removed value: -"$80k - $100k"
    • changedInput schema / properties / interview_template_id / description
      Previous value: -"Id of the interview template (avatar/voice) to use. Must reference an existing interview_templates row. Also decides the modality — see list_avatars / merchant-avatar-list."New value: +"Id of the interview template (avatar/voice) to use. Must reference an existing interview_templates row."
    • removedInput schema / properties / interview_template_id / example
      Removed value: -"46b98d37-1557-4391-beca-03037ead19f2"
    • changedInput schema / properties / interview_tone / description
      Previous value: -"Tone — configures the AI avatar's speaking style and the follow-up questions it generates. Stored in creation_parameters; existing questions are NOT regenerated. Case-insensitive; omit to default to relaxed. Options — `relaxed`: Friendly and conversational tone that helps candidates feel at ease. | `simple`: Plain language at CEFR A2 level — short sentences and simple words. | `professional`: Formal and business-like approach suitable for senior roles. | `persuasive`: Engaging style that encourages candidates to elaborate. | `exact`: Asks the questions exactly as provided, without rephrasing — for interviews built from your own questions (create_interview_from_questions) where the wording is a script.."New value: +"Tone — configures the AI avatar's speaking style and the follow-up questions it generates. Case-insensitive; omit to default to relaxed."
    • removedInput schema / properties / interview_tone / example
      Removed value: -"professional"
    • changedInput schema / properties / interview_type / description
      Previous value: -"Interview style — configures the AI avatar and the follow-up questions it generates during the interview. Stored in creation_parameters; existing questions are NOT regenerated. Options — `pre-screening`: Pre-screening — quick qualification check focusing on basic requirements and availability. | `pre-screening-with-test-questions`: Pre-screening with test questions — pre-screening plus practical questions to test relevant skills. | `second-interview`: Second round interview — deeper dive for candidates who passed initial screening. | `remote-freelancer-verification`: Remote worker verification — verify remote work capabilities and communication skills. | `strength-based-interview`: Strength-based interview — focus on what candidates enjoy and excel at to predict job satisfaction. | `potential-based-interview`: Potential-based interview — assess learning ability and growth potential rather than past experience. | `process-verification-from-knowledge-base`: Knowledge Base interview — generate questions from your knowledge base documents. | `knockout-screening`: Knock-out screening — a short (about 5 minute) check of the role's must-haves with closed questions; ends early, politely, when a must-have is clearly not met. On creation it defaults custom_scoring.early_stop to true (where the avatar supports early stop) and max_followups to 1 unless you send them.."New value: +"Interview style — configures the AI avatar and the follow-up questions it generates during the interview."
    • removedInput schema / properties / interview_type / example
      Removed value: -"pre-screening-with-test-questions"
    • addedInput schema / properties / llm_model
      Added value: +{
      +  "description": "Your model id, e.g. \"claude-opus-4-8\"; \"unknown\" if unsure. For analytics.",
      +  "type": "string"
      +}
    • removedInput schema / properties / location / example
      Removed value: -"remote"
    • changedInput schema / properties / max_duration / description
      Previous value: -"Live session limit in seconds. Also the basis for the credit multiplier."New value: +"Live session limit in seconds."
    • removedInput schema / properties / max_duration / example
      Removed value: -1200
    • removedInput schema / properties / max_followups / example
      Removed value: -2
    • removedInput schema / properties / name / example
      Removed value: -"Project manager"
    • removedInput schema / properties / pdf_export_auto_config / properties / ai_recruiter_assessment / description
      Removed value: -"Include the AI recruiter assessment."
    • removedInput schema / properties / pdf_export_auto_config / properties / ai_scoring_rubric / description
      Removed value: -"Include the AI scoring rubric."
    • removedInput schema / properties / pdf_export_auto_config / properties / analytics / description
      Removed value: -"Include analytics."
    • removedInput schema / properties / pdf_export_auto_config / properties / answer_recording / description
      Removed value: -"Include per-answer recordings."
    • removedInput schema / properties / pdf_export_auto_config / properties / contact_details / description
      Removed value: -"Include candidate contact details."
    • removedInput schema / properties / pdf_export_auto_config / properties / files / description
      Removed value: -"Include uploaded candidate files."
    • removedInput schema / properties / pdf_export_auto_config / properties / group_by_question / description
      Removed value: -"Group transcript answers by expected question."
    • removedInput schema / properties / pdf_export_auto_config / properties / mojito_language_code / description
      Removed value: -"Report language code (a platform-languages.json code)."
    • removedInput schema / properties / pdf_export_auto_config / properties / mojito_language_code / example
      Removed value: -"en"
    • removedInput schema / properties / pdf_export_auto_config / properties / session_recording / description
      Removed value: -"Include the full-session recording."
    • removedInput schema / properties / pdf_export_auto_config / properties / template / description
      Removed value: -"Report layout: classic, modern, or one_pager. Omit for the merchant default (modern when unset)."
    • removedInput schema / properties / pdf_export_auto_config / properties / transcript / description
      Removed value: -"Include the interview transcript."
    • changedInput schema / properties / position_id / description
      Previous value: -"Id of the interview definition (single-stage) or position definition (multi-stage) to update. The same id you pass to job-interview-get."New value: +"Id of the interview definition (single-stage) or position definition (multi-stage) to update."
    • removedInput schema / properties / position_id / example
      Removed value: -"00000000-0000-0000-0000-000000000000"
    • changedInput schema / properties / questions / description
      Previous value: -"OPTIONAL. Omit this field entirely and the interview's questions are left exactly as they are — this endpoint only touches questions when you send the array. When you do send it, send the COMPLETE list you want the interview to end up with, in order, in the same format job-interview-create-from-array accepts and job-interview-get returns: there is no way to change a single question on its own, so read the interview, edit that array, and send the whole thing back. An empty array is rejected. It is applied as a DIFF, not a replace, so resending the array job-interview-get gave you changes nothing at all. Each entry is matched against what is stored — first on `external_id`, then on `id`, then on identical content — and: an entry matching an unchanged question keeps that question exactly as it is, including its answer rules and any rendered avatar video; an entry matching a question whose content differs unlinks the old question and creates a new one in its place (fields you omit are carried over from the old one); an entry matching nothing is created; and a stored question no entry matches is unlinked. `questions_diff` in the response reports exactly what was decided. Questions are shared records, so nothing is ever deleted — removing one only unlinks it from this interview, and an edit is always unlink-old + create-new so the change cannot leak into another interview reusing the same question. The welcome, thank-you and instructional-video steps are not part of this array and are left in place. Single-stage interviews only; for a multi-stage position, update its interview stages individually."New value: +"OPTIONAL. Omit this field entirely and the interview's questions are left exactly as they are — this endpoint only touches questions when you send the array. When you do send it, send the COMPLETE list you want the interview to end up with, in order, in the same format job-interview-create-from-array accepts and job-interview-get returns: there is no way to change a single question on its own, so read the interview, edit that array, and send the whole thing back. An empty array is rejected. It is applied as a DIFF, not a replace, so resending the array job-interview-get gave you changes nothing at all. Each entry is matched against what is stored — first on `external_id`, then on `id`, then on identical content — and: an entry matching an unchanged question keeps that question exactly as it is, including its answer rules and any rendered avatar video; an entry matching a question whose content differs unlinks the old question and creates a new one in its place (fields you omit are carried over from the old one); an entry matching nothing is created; and a stored question no entry matches is unlinked. Questions are shared records, so nothing is ever deleted — removing one only unlinks it from this interview, and an edit is always unlink-old + create-new so the change cannot leak into another interview reusing the same question. Single-stage interviews only; for a multi-stage position, update its interview stages individually."
    • removedInput schema / properties / questions / items / properties / candidate_expectations_json / description
      Removed value: -"Per-question candidate expectations, bucketed by requirement level (weak/moderate/strong). Extra keys are preserved."
    • removedInput schema / properties / questions / items / properties / candidate_expectations_json / properties / moderate / description
      Removed value: -"Requirements expected of a solid, competent candidate."
    • removedInput schema / properties / questions / items / properties / candidate_expectations_json / properties / strong / description
      Removed value: -"High-bar requirements only standout candidates clear."
    • removedInput schema / properties / questions / items / properties / candidate_expectations_json / properties / weak / description
      Removed value: -"Baseline requirements every viable candidate should meet (table stakes)."
    • removedInput schema / properties / questions / items / properties / conditional_question_answer / description
      Removed value: -"With conditional_question_main_id: the answer to the yes/no question that shows this follow-up. `true` (the default) asks it after a yes, `false` after a no, so each answer can lead to its own follow-ups. Ignored on a question without conditional_question_main_id."
    • removedInput schema / properties / questions / items / properties / conditional_question_answer / example
      Removed value: -false
    • removedInput schema / properties / questions / items / properties / conditional_question_main_id / description
      Removed value: -"For a follow-up question, the id (the \"id\" field above) of the yes/no question (is_conditional) in this same array that decides whether it is asked. The yes/no question must appear earlier in the array. Use conditional_question_answer to choose the answer that shows it."
    • removedInput schema / properties / questions / items / properties / duration / description
      Removed value: -"Answer duration in seconds for this question."
    • removedInput schema / properties / questions / items / properties / external_data / description
      Removed value: -"Arbitrary JSON metadata stored on the question."
    • removedInput schema / properties / questions / items / properties / external_id / description
      Removed value: -"External identifier stored on the question. job-interview-update matches on this first, so an ATS that owns stable ids can send its own array and have the diff line up without round-tripping our ids."
    • removedInput schema / properties / questions / items / properties / id / description
      Removed value: -"Identifier for this question. job-interview-get returns the question's real id here; send it back to job-interview-update so an unchanged question keeps its existing record (and with it its answer rules and any rendered avatar video). Also the handle another question references via conditional_question_main_id. On job-interview-create-from-array it is a caller-local value, only needed for those references."
    • removedInput schema / properties / questions / items / properties / is_candidate_asking_recruiter / description
      Removed value: -"Candidate-asks-recruiter prompt (view 'candidate asking recruiter')."
    • removedInput schema / properties / questions / items / properties / is_conditional / description
      Removed value: -"A yes/no question that decides which follow-ups are asked (view 'with listening conditional'). Its follow-ups point at it with conditional_question_main_id."
    • removedInput schema / properties / questions / items / properties / is_expert / description
      Removed value: -"Expert listening question (view 'with listening expert')."
    • removedInput schema / properties / questions / items / properties / is_multiple_choice / description
      Removed value: -"Multiple-choice question (view 'multiple choice')."
    • removedInput schema / properties / questions / items / properties / is_skippable / description
      Removed value: -"The candidate may skip this question: the recorded (offline avatar) interview shows a Skip button on it, and a skipped question is saved without an answer. Defaults to false."
    • removedInput schema / properties / questions / items / properties / is_skippable / example
      Removed value: -false
    • removedInput schema / properties / questions / items / properties / is_without_scoring / description
      Removed value: -"Question is asked but not scored (view 'without scoring')."
    • removedInput schema / properties / questions / items / properties / knowledge_base_id / description
      Removed value: -"Knowledge-base store id (uuid) the question draws context from."
    • removedInput schema / properties / questions / items / properties / label / description
      Removed value: -"Optional label/tag stored on the question."
    • removedInput schema / properties / questions / items / properties / mojito_language_code / description
      Removed value: -"Per-question language override (one of the platform-languages.json codes). Inherits the interview language when omitted."
    • removedInput schema / properties / questions / items / properties / mojito_language_code / example
      Removed value: -"en"
    • removedInput schema / properties / questions / items / properties / question / description
      Removed value: -"The question text shown to the candidate."
    • removedInput schema / properties / questions / items / properties / question_alternatives / description
      Removed value: -"Alternative phrasings for the question."
    • removedInput schema / properties / questions_random_subset / example
      Removed value: -0.5
    • changedInput schema / properties / recording / description
      Previous value: -"Cheating/proctoring detection mode for candidate answers — this is NOT a full session recording. Video options also record the candidate. Omit to keep the current setting. A null is ignored: turn it off in the admin console. Options — `audio_first_5_answers`: Audio-only cheating detection, first 5 answers only. | `audio_all`: Audio-only cheating detection on every answer. | `video_all`: Audio + video cheating detection on every answer (candidate is recorded for all answers). | `video_first_5_answers`: Audio + video cheating detection, first 5 answers only.."New value: +"Cheating/proctoring detection mode for candidate answers — this is NOT a full session recording. Omit to keep the current setting. A null is ignored: turn it off in the admin console."
    • removedInput schema / properties / recording / example
      Removed value: -"video_all"
    • changedInput schema / properties / recording_full_session / description
      Previous value: -"Full interview-session recording (includes the avatar and voice) produced as a single file. Independent of `recording`. Omit to keep the current setting. A null is ignored: turn it off in the admin console. Options — `audio_all`: Record the whole session audio (avatar + candidate voice) into a single file. Adds +0.2 credits. | `video_all`: Record the whole session video + audio (avatar + candidate) into a single file. Adds +0.4 credits.."New value: +"Full interview-session recording (includes the avatar and voice) produced as a single file. Omit to keep the current setting. A null is ignored: turn it off in the admin console."
    • removedInput schema / properties / recording_full_session / example
      Removed value: -"video_all"
    • removedInput schema / properties / regenerate_candidate_expectations / example
      Removed value: -false
    • changedInput schema / properties / result_view / description
      Previous value: -"Result screen shown to the candidate after finishing. With any value other than `none`, the candidate sees a results screen where they can provide feedback, record an intro video and edit the transcript, and must then submit the result; the value sets how much score/result detail is shown. Options — `none`: No results screen at all — the interview is submitted immediately when the candidate finishes (no feedback, intro video, transcript edit or manual submit step). | `minimal`: Minimal results layout, no score shown. | `minimal_with_score`: Minimal results layout including the overall score. | `advanced`: Advanced results layout with more detail. | `full`: Full results layout with all sections. | `full_expand_scores`: Full results with every score breakdown expanded.."New value: +"Result screen shown to the candidate after finishing. With any value other than `none`, the candidate sees a results screen where they can provide feedback, record an intro video and edit the transcript, and must then submit the result; the value sets how much score/result detail is shown."
    • removedInput schema / properties / result_view / example
      Removed value: -"full"
    • changedInput schema / properties / seniority_level / description
      Previous value: -"Target seniority level for the role; auto-detected from the job description when omitted. Options — `entry-level`: Early-career or graduate roles. | `intermediate`: Some experience required. | `senior`: Experienced professional. | `managerial`: Team or department lead. | `director`: Director-level responsibility. | `executive`: C-suite or executive role.."New value: +"Target seniority level for the role; auto-detected from the job description when omitted."
    • removedInput schema / properties / seniority_level / example
      Removed value: -"senior"
    • changedInput schema / properties / status / description
      Previous value: -"New publication status (type_interview_status). Applied through the same interview_set_status routine as job-interview-set-state (which is also where you manage the iframe embed key and the vacancy lifecycle of a position). Refused (422) for the AI interview step of a multi-stage position (visibility sub_item): its status follows the position."New value: +"New publication status (type_interview_status). Refused (422) for the AI interview step of a multi-stage position (visibility sub_item): its status follows the position."
    • removedInput schema / properties / status / example
      Removed value: -"active"
    • changedInput schema / properties / tags / description
      Previous value: -"Free-form tags stored on the interview. Tags are also the coaching-catalogue mapping key: a catalogue directory (see the catalogue-tag-create / catalogue-tag-update endpoints) lists a coaching or persona session when the session's tags contain EVERY tag in that directory's `tags_interview_set_filter`. Only `active` sessions with visibility `public` or `merchant_public` are listed."New value: +"Free-form tags stored on the interview. Only `active` sessions with visibility `public` or `merchant_public` are listed."
    • removedInput schema / properties / tags / example
      Removed value: -[
      -  "interview-practice",
      -  "sales"
      -]
    • changedInput schema / properties / team / description
      Previous value: -"Multi-stage positions only (422 on an interview): the complete hiring team you want, replacing the current members (viewers, managed with position access, are kept). An empty array removes everyone. Needs the hiring team switched on for the company (else 403) and access to the position. Each member is a person (profile_id: an active or invited staff user of the company) or a group (profile_group_id), with a role. The answer carries the resulting `team`."New value: +"Multi-stage positions only (422 on an interview): the complete hiring team you want, replacing the current members (viewers, managed with position access, are kept). An empty array removes everyone. Needs the hiring team switched on for the company (else 403) and access to the position."
    • removedInput schema / properties / team / example
      Removed value: -[
      -  {
      -    "profile_id": "00000000-0000-0000-0000-000000000001",
      -    "role": "interviewer"
      -  }
      -]
    • removedInput schema / properties / team / items / properties / profile_group_id / description
      Removed value: -"A group of the company (profile_group.id)."
    • removedInput schema / properties / team / items / properties / profile_id / description
      Removed value: -"A person: an active or invited staff user of the company (profile.id)."
    • removedInput schema / properties / team / items / properties / role / description
      Removed value: -"Role on the hiring team."
    • removedInput schema / properties / type / example
      Removed value: -"interview"
    • changedInput schema / properties / type_credit / description
      Previous value: -"Credit bucket the session draws from. Only meaningful for candidate-paid coaching/persona sessions; hiring interviews and assessments are merchant-billed and carry null. Options — `resume_check`: Resume-check credits. | `interview_coach_starter`: Coaching credits — starter tier. | `interview_coach_contributor`: Coaching credits — contributor tier. | `interview_coach_manager`: Coaching credits — manager tier. | `cover_letter`: Cover-letter credits.."New value: +"Credit bucket the session draws from. Only meaningful for candidate-paid coaching/persona sessions; hiring interviews and assessments are merchant-billed and carry null."
    • removedInput schema / properties / type_credit / example
      Removed value: -"interview_coach_manager"
    • changedInput schema / properties / visibility / description
      Previous value: -"Who can discover and access the interview. Refused (422) for the AI interview step of a multi-stage position (visibility sub_item): it follows the position. Options — `merchant_public`: Listed on the merchant's public interview list — anyone with the merchant link can find and start it. | `merchant_invite`: Invite-only — only candidates explicitly invited (by email/link) can access it; not listed anywhere. | `merchant_unlisted`: Reachable only via a direct link — not listed anywhere; share the link manually.."New value: +"Who can discover and access the interview. Refused (422) for the AI interview step of a multi-stage position (visibility sub_item): it follows the position."
    • removedInput schema / properties / visibility / example
      Removed value: -"merchant_public"
    • removedOutput schema / description
      Removed value: -"Confirmation of what was updated."
    • removedOutput schema / properties / is_multistage / description
      Removed value: -"True when the id resolved to a multi-stage position (position_def_set) rather than a single interview."
    • removedOutput schema / properties / position_id / description
      Removed value: -"The id that was updated."
    • removedOutput schema / properties / questions_diff / description
      Removed value: -"What the question diff decided, question by question. Absent when `questions` was not sent."
    • removedOutput schema / properties / questions_diff / properties / added / description
      Removed value: -"Ids of the questions created for entries that matched nothing stored."
    • removedOutput schema / properties / questions_diff / properties / kept / description
      Removed value: -"Questions left exactly as they were, record and all."
    • removedOutput schema / properties / questions_diff / properties / question_ids / description
      Removed value: -"The interview's full ordered step list after the update, including the welcome / thank-you / instructional steps this endpoint does not manage."
    • removedOutput schema / properties / questions_diff / properties / reactivated / description
      Removed value: -"True when the interview was already active and was re-published so the new questions go live."
    • removedOutput schema / properties / questions_diff / properties / removed / description
      Removed value: -"Ids unlinked because no entry in the request matched them. The question records themselves still exist."
    • removedOutput schema / properties / questions_diff / properties / replaced / description
      Removed value: -"Edited questions: the old record was unlinked and a new one created, so the change cannot leak into other interviews reusing it."
    • removedOutput schema / properties / questions_diff / properties / replaced / items / properties / from / description
      Removed value: -"The id that was unlinked."
    • removedOutput schema / properties / questions_diff / properties / replaced / items / properties / to / description
      Removed value: -"The id of the question created in its place."
    • changedOutput schema / properties / team / allOf
      Previous value: -[
      -  {
      -    "description": "include=team (multi-stage positions): the hiring team.",
      -    "properties": {
      -      "enabled": {
      -        "description": "Whether the company has the hiring team switched on (switch hiring_team); members is empty while it is off.",
      -        "type": [
      -          "boolean",
      -          "null"
      -        ]
      -      },
      -      "members": {
      -        "description": "Members by role, then name.",
      -        "items": {
      -          "properties": {
      -            "email": {
      -              "description": "E-mail of a person.",
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "group_member_count": {
      -              "description": "People in a group (with its subgroups).",
      -              "type": [
      -                "number",
      -                "null"
      -              ]
      -            },
      -            "group_name": {
      -              "description": "Group name.",
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "id": {
      -              "description": "Membership id (position_team.id).",
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "name": {
      -              "description": "Person or group name.",
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "profile_group_id": {
      -              "description": "A group (profile_group.id); null for a person.",
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "profile_id": {
      -              "description": "A person (profile.id); null for a group.",
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "role": {
      -              "description": "Role on the hiring team.",
      -              "enum": [
      -                "recruiter",
      -                "sourcer",
      -                "coordinator",
      -                "hiring_manager",
      -                "interviewer",
      -                "viewer",
      -                null
      -              ],
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            }
      -          },
      -          "required": [
      -            "id",
      -            "role",
      -            "profile_id",
      -            "profile_group_id",
      -            "name",
      -            "email",
      -            "group_name",
      -            "group_member_count"
      -          ],
      -          "type": "object"
      -        },
      -        "type": [
      -          "array",
      -          "null"
      -        ]
      -      },
      -      "owner": {
      -        "description": "The position's recruiter (recruiter_profile_id); null when none.",
      -        "properties": {
      -          "email": {
      -            "description": "E-mail.",
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "name": {
      -            "description": "Name.",
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "profile_id": {
      -            "description": "Owning recruiter (profile.id).",
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          }
      -        },
      -        "required": [
      -          "profile_id",
      -          "name",
      -          "email"
      -        ],
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      }
      -    },
      -    "required": [
      -      "enabled",
      -      "owner",
      -      "members"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "The hiring team after the change. Absent when `team` was not sent."
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "enabled": {
      +        "type": [
      +          "boolean",
      +          "null"
      +        ]
      +      },
      +      "members": {
      +        "items": {
      +          "properties": {
      +            "email": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "group_member_count": {
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            },
      +            "group_name": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "id": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "name": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "profile_group_id": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "profile_id": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "role": {
      +              "enum": [
      +                "recruiter",
      +                "sourcer",
      +                "coordinator",
      +                "hiring_manager",
      +                "interviewer",
      +                "viewer",
      +                null
      +              ],
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            }
      +          },
      +          "required": [
      +            "id",
      +            "role",
      +            "profile_id",
      +            "profile_group_id",
      +            "name",
      +            "email",
      +            "group_name",
      +            "group_member_count"
      +          ],
      +          "type": "object"
      +        },
      +        "type": [
      +          "array",
      +          "null"
      +        ]
      +      },
      +      "owner": {
      +        "properties": {
      +          "email": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "name": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "profile_id": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "profile_id",
      +          "name",
      +          "email"
      +        ],
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "enabled",
      +      "owner",
      +      "members"
      +    ],
      +    "type": "object"
      +  },
      +  {}
      +]
    • removedOutput schema / properties / updated_fields / description
      Removed value: -"Names of the stored columns that were written, plus `status` when the publication status was changed, `questions` when the question list was diffed, `custom_fields` and `team` when those were set."
    • removedOutput schema / properties / updated_fields / example
      Removed value: -[
      -  "name",
      -  "tags"
      -]
  4. Changed10 schema fields changed
    • addedInput schema / properties / allow_human_interview
      Added value: +{
      +  "description": "A recruiter may hold the interview instead of the AI. Single-stage interviews only (an interview step of a position carries its own setting, see merchant-position-step-update).",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / collect_resume_cover_letter
      Added value: +{
      +  "description": "Ask the candidate for a resume / cover letter: hidden, optional or required. Single-stage interviews only.",
      +  "enum": [
      +    "hidden",
      +    "optional",
      +    "required"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / emoji
      Added value: +{
      +  "description": "Emoji marker shown in the admin lists. Interviews and positions. Blank is stored as null.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / interview_category
      Added value: +{
      +  "description": "Job category shown on public listings above the department (free text), e.g. \"Ashore\". Interviews and positions. Blank is stored as null.",
      +  "example": "Ashore",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedInput schema / properties / recruiter_profile_id / description
      Previous value: -"Profile id of the recruiter owning this interview. Must be a merchant/merchant_owner/admin profile of the same merchant. An empty string clears it."New value: +"Profile id of the recruiter owning this interview or position (profile.id). Must be an active owner, recruiter or admin of the company (own staff or a sub-merchant grant holder), else 422. An empty string clears it."
    • changedInput schema / properties / status / description
      Previous value: -"New lifecycle status. Applied through the same interview_set_status routine as job-interview-set-state (which is also where you manage the iframe embed key)."New value: +"New publication status (type_interview_status). Applied through the same interview_set_status routine as job-interview-set-state (which is also where you manage the iframe embed key and the vacancy lifecycle of a position). Refused (422) for the AI interview step of a multi-stage position (visibility sub_item): its status follows the position."
    • addedInput schema / properties / team
      Added value: +{
      +  "description": "Multi-stage positions only (422 on an interview): the complete hiring team you want, replacing the current members (viewers, managed with position access, are kept). An empty array removes everyone. Needs the hiring team switched on for the company (else 403) and access to the position. Each member is a person (profile_id: an active or invited staff user of the company) or a group (profile_group_id), with a role. The answer carries the resulting `team`.",
      +  "example": [
      +    {
      +      "profile_id": "00000000-0000-0000-0000-000000000001",
      +      "role": "interviewer"
      +    }
      +  ],
      +  "items": {
      +    "properties": {
      +      "profile_group_id": {
      +        "description": "A group of the company (profile_group.id).",
      +        "format": "uuid",
      +        "type": "string"
      +      },
      +      "profile_id": {
      +        "description": "A person: an active or invited staff user of the company (profile.id).",
      +        "format": "uuid",
      +        "type": "string"
      +      },
      +      "role": {
      +        "description": "Role on the hiring team.",
      +        "enum": [
      +          "recruiter",
      +          "sourcer",
      +          "coordinator",
      +          "hiring_manager",
      +          "interviewer"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "role"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 100,
      +  "type": "array"
      +}
    • changedInput schema / properties / visibility / description
      Previous value: -"Who can discover and access the interview. Options — `merchant_public`: Listed on the merchant's public interview list — anyone with the merchant link can find and start it. | `merchant_invite`: Invite-only — only candidates explicitly invited (by email/link) can access it; not listed anywhere. | `merchant_unlisted`: Reachable only via a direct link — not listed anywhere; share the link manually.."New value: +"Who can discover and access the interview. Refused (422) for the AI interview step of a multi-stage position (visibility sub_item): it follows the position. Options — `merchant_public`: Listed on the merchant's public interview list — anyone with the merchant link can find and start it. | `merchant_invite`: Invite-only — only candidates explicitly invited (by email/link) can access it; not listed anywhere. | `merchant_unlisted`: Reachable only via a direct link — not listed anywhere; share the link manually.."
    • addedOutput schema / properties / team
      Added value: +{
      +  "allOf": [
      +    {
      +      "description": "include=team (multi-stage positions): the hiring team.",
      +      "properties": {
      +        "enabled": {
      +          "description": "Whether the company has the hiring team switched on (switch hiring_team); members is empty while it is off.",
      +          "type": [
      +            "boolean",
      +            "null"
      +          ]
      +        },
      +        "members": {
      +          "description": "Members by role, then name.",
      +          "items": {
      +            "properties": {
      +              "email": {
      +                "description": "E-mail of a person.",
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "group_member_count": {
      +                "description": "People in a group (with its subgroups).",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "group_name": {
      +                "description": "Group name.",
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "id": {
      +                "description": "Membership id (position_team.id).",
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "name": {
      +                "description": "Person or group name.",
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "profile_group_id": {
      +                "description": "A group (profile_group.id); null for a person.",
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "profile_id": {
      +                "description": "A person (profile.id); null for a group.",
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "role": {
      +                "description": "Role on the hiring team.",
      +                "enum": [
      +                  "recruiter",
      +                  "sourcer",
      +                  "coordinator",
      +                  "hiring_manager",
      +                  "interviewer",
      +                  "viewer",
      +                  null
      +                ],
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              }
      +            },
      +            "required": [
      +              "id",
      +              "role",
      +              "profile_id",
      +              "profile_group_id",
      +              "name",
      +              "email",
      +              "group_name",
      +              "group_member_count"
      +            ],
      +            "type": "object"
      +          },
      +          "type": [
      +            "array",
      +            "null"
      +          ]
      +        },
      +        "owner": {
      +          "description": "The position's recruiter (recruiter_profile_id); null when none.",
      +          "properties": {
      +            "email": {
      +              "description": "E-mail.",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "name": {
      +              "description": "Name.",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "profile_id": {
      +              "description": "Owning recruiter (profile.id).",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            }
      +          },
      +          "required": [
      +            "profile_id",
      +            "name",
      +            "email"
      +          ],
      +          "type": [
      +            "object",
      +            "null"
      +          ]
      +        }
      +      },
      +      "required": [
      +        "enabled",
      +        "owner",
      +        "members"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "description": "The hiring team after the change. Absent when `team` was not sent."
      +    }
      +  ]
      +}
    • changedOutput schema / properties / updated_fields / description
      Previous value: -"Names of the stored columns that were written, plus `status` when the lifecycle status was changed and `questions` when the question list was diffed."New value: +"Names of the stored columns that were written, plus `status` when the publication status was changed, `questions` when the question list was diffed, `custom_fields` and `team` when those were set."
  5. Changed54 schema fields changed
    • changedInput schema / properties / candidate_expectations_json / description
      Previous value: -"Structured candidate expectations (the scoring rubric), bucketed by requirement level (weak/moderate/strong). null clears the rubric. Extra keys are preserved."New value: +"Structured candidate expectations (the scoring rubric), bucketed by requirement level (weak/moderate/strong). A null is ignored: send a new rubric to replace it, or regenerate_candidate_expectations together with `questions` to derive it again. Extra keys are preserved."
    • changedInput schema / properties / candidate_expectations_json / properties / moderate / type
      Previous value: -[
      -  "array",
      -  "null"
      -]New value: +"array"
    • changedInput schema / properties / candidate_expectations_json / properties / strong / type
      Previous value: -[
      -  "array",
      -  "null"
      -]New value: +"array"
    • changedInput schema / properties / candidate_expectations_json / properties / weak / type
      Previous value: -[
      -  "array",
      -  "null"
      -]New value: +"array"
    • changedInput schema / properties / candidate_video_introduction / description
      Previous value: -"Whether a candidate video introduction is hidden, optional or required. null is treated like hidden."New value: +"Whether a candidate video introduction is hidden, optional or required. Send `hidden` to stop asking."
    • changedInput schema / properties / coach_plan / description
      Previous value: -"Coaching-plan stage this item belongs to, used by the coaching-plan progress view. Omit/null to leave it out of any plan. Options — `demo`: Demo session. | `screening`: Screening-interview practice. | `2nd`: Second-interview practice. | `3rd`: Third-interview practice. | `closing`: Closing / salary-negotiation practice. | `job-specific`: Job-specific coaching. | `other`: Anything that does not fit the other buckets.."New value: +"Coaching-plan stage this item belongs to, used by the coaching-plan progress view. Omit to keep the current stage. A null is ignored: use `other` when no stage fits. Options — `demo`: Demo session. | `screening`: Screening-interview practice. | `2nd`: Second-interview practice. | `3rd`: Third-interview practice. | `closing`: Closing / salary-negotiation practice. | `job-specific`: Job-specific coaching. | `other`: Anything that does not fit the other buckets.."
    • changedInput schema / properties / conversation_id / description
      Previous value: -"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."New value: +"The conversation_id this server returned earlier in this conversation, unchanged, including after later user messages. Omit it if you have none. Recorded for the server developer's analytics."
    • changedInput schema / properties / country_availability / description
      Previous value: -"Which countries the interview / position is open to on the candidate portal, judged by the IP address the candidate opens it from (an unknown location only passes when countries_allowed / countries_allowed_eu are empty). From a closed country it is left out of the portal listings, and a direct link shows \"not available in your region\". Invited candidates (register_users / invite links) and candidates who already started keep access; API and MCP calls themselves are never restricted. Null = not used, every country."New value: +"Which countries the interview / position is open to on the candidate portal, judged by the IP address the candidate opens it from (an unknown location only passes when countries_allowed / countries_allowed_eu are empty). From a closed country it is left out of the portal listings, and a direct link shows \"not available in your region\". Invited candidates (register_users / invite links) and candidates who already started keep access; API and MCP calls themselves are never restricted. An empty object {} = not used, every country."
    • changedInput schema / properties / country_availability / properties / countries_allowed / type
      Previous value: -[
      -  "array",
      -  "null"
      -]New value: +"array"
    • changedInput schema / properties / country_availability / properties / countries_allowed_eu / type
      Previous value: -[
      -  "boolean",
      -  "null"
      -]New value: +"boolean"
    • changedInput schema / properties / country_availability / properties / countries_blocked / type
      Previous value: -[
      -  "array",
      -  "null"
      -]New value: +"array"
    • changedInput schema / properties / country_availability / properties / countries_blocked_eu / type
      Previous value: -[
      -  "boolean",
      -  "null"
      -]New value: +"boolean"
    • changedInput schema / properties / custom_fields / type
      Previous value: -[
      -  "object",
      -  "null"
      -]New value: +"object"
    • changedInput schema / properties / environment / enum
      Previous value: -[
      -  "production",
      -  "uat",
      -  "development",
      -  "demo",
      -  null
      -]New value: +[
      +  "production",
      +  "uat",
      +  "development",
      +  "demo"
      +]
    • changedInput schema / properties / environment / type
      Previous value: -[
      -  "string",
      -  "null"
      -]New value: +"string"
    • changedInput schema / properties / hiring_for_company / description
      Previous value: -"Who the position is really for. null (or an object with name null/blank) means hiring for yourself; { name: 'undisclosed' } for an unnamed external client; or { name: '<company>' } plus optional description/location/sector/company_size. Stored in creation_parameters.hiring_for_company."New value: +"Who the position is really for. An object with name null/blank means hiring for yourself; { name: 'undisclosed' } for an unnamed external client; or { name: '<company>' } plus optional description/location/sector/company_size. Stored in creation_parameters.hiring_for_company."
    • changedInput schema / properties / interview_attempts / type
      Previous value: -[
      -  "number",
      -  "null"
      -]New value: +"number"
    • changedInput schema / properties / interview_available_till / description
      Previous value: -"ISO date/time after which the interview is no longer available to candidates. null keeps it always available."New value: +"ISO date/time after which the interview is no longer available to candidates. An empty string keeps it always available."
    • changedInput schema / properties / interview_conversation_speed / description
      Previous value: -"Conversation pace of the AI avatar. Omit/null keeps the template default pace. Options — `slower`: The avatar speaks more slowly — easier to follow for non-native speakers. | `normal`: Default speaking pace. | `faster`: The avatar speaks more quickly for a snappier conversation. | `fluent`: Talking pace: the avatar answers 300 ms after the candidate stops speaking. A pause mid-sentence also ends their turn.."New value: +"Conversation pace of the AI avatar. Omit to keep the current pace; `normal` is the default speaking pace. Options — `slower`: The avatar speaks more slowly — easier to follow for non-native speakers. | `normal`: Default speaking pace. | `faster`: The avatar speaks more quickly for a snappier conversation. | `fluent`: Talking pace: the avatar answers 300 ms after the candidate stops speaking. A pause mid-sentence also ends their turn.."
    • changedInput schema / properties / interview_template_id / type
      Previous value: -[
      -  "string",
      -  "null"
      -]New value: +"string"
    • changedInput schema / properties / knowledge_base_store_id / description
      Previous value: -"Knowledge base store id the interview draws context from; validated for existence. null unlinks it."New value: +"Knowledge base store id the interview draws context from; validated for existence. An empty string unlinks it."
    • changedInput schema / properties / max_followups / description
      Previous value: -"Maximum number of AI follow-up questions. 0 disables follow-ups; presets are 0-3 (none/low/normal/high) and custom values start at 4; null uses the template default (Normal)."New value: +"Maximum number of AI follow-up questions. 0 disables follow-ups; presets are 0-3 (none/low/normal/high) and custom values start at 4; 2 is the template default (Normal)."
    • changedInput schema / properties / pdf_export_auto_config / properties / ai_recruiter_assessment / type
      Previous value: -[
      -  "boolean",
      -  "null"
      -]New value: +"boolean"
    • changedInput schema / properties / pdf_export_auto_config / properties / ai_scoring_rubric / type
      Previous value: -[
      -  "boolean",
      -  "null"
      -]New value: +"boolean"
    • changedInput schema / properties / pdf_export_auto_config / properties / analytics / type
      Previous value: -[
      -  "boolean",
      -  "null"
      -]New value: +"boolean"
    • changedInput schema / properties / pdf_export_auto_config / properties / answer_recording / type
      Previous value: -[
      -  "boolean",
      -  "null"
      -]New value: +"boolean"
    • changedInput schema / properties / pdf_export_auto_config / properties / contact_details / type
      Previous value: -[
      -  "boolean",
      -  "null"
      -]New value: +"boolean"
    • changedInput schema / properties / pdf_export_auto_config / properties / files / type
      Previous value: -[
      -  "boolean",
      -  "null"
      -]New value: +"boolean"
    • changedInput schema / properties / pdf_export_auto_config / properties / group_by_question / type
      Previous value: -[
      -  "boolean",
      -  "null"
      -]New value: +"boolean"
    • changedInput schema / properties / pdf_export_auto_config / properties / mojito_language_code / enum
      Previous value: -[
      -  "ar",
      -  "bg",
      -  "zh",
      -  "hr",
      -  "cs",
      -  "da",
      -  "nl",
      -  "en",
      -  "fil",
      -  "fi",
      -  "fr",
      -  "de",
      -  "el",
      -  "hi",
      -  "hu",
      -  "id",
      -  "it",
      -  "ja",
      -  "ko",
      -  "ms",
      -  "no",
      -  "pl",
      -  "pt",
      -  "br",
      -  "ro",
      -  "ru",
      -  "sk",
      -  "es",
      -  "sv",
      -  "ta",
      -  "th",
      -  "tr",
      -  "uk",
      -  "vi",
      -  null
      -]New value: +[
      +  "ar",
      +  "bg",
      +  "zh",
      +  "hr",
      +  "cs",
      +  "da",
      +  "nl",
      +  "en",
      +  "fil",
      +  "fi",
      +  "fr",
      +  "de",
      +  "el",
      +  "hi",
      +  "hu",
      +  "id",
      +  "it",
      +  "ja",
      +  "ko",
      +  "ms",
      +  "no",
      +  "pl",
      +  "pt",
      +  "br",
      +  "ro",
      +  "ru",
      +  "sk",
      +  "es",
      +  "sv",
      +  "ta",
      +  "th",
      +  "tr",
      +  "uk",
      +  "vi"
      +]
    • changedInput schema / properties / pdf_export_auto_config / properties / mojito_language_code / type
      Previous value: -[
      -  "string",
      -  "null"
      -]New value: +"string"
    • changedInput schema / properties / pdf_export_auto_config / properties / session_recording / type
      Previous value: -[
      -  "boolean",
      -  "null"
      -]New value: +"boolean"
    • changedInput schema / properties / pdf_export_auto_config / properties / template / enum
      Previous value: -[
      -  "classic",
      -  "modern",
      -  "one_pager",
      -  null
      -]New value: +[
      +  "classic",
      +  "modern",
      +  "one_pager"
      +]
    • changedInput schema / properties / pdf_export_auto_config / properties / template / type
      Previous value: -[
      -  "string",
      -  "null"
      -]New value: +"string"
    • changedInput schema / properties / pdf_export_auto_config / properties / transcript / type
      Previous value: -[
      -  "boolean",
      -  "null"
      -]New value: +"boolean"
    • changedInput schema / properties / position_id / type
      Previous value: -[
      -  "string",
      -  "null"
      -]New value: +"string"
    • changedInput schema / properties / questions / items / properties / candidate_expectations_json / properties / moderate / type
      Previous value: -[
      -  "array",
      -  "null"
      -]New value: +"array"
    • changedInput schema / properties / questions / items / properties / candidate_expectations_json / properties / strong / type
      Previous value: -[
      -  "array",
      -  "null"
      -]New value: +"array"
    • changedInput schema / properties / questions / items / properties / candidate_expectations_json / properties / weak / type
      Previous value: -[
      -  "array",
      -  "null"
      -]New value: +"array"
    • changedInput schema / properties / questions / items / properties / id / type
      Previous value: -[
      -  "string",
      -  "null"
      -]New value: +"string"
    • changedInput schema / properties / questions / items / properties / question / type
      Previous value: -[
      -  "string",
      -  "null"
      -]New value: +"string"
    • changedInput schema / properties / questions / type
      Previous value: -[
      -  "array",
      -  "null"
      -]New value: +"array"
    • changedInput schema / properties / recording / description
      Previous value: -"Cheating/proctoring detection mode for candidate answers — this is NOT a full session recording. Video options also record the candidate. Omit/null to disable. Options — `audio_first_5_answers`: Audio-only cheating detection, first 5 answers only. | `audio_all`: Audio-only cheating detection on every answer. | `video_all`: Audio + video cheating detection on every answer (candidate is recorded for all answers). | `video_first_5_answers`: Audio + video cheating detection, first 5 answers only.."New value: +"Cheating/proctoring detection mode for candidate answers — this is NOT a full session recording. Video options also record the candidate. Omit to keep the current setting. A null is ignored: turn it off in the admin console. Options — `audio_first_5_answers`: Audio-only cheating detection, first 5 answers only. | `audio_all`: Audio-only cheating detection on every answer. | `video_all`: Audio + video cheating detection on every answer (candidate is recorded for all answers). | `video_first_5_answers`: Audio + video cheating detection, first 5 answers only.."
    • changedInput schema / properties / recording_full_session / description
      Previous value: -"Full interview-session recording (includes the avatar and voice) produced as a single file. Independent of `recording`. Omit/null to disable. Options — `audio_all`: Record the whole session audio (avatar + candidate voice) into a single file. Adds +0.2 credits. | `video_all`: Record the whole session video + audio (avatar + candidate) into a single file. Adds +0.4 credits.."New value: +"Full interview-session recording (includes the avatar and voice) produced as a single file. Independent of `recording`. Omit to keep the current setting. A null is ignored: turn it off in the admin console. Options — `audio_all`: Record the whole session audio (avatar + candidate voice) into a single file. Adds +0.2 credits. | `video_all`: Record the whole session video + audio (avatar + candidate) into a single file. Adds +0.4 credits.."
    • changedInput schema / properties / recruiter_profile_id / description
      Previous value: -"Profile id of the recruiter owning this interview. Must be a merchant/merchant_owner/admin profile of the same merchant. null clears it."New value: +"Profile id of the recruiter owning this interview. Must be a merchant/merchant_owner/admin profile of the same merchant. An empty string clears it."
    • changedInput schema / properties / regenerate_candidate_expectations / type
      Previous value: -[
      -  "boolean",
      -  "null"
      -]New value: +"boolean"
    • changedInput schema / properties / result_view / enum
      Previous value: -[
      -  "none",
      -  "minimal",
      -  "minimal_with_score",
      -  "advanced",
      -  "full",
      -  "full_expand_scores",
      -  null
      -]New value: +[
      +  "none",
      +  "minimal",
      +  "minimal_with_score",
      +  "advanced",
      +  "full",
      +  "full_expand_scores"
      +]
    • changedInput schema / properties / result_view / type
      Previous value: -[
      -  "string",
      -  "null"
      -]New value: +"string"
    • changedInput schema / properties / status / enum
      Previous value: -[
      -  "draft",
      -  "active",
      -  "archived",
      -  "deleted",
      -  "preparing",
      -  "completed",
      -  null
      -]New value: +[
      +  "draft",
      +  "active",
      +  "archived",
      +  "deleted",
      +  "preparing",
      +  "completed"
      +]
    • changedInput schema / properties / status / type
      Previous value: -[
      -  "string",
      -  "null"
      -]New value: +"string"
    • changedInput schema / properties / type / enum
      Previous value: -[
      -  "interview",
      -  "coaching",
      -  "assessment",
      -  null
      -]New value: +[
      +  "interview",
      +  "coaching",
      +  "assessment"
      +]
    • changedInput schema / properties / type / type
      Previous value: -[
      -  "string",
      -  "null"
      -]New value: +"string"
    • changedInput schema / properties / visibility / enum
      Previous value: -[
      -  "merchant_public",
      -  "merchant_invite",
      -  "merchant_unlisted",
      -  null
      -]New value: +[
      +  "merchant_public",
      +  "merchant_invite",
      +  "merchant_unlisted"
      +]
    • changedInput schema / properties / visibility / type
      Previous value: -[
      -  "string",
      -  "null"
      -]New value: +"string"
  6. Changed4 schema fields changed
    • addedInput schema / properties / questions / items / properties / conditional_question_answer
      Added value: +{
      +  "description": "With conditional_question_main_id: the answer to the yes/no question that shows this follow-up. `true` (the default) asks it after a yes, `false` after a no, so each answer can lead to its own follow-ups. Ignored on a question without conditional_question_main_id.",
      +  "example": false,
      +  "type": [
      +    "boolean",
      +    "null"
      +  ]
      +}
    • changedInput schema / properties / questions / items / properties / conditional_question_main_id / description
      Previous value: -"For a conditional question, the id (the \"id\" field above) of the parent question in this same array that triggers it. The parent must appear earlier in the array than the conditional question referencing it."New value: +"For a follow-up question, the id (the \"id\" field above) of the yes/no question (is_conditional) in this same array that decides whether it is asked. The yes/no question must appear earlier in the array. Use conditional_question_answer to choose the answer that shows it."
    • changedInput schema / properties / questions / items / properties / is_conditional / description
      Previous value: -"Conditional follow-up question (view 'with listening conditional'). Use with conditional_question_main_id."New value: +"A yes/no question that decides which follow-ups are asked (view 'with listening conditional'). Its follow-ups point at it with conditional_question_main_id."
    • addedInput schema / properties / questions / items / properties / is_skippable
      Added value: +{
      +  "description": "The candidate may skip this question: the recorded (offline avatar) interview shows a Skip button on it, and a skipped question is saved without an answer. Defaults to false.",
      +  "example": false,
      +  "type": [
      +    "boolean",
      +    "null"
      +  ]
      +}
  7. Changed2 schema fields changed
    • changedInput schema / properties / interview_conversation_speed / description
      Previous value: -"Conversation pace of the AI avatar. Omit/null keeps the template default pace. Options — `slower`: The avatar speaks more slowly — easier to follow for non-native speakers. | `normal`: Default speaking pace. | `faster`: The avatar speaks more quickly for a snappier conversation.."New value: +"Conversation pace of the AI avatar. Omit/null keeps the template default pace. Options — `slower`: The avatar speaks more slowly — easier to follow for non-native speakers. | `normal`: Default speaking pace. | `faster`: The avatar speaks more quickly for a snappier conversation. | `fluent`: Talking pace: the avatar answers 300 ms after the candidate stops speaking. A pause mid-sentence also ends their turn.."
    • changedInput schema / properties / interview_conversation_speed / enum
      Previous value: -[
      -  "slower",
      -  "normal",
      -  "faster",
      -  null
      -]New value: +[
      +  "slower",
      +  "normal",
      +  "faster",
      +  "fluent",
      +  null
      +]
  8. Changed1 schema field changed
    • addedInput schema / properties / custom_fields
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Company-defined position fields to set, {key: value}; a null value clears that field and keys you omit keep their value. Values are checked against the field definitions (option values, YYYY-MM-DD dates, {min, max, currency} ranges, user profile ids). Requires custom fields to be enabled for the company (else 403). Multi-stage positions only: on a single-stage interview the request is refused with 422.",
      +  "example": {
      +    "contract_type": "permanent",
      +    "cost_centre": "CC-100"
      +  },
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  9. Changed2 schema fields changed
    • changedInput schema / properties / interview_type / description
      Previous value: -"Interview style — configures the AI avatar and the follow-up questions it generates during the interview. Stored in creation_parameters; existing questions are NOT regenerated. Options — `pre-screening`: Pre-screening — quick qualification check focusing on basic requirements and availability. | `pre-screening-with-test-questions`: Pre-screening with test questions — pre-screening plus practical questions to test relevant skills. | `second-interview`: Second round interview — deeper dive for candidates who passed initial screening. | `remote-freelancer-verification`: Remote worker verification — verify remote work capabilities and communication skills. | `strength-based-interview`: Strength-based interview — focus on what candidates enjoy and excel at to predict job satisfaction. | `potential-based-interview`: Potential-based interview — assess learning ability and growth potential rather than past experience. | `process-verification-from-knowledge-base`: Knowledge Base interview — generate questions from your knowledge base documents.."New value: +"Interview style — configures the AI avatar and the follow-up questions it generates during the interview. Stored in creation_parameters; existing questions are NOT regenerated. Options — `pre-screening`: Pre-screening — quick qualification check focusing on basic requirements and availability. | `pre-screening-with-test-questions`: Pre-screening with test questions — pre-screening plus practical questions to test relevant skills. | `second-interview`: Second round interview — deeper dive for candidates who passed initial screening. | `remote-freelancer-verification`: Remote worker verification — verify remote work capabilities and communication skills. | `strength-based-interview`: Strength-based interview — focus on what candidates enjoy and excel at to predict job satisfaction. | `potential-based-interview`: Potential-based interview — assess learning ability and growth potential rather than past experience. | `process-verification-from-knowledge-base`: Knowledge Base interview — generate questions from your knowledge base documents. | `knockout-screening`: Knock-out screening — a short (about 5 minute) check of the role's must-haves with closed questions; ends early, politely, when a must-have is clearly not met. On creation it defaults custom_scoring.early_stop to true (where the avatar supports early stop) and max_followups to 1 unless you send them.."
    • changedInput schema / properties / interview_type / enum
      Previous value: -[
      -  "pre-screening",
      -  "pre-screening-with-test-questions",
      -  "second-interview",
      -  "remote-freelancer-verification",
      -  "strength-based-interview",
      -  "potential-based-interview",
      -  "process-verification-from-knowledge-base",
      -  null
      -]New value: +[
      +  "pre-screening",
      +  "pre-screening-with-test-questions",
      +  "second-interview",
      +  "remote-freelancer-verification",
      +  "strength-based-interview",
      +  "potential-based-interview",
      +  "process-verification-from-knowledge-base",
      +  "knockout-screening",
      +  null
      +]
  10. Changed1 schema field changed
    • addedInput schema / properties / country_availability
      Added value: +{
      +  "description": "Which countries the interview / position is open to on the candidate portal, judged by the IP address the candidate opens it from (an unknown location only passes when countries_allowed / countries_allowed_eu are empty). From a closed country it is left out of the portal listings, and a direct link shows \"not available in your region\". Invited candidates (register_users / invite links) and candidates who already started keep access; API and MCP calls themselves are never restricted. Null = not used, every country.",
      +  "properties": {
      +    "countries_allowed": {
      +      "description": "Available ONLY to candidates in these countries (ISO 3166-1 alpha-2).",
      +      "example": [
      +        "PH",
      +        "IN"
      +      ],
      +      "items": {
      +        "pattern": "^[A-Za-z]{2}$",
      +        "type": "string"
      +      },
      +      "type": [
      +        "array",
      +        "null"
      +      ]
      +    },
      +    "countries_allowed_eu": {
      +      "description": "Adds every EU country (plus EEA and Switzerland) to countries_allowed.",
      +      "type": [
      +        "boolean",
      +        "null"
      +      ]
      +    },
      +    "countries_blocked": {
      +      "description": "NOT available to candidates in these countries (ISO 3166-1 alpha-2). Wins over the allowed side.",
      +      "example": [
      +        "US"
      +      ],
      +      "items": {
      +        "pattern": "^[A-Za-z]{2}$",
      +        "type": "string"
      +      },
      +      "type": [
      +        "array",
      +        "null"
      +      ]
      +    },
      +    "countries_blocked_eu": {
      +      "description": "Adds every EU country (plus EEA and Switzerland) to countries_blocked.",
      +      "type": [
      +        "boolean",
      +        "null"
      +      ]
      +    }
      +  },
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  11. Changed1 schema field changed
    • changedInput schema / properties / conversation_id / description
      Previous value: -"Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it."New value: +"Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
  12. Changed1 schema field changed
    • addedInput schema / properties / candidate_notification_channel
      Added value: +{
      +  "description": "SMS / WhatsApp notifications to the candidate, sent alongside the e-mails: \"reminders\" = with both e-mail reminders (day 1 and day 3); \"last_reminder\" = only with the final day-3 reminder; \"all\" = invitation, both reminders and the pre-screening-accepted step. null switches them off. WhatsApp is tried first, SMS when the number is not on WhatsApp. Available on paid plans (Starter and above) and needs a phone number on the candidate.",
      +  "enum": [
      +    "reminders",
      +    "last_reminder",
      +    "all",
      +    null
      +  ],
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  13. Changed2 schema fields changed
    • addedInput schema / properties / conversation_id
      Added value: +{
      +  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / _mcp_instructions
      Added value: +{
      +  "description": "Server-issued metadata for this conversation.",
      +  "properties": {
      +    "conversation_id": {
      +      "description": "The server-issued conversation identifier.",
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  14. Changed4 schema fields changed
    • changedInput schema / properties / interview_tone / description
      Previous value: -"Tone — configures the AI avatar's speaking style and the follow-up questions it generates. Stored in creation_parameters; existing questions are NOT regenerated. Suggested values — `relaxed`: Friendly and conversational tone that helps candidates feel at ease. | `simple`: Plain language at CEFR A2 level — short sentences and simple words. | `professional`: Formal and business-like approach suitable for senior roles. | `persuasive`: Engaging style that encourages candidates to elaborate.. Case-insensitive; other strings are accepted but unknown tones fall back to the default."New value: +"Tone — configures the AI avatar's speaking style and the follow-up questions it generates. Stored in creation_parameters; existing questions are NOT regenerated. Case-insensitive; omit to default to relaxed. Options — `relaxed`: Friendly and conversational tone that helps candidates feel at ease. | `simple`: Plain language at CEFR A2 level — short sentences and simple words. | `professional`: Formal and business-like approach suitable for senior roles. | `persuasive`: Engaging style that encourages candidates to elaborate. | `exact`: Asks the questions exactly as provided, without rephrasing — for interviews built from your own questions (create_interview_from_questions) where the wording is a script.."
    • addedInput schema / properties / interview_tone / enum
      Added value: +[
      +  "relaxed",
      +  "simple",
      +  "professional",
      +  "persuasive",
      +  "exact",
      +  null
      +]
    • changedInput schema / properties / pdf_export_auto_config / properties / mojito_language_code / description
      Previous value: -"Report language code (platform-languages.json code)."New value: +"Report language code (a platform-languages.json code)."
    • addedInput schema / properties / pdf_export_auto_config / properties / mojito_language_code / enum
      Added value: +[
      +  "ar",
      +  "bg",
      +  "zh",
      +  "hr",
      +  "cs",
      +  "da",
      +  "nl",
      +  "en",
      +  "fil",
      +  "fi",
      +  "fr",
      +  "de",
      +  "el",
      +  "hi",
      +  "hu",
      +  "id",
      +  "it",
      +  "ja",
      +  "ko",
      +  "ms",
      +  "no",
      +  "pl",
      +  "pt",
      +  "br",
      +  "ro",
      +  "ru",
      +  "sk",
      +  "es",
      +  "sv",
      +  "ta",
      +  "th",
      +  "tr",
      +  "uk",
      +  "vi",
      +  null
      +]
  15. Changed1 schema field changed
    • addedInput schema / properties / environment
      Added value: +{
      +  "description": "Which of your webhook environments results from this interview are delivered to. Defaults to production. Options — `production`: Live hiring. Results reach the webhooks configured as production. This is the default when the field is omitted. | `uat`: User-acceptance testing - an isolated environment for pre-release verification. | `development`: Development/testing. Use for interviews created by a test or preview app so their results never reach the production webhook. | `demo`: Demonstrations and sales trials..",
      +  "enum": [
      +    "production",
      +    "uat",
      +    "development",
      +    "demo",
      +    null
      +  ],
      +  "example": "production",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  16. Changed1 schema field changed
    • changedInput schema / properties / pdf_export_auto_config / properties / template / description
      Previous value: -"Report layout: classic (default), modern, or one_pager."New value: +"Report layout: classic, modern, or one_pager. Omit for the merchant default (modern when unset)."
  17. Changed1 schema field changed
    • addedInput schema / properties / pdf_export_auto_config / properties / template
      Added value: +{
      +  "description": "Report layout: classic (default), modern, or one_pager.",
      +  "enum": [
      +    "classic",
      +    "modern",
      +    "one_pager",
      +    null
      +  ],
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  18. Changed1 schema field changed
    • changedInput schema / properties / description_long / description
      Previous value: -"Long-form interview description (column `interview_description_long`), Markdown."New value: +"Long-form interview description (column `interview_description_long`). Rendered as Markdown on the candidate-facing position page, including chips, callouts, cards, columns and buttons — formatting guide: https://developer.jobmojito.com/cookbooks/format-content-with-markdown"
  19. Changed2 schema fields changed
    • changedOutput schema / properties / questions_diff / description
      Previous value: -"What the question diff decided, question by question. Null when `questions` was not sent."New value: +"What the question diff decided, question by question. Absent when `questions` was not sent."
    • changedOutput schema / required
      Previous value: -[
      -  "position_id",
      -  "is_multistage",
      -  "updated_fields",
      -  "questions_diff"
      -]New value: +[
      +  "position_id",
      +  "is_multistage",
      +  "updated_fields"
      +]
  20. Changed5 schema fields changed
    • addedInput schema / properties / questions
      Added value: +{
      +  "description": "OPTIONAL. Omit this field entirely and the interview's questions are left exactly as they are — this endpoint only touches questions when you send the array. When you do send it, send the COMPLETE list you want the interview to end up with, in order, in the same format job-interview-create-from-array accepts and job-interview-get returns: there is no way to change a single question on its own, so read the interview, edit that array, and send the whole thing back. An empty array is rejected. It is applied as a DIFF, not a replace, so resending the array job-interview-get gave you changes nothing at all. Each entry is matched against what is stored — first on `external_id`, then on `id`, then on identical content — and: an entry matching an unchanged question keeps that question exactly as it is, including its answer rules and any rendered avatar video; an entry matching a question whose content differs unlinks the old question and creates a new one in its place (fields you omit are carried over from the old one); an entry matching nothing is created; and a stored question no entry matches is unlinked. `questions_diff` in the response reports exactly what was decided. Questions are shared records, so nothing is ever deleted — removing one only unlinks it from this interview, and an edit is always unlink-old + create-new so the change cannot leak into another interview reusing the same question. The welcome, thank-you and instructional-video steps are not part of this array and are left in place. Single-stage interviews only; for a multi-stage position, update its interview stages individually.",
      +  "items": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "candidate_expectations_json": {
      +        "description": "Per-question candidate expectations, bucketed by requirement level (weak/moderate/strong). Extra keys are preserved.",
      +        "properties": {
      +          "moderate": {
      +            "description": "Requirements expected of a solid, competent candidate.",
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": [
      +              "array",
      +              "null"
      +            ]
      +          },
      +          "strong": {
      +            "description": "High-bar requirements only standout candidates clear.",
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": [
      +              "array",
      +              "null"
      +            ]
      +          },
      +          "weak": {
      +            "description": "Baseline requirements every viable candidate should meet (table stakes).",
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": [
      +              "array",
      +              "null"
      +            ]
      +          }
      +        },
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "conditional_question_main_id": {
      +        "description": "For a conditional question, the id (the \"id\" field above) of the parent question in this same array that triggers it. The parent must appear earlier in the array than the conditional question referencing it.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "duration": {
      +        "description": "Answer duration in seconds for this question.",
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "external_data": {
      +        "additionalProperties": {},
      +        "description": "Arbitrary JSON metadata stored on the question.",
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "external_id": {
      +        "description": "External identifier stored on the question. job-interview-update matches on this first, so an ATS that owns stable ids can send its own array and have the diff line up without round-tripping our ids.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "id": {
      +        "description": "Identifier for this question. job-interview-get returns the question's real id here; send it back to job-interview-update so an unchanged question keeps its existing record (and with it its answer rules and any rendered avatar video). Also the handle another question references via conditional_question_main_id. On job-interview-create-from-array it is a caller-local value, only needed for those references.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "is_candidate_asking_recruiter": {
      +        "description": "Candidate-asks-recruiter prompt (view 'candidate asking recruiter').",
      +        "type": [
      +          "boolean",
      +          "null"
      +        ]
      +      },
      +      "is_conditional": {
      +        "description": "Conditional follow-up question (view 'with listening conditional'). Use with conditional_question_main_id.",
      +        "type": [
      +          "boolean",
      +          "null"
      +        ]
      +      },
      +      "is_expert": {
      +        "description": "Expert listening question (view 'with listening expert').",
      +        "type": [
      +          "boolean",
      +          "null"
      +        ]
      +      },
      +      "is_multiple_choice": {
      +        "description": "Multiple-choice question (view 'multiple choice').",
      +        "type": [
      +          "boolean",
      +          "null"
      +        ]
      +      },
      +      "is_without_scoring": {
      +        "description": "Question is asked but not scored (view 'without scoring').",
      +        "type": [
      +          "boolean",
      +          "null"
      +        ]
      +      },
      +      "knowledge_base_id": {
      +        "description": "Knowledge-base store id (uuid) the question draws context from.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "label": {
      +        "description": "Optional label/tag stored on the question.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "mojito_language_code": {
      +        "description": "Per-question language override (one of the platform-languages.json codes). Inherits the interview language when omitted.",
      +        "enum": [
      +          "ar",
      +          "bg",
      +          "zh",
      +          "hr",
      +          "cs",
      +          "da",
      +          "nl",
      +          "en",
      +          "fil",
      +          "fi",
      +          "fr",
      +          "de",
      +          "el",
      +          "hi",
      +          "hu",
      +          "id",
      +          "it",
      +          "ja",
      +          "ko",
      +          "ms",
      +          "no",
      +          "pl",
      +          "pt",
      +          "br",
      +          "ro",
      +          "ru",
      +          "sk",
      +          "es",
      +          "sv",
      +          "ta",
      +          "th",
      +          "tr",
      +          "uk",
      +          "vi",
      +          null
      +        ],
      +        "example": "en",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "question": {
      +        "description": "The question text shown to the candidate.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "question_alternatives": {
      +        "description": "Alternative phrasings for the question.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": [
      +          "array",
      +          "null"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "question"
      +    ],
      +    "type": "object"
      +  },
      +  "minItems": 1,
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / regenerate_candidate_expectations
      Added value: +{
      +  "description": "Re-derive the interview-level `candidate_expectations_json` scoring rubric from the resulting question list, the way job-interview-create-from-array derives it at creation time. Only applies when `questions` is sent, the interview type is `interview`, and `candidate_expectations_json` is not also being set explicitly (an explicit value wins).",
      +  "example": false,
      +  "type": [
      +    "boolean",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / questions_diff
      Added value: +{
      +  "description": "What the question diff decided, question by question. Null when `questions` was not sent.",
      +  "properties": {
      +    "added": {
      +      "description": "Ids of the questions created for entries that matched nothing stored.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": [
      +        "array",
      +        "null"
      +      ]
      +    },
      +    "kept": {
      +      "description": "Questions left exactly as they were, record and all.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": [
      +        "array",
      +        "null"
      +      ]
      +    },
      +    "question_ids": {
      +      "description": "The interview's full ordered step list after the update, including the welcome / thank-you / instructional steps this endpoint does not manage.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": [
      +        "array",
      +        "null"
      +      ]
      +    },
      +    "reactivated": {
      +      "description": "True when the interview was already active and was re-published so the new questions go live.",
      +      "type": [
      +        "boolean",
      +        "null"
      +      ]
      +    },
      +    "removed": {
      +      "description": "Ids unlinked because no entry in the request matched them. The question records themselves still exist.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": [
      +        "array",
      +        "null"
      +      ]
      +    },
      +    "replaced": {
      +      "description": "Edited questions: the old record was unlinked and a new one created, so the change cannot leak into other interviews reusing it.",
      +      "items": {
      +        "properties": {
      +          "from": {
      +            "description": "The id that was unlinked.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "to": {
      +            "description": "The id of the question created in its place.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "from",
      +          "to"
      +        ],
      +        "type": "object"
      +      },
      +      "type": [
      +        "array",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "kept",
      +    "added",
      +    "removed",
      +    "replaced",
      +    "question_ids",
      +    "reactivated"
      +  ],
      +  "type": "object"
      +}
    • changedOutput schema / properties / updated_fields / description
      Previous value: -"Names of the stored columns that were written, plus `status` when the lifecycle status was changed."New value: +"Names of the stored columns that were written, plus `status` when the lifecycle status was changed and `questions` when the question list was diffed."
    • changedOutput schema / required
      Previous value: -[
      -  "position_id",
      -  "is_multistage",
      -  "updated_fields"
      -]New value: +[
      +  "position_id",
      +  "is_multistage",
      +  "updated_fields",
      +  "questions_diff"
      +]
  21. Added

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well past the destructive/idempotent annotations: it explains that only sent fields change, that a null counts as not sent except on three named fields, that questions are applied as a diff (unlink-old + create-new, nothing deleted, shared records), and that archiving an active position can e-mail open applicants. Permission prerequisites (403 for hiring team and custom fields, 422 for interviewer-only settings at position level) are disclosed too.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and sibling routing, and nearly every sentence carries non-obvious operational detail. It is still a dense single block for a 51-parameter tool, with some restatement of schema-level field semantics, so it stops short of a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 51-parameter mutation tool with nested objects, an output schema and rich annotations, the description covers the risky edges: multi-stage position restrictions, question editing lifecycle limits, null handling, and the list of things this tool never changes (welcome/thank-you messages, instructional video, language).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so a 3 would be the floor; the description adds real meaning beyond it — the omit-versus-null rule and its three exceptions, the full-array replace-as-diff semantics of `questions` including match order (external_id, id, content), and the note that the interview-level settings do not exist at position level.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (updating the configuration of an existing interview/position) and enumerates the editable field families. It explicitly carves out what is NOT handled here — status lifecycle and embed key via set_interview_state, steps via set_position_process and update_position_step — so an agent can separate it from siblings without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use and when-not-to-use routing: use set_interview_state for vacancy lifecycle and the embed key, set_position_process/update_position_step for steps, get_interview_definition to read the question array first. It also states preconditions (draft vs active constraints on question edits, 422 on multi-stage positions).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.