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

# Create an interview from an array of questions

> Creates a new interview definition set from a caller-provided array of questions, builds its default and generated steps, optionally activates it, and optionally creates an embed key.



## OpenAPI

````yaml https://cool.jobmojito.com/functions/v1/openapi post /job-interview-create-from-array
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-create-from-array:
    post:
      tags:
        - Interviews
      summary: Create an interview from an array of questions
      description: >-
        Creates a new interview definition set from a caller-provided array of
        questions, builds its default and generated steps, optionally activates
        it, and optionally creates an embed key.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/JobInterviewCreateFromArrayRequest'
      responses:
        '200':
          description: Interview created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JobInterviewCreateFromArrayResponse'
        '401':
          description: Missing, expired or invalid access token.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: >-
            Your token is not allowed to use this endpoint (it is not a
            merchant, merchant owner or admin token).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '422':
          description: Validation error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: >-
            Server error (includes unresolved template/knowledge-base/language
            ids).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - bearerAuth: []
components:
  schemas:
    JobInterviewCreateFromArrayRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          description: Interview/position name.
          example: Project manager
        location:
          type: string
          minLength: 1
          description: >-
            Job location — a city/country, or `remote`. Required and must not be
            empty: when the job description gives no location, pass `Not
            specified`.
          example: remote
        interview_template_id:
          type: string
          minLength: 1
          description: >-
            Id of the interview template to use. Must reference an existing
            interview_templates row.
          example: 46b98d37-1557-4391-beca-03037ead19f2
        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: >-
            Platform language code (one of the platform-languages.json codes);
            must also resolve to a supported language with an Azure speech
            mapping.
          example: en
        description:
          type: string
          minLength: 1
          description: Short interview description.
          example: Project manager role
        status:
          type: string
          enum:
            - draft
            - active
          description: >-
            Lifecycle status of the interview. Options — `draft`: Created but
            not published — not visible to candidates and cannot be run yet. Use
            to stage an interview before going live. | `active`: Published and
            live — candidates can run it..
          example: active
        type:
          type: string
          enum:
            - interview
            - coaching
            - assessment
          description: >-
            Product type of the interview. Options — `interview`: Standard
            candidate interview for a role — answers are AI-scored and produce a
            hiring recommendation. | `coaching`: Practice/coaching session —
            candidate-facing feedback to help them improve; not a hiring
            evaluation. Only available on the coaching portal, NOT the interview
            portal. | `assessment`: Skills/knowledge assessment — evaluates
            competencies and is scored like an interview..
          example: interview
        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
        questions:
          type: array
          items:
            $ref: '#/components/schemas/JobInterviewCreateFromArrayQuestion'
          minItems: 1
          description: Ordered list of interview questions to create as steps.
        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
        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
        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. The base `questions`
            you supply are used as-is and are NOT affected by this setting.
            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
        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
        result_view:
          type: string
          nullable: true
          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
        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
        candidate_video_introduction:
          type: string
          nullable: true
          enum:
            - optional
            - required
          description: Whether a candidate video introduction is optional or required.
        interview_tone:
          type: string
          nullable: true
          enum:
            - relaxed
            - simple
            - professional
            - persuasive
            - exact
          description: >-
            Tone — configures the AI avatar's speaking style and the follow-up
            questions it generates; the base `questions` you supply are not
            affected. 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
        interview_attempts:
          type: number
          nullable: true
          description: Allowed attempts, 1-20.
          example: 1
        questions_random_subset:
          type: number
          nullable: true
          description: Fraction of questions to randomly ask, between 0.01 and 0.9.
        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
        code:
          type: string
          nullable: true
          description: Optional external code/reference.
        cover_image_url:
          type: string
          nullable: true
          description: Cover image URL.
        interview_department:
          type: string
          nullable: true
          description: Department the position belongs to.
          example: Engineering
        interview_salary:
          type: string
          nullable: true
          description: Salary range shown for the position.
          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.
        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. Omit/null (or an object with name
            null/blank) when hiring for yourself; { name: 'undisclosed' } for an
            unnamed external client; or { name: '<company>' } plus optional
            description/location/sector/company_size for a named client. Stored
            in creation_parameters.hiring_for_company.
          example:
            name: undisclosed
        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
        required_pronunciation:
          type: boolean
          nullable: true
          description: >-
            Require pronunciation assessment (restricts to pronunciation-capable
            languages). Defaults to false.
          example: false
        result_enable_edit_transcript:
          type: boolean
          nullable: true
          description: Allow editing the transcript on the result view. Defaults to true.
          example: true
        pdf_export_auto_config:
          type: object
          nullable: true
          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.
        knowledge_base_store_id:
          type: string
          nullable: true
          description: Optional knowledge base store id; validated for existence.
        merchant_id:
          type: string
          nullable: true
          description: Target merchant id (admins / sub-merchant only).
        description_long:
          type: string
          nullable: true
          description: >-
            Long-form interview description. 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
        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: >-
            Pre-generated candidate expectations, bucketed by requirement level
            (weak/moderate/strong); auto-generated when omitted for
            type=interview. Extra keys are preserved.
        custom_scoring:
          type: object
          nullable: true
          additionalProperties:
            nullable: true
          description: Custom scoring overrides merged with defaults.
        additional_context:
          type: object
          nullable: true
          additionalProperties:
            nullable: true
          description: Extra context forwarded to expectation generation.
        instructional_video:
          type: boolean
          nullable: true
          description: Enable an instructional video before approval.
        instructional_video_custom_text:
          type: string
          nullable: true
          description: Custom text for the instructional video.
        disable_deduplication:
          type: boolean
          nullable: true
          description: When true, skip step deduplication on insert.
        welcome_message:
          type: string
          nullable: true
          description: Custom welcome message.
        thank_you_message:
          type: string
          nullable: true
          description: Custom thank-you message.
        is_embedded:
          type: boolean
          nullable: true
          description: >-
            Set true when the interview will be embedded as an iframe on an
            external page. Creates an embed key and returns
            embed_id/embed_signing_key, used to authenticate/sign the iframe
            embed.
      required:
        - name
        - location
        - interview_template_id
        - mojito_language_code
        - description
        - status
        - type
        - visibility
        - questions
    JobInterviewCreateFromArrayResponse:
      type: object
      properties:
        interview_def_set_id:
          type: string
          description: Id of the newly created interview definition set.
        embed_id:
          type: string
          description: Embed id, present only when is_embedded=true.
        embed_signing_key:
          type: string
          description: Embed signing key, present only when is_embedded=true.
      required:
        - interview_def_set_id
      description: >-
        The created interview definition set id, plus embed credentials when
        is_embedded=true.
    Error:
      type: object
      properties:
        error:
          type: string
          example: Field is required.
        name:
          type: string
          example: interview_result_id
      required:
        - error
    JobInterviewCreateFromArrayQuestion:
      type: object
      properties:
        question:
          type: string
          description: The question text shown to the candidate.
        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.
        duration:
          type: number
          nullable: true
          description: Answer duration in seconds for this question.
        mojito_language_code:
          type: string
          nullable: true
          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
        label:
          type: string
          nullable: true
          description: Optional label/tag stored on the question.
        is_conditional:
          type: boolean
          nullable: true
          description: >-
            Conditional follow-up question (view 'with listening conditional').
            Use with conditional_question_main_id.
        is_without_scoring:
          type: boolean
          nullable: true
          description: Question is asked but not scored (view 'without scoring').
        is_candidate_asking_recruiter:
          type: boolean
          nullable: true
          description: Candidate-asks-recruiter prompt (view 'candidate asking recruiter').
        is_expert:
          type: boolean
          nullable: true
          description: Expert listening question (view 'with listening expert').
        is_multiple_choice:
          type: boolean
          nullable: true
          description: Multiple-choice question (view 'multiple choice').
        question_alternatives:
          type: array
          nullable: true
          items:
            type: string
          description: Alternative phrasings for the question.
        conditional_question_main_id:
          type: string
          nullable: true
          description: >-
            For a conditional question, the id (the "id" field above) of the
            parent question in this same array that triggers it. The parent must
            appear earlier in the array than the conditional question
            referencing it.
        knowledge_base_id:
          type: string
          nullable: true
          description: Knowledge-base store id (uuid) the question draws context from.
        external_id:
          type: string
          nullable: true
          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.
        external_data:
          type: object
          nullable: true
          additionalProperties:
            nullable: true
          description: Arbitrary JSON metadata stored on the question.
        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: >-
            Per-question candidate expectations, bucketed by requirement level
            (weak/moderate/strong). Extra keys are preserved.
      required:
        - question
      additionalProperties:
        nullable: true
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: 'Supabase JWT — `Authorization: Bearer <token>`.'

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.