apyhub
ARTIFICIAL INTELLIGENCE · DATA EXTRACTION

Resume Parser API

What it does

Resume Parser extracts candidate details from a resume or CV file and returns them as structured job data. Send a PDF, DOC, DOCX, TXT, or RTF file, optionally set the resume language, and get back an asynchronous job ID plus a status URL.

Use it when you need to turn unstructured CVs into data you can store, search, or review programmatically. The job status response includes the parsed result with candidate_name, candidate_email, candidate_phone, candidate_address, candidate_language, candidate_spoken_languages, candidate_honors_and_awards, and candidate_courses_and_certifications.

Work history is returned as positions, each with company_name, position_name, start_date, end_date, country, job_details, and skills. Education is returned as education_qualifications, with fields such as school_name, degree_type, school_type, learning_mode, faculty_department, specialization_subjects, education_details, country, start_date, and end_date.

That makes Resume Parser a fit for ATS intake, profile enrichment, internal talent search, and document triage where you need resume content normalized into machine-readable fields.

▣ ENDPOINT 01 / 02
POST
Submit AI Resume Parser job
http://localhost:8080/sharpapi/parse-resume
QUICKSTARTGUIDE

Quickstart

Upload a resume file to start an asynchronous parsing job.

curl -X POST "http://localhost:8080/sharpapi/parse-resume" \
  -H "apy-token: $APY_TOKEN" \
  -F "file=@/path/to/resume.pdf"

What you'll get back

Returns a JSON object with a job_id string and a status_url string for checking the submitted job status.

{
  "status_url": "https://apyhub.com/services/provider/sharpapi/api/v1/hr/parse_resume/job/status/16e4a61a-2e1a-4ddf-87d5-8da9145144a9",
  "job_id": "16e4a61a-2e1a-4ddf-87d5-8da9145144a9"
}
TRY ITLIVE · 50 ATOMS
Loading your default key…
The full key is used to call the gateway and stays in this tab — never sent to orbit or saved.
Max 100MB total per request (all files combined). Larger? Use this API's URL-based endpoint instead, if it has one.
body*
Provide the Resume/CV file in PDF, DOC, DOCX, TXT, or RTF formats.
Specify the language of the Resume, defaults to English.

About this endpoint

What it does

Submits a resume/CV file for asynchronous AI parsing and returns identifiers you can use to check the job’s progress later. The request uploads the file to process, and the response gives you the job ID plus a status URL.

Request Body

ParameterTypeMandatoryDescription
fileStringYesResume/CV file upload. Supported formats: PDF, DOC, DOCX, TXT, or RTF.
languageStringNoLanguage of the resume. Defaults to English.

Response

Returns a JSON object with a job_id string field and a status_url string field. Both fields are returned on success; job_id is a UUID identifier for the submitted async job, and status_url is the URI used to check its status.

ParameterTypeMandatoryDescription
job_idStringYesIdentifier of the submitted asynchronous job. Format: UUID.
status_urlStringYesURL used to check the submitted job status. Format: URI.

Notes

This endpoint kicks off an async job and returns immediately with a job identifier; the actual work runs in the background. Pair this call with the corresponding job_check endpoint — poll that until the status reaches a terminal state to retrieve the result. Use job_id from the response to track the job.

Body

Name
Type
Description
bodyREQUIRED
object

Max 100MB total per request (all files combined). Larger? Use this API's URL-based endpoint instead, if it has one.

▣ ENDPOINT 02 / 02
GET
Get AI Resume Parser job status
http://localhost:8080/sharpapi/parse-resume/job/status/:job_id
QUICKSTARTGUIDE

Quickstart

Check the status of a parsed resume job by its job ID.

curl -X GET "http://localhost:8080/sharpapi/parse-resume/job/status/:job_id" \
  -H "apy-token: $APY_TOKEN"

What you'll get back

Returns a JSON object with a data object. The data object includes id, type, and attributes; attributes contains the job status and, when available, a result object with the parsed resume details.

{
  "data": {
    "id": "job_123",
    "type": "job",
    "attributes": {
      "type": "resume_parse",
      "status": "completed",
      "result": {}
    }
  }
}
TRY ITLIVE · 1 ATOM
Loading your default key…
The full key is used to call the gateway and stays in this tab — never sent to orbit or saved.

About this endpoint

What it does

Retrieves the current status of an AI resume parsing job by job ID. The response returns a JSON object containing a data object with the job identifier, job type, and nested attributes including status and, when available, parsed resume results.

Path Parameter(s)

AttributeTypeMandatoryDescription
job_idStringYesUUID format. Identifies the resume parsing job.

Response

Returns a JSON object with a data object. Inside data, the response includes id and type string fields, plus an attributes object containing type, result, and status fields.

AttributeTypeMandatoryDescription
dataObjectYesWrapper object for the job status payload.
data.idStringYesJob identifier.
data.typeStringYesJob type.
data.attributesObjectYesWrapper object for the status and parsed result fields.
data.attributes.typeStringYesAttribute type.
data.attributes.statusStringYesJob status.
data.attributes.resultObjectNoParsed resume data returned by the job when available.
data.attributes.result.positionsObject ArrayNoArray of position entries extracted from the resume.
data.attributes.result.positions[].skillsString ArrayNoSkills associated with the position.
data.attributes.result.positions[].countryStringNoCountry associated with the position.
data.attributes.result.positions[].end_dateStringNoEnd date for the position. The schema marks this field as nullable.
data.attributes.result.positions[].start_dateStringNoStart date for the position.
data.attributes.result.positions[].job_detailsStringNoJob details.
data.attributes.result.positions[].company_nameStringNoCompany name.
data.attributes.result.positions[].position_nameStringNoPosition name.
data.attributes.result.candidate_nameStringNoCandidate name.
data.attributes.result.candidate_emailStringNoCandidate email.
data.attributes.result.candidate_phoneStringNoCandidate phone.
data.attributes.result.candidate_addressStringNoCandidate address.
data.attributes.result.candidate_languageStringNoCandidate language.
data.attributes.result.education_qualificationsObject ArrayNoArray of education qualification entries.
data.attributes.result.education_qualifications[].countryStringNoCountry associated with the education record.
data.attributes.result.education_qualifications[].end_dateStringNoEnd date for the education record.
data.attributes.result.education_qualifications[].start_dateStringNoStart date for the education record.
data.attributes.result.education_qualifications[].degree_typeStringNoDegree type.
data.attributes.result.education_qualifications[].school_nameStringNoSchool name.
data.attributes.result.education_qualifications[].school_typeStringNoSchool type.
data.attributes.result.education_qualifications[].learning_modeStringNoLearning mode.
data.attributes.result.education_qualifications[].education_detailsStringNoEducation details.
data.attributes.result.education_qualifications[].faculty_departmentStringNoFaculty or department.
data.attributes.result.education_qualifications[].specialization_subjectsStringNoSpecialization subjects.
data.attributes.result.candidate_spoken_languagesString ArrayNoSpoken languages for the candidate.
data.attributes.result.candidate_honors_and_awardsObject ArrayNoHonors and awards. The schema does not define the item shape.
data.attributes.result.candidate_courses_and_certificationsString ArrayNoCourses and certifications for the candidate.

Notes

This endpoint is a job status check. Poll it with the job-id path parameter returned by the matching submit call. The data.attributes.status field indicates job progress and completion state, and the parsed resume fields are carried under data.attributes.result when the job has produced output.

Path parameters

Name
Type
Description
job_idREQUIRED
string
▣ COMMON ERRORS

Errors any endpoint can return

400bad_request

Required parameter missing or malformed body.

401unauthorized

API key missing, revoked, or not authorized for this service.

429rate_limited

Your plan's per-second rate exceeded. Retry with exponential backoff.

503upstream_busy

Backend temporarily unavailable. Try again in a few seconds.