Screening judgment, as an API
The model scores. Your policy decides.
Send CV text and a role profile in one POST. Scores, confidence, and a tier come back in ~150ms. No prose to parse.
POST /v1/screen · 200 OK · ~150ms
One request in. One typed answer out.
Typed fields, not paragraphs. Your code branches on numbers, never on parsing prose.
POST /v1/screen X-API-Key: jsk_… { "role": "ai-community-admin", "applicant": { "cv_text": "full CV text…" } }
{
"model": "jev-1.13.0",
"usage": { "input_tokens": 1041, "output_tokens": 115 },
"dimensions": {
"ai_depth": { "type": "score", "normalized": 0.77, "confidence": 0.93 },
"community_exp": { "type": "noul", "probability": 0.97 },
"communication": { "type": "score", "normalized": 0.79 },
"self_direction": { "type": "noul", "probability": 0.92 },
"red_flags": { "type": "choice", "choice": "none" }
},
"composite": 0.936,
"confidence": 0.93,
"tier": "shortlist"
}
- Four scored dimensions: AI depth, community experience, communication, self-direction.
- A 0 to 1 composite, a confidence value, and one of three tiers: weak, review, or shortlist.
- Contact details are redacted before the judgment model ever reads the CV.
noulis our yes/no primitive: the probability a condition holds, with no separate confidence.
The tier is arithmetic, not opinion.
Thresholds are plain numbers in your config. You change them like any other constant, and the next request obeys.
if (confidence < 0.6) return "review"; // the gate. always. if (composite >= 0.7) return "shortlist"; if (composite < 0.35 && consistent_lows) return "weak"; return "review";
- ✓A hard confidence gate. Below your floor, the tier is review. A human looks at it. Every time.
- ✓No reject exists anywhere in the API. Jev is decision support. Your policy makes the call.
- ✓Every tier traces to numbers you hold. Dimension scores, composite, threshold. Recompute any decision yourself.
- ✓The response is the receipt. No hidden weights, no vendor scoring you cannot audit.
Who tunes the rubric? Your team does.
Questions, weights, thresholds: a role profile is plain JSON. Your recruiting lead tunes it, and the next request uses the new profile.
{
"weights": {
"ai_depth": 0.4,
"community_exp": 0.3,
"communication": 0.2
},
"policy": { "shortlist_above": 0.7 }
}
Hands-on AI practice weighted highest.
{
"weights": {
"ai_depth": 0.2,
"community_exp": 0.4,
"communication": 0.4
},
"policy": { "shortlist_above": 0.75 }
}
Same API. Two roles. Two rubrics.
What Jev will never do.
Four architectural commitments. Each one is simply how the service is built.
- Never rejects a candidate.weak, review, and shortlist are the only tiers the API can return. Your policy, not a vendor's model, makes hiring decisions.
- Never sees contact details.Names and contact channels are stripped before scoring, so they cannot sway it.
- Never stores applicant data.Stateless by design: the request is scored and returned, nothing is kept.
- Never hides uncertainty.Every screen ships a confidence value, and low confidence always routes to a person.
Pay per screen.
One screen is one POST. Do your own math: at 400 CVs per opening, 2,500 screens covers six openings.
- 100 screens per month
- All role profiles
- Full response format
- No card required
- 2,500 screens per month
- About six 400-CV openings
- Custom role profiles in the dashboard
- Usage metering dashboard
- 15,000 screens per month
- 37+ openings a month
- Custom role profiles in the dashboard
- Priority support
Early Access: the free tier is live today; paid plans open soon. Questions to hi@arsana.cloud.
Your next opening has 400 CVs.
Get a free API key, send one real CV, and read the typed answer. If you do not trust the tier, change the thresholds. They are yours.
Free tier. Stateless. Your policy decides.