For applicant tracking systems

Turn every application CV into a structured ATS record

Call HireLayer from your upload service and get the CV back as candidate, experience, education, language and skill fields mapped to your schema. Then add a criterion-by-criterion fit view for each job, so recruiters see why a candidate is on top.

An ATS application screen. The applicant's CV has been parsed into a candidate record with title, location, experience level, languages and skills. A fit panel lists three job criteria with match statuses and a weighted score of 0.87.

The problem

Where application intake breaks down

Your customers judge the ATS on the first minutes of an application: how long it takes to apply, and how usable the record is when a recruiter opens it.

  1. 01

    Applicants retype what their CV already says

    A form that asks for work history after the CV upload adds a step to every application. Your customers see it in their funnel, then raise it at renewal.

  2. 02

    Parsing is expected, and costly to own

    Applicants send PDFs, Word files, slides and phone photos. Keeping an in-house parser reliable across formats and languages becomes a product of its own.

  3. 03

    Wrong files turn into empty records

    Cover letters, ID scans and blank exports land in the CV slot. Without a check, they create candidate records that nobody can search.

  4. 04

    A score without reasons is hard to defend

    Recruiters on your platform get asked why a candidate ranks first. A single opaque number does not survive that conversation with a hiring manager.

How it fits

Where HireLayer sits in your application pipeline

Your ATS stays the system of record. Calls happen server-side, at two moments your product already has: when a CV is uploaded, and when a recruiter reviews applications for a job.

  1. Your system

    Step 1, your system: An applicant submits a CV

    Your upload service receives the file with the application, from your career page or a job board integration.

  2. HireLayer

    Step 2, HireLayer API: Parse the document

    Send the file with application_id set to your application id. V3 returns the JSON in the same response.

    POST /api/v3/parser

    • info_candidate
    • work_experiences[]
    • educations[]
    • languages[]
    • skills[]
  3. Your system

    Step 3, your system: Prefill and store

    Map the fields to your candidate model and index info_resume.text for full-text search. Show the applicant a review step if your flow has one.

  4. HireLayer

    Step 4, HireLayer API: Extract job criteria once per job

    When a recruiter publishes a job, turn its description into weighted criteria they can adjust before matching.

    POST /api/v1/jobs/extract-criteria

    • matching_criteria[]
  5. HireLayer

    Step 5, HireLayer API: Explain fit for each application

    Send the CV text with the stored criteria. Save score, summary and evaluated_criteria with the application.

    POST /api/v1/matching/job-candidate

    • score
    • evaluated_criteria[]
  6. Your system

    Step 6, your system: The recruiter decides

    Your interface shows the statuses next to the CV. Knockout rules on mandatory criteria remain your product’s logic.

Want to see the full response for a real CV before writing any code?

Open the parser demo
Wink logo

Customer story

Wink runs all five HireLayer APIs inside its ATS

Wink is an applicant tracking system used by more than 500 companies. Imported CVs arrive as filled candidate profiles, and every job gets its candidates matched and ranked.

Jules DesclousCo-founder | Product · Wink
companies recruit with Wink
500+
job boards Wink publishes to
70+
saved per application by CV parsing
2 min+

Figures published by Wink on wink-lab.com.

Illustration: a CV file is sent to HireLayer CV Extract with POST /api/v3/parser. The response fills a candidate profile in Wink: photo from info_resume.face_url, contact details from info_candidate, experience from work_experiences, education from educations and skills from skills. Below, HireLayer Match gives the candidate a fit of 0.87 for a Senior Full Stack Developer job, with one criterion ideal and one potential, and HireLayer Rank places them first of 12 applicants.

Field mapping

From parser JSON to your candidate schema

Every field below is part of the V3 response. Map them once, and each new application arrives with its record already filled in.

Mapping between HireLayer parser response fields and typical ATS candidate fields
info_candidate.full_name · email · phone_numberContact detailsfirst_name and last_name are also returned separately.
info_candidate.job_titleCurrent titleThe title the candidate presents, as written.
info_candidate.experience_levelSeniority filterOne of five brackets, from “0 to 1 year” to “More than 10 years”.
work_experiences[]Employment historyISO dates, contract_type, currently_active and experience_duration in months.
educations[].degree_typeEducation levelEQF levels such as “Level 7”, with school and dates.
languages[].levelLanguage proficiencyNormalized to CEFR levels A1 to C2.
skills[]Skill tagsTyped as hard, soft or software skill, with a raw or normalized status.
info_candidate.locationLocation filtersCity, region, ISO country code and coordinates.
info_resume.textFull-text indexAlso the candidate_text input for Match and Rank.
An application form showing an upload error: the file looks like a cover letter, and the applicant is asked to upload a CV. The API returned HTTP 422 with code DOCUMENT_NOT_A_RESUME.

Guard the CV slot

DOCUMENT_NOT_A_RESUME, DOCUMENT_UNREADABLE and DOCUMENT_TEXT_EMPTY come back as HTTP 422, so your form can ask for another file instead of saving an empty record.

Technical example

An upload handler, end to end

A TypeScript sketch of the call your upload service makes. It handles documents that are not CVs, then stores the fields on the application.

application_id
Your own reference, sent with the file.
422 · code
A machine-readable reason you can turn into an upload message.
info_resume.text
The CV text, reused as candidate_text by Match and Rank.
Request · TypeScript/api/v3/parser
// Runs in your upload service, never in the browser
const form = new FormData()
form.append('file', new Blob([cvBuffer]), fileName)
form.append('application_id', application.id)

const res = await fetch('https://onlineresumeparser.com/api/v3/parser', {
  method: 'POST',
  headers: { 'X-API-Key': process.env.HIRELAYER_API_KEY! },
  body: form,
})

if (res.status === 422) {
  // DOCUMENT_NOT_A_RESUME, DOCUMENT_UNREADABLE, DOCUMENT_TEXT_EMPTY…
  const { code } = await res.json()
  return askApplicantForAnotherFile(code)
}

const cv = await res.json()
await candidates.update(application.id, {
  fullName: cv.info_candidate.full_name,
  email: cv.info_candidate.email,
  currentTitle: cv.info_candidate.job_title,
  seniority: cv.info_candidate.experience_level,
  history: cv.work_experiences,
  languages: cv.languages,
  resumeText: cv.info_resume.text,
})

APIs used

The HireLayer APIs behind this workflow

Start with the core APIs, add the others when a feature needs them. All five share one API key and one credit balance.

Compare all products

Outcomes

What your customers get

  • A shorter application

    Applicants confirm prefilled fields instead of typing their history a second time.

  • Searchable records from the first minute

    Each CV becomes filterable fields and indexed text. Older applications can be backfilled by sending their stored files through the same call.

  • Fit a recruiter can challenge

    Each criterion carries a status and a sentence of evidence from the CV, so the result can be checked, not just trusted.

  • One integration, five capabilities

    The same API key and credit balance cover parsing, job criteria, matching, ranking and skills.

FAQ

ATS platforms: frequently asked questions

What does a resume parser integration in an ATS involve?

One multipart POST from your upload service, then a mapping from the JSON to your candidate model. V3 answers synchronously, so a first version needs no queue or callback. A webhook_url can be added if you prefer callbacks.

Can the parser keep our application reference?

Yes. Send your reference as application_id with the file. It comes back in info_resume.application_id, so the response can be written to the right application.

How should our application form react to a file that is not a CV?

Treat an HTTP 422 response as a prompt for the applicant: ask for a CV and keep the application open rather than creating a candidate with empty fields. The error code tells your form whether the file was not a CV, unreadable or without text.

Can retention differ between the employers using our ATS?

Yes. The do_not_store_data flag is set per request, so your intake service can turn it on for employers whose policies require it and leave the default, false, for the others.

Can recruiters in our ATS see why an applicant got their score?

Yes. Match explains every criterion and gives it a status, and the total is a weighted average of those statuses, from 1 for ideal down to 0 for not_valid. Your candidate screen can show that breakdown next to the score instead of a bare number.

Map a real CV to your schema

Create an account to get an API key and send your first application CV. The free plan includes 50 credits a month, shared by all five APIs.