Candidate Analyzer API¶
Port : 8003 | NodePort : 30003 | Repo : solyntek/djinn/services/djinn-candidate-analyzer
Analyse et classement de candidatures par pertinence pour un poste.
Endpoints¶
| Méthode | Route | Description |
|---|---|---|
GET |
/health |
Health check |
POST |
/v1/analyze |
Analyser 1 candidat vs 1 poste |
POST |
/v1/analyze/batch |
Analyser N candidats, retour trié par score |
POST |
/v1/analyze/competency-file |
Analyser un dossier de compétences (texte brut) |
Scoring (5 dimensions)¶
| Dimension | Poids | Méthode |
|---|---|---|
| Skills | 0.30 | Similarité sémantique (embeddings) |
| Experience | 0.25 | Années + pertinence |
| Education | 0.15 | Diplômes + certifications |
| Languages | 0.15 | Matching langues requises |
| Location | 0.15 | Compatibilité remote/onsite |
Exemple¶
Référence interactive¶
Générée à chaque build depuis la spec versionnée openapi/candidate-analyzer-v1.json (ADR-011) — aucune route documentée à la main.
Djinn Candidate Analyzer 0.1.0¶
Analyse et classement de candidatures par pertinence pour postes
Endpoints¶
GET /health¶
Health
Description
Health check endpoint.
Responses
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.
POST /v1/analyze¶
Analyze
Description
Analyze a single candidate against a job description.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
X-API-Key |
header | No | |||
X-Internal-Service |
header | No | |||
X-Tenant-ID |
header | No |
Request body
{
"job": {
"title": "string",
"description": "string",
"required_skills": [
"string"
],
"preferred_skills": [
"string"
],
"min_experience_years": null,
"required_languages": [
"string"
],
"required_education": null,
"location": null,
"remote_policy": null
},
"candidate": {
"id": null,
"firstname": null,
"lastname": null,
"email": null,
"skills": [
"string"
],
"languages": [
"string"
],
"experiences": [
{
"company": "string",
"title": "string",
"location": "string",
"start_date": "string",
"end_date": "string",
"description": "string"
}
],
"diplomas": [
{
"school": "string",
"degree": "string",
"field_of_study": "string",
"start_date": "string",
"end_date": "string"
}
],
"certifications": [
{}
],
"location": null,
"raw_text": null
},
"weights": {
"skills": 10.12,
"experience": 10.12,
"education": 10.12,
"languages": 10.12,
"location": 10.12
}
}
Schema of the request body
{
"properties": {
"job": {
"$ref": "#/components/schemas/JobDescription"
},
"candidate": {
"$ref": "#/components/schemas/CandidateProfile"
},
"weights": {
"$ref": "#/components/schemas/ScoringWeights"
}
},
"type": "object",
"required": [
"job",
"candidate"
],
"title": "AnalyzeRequest",
"description": "Requête d'analyse d'un candidat."
}
Responses
{
"candidate_id": null,
"candidate_name": null,
"overall_score": 10.12,
"dimension_scores": [
{
"dimension": "string",
"score": 10.12,
"details": "string"
}
],
"strengths": [
"string"
],
"gaps": [
"string"
],
"summary": "string",
"fit_level": "string"
}
Schema of the response body
{
"properties": {
"candidate_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Candidate Id"
},
"candidate_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Candidate Name"
},
"overall_score": {
"type": "number",
"maximum": 1.0,
"minimum": 0.0,
"title": "Overall Score"
},
"dimension_scores": {
"items": {
"$ref": "#/components/schemas/DimensionScore"
},
"type": "array",
"title": "Dimension Scores"
},
"strengths": {
"items": {
"type": "string"
},
"type": "array",
"title": "Strengths"
},
"gaps": {
"items": {
"type": "string"
},
"type": "array",
"title": "Gaps"
},
"summary": {
"type": "string",
"title": "Summary",
"default": ""
},
"fit_level": {
"type": "string",
"title": "Fit Level",
"description": "excellent | good | moderate | weak",
"default": "moderate"
}
},
"type": "object",
"required": [
"overall_score"
],
"title": "CandidateAnalysis",
"description": "Résultat d'analyse pour un candidat."
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.
POST /v1/analyze/batch¶
Analyze Batch
Description
Analyze multiple candidates and return sorted by score.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
X-API-Key |
header | No | |||
X-Internal-Service |
header | No | |||
X-Tenant-ID |
header | No |
Request body
{
"job": {
"title": "string",
"description": "string",
"required_skills": [
"string"
],
"preferred_skills": [
"string"
],
"min_experience_years": null,
"required_languages": [
"string"
],
"required_education": null,
"location": null,
"remote_policy": null
},
"candidates": [
{
"id": null,
"firstname": null,
"lastname": null,
"email": null,
"skills": [
"string"
],
"languages": [
"string"
],
"experiences": [
{
"company": "string",
"title": "string",
"location": "string",
"start_date": "string",
"end_date": "string",
"description": "string"
}
],
"diplomas": [
{
"school": "string",
"degree": "string",
"field_of_study": "string",
"start_date": "string",
"end_date": "string"
}
],
"certifications": [
{}
],
"location": null,
"raw_text": null
}
],
"weights": {
"skills": 10.12,
"experience": 10.12,
"education": 10.12,
"languages": 10.12,
"location": 10.12
}
}
Schema of the request body
{
"properties": {
"job": {
"$ref": "#/components/schemas/JobDescription"
},
"candidates": {
"items": {
"$ref": "#/components/schemas/CandidateProfile"
},
"type": "array",
"maxItems": 500,
"minItems": 1,
"title": "Candidates"
},
"weights": {
"$ref": "#/components/schemas/ScoringWeights"
}
},
"type": "object",
"required": [
"job",
"candidates"
],
"title": "AnalyzeBatchRequest",
"description": "Requête d'analyse de plusieurs candidats."
}
Responses
{
"job_title": "string",
"candidates": [
{
"candidate_id": null,
"candidate_name": null,
"overall_score": 10.12,
"dimension_scores": [
{
"dimension": "string",
"score": 10.12,
"details": "string"
}
],
"strengths": [
"string"
],
"gaps": [
"string"
],
"summary": "string",
"fit_level": "string"
}
],
"total_analyzed": 0
}
Schema of the response body
{
"properties": {
"job_title": {
"type": "string",
"title": "Job Title"
},
"candidates": {
"items": {
"$ref": "#/components/schemas/CandidateAnalysis"
},
"type": "array",
"title": "Candidates"
},
"total_analyzed": {
"type": "integer",
"title": "Total Analyzed"
}
},
"type": "object",
"required": [
"job_title",
"candidates",
"total_analyzed"
],
"title": "AnalyzeBatchResponse",
"description": "Réponse d'analyse batch (triée par score décroissant)."
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.
POST /v1/analyze/competency-file¶
Analyze Competency File
Description
Analyze a competency file (raw text) against a job description.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
X-API-Key |
header | No | |||
X-Internal-Service |
header | No | |||
X-Tenant-ID |
header | No |
Request body
{
"job": {
"title": "string",
"description": "string",
"required_skills": [
"string"
],
"preferred_skills": [
"string"
],
"min_experience_years": null,
"required_languages": [
"string"
],
"required_education": null,
"location": null,
"remote_policy": null
},
"competency_text": "string",
"weights": {
"skills": 10.12,
"experience": 10.12,
"education": 10.12,
"languages": 10.12,
"location": 10.12
}
}
Schema of the request body
{
"properties": {
"job": {
"$ref": "#/components/schemas/JobDescription"
},
"competency_text": {
"type": "string",
"maxLength": 500000,
"minLength": 1,
"title": "Competency Text"
},
"weights": {
"$ref": "#/components/schemas/ScoringWeights"
}
},
"type": "object",
"required": [
"job",
"competency_text"
],
"title": "CompetencyFileRequest",
"description": "Requête d'analyse d'un dossier de compétences."
}
Responses
{
"candidate_id": null,
"candidate_name": null,
"overall_score": 10.12,
"dimension_scores": [
{
"dimension": "string",
"score": 10.12,
"details": "string"
}
],
"strengths": [
"string"
],
"gaps": [
"string"
],
"summary": "string",
"fit_level": "string"
}
Schema of the response body
{
"properties": {
"candidate_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Candidate Id"
},
"candidate_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Candidate Name"
},
"overall_score": {
"type": "number",
"maximum": 1.0,
"minimum": 0.0,
"title": "Overall Score"
},
"dimension_scores": {
"items": {
"$ref": "#/components/schemas/DimensionScore"
},
"type": "array",
"title": "Dimension Scores"
},
"strengths": {
"items": {
"type": "string"
},
"type": "array",
"title": "Strengths"
},
"gaps": {
"items": {
"type": "string"
},
"type": "array",
"title": "Gaps"
},
"summary": {
"type": "string",
"title": "Summary",
"default": ""
},
"fit_level": {
"type": "string",
"title": "Fit Level",
"description": "excellent | good | moderate | weak",
"default": "moderate"
}
},
"type": "object",
"required": [
"overall_score"
],
"title": "CandidateAnalysis",
"description": "Résultat d'analyse pour un candidat."
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.
Schemas¶
AnalyzeBatchRequest¶
| Name | Type | Description |
|---|---|---|
candidates |
Array<CandidateProfile> | |
job |
JobDescription | |
weights |
ScoringWeights |
AnalyzeBatchResponse¶
| Name | Type | Description |
|---|---|---|
candidates |
Array<CandidateAnalysis> | |
job_title |
string | |
total_analyzed |
integer |
AnalyzeRequest¶
| Name | Type | Description |
|---|---|---|
candidate |
CandidateProfile | |
job |
JobDescription | |
weights |
ScoringWeights |
CandidateAnalysis¶
| Name | Type | Description |
|---|---|---|
candidate_id |
||
candidate_name |
||
dimension_scores |
Array<DimensionScore> | |
fit_level |
string | excellent | good | moderate | weak |
gaps |
Array<string> | |
overall_score |
number | |
strengths |
Array<string> | |
summary |
string |
CandidateProfile¶
| Name | Type | Description |
|---|---|---|
certifications |
Array<> | |
diplomas |
Array<Diploma> | |
email |
||
experiences |
Array<Experience> | |
firstname |
||
id |
||
languages |
Array<string> | |
lastname |
||
location |
||
raw_text |
||
skills |
Array<string> |
CompetencyFileRequest¶
| Name | Type | Description |
|---|---|---|
competency_text |
string | |
job |
JobDescription | |
weights |
ScoringWeights |
DimensionScore¶
| Name | Type | Description |
|---|---|---|
details |
string | |
dimension |
string | |
score |
number |
Diploma¶
| Name | Type | Description |
|---|---|---|
degree |
string | |
end_date |
string | |
field_of_study |
string | |
school |
string | |
start_date |
string |
Experience¶
| Name | Type | Description |
|---|---|---|
company |
string | |
description |
string | |
end_date |
string | |
location |
string | |
start_date |
string | |
title |
string |
HealthResponse¶
| Name | Type | Description |
|---|---|---|
status |
string | |
version |
string |
HTTPValidationError¶
| Name | Type | Description |
|---|---|---|
detail |
Array<ValidationError> |
JobDescription¶
| Name | Type | Description |
|---|---|---|
description |
string | |
location |
||
min_experience_years |
||
preferred_skills |
Array<string> | |
remote_policy |
onsite | hybrid | remote | |
required_education |
||
required_languages |
Array<string> | |
required_skills |
Array<string> | |
title |
string |
ScoringWeights¶
| Name | Type | Description |
|---|---|---|
education |
number | |
experience |
number | |
languages |
number | |
location |
number | |
skills |
number |
ValidationError¶
| Name | Type | Description |
|---|---|---|
ctx |
||
input |
||
loc |
Array<> | |
msg |
string | |
type |
string |