JobMojito · Schema
JobInterviewGetResponse
Artificial IntelligenceInterviewRecruitingSoftware-as-a-ServiceHiring
Properties
| Name | Type | Description |
|---|---|---|
| name | stringnull | Interview or position name. |
| created_at | stringnull | |
| updated_at | stringnull | |
| calc_definition_json | object | The compiled interview definition JSON (structure varies by interview type). |
| questions | arraynull | 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 t |
| is_multistage | boolean | True when the id resolved to a multi-stage position rather than a single interview. |
| status | string | Publication status of the interview/position. The vacancy lifecycle of a position (open, on hold, filled...) is `lifecycle` (include=lifecycle). |
| visibility | string | Who can see and access the interview/position. |
| stage | stringnull | Hiring-pipeline stage. Null for multi-stage positions. |
| type | stringnull | Interview type. Null for multi-stage positions. |
| environment | stringnull | Which webhook environment this interview's results are delivered to. Null for multi-stage positions, whose stages each carry their own. |
| code | stringnull | Caller-supplied external code/reference. |
| interview_location | stringnull | Location (create field `location`). |
| cover_image_url | stringnull | Cover image URL. |
| merchant_id | stringnull | Owning merchant id. |
| interview_template_id | stringnull | Interview template id. For multi-stage positions this is the first interview step's template. |
| interview_template_type | stringnull | Type of the linked interview template. `interactive_elevenlabs` is voice-only; the others (`interactive_spatius`, `interactive_heygen`, `offline_heygen`, `offline_elai`, `offline_synthesia`) are avata |
| is_voice_only | booleannull | 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. |
| knowledge_base_store_id | stringnull | Linked knowledge base store id. Null for multi-stage positions. |
| mojito_language_code | stringnull | Platform (mojito) language code. |
| speech_language_code | stringnull | Azure speech language code. Null for multi-stage positions. |
| speech_language_name | stringnull | Azure speech language display name. Null for multi-stage positions. |
| recording | stringnull | Per-answer recording mode. Null for multi-stage positions. |
| recording_full_session | stringnull | Full-session recording mode. Null for multi-stage positions. |
| type_credit | stringnull | Credit bucket the interview draws from. Null for multi-stage positions. |
| result_view | stringnull | Result view level. Null for multi-stage positions. |
| candidate_video_introduction | stringnull | Whether a candidate video introduction is hidden/optional/required. Null for multi-stage positions. |
| description | stringnull | Short description. |
| interview_description_long | stringnull | 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- |
| candidate_expectations | stringnull | Free-text candidate expectations. Null for multi-stage positions. |
| candidate_expectations_json | object | Structured candidate expectations JSON — the scoring rubric. Null for multi-stage positions. |
| result_scoring | object | 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. |
| creation_parameters | object | 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, seniori |
| interview_department | stringnull | Department the position belongs to. |
| interview_salary | stringnull | Salary range shown for the position. |
| interview_available_till | stringnull | ISO date/time after which the interview is no longer available to candidates. Null means always available. |
| candidate_notification_channel | stringnull | 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. |
| country_availability | object | Portal availability by the candidate's country: {countries_allowed?: string[], countries_allowed_eu?: boolean, countries_blocked?: string[], countries_blocked_eu?: boolean} (ISO 3166-1 alpha-2, EU = E |
| recruiter_profile_id | stringnull | Profile id of the recruiter owning this interview/position. |
| slug | stringnull | URL slug of the public listing, when one was generated. |
| tags | arraynull | Free-form tags (interview_def_set.tags, or position_def_set.tags for a multi-stage position). Also the coaching-catalogue mapping key: a catalogue directory lists this session when its `tags_interview |
| coach_plan | stringnull | Coaching-plan stage this session belongs to. Null for multi-stage positions and for sessions outside any plan. |
| interview_conversation_speed | stringnull | Conversation pace of the AI avatar (slower/normal/faster/fluent). Null keeps the template default. Null for multi-stage positions. |
| max_followups | numbernull | Maximum number of AI follow-up questions; null uses the template default. Null for multi-stage positions. |
| max_duration | numbernull | Live session limit in seconds. Null for multi-stage positions. |
| questions_random_subset | numbernull | Fraction of the questions actually asked (0.01-0.9); null asks all of them. Null for multi-stage positions. |
| required_pronunciation | booleannull | Whether a pronunciation assessment is required. Null for multi-stage positions. |
| result_enable_edit_transcript | booleannull | Whether the candidate may edit the transcript on the result view. Null for multi-stage positions. |
| pdf_export_auto_config | object | Auto-PDF-report options applied when the interview completes; null when auto-export is off. Null for multi-stage positions. |
| interview_category | stringnull | Job category shown on public listings above the department (free text), e.g. "Ashore". |
| emoji | stringnull | Emoji marker used in the admin lists. |
| reminder_schedule | object | Candidate reminder schedule override (JSON); null uses the company default. |
| is_ats | boolean | True when the definition is linked to a job in a connected ATS (Kombo). |
| collect_resume_cover_letter | stringnull | Whether a resume / cover letter is asked for: hidden, optional or required. Null for multi-stage positions. |
| allow_human_interview | booleannull | A recruiter may hold the interview instead of the AI. Null for multi-stage positions (each interview step carries its own, see include=process). |
| target_days_to_fill | numbernull | Target days to fill the position. Null for single-stage interviews. |
| access_scope | stringnull | Position access: company (every recruiter) or confidential (its team and owners only). Null for single-stage interviews. |
| process | object | |
| team | object | |
| lifecycle | object | |
| openings | object | |
| publishing | object | |
| custom_fields | object | Company-defined fields (key: value) of a multi-stage position, when custom fields are enabled for the company (multi-stage positions only: absent for an interview). Keys are the field keys of the comp |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://artifacts.apis.io/jobmojito-com/json-schema/jobmojito-com-job-interview-get-response-schema.json",
"title": "JobInterviewGetResponse",
"x-generated": "2026-11-13",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/jobmojito-com-openapi.json#/components/schemas/JobInterviewGetResponse",
"type": "object",
"properties": {
"name": {
"type": [
"string",
"null"
],
"description": "Interview or position name."
},
"created_at": {
"type": [
"string",
"null"
]
},
"updated_at": {
"type": [
"string",
"null"
]
},
"calc_definition_json": {
"nullable": true,
"description": "The compiled interview definition JSON (structure varies by interview type)."
},
"questions": {
"type": [
"array",
"null"
],
"items": {
"$ref": "#/$defs/JobInterviewCreateFromArrayQuestion"
},
"description": "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."
},
"is_multistage": {
"type": "boolean",
"description": "True when the id resolved to a multi-stage position rather than a single interview."
},
"status": {
"type": "string",
"enum": [
"draft",
"active",
"archived",
"deleted",
"preparing",
"completed"
],
"description": "Publication status of the interview/position. The vacancy lifecycle of a position (open, on hold, filled...) is `lifecycle` (include=lifecycle)."
},
"visibility": {
"type": "string",
"enum": [
"public",
"merchant_public",
"merchant_invite",
"merchant_unlisted",
"sub_item"
],
"description": "Who can see and access the interview/position."
},
"stage": {
"type": [
"string",
"null"
],
"enum": [
"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"
],
"description": "Hiring-pipeline stage. Null for multi-stage positions."
},
"type": {
"type": [
"string",
"null"
],
"enum": [
"coaching",
"interview",
"persona",
"persona_interview",
"public_avatar",
"assessment"
],
"description": "Interview type. Null for multi-stage positions."
},
"environment": {
"type": [
"string",
"null"
],
"enum": [
"production",
"uat",
"development",
"demo"
],
"description": "Which webhook environment this interview's results are delivered to. Null for multi-stage positions, whose stages each carry their own."
},
"code": {
"type": [
"string",
"null"
],
"description": "Caller-supplied external code/reference."
},
"interview_location": {
"type": [
"string",
"null"
],
"description": "Location (create field `location`)."
},
"cover_image_url": {
"type": [
"string",
"null"
],
"description": "Cover image URL."
},
"merchant_id": {
"type": [
"string",
"null"
],
"description": "Owning merchant id."
},
"interview_template_id": {
"type": [
"string",
"null"
],
"description": "Interview template id. For multi-stage positions this is the first interview step's template."
},
"interview_template_type": {
"type": [
"string",
"null"
],
"enum": [
"offline_elai",
"offline_synthesia",
"interactive_heygen",
"offline_heygen",
"interactive_elevenlabs",
"interactive_spatius"
],
"description": "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."
},
"is_voice_only": {
"type": [
"boolean",
"null"
],
"description": "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."
},
"knowledge_base_store_id": {
"type": [
"string",
"null"
],
"description": "Linked knowledge base store id. Null for multi-stage positions."
},
"mojito_language_code": {
"type": [
"string",
"null"
],
"description": "Platform (mojito) language code."
},
"speech_language_code": {
"type": [
"string",
"null"
],
"description": "Azure speech language code. Null for multi-stage positions."
},
"speech_language_name": {
"type": [
"string",
"null"
],
"description": "Azure speech language display name. Null for multi-stage positions."
},
"recording": {
"type": [
"string",
"null"
],
"enum": [
"audio_first_5_answers",
"audio_all",
"video_all",
"video_first_5_answers"
],
"description": "Per-answer recording mode. Null for multi-stage positions."
},
"recording_full_session": {
"type": [
"string",
"null"
],
"enum": [
"audio_first_5_answers",
"audio_all",
"video_all",
"video_first_5_answers"
],
"description": "Full-session recording mode. Null for multi-stage positions."
},
"type_credit": {
"type": [
"string",
"null"
],
"enum": [
"resume_check",
"interview_coach_starter",
"interview_coach_contributor",
"interview_coach_manager",
"cover_letter"
],
"description": "Credit bucket the interview draws from. Null for multi-stage positions."
},
"result_view": {
"type": [
"string",
"null"
],
"enum": [
"minimal",
"advanced",
"full",
"full_expand_scores",
"minimal_with_score",
"none"
],
"description": "Result view level. Null for multi-stage positions."
},
"candidate_video_introduction": {
"type": [
"string",
"null"
],
"enum": [
"hidden",
"optional",
"required"
],
"description": "Whether a candidate video introduction is hidden/optional/required. Null for multi-stage positions."
},
"description": {
"type": [
"string",
"null"
],
"description": "Short description."
},
"interview_description_long": {
"type": [
"string",
"null"
],
"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"
},
"candidate_expectations": {
"type": [
"string",
"null"
],
"description": "Free-text candidate expectations. Null for multi-stage positions."
},
"candidate_expectations_json": {
"nullable": true,
"description": "Structured candidate expectations JSON — the scoring rubric. Null for multi-stage positions."
},
"result_scoring": {
"nullable": true,
"description": "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."
},
"creation_parameters": {
"nullable": true,
"description": "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)."
},
"interview_department": {
"type": [
"string",
"null"
],
"description": "Department the position belongs to."
},
"interview_salary": {
"type": [
"string",
"null"
],
"description": "Salary range shown for the position."
},
"interview_available_till": {
"type": [
"string",
"null"
],
"description": "ISO date/time after which the interview is no longer available to candidates. Null means always available."
},
"candidate_notification_channel": {
"type": [
"string",
"null"
],
"enum": [
"reminders",
"last_reminder",
"all"
],
"description": "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."
},
"country_availability": {
"nullable": true,
"description": "Portal availability by the candidate's country: {countries_allowed?: string[], countries_allowed_eu?: boolean, countries_blocked?: string[], countries_blocked_eu?: boolean} (ISO 3166-1 alpha-2, EU = EU + EEA + Switzerland; blocked wins), judged by the candidate's IP on the portal; invited candidates keep access. Null = not used, every country. Set it with job-interview-update."
},
"recruiter_profile_id": {
"type": [
"string",
"null"
],
"description": "Profile id of the recruiter owning this interview/position."
},
"slug": {
"type": [
"string",
"null"
],
"description": "URL slug of the public listing, when one was generated."
},
"tags": {
"type": [
"array",
"null"
],
"items": {
"type": "string"
},
"description": "Free-form tags (interview_def_set.tags, or position_def_set.tags for a multi-stage position). 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 when none are set."
},
"coach_plan": {
"type": [
"string",
"null"
],
"enum": [
"demo",
"screening",
"2nd",
"3rd",
"closing",
"job-specific",
"other"
],
"description": "Coaching-plan stage this session belongs to. Null for multi-stage positions and for sessions outside any plan."
},
"interview_conversation_speed": {
"type": [
"string",
"null"
],
"description": "Conversation pace of the AI avatar (slower/normal/faster/fluent). Null keeps the template default. Null for multi-stage positions."
},
"max_followups": {
"type": [
"number",
"null"
],
"description": "Maximum number of AI follow-up questions; null uses the template default. Null for multi-stage positions."
},
"max_duration": {
"type": [
"number",
"null"
],
"description": "Live session limit in seconds. Null for multi-stage positions."
},
"questions_random_subset": {
"type": [
"number",
"null"
],
"description": "Fraction of the questions actually asked (0.01-0.9); null asks all of them. Null for multi-stage positions."
},
"required_pronunciation": {
"type": [
"boolean",
"null"
],
"description": "Whether a pronunciation assessment is required. Null for multi-stage positions."
},
"result_enable_edit_transcript": {
"type": [
"boolean",
"null"
],
"description": "Whether the candidate may edit the transcript on the result view. Null for multi-stage positions."
},
"pdf_export_auto_config": {
"nullable": true,
"description": "Auto-PDF-report options applied when the interview completes; null when auto-export is off. Null for multi-stage positions."
},
"interview_category": {
"type": [
"string",
"null"
],
"description": "Job category shown on public listings above the department (free text), e.g. \"Ashore\"."
},
"emoji": {
"type": [
"string",
"null"
],
"description": "Emoji marker used in the admin lists."
},
"reminder_schedule": {
"nullable": true,
"description": "Candidate reminder schedule override (JSON); null uses the company default."
},
"is_ats": {
"type": "boolean",
"description": "True when the definition is linked to a job in a connected ATS (Kombo)."
},
"collect_resume_cover_letter": {
"type": [
"string",
"null"
],
"enum": [
"hidden",
"optional",
"required"
],
"description": "Whether a resume / cover letter is asked for: hidden, optional or required. Null for multi-stage positions."
},
"allow_human_interview": {
"type": [
"boolean",
"null"
],
"description": "A recruiter may hold the interview instead of the AI. Null for multi-stage positions (each interview step carries its own, see include=process)."
},
"target_days_to_fill": {
"type": [
"number",
"null"
],
"description": "Target days to fill the position. Null for single-stage interviews."
},
"access_scope": {
"type": [
"string",
"null"
],
"enum": [
"company",
"confidential"
],
"description": "Position access: company (every recruiter) or confidential (its team and owners only). Null for single-stage interviews."
},
"process": {
"$ref": "#/$defs/PositionProcess"
},
"team": {
"$ref": "#/$defs/PositionTeam"
},
"lifecycle": {
"$ref": "#/$defs/PositionLifecycle"
},
"openings": {
"$ref": "#/$defs/PositionOpenings"
},
"publishing": {
"$ref": "#/$defs/PositionPublishing"
},
"custom_fields": {
"type": "object",
"additionalProperties": {
"nullable": true
},
"description": "Company-defined fields (key: value) of a multi-stage position, when custom fields are enabled for the company (multi-stage positions only: absent for an interview). Keys are the field keys of the company's custom field definitions; values are text, numbers, YYYY-MM-DD dates, option values (a list for multiple choice), {min, max, currency} ranges or user profile ids."
}
},
"required": [
"name",
"created_at",
"updated_at",
"questions",
"is_multistage",
"status",
"visibility",
"stage",
"type",
"environment",
"code",
"interview_location",
"cover_image_url",
"merchant_id",
"interview_template_id",
"interview_template_type",
"is_voice_only",
"knowledge_base_store_id",
"mojito_language_code",
"speech_language_code",
"speech_language_name",
"recording",
"recording_full_session",
"type_credit",
"result_view",
"candidate_video_introduction",
"description",
"interview_description_long",
"candidate_expectations",
"interview_department",
"interview_salary",
"interview_available_till",
"candidate_notification_channel",
"recruiter_profile_id",
"slug",
"tags",
"coach_plan",
"interview_conversation_speed",
"max_followups",
"max_duration",
"questions_random_subset",
"required_pronunciation",
"result_enable_edit_transcript",
"interview_category",
"emoji",
"is_ats",
"collect_resume_cover_letter",
"allow_human_interview",
"target_days_to_fill",
"access_scope"
],
"$defs": {
"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",
"null"
],
"description": "Answer duration in seconds for this question."
},
"mojito_language_code": {
"type": [
"string",
"null"
],
"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 listed codes). Inherits the interview language when omitted."
},
"label": {
"type": [
"string",
"null"
],
"description": "Optional label/tag stored on the question."
},
"is_conditional": {
"type": [
"boolean",
"null"
],
"description": "A yes/no question that decides which follow-ups are asked (view 'with listening conditional'). Its follow-ups point at it with conditional_question_main_id."
},
"is_without_scoring": {
"type": [
"boolean",
"null"
],
"description": "Question is asked but not scored (view 'without scoring')."
},
"is_candidate_asking_recruiter": {
"type": [
"boolean",
"null"
],
"description": "Candidate-asks-recruiter prompt (view 'candidate asking recruiter')."
},
"is_expert": {
"type": [
"boolean",
"null"
],
"description": "Expert listening question (view 'with listening expert')."
},
"is_multiple_choice": {
"type": [
"boolean",
"null"
],
"description": "Multiple-choice question (view 'multiple choice')."
},
"question_alternatives": {
"type": [
"array",
"null"
],
"items": {
"type": "string"
},
"description": "Alternative phrasings for the question."
},
"conditional_question_main_id": {
"type": [
"string",
"null"
],
"description": "For a follow-up question, the id (the \"id\" field above) of the yes/no question (is_conditional) in this same array that decides whether it is asked. The yes/no question must appear earlier in the array. Use conditional_question_answer to choose the answer that shows it."
},
"conditional_question_answer": {
"type": [
"boolean",
"null"
],
"description": "With conditional_question_main_id: the answer to the yes/no question that shows this follow-up. `true` (the default) asks it after a yes, `false` after a no, so each answer can lead to its own follow-ups. Ignored on a question without conditional_question_main_id."
},
"is_skippable": {
"type": [
"boolean",
"null"
],
"description": "The candidate may skip this question: the recorded (offline avatar) interview shows a Skip button on it, and a skipped question is saved without an answer. Defaults to false."
},
"knowledge_base_id": {
"type": [
"string",
"null"
],
"description": "Knowledge-base store id (uuid) the question draws context from."
},
"external_id": {
"type": [
"string",
"null"
],
"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",
"null"
],
"additionalProperties": {
"nullable": true
},
"description": "Arbitrary JSON metadata stored on the question."
},
"candidate_expectations_json": {
"type": [
"object",
"null"
],
"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
}
},
"PositionLifecycle": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"draft",
"pending_approval",
"open",
"applications_closed",
"on_hold",
"filled",
"cancelled",
"closed"
],
"description": "Vacancy lifecycle. Without a stored lifecycle it follows the publication status: draft/preparing = draft, active = open, archived/completed = closed."
},
"reason": {
"type": [
"string",
"null"
],
"description": "Label of the reason picked for the last change (position status reasons)."
},
"note": {
"type": [
"string",
"null"
],
"description": "Note given with the last change."
},
"changed_at": {
"type": [
"string",
"null"
],
"description": "When the lifecycle last changed (ISO 8601)."
}
},
"required": [
"status",
"reason",
"note",
"changed_at"
],
"description": "include=lifecycle (multi-stage positions, the position_lifecycle feature): the vacancy lifecycle."
},
"PositionMeetingSlot": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Slot id (position_meeting_slot.id)."
},
"start_at": {
"type": "string",
"description": "Start (ISO 8601)."
},
"duration_minutes": {
"type": "number",
"description": "Length in minutes."
},
"capacity": {
"type": "number",
"description": "How many candidates can book it."
},
"booked": {
"type": "number",
"description": "Active bookings (booking_status booked)."
},
"location": {
"type": [
"string",
"null"
],
"description": "Place of an in-person meeting."
},
"meeting_url": {
"type": [
"string",
"null"
],
"description": "Video call link."
},
"interviewer_profile_id": {
"type": [
"string",
"null"
],
"description": "Interviewer (profile.id)."
},
"panel": {
"type": "array",
"items": {
"type": "object",
"properties": {
"profile_id": {
"type": "string",
"description": "Panel member (profile.id)."
},
"role": {
"type": "string",
"enum": [
"lead",
"member"
],
"description": "Panel role: lead or member."
}
},
"required": [
"profile_id",
"role"
]
},
"description": "Panel interviewers of the slot (position_meeting_slot_interviewer); empty when none."
}
},
"required": [
"id",
"start_at",
"duration_minutes",
"capacity",
"booked",
"location",
"meeting_url",
"interviewer_profile_id",
"panel"
]
},
"PositionOpenings": {
"type": "object",
"properties": {
"openings_total": {
"type": [
"number",
"null"
],
"description": "Openings to fill; null = not set."
},
"filled": {
"type": "number",
"description": "Openings filled (hired)."
},
"remaining": {
"type": [
"number",
"null"
],
"description": "Openings still to fill; null when openings_total is not set."
},
"auto_close": {
"type": "boolean",
"description": "The position closes by itself once every opening is filled."
}
},
"required": [
"openings_total",
"filled",
"remaining",
"auto_close"
],
"description": "include=lifecycle (multi-stage positions, the position_bulk_create feature): openings and how many are filled."
},
"PositionProcess": {
"type": "object",
"properties": {
"structure_editable": {
"type": "boolean",
"description": "True while the position is a draft: only then can steps be added, removed or reordered. Step settings can be changed at any time."
},
"steps": {
"type": "array",
"items": {
"$ref": "#/$defs/PositionProcessStep"
},
"description": "The live steps, in order (deleted steps left out). Empty for a hiring manager account, which cannot read steps."
}
},
"required": [
"structure_editable",
"steps"
],
"description": "include=process (multi-stage positions): the ordered steps with typed settings."
},
"PositionProcessStep": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"description": "The step (position_def_step.id)."
},
"type": {
"type": "string",
"enum": [
"pre-screening",
"interview",
"invited",
"meeting",
"external_assessment",
"certo_verification"
],
"description": "Step type: pre-screening, interview (AI interview), meeting, external_assessment, certo_verification, or the legacy invited."
},
"name": {
"type": [
"string",
"null"
],
"description": "The name recruiters gave the step; null = the type's default label."
},
"position_id": {
"type": "string",
"format": "uuid",
"description": "The position (position_def_set.id)."
},
"sequence_no": {
"type": "number",
"description": "Place in the process, 1 = first."
},
"updated_at": {
"type": "string",
"description": "Version of the step (its last change, else when it was made). Send it back as expected_updated_at to merchant-position-step-update so a concurrent change is refused instead of overwritten."
},
"interview_set_id": {
"type": "string",
"format": "uuid",
"description": "AI interview steps: the interview (interview_def_set.id); its questions are changed with update_interview."
},
"interview_pre_screening_id": {
"type": "string",
"format": "uuid",
"description": "Pre-screening steps: interview_def_pre_screening.id."
},
"advance": {
"type": "string",
"enum": [
"auto",
"manual"
],
"description": "auto or manual (see the request field)."
},
"kombo": {
"$ref": "#/$defs/PositionStepKombo"
},
"meeting": {
"$ref": "#/$defs/PositionStepMeeting"
},
"certo": {
"type": "object",
"properties": {
"wait_for_identity": {
"type": "boolean",
"description": "See the request field."
},
"include_contact": {
"type": "boolean",
"description": "See the request field."
},
"scope_types": {
"type": [
"array",
"null"
],
"items": {
"type": "string",
"enum": [
"employment",
"education",
"certification",
"role",
"language",
"right_to_work"
]
},
"description": "null = everything."
}
},
"required": [
"wait_for_identity",
"include_contact",
"scope_types"
],
"description": "certo_verification steps."
},
"external_assessment": {
"$ref": "#/$defs/PositionStepExternalAssessment"
},
"interview": {
"$ref": "#/$defs/PositionStepInterview"
},
"pre_screening": {
"$ref": "#/$defs/PositionStepPreScreening"
},
"status": {
"type": "string",
"enum": [
"draft",
"active",
"archived",
"deleted",
"preparing",
"completed"
],
"description": "Publication status of the step."
},
"candidates_on_step": {
"type": [
"number",
"null"
],
"description": "Candidates in progress on the step (waiting for the candidate or a recruiter, shortlisted, processing, scheduled), test runs left out. Null when your account may not read the position's candidates."
},
"slots": {
"type": "array",
"items": {
"$ref": "#/$defs/PositionMeetingSlot"
# --- truncated at 32 KB (49 KB total) ---
# Full source: https://artifacts.apis.io/jobmojito-com/json-schema/jobmojito-com-job-interview-get-response-schema.json
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/jobmojito-com-job-interview-get-response"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.