curl --request GET \
--url https://cool.jobmojito.com/functions/v1/job-interview-get \
--header 'Authorization: Bearer <token>'import requests
url = "https://cool.jobmojito.com/functions/v1/job-interview-get"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://cool.jobmojito.com/functions/v1/job-interview-get', 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-get",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://cool.jobmojito.com/functions/v1/job-interview-get"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://cool.jobmojito.com/functions/v1/job-interview-get")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://cool.jobmojito.com/functions/v1/job-interview-get")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"name": "<string>",
"created_at": "2026-01-15T09:30:00.000Z",
"updated_at": "2026-01-20T14:05:00.000Z",
"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": {
"weak": [
"<string>"
],
"moderate": [
"<string>"
],
"strong": [
"<string>"
]
}
}
],
"is_multistage": true,
"status": "draft",
"visibility": "public",
"stage": "Interest",
"type": "coaching",
"environment": "production",
"code": "<string>",
"interview_location": "<string>",
"cover_image_url": "<string>",
"merchant_id": "<string>",
"interview_template_id": "<string>",
"interview_template_type": "offline_elai",
"is_voice_only": true,
"knowledge_base_store_id": "<string>",
"mojito_language_code": "en",
"speech_language_code": "<string>",
"speech_language_name": "<string>",
"recording": "audio_first_5_answers",
"recording_full_session": "audio_first_5_answers",
"type_credit": "resume_check",
"result_view": "minimal",
"candidate_video_introduction": "hidden",
"description": "<string>",
"interview_description_long": "<string>",
"candidate_expectations": "<string>",
"interview_department": "Engineering",
"interview_salary": "$80k - $100k",
"interview_available_till": "<string>",
"candidate_notification_channel": "reminders",
"recruiter_profile_id": "<string>",
"slug": "<string>",
"tags": [
"interview-practice",
"sales"
],
"coach_plan": "demo",
"interview_conversation_speed": "<string>",
"max_followups": 123,
"max_duration": 123,
"questions_random_subset": 123,
"required_pronunciation": true,
"result_enable_edit_transcript": true,
"calc_definition_json": "<unknown>",
"candidate_expectations_json": "<unknown>",
"result_scoring": "<unknown>",
"creation_parameters": "<unknown>",
"pdf_export_auto_config": "<unknown>"
}{
"error": "Field is required.",
"name": "interview_result_id"
}{
"error": "Field is required.",
"name": "interview_result_id"
}{
"error": "Field is required.",
"name": "interview_result_id"
}{
"error": "Field is required.",
"name": "interview_result_id"
}Get interview definition
Retrieves the interview definition for a given interview-definition id or position id. Returns the compiled calc_definition_json, the ordered questions array (in the same format job-interview-create-from-array accepts, so it round-trips into job-interview-update) plus basic metadata. Access is subject to the caller’s row-level security.
curl --request GET \
--url https://cool.jobmojito.com/functions/v1/job-interview-get \
--header 'Authorization: Bearer <token>'import requests
url = "https://cool.jobmojito.com/functions/v1/job-interview-get"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://cool.jobmojito.com/functions/v1/job-interview-get', 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-get",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://cool.jobmojito.com/functions/v1/job-interview-get"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://cool.jobmojito.com/functions/v1/job-interview-get")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://cool.jobmojito.com/functions/v1/job-interview-get")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"name": "<string>",
"created_at": "2026-01-15T09:30:00.000Z",
"updated_at": "2026-01-20T14:05:00.000Z",
"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": {
"weak": [
"<string>"
],
"moderate": [
"<string>"
],
"strong": [
"<string>"
]
}
}
],
"is_multistage": true,
"status": "draft",
"visibility": "public",
"stage": "Interest",
"type": "coaching",
"environment": "production",
"code": "<string>",
"interview_location": "<string>",
"cover_image_url": "<string>",
"merchant_id": "<string>",
"interview_template_id": "<string>",
"interview_template_type": "offline_elai",
"is_voice_only": true,
"knowledge_base_store_id": "<string>",
"mojito_language_code": "en",
"speech_language_code": "<string>",
"speech_language_name": "<string>",
"recording": "audio_first_5_answers",
"recording_full_session": "audio_first_5_answers",
"type_credit": "resume_check",
"result_view": "minimal",
"candidate_video_introduction": "hidden",
"description": "<string>",
"interview_description_long": "<string>",
"candidate_expectations": "<string>",
"interview_department": "Engineering",
"interview_salary": "$80k - $100k",
"interview_available_till": "<string>",
"candidate_notification_channel": "reminders",
"recruiter_profile_id": "<string>",
"slug": "<string>",
"tags": [
"interview-practice",
"sales"
],
"coach_plan": "demo",
"interview_conversation_speed": "<string>",
"max_followups": 123,
"max_duration": 123,
"questions_random_subset": 123,
"required_pronunciation": true,
"result_enable_edit_transcript": true,
"calc_definition_json": "<unknown>",
"candidate_expectations_json": "<unknown>",
"result_scoring": "<unknown>",
"creation_parameters": "<unknown>",
"pdf_export_auto_config": "<unknown>"
}{
"error": "Field is required.",
"name": "interview_result_id"
}{
"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
Supabase JWT — Authorization: Bearer <token>.
Query Parameters
Identifier of either an interview definition (single-stage) or a position definition (multi-stage). The function resolves whichever matches.
1"00000000-0000-0000-0000-000000000000"
Response
The resolved interview definition.
Interview or position name.
"2026-01-15T09:30:00.000Z"
"2026-01-20T14:05:00.000Z"
The interview questions, in the order they are asked, in the same format job-interview-create-from-array accepts — so this array can be edited and sent straight back to job-interview-update, or used to create a copy of this interview. Each id is the question's real identifier: send it back unchanged and the question keeps its existing record (and with it its answer rules and any rendered avatar video). The welcome, thank-you and instructional-video steps are NOT included — they are not questions in this format, and job-interview-update leaves them untouched. Null for multi-stage positions, whose questions live on the individual interview stages.
Show child attributes
Show child attributes
True when the id resolved to a multi-stage position rather than a single interview.
Lifecycle status of the interview/position.
draft, active, archived, deleted, preparing, completed Who can see and access the interview/position.
public, merchant_public, merchant_invite, merchant_unlisted, sub_item Hiring-pipeline stage. Null for multi-stage positions.
Interest, Application submitted, Interview 1st planned, Interview 1st completed, Interview 2nd planned, Interview 2nd completed, Interview 3rd planned, Interview 3rd completed, Offer negotiations, Hired, Rejected, Offer declined, Other Interview type. Null for multi-stage positions.
coaching, interview, persona, persona_interview, public_avatar, assessment Which webhook environment this interview's results are delivered to. Null for multi-stage positions, whose stages each carry their own.
production, uat, development, demo "production"
Caller-supplied external code/reference.
Location (create field location).
Cover image URL.
Owning merchant id.
Interview template id. For multi-stage positions this is the first interview step's template.
Type of the linked interview template. interactive_elevenlabs is voice-only; the others (interactive_spatius, interactive_heygen, offline_heygen, offline_elai, offline_synthesia) are avatar-based. Null when the template could not be resolved.
offline_elai, offline_synthesia, interactive_heygen, offline_heygen, interactive_elevenlabs, interactive_spatius Convenience flag derived from interview_template_type: true when voice-only (interactive_elevenlabs), false when avatar-based, null when the template type could not be resolved.
Linked knowledge base store id. Null for multi-stage positions.
Platform (mojito) language code.
"en"
Azure speech language code. Null for multi-stage positions.
Azure speech language display name. Null for multi-stage positions.
Per-answer recording mode. Null for multi-stage positions.
audio_first_5_answers, audio_all, video_all, video_first_5_answers Full-session recording mode. Null for multi-stage positions.
audio_first_5_answers, audio_all, video_all, video_first_5_answers Credit bucket the interview draws from. Null for multi-stage positions.
resume_check, interview_coach_starter, interview_coach_contributor, interview_coach_manager, cover_letter Result view level. Null for multi-stage positions.
minimal, advanced, full, full_expand_scores, minimal_with_score, none Whether a candidate video introduction is hidden/optional/required. Null for multi-stage positions.
hidden, optional, required Short description.
Long description (create/update field description_long). Rendered as Markdown on the candidate-facing position page — formatting guide: https://developer.jobmojito.com/cookbooks/format-content-with-markdown
Free-text candidate expectations. Null for multi-stage positions.
Department the position belongs to.
"Engineering"
Salary range shown for the position.
"$80k - $100k"
ISO date/time after which the interview is no longer available to candidates. Null means always available.
SMS / WhatsApp candidate notifications: null = off, reminders = with both e-mail reminders, last_reminder = only with the final reminder, all = invitation + reminders + pre-screening accepted.
reminders, last_reminder, all Profile id of the recruiter owning this interview/position.
URL slug of the public listing, when one was generated.
Free-form tags. Also the coaching-catalogue mapping key: a catalogue directory lists this session when its tags_interview_set_filter is a subset of these tags. Null for multi-stage positions.
["interview-practice", "sales"]
Coaching-plan stage this session belongs to. Null for multi-stage positions and for sessions outside any plan.
demo, screening, 2nd, 3rd, closing, job-specific, other Conversation pace of the AI avatar (slower/normal/faster). Null keeps the template default. Null for multi-stage positions.
Maximum number of AI follow-up questions; null uses the template default. Null for multi-stage positions.
Live session limit in seconds. Null for multi-stage positions.
Fraction of the questions actually asked (0.01-0.9); null asks all of them. Null for multi-stage positions.
Whether a pronunciation assessment is required. Null for multi-stage positions.
Whether the candidate may edit the transcript on the result view. Null for multi-stage positions.
The compiled interview definition JSON (structure varies by interview type).
Structured candidate expectations JSON — the scoring rubric. Null for multi-stage positions.
Resolved result-scoring config (update field custom_scoring; its max_retries is the update field interview_attempts). Null means the platform defaults apply. Null for multi-stage positions.
The creation parameters recorded at build time (interview_type, interview_tone, interview_length, additional_context, include_rapport_question, include_closing_prompt, knowledge_base_store_id, seniority_level, hiring_for_company).
Auto-PDF-report options applied when the interview completes; null when auto-export is off. Null for multi-stage positions.