Skip to main content
Référence API v2

Documentation API

Automatisez l'analyse, l'appariement et la génération de CV pour un recrutement efficace et conforme au RGPD.

BaseURL de base {{baseapiurl}} Authorization: ApiKey <key>

Accueil

Résumé de la surface API documentée avant la référence détaillée des endpoints.

RessourceEndpointsChemin de baseFonctionnalités
Resumes & CV parsing6/api/v2/resumesExtended parsing, file parsing, and resume CRUD
Jobs6/api/v2/jobsFile parsing, filters, and job CRUD
Recruiter scores4/api/v2/scoresStored-resource matching and ranking webhooks
PDF generation3/api/v2/pdf-generationSettings, single PDF, and webhook batches
19 endpoints documentésAuthentification par clé APIRéponses JSON, multipart et PDF

Schémas et modèles JSON

Ces modèles correspondent aux DTO, entités, noms de propriétés Jackson et enveloppes de réponse utilisés par cette page.

DocumentationResumeRequest → UpdateResumeDto

Resume write request

Used by POST and PUT /api/v2/resumes. The resume payload is always nested under the resume key.

ParserResponseDTO

Parsed resume response

Returned by POST /api/v2/resumes/parser. It is the normalized parser response, not the CVXml resource returned by GET /api/v2/resumes/{resumeId}.

DocumentationService

Resume resource envelopes

Create and read return CVXml under resume. Update returns the normalized UpdateResumeDto under resume. CVXml uses legacy French field names.

Job entity

Job request and response

POST and PUT accept the Job entity. PUT replaces the documented fields, so send every value that must be preserved. Server responses may also include id, filePath, pauseReason, jobskills, createdAt, and updatedAt.

DocumentationService / DocumentationJobService

Resume and job list envelopes

Both list endpoints use the same pagination keys. The collection key differs by resource.

RecruiterScoreDto

Recruiter score response

Returned by both synchronous matching endpoints and included in ranking-webhook payloads.

ResumeSettings, ColorSettings, SectionSettings, ResumeCanvasImage

PDF generation settings

Used by PUT /api/v2/pdf-generation/settings. Section id is read-only; canvas image id is generated by the server.

WebhookController.WebhookSettingsDto / DocumentationPdfService

Webhook settings and queue responses

Webhook registration uses recruiter-session authentication. The v2 PDF webhook endpoint returns the accepted batch response shown below.

API Analyse (Parser)

Parse, create, read, update, and delete resumes owned by the API key user.

Resume client responses: the 3 schemas you need

These are the exact successful response shapes your client should deserialize. Detailed CVXml and UpdateResumeDto fields remain in the Schemas section.

POST /api/v2/resumes/parser

1. Parse a file

Send:Send multipart/form-data: file (required), parserType (optional).

Receive:Read the persisted ParserResponseDTO response.

POST /api/v2/resumes

2. Create a structured resume

Send:Send application/json. The resume wrapper is required.

Receive:Store id from the created CVXml envelope; it is the resumeId for later calls.

PUT /api/v2/resumes/{resumeId}

3. Update an existing resume

Send:Use the same required { resume: ... } wrapper as create.

Receive:The response contains the id and the UpdateResumeDto that was saved.

POST/api/v2/resumes/parser

Parse a CV file

Parse and persist a CV uploaded as a multipart file.

Request

multipart/form-data · file (file) · parserType? (string)

Success

200 · JSON or XML · persisted ParserResponseDTO

400 — Invalid CV file401 — Invalid or missing API key402 — Insufficient credits403 — File parsing is not allowed
curl -X POST "{{baseapiurl}}/api/v2/resumes/parser" \
  -H "Authorization: ApiKey YOUR_API_KEY" -H "Accept: application/json" \
  -F "file=@resume.pdf" -F "parserType=premium"

Response schema

ParserResponseDTO

DocumentationResumeController.parseResume
GET/api/v2/resumes

List owned resumes

Return a paginated collection containing only resumes owned by the API-key user.

Request

query · page? (number, default 0) · size? (number, default 10)

Success

200 · { resumes, currentPage, totalItems, totalPages }

curl -X GET "{{baseapiurl}}/api/v2/resumes?page=0&size=10" \
  -H "Authorization: ApiKey YOUR_API_KEY"

Response schema

Paginated resume collection

DocumentationService.getResumes
POST/api/v2/resumes

Create a resume

Create a structured resume. Send DocumentationResumeRequest ({ resume: UpdateResumeDto }); a CVXml-shaped resource from a read response is also accepted.

Request

application/json · DocumentationResumeRequest

Success

201 · Location: /api/v2/resumes/{id} · { id, resume: CVXml }

400 — Invalid resume payload401 — Invalid or missing API key
curl -X POST "{{baseapiurl}}/api/v2/resumes" \
  -H "Authorization: ApiKey YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"resume": {"candidate": { "firstName": "Ada", "lastName": "Lovelace", "personalEmail": "ada@example.com" },"profile": "Backend engineer","experiences": [], "educations": [], "languages": [], "skills": [],"softSkills": [], "references": []}}'

Response schema

Created resume envelope

DocumentationService.createResume
GET/api/v2/resumes/{resumeId}

Get an owned resume

Return one resume when the UUID exists and belongs to the API-key user.

Request

path · resumeId (UUID)

Success

200 · { id, resume: CVXml }

401 — Invalid or missing API key403 — Resume is not owned by the API-key user404 — Resume not found
curl -X GET "{{baseapiurl}}/api/v2/resumes/RESUME_UUID" \
  -H "Authorization: ApiKey YOUR_API_KEY"

Response schema

Resume envelope

DocumentationService.getResume
PUT/api/v2/resumes/{resumeId}

Update an owned resume

Update a resume using the same DocumentationResumeRequest wrapper used when creating one.

Request

path · resumeId (UUID) · application/json · DocumentationResumeRequest

Success

200 · { id, resume: UpdateResumeDto }

401 — Invalid or missing API key403 — Resume is not owned by the API-key user404 — Resume not found
curl -X PUT "{{baseapiurl}}/api/v2/resumes/RESUME_UUID" \
  -H "Authorization: ApiKey YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"resume": {"candidate": { "firstName": "Ada", "lastName": "Lovelace", "personalEmail": "ada@example.com" },"profile": "Backend engineer","experiences": [], "educations": [], "languages": [], "skills": [],"softSkills": [], "references": []}}'

Response schema

Updated resume envelope

DocumentationService.updateResume
DELETE/api/v2/resumes/{resumeId}

Delete an owned resume

Delete a resume owned by the API-key user.

Request

path · resumeId (UUID)

Success

204 · no content

401 — Invalid or missing API key404 — Resume not found
curl -X DELETE "{{baseapiurl}}/api/v2/resumes/RESUME_UUID" \
  -H "Authorization: ApiKey YOUR_API_KEY"

Response schema

No response body

DocumentationService.deleteResume

API Offres (Jobs)

Parse job files and manage structured job postings for the authenticated user.

POST/api/v2/jobs/parser

Parse and save a job file

Parse a job description uploaded as a multipart file and create the resulting job for the authenticated user.

Request

multipart/form-data · file (file)

Success

200 · application/json · created Job

400 — Invalid job file401 — Invalid or missing API key
curl -X POST "{{baseapiurl}}/api/v2/jobs/parser" \
  -H "Authorization: ApiKey YOUR_API_KEY" \
  -F "file=@job-description.pdf"

Response schema

Job

DocumentationJobController.parseJob
GET/api/v2/jobs

List owned jobs

Return a paginated, filterable collection of jobs owned by the API-key user.

Request

query · page? · size? · status? · source? · reference? · title? · postedFrom? · postedTo? (ISO date-time)

Success

200 · { jobs, currentPage, totalItems, totalPages }

curl "{{baseapiurl}}/api/v2/jobs?page=0&size=20&status=ACTIVE&title=engineer" \
  -H "Authorization: ApiKey YOUR_API_KEY"

Response schema

Paginated job collection

DocumentationJobService.getJobs
POST/api/v2/jobs

Create a job

Create a structured job posting from the Job entity. The full writable JSON template is in Schemas; the response adds server-generated fields.

Request

application/json · Job object

Success

201 · created Job

401 — Invalid or missing API key
curl -X POST "{{baseapiurl}}/api/v2/jobs" \
  -H "Authorization: ApiKey YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data @job.json

Response schema

Job

DocumentationJobService.createJob
GET/api/v2/jobs/{jobIdOrReference}

Get an owned job

Find a job using either its UUID or its reference, and return it only when owned by the API-key user.

Request

path · jobIdOrReference (UUID or string reference)

Success

200 · Job resource

curl "{{baseapiurl}}/api/v2/jobs/JAVA-001" \
  -H "Authorization: ApiKey YOUR_API_KEY"

Response schema

Job

DocumentationJobService.getJob
PUT/api/v2/jobs/{jobIdOrReference}

Update an owned job

Update a job identified by UUID or reference. The backend assigns every documented writable Job field, so send the complete Job payload to avoid clearing values.

Request

path · jobIdOrReference · application/json · Job object

Success

200 · updated Job resource

curl -X PUT "{{baseapiurl}}/api/v2/jobs/JAVA-001" \
  -H "Authorization: ApiKey YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data @job.json

Response schema

Job

DocumentationJobService.updateJob
DELETE/api/v2/jobs/{jobIdOrReference}

Delete an owned job

Delete a job identified by UUID or reference.

Request

path · jobIdOrReference (UUID or string reference)

Success

204 · no content

curl -X DELETE "{{baseapiurl}}/api/v2/jobs/JAVA-001" \
  -H "Authorization: ApiKey YOUR_API_KEY"

Response schema

No response body

DocumentationJobService.deleteJob

API Score

Run full matches and deliver top candidate or job rankings through webhooks.

POST/api/v2/scores/match

Fully match stored resources

Calculate a detailed recruiter score for one stored job and one stored resume.

Request

application/json · jobId (UUID) · candidateId (UUID)

Success

200 · RecruiterScoreDto, including final score ID

400 — jobId and candidateId are required401 — Invalid or missing API key
curl -X POST "{{baseapiurl}}/api/v2/scores/match" \
  -H "Authorization: ApiKey YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"jobId":"JOB_UUID","candidateId":"RESUME_UUID"}'

Response schema

RecruiterScoreDto

DocumentationRecruiterScoreController.fullMatch
POST/api/v2/scores/match/files

Parse and fully match two files

Parse the supplied resume and job files, persist them, and calculate the detailed match score for the created pair.

Request

multipart/form-data · resumeFile (file) · jobFile (file)

Success

200 · RecruiterScoreDto

401 — Invalid or missing API key
curl -X POST "{{baseapiurl}}/api/v2/scores/match/files" \
  -H "Authorization: ApiKey YOUR_API_KEY" \
  -F "resumeFile=@resume.pdf" \
  -F "jobFile=@job.pdf"

Response schema

RecruiterScoreDto

DocumentationRecruiterScoreController.fullMatchFiles
POST/api/v2/scores/jobs/{jobId}/top-candidates/webhook

Queue top candidates webhook

Refresh scores and queue the top 10 fully detailed candidates for a job to the configured webhook.

Request

path · jobId (UUID)

Success

202 · { deliveryId, eventType: "resume.matched", status: "QUEUED", resultCount }

401 — Invalid or missing API key
curl -X POST "{{baseapiurl}}/api/v2/scores/jobs/JOB_UUID/top-candidates/webhook" \
  -H "Authorization: ApiKey YOUR_API_KEY"

Response schema

Queued webhook delivery

DocumentationRecruiterScoreController.queueWebhook
POST/api/v2/scores/resumes/{resumeId}/top-jobs/webhook

Queue top jobs webhook

Queue the top 10 detailed jobs for a resume to the configured webhook.

Request

path · resumeId (UUID)

Success

202 · { deliveryId, eventType: "resume.matched", status: "QUEUED", resultCount }

401 — Invalid or missing API key
curl -X POST "{{baseapiurl}}/api/v2/scores/resumes/RESUME_UUID/top-jobs/webhook" \
  -H "Authorization: ApiKey YOUR_API_KEY"

Response schema

Queued webhook delivery

DocumentationRecruiterScoreController.queueWebhook

Génération de CV

Update resume rendering settings and generate one or more resume PDFs.

PUT/api/v2/pdf-generation/settings

Update PDF generation settings

Update the authenticated user’s ResumeSettings used by PDF rendering. Send the complete settings model when preserving existing values; it includes layout, typography, margins, colors, sections, canvas images, and agency branding.

Request

application/json · ResumeSettings object

Success

200 · updated ResumeSettings

401 — Invalid or missing API key
curl -X PUT "{{baseapiurl}}/api/v2/pdf-generation/settings" \
  -H "Authorization: ApiKey YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data @resume-settings.json

Response schema

ResumeSettings

DocumentationPdfService.updateSettings
POST/api/v2/pdf-generation/resumes/{resumeId}

Generate one resume PDF

Render an owned resume using the current PDF generation settings.

Request

path · resumeId (UUID)

Success

200 · application/pdf · PDF document

401 — Invalid or missing API key404 — Resume not found
curl -X POST "{{baseapiurl}}/api/v2/pdf-generation/resumes/RESUME_UUID" \
  -H "Authorization: ApiKey YOUR_API_KEY" \
  -o resume.pdf

Response schema

PDF binary

DocumentationPdfService.generateResumePdf
POST/api/v2/pdf-generation/webhook

Queue multiple PDFs through a webhook

Queue PDF generation for a list of owned resume UUIDs and deliver the files through the configured webhook.

Request

application/json · array of UUID strings

Success

202 · { jobId, status, total, message, webhookSecurity }

400 — Empty, duplicate, oversized list, or missing pdf.generated webhook401 — Invalid or missing API key403 — One or more resumes are not owned404 — One or more resume IDs were not found429 — Webhook delivery queue is full
curl -X POST "{{baseapiurl}}/api/v2/pdf-generation/webhook" \
  -H "Authorization: ApiKey YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '["RESUME_UUID_1", "RESUME_UUID_2"]'

Response schema

Queued PDF webhook batch

DocumentationPdfService.generatePdfsWithWebhook

Webhooks

Configure signed event deliveries for asynchronous parsing, matching, and PDF generation.

OperationEndpointAuth
Read registrationGET /api/webhookRecruiter session
Create or update registrationPOST /api/webhookRecruiter session
Rotate signing secretPOST /api/webhook/rotate-secretRecruiter session
Top candidates deliveryPOST /api/v2/scores/jobs/{jobId}/top-candidates/webhookApiKey
Top jobs deliveryPOST /api/v2/scores/resumes/{resumeId}/top-jobs/webhookApiKey
PDF batch deliveryPOST /api/v2/pdf-generation/webhookApiKey

Register one HTTPS endpoint and subscribe it to resume.parsed, resume.matched, or pdf.generated. Event deliveries include an ID, timestamp, event header, and an HMAC-SHA256 signature.

Registration payload

{
  "webhookUrl": "https://example.com/cvreader",
  "events": ["resume.parsed", "resume.matched", "pdf.generated"]
}

Delivery headers

X-CVReader-Event: resume.matched
X-CVReader-Delivery-Id: <uuid>
X-CVReader-Timestamp: <unix-seconds>
X-CVReader-Signature: v1=<hmac-sha256>
Verify the signature against <timestamp>.<raw-json-body> using HMAC-SHA256, return any 2xx response to acknowledge delivery, and use the delivery ID for idempotency because retries may repeat the same event.