Skip to content
Ztract
Resumes & CVs

Resumes in any layout, normalized in one shape.

Full name, email, phone, location, candidate summary, work experience, education, and skills — extracted out of any resume layout and ready to feed an ATS or sourcing pipeline.

Live demo

See it on a real document.

Click a field on the right and we'll highlight where it came from on the left.

Click any field or any boxed region to link them.
Resume — page 1

Extracted fields

Skills

Education

Major Degree School End date Start date

Work experience

Title Company End date Start date Description

Sample data. Real engine output.

Overview

What is resume parsing?

Resume parsing — also called CV parsing or résumé extraction — is the process of turning a free-form resume document (PDF, DOCX, image) into structured candidate data. Every applicant tracking system (ATS) and sourcing platform sits on top of this layer. Done with regex and templates, parsing breaks the moment a candidate uses a non-standard layout; done with a layout-aware engine, the same schema covers thousands of variations without per-template setup.

On the sample resume above, Ztract returns the candidate's full name, email, phone, and location; the headline summary paragraph; the work experience array with each role's title, company, and start/end dates; the education array with school, degree, and major; and the skills array — each skill as its own clickable chip linked back to where it appears on the page. The sample resume is for a UX Designer with three roles and two degrees; the output is ready to ingest into Greenhouse, Lever, or Workday in seconds.

Two design choices matter here. First, skills come back as a typed array of strings — not a comma-separated blob — so downstream skill-matching can compare against a candidate database without further string-splitting. Second, dates are normalized: 'Jun 2023', '06/2023', '2023-06', and 'Present' all land in a sortable format. Multi-column resumes, sidebars, and 'creative' layouts that confuse most parsers are read in the right column order.

Hard parts

Where this gets tricky.

The reasons this doc type is harder than it looks — and how we handle them.

  • 100+ layout variations

    Chronological, functional, hybrid, two-column, sidebar, 'creative' layouts with icon grids. The engine reads reading-order correctly regardless of how the page is arranged.

  • Dates in five formats

    'Jun 2023', '06/2023', '2023-06', 'Summer 2023', 'Present' — all normalized to a single sortable date format so downstream filtering and tenure calculations work cleanly.

  • Skills as paragraphs, bullets, or icon grids

    Some resumes list skills as 'Python, SQL, React'. Others use bullet points. Others use proficiency bars or icon grids. All come back as a flat array of skill strings.

  • Summary paragraphs preserved

    The candidate-headline summary is free prose, not a labeled field — and it's the single most important sentence for recruiters. The engine extracts it verbatim, not as bullet fragments.

Who uses it

Workflows this lands in.

  • ATS feeders

    Push parsed resumes into Greenhouse, Lever, or Workday Recruiting with structured experience and skills already populated.

  • Sourcing teams

    Dedupe inbound candidates by email/phone, then search the skills array across thousands of resumes in any layout.

  • HR ops

    Standardize the shape of every resume — title, company, dates, skills — for downstream reporting on headcount, DEI, and comp benchmarks.

FAQ

Common questions.

What resume formats does Ztract support?
PDF, Word (.docx), scanned PDFs, PNG, JPG, and other common image formats. For best accuracy use the original PDF or .docx rather than a screenshot — the engine reads vector text more precisely than rasterized images.
Does it work for resumes in languages other than English?
Yes. Latin scripts (English, French, German, Spanish, Portuguese), CJK (Chinese, Japanese, Korean), Cyrillic, and Arabic are supported. The schema (name, contact, experience, education, skills) is consistent regardless of input language.
How are skills returned?
As a flat array of strings — one skill per array entry. Whether the resume printed them as bullets, comma-separated text, or icon grids, the output is normalized. This makes skill-matching against a job description trivial.
Will it parse work experience with overlapping or 'Present' dates?
Yes. Overlapping roles come back as separate experience entries (no deduplication). 'Present', 'Current', and similar end-date strings are normalized to a sentinel value downstream tools can detect.
Can I integrate this with my existing ATS?
Today, you upload via the dashboard and export to JSON, CSV, or Excel — most ATSes accept one of those for batch import. An HTTP API for direct integration is on the roadmap.

Try it on your own document.

Start free with 30 pages. No credit card, no subscription, no setup.