Resume Parser
Experience parsing

Work Experience Extraction

Structured job history with start and end dates, titles, and per-role descriptions

Parse job titles, organizations, dates and role descriptions from PDF resumes. Handles "Present" dates and overlapping roles.

How it works

  1. 1

    Experience section detection

    The parser identifies work experience regardless of the heading used, such as "Work Experience", "Professional History", "Employment", or a heading in another language.

  2. 2

    Individual role extraction

    Each position becomes a separate object with title, organization, location and skillsDescription. Multiple roles at the same company (promotions) are returned as separate entries.

  3. 3

    Dates as month and year numbers

    Dates are returned as numeric startMonth, startYear, endMonth and endYear fields, with month names in other languages translated to English first. Ongoing roles have isOngoing: true and null end dates.

  4. 4

    Description as markdown

    Bullet points and paragraphs under each role are returned as markdown in skillsDescription, in the candidate's own words and language.

Key Benefits

Full career timeline

The parser is built to return every role listed, including internships, part-time positions and freelance work, not just the most recent few.

Consistent date fields

Whatever format the resume uses, dates come back in the same startMonth/startYear/endMonth/endYear structure, with isOngoing for current positions.

Company names as written

Organization names keep legal suffixes (GmbH, Ltd, Oy) and local naming, so you can match against your own company data.

Per-role descriptions

The skillsDescription field shows what the candidate actually did in each role. "Migrated 200 microservices to Kubernetes" tells you more than "Kubernetes".

Code examples

API response (data.workExperiences)json
{
  "workExperiences": [
    {
      "title": "Senior Software Engineer",
      "organization": "Example Corp",
      "location": "Helsinki, Finland",
      "skillsDescription": "- Led development of the platform's event-driven services\n- Mentored junior engineers",
      "startMonth": 3,
      "startYear": 2021,
      "endMonth": null,
      "endYear": null,
      "isOngoing": true
    },
    {
      "title": "Software Engineer",
      "organization": "Example Startup Oy",
      "location": "Espoo, Finland",
      "skillsDescription": "- Built REST APIs in Python and Django\n- Set up the CI/CD pipeline",
      "startMonth": 6,
      "startYear": 2018,
      "endMonth": 2,
      "endYear": 2021,
      "isOngoing": false
    }
  ],
}

Technical Details

Work experience extraction uses a large language model to identify and segment individual job entries from the resume text. Job titles are returned in title case, with well-known abbreviations like CEO or IT kept in caps. Month names written in other languages are translated to English before being converted to numbers, and "Present" marks a role as ongoing. Descriptions are returned as markdown without editing the grammar or language. The API is hosted on Hetzner in Helsinki, Finland; /v1/parse does not store the PDF or the parsed result, and resume text is processed by OpenAI (US) as a subprocessor.

Questions

Frequently asked questions

Each position is extracted with its own date range. If a candidate held two jobs at the same time, both appear in the workExperiences array with their own dates.

Yes. Each title at the same organization is a separate entry with its own dates and description. The organization field is the same, so you can group them.

The text written under each job entry, formatted as markdown, with the job title, organization and dates removed since they have their own fields. It is not a normalized skill list.

Compare parsed work history against manual entry

50 free parses per month. Run your own resumes through the API and compare the extracted workExperiences against manual data entry.

Get API key