curl --request GET \
--url https://cool.jobmojito.com/functions/v1/job-interview-details \
--header 'Authorization: Bearer <token>'import requests
url = "https://cool.jobmojito.com/functions/v1/job-interview-details"
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-details', 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-details",
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-details"
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-details")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://cool.jobmojito.com/functions/v1/job-interview-details")
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{
"score": 123,
"score_simulation": 123,
"score_text": "<string>",
"score_sentiment": 123,
"score_words_per_minute": 123,
"score_pronunciation": 123,
"score_answer": 123,
"status": "<string>",
"start": "<string>",
"end": "<string>",
"duration": 123,
"ai_interview_coverage_percentage": 123,
"ai_completion_reason": "<string>",
"ai_analysis": "<string>",
"ai_analysis_recruiter": "<string>",
"ai_analysis_other": "<unknown>",
"ai_analysis_recruiter_why_hire": "<unknown>",
"ai_analysis_recruiter_why_not_hire": "<unknown>",
"recruiter_risks": "<unknown>",
"user_feedback_recruiter": "<string>",
"recording_local_path": "<string>",
"recording_is_video": true,
"video_introduction_local_path": "<string>",
"recording_url": "<string>",
"video_introduction_url": "<string>",
"transcript": [
{
"id": "<string>",
"is_answer": true,
"view": "<string>",
"question_original_id": "<string>",
"question_original": "<string>",
"question_asked": "<string>",
"answer": "<string>",
"ai_analysis": "<string>",
"ai_analysis_recruiter": "<string>",
"score": 123,
"score_simulation": 123,
"score_answer_ai": 123,
"score_answer_ai_simulation": 123,
"duration": 123,
"mojito_language_code": "<string>",
"answer_assessment_raw_data": "<unknown>",
"recording_local_path": "<string>",
"recording_is_video": true,
"external_data": "<unknown>",
"external_id": "<string>",
"recording_url": "<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"
}{
"error": "Field is required.",
"name": "interview_result_id"
}Get interview result details with transcript
Returns an interview result with its full transcript and AI assessment. Optionally attaches signed recording URLs.
curl --request GET \
--url https://cool.jobmojito.com/functions/v1/job-interview-details \
--header 'Authorization: Bearer <token>'import requests
url = "https://cool.jobmojito.com/functions/v1/job-interview-details"
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-details', 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-details",
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-details"
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-details")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://cool.jobmojito.com/functions/v1/job-interview-details")
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{
"score": 123,
"score_simulation": 123,
"score_text": "<string>",
"score_sentiment": 123,
"score_words_per_minute": 123,
"score_pronunciation": 123,
"score_answer": 123,
"status": "<string>",
"start": "<string>",
"end": "<string>",
"duration": 123,
"ai_interview_coverage_percentage": 123,
"ai_completion_reason": "<string>",
"ai_analysis": "<string>",
"ai_analysis_recruiter": "<string>",
"ai_analysis_other": "<unknown>",
"ai_analysis_recruiter_why_hire": "<unknown>",
"ai_analysis_recruiter_why_not_hire": "<unknown>",
"recruiter_risks": "<unknown>",
"user_feedback_recruiter": "<string>",
"recording_local_path": "<string>",
"recording_is_video": true,
"video_introduction_local_path": "<string>",
"recording_url": "<string>",
"video_introduction_url": "<string>",
"transcript": [
{
"id": "<string>",
"is_answer": true,
"view": "<string>",
"question_original_id": "<string>",
"question_original": "<string>",
"question_asked": "<string>",
"answer": "<string>",
"ai_analysis": "<string>",
"ai_analysis_recruiter": "<string>",
"score": 123,
"score_simulation": 123,
"score_answer_ai": 123,
"score_answer_ai_simulation": 123,
"duration": 123,
"mojito_language_code": "<string>",
"answer_assessment_raw_data": "<unknown>",
"recording_local_path": "<string>",
"recording_is_video": true,
"external_data": "<unknown>",
"external_id": "<string>",
"recording_url": "<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"
}{
"error": "Field is required.",
"name": "interview_result_id"
}Authorizations
Supabase JWT — Authorization: Bearer <token>.
Query Parameters
The interview result to fetch the transcript and details for.
1"93c98d21-e04d-4a84-9afa-ed154cf73636"
When true, includes short-lived signed recording URLs for the session, the video introduction, and each transcript answer.
true, false "false"
Response
The interview result and transcript.
The interview result with its transcript, produced by the interview_transcript RPC. Additional fields may be present (passthrough).
Overall interview score.
Overall simulated score.
Human-readable score summary.
Sentiment sub-score.
Speaking-pace (words per minute) sub-score.
Pronunciation sub-score.
Aggregate answer sub-score.
Coach/interview status (coach_status), e.g. started, completed.
Interview start timestamp (training_start, ISO 8601).
Interview end timestamp (training_end, ISO 8601).
Total duration in deciseconds (duration_ds).
Percentage of the intended interview the AI judged to be covered.
Why the interview completed (ai_completed_reason).
Candidate-facing AI analysis of the whole interview.
Recruiter-facing AI analysis of the whole interview.
Session-level AI analyses keyed by analysis name (jsonb). strengths_concerns: { strengths: string[], concerns: string[] } (0-4 items each, recruiter-facing; called hiring_reasons with reasons_to_hire / reasons_not_to_hire inside before 2026-09-15, and rows written before then may still carry that shape). takeaways: { what_went_well: string[], next_steps: { text, priority: impact | quick | longterm, guidance: { kind: say | structure | length | exercise | perspective, text }, proof? }[], fixed?: string[] } (coaching / persona sessions, learner-facing; proof entries are { kind: quote | ai_summary | transcript_ref | document, text, ref?: { result_question_id } }; fixed lists the steps from the previous attempt that the learner did this time). multi_department: the multi-department-selection analysis. score_rationale: the rubric bracket of the session score and evidenced counts. key_statement: { quote, result_question_id }, the one verbatim quotation a recruiter would remember the candidate by (interview / persona_interview, absent when nothing distinctive was said). Further keys may be added.
Reasons to hire (list). Deprecated: a copy of ai_analysis_other.strengths_concerns.strengths, kept for existing integrations.
Reasons not to hire (list). Deprecated: a copy of ai_analysis_other.strengths_concerns.concerns, kept for existing integrations.
Detected recruiter risk flags (jsonb).
Recruiter-entered feedback note.
Storage path of the full session recording.
Whether the session recording is video.
Storage path of the candidate video introduction.
Signed session-recording URL; present only when get_signed_recordings=true.
Signed video-introduction URL; present only when get_signed_recordings=true.
Ordered interactions (questions + answers) of the interview.
Show child attributes
Show child attributes