{
"error": "Field is required.",
"name": "interview_result_id"
}
{
"error": "Field is required.",
"name": "interview_result_id"
}
{
"error": "Field is required.",
"name": "interview_result_id"
}
{
"error": "Field is required.",
"name": "interview_result_id"
}
{
"error": "Field is required.",
"name": "interview_result_id"
}
Interviews
Update an interview or position
Updates the configuration of an existing interview (single-stage) or position (multi-stage). Only the fields present in the request body are written — everything else keeps its current value, and sending null clears a nullable field. The question list is only touched when you send questions; omit that field and the questions are left exactly as they are. When sent, it must be the complete list and is applied as a diff against what is stored (matched on external_id, then id, then identical content), so unchanged questions keep their existing records, edited ones are unlinked and re-created, and dropped ones are unlinked — and re-sending the array job-interview-get returned changes nothing. See the field description, and questions_diff in the response for what was decided. Questions of an interview that is already active can only be changed on interactive avatar templates, where re-publishing is instant; on the offline (pre-rendered video) templates set the interview back to draft first. The welcome / thank-you messages and the instructional-video screen are stored as steps rather than questions and are never changed here. mojito_language_code cannot be changed — the existing questions and rendered videos are in the original language — so create a new interview to change language. A multi-stage position only carries the shared identity fields (name, code, location, description, description_long, cover_image_url, department, salary, available_till, recruiter, status, visibility, hiring_for_company); sending an interview-only field for a position is a 422.
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).
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..
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..
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.
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.
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.
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.
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.
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).
Product 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.
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..
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.
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..
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..
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..
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..
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).
Structured candidate expectations (the scoring rubric), bucketed by requirement level (weak/moderate/strong). null clears the rubric. Extra keys are preserved.
Result-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 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..
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..
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..
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: '' } plus optional description/location/sector/company_size. Stored in creation_parameters.hiring_for_company.
What the question diff decided, question by question. Absent when questions was not sent.
Show child attributes
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"JobMojito Developer / Agent","description":"AI Interview and assessment conversational platform documentation","colors":{"primary":"#639C42","light":"#ACCC37","dark":"#15803D"},"logo":{"light":"https://mintcdn.com/jobmojito/DU7xAw61G9kqV1zG/images/jobmojito-light.svg?fit=max\u0026auto=format\u0026n=DU7xAw61G9kqV1zG\u0026q=85\u0026s=6c00cb5f3104ffb6325dacc0818bba69","dark":"https://mintcdn.com/jobmojito/DU7xAw61G9kqV1zG/images/jobmojito-dark.svg?fit=max\u0026auto=format\u0026n=DU7xAw61G9kqV1zG\u0026q=85\u0026s=a05ab0ca109d7a225b08ccac00f9c486","href":"https://jobmojito.com"},"favicon":{"light":"https://mintcdn.com/jobmojito/DU7xAw61G9kqV1zG/images/favicon-light.svg?fit=max\u0026auto=format\u0026n=DU7xAw61G9kqV1zG\u0026q=85\u0026s=f300813ab120824238a790b6905dceee","dark":"https://mintcdn.com/jobmojito/DU7xAw61G9kqV1zG/images/favicon-dark.svg?fit=max\u0026auto=format\u0026n=DU7xAw61G9kqV1zG\u0026q=85\u0026s=2104ff9e7b9fd23fbe5954886c0aafbe"},"navbar":{"links":[{"href":"https://jobmojito.com/support","label":"Support"},{"href":"https://jobmojito.com","label":"Homepage"},{"href":"https://app.jobmojito.com","label":"App"}],"primary":{"type":"button","label":"Dashboard","href":"https://app.mintlify.com"}},"footer":{"socials":{"linkedin":"https://linkedin.com/company/jobmojito"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"toc"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"jobmojito","hasAudioNarration":false,"actualSubdomain":"jobmojito","customDomains":["developer.jobmojito.com"],"gitSource":{"type":"github","owner":"mintlify-community","repo":"docs-jobmojito-fee23398","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"collectionId":"31acdfe7-31db-41c2-967b-51de10dd8825","liveDeploymentHistoryId":"6ae9d748b91b5cca7834e2a1","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae9d748b91b5cca7834e2a1"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ae9d748b91b5cca7834e2a1","clientVersion":"0.0.4067","searchFilterCounts":[{"language":"default","tag":"API Reference","count":43},{"language":"default","tag":"Cookbooks","count":14},{"language":"default","tag":"Webhooks","count":14},{"language":"default","tag":"MCP","count":13},{"language":"default","tag":"Interviews","count":10},{"language":"default","tag":"Connect","count":8},{"language":"default","tag":"Admin","count":7},{"language":"default","tag":"Reports","count":7},{"language":"default","tag":"Results","count":7},{"language":"default","tag":"Welcome","count":5}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/interviews/update-an-interview-or-position","slug":"/api-reference/interviews/update-an-interview-or-position","pageMetadata":{"title":"Update an interview or position","description":"Updates the configuration of an existing interview (single-stage) or position (multi-stage). Only the fields present in the request body are written — everything else keeps its current value, and sending null clears a nullable field. The question list is only touched when you send `questions`; omit that field and the questions are left exactly as they are. When sent, it must be the complete list and is applied as a diff against what is stored (matched on external_id, then id, then identical content), so unchanged questions keep their existing records, edited ones are unlinked and re-created, and dropped ones are unlinked — and re-sending the array job-interview-get returned changes nothing. See the field description, and `questions_diff` in the response for what was decided. Questions of an interview that is already `active` can only be changed on interactive avatar templates, where re-publishing is instant; on the offline (pre-rendered video) templates set the interview back to `draft` first. The welcome / thank-you messages and the instructional-video screen are stored as steps rather than questions and are never changed here. `mojito_language_code` cannot be changed — the existing questions and rendered videos are in the original language — so create a new interview to change language. A multi-stage position only carries the shared identity fields (name, code, location, description, description_long, cover_image_url, department, salary, available_till, recruiter, status, visibility, hiring_for_company); sending an interview-only field for a position is a 422.","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi post /job-interview-update","href":"/api-reference/interviews/update-an-interview-or-position","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_components.p, {\n children: [\"Updates the configuration of an existing interview (single-stage) or position (multi-stage). Only the fields present in the request body are written — everything else keeps its current value, and sending null clears a nullable field. The question list is only touched when you send \", _jsx(_components.code, {\n children: \"questions\"\n }), \"; omit that field and the questions are left exactly as they are. When sent, it must be the complete list and is applied as a diff against what is stored (matched on external_id, then id, then identical content), so unchanged questions keep their existing records, edited ones are unlinked and re-created, and dropped ones are unlinked — and re-sending the array job-interview-get returned changes nothing. See the field description, and \", _jsx(_components.code, {\n children: \"questions_diff\"\n }), \" in the response for what was decided. Questions of an interview that is already \", _jsx(_components.code, {\n children: \"active\"\n }), \" can only be changed on interactive avatar templates, where re-publishing is instant; on the offline (pre-rendered video) templates set the interview back to \", _jsx(_components.code, {\n children: \"draft\"\n }), \" first. The welcome / thank-you messages and the instructional-video screen are stored as steps rather than questions and are never changed here. \", _jsx(_components.code, {\n children: \"mojito_language_code\"\n }), \" cannot be changed — the existing questions and rendered videos are in the original language — so create a new interview to change language. A multi-stage position only carries the shared identity fields (name, code, location, description, description_long, cover_image_url, department, salary, available_till, recruiter, status, visibility, hiring_for_company); sending an interview-only field for a position is a 422.\"]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Update an interview or position","description":"Updates the configuration of an existing interview (single-stage) or position (multi-stage). Only the fields present in the request body are written — everything else keeps its current value, and sending null clears a nullable field. The question list is only touched when you send `questions`; omit that field and the questions are left exactly as they are. When sent, it must be the complete list and is applied as a diff against what is stored (matched on external_id, then id, then identical content), so unchanged questions keep their existing records, edited ones are unlinked and re-created, and dropped ones are unlinked — and re-sending the array job-interview-get returned changes nothing. See the field description, and `questions_diff` in the response for what was decided. Questions of an interview that is already `active` can only be changed on interactive avatar templates, where re-publishing is instant; on the offline (pre-rendered video) templates set the interview back to `draft` first. The welcome / thank-you messages and the instructional-video screen are stored as steps rather than questions and are never changed here. `mojito_language_code` cannot be changed — the existing questions and rendered videos are in the original language — so create a new interview to change language. A multi-stage position only carries the shared identity fields (name, code, location, description, description_long, cover_image_url, department, salary, available_till, recruiter, status, visibility, hiring_for_company); sending an interview-only field for a position is a 422.","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi post /job-interview-update","href":"/api-reference/interviews/update-an-interview-or-position","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Interviews"],"summary":"Update an interview or position","description":"Updates the configuration of an existing interview (single-stage) or position (multi-stage). Only the fields present in the request body are written — everything else keeps its current value, and sending null clears a nullable field. The question list is only touched when you send `questions`; omit that field and the questions are left exactly as they are. When sent, it must be the complete list and is applied as a diff against what is stored (matched on external_id, then id, then identical content), so unchanged questions keep their existing records, edited ones are unlinked and re-created, and dropped ones are unlinked — and re-sending the array job-interview-get returned changes nothing. See the field description, and `questions_diff` in the response for what was decided. Questions of an interview that is already `active` can only be changed on interactive avatar templates, where re-publishing is instant; on the offline (pre-rendered video) templates set the interview back to `draft` first. The welcome / thank-you messages and the instructional-video screen are stored as steps rather than questions and are never changed here. `mojito_language_code` cannot be changed — the existing questions and rendered videos are in the original language — so create a new interview to change language. A multi-stage position only carries the shared identity fields (name, code, location, description, description_long, cover_image_url, department, salary, available_till, recruiter, status, visibility, hiring_for_company); sending an interview-only field for a position is a 422.","security":["71698ed3-efb4-4472-a992-0b489fa45e9c"],"requestBody":"40143fd8-3a10-4c14-9f1b-85ea69799c5d","responses":{"200":"97fbcd2e-eb20-4851-9143-12b03bb7df70","401":"04ff35f2-b561-4fc2-aacf-c4b0ad935d6c","403":"e0e49b1e-a065-4fca-83f7-cc797e86e72e","404":"83665f55-3b9f-46f3-a8d9-b6dcdbd13591","422":"8a01a008-4918-47df-82e6-018ee39971c2","500":"818d8cd5-b376-4b2e-a493-8154ce1dbb1c"},"method":"post","type":"path","servers":["fbb516e7-faf7-4370-92d5-1080cab628b4"],"path":"/job-interview-update","baseUrlOptions":["https://cool.jobmojito.com/functions/v1"],"title":"Update an interview or position","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"position_id":{"type":"string","minLength":1,"format":"uuid","description":"Id of the interview definition (single-stage) or position definition (multi-stage) to update. The same id you pass to job-interview-get.","example":"00000000-0000-0000-0000-000000000000","isRequired":true,"uniqueKey":"position_id","typeLabel":"string\u003cuuid>"},"status":{"type":"string","enum":["draft","active","archived","deleted","preparing","completed"],"description":"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).","example":"active","uniqueKey":"status","typeLabel":"enum\u003cstring>"},"visibility":{"type":"string","enum":["merchant_public","merchant_invite","merchant_unlisted"],"description":"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..","example":"merchant_public","uniqueKey":"visibility","typeLabel":"enum\u003cstring>"},"environment":{"type":"string","enum":["production","uat","development","demo"],"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..","example":"production","uniqueKey":"environment","typeLabel":"enum\u003cstring>"},"name":{"oneOf":[{"type":"string","description":"Interview / position name.","example":"Project manager","uniqueKey":"name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Interview / position name.","example":"Project manager","uniqueKey":"name.oneOf.1","typeLabel":"null"}],"uniqueKey":"name","typeLabel":"string | null"},"code":{"oneOf":[{"type":"string","description":"External code/reference. Blank is stored as null.","uniqueKey":"code.oneOf.0","typeLabel":"string"},{"type":"null","description":"External code/reference. Blank is stored as null.","uniqueKey":"code.oneOf.1","typeLabel":"null"}],"uniqueKey":"code","typeLabel":"string | null"},"location":{"oneOf":[{"type":"string","description":"Interview location (column `interview_location`). Blank is stored as null.","example":"remote","uniqueKey":"location.oneOf.0","typeLabel":"string"},{"type":"null","description":"Interview location (column `interview_location`). Blank is stored as null.","example":"remote","uniqueKey":"location.oneOf.1","typeLabel":"null"}],"uniqueKey":"location","typeLabel":"string | null"},"cover_image_url":{"oneOf":[{"type":"string","description":"Cover image URL.","uniqueKey":"cover_image_url.oneOf.0","typeLabel":"string"},{"type":"null","description":"Cover image URL.","uniqueKey":"cover_image_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"cover_image_url","typeLabel":"string | null"},"description":{"oneOf":[{"type":"string","description":"Short interview description.","uniqueKey":"description.oneOf.0","typeLabel":"string"},{"type":"null","description":"Short interview description.","uniqueKey":"description.oneOf.1","typeLabel":"null"}],"uniqueKey":"description","typeLabel":"string | null"},"description_long":{"oneOf":[{"type":"string","description":"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","uniqueKey":"description_long.oneOf.0","typeLabel":"string"},{"type":"null","description":"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","uniqueKey":"description_long.oneOf.1","typeLabel":"null"}],"uniqueKey":"description_long","typeLabel":"string | null"},"interview_department":{"oneOf":[{"type":"string","description":"Department the position belongs to. Blank is stored as null.","example":"Engineering","uniqueKey":"interview_department.oneOf.0","typeLabel":"string"},{"type":"null","description":"Department the position belongs to. Blank is stored as null.","example":"Engineering","uniqueKey":"interview_department.oneOf.1","typeLabel":"null"}],"uniqueKey":"interview_department","typeLabel":"string | null"},"interview_salary":{"oneOf":[{"type":"string","description":"Salary range shown for the position. Blank is stored as null.","example":"$80k - $100k","uniqueKey":"interview_salary.oneOf.0","typeLabel":"string"},{"type":"null","description":"Salary range shown for the position. Blank is stored as null.","example":"$80k - $100k","uniqueKey":"interview_salary.oneOf.1","typeLabel":"null"}],"uniqueKey":"interview_salary","typeLabel":"string | null"},"interview_available_till":{"oneOf":[{"type":"string","description":"ISO date/time after which the interview is no longer available to candidates. null keeps it always available.","example":"2026-12-31","uniqueKey":"interview_available_till.oneOf.0","typeLabel":"string"},{"type":"null","description":"ISO date/time after which the interview is no longer available to candidates. null keeps it always available.","example":"2026-12-31","uniqueKey":"interview_available_till.oneOf.1","typeLabel":"null"}],"uniqueKey":"interview_available_till","typeLabel":"string | null"},"recruiter_profile_id":{"oneOf":[{"type":"string","description":"Profile id of the recruiter owning this interview. Must be a merchant/merchant_owner/admin profile of the same merchant. null clears it.","uniqueKey":"recruiter_profile_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Profile id of the recruiter owning this interview. Must be a merchant/merchant_owner/admin profile of the same merchant. null clears it.","uniqueKey":"recruiter_profile_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"recruiter_profile_id","typeLabel":"string | null"},"candidate_notification_channel":{"oneOf":[{"type":"string","enum":["reminders","last_reminder","all"],"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.","uniqueKey":"candidate_notification_channel.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["reminders","last_reminder","all"],"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.","uniqueKey":"candidate_notification_channel.oneOf.1","typeLabel":"null"}],"uniqueKey":"candidate_notification_channel","typeLabel":"enum\u003cstring> | null"},"country_availability":{"oneOf":[{"type":"object","properties":{"countries_allowed":{"type":"array","items":{"type":"string","pattern":"^[A-Za-z]{2}$","uniqueKey":"country_availability.oneOf.0.countries_allowed.items.[INDEX]","typeLabel":"string"},"description":"Available ONLY to candidates in these countries (ISO 3166-1 alpha-2).","example":["PH","IN"],"uniqueKey":"country_availability.oneOf.0.countries_allowed","typeLabel":"string[]"},"countries_allowed_eu":{"type":"boolean","description":"Adds every EU country (plus EEA and Switzerland) to countries_allowed.","uniqueKey":"country_availability.oneOf.0.countries_allowed_eu","typeLabel":"boolean"},"countries_blocked":{"type":"array","items":{"type":"string","pattern":"^[A-Za-z]{2}$","uniqueKey":"country_availability.oneOf.0.countries_blocked.items.[INDEX]","typeLabel":"string"},"description":"NOT available to candidates in these countries (ISO 3166-1 alpha-2). Wins over the allowed side.","example":["US"],"uniqueKey":"country_availability.oneOf.0.countries_blocked","typeLabel":"string[]"},"countries_blocked_eu":{"type":"boolean","description":"Adds every EU country (plus EEA and Switzerland) to countries_blocked.","uniqueKey":"country_availability.oneOf.0.countries_blocked_eu","typeLabel":"boolean"}},"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.","uniqueKey":"country_availability.oneOf.0","typeLabel":"object"},{"type":"null","properties":{"countries_allowed":{"type":"array","items":{"type":"string","pattern":"^[A-Za-z]{2}$"},"description":"Available ONLY to candidates in these countries (ISO 3166-1 alpha-2).","example":["PH","IN"]},"countries_allowed_eu":{"type":"boolean","description":"Adds every EU country (plus EEA and Switzerland) to countries_allowed."},"countries_blocked":{"type":"array","items":{"type":"string","pattern":"^[A-Za-z]{2}$"},"description":"NOT available to candidates in these countries (ISO 3166-1 alpha-2). Wins over the allowed side.","example":["US"]},"countries_blocked_eu":{"type":"boolean","description":"Adds every EU country (plus EEA and Switzerland) to countries_blocked."}},"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.","uniqueKey":"country_availability.oneOf.1","typeLabel":"null"}],"uniqueKey":"country_availability","typeLabel":"object | null"},"tags":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"tags.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"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.","example":["interview-practice","sales"],"uniqueKey":"tags.oneOf.0","typeLabel":"string[]"},{"type":"null","items":{"type":"string"},"description":"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.","example":["interview-practice","sales"],"uniqueKey":"tags.oneOf.1","typeLabel":"null"}],"uniqueKey":"tags","typeLabel":"string[] | null"},"custom_fields":{"type":"object","additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"custom_fields.additionalProperties.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_fields.additionalProperties","typeLabel":"null"},"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":{"cost_centre":"CC-100","contract_type":"permanent"},"uniqueKey":"custom_fields","typeLabel":"object"},"questions":{"type":"array","items":{"type":"object","properties":{"question":{"type":"string","description":"The question text shown to the candidate.","isRequired":true,"uniqueKey":"questions.items.[INDEX].question","typeLabel":"string"},"id":{"type":"string","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.","uniqueKey":"questions.items.[INDEX].id","typeLabel":"string"},"duration":{"oneOf":[{"type":"number","description":"Answer duration in seconds for this question.","uniqueKey":"questions.items.[INDEX].duration.oneOf.0","typeLabel":"number"},{"type":"null","description":"Answer duration in seconds for this question.","uniqueKey":"questions.items.[INDEX].duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"questions.items.[INDEX].duration","typeLabel":"number | null"},"mojito_language_code":{"oneOf":[{"type":"string","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"],"description":"Per-question language override (one of the platform-languages.json codes). Inherits the interview language when omitted.","example":"en","uniqueKey":"questions.items.[INDEX].mojito_language_code.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","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"],"description":"Per-question language override (one of the platform-languages.json codes). Inherits the interview language when omitted.","example":"en","uniqueKey":"questions.items.[INDEX].mojito_language_code.oneOf.1","typeLabel":"null"}],"uniqueKey":"questions.items.[INDEX].mojito_language_code","typeLabel":"enum\u003cstring> | null"},"label":{"oneOf":[{"type":"string","description":"Optional label/tag stored on the question.","uniqueKey":"questions.items.[INDEX].label.oneOf.0","typeLabel":"string"},{"type":"null","description":"Optional label/tag stored on the question.","uniqueKey":"questions.items.[INDEX].label.oneOf.1","typeLabel":"null"}],"uniqueKey":"questions.items.[INDEX].label","typeLabel":"string | null"},"is_conditional":{"oneOf":[{"type":"boolean","description":"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.","uniqueKey":"questions.items.[INDEX].is_conditional.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"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.","uniqueKey":"questions.items.[INDEX].is_conditional.oneOf.1","typeLabel":"null"}],"uniqueKey":"questions.items.[INDEX].is_conditional","typeLabel":"boolean | null"},"is_without_scoring":{"oneOf":[{"type":"boolean","description":"Question is asked but not scored (view 'without scoring').","uniqueKey":"questions.items.[INDEX].is_without_scoring.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Question is asked but not scored (view 'without scoring').","uniqueKey":"questions.items.[INDEX].is_without_scoring.oneOf.1","typeLabel":"null"}],"uniqueKey":"questions.items.[INDEX].is_without_scoring","typeLabel":"boolean | null"},"is_candidate_asking_recruiter":{"oneOf":[{"type":"boolean","description":"Candidate-asks-recruiter prompt (view 'candidate asking recruiter').","uniqueKey":"questions.items.[INDEX].is_candidate_asking_recruiter.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Candidate-asks-recruiter prompt (view 'candidate asking recruiter').","uniqueKey":"questions.items.[INDEX].is_candidate_asking_recruiter.oneOf.1","typeLabel":"null"}],"uniqueKey":"questions.items.[INDEX].is_candidate_asking_recruiter","typeLabel":"boolean | null"},"is_expert":{"oneOf":[{"type":"boolean","description":"Expert listening question (view 'with listening expert').","uniqueKey":"questions.items.[INDEX].is_expert.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Expert listening question (view 'with listening expert').","uniqueKey":"questions.items.[INDEX].is_expert.oneOf.1","typeLabel":"null"}],"uniqueKey":"questions.items.[INDEX].is_expert","typeLabel":"boolean | null"},"is_multiple_choice":{"oneOf":[{"type":"boolean","description":"Multiple-choice question (view 'multiple choice').","uniqueKey":"questions.items.[INDEX].is_multiple_choice.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Multiple-choice question (view 'multiple choice').","uniqueKey":"questions.items.[INDEX].is_multiple_choice.oneOf.1","typeLabel":"null"}],"uniqueKey":"questions.items.[INDEX].is_multiple_choice","typeLabel":"boolean | null"},"question_alternatives":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"questions.items.[INDEX].question_alternatives.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"Alternative phrasings for the question.","uniqueKey":"questions.items.[INDEX].question_alternatives.oneOf.0","typeLabel":"string[]"},{"type":"null","items":{"type":"string"},"description":"Alternative phrasings for the question.","uniqueKey":"questions.items.[INDEX].question_alternatives.oneOf.1","typeLabel":"null"}],"uniqueKey":"questions.items.[INDEX].question_alternatives","typeLabel":"string[] | null"},"conditional_question_main_id":{"oneOf":[{"type":"string","description":"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.","uniqueKey":"questions.items.[INDEX].conditional_question_main_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"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.","uniqueKey":"questions.items.[INDEX].conditional_question_main_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"questions.items.[INDEX].conditional_question_main_id","typeLabel":"string | null"},"conditional_question_answer":{"oneOf":[{"type":"boolean","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,"uniqueKey":"questions.items.[INDEX].conditional_question_answer.oneOf.0","typeLabel":"boolean"},{"type":"null","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,"uniqueKey":"questions.items.[INDEX].conditional_question_answer.oneOf.1","typeLabel":"null"}],"uniqueKey":"questions.items.[INDEX].conditional_question_answer","typeLabel":"boolean | null"},"is_skippable":{"oneOf":[{"type":"boolean","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,"uniqueKey":"questions.items.[INDEX].is_skippable.oneOf.0","typeLabel":"boolean"},{"type":"null","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,"uniqueKey":"questions.items.[INDEX].is_skippable.oneOf.1","typeLabel":"null"}],"uniqueKey":"questions.items.[INDEX].is_skippable","typeLabel":"boolean | null"},"knowledge_base_id":{"oneOf":[{"type":"string","description":"Knowledge-base store id (uuid) the question draws context from.","uniqueKey":"questions.items.[INDEX].knowledge_base_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Knowledge-base store id (uuid) the question draws context from.","uniqueKey":"questions.items.[INDEX].knowledge_base_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"questions.items.[INDEX].knowledge_base_id","typeLabel":"string | null"},"external_id":{"oneOf":[{"type":"string","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.","uniqueKey":"questions.items.[INDEX].external_id.oneOf.0","typeLabel":"string"},{"type":"null","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.","uniqueKey":"questions.items.[INDEX].external_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"questions.items.[INDEX].external_id","typeLabel":"string | null"},"external_data":{"oneOf":[{"type":"object","additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"questions.items.[INDEX].external_data.oneOf.0.additionalProperties.oneOf.1","typeLabel":"null"}],"uniqueKey":"questions.items.[INDEX].external_data.oneOf.0.additionalProperties","typeLabel":"null"},"description":"Arbitrary JSON metadata stored on the question.","uniqueKey":"questions.items.[INDEX].external_data.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"questions.items.[INDEX].external_data.oneOf.1.additionalProperties.oneOf.1","typeLabel":"null"}],"uniqueKey":"questions.items.[INDEX].external_data.oneOf.1.additionalProperties","typeLabel":"null"},"description":"Arbitrary JSON metadata stored on the question.","uniqueKey":"questions.items.[INDEX].external_data.oneOf.1","typeLabel":"null"}],"uniqueKey":"questions.items.[INDEX].external_data","typeLabel":"object | null"},"candidate_expectations_json":{"oneOf":[{"type":"object","properties":{"weak":{"type":"array","items":{"type":"string","uniqueKey":"questions.items.[INDEX].candidate_expectations_json.oneOf.0.weak.items.[INDEX]","typeLabel":"string"},"description":"Baseline requirements every viable candidate should meet (table stakes).","uniqueKey":"questions.items.[INDEX].candidate_expectations_json.oneOf.0.weak","typeLabel":"string[]"},"moderate":{"type":"array","items":{"type":"string","uniqueKey":"questions.items.[INDEX].candidate_expectations_json.oneOf.0.moderate.items.[INDEX]","typeLabel":"string"},"description":"Requirements expected of a solid, competent candidate.","uniqueKey":"questions.items.[INDEX].candidate_expectations_json.oneOf.0.moderate","typeLabel":"string[]"},"strong":{"type":"array","items":{"type":"string","uniqueKey":"questions.items.[INDEX].candidate_expectations_json.oneOf.0.strong.items.[INDEX]","typeLabel":"string"},"description":"High-bar requirements only standout candidates clear.","uniqueKey":"questions.items.[INDEX].candidate_expectations_json.oneOf.0.strong","typeLabel":"string[]"}},"description":"Per-question candidate expectations, bucketed by requirement level (weak/moderate/strong). Extra keys are preserved.","uniqueKey":"questions.items.[INDEX].candidate_expectations_json.oneOf.0","typeLabel":"object"},{"type":"null","properties":{"weak":{"type":"array","items":{"type":"string"},"description":"Baseline requirements every viable candidate should meet (table stakes)."},"moderate":{"type":"array","items":{"type":"string"},"description":"Requirements expected of a solid, competent candidate."},"strong":{"type":"array","items":{"type":"string"},"description":"High-bar requirements only standout candidates clear."}},"description":"Per-question candidate expectations, bucketed by requirement level (weak/moderate/strong). Extra keys are preserved.","uniqueKey":"questions.items.[INDEX].candidate_expectations_json.oneOf.1","typeLabel":"null"}],"uniqueKey":"questions.items.[INDEX].candidate_expectations_json","typeLabel":"object | null"}},"required":["question"],"additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"questions.items.[INDEX].additionalProperties.oneOf.1","typeLabel":"null"}],"uniqueKey":"questions.items.[INDEX].additionalProperties","typeLabel":"null"},"uniqueKey":"questions.items.[INDEX]","typeLabel":"object"},"minItems":1,"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.","uniqueKey":"questions","typeLabel":"object[]"},"regenerate_candidate_expectations":{"type":"boolean","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,"uniqueKey":"regenerate_candidate_expectations","typeLabel":"boolean"},"type":{"type":"string","enum":["interview","coaching","assessment"],"description":"Product 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.","example":"interview","uniqueKey":"type","typeLabel":"enum\u003cstring>"},"type_credit":{"oneOf":[{"type":"string","enum":["resume_check","interview_coach_starter","interview_coach_contributor","interview_coach_manager","cover_letter"],"description":"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..","example":"interview_coach_manager","uniqueKey":"type_credit.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["resume_check","interview_coach_starter","interview_coach_contributor","interview_coach_manager","cover_letter"],"description":"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..","example":"interview_coach_manager","uniqueKey":"type_credit.oneOf.1","typeLabel":"null"}],"uniqueKey":"type_credit","typeLabel":"enum\u003cstring> | null"},"coach_plan":{"oneOf":[{"type":"string","enum":["demo","screening","2nd","3rd","closing","job-specific","other"],"description":"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..","example":"screening","uniqueKey":"coach_plan.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["demo","screening","2nd","3rd","closing","job-specific","other"],"description":"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..","example":"screening","uniqueKey":"coach_plan.oneOf.1","typeLabel":"null"}],"uniqueKey":"coach_plan","typeLabel":"enum\u003cstring> | null"},"interview_template_id":{"type":"string","minLength":1,"description":"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.","example":"46b98d37-1557-4391-beca-03037ead19f2","uniqueKey":"interview_template_id","typeLabel":"string"},"knowledge_base_store_id":{"oneOf":[{"type":"string","description":"Knowledge base store id the interview draws context from; validated for existence. null unlinks it.","uniqueKey":"knowledge_base_store_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Knowledge base store id the interview draws context from; validated for existence. null unlinks it.","uniqueKey":"knowledge_base_store_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"knowledge_base_store_id","typeLabel":"string | null"},"recording":{"oneOf":[{"type":"string","enum":["audio_first_5_answers","audio_all","video_all","video_first_5_answers"],"description":"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..","example":"video_all","uniqueKey":"recording.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["audio_first_5_answers","audio_all","video_all","video_first_5_answers"],"description":"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..","example":"video_all","uniqueKey":"recording.oneOf.1","typeLabel":"null"}],"uniqueKey":"recording","typeLabel":"enum\u003cstring> | null"},"recording_full_session":{"oneOf":[{"type":"string","enum":["audio_all","video_all"],"description":"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..","example":"video_all","uniqueKey":"recording_full_session.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["audio_all","video_all"],"description":"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..","example":"video_all","uniqueKey":"recording_full_session.oneOf.1","typeLabel":"null"}],"uniqueKey":"recording_full_session","typeLabel":"enum\u003cstring> | null"},"result_view":{"type":"string","enum":["none","minimal","minimal_with_score","advanced","full","full_expand_scores"],"description":"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..","example":"full","uniqueKey":"result_view","typeLabel":"enum\u003cstring>"},"candidate_video_introduction":{"oneOf":[{"type":"string","enum":["hidden","optional","required"],"description":"Whether a candidate video introduction is hidden, optional or required. null is treated like hidden.","uniqueKey":"candidate_video_introduction.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["hidden","optional","required"],"description":"Whether a candidate video introduction is hidden, optional or required. null is treated like hidden.","uniqueKey":"candidate_video_introduction.oneOf.1","typeLabel":"null"}],"uniqueKey":"candidate_video_introduction","typeLabel":"enum\u003cstring> | null"},"interview_conversation_speed":{"oneOf":[{"type":"string","enum":["slower","normal","faster","fluent"],"description":"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..","example":"normal","uniqueKey":"interview_conversation_speed.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["slower","normal","faster","fluent"],"description":"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..","example":"normal","uniqueKey":"interview_conversation_speed.oneOf.1","typeLabel":"null"}],"uniqueKey":"interview_conversation_speed","typeLabel":"enum\u003cstring> | null"},"max_followups":{"oneOf":[{"type":"integer","minimum":0,"maximum":999,"description":"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).","example":2,"uniqueKey":"max_followups.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":0,"maximum":999,"description":"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).","example":2,"uniqueKey":"max_followups.oneOf.1","typeLabel":"null"}],"uniqueKey":"max_followups","typeLabel":"integer | null"},"max_duration":{"oneOf":[{"type":"number","description":"Live session limit in seconds. Also the basis for the credit multiplier.","example":1200,"uniqueKey":"max_duration.oneOf.0","typeLabel":"number"},{"type":"null","description":"Live session limit in seconds. Also the basis for the credit multiplier.","example":1200,"uniqueKey":"max_duration.oneOf.1","typeLabel":"null"}],"uniqueKey":"max_duration","typeLabel":"number | null"},"questions_random_subset":{"oneOf":[{"type":"number","minimum":0.01,"maximum":0.9,"description":"Ask only a random subset of the questions, as a fraction between 0.01 and 0.9. null asks all questions.","example":0.5,"uniqueKey":"questions_random_subset.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0.01,"maximum":0.9,"description":"Ask only a random subset of the questions, as a fraction between 0.01 and 0.9. null asks all questions.","example":0.5,"uniqueKey":"questions_random_subset.oneOf.1","typeLabel":"null"}],"uniqueKey":"questions_random_subset","typeLabel":"number | null"},"interview_attempts":{"type":"number","minimum":1,"maximum":20,"description":"Allowed candidate attempts (1-20). Stored as result_scoring.max_retries.","example":1,"uniqueKey":"interview_attempts","typeLabel":"number"},"required_pronunciation":{"oneOf":[{"type":"boolean","description":"Require pronunciation assessment (restricts to pronunciation-capable languages).","uniqueKey":"required_pronunciation.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Require pronunciation assessment (restricts to pronunciation-capable languages).","uniqueKey":"required_pronunciation.oneOf.1","typeLabel":"null"}],"uniqueKey":"required_pronunciation","typeLabel":"boolean | null"},"result_enable_edit_transcript":{"oneOf":[{"type":"boolean","description":"Allow editing the transcript on the result view.","uniqueKey":"result_enable_edit_transcript.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Allow editing the transcript on the result view.","uniqueKey":"result_enable_edit_transcript.oneOf.1","typeLabel":"null"}],"uniqueKey":"result_enable_edit_transcript","typeLabel":"boolean | null"},"candidate_expectations":{"oneOf":[{"type":"string","description":"Free-text candidate expectations.","uniqueKey":"candidate_expectations.oneOf.0","typeLabel":"string"},{"type":"null","description":"Free-text candidate expectations.","uniqueKey":"candidate_expectations.oneOf.1","typeLabel":"null"}],"uniqueKey":"candidate_expectations","typeLabel":"string | null"},"candidate_expectations_json":{"oneOf":[{"type":"object","properties":{"weak":{"type":"array","items":{"type":"string","uniqueKey":"candidate_expectations_json.oneOf.0.weak.items.[INDEX]","typeLabel":"string"},"description":"Baseline requirements every viable candidate should meet (table stakes).","uniqueKey":"candidate_expectations_json.oneOf.0.weak","typeLabel":"string[]"},"moderate":{"type":"array","items":{"type":"string","uniqueKey":"candidate_expectations_json.oneOf.0.moderate.items.[INDEX]","typeLabel":"string"},"description":"Requirements expected of a solid, competent candidate.","uniqueKey":"candidate_expectations_json.oneOf.0.moderate","typeLabel":"string[]"},"strong":{"type":"array","items":{"type":"string","uniqueKey":"candidate_expectations_json.oneOf.0.strong.items.[INDEX]","typeLabel":"string"},"description":"High-bar requirements only standout candidates clear.","uniqueKey":"candidate_expectations_json.oneOf.0.strong","typeLabel":"string[]"}},"description":"Structured candidate expectations (the scoring rubric), bucketed by requirement level (weak/moderate/strong). null clears the rubric. Extra keys are preserved.","uniqueKey":"candidate_expectations_json.oneOf.0","typeLabel":"object"},{"type":"null","properties":{"weak":{"type":"array","items":{"type":"string"},"description":"Baseline requirements every viable candidate should meet (table stakes)."},"moderate":{"type":"array","items":{"type":"string"},"description":"Requirements expected of a solid, competent candidate."},"strong":{"type":"array","items":{"type":"string"},"description":"High-bar requirements only standout candidates clear."}},"description":"Structured candidate expectations (the scoring rubric), bucketed by requirement level (weak/moderate/strong). null clears the rubric. Extra keys are preserved.","uniqueKey":"candidate_expectations_json.oneOf.1","typeLabel":"null"}],"uniqueKey":"candidate_expectations_json","typeLabel":"object | null"},"custom_scoring":{"oneOf":[{"type":"object","additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"custom_scoring.oneOf.0.additionalProperties.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_scoring.oneOf.0.additionalProperties","typeLabel":"null"},"description":"Result-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.","uniqueKey":"custom_scoring.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":{"oneOf":[{},{"type":"null","uniqueKey":"custom_scoring.oneOf.1.additionalProperties.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_scoring.oneOf.1.additionalProperties","typeLabel":"null"},"description":"Result-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.","uniqueKey":"custom_scoring.oneOf.1","typeLabel":"null"}],"uniqueKey":"custom_scoring","typeLabel":"object | null"},"pdf_export_auto_config":{"oneOf":[{"type":"object","properties":{"mojito_language_code":{"type":"string","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"],"description":"Report language code (a platform-languages.json code).","example":"en","uniqueKey":"pdf_export_auto_config.oneOf.0.mojito_language_code","typeLabel":"enum\u003cstring>"},"contact_details":{"type":"boolean","description":"Include candidate contact details.","uniqueKey":"pdf_export_auto_config.oneOf.0.contact_details","typeLabel":"boolean"},"ai_recruiter_assessment":{"type":"boolean","description":"Include the AI recruiter assessment.","uniqueKey":"pdf_export_auto_config.oneOf.0.ai_recruiter_assessment","typeLabel":"boolean"},"ai_scoring_rubric":{"type":"boolean","description":"Include the AI scoring rubric.","uniqueKey":"pdf_export_auto_config.oneOf.0.ai_scoring_rubric","typeLabel":"boolean"},"analytics":{"type":"boolean","description":"Include analytics.","uniqueKey":"pdf_export_auto_config.oneOf.0.analytics","typeLabel":"boolean"},"files":{"type":"boolean","description":"Include uploaded candidate files.","uniqueKey":"pdf_export_auto_config.oneOf.0.files","typeLabel":"boolean"},"transcript":{"type":"boolean","description":"Include the interview transcript.","uniqueKey":"pdf_export_auto_config.oneOf.0.transcript","typeLabel":"boolean"},"answer_recording":{"type":"boolean","description":"Include per-answer recordings.","uniqueKey":"pdf_export_auto_config.oneOf.0.answer_recording","typeLabel":"boolean"},"session_recording":{"type":"boolean","description":"Include the full-session recording.","uniqueKey":"pdf_export_auto_config.oneOf.0.session_recording","typeLabel":"boolean"},"group_by_question":{"type":"boolean","description":"Group transcript answers by expected question.","uniqueKey":"pdf_export_auto_config.oneOf.0.group_by_question","typeLabel":"boolean"},"template":{"type":"string","enum":["classic","modern","one_pager"],"description":"Report layout: classic, modern, or one_pager. Omit for the merchant default (modern when unset).","uniqueKey":"pdf_export_auto_config.oneOf.0.template","typeLabel":"enum\u003cstring>"}},"description":"Auto-generate a candidate PDF report with these options once the interview completes. null disables auto-export.","uniqueKey":"pdf_export_auto_config.oneOf.0","typeLabel":"object"},{"type":"null","properties":{"mojito_language_code":{"type":"string","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"],"description":"Report language code (a platform-languages.json code).","example":"en"},"contact_details":{"type":"boolean","description":"Include candidate contact details."},"ai_recruiter_assessment":{"type":"boolean","description":"Include the AI recruiter assessment."},"ai_scoring_rubric":{"type":"boolean","description":"Include the AI scoring rubric."},"analytics":{"type":"boolean","description":"Include analytics."},"files":{"type":"boolean","description":"Include uploaded candidate files."},"transcript":{"type":"boolean","description":"Include the interview transcript."},"answer_recording":{"type":"boolean","description":"Include per-answer recordings."},"session_recording":{"type":"boolean","description":"Include the full-session recording."},"group_by_question":{"type":"boolean","description":"Group transcript answers by expected question."},"template":{"type":"string","enum":["classic","modern","one_pager"],"description":"Report layout: classic, modern, or one_pager. Omit for the merchant default (modern when unset)."}},"description":"Auto-generate a candidate PDF report with these options once the interview completes. null disables auto-export.","uniqueKey":"pdf_export_auto_config.oneOf.1","typeLabel":"null"}],"uniqueKey":"pdf_export_auto_config","typeLabel":"object | null"},"interview_type":{"oneOf":[{"type":"string","enum":["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"],"description":"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..","example":"pre-screening-with-test-questions","uniqueKey":"interview_type.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["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"],"description":"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..","example":"pre-screening-with-test-questions","uniqueKey":"interview_type.oneOf.1","typeLabel":"null"}],"uniqueKey":"interview_type","typeLabel":"enum\u003cstring> | null"},"interview_tone":{"oneOf":[{"type":"string","enum":["relaxed","simple","professional","persuasive","exact"],"description":"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..","example":"professional","uniqueKey":"interview_tone.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["relaxed","simple","professional","persuasive","exact"],"description":"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..","example":"professional","uniqueKey":"interview_tone.oneOf.1","typeLabel":"null"}],"uniqueKey":"interview_tone","typeLabel":"enum\u003cstring> | null"},"seniority_level":{"oneOf":[{"type":"string","enum":["entry-level","intermediate","senior","managerial","director","executive"],"description":"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..","example":"senior","uniqueKey":"seniority_level.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["entry-level","intermediate","senior","managerial","director","executive"],"description":"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..","example":"senior","uniqueKey":"seniority_level.oneOf.1","typeLabel":"null"}],"uniqueKey":"seniority_level","typeLabel":"enum\u003cstring> | null"},"hiring_for_company":{"oneOf":[{"type":"object","properties":{"name":{"oneOf":[{"type":"string","description":"End-employer name. Omit/null when hiring for yourself, 'undisclosed' for an unnamed external client, or the client's company name.","example":"Unimo Enterprises","uniqueKey":"hiring_for_company.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","description":"End-employer name. Omit/null when hiring for yourself, 'undisclosed' for an unnamed external client, or the client's company name.","example":"Unimo Enterprises","uniqueKey":"hiring_for_company.oneOf.0.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"hiring_for_company.oneOf.0.name","typeLabel":"string | null"},"description":{"oneOf":[{"type":"string","description":"Short description of the end employer, used as background context by the agent.","example":"Unimo Enterprises is a leading logistics and supply chain solutions provider.","uniqueKey":"hiring_for_company.oneOf.0.description.oneOf.0","typeLabel":"string"},{"type":"null","description":"Short description of the end employer, used as background context by the agent.","example":"Unimo Enterprises is a leading logistics and supply chain solutions provider.","uniqueKey":"hiring_for_company.oneOf.0.description.oneOf.1","typeLabel":"null"}],"uniqueKey":"hiring_for_company.oneOf.0.description","typeLabel":"string | null"},"location":{"oneOf":[{"type":"string","description":"Primary location of the end employer.","example":"Sri Lanka","uniqueKey":"hiring_for_company.oneOf.0.location.oneOf.0","typeLabel":"string"},{"type":"null","description":"Primary location of the end employer.","example":"Sri Lanka","uniqueKey":"hiring_for_company.oneOf.0.location.oneOf.1","typeLabel":"null"}],"uniqueKey":"hiring_for_company.oneOf.0.location","typeLabel":"string | null"},"sector":{"oneOf":[{"type":"string","description":"Industry / sector of the end employer.","example":"Logistics and Supply Chain","uniqueKey":"hiring_for_company.oneOf.0.sector.oneOf.0","typeLabel":"string"},{"type":"null","description":"Industry / sector of the end employer.","example":"Logistics and Supply Chain","uniqueKey":"hiring_for_company.oneOf.0.sector.oneOf.1","typeLabel":"null"}],"uniqueKey":"hiring_for_company.oneOf.0.sector","typeLabel":"string | null"},"company_size":{"oneOf":[{"type":"string","description":"Approximate headcount of the end employer.","example":"100-200","uniqueKey":"hiring_for_company.oneOf.0.company_size.oneOf.0","typeLabel":"string"},{"type":"null","description":"Approximate headcount of the end employer.","example":"100-200","uniqueKey":"hiring_for_company.oneOf.0.company_size.oneOf.1","typeLabel":"null"}],"uniqueKey":"hiring_for_company.oneOf.0.company_size","typeLabel":"string | null"}},"description":"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: '\u003ccompany>' } plus optional description/location/sector/company_size. Stored in creation_parameters.hiring_for_company.","example":{"name":"undisclosed"},"uniqueKey":"hiring_for_company.oneOf.0","typeLabel":"object"},{"type":"null","properties":{"name":{"oneOf":[{"type":"string","description":"End-employer name. Omit/null when hiring for yourself, 'undisclosed' for an unnamed external client, or the client's company name.","example":"Unimo Enterprises"},{"type":"null","description":"End-employer name. Omit/null when hiring for yourself, 'undisclosed' for an unnamed external client, or the client's company name.","example":"Unimo Enterprises"}]},"description":{"oneOf":[{"type":"string","description":"Short description of the end employer, used as background context by the agent.","example":"Unimo Enterprises is a leading logistics and supply chain solutions provider."},{"type":"null","description":"Short description of the end employer, used as background context by the agent.","example":"Unimo Enterprises is a leading logistics and supply chain solutions provider."}]},"location":{"oneOf":[{"type":"string","description":"Primary location of the end employer.","example":"Sri Lanka"},{"type":"null","description":"Primary location of the end employer.","example":"Sri Lanka"}]},"sector":{"oneOf":[{"type":"string","description":"Industry / sector of the end employer.","example":"Logistics and Supply Chain"},{"type":"null","description":"Industry / sector of the end employer.","example":"Logistics and Supply Chain"}]},"company_size":{"oneOf":[{"type":"string","description":"Approximate headcount of the end employer.","example":"100-200"},{"type":"null","description":"Approximate headcount of the end employer.","example":"100-200"}]}},"description":"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: '\u003ccompany>' } plus optional description/location/sector/company_size. Stored in creation_parameters.hiring_for_company.","example":{"name":"undisclosed"},"uniqueKey":"hiring_for_company.oneOf.1","typeLabel":"null"}],"uniqueKey":"hiring_for_company","typeLabel":"object | null"}},"required":["position_id"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"position_id":"00000000-0000-0000-0000-000000000000","status":"active","visibility":"merchant_public","environment":"production","name":"Project manager","code":"\u003cstring>","location":"remote","cover_image_url":"\u003cstring>","description":"\u003cstring>","description_long":"\u003cstring>","interview_department":"Engineering","interview_salary":"$80k - $100k","interview_available_till":"2026-12-31","recruiter_profile_id":"\u003cstring>","country_availability":{"countries_allowed":["PH","IN"],"countries_allowed_eu":true,"countries_blocked":["US"],"countries_blocked_eu":true},"tags":["interview-practice","sales"],"custom_fields":{"cost_centre":"CC-100","contract_type":"permanent"},"questions":[{"question":"\u003cstring>","id":"\u003cstring>","duration":123,"mojito_language_code":"en","label":"\u003cstring>","is_conditional":true,"is_without_scoring":true,"is_candidate_asking_recruiter":true,"is_expert":true,"is_multiple_choice":true,"question_alternatives":["\u003cstring>"],"conditional_question_main_id":"\u003cstring>","conditional_question_answer":false,"is_skippable":false,"knowledge_base_id":"\u003cstring>","external_id":"\u003cstring>","external_data":{},"candidate_expectations_json":{"weak":["\u003cstring>"],"moderate":["\u003cstring>"],"strong":["\u003cstring>"]}}],"regenerate_candidate_expectations":false,"type":"interview","type_credit":"interview_coach_manager","coach_plan":"screening","interview_template_id":"46b98d37-1557-4391-beca-03037ead19f2","knowledge_base_store_id":"\u003cstring>","recording":"video_all","recording_full_session":"video_all","result_view":"full","interview_conversation_speed":"normal","max_followups":2,"max_duration":1200,"questions_random_subset":0.5,"interview_attempts":1,"required_pronunciation":true,"result_enable_edit_transcript":true,"candidate_expectations":"\u003cstring>","candidate_expectations_json":{"weak":["\u003cstring>"],"moderate":["\u003cstring>"],"strong":["\u003cstring>"]},"custom_scoring":{},"pdf_export_auto_config":{"mojito_language_code":"en","contact_details":true,"ai_recruiter_assessment":true,"ai_scoring_rubric":true,"analytics":true,"files":true,"transcript":true,"answer_recording":true,"session_recording":true,"group_by_question":true},"interview_type":"pre-screening-with-test-questions","interview_tone":"professional","seniority_level":"senior","hiring_for_company":{"name":"undisclosed"}}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"97fbcd2e-eb20-4851-9143-12b03bb7df70":{"description":"Interview / position updated.","content":{"application/json":{"schema":{"type":"object","properties":{"position_id":{"type":"string","description":"The id that was updated.","isRequired":true,"uniqueKey":"position_id","typeLabel":"string"},"is_multistage":{"type":"boolean","description":"True when the id resolved to a multi-stage position (position_def_set) rather than a single interview.","isRequired":true,"uniqueKey":"is_multistage","typeLabel":"boolean"},"updated_fields":{"type":"array","items":{"type":"string","uniqueKey":"updated_fields.items.[INDEX]","typeLabel":"string"},"description":"Names of the stored columns that were written, plus `status` when the lifecycle status was changed and `questions` when the question list was diffed.","example":["name","tags"],"isRequired":true,"uniqueKey":"updated_fields","typeLabel":"string[]"},"questions_diff":{"type":"object","properties":{"kept":{"type":"array","items":{"type":"string","uniqueKey":"questions_diff.kept.items.[INDEX]","typeLabel":"string"},"description":"Questions left exactly as they were, record and all.","isRequired":true,"uniqueKey":"questions_diff.kept","typeLabel":"string[]"},"added":{"type":"array","items":{"type":"string","uniqueKey":"questions_diff.added.items.[INDEX]","typeLabel":"string"},"description":"Ids of the questions created for entries that matched nothing stored.","isRequired":true,"uniqueKey":"questions_diff.added","typeLabel":"string[]"},"removed":{"type":"array","items":{"type":"string","uniqueKey":"questions_diff.removed.items.[INDEX]","typeLabel":"string"},"description":"Ids unlinked because no entry in the request matched them. The question records themselves still exist.","isRequired":true,"uniqueKey":"questions_diff.removed","typeLabel":"string[]"},"replaced":{"type":"array","items":{"type":"object","properties":{"from":{"type":"string","description":"The id that was unlinked.","isRequired":true,"uniqueKey":"questions_diff.replaced.items.[INDEX].from","typeLabel":"string"},"to":{"type":"string","description":"The id of the question created in its place.","isRequired":true,"uniqueKey":"questions_diff.replaced.items.[INDEX].to","typeLabel":"string"}},"required":["from","to"],"uniqueKey":"questions_diff.replaced.items.[INDEX]","typeLabel":"object"},"description":"Edited questions: the old record was unlinked and a new one created, so the change cannot leak into other interviews reusing it.","isRequired":true,"uniqueKey":"questions_diff.replaced","typeLabel":"object[]"},"question_ids":{"type":"array","items":{"type":"string","uniqueKey":"questions_diff.question_ids.items.[INDEX]","typeLabel":"string"},"description":"The interview's full ordered step list after the update, including the welcome / thank-you / instructional steps this endpoint does not manage.","isRequired":true,"uniqueKey":"questions_diff.question_ids","typeLabel":"string[]"},"reactivated":{"type":"boolean","description":"True when the interview was already active and was re-published so the new questions go live.","isRequired":true,"uniqueKey":"questions_diff.reactivated","typeLabel":"boolean"}},"required":["kept","added","removed","replaced","question_ids","reactivated"],"description":"What the question diff decided, question by question. Absent when `questions` was not sent.","uniqueKey":"questions_diff","typeLabel":"object"}},"required":["position_id","is_multistage","updated_fields"],"description":"Confirmation of what was updated.","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"position_id":"\u003cstring>","is_multistage":true,"updated_fields":["name","tags"],"questions_diff":{"kept":["\u003cstring>"],"added":["\u003cstring>"],"removed":["\u003cstring>"],"replaced":[{"from":"\u003cstring>","to":"\u003cstring>"}],"question_ids":["\u003cstring>"],"reactivated":true}}}},"exampleType":"generated"}},"exampleType":"generated"},"04ff35f2-b561-4fc2-aacf-c4b0ad935d6c":{"description":"Missing, expired or invalid access token.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Field is required.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"name":{"type":"string","example":"interview_result_id","uniqueKey":"name","typeLabel":"string"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"Field is required.","name":"interview_result_id"}}},"exampleType":"generated"}},"exampleType":"generated"},"e0e49b1e-a065-4fca-83f7-cc797e86e72e":{"description":"Your token is not allowed to use this endpoint (it is not a merchant, merchant owner or admin token).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Field is required.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"name":{"type":"string","example":"interview_result_id","uniqueKey":"name","typeLabel":"string"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"Field is required.","name":"interview_result_id"}}},"exampleType":"generated"}},"exampleType":"generated"},"83665f55-3b9f-46f3-a8d9-b6dcdbd13591":{"description":"No interview or position found for the given id (or hidden by row-level security).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Field is required.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"name":{"type":"string","example":"interview_result_id","uniqueKey":"name","typeLabel":"string"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"Field is required.","name":"interview_result_id"}}},"exampleType":"generated"}},"exampleType":"generated"},"8a01a008-4918-47df-82e6-018ee39971c2":{"description":"Validation error (unknown enum value, out-of-range number, unresolved template/language/knowledge-base id, an interview-only field sent for a multi-stage position, an empty `questions` array, or a question change on an active interview using an offline avatar template).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Field is required.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"name":{"type":"string","example":"interview_result_id","uniqueKey":"name","typeLabel":"string"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"Field is required.","name":"interview_result_id"}}},"exampleType":"generated"}},"exampleType":"generated"},"818d8cd5-b376-4b2e-a493-8154ce1dbb1c":{"description":"Server error.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Field is required.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"name":{"type":"string","example":"interview_result_id","uniqueKey":"name","typeLabel":"string"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"Field is required.","name":"interview_result_id"}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"71698ed3-efb4-4472-a992-0b489fa45e9c":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Supabase JWT — `Authorization: Bearer \u003ctoken>`.","scopes":[],"schemeName":"bearerAuth"}}},"servers":{"fbb516e7-faf7-4370-92d5-1080cab628b4":{"url":"https://cool.jobmojito.com/functions/v1","description":"Production"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Supabase JWT — `Authorization: Bearer \u003ctoken>`.","scopes":[],"schemeName":"bearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Supabase JWT — `Authorization: Bearer \u003ctoken>`.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"}]},"originalFileLocation":"https://cool.jobmojito.com/functions/v1/openapi"},"subdomain":"jobmojito","siteName":"JobMojito Developer / Agent","title":"Update an interview or position - JobMojito Developer / Agent","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-03T12:45:01.093Z","originalFileLocation":"api-reference/interviews/update-an-interview-or-position.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Updates the configuration of an existing interview (single-stage) or position (multi-stage). Only the fields present in the request body are written — everything else keeps its current value, and sending null clears a nullable field. The question list is only touched when you send questions; omit that field and the questions are left exactly as they are. When sent, it must be the complete list and is applied as a diff against what is stored (matched on external_id, then id, then identical content), so unchanged questions keep their existing records, edited ones are unlinked and re-created, and dropped ones are unlinked — and re-sending the array job-interview-get returned changes nothing. See the field description, and questions_diff in the response for what was decided. Questions of an interview that is already active can only be changed on interactive avatar templates, where re-publishing is instant; on the offline (pre-rendered video) templates set the interview back to draft first. The welcome / thank-you messages and the instructional-video screen are stored as steps rather than questions and are never changed here. mojito_language_code cannot be changed — the existing questions and rendered videos are in the original language — so create a new interview to change language. A multi-stage position only carries the shared identity fields (name, code, location, description, description_long, cover_image_url, department, salary, available_till, recruiter, status, visibility, hiring_for_company); sending an interview-only field for a position is a 422.\">\u003cmeta data-mint-head name=\"application-name\" content=\"JobMojito Developer / Agent\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/jobmojito/GZwP9Qkfq6UpkrB8/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/jobmojito/GZwP9Qkfq6UpkrB8/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/jobmojito/GZwP9Qkfq6UpkrB8/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/jobmojito/GZwP9Qkfq6UpkrB8/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/jobmojito/GZwP9Qkfq6UpkrB8/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/jobmojito/GZwP9Qkfq6UpkrB8/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/jobmojito/GZwP9Qkfq6UpkrB8/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/jobmojito/GZwP9Qkfq6UpkrB8/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/jobmojito/GZwP9Qkfq6UpkrB8/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Update an interview or position - JobMojito Developer / Agent\">\u003cmeta data-mint-head property=\"og:description\" content=\"Updates the configuration of an existing interview (single-stage) or position (multi-stage). Only the fields present in the request body are written — everything else keeps its current value, and sending null clears a nullable field. The question list is only touched when you send questions; omit that field and the questions are left exactly as they are. When sent, it must be the complete list and is applied as a diff against what is stored (matched on external_id, then id, then identical content), so unchanged questions keep their existing records, edited ones are unlinked and re-created, and dropped ones are unlinked — and re-sending the array job-interview-get returned changes nothing. See the field description, and questions_diff in the response for what was decided. Questions of an interview that is already active can only be changed on interactive avatar templates, where re-publishing is instant; on the offline (pre-rendered video) templates set the interview back to draft first. The welcome / thank-you messages and the instructional-video screen are stored as steps rather than questions and are never changed here. mojito_language_code cannot be changed — the existing questions and rendered videos are in the original language — so create a new interview to change language. A multi-stage position only carries the shared identity fields (name, code, location, description, description_long, cover_image_url, department, salary, available_till, recruiter, status, visibility, hiring_for_company); sending an interview-only field for a position is a 422.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"JobMojito Developer / Agent\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://developer.jobmojito.com/api-reference/interviews/update-an-interview-or-position\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://jobmojito.mintlify.app/_mintlify/api/og/v2?division=Interviews\u0026amp;title=Update+an+interview+or+position\u0026amp;description=Updates+the+configuration+of+an+existing+interview+%28single-stage%29+or+position+%28multi-stage%29.+Only+the+fields+present+in+the+request+body+are+written+%E2%80%94+everythin\u0026amp;theme=8f95634a50c8277f4e6a8e67\u0026amp;signature=c503c8d7dbb04f2fe14f327558414875c8eb379d6648db145c7bbe14d93d1eb0\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Update an interview or position - JobMojito Developer / Agent\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Updates the configuration of an existing interview (single-stage) or position (multi-stage). Only the fields present in the request body are written — everything else keeps its current value, and sending null clears a nullable field. The question list is only touched when you send questions; omit that field and the questions are left exactly as they are. When sent, it must be the complete list and is applied as a diff against what is stored (matched on external_id, then id, then identical content), so unchanged questions keep their existing records, edited ones are unlinked and re-created, and dropped ones are unlinked — and re-sending the array job-interview-get returned changes nothing. See the field description, and questions_diff in the response for what was decided. Questions of an interview that is already active can only be changed on interactive avatar templates, where re-publishing is instant; on the offline (pre-rendered video) templates set the interview back to draft first. The welcome / thank-you messages and the instructional-video screen are stored as steps rather than questions and are never changed here. mojito_language_code cannot be changed — the existing questions and rendered videos are in the original language — so create a new interview to change language. A multi-stage position only carries the shared identity fields (name, code, location, description, description_long, cover_image_url, department, salary, available_till, recruiter, status, visibility, hiring_for_company); sending an interview-only field for a position is a 422.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://jobmojito.mintlify.app/_mintlify/api/og/v2?division=Interviews\u0026amp;title=Update+an+interview+or+position\u0026amp;description=Updates+the+configuration+of+an+existing+interview+%28single-stage%29+or+position+%28multi-stage%29.+Only+the+fields+present+in+the+request+body+are+written+%E2%80%94+everythin\u0026amp;theme=8f95634a50c8277f4e6a8e67\u0026amp;signature=c503c8d7dbb04f2fe14f327558414875c8eb379d6648db145c7bbe14d93d1eb0\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/jobmojito/GZwP9Qkfq6UpkrB8/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"JobMojito Developer / Agent\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#639C42\">\u003clink data-mint-head rel=\"canonical\" href=\"https://developer.jobmojito.com/api-reference/interviews/update-an-interview-or-position\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/interviews/update-an-interview-or-position.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://developer.jobmojito.com/#organization\",\"name\":\"JobMojito Developer / Agent\",\"url\":\"https://developer.jobmojito.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/jobmojito/DU7xAw61G9kqV1zG/images/jobmojito-light.svg?fit=max\u0026auto=format\u0026n=DU7xAw61G9kqV1zG\u0026q=85\u0026s=6c00cb5f3104ffb6325dacc0818bba69\"}},{\"@type\":\"WebSite\",\"@id\":\"https://developer.jobmojito.com#website\",\"name\":\"JobMojito Developer / Agent\",\"url\":\"https://developer.jobmojito.com\",\"publisher\":{\"@id\":\"https://developer.jobmojito.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://developer.jobmojito.com/api-reference/interviews/update-an-interview-or-position#webpage\",\"url\":\"https://developer.jobmojito.com/api-reference/interviews/update-an-interview-or-position\",\"name\":\"Update an interview or position\",\"description\":\"Updates the configuration of an existing interview (single-stage) or position (multi-stage). Only the fields present in the request body are written — everything else keeps its current value, and sending null clears a nullable field. The question list is only touched when you send questions; omit that field and the questions are left exactly as they are. When sent, it must be the complete list and is applied as a diff against what is stored (matched on external_id, then id, then identical content), so unchanged questions keep their existing records, edited ones are unlinked and re-created, and dropped ones are unlinked — and re-sending the array job-interview-get returned changes nothing. See the field description, and questions_diff in the response for what was decided. Questions of an interview that is already active can only be changed on interactive avatar templates, where re-publishing is instant; on the offline (pre-rendered video) templates set the interview back to draft first. The welcome / thank-you messages and the instructional-video screen are stored as steps rather than questions and are never changed here. mojito_language_code cannot be changed — the existing questions and rendered videos are in the original language — so create a new interview to change language. A multi-stage position only carries the shared identity fields (name, code, location, description, description_long, cover_image_url, department, salary, available_till, recruiter, status, visibility, hiring_for_company); sending an interview-only field for a position is a 422.\",\"dateModified\":\"2026-11-03T12:45:01.093Z\",\"isPartOf\":{\"@id\":\"https://developer.jobmojito.com#website\"},\"breadcrumb\":{\"@id\":\"https://developer.jobmojito.com/api-reference/interviews/update-an-interview-or-position#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://developer.jobmojito.com/api-reference/interviews/update-an-interview-or-position#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Interviews\",\"item\":\"https://developer.jobmojito.com/api-reference/interviews/create-a-new-interview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Update an interview or position\",\"item\":\"https://developer.jobmojito.com/api-reference/interviews/update-an-interview-or-position\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://developer.jobmojito.com/api-reference/interviews/update-an-interview-or-position#apireference\",\"headline\":\"Update an interview or position\",\"name\":\"Update an interview or position\",\"description\":\"Updates the configuration of an existing interview (single-stage) or position (multi-stage). Only the fields present in the request body are written — everything else keeps its current value, and sending null clears a nullable field. The question list is only touched when you send questions; omit that field and the questions are left exactly as they are. When sent, it must be the complete list and is applied as a diff against what is stored (matched on external_id, then id, then identical content), so unchanged questions keep their existing records, edited ones are unlinked and re-created, and dropped ones are unlinked — and re-sending the array job-interview-get returned changes nothing. See the field description, and questions_diff in the response for what was decided. Questions of an interview that is already active can only be changed on interactive avatar templates, where re-publishing is instant; on the offline (pre-rendered video) templates set the interview back to draft first. The welcome / thank-you messages and the instructional-video screen are stored as steps rather than questions and are never changed here. mojito_language_code cannot be changed — the existing questions and rendered videos are in the original language — so create a new interview to change language. A multi-stage position only carries the shared identity fields (name, code, location, description, description_long, cover_image_url, department, salary, available_till, recruiter, status, visibility, hiring_for_company); sending an interview-only field for a position is a 422.\",\"url\":\"https://developer.jobmojito.com/api-reference/interviews/update-an-interview-or-position\",\"mainEntityOfPage\":{\"@id\":\"https://developer.jobmojito.com/api-reference/interviews/update-an-interview-or-position#webpage\"},\"dateModified\":\"2026-11-03T12:45:01.093Z\",\"publisher\":{\"@id\":\"https://developer.jobmojito.com/#organization\"},\"isPartOf\":{\"@id\":\"https://developer.jobmojito.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"JobMojito Developer / Agent\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"JobMojito Developer / Agent","nav":{"global":null,"tabs":[{"tab":"Welcome","pages":[{"title":"Welcome","href":"/welcome"}]},{"tab":"API Reference","groups":[{"group":"Interviews","pages":[{"title":"Create a new interview","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi post /job-interview-create","href":"/api-reference/interviews/create-a-new-interview"},{"title":"Create an interview from an array of questions","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi post /job-interview-create-from-array","href":"/api-reference/interviews/create-an-interview-from-an-array-of-questions"},{"title":"Create an interview for a candidate and return an access token URL","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi post /job-interview-create-for-candidate-with-token","href":"/api-reference/interviews/create-an-interview-for-a-candidate-and-return-an-access-token-url"},{"title":"Create a role-play — coaching persona or interview-portal role-play (choose with `portal`)","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi post /persona-create","href":"/api-reference/interviews/create-a-role-play-—-coaching-persona-or-interview-portal-role-play-choose-with-`portal`"},{"title":"Get interview definition","description":"Retrieves the interview definition for a given interview-definition id or position id. Returns the compiled `calc_definition_json`, the ordered `questions` array (in the same format job-interview-create-from-array accepts, so it round-trips into job-interview-update) plus basic metadata. Access is subject to the caller's row-level security.","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi get /job-interview-get","href":"/api-reference/interviews/get-interview-definition"},{"title":"Update an interview or position","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi post /job-interview-update","href":"/api-reference/interviews/update-an-interview-or-position"},{"title":"Set interview state","description":"Changes the lifecycle status of an interview or position (draft, active, archived, preparing, completed, deleted) and/or manages its embed key. Provide at least one of `status` or `is_embedded`.","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi post /job-interview-set-state","href":"/api-reference/interviews/set-interview-state"},{"title":"Generate a signed interview URL","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi post /job-interview-token","href":"/api-reference/interviews/generate-a-signed-interview-url"},{"title":"Register users for an interview","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi post /job-interview-register-users","href":"/api-reference/interviews/register-users-for-an-interview"},{"title":"List interview definitions","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi get /merchant-interview-list","href":"/api-reference/interviews/list-interview-definitions"}]},{"group":"Coaching catalogue","pages":[{"title":"Create a coaching catalogue directory","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi post /catalogue-tag-create","href":"/api-reference/coaching-catalogue/create-a-coaching-catalogue-directory"},{"title":"Update a coaching catalogue directory","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi post /catalogue-tag-update","href":"/api-reference/coaching-catalogue/update-a-coaching-catalogue-directory"},{"title":"Get a coaching catalogue directory","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi get /catalogue-tag-get","href":"/api-reference/coaching-catalogue/get-a-coaching-catalogue-directory"},{"title":"List coaching catalogue directories","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi get /catalogue-tag-list","href":"/api-reference/coaching-catalogue/list-coaching-catalogue-directories"}]},{"group":"Results","pages":[{"title":"Get interview result details with transcript","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi get /job-interview-details","href":"/api-reference/results/get-interview-result-details-with-transcript"},{"title":"Generate an interview report","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi post /job-interview-pdf","href":"/api-reference/results/generate-an-interview-report"},{"title":"Request another interview attempt","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi post /job-interview-result-request-another-attempt","href":"/api-reference/results/request-another-interview-attempt"},{"title":"Record an external assessment result","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi post /assessment-result-set","href":"/api-reference/results/record-an-external-assessment-result"},{"title":"List interview results","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi get /merchant-result-list","href":"/api-reference/results/list-interview-results"},{"title":"Get daily event analytics","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi get /merchant-analytics","href":"/api-reference/results/get-daily-event-analytics"},{"title":"Get merchant credit usage","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi get /merchant-analytics-credits-used","href":"/api-reference/results/get-merchant-credit-usage"}]},{"group":"Reports","pages":[{"title":"List report datasets, fields and measures","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi get /report-catalog","href":"/api-reference/reports/list-report-datasets-fields-and-measures"},{"title":"List custom reports","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi get /report-list","href":"/api-reference/reports/list-custom-reports"},{"title":"Get a custom report definition","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi get /report-get","href":"/api-reference/reports/get-a-custom-report-definition"},{"title":"Run a custom report","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi get /report-run","href":"/api-reference/reports/run-a-custom-report"},{"title":"Check and run an unsaved report","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi post /report-preview","href":"/api-reference/reports/check-and-run-an-unsaved-report"},{"title":"Create a custom report","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi post /report-create","href":"/api-reference/reports/create-a-custom-report"},{"title":"Update a custom report","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi post /report-update","href":"/api-reference/reports/update-a-custom-report"}]},{"group":"Candidates","pages":[{"title":"List candidates","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi get /merchant-candidate-list","href":"/api-reference/candidates/list-candidates"},{"title":"Download a candidate document","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi get /merchant-document-download","href":"/api-reference/candidates/download-a-candidate-document"}]},{"group":"Knowledge base","pages":[{"title":"Upload a knowledge base document","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi post /knowledge-base-document-upload","href":"/api-reference/knowledge-base/upload-a-knowledge-base-document"}]},{"group":"Resume \u0026 Form verification","pages":[{"title":"Create or update a pre-screening position","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi post /pre-screening-create","href":"/api-reference/resume-\u0026-form-verification/create-or-update-a-pre-screening-position"},{"title":"Run pre-screening on a plaintext resume","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi post /job-interview-pre-screening-api-resume-text","href":"/api-reference/resume-\u0026-form-verification/run-pre-screening-on-a-plaintext-resume"},{"title":"Pre-screen a candidate from a binary resume upload","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi post /job-interview-pre-screening-api-resume-binary","href":"/api-reference/resume-\u0026-form-verification/pre-screen-a-candidate-from-a-binary-resume-upload"}]},{"group":"Admin","pages":[{"title":"Invite admin / merchant-team or coaching users","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi post /invite-users","href":"/api-reference/admin/invite-admin-merchant-team-or-coaching-users"},{"title":"List sub-merchants","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi get /merchant-sub-merchant-list","href":"/api-reference/admin/list-sub-merchants"},{"title":"List avatar templates","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi get /merchant-avatar-list","href":"/api-reference/admin/list-avatar-templates"},{"title":"Get merchant status","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi get /merchant-status","href":"/api-reference/admin/get-merchant-status"},{"title":"List platform languages","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi get /platform-languages-list","href":"/api-reference/admin/list-platform-languages"},{"title":"Get the portal configuration (branding, portals, pages)","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi get /portal-configuration-get","href":"/api-reference/admin/get-the-portal-configuration-branding-portals-pages"},{"title":"Update the portal configuration (branding, portals, pages)","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi post /portal-configuration-update","href":"/api-reference/admin/update-the-portal-configuration-branding-portals-pages"}]},{"group":"Feedback","pages":[{"title":"Submit a feature request","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi post /merchant-feature-request","href":"/api-reference/feedback/submit-a-feature-request"},{"title":"Report a technical issue","deprecated":null,"version":null,"openapi":"https://cool.jobmojito.com/functions/v1/openapi post /merchant-technical-issue","href":"/api-reference/feedback/report-a-technical-issue"}]}]},{"tab":"Webhooks","pages":[{"title":"Webhooks","href":"/api-reference/webhooks/interview-result-submitted"}]},{"tab":"Cookbooks","pages":[{"title":"Cookbooks","href":"/cookbooks"}]},{"tab":"Skills","pages":[{"title":"Skills","href":"/skills/overview"}]},{"tab":"MCP","pages":[{"title":"MCP","href":"/mcp/overview"}]}]},"basePath":"","title":"Update an interview or position - JobMojito Developer / Agent","buildId":"dpl_9VVk5y1P8k1ATeJguVngy9Q3cmbD","deploymentId":"dpl_9VVk5y1P8k1ATeJguVngy9Q3cmbD","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DX1Meug0.js","utils-B_OMIQVC.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-ChxhRPMa.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-CuKvD8Iv.js","snippetPresets-C5d7p2hp.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-CfHcE8m4.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-C1zZV314.js","shallow-CmQhqCJn.js","getApiPlaygroundDisplay-YRo9s1O7.js","CodeSnippet-RN1MTdfk.js","CodeSnippets-DKLPHxJA.js","Page-BAvA99GL.js","getPastedJson-bz0M41mU.js","icon-CsmhpPrv.js","MethodPill-CNGsVE77.js","DuplicateIcon-DilfU_Z2.js","createIcon-BdsYzQck.js","DynamicMarkdown-CbqEDjbV.js","SectionHeading-O6hXpFCN.js","axios-vUo_bRtp.js","Markdown-nKm-uidQ.js","clsx-ClVdStUn.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CIQkMg3R.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-ImrFS4Fy.js"]}