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 out of scope: questions, and the welcome / thank-you messages that are stored as questions, are not changed by this endpoint. For the same reason mojito_language_code cannot be changed — the existing questions stay in the language they were written in — 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.
Authorizations
Supabase JWT — Authorization: Bearer <token>.
Body
Id of the interview definition (single-stage) or position definition (multi-stage) to update. The same id you pass to job-interview-get.
1"00000000-0000-0000-0000-000000000000"
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).
draft, active, archived, deleted, preparing, completed "active"
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..
merchant_public, merchant_invite, merchant_unlisted "merchant_public"
Interview / position name.
"Project manager"
External code/reference. Blank is stored as null.
Interview location (column interview_location). Blank is stored as null.
"remote"
Cover image URL.
Short interview description.
Long-form interview description (column interview_description_long), Markdown.
Department the position belongs to. Blank is stored as null.
"Engineering"
Salary range shown for the position. Blank is stored as null.
"$80k - $100k"
ISO date/time after which the interview is no longer available to candidates. null keeps it always available.
"2026-12-31"
Profile id of the recruiter owning this interview. Must be a merchant/merchant_owner/admin profile of the same merchant. null clears it.
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.
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.
interview, coaching, assessment "interview"
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..
resume_check, interview_coach_starter, interview_coach_contributor, interview_coach_manager, cover_letter "interview_coach_manager"
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..
demo, screening, 2nd, 3rd, closing, job-specific, other "screening"
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.
1"46b98d37-1557-4391-beca-03037ead19f2"
Knowledge base store id the interview draws context from; validated for existence. null unlinks it.
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..
audio_first_5_answers, audio_all, video_all, video_first_5_answers "video_all"
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..
audio_all, video_all "video_all"
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..
none, minimal, minimal_with_score, advanced, full, full_expand_scores "full"
Whether a candidate video introduction is hidden, optional or required. null is treated like hidden.
hidden, optional, required 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..
slower, normal, faster "normal"
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).
0 <= x <= 9992
Live session limit in seconds. Also the basis for the credit multiplier.
1200
Ask only a random subset of the questions, as a fraction between 0.01 and 0.9. null asks all questions.
0.01 <= x <= 0.90.5
Allowed candidate attempts (1-20). Stored as result_scoring.max_retries.
1 <= x <= 201
Require pronunciation assessment (restricts to pronunciation-capable languages).
Allow editing the transcript on the result view.
Free-text candidate expectations.
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.
Auto-generate a candidate PDF report with these options once the interview completes. null disables auto-export.
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..
pre-screening, pre-screening-with-test-questions, second-interview, remote-freelancer-verification, strength-based-interview, potential-based-interview, process-verification-from-knowledge-base "pre-screening-with-test-questions"
Tone — configures the AI avatar's speaking style and the follow-up questions it generates. Stored in creation_parameters; existing questions are NOT regenerated. Suggested values — relaxed: Friendly and conversational tone that helps candidates feel at ease. | simple: Plain language at CEFR A2 level — short sentences and simple words. | professional: Formal and business-like approach suitable for senior roles. | persuasive: Engaging style that encourages candidates to elaborate.. Case-insensitive; other strings are accepted but unknown tones fall back to the default.
"professional"
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..
entry-level, intermediate, senior, managerial, director, executive "senior"
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.
Response
Interview / position updated.
Confirmation of what was updated.
The id that was updated.
True when the id resolved to a multi-stage position (position_def_set) rather than a single interview.
Names of the stored columns that were written, plus status when the lifecycle status was changed.