Create an interview for a candidate and return an access token URL
Creates (or resolves an existing) position and interview for a merchant, enrols the candidate, runs pre-screening, and returns a tokenised interview URL. Position fields are required only when position_def_set_id is not provided.
Authorizations
Supabase JWT — Authorization: Bearer <token>.
Body
Candidate full name.
1"John"
Candidate email (used as auth identity).
1"peterson6@hello.com"
ISO country code of the candidate.
1"HR"
Candidate resume parsed text.
1"Curriculum Vitae ..."
Existing position_def_set id. When provided, the position is looked up instead of created, and position_name/position_location/position_country_code/mojito_language_code become optional.
"00000000-0000-0000-0000-000000000000"
External position code used to look up an existing position.
"JOB-123"
Interview template id to base the interview on. Defaults to the platform template when omitted.
"5d8ea38b-eec4-4866-aa6c-b2ea5bc6e45b"
Merchant id. Only honoured for admin / sub-merchant tokens; otherwise the token merchant is used.
"28106cba-1c27-4e53-b149-32113e5e8e31"
Position / job title. Required when position_def_set_id is not provided.
"Entry level coffee boy"
Position location. Required when position_def_set_id is not provided.
"remote"
ISO country code of the position. Required when position_def_set_id is not provided.
"SK"
Interview language code (one of the platform-languages.json codes). Required when position_def_set_id is not provided.
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 "en"
Short, two-sentence position description shown to the candidate. Provide it to use it as-is; leave it null/blank and it is AI-generated from the position name and any other context.
Full position 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.
External candidate id stored on the profile.
Candidate LinkedIn URL.
Whether a candidate video introduction is optional or required.
optional, required Number of allowed interview attempts (1-20).
1 <= x <= 203
Seniority level of the position. Auto-detected when omitted.
entry-level, intermediate, senior, managerial, director, executive How interview results are shown to the candidate. Defaults to minimal.
none, minimal, minimal_with_score, advanced, full, full_expand_scores Optional custom scoring overrides merged with platform defaults.
Reserved flag for enhanced candidate expectations generation.
Include an opening rapport question. Defaults to false.
Include a closing prompt. Defaults to true.
Show an instructional video before the interview. Defaults to false.
Custom text shown with the instructional video.
Custom welcome message for the interview.
Custom thank-you message shown after the interview.
Maximum interview duration in seconds. Scopes how many questions are generated 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.
1200
Set true when the interview will be embedded as an iframe on an external page. Ensures an embed key exists and returns embed_id/embed_signing_key, used to authenticate/sign the iframe embed.
Department the position belongs to.
"Engineering"
Salary range shown for the position.
"$80k - $100k"
ISO date/time after which the interview is no longer available to candidates. null keeps it always available.
"2026-12-31"
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..
slower, normal, faster "normal"
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).
0 <= x <= 9992
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.
0.01 <= x <= 0.90.5
Require pronunciation assessment (restricts to pronunciation-capable languages). Defaults to false.
false
Allow editing the transcript on the result view. Defaults to true.
true
Free-form tags stored on the interview.
Profile id of the recruiter owning this interview. Must be a merchant/merchant_owner/admin profile of the same merchant.
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: '' } plus optional description/location/sector/company_size for a named client. Stored in creation_parameters.hiring_for_company.
Auto-generate a candidate PDF report with these options once the interview completes. null disables auto-export.
Response
Candidate enrolled. Decision status, ids, and a tokenised interview URL.
Result of creating (or resolving) the position and enrolling the candidate. Fields present depend on the decision branch.
Decision / lifecycle status for the candidate against this position.
ai_accept, recruiter_accept, recruiter_action, ai_reject, recruiter_reject, already-applied URL the candidate should open to continue.
Created/resolved position id.
Created/resolved interview definition set id.
Candidate profile_interview id.
Human-readable reason, present on reject / already-applied branches.
Embed id, present only when is_embedded=true.
Embed signing key, present only when is_embedded=true.