Document Intelligence

Resume Parser

Turn a resume — plain text, a PDF, or an image — into structured candidate data.

The problem

Applicant tracking systems, recruiting CRMs, and staffing tools all hit the same first step: a resume arrives as unstructured text or a file, and someone has to turn it into searchable, structured fields before it's useful.

Who it's for

Applicant tracking systems, recruiting CRMs, and staffing or HR tools that need to turn a submitted resume into structured, searchable candidate data.

Use cases

  • Populating an ATS candidate record automatically from an uploaded resume
  • Normalizing resumes from different formats and sources into one consistent schema

What it does

Send a resume as plain text, a publicly fetchable file URL, or base64-encoded file data (PDF, image, or plain text), and get back normalized JSON: contact details, a work-history array (company, title, dates, description), education, a skills list, and a confidence score. **PDF resumes:** `file_url` carries an **image** of the resume (jpeg, png, webp, gif). Send a PDF as `base64_file` with `"mime_type": "application/pdf"` — that path is fully supported, and a URL ending in `.pdf` is rejected up front rather than failing later.

Example

Request

POST /parse
{
  "text": "Jane Doe\njane.doe@example.com | (555) 123-4567 | Austin, TX\n\nExperience\nSenior Accountant, Example Manufacturing Co., 2021 - present\n\nEducation\nB.S. Accounting, University of Texas at Austin, 2016\n\nSkills: Excel, QuickBooks, month-end close"
}

Response

Captured live 2026-09-15 from the same text the code samples send, values unedited.

{
  "contact": {
    "name": "Jane Doe",
    "email": "jane.doe@example.com",
    "phone": "(555) 123-4567",
    "location": "Austin, TX"
  },
  "work_history": [
    {
      "company": "Example Manufacturing Co.",
      "title": "Senior Accountant",
      "start_date": "2021",
      "end_date": "present",
      "description": null
    }
  ],
  "education": [
    {
      "institution": "University of Texas at Austin",
      "degree": "B.S.",
      "field": "Accounting",
      "graduation_date": "2016"
    }
  ],
  "skills": [
    "Excel",
    "QuickBooks",
    "month-end close"
  ],
  "confidence": 0.85,
  "withheld": []
}

Calling it directly — real, working requests you can paste and run:

cURL

curl -X POST "https://ai-resume-parser-candidate-data-extraction-api.p.rapidapi.com/parse" \
  -H "content-type: application/json" \
  -H "X-RapidAPI-Key: $RAPIDAPI_KEY" \
  -H "X-RapidAPI-Host: ai-resume-parser-candidate-data-extraction-api.p.rapidapi.com" \
  -d '{"text": "Jane Doe\njane.doe@example.com | (555) 123-4567 | Austin, TX\n\nExperience\nSenior Accountant, Example Manufacturing Co., 2021 - present\n\nEducation\nB.S. Accounting, University of Texas at Austin, 2016\n\nSkills: Excel, QuickBooks, month-end close"}'

Python

import os
import requests

RAPIDAPI_HOST = "ai-resume-parser-candidate-data-extraction-api.p.rapidapi.com"

# Send `file_url` (an image), `base64_file` with `mime_type` (a PDF or image), or `text`.
resp = requests.post(
    f"https://{RAPIDAPI_HOST}/parse",
    json={"text": "Jane Doe\njane.doe@example.com | (555) 123-4567 | Austin, TX\n\nExperience\nSenior Accountant, Example Manufacturing Co., 2021 - present\n\nEducation\nB.S. Accounting, University of Texas at Austin, 2016\n\nSkills: Excel, QuickBooks, month-end close"},
    headers={
        "X-RapidAPI-Key": os.environ["RAPIDAPI_KEY"],
        "X-RapidAPI-Host": RAPIDAPI_HOST,
    },
)
print(resp.json())

Node.js

const RAPIDAPI_HOST = 'ai-resume-parser-candidate-data-extraction-api.p.rapidapi.com';

// Send `file_url` (an image), `base64_file` with `mime_type` (a PDF or image), or `text`.
const res = await fetch(`https://${RAPIDAPI_HOST}/parse`, {
  method: 'POST',
  headers: {
    'content-type': 'application/json',
    'X-RapidAPI-Key': process.env.RAPIDAPI_KEY,
    'X-RapidAPI-Host': RAPIDAPI_HOST,
  },
  body: JSON.stringify({ text: "Jane Doe\njane.doe@example.com | (555) 123-4567 | Austin, TX\n\nExperience\nSenior Accountant, Example Manufacturing Co., 2021 - present\n\nEducation\nB.S. Accounting, University of Texas at Austin, 2016\n\nSkills: Excel, QuickBooks, month-end close" }),
});
console.log(await res.json());

Machine-readable: the OpenAPI 3.1 document for this API, generated from its code — import it into Postman or a client generator. More on the developer page.

A ready-made Postman collection is also available: import it and the shared environment in Postman (Import, then select the file), then set RAPIDAPI_KEY to your RapidAPI key.

Pricing

A free tier of 20 requests a month covers light testing, no card required. Paid plans start at $49/month for 1,000 parses and are hard-capped — calls stop at the limit rather than billing you. Only the top plan (10,000 parses) runs on a soft limit, with overage at $0.02 per additional parse beyond it.

See exact current pricing tiers on RapidAPI →

Privacy commitment. Resumes contain real personal data by definition. Aervik Labs does not store submitted content beyond what’s needed to process the request — no database, no logging of resume content, no retention of any extracted field once the response is returned. Parsing runs on an AI model, so the resume is sent to our model provider, Anthropic, which processes it under its own API data-retention policy. Every request also passes through RapidAPI and Cloudflare (security).

Check confidence, withheld and warnings before trusting a result. Unusual formatting, multi-column layouts, tables, and scanned images can all produce partially wrong or incomplete output. confidence is the model’s own rating; a value outside 0–1, or one that is not a number, is served as 0 with an unreadable_confidence warning, and a missing rating is served as 0 with no warning. An email, phone number or date the model reports but cannot quote from the document comes back as null and is named in withheld, so null with no withheld entry means the model did not report that value. A reply the service cannot use as one complete result — a value of the wrong type, extra text beside the result, or a document too long for one response — is refused with a 422 rather than returned in part. A document with no readable text, and one the model provider refuses, are also answered with a 422.

What it does not do.

  • One resume per request, as text up to 50,000 characters or a file up to 15,000,000 base64 characters. DOCX and other office formats are not supported: convert to PDF or plain text.
  • Dates are returned as YYYY, YYYY-MM or YYYY-MM-DD, or the word present, in whatever capitalization the model returned it, for an ongoing role; a month or day read from a date printed only in numbers whose day and month could be read either way round is withheld, though the year alone can still be returned. Month names are read in English; accuracy on other languages has not been measured.
  • Skills are the model’s reading of the resume, not checked against the document and not mapped to a skills taxonomy.

This API does not classify or rank the candidate. It returns what the model reads from the document you sent: contact details, jobs, education and skills. Email, phone and dates are returned only when the characters the model quotes from the document support them; the other fields are not checked that way and can be worded differently from the document. A seniority estimate was removed on 2026-09-11 — it was the one output that judged a person rather than read a page, and a model-produced seniority label offered for candidate routing is the shape hiring-AI rules such as NYC Local Law 144 govern. Nothing replaces it, and the model is no longer asked for it.

Try Resume Parser on RapidAPI