APIs
HireLayer Match
Evaluate a resume against job criteria, criterion by criterion, with an explained status and a weighted 0–1 score.
- Endpoint
POST /api/v1/matching/job-candidate- Input
- JSON · job text, resume text and criteria
- Output
- Score from 0 to 1, a status and an explanation per criterion
- Billing
- 1 credit per successful call
/api/v1/matching/job-candidateEvaluate one resume against each job criterion and get an explained 0–1 score.
- Authentication
X-API-Keyheader- Billing
- 1 credit per successful call
- Client timeout
- Client timeout ≥ 65 s
Request body
Content type application/json
job_textstringrequiredJob description. Trimmed before validation.
1–50,000 characters
candidate_textstringrequiredCandidate resume as plain text, e.g.
info_resume.textfrom HireLayer CV Extract. Trimmed before validation.1–50,000 characters
matching_criteriaMatchingCriterion[]requiredCriteria to evaluate, usually from HireLayer Job Extract. Can be empty. No other criterion field is accepted.
›Show 5 child fieldsHide child fields
idstringrequiredCriterion ID. Job Extract generates
crit_1…crit_n; Match accepts any non-empty string.non-empty
labelstringrequiredWhat is evaluated, in a short phrase.
non-empty
weightintegerrequiredImportance:
3essential,2important,1nice to have.1–3
is_mandatorybooleanrequiredWhether the job states it as a hard requirement. Informational: it does not change the Match score.
rationalestringrequiredWhy the criterion matters for the job.
non-empty
Response
200Evaluation of every criterion.
scorenumberWeighted average of the criterion statuses. Not rounded.
0–1
summarystringOverall assessment, in French.
evaluated_criteriaEvaluatedCriterion[]Every input criterion, in input order, with its evaluation.
›Show 7 child fieldsHide child fields
idstringCriterion ID. Job Extract generates
crit_1…crit_n; Match accepts any non-empty string.non-empty
labelstringWhat is evaluated, in a short phrase.
non-empty
weightintegerImportance:
3essential,2important,1nice to have.1–3
is_mandatorybooleanWhether the job states it as a hard requirement. Informational: it does not change the Match score.
rationalestringWhy the criterion matters for the job.
non-empty
match_statusstringideal: clearly met ·potential: partly or indirectly met ·not_mentioned: the resume says nothing ·not_valid: contradicted."ideal""potential""not_valid""not_mentioned"match_explanationstringEvidence from the resume, in French.
Errors
- 400Request body must be a JSON object
The body is missing, is a JSON array, or
Content-Typeis notapplication/json.Do not retry
- 400The request contains unsupported fields
The body contains a field that is not documented for this endpoint.
Do not retry
- 400The 'job_text' field is required
job_textis missing or not a string.Do not retry
- 400job_text cannot be empty
job_textis empty after trimming.Do not retry
- 400job_text must be 50000 characters or less
job_textis longer than 50,000 characters after trimming.Do not retry
- 400The 'candidate_text' field is required
candidate_textis missing or not a string.Do not retry
- 400candidate_text cannot be empty
candidate_textis empty after trimming.Do not retry
- 400candidate_text must be 50000 characters or less
candidate_textis longer than 50,000 characters after trimming.Do not retry
- 400The 'matching_criteria' field must be an array
matching_criteriais missing or not an array.Do not retry
- 400matching_criteria contains an invalid criterion
A criterion has a missing, empty or extra field, or a
weightoutside 1–3.Do not retry
- 401Missing API Key
The
X-API-Keyheader is absent.Authorization: Beareris not accepted.Do not retry
- 401Invalid API Key
The key is malformed, unknown or revoked. Rotating a key revokes the previous one immediately.
Do not retry
- 403Insufficient credits available
The account has no credit left.
availableCreditsis the current balance.Fix, then retry
- 500Internal server error
Unexpected gateway failure.
Retry with backoff
- 500Internal server error. Please try again later.
The body is not valid JSON, is a JSON primitive or exceeds 10 MB, or the service failed unexpectedly. Check the payload: if it is valid, retry.
Retry with backoff
- 502Upstream API unavailable
The service did not answer within 60 seconds, or could not be reached.
Retry with backoff
- 502The AI processing step failed. Please try again later.
Matching failed or returned an invalid result after the service's internal retries.
Retry with backoff
- 503Credit service temporarily unavailable
Credits could not be checked or deducted. No credit is consumed, including when the operation itself had completed.
Retry with backoff
Behavior
- Latency
- Synchronous. The gateway waits up to 60 seconds, then returns
502 Upstream API unavailable. Use a client timeout of at least 65 seconds. - Retries
- Transient model errors are retried by the service before it answers. Retry
502and503with exponential backoff; never retry4xxunchanged. Failed requests are not charged. - Validation
- Validation stops at the first error, so one call reports one problem. Text fields are trimmed before their length is checked.
- Score
score = Σ(weight × value) / Σ weightwithideal= 1,potential= 0.6,not_mentioned= 0.5 andnot_valid= 0. Every criterion counts in the denominator;is_mandatoryhas no effect on the score.- Empty criteria
- With
"matching_criteria": []the model is not called and the response is exactly{"score": 0, "summary": "Aucun critère à évaluer.", "evaluated_criteria": []}. - Hard requirements
- To reject candidates who miss a mandatory criterion, check
is_mandatoryandmatch_statusin your code: the score alone does not do it.
curl -X POST https://onlineresumeparser.com/api/v1/matching/job-candidate \
-H "X-API-Key: $HIRELAYER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"job_text": "Senior Frontend Engineer, Paris (hybrid). You will build our recruiting platform with React and TypeScript. Requirements: 5+ years of frontend development, strong React and TypeScript skills, fluent English. Nice to have: experience with Next.js.",
"candidate_text": "Alex Morgan, Senior Software Engineer in Paris. 8 years of experience. Since 2022, leads a team building a React and TypeScript SaaS platform at Northstar Labs. Previously built Node.js APIs. Professional English.",
"matching_criteria": [
{
"id": "crit_1",
"label": "Maîtrise de React",
"weight": 3,
"is_mandatory": true,
"rationale": "React est explicitement exigé pour le poste."
},
{
"id": "crit_2",
"label": "Maîtrise de TypeScript",
"weight": 3,
"is_mandatory": true,
"rationale": "TypeScript est explicitement exigé pour le poste."
},
{
"id": "crit_3",
"label": "Au moins 5 ans d’expérience en développement frontend",
"weight": 3,
"is_mandatory": true,
"rationale": "L’offre demande plus de cinq ans d’expérience frontend."
},
{
"id": "crit_4",
"label": "Anglais courant",
"weight": 2,
"is_mandatory": true,
"rationale": "Un anglais courant est demandé."
},
{
"id": "crit_5",
"label": "Expérience avec Next.js",
"weight": 1,
"is_mandatory": false,
"rationale": "Next.js est présenté comme un atout."
}
]
}'import os
import requests
response = requests.post(
"https://onlineresumeparser.com/api/v1/matching/job-candidate",
headers={"X-API-Key": os.environ["HIRELAYER_API_KEY"]},
json={
"job_text": "Senior Frontend Engineer, Paris (hybrid). You will build our recruiting platform with React and TypeScript. Requirements: 5+ years of frontend development, strong React and TypeScript skills, fluent English. Nice to have: experience with Next.js.",
"candidate_text": "Alex Morgan, Senior Software Engineer in Paris. 8 years of experience. Since 2022, leads a team building a React and TypeScript SaaS platform at Northstar Labs. Previously built Node.js APIs. Professional English.",
"matching_criteria": [
{
"id": "crit_1",
"label": "Maîtrise de React",
"weight": 3,
"is_mandatory": True,
"rationale": "React est explicitement exigé pour le poste.",
},
{
"id": "crit_2",
"label": "Maîtrise de TypeScript",
"weight": 3,
"is_mandatory": True,
"rationale": "TypeScript est explicitement exigé pour le poste.",
},
{
"id": "crit_3",
"label": "Au moins 5 ans d’expérience en développement frontend",
"weight": 3,
"is_mandatory": True,
"rationale": "L’offre demande plus de cinq ans d’expérience frontend.",
},
{
"id": "crit_4",
"label": "Anglais courant",
"weight": 2,
"is_mandatory": True,
"rationale": "Un anglais courant est demandé.",
},
{
"id": "crit_5",
"label": "Expérience avec Next.js",
"weight": 1,
"is_mandatory": False,
"rationale": "Next.js est présenté comme un atout.",
},
],
},
timeout=65,
)
response.raise_for_status()
data = response.json()
print(data["score"])const response = await fetch('https://onlineresumeparser.com/api/v1/matching/job-candidate', {
method: 'POST',
headers: {
'X-API-Key': process.env.HIRELAYER_API_KEY!,
'Content-Type': 'application/json',
},
body: JSON.stringify({
job_text: 'Senior Frontend Engineer, Paris (hybrid). You will build our recruiting platform with React and TypeScript. Requirements: 5+ years of frontend development, strong React and TypeScript skills, fluent English. Nice to have: experience with Next.js.',
candidate_text: 'Alex Morgan, Senior Software Engineer in Paris. 8 years of experience. Since 2022, leads a team building a React and TypeScript SaaS platform at Northstar Labs. Previously built Node.js APIs. Professional English.',
matching_criteria: [
{
id: 'crit_1',
label: 'Maîtrise de React',
weight: 3,
is_mandatory: true,
rationale: 'React est explicitement exigé pour le poste.',
},
{
id: 'crit_2',
label: 'Maîtrise de TypeScript',
weight: 3,
is_mandatory: true,
rationale: 'TypeScript est explicitement exigé pour le poste.',
},
{
id: 'crit_3',
label: 'Au moins 5 ans d’expérience en développement frontend',
weight: 3,
is_mandatory: true,
rationale: 'L’offre demande plus de cinq ans d’expérience frontend.',
},
{
id: 'crit_4',
label: 'Anglais courant',
weight: 2,
is_mandatory: true,
rationale: 'Un anglais courant est demandé.',
},
{
id: 'crit_5',
label: 'Expérience avec Next.js',
weight: 1,
is_mandatory: false,
rationale: 'Next.js est présenté comme un atout.',
},
],
}),
signal: AbortSignal.timeout(65_000),
})
if (!response.ok) {
throw new Error(`HireLayer ${response.status}: ${await response.text()}`)
}
const data = await response.json()
console.log(data.score){
"score": 0.8916666666666666,
"summary": "Profil très aligné : React, TypeScript et l’expérience demandée sont démontrés. Le niveau d’anglais reste à confirmer.",
"evaluated_criteria": [
{
"id": "crit_1",
"label": "Maîtrise de React",
"weight": 3,
"is_mandatory": true,
"rationale": "React est explicitement exigé pour le poste.",
"match_status": "ideal",
"match_explanation": "Le CV décrit une équipe React dirigée depuis 2022 sur une plateforme en production."
},
{
"id": "crit_2",
"label": "Maîtrise de TypeScript",
"weight": 3,
"is_mandatory": true,
"rationale": "TypeScript est explicitement exigé pour le poste.",
"match_status": "ideal",
"match_explanation": "La plateforme actuelle est développée en TypeScript."
},
{
"id": "crit_3",
"label": "Au moins 5 ans d’expérience en développement frontend",
"weight": 3,
"is_mandatory": true,
"rationale": "L’offre demande plus de cinq ans d’expérience frontend.",
"match_status": "ideal",
"match_explanation": "Le candidat cumule huit ans d’expérience en développement."
},
{
"id": "crit_4",
"label": "Anglais courant",
"weight": 2,
"is_mandatory": true,
"rationale": "Un anglais courant est demandé.",
"match_status": "potential",
"match_explanation": "Le CV mentionne un anglais professionnel, sans préciser un niveau courant."
},
{
"id": "crit_5",
"label": "Expérience avec Next.js",
"weight": 1,
"is_mandatory": false,
"rationale": "Next.js est présenté comme un atout.",
"match_status": "not_mentioned",
"match_explanation": "Le CV ne mentionne pas Next.js."
}
]
}{
"success": false,
"error": "Request body must be a JSON object"
}