JobMojito · Schema
PersonaCreateRequest
Artificial IntelligenceInterviewRecruitingSoftware-as-a-ServiceHiring
Properties
| Name | Type | Description |
|---|---|---|
| name | string | Persona / session name. |
| interview_template_id | string | Id of the interview template (avatar) the persona uses. |
| mojito_language_code | string | Platform language code used for the conversation. 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 |
| 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 |
| description | stringnull | Short persona description shown to the candidate on the pre-session poster. Candidate-visible — keep it to max 2 sentences. Unlike job-interview-create, personas run no AI generation, so this is never |
| persona_role_avatar | string | The role the AI avatar plays. Candidate-visible — shown on the pre-session poster as 'Role of the agent', so write it as candidate-facing setup and keep it to max 2 sentences. Example: 'is to act as a |
| persona_role_user | string | The role the candidate (mentee) plays. Candidate-visible — shown on the pre-session poster as 'Your role', so write it as candidate-facing setup and keep it to max 2 sentences. Example: 'is to be a sa |
| persona_avatar_who_is | stringnull | Who the avatar represents: name, role, context, personality, woven with what drives them underneath (motive, fear, what they refuse until heard, what they do not know until told). One continuous descr |
| persona_avatar_knowledge | stringnull | Private facts the avatar can use (numbers, dates, names, objections), plus any personal details shareable only after progress and only if natural — timing written inline, not as labelled subsections. |
| persona_avatar_end_conditions | stringnull | When the avatar should end the session. Prefer referring to persona_avatar_progress: wrap up when progress is complete (turning point unlocked and a plan accepted, or steps "Done when" reached), or wh |
| persona_avatar_progress | stringnull | How the conversation moves forward — one plain-text value starting with `Mode: turning point` (resistance) or `Mode: steps` (difficult conversation protocol), then the labelled lines for that mode (In |
| opening_line | stringnull | The avatar's opening line — the FIRST thing it says out loud when the session starts, before the candidate has said anything. This is a literal spoken line, NOT a description: write the exact words th |
| candidate_expectations | stringnull | Mentee assessment goals — free-text describing what the candidate is expected to achieve (max 2100 chars). |
| 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 |
| 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. |
| max_duration | numbernull | Maximum conversation duration in seconds. Defaults to 1200 (20 min) when omitted. |
| code | stringnull | Optional external code/reference for the persona. |
| cover_image_url | stringnull | Cover image URL. |
| interview_location | stringnull | Optional location label shown for the session. |
| merchant_id | stringnull | Merchant id. Admin / sub-merchant callers only; otherwise taken from your token. |
| recruiter_profile_id | stringnull | Profile id of the recruiter owning this persona. A user of the company who is not read only: an owner, recruiter or admin from merchant-user-list. |
| welcome_message | stringnull | Custom welcome message spoken to the candidate before the role-play starts — set it; omitting it leaves a generic platform default. This is the scene-setting message; the avatar's first in-character l |
| thank_you_message | stringnull | Custom thank-you message shown after the session — set it; omitting it leaves a generic platform default. |
| tags | arraynull | Free-form tags stored on the persona. Tags are also the coaching-catalogue mapping key: a catalogue directory (see the catalogue-tag-create / catalogue-tag-update endpoints) lists a coaching or person |
| portal | stringnull | REQUIRED IN PRACTICE — pick deliberately; the default is the coaching product, not the recruiting one. `interview`: an interview role-play. Choose this for ANY recruiting or assessment use case (scree |
| interview_attempts | numbernull | Allowed candidate attempts (1-20), defaulting to 3. Only meaningful when `portal` is `interview`; coaching personas are unlimited. A recruiter can still grant an extra attempt afterwards. |
| is_embedded | booleannull | Set true when the persona will be embedded as an iframe on an external page. Provisions an embed key and returns embed_id / embed_signing_key, used to sign the iframe link. Where it runs depends on th |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://artifacts.apis.io/jobmojito-com/json-schema/jobmojito-com-persona-create-request-schema.json",
"title": "PersonaCreateRequest",
"x-generated": "2026-11-13",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/jobmojito-com-openapi.json#/components/schemas/PersonaCreateRequest",
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "Persona / session name."
},
"interview_template_id": {
"type": "string",
"minLength": 1,
"format": "uuid",
"description": "Id of the interview template (avatar) the persona uses."
},
"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 conversation. 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."
},
"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."
},
"description": {
"type": [
"string",
"null"
],
"description": "Short persona description shown to the candidate on the pre-session poster. Candidate-visible — keep it to max 2 sentences. Unlike job-interview-create, personas run no AI generation, so this is never auto-generated: leave it null/blank and the poster simply shows no description; set it to frame the scene."
},
"persona_role_avatar": {
"type": "string",
"minLength": 1,
"description": "The role the AI avatar plays. Candidate-visible — shown on the pre-session poster as 'Role of the agent', so write it as candidate-facing setup and keep it to max 2 sentences. Example: 'is to act as a happy customer responding to questions'."
},
"persona_role_user": {
"type": "string",
"minLength": 1,
"description": "The role the candidate (mentee) plays. Candidate-visible — shown on the pre-session poster as 'Your role', so write it as candidate-facing setup and keep it to max 2 sentences. Example: 'is to be a sales person trying to sell an additional product to the customer'."
},
"persona_avatar_who_is": {
"type": [
"string",
"null"
],
"description": "Who the avatar represents: name, role, context, personality, woven with what drives them underneath (motive, fear, what they refuse until heard, what they do not know until told). One continuous description; no labelled subsections."
},
"persona_avatar_knowledge": {
"type": [
"string",
"null"
],
"description": "Private facts the avatar can use (numbers, dates, names, objections), plus any personal details shareable only after progress and only if natural — timing written inline, not as labelled subsections. Those personal details are never required for the goal."
},
"persona_avatar_end_conditions": {
"type": [
"string",
"null"
],
"description": "When the avatar should end the session. Prefer referring to persona_avatar_progress: wrap up when progress is complete (turning point unlocked and a plan accepted, or steps \"Done when\" reached), or when the conversation has clearly broken down."
},
"persona_avatar_progress": {
"type": [
"string",
"null"
],
"description": "How the conversation moves forward — one plain-text value starting with `Mode: turning point` (resistance) or `Mode: steps` (difficult conversation protocol), then the labelled lines for that mode (Initial hold / Unlocks when / … or Framework / Steps / …), including a Gates line: do not share later personal details from persona_avatar_knowledge until progress is earned."
},
"opening_line": {
"type": [
"string",
"null"
],
"description": "The avatar's opening line — the FIRST thing it says out loud when the session starts, before the candidate has said anything. This is a literal spoken line, NOT a description: write the exact words the avatar should say, in character and consistent with persona_role_avatar. For an escalated scenario it should already convey that state (e.g. an angry customer opens angrily). If omitted, the platform inserts a generic default (\"Hello\"), which is usually a weak opener — set this for anything other than a neutral greeting."
},
"candidate_expectations": {
"type": [
"string",
"null"
],
"maxLength": 2100,
"description": "Mentee assessment goals — free-text describing what the candidate is expected to achieve (max 2100 chars)."
},
"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."
},
"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."
},
"max_duration": {
"type": [
"number",
"null"
],
"description": "Maximum conversation duration in seconds. Defaults to 1200 (20 min) when omitted."
},
"code": {
"type": [
"string",
"null"
],
"description": "Optional external code/reference for the persona."
},
"cover_image_url": {
"type": [
"string",
"null"
],
"description": "Cover image URL."
},
"interview_location": {
"type": [
"string",
"null"
],
"description": "Optional location label shown for the session."
},
"merchant_id": {
"type": [
"string",
"null"
],
"description": "Merchant id. Admin / sub-merchant callers only; otherwise taken from your token."
},
"recruiter_profile_id": {
"type": [
"string",
"null"
],
"description": "Profile id of the recruiter owning this persona. A user of the company who is not read only: an owner, recruiter or admin from merchant-user-list."
},
"welcome_message": {
"type": [
"string",
"null"
],
"description": "Custom welcome message spoken to the candidate before the role-play starts — set it; omitting it leaves a generic platform default. This is the scene-setting message; the avatar's first in-character line is `opening_line`, which comes after it."
},
"thank_you_message": {
"type": [
"string",
"null"
],
"description": "Custom thank-you message shown after the session — set it; omitting it leaves a generic platform default."
},
"tags": {
"type": [
"array",
"null"
],
"items": {
"type": "string"
},
"description": "Free-form tags stored on the persona. 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."
},
"portal": {
"type": [
"string",
"null"
],
"enum": [
"coaching",
"interview"
],
"description": "REQUIRED IN PRACTICE — pick deliberately; the default is the coaching product, not the recruiting one. `interview`: an interview role-play. Choose this for ANY recruiting or assessment use case (screening candidates, hiring, sales role-plays for applicants). Candidates are invited through the normal invitation flow, results are visible to the recruiter alongside ordinary interview results, it is billed against your merchant credits on the same basis as an interview, and attempts are capped (see `interview_attempts`). | `coaching` (DEFAULT when omitted): the classic coaching persona for practice/training. Runs on the coaching portal, is consumed against the mentee's own coaching credits, is started by the mentee from the catalogue or a shared link, and its results are NOT visible to recruiters. The conversation itself behaves identically in both cases — only the portal, billing, visibility and attempt limits differ.",
"x-mcp-description": "Pick deliberately; left out, it is `coaching`. Values: `interview`: a scored role-play a recruiter invites candidates to, billed to merchant credits, attempts capped | `coaching`: a practice persona learners start from the catalogue, paid from their own coaching minutes, never visible to recruiters."
},
"interview_attempts": {
"type": [
"number",
"null"
],
"minimum": 1,
"maximum": 20,
"description": "Allowed candidate attempts (1-20), defaulting to 3. Only meaningful when `portal` is `interview`; coaching personas are unlimited. A recruiter can still grant an extra attempt afterwards."
},
"is_embedded": {
"type": [
"boolean",
"null"
],
"description": "Set true when the persona will be embedded as an iframe on an external page. Provisions an embed key and returns embed_id / embed_signing_key, used to sign the iframe link. 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."
}
},
"required": [
"name",
"interview_template_id",
"mojito_language_code",
"status",
"visibility",
"persona_role_avatar",
"persona_role_user"
]
}
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-persona-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.