Try it
Copy the code ↓- Data source
- Decision schema
- Model inference
- Structured result
2 Decision schema 3 typed questions
requirement_fitscoremissing_must_havespartialmeetsexceedsrole_familychoicebackendfrontenddatadevopsotherneeds_humannoulprobability 0–1
3 Model inference typesafe/jev-1.13
Waiting for a run.
4 Structured result
Raw JSON
Run the demo to see the JSON answers, the highlighted pick and the final action.
FLATKEY_API_KEY and run.curl -sS https://router.flatkey.ai/api/alpha/decisions \
-H "Authorization: Bearer $FLATKEY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "typesafe/jev-1.13",
"state": "Role: Senior Backend Engineer. Must-haves: 5+ years backend, Go, PostgreSQL, on-call experience.\n\nResume: 7 years backend engineering at a payments company. Go and Python microservices. Led the migration from MySQL to PostgreSQL. On-call rotation lead for two years. BSc Computer Science.",
"questions": {
"requirement_fit": {
"type": "score",
"instructions": "How well does the resume meet the role'\''s stated must-have requirements?",
"criteria": [
"missing_must_haves",
"partial",
"meets",
"exceeds"
]
},
"role_family": {
"type": "choice",
"instructions": "Which role family does this experience match best?",
"criteria": {
"backend": "Server-side services, APIs, databases",
"frontend": "Web or mobile user interfaces",
"data": "Analytics, data engineering or machine learning",
"devops": "Infrastructure, CI/CD, reliability",
"other": "None of these"
}
},
"needs_human": {
"type": "noul",
"instructions": "The resume has a career change, employment gap or non-standard format where an automated read is likely to miss relevant experience."
}
}
}'// Node.js 18+ (built-in fetch). Run: FLATKEY_API_KEY=... node jev.mjs
const body = {
"model": "typesafe/jev-1.13",
"state": "Role: Senior Backend Engineer. Must-haves: 5+ years backend, Go, PostgreSQL, on-call experience.\n\nResume: 7 years backend engineering at a payments company. Go and Python microservices. Led the migration from MySQL to PostgreSQL. On-call rotation lead for two years. BSc Computer Science.",
"questions": {
"requirement_fit": {
"type": "score",
"instructions": "How well does the resume meet the role's stated must-have requirements?",
"criteria": [
"missing_must_haves",
"partial",
"meets",
"exceeds"
]
},
"role_family": {
"type": "choice",
"instructions": "Which role family does this experience match best?",
"criteria": {
"backend": "Server-side services, APIs, databases",
"frontend": "Web or mobile user interfaces",
"data": "Analytics, data engineering or machine learning",
"devops": "Infrastructure, CI/CD, reliability",
"other": "None of these"
}
},
"needs_human": {
"type": "noul",
"instructions": "The resume has a career change, employment gap or non-standard format where an automated read is likely to miss relevant experience."
}
}
};
const res = await fetch("https://router.flatkey.ai/api/alpha/decisions", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.FLATKEY_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify(body),
});
if (!res.ok) throw new Error(`Jev request failed: ${res.status} ${await res.text()}`);
const { answers, usage } = await res.json();
console.log(JSON.stringify(answers, null, 2), usage);# Python 3.8+ (pip install requests). Run: FLATKEY_API_KEY=... python jev.py
import json, os, requests
body = json.loads(r"""{
"model": "typesafe/jev-1.13",
"state": "Role: Senior Backend Engineer. Must-haves: 5+ years backend, Go, PostgreSQL, on-call experience.\n\nResume: 7 years backend engineering at a payments company. Go and Python microservices. Led the migration from MySQL to PostgreSQL. On-call rotation lead for two years. BSc Computer Science.",
"questions": {
"requirement_fit": {
"type": "score",
"instructions": "How well does the resume meet the role's stated must-have requirements?",
"criteria": [
"missing_must_haves",
"partial",
"meets",
"exceeds"
]
},
"role_family": {
"type": "choice",
"instructions": "Which role family does this experience match best?",
"criteria": {
"backend": "Server-side services, APIs, databases",
"frontend": "Web or mobile user interfaces",
"data": "Analytics, data engineering or machine learning",
"devops": "Infrastructure, CI/CD, reliability",
"other": "None of these"
}
},
"needs_human": {
"type": "noul",
"instructions": "The resume has a career change, employment gap or non-standard format where an automated read is likely to miss relevant experience."
}
}
}""")
res = requests.post(
"https://router.flatkey.ai/api/alpha/decisions",
headers={"Authorization": f"Bearer {os.environ['FLATKEY_API_KEY']}"},
json=body,
timeout=60,
)
res.raise_for_status()
data = res.json()
print(json.dumps(data["answers"], indent=2), data.get("usage"))
No Flatkey key yet? Get one for Jev 1.13 →
About this use case

Who / when
Audience
- recruiting and talent-ops teams facing hundreds of applicants per opening
- ATS and HR-tech builders adding a first-pass screen
- engineering managers who want a consistent rubric applied to every resume
Triggers
- a new opening collects more applications than recruiters can read this week
- a general application needs routing to the right role family
- you want the same rubric applied to every resume, in the same words
- you need a cheap first pass before a human screen, not an automated rejection
The workflow
- 01Resume stateRole requirements plus resume textInput
- 02ChoiceRole family matchJev
- 03Score + NoulRequirement fit, unusual-background flagJev
- 04Code gateShortlist or recruiter reviewYour code
Question shape
{
"requirement_fit": {
"type": "score",
"instructions": "How well does the resume meet the role's stated must-have requirements?",
"criteria": [
"missing_must_haves",
"partial",
"meets",
"exceeds"
]
},
"role_family": {
"type": "choice",
"instructions": "Which role family does this experience match best?",
"criteria": {
"backend": "Server-side services, APIs, databases",
"frontend": "Web or mobile user interfaces",
"data": "Analytics, data engineering or machine learning",
"devops": "Infrastructure, CI/CD, reliability",
"other": "None of these"
}
},
"needs_human": {
"type": "noul",
"instructions": "The resume has a career change, employment gap or non-standard format where an automated read is likely to miss relevant experience."
}
}Gate policy
≥ 0.90
Add to the recruiter's phone-screen shortlist with matched requirements.
0.65–0.90
A recruiter reads the resume before any decision.
< 0.65
Full human review. The system never auto-rejects.
Failure modes
Pre-launch checks before you trust auto-routing:
- Protected attributes (name, photo, age, gender, nationality) leaking into the state;
- Keyword-stuffed resumes that match every requirement on paper;
- Career changers and non-linear paths whose experience is described in other terms;
- PDF-to-text artifacts: columns merged, dates split from roles;
- Requirements written vaguely enough that "meets" and "exceeds" overlap;
FAQ
How much cheaper is this than asking an LLM?
In Prasanna's zero-shot resume screening and ranking run (post below), Gemini-3.8-Flash cost about $1,500 in API costs and Jev about $14, and he found Jev "surprisingly good given how cheap it is". Costs depend on resume length and volume, so measure on your own pipeline.
Is it fair to automate resume screening?
Use it to shortlist, never to reject. Strip protected attributes before the call, keep a human on every rejection, audit shortlist rates across groups, and check the rules on automated employment decision tools where you hire.
Why a score for fit instead of a yes/no?
Ordered levels (missing must-haves, partial, meets, exceeds) keep the rubric explicit and give code a probability per level, so "meets at 0.93" shortlists while "meets at 0.70" goes to a recruiter.
Can I bring my own API key?
Yes. Try the free demo above without signing in. To run it live on your own text, sign in with Google and connect a Flatkey or OpenRouter key (a quick test call runs when you save it). Manage or delete it anytime under Dashboard → BYOK. Keys are stored encrypted on the server, used only for runs you trigger, and never sent back to the browser. Need a Flatkey key? Get one for Jev 1.13 on Flatkey.
Is this the official TypeSafe Jev product page?
No. jev-llm.com is an independent research and practice site. Verify pricing, models and terms at the original TypeSafe sources.
Sources
Frontier LLMs have gotten REALLY good at zero-shotting resume screening/ranking tasks with no labeled examples. This wasn't the case even just a few months ago. The new "system one decision model" from @typefaceai is also surprisingly good given how cheap it is. For comparison, Gemini-3.8-Flash cost ~$1500 in API costs, Jev cost ~$14.
— @prasanna_parasu View the post on X →
Wire this gate with your own key
Bring your own key through Flatkey / OpenRouter. Keep exact checks in code.