Skip to main content
Pre-screening scores a candidate’s résumé (and optional form answers) against a position, returning an AI recommendation. It’s two steps: define the pre-screening position, then submit candidates.

1. Create the pre-screening position

When creating, 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.
A rule only screens candidates when its type is "screening". A rule with type: "required" or "optional" (or a resume rule you enabled without any threshold) is collected in the form but never rejects or flags anyone. The two resume-scoring rules — resume_match and resume_technical_experience — are always enforced when present and take no type.

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 standard assessment_rules entry so the field is shown in the form (mandatory = the rule’s type is not optional). 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_type is text (free text), file (upload) or radio (single choice — supply options: ["...", "..."], 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

In this example a candidate below a bachelor’s degree is rejected; one who lacks advanced English, has fewer than 3 years of experience, or scores 2–6 on the AI résumé match is marked for review; nationality and the work-permit question are collected but not screened.

2. Screen a candidate

Submit the candidate against the position_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.
If the position has a form_nationality or form_residency screening rule and you send neither candidate_country_code nor the matching form.nationality / form.residency, the candidate is screened with no nationality/residency and fails that rule — marked for review or rejected per the rule’s action. Supply the country code (or the form value) whenever such a rule is configured.
The 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, use POST /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.