1. Create the pre-screening position
position_name, position_location, position_country_code, and mojito_language_code are required. type is resume, form, or resume_with_form. To update an existing position, pass update_position_def_set_id instead and only the fields you want to change.
The response returns position_def_set_id (use it to screen candidates) and interview_pre_screening_id.
Configuring the screening rules
What the screen actually checks is defined by two arrays on the request:assessment_rules (the checks that pass / flag / reject a candidate) and form_fields (the candidate-facing form). Both are stored as-is and replaced wholesale on update — always send the complete array, never a partial delta.
assessment_rules — the checks
An array of rule objects. Each rule has an id (which check), an optional type (optional | required | screening), an optional action for when a screening rule is not met (mark_for_review | reject, default mark_for_review), and id-specific keys:
Allowed keys:
education:primary school,high school no graduation,high school,vocational,bachelors,masters,doctorate- language
level:beginner,intermediate,advanced,fluent gender:male,female,other
form_age and form_gender are unavailable (and ignored) for positions in EU / GDPR countries. form_visa is only available where visa keys are defined for the position country.form_fields — the candidate form
An array describing what the candidate fills in. Two kinds of entry:
- Standard field reference —
{ "id": "form_education", "mandatory": true }. Mirrors a standardassessment_rulesentry so the field is shown in the form (mandatory= the rule’stypeis notoptional). Enable a standard form field in both arrays. - Custom field —
{ "id": "custom_<timestamp>", "title": "...", "type": "required", "field_type": "text" }. A free-form question you add.field_typeistext(free text),file(upload) orradio(single choice — supplyoptions: ["...", "..."], at least two). Custom fields are collected but not evaluated by the screening engine.
resume-only positions ignore form_fields; form and resume_with_form positions require at least one entry.
Full form + resume example
2. Screen a candidate
Submit the candidate against theposition_id (the position_def_set_id from step 1). Required: position_id, candidate_name, candidate_email, candidate_resume.
candidate_country_code is optional. It’s used only as the fallback for residency/nationality when those aren’t given in form.
form values must use the same keys the position’s rules expect — education and language level from the lists above, ISO country codes for residency/nationality, and the position’s visa/gender keys. Custom fields (defined via form_fields) can also be passed here by their custom_<timestamp> id; they’re stored with the submission but not screened.
For a binary file (PDF/DOCX), use job-interview-pre-screening-api-resume-binary with the same identity fields and the file payload instead of candidate_resume.
Reading the result
A completed screen returns:If the candidate isn’t in a screenable state, you’ll still get HTTP 200 with a short
{ "decision_status": …, "message": … } payload instead of a full result.Shortcut: pre-screen + interview in one call
To screen a candidate and get a ready interview link back in a single request, usePOST /job-interview-create-for-candidate-with-token (HTTP only — not exposed as an MCP tool; call it directly with a bearer token). It resolves the position, runs pre-screening, and returns a tokenised interview_url plus a status like ai_accept or recruiter_action.
Next steps
Invite candidates
Invite the candidates who passed screening.
Review results
Filter results by the
pre-screening step to see screening outcomes.