JobMojito · Schema
JobInterviewCreateRequest
Artificial IntelligenceInterviewRecruitingSoftware-as-a-ServiceHiring
Properties
| Name | Type | Description |
|---|---|---|
| name | string | Interview / position name. |
| location | string | Job location — a city/country, or `remote`. Required and must not be empty: when the job description gives no location, pass `Not specified`. |
| interview_template_id | string | Id of the interview template to base this interview on. |
| mojito_language_code | string | Platform language code used for the interview. One of the listed codes. |
| status | string | 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 an |
| type | string | Product type of the interview. Options — `interview`: Standard candidate interview for a role — answers are AI-scored as input for the reviewer's decision. | `coaching`: Practice/coaching session — ca |
| visibility | string | 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`: Invit |
| recording | stringnull | Cheating/proctoring detection mode for candidate answers — this is NOT a full session recording. Video options also record the candidate. Omit, null or `none` to disable. Options — `audio_first_5_answ |
| recording_full_session | stringnull | Full interview-session recording (includes the avatar and voice) produced as a single file. Independent of `recording`. Omit, null or `none` to disable. Options — `audio_all`: Record the whole session |
| environment | string | 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 |
| interview_type | string | Interview style — configures the AI avatar and shapes both the AI-generated questions and the follow-up questions asked during the interview. Defaults to pre-screening when omitted. Options — `pre-scr |
| seniority_level | stringnull | 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 |
| result_view | stringnull | 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 transcri |
| interview_conversation_speed | stringnull | 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 speakin |
| candidate_video_introduction | stringnull | Whether a candidate video introduction is optional or required. |
| interview_tone | stringnull | Interview tone — configures the AI avatar's speaking style and the tone of the AI-generated questions and follow-ups. Case-insensitive; omit to default to relaxed. Options — `relaxed`: Friendly and co |
| interview_length | integer | Number of questions to generate (1-40). Also capped by max_duration, which allows one question per 2 minutes: 20 min -> 10 questions, 30 min -> 15, 45 min -> 22, 60 min -> 30, 80 min -> 40. Asking for |
| interview_attempts | numbernull | Allowed candidate attempts (1-20). |
| max_duration | numbernull | Maximum interview duration in seconds. Scopes how many questions are generated (see interview_length) and is stored on the interview as the live session limit and the basis for the credit multiplier. |
| max_followups | integernull | 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). |
| questions_random_subset | numbernull | Ask only a random subset of the questions, expressed as a fraction between 0.01 and 0.9 (e.g. 0.5 = 50%). null asks all questions. |
| code | stringnull | Optional external code/reference for the interview. |
| cover_image_url | stringnull | Cover image URL. |
| 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 keeps it always available. |
| recruiter_profile_id | stringnull | Profile id of the recruiter owning this interview. A user of the company who is not read only: an owner, recruiter or admin from merchant-user-list. |
| hiring_for_company | objectnull | 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: ' |
| tags | arraynull | 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 pers |
| merchant_id | stringnull | Merchant id. Admin / sub-merchant callers only; otherwise taken from your token. |
| knowledge_base_store_id | stringnull | Knowledge base store id to source additional context from. Documents limited to chosen interviews are left out, because a new interview is on no list yet. |
| description | stringnull | Short, two-sentence job description shown to the candidate. Required with `questions`. Without `questions`, provide it to use it as-is, or leave it null/blank and it is AI-generated from the position |
| description_long | stringnull | Full job description in Markdown (Job Purpose, Responsibilities, Required & Preferred Qualifications). Provide it to use it as-is; leave it null/blank and it is AI-generated (interview and assessment |
| candidate_expectations | stringnull | Free-text candidate expectations folded into AI generation. |
| welcome_message | stringnull | Custom welcome message shown to the candidate. |
| thank_you_message | stringnull | Custom thank-you message shown after the interview. |
| microphone_test_message | stringnull | Custom microphone-test instruction for a recorded (offline avatar) interview, spoken by the avatar and shown on screen before the first question. Omitted uses the default prompt in the interview langu |
| microphone_test_no_speech_message | stringnull | Custom text shown when the microphone test hears nothing. Omitted uses the default text in the candidate's language. |
| additional_context | objectnull | Arbitrary additional context object merged into AI generation. |
| instructional_video_custom_text | stringnull | Custom narration text for the instructional video. |
| is_embedded | booleannull | Set true when the interview will be embedded as an iframe on an external page. Provisions an embed key and returns embed_id / embed_signing_key, which are used to authenticate/sign the iframe embed. W |
| include_rapport_question | booleannull | Include an opening rapport question. Defaults to false (true when questions is given). |
| include_closing_prompt | booleannull | Include a closing prompt. Defaults to true. |
| instructional_video | booleannull | Show an instructional video before approval. Defaults to false. |
| required_pronunciation | booleannull | Require pronunciation assessment (restricts to pronunciation-capable languages). Defaults to false. |
| result_enable_edit_transcript | booleannull | Allow editing the transcript on the result view. Defaults to true. |
| questions | array | OPTIONAL: your own ordered list of questions, in the format job-interview-get returns. When given, they are stored as written and nothing is generated by AI except the candidate expectations (type int |
| candidate_expectations_json | objectnull | With questions only: pre-generated candidate expectations, bucketed by requirement level (weak/moderate/strong); generated from your questions when omitted for type interview. Ignored without question |
| disable_deduplication | booleannull | With questions only: when true, every question is stored as a new record instead of reusing an identical one. Ignored without questions. |
| interview_category | stringnull | Job category shown on public listings, above the department (free text, e.g. "Ashore"). Blank is stored as null. |
| country_availability | objectnull | Which countries the interview / position is open to on the candidate portal, judged by the IP address the candidate opens it from (an unknown location only passes when countries_allowed / countries_al |
| candidate_notification_channel | stringnull | SMS / WhatsApp notifications to the candidate, sent alongside the e-mails: "reminders" = with both e-mail reminders (day 1 and day 3); "last_reminder" = only with the final day-3 reminder; "all" = inv |
| custom_scoring | objectnull | Custom result-scoring overrides merged with defaults and template overrides. |
| pdf_export_auto_config | objectnull | Auto-generate a candidate PDF report with these options once the interview completes. null disables auto-export. |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://artifacts.apis.io/jobmojito-com/json-schema/jobmojito-com-job-interview-create-request-schema.json",
"title": "JobInterviewCreateRequest",
"x-generated": "2026-11-13",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/jobmojito-com-openapi.json#/components/schemas/JobInterviewCreateRequest",
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "Interview / position name."
},
"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`."
},
"interview_template_id": {
"type": "string",
"minLength": 1,
"format": "uuid",
"description": "Id of the interview template to base this interview on."
},
"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 used for the interview. One of the listed codes."
},
"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."
},
"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 as input for the reviewer's decision. | `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."
},
"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."
},
"recording": {
"type": [
"string",
"null"
],
"enum": [
"audio_first_5_answers",
"audio_all",
"video_all",
"video_first_5_answers",
"none"
],
"description": "Cheating/proctoring detection mode for candidate answers — this is NOT a full session recording. Video options also record the candidate. Omit, null or `none` 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. | `none`: No cheating detection."
},
"recording_full_session": {
"type": [
"string",
"null"
],
"enum": [
"audio_all",
"video_all",
"none"
],
"description": "Full interview-session recording (includes the avatar and voice) produced as a single file. Independent of `recording`. Omit, null or `none` 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. | `none`: No full-session recording."
},
"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."
},
"interview_type": {
"type": "string",
"enum": [
"pre-screening",
"pre-screening-with-test-questions",
"second-interview",
"remote-freelancer-verification",
"strength-based-interview",
"potential-based-interview",
"process-verification-from-knowledge-base",
"knockout-screening"
],
"description": "Interview style — configures the AI avatar and shapes both the AI-generated questions and the follow-up questions asked during the interview. Defaults to pre-screening when omitted. 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. | `knockout-screening`: Knock-out screening — a short (about 5 minute) check of the role's must-haves with closed questions; ends early, politely, when a must-have is clearly not met. On creation it defaults custom_scoring.early_stop to true (where the avatar supports early stop) and max_followups to 1 unless you send them."
},
"seniority_level": {
"type": [
"string",
"null"
],
"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."
},
"result_view": {
"type": [
"string",
"null"
],
"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."
},
"interview_conversation_speed": {
"type": [
"string",
"null"
],
"enum": [
"slower",
"normal",
"faster",
"fluent"
],
"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. | `fluent`: Talking pace: the avatar answers 300 ms after the candidate stops speaking. A pause mid-sentence also ends their turn."
},
"candidate_video_introduction": {
"type": [
"string",
"null"
],
"enum": [
"hidden",
"optional",
"required"
],
"description": "Whether a candidate video introduction is optional or required."
},
"interview_tone": {
"type": [
"string",
"null"
],
"enum": [
"relaxed",
"simple",
"professional",
"persuasive",
"exact"
],
"description": "Interview tone — configures the AI avatar's speaking style and the tone of the AI-generated questions and follow-ups. 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 where the wording is a script."
},
"interview_length": {
"type": "integer",
"description": "Number of questions to generate (1-40). Also capped by max_duration, which allows one question per 2 minutes: 20 min -> 10 questions, 30 min -> 15, 45 min -> 22, 60 min -> 30, 80 min -> 40. Asking for more than the cap is not an error — you get the cap, and the response reports the real count in questions_generated. Omit this field to let the AI pick 5-8.",
"minimum": 1,
"maximum": 40
},
"interview_attempts": {
"type": [
"number",
"null"
],
"minimum": 1,
"maximum": 20,
"description": "Allowed candidate attempts (1-20)."
},
"max_duration": {
"type": [
"number",
"null"
],
"description": "Maximum interview duration in seconds. Scopes how many questions are generated (see interview_length) and is stored on the interview as the live session limit and the basis for the credit multiplier. Defaults to 1200 (20 minutes) when omitted."
},
"max_followups": {
"type": [
"integer",
"null"
],
"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)."
},
"questions_random_subset": {
"type": [
"number",
"null"
],
"minimum": 0.01,
"maximum": 0.9,
"description": "Ask only a random subset of the questions, expressed as a fraction between 0.01 and 0.9 (e.g. 0.5 = 50%). null asks all questions."
},
"code": {
"type": [
"string",
"null"
],
"description": "Optional external code/reference for the interview."
},
"cover_image_url": {
"type": [
"string",
"null"
],
"description": "Cover image URL."
},
"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 keeps it always available."
},
"recruiter_profile_id": {
"type": [
"string",
"null"
],
"description": "Profile id of the recruiter owning this interview. A user of the company who is not read only: an owner, recruiter or admin from merchant-user-list."
},
"hiring_for_company": {
"type": [
"object",
"null"
],
"properties": {
"name": {
"type": [
"string",
"null"
],
"description": "End-employer name. Omit/null when hiring for yourself, 'undisclosed' for an unnamed external client, or the client's company name."
},
"description": {
"type": [
"string",
"null"
],
"description": "Short description of the end employer, used as background context by the agent."
},
"location": {
"type": [
"string",
"null"
],
"description": "Primary location of the end employer."
},
"sector": {
"type": [
"string",
"null"
],
"description": "Industry / sector of the end employer."
},
"company_size": {
"type": [
"string",
"null"
],
"description": "Approximate headcount of the end employer."
}
},
"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."
},
"tags": {
"type": [
"array",
"null"
],
"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 `merchant_public` (or the platform's own `public`) are listed."
},
"merchant_id": {
"type": [
"string",
"null"
],
"description": "Merchant id. Admin / sub-merchant callers only; otherwise taken from your token."
},
"knowledge_base_store_id": {
"type": [
"string",
"null"
],
"format": "uuid",
"description": "Knowledge base store id to source additional context from. Documents limited to chosen interviews are left out, because a new interview is on no list yet."
},
"description": {
"type": [
"string",
"null"
],
"description": "Short, two-sentence job description shown to the candidate. Required with `questions`. Without `questions`, provide it to use it as-is, or leave it null/blank and it is AI-generated from the position name and any other context."
},
"description_long": {
"type": [
"string",
"null"
],
"description": "Full job description in Markdown (Job Purpose, Responsibilities, Required & Preferred Qualifications). Provide it to use it as-is; leave it null/blank and it is AI-generated (interview and assessment types only). 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",
"null"
],
"description": "Free-text candidate expectations folded into AI generation."
},
"welcome_message": {
"type": [
"string",
"null"
],
"description": "Custom welcome message shown to the candidate."
},
"thank_you_message": {
"type": [
"string",
"null"
],
"description": "Custom thank-you message shown after the interview."
},
"microphone_test_message": {
"type": [
"string",
"null"
],
"description": "Custom microphone-test instruction for a recorded (offline avatar) interview, spoken by the avatar and shown on screen before the first question. Omitted uses the default prompt in the interview language."
},
"microphone_test_no_speech_message": {
"type": [
"string",
"null"
],
"description": "Custom text shown when the microphone test hears nothing. Omitted uses the default text in the candidate's language."
},
"additional_context": {
"type": [
"object",
"null"
],
"additionalProperties": {
"nullable": true
},
"description": "Arbitrary additional context object merged into AI generation."
},
"instructional_video_custom_text": {
"type": [
"string",
"null"
],
"description": "Custom narration text for the instructional video."
},
"is_embedded": {
"type": [
"boolean",
"null"
],
"description": "Set true when the interview will be embedded as an iframe on an external page. Provisions an embed key and returns embed_id / embed_signing_key, which are used to authenticate/sign the iframe embed. Where it runs depends on the type: interviews, assessments and interview role-plays embed on the interview portal (`https://<interview portal domain>/embed?embed_id=...`); coaching sessions and coaching personas embed on the consumer (coaching) portal (`https://<coaching portal domain>/embed?embed_id=...`, a link built on the interview portal is forwarded there). A signed coaching embed (name, email, signature) signs the visitor in as a learner of that portal, and the session is charged to the merchant's interview credits on completion, not to the learner's coaching credits; it cannot start while the merchant has none."
},
"include_rapport_question": {
"type": [
"boolean",
"null"
],
"description": "Include an opening rapport question. Defaults to false (true when questions is given)."
},
"include_closing_prompt": {
"type": [
"boolean",
"null"
],
"description": "Include a closing prompt. Defaults to true."
},
"instructional_video": {
"type": [
"boolean",
"null"
],
"description": "Show an instructional video before approval. Defaults to false."
},
"required_pronunciation": {
"type": [
"boolean",
"null"
],
"description": "Require pronunciation assessment (restricts to pronunciation-capable languages). Defaults to false."
},
"result_enable_edit_transcript": {
"type": [
"boolean",
"null"
],
"description": "Allow editing the transcript on the result view. Defaults to true."
},
"questions": {
"type": "array",
"items": {
"$ref": "#/$defs/JobInterviewCreateFromArrayQuestion"
},
"minItems": 1,
"description": "OPTIONAL: your own ordered list of questions, in the format job-interview-get returns. When given, they are stored as written and nothing is generated by AI except the candidate expectations (type interview, unless candidate_expectations_json is given); in the session the avatar still says each question in the interview tone unless interview_tone is exact. With questions, description becomes required; interview_length and include_closing_prompt are ignored; include_rapport_question defaults to true; max_duration keeps its meaning here (stored, 1200 when omitted). Omit to have the AI generate the description and questions."
},
"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": "With questions only: pre-generated candidate expectations, bucketed by requirement level (weak/moderate/strong); generated from your questions when omitted for type interview. Ignored without questions."
},
"disable_deduplication": {
"type": [
"boolean",
"null"
],
"description": "With questions only: when true, every question is stored as a new record instead of reusing an identical one. Ignored without questions."
},
"interview_category": {
"type": [
"string",
"null"
],
"description": "Job category shown on public listings, above the department (free text, e.g. \"Ashore\"). Blank is stored as null."
},
"country_availability": {
"type": [
"object",
"null"
],
"properties": {
"countries_allowed": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Za-z]{2}$"
},
"description": "Available ONLY to candidates in these countries (ISO 3166-1 alpha-2)."
},
"countries_allowed_eu": {
"type": "boolean",
"description": "Adds every EU country (plus EEA and Switzerland) to countries_allowed."
},
"countries_blocked": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Za-z]{2}$"
},
"description": "NOT available to candidates in these countries (ISO 3166-1 alpha-2). Wins over the allowed side."
},
"countries_blocked_eu": {
"type": "boolean",
"description": "Adds every EU country (plus EEA and Switzerland) to countries_blocked."
}
},
"description": "Which countries the interview / position is open to on the candidate portal, judged by the IP address the candidate opens it from (an unknown location only passes when countries_allowed / countries_allowed_eu are empty). From a closed country it is left out of the portal listings, and a direct link shows \"not available in your region\". Invited candidates (personal invitation links) and candidates who already started keep access; API and MCP calls themselves are never restricted. Null = not used, every country."
},
"candidate_notification_channel": {
"type": [
"string",
"null"
],
"enum": [
"reminders",
"last_reminder",
"all"
],
"description": "SMS / WhatsApp notifications to the candidate, sent alongside the e-mails: \"reminders\" = with both e-mail reminders (day 1 and day 3); \"last_reminder\" = only with the final day-3 reminder; \"all\" = invitation, both reminders and the pre-screening-accepted step. null switches them off. WhatsApp is tried first, SMS when the number is not on WhatsApp. Available on paid plans (Starter and above) and needs a phone number on the candidate."
},
"custom_scoring": {
"type": [
"object",
"null"
],
"additionalProperties": {
"nullable": true
},
"description": "Custom result-scoring overrides merged with defaults and template overrides."
},
"pdf_export_auto_config": {
"type": [
"object",
"null"
],
"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 (one of the listed codes)."
},
"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."
}
},
"required": [
"name",
"location",
"interview_template_id",
"mojito_language_code",
"status",
"type",
"visibility"
],
"$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
# --- truncated at 32 KB (33 KB total) ---
# Full source: https://artifacts.apis.io/jobmojito-com/json-schema/jobmojito-com-job-interview-create-request-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-create-request"
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.