> ## Documentation Index
> Fetch the complete documentation index at: https://developer.jobmojito.com/llms.txt
> Use this file to discover all available pages before exploring further.

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



## OpenAPI

````yaml https://cool.jobmojito.com/functions/v1/openapi post /job-interview-update
openapi: 3.1.0
info:
  title: JobMojito API
  version: 1.0.0
  description: >-
    Public API for JobMojito, served by Supabase Edge Functions. Authenticate
    with a Supabase JWT access token via the Authorization header.
servers:
  - url: https://cool.jobmojito.com/functions/v1
    description: Production
security: []
tags:
  - name: Interviews
    description: >-
      Create, configure and manage interview / coaching / assessment
      definitions.
  - name: Coaching catalogue
    description: >-
      Directories (pages) of the coaching portal catalogue that group coaching
      sessions and carry custom content pages.
  - name: Results
    description: >-
      Interview results, transcripts, reports, re-attempt requests and
      analytics.
  - name: Candidates
    description: List and manage candidates.
  - name: Knowledge base
    description: Upload documents used to generate knowledge-base interviews.
  - name: Resume & Form verification
    description: Pre-screen candidates from resumes and forms.
  - name: Admin
    description: >-
      Account administration — invite team/coaching users, manage sub-merchants
      and avatar templates.
paths:
  /job-interview-update:
    post:
      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 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.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/JobInterviewUpdateRequest'
      responses:
        '200':
          description: Interview / position updated.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JobInterviewUpdateResponse'
        '401':
          description: Missing, expired or invalid access token.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: >-
            No interview or position found for the given id (or hidden by
            row-level security).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '422':
          description: >-
            Validation error (unknown enum value, out-of-range number,
            unresolved template/language/knowledge-base id, or an interview-only
            field sent for a multi-stage position).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Server error (includes authorization failures).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - bearerAuth: []
components:
  schemas:
    JobInterviewUpdateRequest:
      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
        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
        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
        name:
          type: string
          nullable: true
          description: Interview / position name.
          example: Project manager
        code:
          type: string
          nullable: true
          description: External code/reference. Blank is stored as null.
        location:
          type: string
          nullable: true
          description: >-
            Interview location (column `interview_location`). Blank is stored as
            null.
          example: remote
        cover_image_url:
          type: string
          nullable: true
          description: Cover image URL.
        description:
          type: string
          nullable: true
          description: Short interview description.
        description_long:
          type: string
          nullable: true
          description: >-
            Long-form interview description (column
            `interview_description_long`), Markdown.
        interview_department:
          type: string
          nullable: true
          description: Department the position belongs to. Blank is stored as null.
          example: Engineering
        interview_salary:
          type: string
          nullable: true
          description: Salary range shown for the position. Blank is stored as null.
          example: $80k - $100k
        interview_available_till:
          type: string
          nullable: true
          description: >-
            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:
          type: string
          nullable: true
          description: >-
            Profile id of the recruiter owning this interview. Must be a
            merchant/merchant_owner/admin profile of the same merchant. null
            clears it.
        tags:
          type: array
          nullable: true
          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
        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
        type_credit:
          type: string
          nullable: true
          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
        coach_plan:
          type: string
          nullable: true
          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
        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
        knowledge_base_store_id:
          type: string
          nullable: true
          description: >-
            Knowledge base store id the interview draws context from; validated
            for existence. null unlinks it.
        recording:
          type: string
          nullable: true
          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
        recording_full_session:
          type: string
          nullable: true
          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
        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
        candidate_video_introduction:
          type: string
          nullable: true
          enum:
            - hidden
            - optional
            - required
          description: >-
            Whether a candidate video introduction is hidden, optional or
            required. null is treated like hidden.
        interview_conversation_speed:
          type: string
          nullable: true
          enum:
            - slower
            - normal
            - faster
          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..
          example: normal
        max_followups:
          type: integer
          nullable: true
          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
        max_duration:
          type: number
          nullable: true
          description: >-
            Live session limit in seconds. Also the basis for the credit
            multiplier.
          example: 1200
        questions_random_subset:
          type: number
          nullable: true
          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
        interview_attempts:
          type: number
          minimum: 1
          maximum: 20
          description: >-
            Allowed candidate attempts (1-20). Stored as
            result_scoring.max_retries.
          example: 1
        required_pronunciation:
          type: boolean
          nullable: true
          description: >-
            Require pronunciation assessment (restricts to pronunciation-capable
            languages).
        result_enable_edit_transcript:
          type: boolean
          nullable: true
          description: Allow editing the transcript on the result view.
        candidate_expectations:
          type: string
          nullable: true
          description: Free-text candidate expectations.
        candidate_expectations_json:
          type: object
          nullable: true
          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.
        custom_scoring:
          type: object
          nullable: true
          additionalProperties:
            nullable: true
          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.
        pdf_export_auto_config:
          type: object
          nullable: true
          properties:
            mojito_language_code:
              type: string
              description: Report language code (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.
          description: >-
            Auto-generate a candidate PDF report with these options once the
            interview completes. null disables auto-export.
        interview_type:
          type: string
          nullable: true
          enum:
            - pre-screening
            - pre-screening-with-test-questions
            - second-interview
            - remote-freelancer-verification
            - strength-based-interview
            - potential-based-interview
            - process-verification-from-knowledge-base
          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..
          example: pre-screening-with-test-questions
        interview_tone:
          type: string
          nullable: true
          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. 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:
          type: string
          nullable: true
          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
        hiring_for_company:
          type: object
          nullable: true
          properties:
            name:
              type: string
              nullable: true
              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:
              type: string
              nullable: true
              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:
              type: string
              nullable: true
              description: Primary location of the end employer.
              example: Sri Lanka
            sector:
              type: string
              nullable: true
              description: Industry / sector of the end employer.
              example: Logistics and Supply Chain
            company_size:
              type: string
              nullable: true
              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: '<company>' } plus optional
            description/location/sector/company_size. Stored in
            creation_parameters.hiring_for_company.
          example:
            name: undisclosed
      required:
        - position_id
    JobInterviewUpdateResponse:
      type: object
      properties:
        position_id:
          type: string
          description: The id that was updated.
        is_multistage:
          type: boolean
          description: >-
            True when the id resolved to a multi-stage position
            (position_def_set) rather than a single interview.
        updated_fields:
          type: array
          items:
            type: string
          description: >-
            Names of the stored columns that were written, plus `status` when
            the lifecycle status was changed.
          example:
            - name
            - tags
      required:
        - position_id
        - is_multistage
        - updated_fields
      description: Confirmation of what was updated.
    Error:
      type: object
      properties:
        error:
          type: string
          example: Field is required.
        name:
          type: string
          example: interview_result_id
      required:
        - error
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: 'Supabase JWT — `Authorization: Bearer <token>`.'

````