Skip to main content
POST
Update an interview or position

Authorizations

Authorization
string
header
required

Supabase JWT — Authorization: Bearer <token>.

Body

application/json
position_id
string<uuid>
required

Id of the interview definition (single-stage) or position definition (multi-stage) to update. The same id you pass to job-interview-get.

Minimum string length: 1
Example:

"00000000-0000-0000-0000-000000000000"

status
enum<string>

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).

Available options:
draft,
active,
archived,
deleted,
preparing,
completed
Example:

"active"

visibility
enum<string>

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..

Available options:
merchant_public,
merchant_invite,
merchant_unlisted
Example:

"merchant_public"

name
string | null

Interview / position name.

Example:

"Project manager"

code
string | null

External code/reference. Blank is stored as null.

location
string | null

Interview location (column interview_location). Blank is stored as null.

Example:

"remote"

cover_image_url
string | null

Cover image URL.

description
string | null

Short interview description.

description_long
string | null

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

interview_department
string | null

Department the position belongs to. Blank is stored as null.

Example:

"Engineering"

interview_salary
string | null

Salary range shown for the position. Blank is stored as null.

Example:

"$80k - $100k"

interview_available_till
string | null

ISO date/time after which the interview is no longer available to candidates. null keeps it always available.

Example:

"2026-12-31"

recruiter_profile_id
string | null

Profile id of the recruiter owning this interview. Must be a merchant/merchant_owner/admin profile of the same merchant. null clears it.

tags
string[] | null

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:
questions
object[]

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.

Minimum array length: 1
regenerate_candidate_expectations
boolean

Re-derive the interview-level candidate_expectations_json scoring rubric from the resulting question list, the way job-interview-create-from-array derives it at creation time. Only applies when questions is sent, the interview type is interview, and candidate_expectations_json is not also being set explicitly (an explicit value wins).

Example:

false

type
enum<string>

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.

Available options:
interview,
coaching,
assessment
Example:

"interview"

type_credit
enum<string> | null

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..

Available options:
resume_check,
interview_coach_starter,
interview_coach_contributor,
interview_coach_manager,
cover_letter
Example:

"interview_coach_manager"

coach_plan
enum<string> | null

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..

Available options:
demo,
screening,
2nd,
3rd,
closing,
job-specific,
other
Example:

"screening"

interview_template_id
string

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.

Minimum string length: 1
Example:

"46b98d37-1557-4391-beca-03037ead19f2"

knowledge_base_store_id
string | null

Knowledge base store id the interview draws context from; validated for existence. null unlinks it.

recording
enum<string> | null

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..

Available options:
audio_first_5_answers,
audio_all,
video_all,
video_first_5_answers
Example:

"video_all"

recording_full_session
enum<string> | null

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..

Available options:
audio_all,
video_all
Example:

"video_all"

result_view
enum<string>

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..

Available options:
none,
minimal,
minimal_with_score,
advanced,
full,
full_expand_scores
Example:

"full"

candidate_video_introduction
enum<string> | null

Whether a candidate video introduction is hidden, optional or required. null is treated like hidden.

Available options:
hidden,
optional,
required
interview_conversation_speed
enum<string> | null

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..

Available options:
slower,
normal,
faster
Example:

"normal"

max_followups
integer | null

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).

Required range: 0 <= x <= 999
Example:

2

max_duration
number | null

Live session limit in seconds. Also the basis for the credit multiplier.

Example:

1200

questions_random_subset
number | null

Ask only a random subset of the questions, as a fraction between 0.01 and 0.9. null asks all questions.

Required range: 0.01 <= x <= 0.9
Example:

0.5

interview_attempts
number

Allowed candidate attempts (1-20). Stored as result_scoring.max_retries.

Required range: 1 <= x <= 20
Example:

1

required_pronunciation
boolean | null

Require pronunciation assessment (restricts to pronunciation-capable languages).

result_enable_edit_transcript
boolean | null

Allow editing the transcript on the result view.

candidate_expectations
string | null

Free-text candidate expectations.

candidate_expectations_json
object | null

Structured candidate expectations (the scoring rubric), bucketed by requirement level (weak/moderate/strong). null clears the rubric. Extra keys are preserved.

custom_scoring
object | null

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.

pdf_export_auto_config
object | null

Auto-generate a candidate PDF report with these options once the interview completes. null disables auto-export.

interview_type
enum<string> | null

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..

Available options:
pre-screening,
pre-screening-with-test-questions,
second-interview,
remote-freelancer-verification,
strength-based-interview,
potential-based-interview,
process-verification-from-knowledge-base
Example:

"pre-screening-with-test-questions"

interview_tone
string | null

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.

Example:

"professional"

seniority_level
enum<string> | null

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..

Available options:
entry-level,
intermediate,
senior,
managerial,
director,
executive
Example:

"senior"

hiring_for_company
object | null

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.

Example:

Response

Interview / position updated.

Confirmation of what was updated.

position_id
string
required

The id that was updated.

is_multistage
boolean
required

True when the id resolved to a multi-stage position (position_def_set) rather than a single interview.

updated_fields
string[]
required

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:
questions_diff
object

What the question diff decided, question by question. Absent when questions was not sent.