Skip to main content
POST
/
job-interview-create-from-array
Create an interview from an array of questions
curl --request POST \
  --url https://cool.jobmojito.com/functions/v1/job-interview-create-from-array \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "name": "Project manager",
  "location": "remote",
  "interview_template_id": "46b98d37-1557-4391-beca-03037ead19f2",
  "mojito_language_code": "en",
  "description": "Project manager role",
  "status": "active",
  "type": "interview",
  "visibility": "merchant_public",
  "questions": [
    {
      "question": "<string>",
      "id": "<string>",
      "duration": 123,
      "mojito_language_code": "en",
      "label": "<string>",
      "is_conditional": true,
      "is_without_scoring": true,
      "is_candidate_asking_recruiter": true,
      "is_expert": true,
      "is_multiple_choice": true,
      "question_alternatives": [
        "<string>"
      ],
      "conditional_question_main_id": "<string>",
      "knowledge_base_id": "<string>",
      "external_id": "<string>",
      "external_data": {},
      "candidate_expectations_json": {}
    }
  ],
  "recording": "video_all",
  "recording_full_session": "video_all",
  "interview_type": "pre-screening-with-test-questions",
  "seniority_level": "senior",
  "result_view": "full",
  "interview_tone": "professional",
  "interview_attempts": 1,
  "questions_random_subset": 123,
  "code": "<string>",
  "cover_image_url": "<string>",
  "knowledge_base_store_id": "<string>",
  "merchant_id": "<string>",
  "description_long": "<string>",
  "candidate_expectations": "<string>",
  "candidate_expectations_json": {},
  "custom_scoring": {},
  "additional_context": {},
  "instructional_video": true,
  "instructional_video_custom_text": "<string>",
  "disable_deduplication": true,
  "welcome_message": "<string>",
  "thank_you_message": "<string>",
  "is_embedded": true
}
'
import requests

url = "https://cool.jobmojito.com/functions/v1/job-interview-create-from-array"

payload = {
"name": "Project manager",
"location": "remote",
"interview_template_id": "46b98d37-1557-4391-beca-03037ead19f2",
"mojito_language_code": "en",
"description": "Project manager role",
"status": "active",
"type": "interview",
"visibility": "merchant_public",
"questions": [
{
"question": "<string>",
"id": "<string>",
"duration": 123,
"mojito_language_code": "en",
"label": "<string>",
"is_conditional": True,
"is_without_scoring": True,
"is_candidate_asking_recruiter": True,
"is_expert": True,
"is_multiple_choice": True,
"question_alternatives": ["<string>"],
"conditional_question_main_id": "<string>",
"knowledge_base_id": "<string>",
"external_id": "<string>",
"external_data": {},
"candidate_expectations_json": {}
}
],
"recording": "video_all",
"recording_full_session": "video_all",
"interview_type": "pre-screening-with-test-questions",
"seniority_level": "senior",
"result_view": "full",
"interview_tone": "professional",
"interview_attempts": 1,
"questions_random_subset": 123,
"code": "<string>",
"cover_image_url": "<string>",
"knowledge_base_store_id": "<string>",
"merchant_id": "<string>",
"description_long": "<string>",
"candidate_expectations": "<string>",
"candidate_expectations_json": {},
"custom_scoring": {},
"additional_context": {},
"instructional_video": True,
"instructional_video_custom_text": "<string>",
"disable_deduplication": True,
"welcome_message": "<string>",
"thank_you_message": "<string>",
"is_embedded": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Project manager',
location: 'remote',
interview_template_id: '46b98d37-1557-4391-beca-03037ead19f2',
mojito_language_code: 'en',
description: 'Project manager role',
status: 'active',
type: 'interview',
visibility: 'merchant_public',
questions: [
{
question: '<string>',
id: '<string>',
duration: 123,
mojito_language_code: 'en',
label: '<string>',
is_conditional: true,
is_without_scoring: true,
is_candidate_asking_recruiter: true,
is_expert: true,
is_multiple_choice: true,
question_alternatives: ['<string>'],
conditional_question_main_id: '<string>',
knowledge_base_id: '<string>',
external_id: '<string>',
external_data: {},
candidate_expectations_json: {}
}
],
recording: 'video_all',
recording_full_session: 'video_all',
interview_type: 'pre-screening-with-test-questions',
seniority_level: 'senior',
result_view: 'full',
interview_tone: 'professional',
interview_attempts: 1,
questions_random_subset: 123,
code: '<string>',
cover_image_url: '<string>',
knowledge_base_store_id: '<string>',
merchant_id: '<string>',
description_long: '<string>',
candidate_expectations: '<string>',
candidate_expectations_json: {},
custom_scoring: {},
additional_context: {},
instructional_video: true,
instructional_video_custom_text: '<string>',
disable_deduplication: true,
welcome_message: '<string>',
thank_you_message: '<string>',
is_embedded: true
})
};

fetch('https://cool.jobmojito.com/functions/v1/job-interview-create-from-array', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://cool.jobmojito.com/functions/v1/job-interview-create-from-array",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Project manager',
'location' => 'remote',
'interview_template_id' => '46b98d37-1557-4391-beca-03037ead19f2',
'mojito_language_code' => 'en',
'description' => 'Project manager role',
'status' => 'active',
'type' => 'interview',
'visibility' => 'merchant_public',
'questions' => [
[
'question' => '<string>',
'id' => '<string>',
'duration' => 123,
'mojito_language_code' => 'en',
'label' => '<string>',
'is_conditional' => true,
'is_without_scoring' => true,
'is_candidate_asking_recruiter' => true,
'is_expert' => true,
'is_multiple_choice' => true,
'question_alternatives' => [
'<string>'
],
'conditional_question_main_id' => '<string>',
'knowledge_base_id' => '<string>',
'external_id' => '<string>',
'external_data' => [

],
'candidate_expectations_json' => [

]
]
],
'recording' => 'video_all',
'recording_full_session' => 'video_all',
'interview_type' => 'pre-screening-with-test-questions',
'seniority_level' => 'senior',
'result_view' => 'full',
'interview_tone' => 'professional',
'interview_attempts' => 1,
'questions_random_subset' => 123,
'code' => '<string>',
'cover_image_url' => '<string>',
'knowledge_base_store_id' => '<string>',
'merchant_id' => '<string>',
'description_long' => '<string>',
'candidate_expectations' => '<string>',
'candidate_expectations_json' => [

],
'custom_scoring' => [

],
'additional_context' => [

],
'instructional_video' => true,
'instructional_video_custom_text' => '<string>',
'disable_deduplication' => true,
'welcome_message' => '<string>',
'thank_you_message' => '<string>',
'is_embedded' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

import (
"fmt"
"strings"
"net/http"
"io"
)

func main() {

url := "https://cool.jobmojito.com/functions/v1/job-interview-create-from-array"

payload := strings.NewReader("{\n \"name\": \"Project manager\",\n \"location\": \"remote\",\n \"interview_template_id\": \"46b98d37-1557-4391-beca-03037ead19f2\",\n \"mojito_language_code\": \"en\",\n \"description\": \"Project manager role\",\n \"status\": \"active\",\n \"type\": \"interview\",\n \"visibility\": \"merchant_public\",\n \"questions\": [\n {\n \"question\": \"<string>\",\n \"id\": \"<string>\",\n \"duration\": 123,\n \"mojito_language_code\": \"en\",\n \"label\": \"<string>\",\n \"is_conditional\": true,\n \"is_without_scoring\": true,\n \"is_candidate_asking_recruiter\": true,\n \"is_expert\": true,\n \"is_multiple_choice\": true,\n \"question_alternatives\": [\n \"<string>\"\n ],\n \"conditional_question_main_id\": \"<string>\",\n \"knowledge_base_id\": \"<string>\",\n \"external_id\": \"<string>\",\n \"external_data\": {},\n \"candidate_expectations_json\": {}\n }\n ],\n \"recording\": \"video_all\",\n \"recording_full_session\": \"video_all\",\n \"interview_type\": \"pre-screening-with-test-questions\",\n \"seniority_level\": \"senior\",\n \"result_view\": \"full\",\n \"interview_tone\": \"professional\",\n \"interview_attempts\": 1,\n \"questions_random_subset\": 123,\n \"code\": \"<string>\",\n \"cover_image_url\": \"<string>\",\n \"knowledge_base_store_id\": \"<string>\",\n \"merchant_id\": \"<string>\",\n \"description_long\": \"<string>\",\n \"candidate_expectations\": \"<string>\",\n \"candidate_expectations_json\": {},\n \"custom_scoring\": {},\n \"additional_context\": {},\n \"instructional_video\": true,\n \"instructional_video_custom_text\": \"<string>\",\n \"disable_deduplication\": true,\n \"welcome_message\": \"<string>\",\n \"thank_you_message\": \"<string>\",\n \"is_embedded\": true\n}")

req, _ := http.NewRequest("POST", url, payload)

req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.post("https://cool.jobmojito.com/functions/v1/job-interview-create-from-array")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Project manager\",\n \"location\": \"remote\",\n \"interview_template_id\": \"46b98d37-1557-4391-beca-03037ead19f2\",\n \"mojito_language_code\": \"en\",\n \"description\": \"Project manager role\",\n \"status\": \"active\",\n \"type\": \"interview\",\n \"visibility\": \"merchant_public\",\n \"questions\": [\n {\n \"question\": \"<string>\",\n \"id\": \"<string>\",\n \"duration\": 123,\n \"mojito_language_code\": \"en\",\n \"label\": \"<string>\",\n \"is_conditional\": true,\n \"is_without_scoring\": true,\n \"is_candidate_asking_recruiter\": true,\n \"is_expert\": true,\n \"is_multiple_choice\": true,\n \"question_alternatives\": [\n \"<string>\"\n ],\n \"conditional_question_main_id\": \"<string>\",\n \"knowledge_base_id\": \"<string>\",\n \"external_id\": \"<string>\",\n \"external_data\": {},\n \"candidate_expectations_json\": {}\n }\n ],\n \"recording\": \"video_all\",\n \"recording_full_session\": \"video_all\",\n \"interview_type\": \"pre-screening-with-test-questions\",\n \"seniority_level\": \"senior\",\n \"result_view\": \"full\",\n \"interview_tone\": \"professional\",\n \"interview_attempts\": 1,\n \"questions_random_subset\": 123,\n \"code\": \"<string>\",\n \"cover_image_url\": \"<string>\",\n \"knowledge_base_store_id\": \"<string>\",\n \"merchant_id\": \"<string>\",\n \"description_long\": \"<string>\",\n \"candidate_expectations\": \"<string>\",\n \"candidate_expectations_json\": {},\n \"custom_scoring\": {},\n \"additional_context\": {},\n \"instructional_video\": true,\n \"instructional_video_custom_text\": \"<string>\",\n \"disable_deduplication\": true,\n \"welcome_message\": \"<string>\",\n \"thank_you_message\": \"<string>\",\n \"is_embedded\": true\n}")
.asString();
require 'uri'
require 'net/http'

url = URI("https://cool.jobmojito.com/functions/v1/job-interview-create-from-array")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Project manager\",\n \"location\": \"remote\",\n \"interview_template_id\": \"46b98d37-1557-4391-beca-03037ead19f2\",\n \"mojito_language_code\": \"en\",\n \"description\": \"Project manager role\",\n \"status\": \"active\",\n \"type\": \"interview\",\n \"visibility\": \"merchant_public\",\n \"questions\": [\n {\n \"question\": \"<string>\",\n \"id\": \"<string>\",\n \"duration\": 123,\n \"mojito_language_code\": \"en\",\n \"label\": \"<string>\",\n \"is_conditional\": true,\n \"is_without_scoring\": true,\n \"is_candidate_asking_recruiter\": true,\n \"is_expert\": true,\n \"is_multiple_choice\": true,\n \"question_alternatives\": [\n \"<string>\"\n ],\n \"conditional_question_main_id\": \"<string>\",\n \"knowledge_base_id\": \"<string>\",\n \"external_id\": \"<string>\",\n \"external_data\": {},\n \"candidate_expectations_json\": {}\n }\n ],\n \"recording\": \"video_all\",\n \"recording_full_session\": \"video_all\",\n \"interview_type\": \"pre-screening-with-test-questions\",\n \"seniority_level\": \"senior\",\n \"result_view\": \"full\",\n \"interview_tone\": \"professional\",\n \"interview_attempts\": 1,\n \"questions_random_subset\": 123,\n \"code\": \"<string>\",\n \"cover_image_url\": \"<string>\",\n \"knowledge_base_store_id\": \"<string>\",\n \"merchant_id\": \"<string>\",\n \"description_long\": \"<string>\",\n \"candidate_expectations\": \"<string>\",\n \"candidate_expectations_json\": {},\n \"custom_scoring\": {},\n \"additional_context\": {},\n \"instructional_video\": true,\n \"instructional_video_custom_text\": \"<string>\",\n \"disable_deduplication\": true,\n \"welcome_message\": \"<string>\",\n \"thank_you_message\": \"<string>\",\n \"is_embedded\": true\n}"

response = http.request(request)
puts response.read_body
{
  "interview_def_set_id": "<string>",
  "embed_id": "<string>",
  "embed_signing_key": "<string>"
}
{
"error": "Field is required.",
"name": "interview_result_id"
}
{
"error": "Field is required.",
"name": "interview_result_id"
}
{
"error": "Field is required.",
"name": "interview_result_id"
}

Authorizations

Authorization
string
header
required

Supabase JWT — Authorization: Bearer <token>.

Body

application/json
name
string
required

Interview/position name.

Minimum string length: 1
Example:

"Project manager"

location
string
required

Interview location.

Minimum string length: 1
Example:

"remote"

interview_template_id
string
required

Id of the interview template to use. Must reference an existing interview_templates row.

Minimum string length: 1
Example:

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

mojito_language_code
enum<string>
required

Platform language code (one of the platform-languages.json codes); must also resolve to a supported language with an Azure speech mapping.

Available options:
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
Example:

"en"

description
string
required

Short interview description.

Minimum string length: 1
Example:

"Project manager role"

status
enum<string>
required

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

Available options:
draft,
active
Example:

"active"

type
enum<string>
required

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

Available options:
interview,
coaching,
assessment
Example:

"interview"

visibility
enum<string>
required

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"

questions
object[]
required

Ordered list of interview questions to create as steps.

Minimum array length: 1
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"

interview_type
enum<string> | null

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

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"

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"

result_view
enum<string> | null

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 optional or required.

Available options:
optional,
required
interview_tone
string | null

Tone — configures the AI avatar's speaking style and the follow-up questions it generates; the base questions you supply are not affected. Omit to default to relaxed. 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"

interview_attempts
number | null

Allowed attempts, 1-20.

Example:

1

questions_random_subset
number | null

Fraction of questions to randomly ask, between 0.01 and 0.9.

code
string | null

Optional external code/reference.

cover_image_url
string | null

Cover image URL.

knowledge_base_store_id
string | null

Optional knowledge base store id; validated for existence.

merchant_id
string | null

Target merchant id (admins / sub-merchant only).

description_long
string | null

Long-form interview description.

candidate_expectations
string | null

Free-text candidate expectations.

candidate_expectations_json
object | null

Pre-generated candidate expectations object; auto-generated when omitted for type=interview.

custom_scoring
object | null

Custom scoring overrides merged with defaults.

additional_context
object | null

Extra context forwarded to expectation generation.

instructional_video
boolean | null

Enable an instructional video before approval.

instructional_video_custom_text
string | null

Custom text for the instructional video.

disable_deduplication
boolean | null

When true, skip step deduplication on insert.

welcome_message
string | null

Custom welcome message.

thank_you_message
string | null

Custom thank-you message.

is_embedded
boolean | null

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.

Response

Interview created.

The created interview definition set id, plus embed credentials when is_embedded=true.

interview_def_set_id
string
required

Id of the newly created interview definition set.

embed_id
string

Embed id, present only when is_embedded=true.

embed_signing_key
string

Embed signing key, present only when is_embedded=true.