Resume Parser API
v1.0AI-powered API that extracts 20+ structured fields from any resume: contact details, work history, skills, education, and more.
Overview
Resume Parser API automates the tedious process of manually entering candidate information from resumes into your systems. Upload a PDF, DOCX, image, or archive, and receive clean structured JSON ready to import into your ATS, CRM, or recruitment workflow.
🤖 AI-Powered
Frontier models extract 20+ fields regardless of layout or template
📄 All Formats
PDF, DOCX, JPEG, PNG, ZIP, and 7z — one unified endpoint
📸 OCR Included
Process scanned PDFs and resume photos directly
💡 Perfect For
- • Recruitment agencies and ATS platforms automating candidate data entry
- • HR departments eliminating manual profile creation
- • Job boards and HRIS platforms normalizing candidate profiles
- • Staffing firms processing high volumes of applications
Quick Start
Base URL
https://api.cparse.com/resume/v1Authentication
X-API-Key: YOUR_API_KEYGet your API key from the dashboard. New accounts include free credit — no credit card required.
Quick Example
Upload a resume and extract all fields:
cURL
curl --request POST \
--url https://api.cparse.com/resume/v1/parse \
--header 'X-API-Key: YOUR_API_KEY' \
--form 'file=@resume.pdf'Endpoints
/healthHealth check endpoint. Returns service status.
Response
{ "status": "ok", "service": "resume-parser", "version": "0.1.0" }/parseParse a resume file and return structured JSON with all extracted fields.
Request
Content-Type: multipart/form-datafile(required): PDF, DOCX, JPEG, PNG, or ZIP / 7z archive containing one of the above
Response
[
{
"success": true,
"file_name": "resume.pdf",
"data": {
"name": "Jane Smith",
"headline": "Senior Software Engineer",
"email": "jane.smith@example.com",
"phone": "+12025551234",
"linkedin": "https://linkedin.com/in/janesmith",
"links": ["https://github.com/janesmith"],
"location": "San Francisco, CA",
"summary": "Experienced full-stack engineer with 7 years...",
"skills": ["python", "javascript", "react", "aws", "docker"],
"languages": [
{ "language": "English", "proficiency": "Native" },
{ "language": "Spanish", "proficiency": "B2" }
],
"certifications": ["AWS Certified Solutions Architect - Associate (2023)"],
"experience": [
{
"title": "Senior Software Engineer",
"company": "Tech Corp",
"location": "San Francisco, CA",
"employment_type": "Full-time",
"work_style": "Hybrid",
"start_date": "2021-03",
"end_date": "Present",
"description": "- Led development of microservices architecture.\n- Reduced deploy time by refactoring CI/CD pipelines.",
"tech_stack": ["react", "node.js", "aws", "docker"]
}
],
"education": [
{
"degree": "BSc Computer Science",
"institution": "University of Edinburgh",
"date": "2019"
}
],
"projects": [
{
"name": "OpenRecruite",
"description": "Open-source ATS built with Next.js",
"technologies": ["next.js", "postgres", "prisma"]
}
]
},
"ocr_used": false,
"pages_processed": 2
}
]Response Fields
| Field | Type | Description |
|---|---|---|
name | string | Full name |
headline | string | Professional headline or current title |
email | string | Primary email address |
phone | string | Phone number in E.164 format (+12025551234) |
linkedin | string | Full LinkedIn profile URL |
links | string[] | Other URLs: GitHub, portfolio, personal site, etc. |
location | string | City, Country or full location string |
summary | string | Professional summary or profile text |
skills | string[] | Skills — lowercase, deduplicated (technical and soft) |
languages | object[] | Spoken languages with optional proficiency level |
certifications | string[] | Certifications, with year in parentheses if present |
courses | object[] | Courses with name, optional provider and date |
experience | object[] | Work history — see structure below |
education | object[] | Education: degree, institution, date |
projects | object[] | Projects: name, description, technologies |
publications | object[] | Publications: title, publisher, date |
awards | object[] | Awards: title, issuer, date |
volunteering | object[] | Volunteering: role, organization, dates, description |
patents | object[] | Patents: title, patent_number, date |
talks | object[] | Talks: title, event, date |
professional_affiliations | object[] | Memberships: organization, role, dates |
referees | object[] | References: name, title, organization, phone, email |
Experience Object
| Field | Type | Description |
|---|---|---|
title | string | Job title |
company | string | Company name |
location | string | Geographic location (City, Country) |
employment_type | string | Full-time, Contract, Freelance, Internship, etc. |
work_style | string | Remote, Hybrid, or On-site |
start_date | string | YYYY-MM or YYYY |
end_date | string | YYYY-MM, YYYY, or "Present" |
description | string | Full role description — bullet points joined with \n |
tech_stack | string[] | Technologies used specifically in this role |
Error Handling
| Status | Error | Solution |
|---|---|---|
| 400 | No file provided | Include a file in the multipart form body |
| 400 | Invalid or corrupted archive | Ensure archive contains exactly one supported file |
| 401 | Authentication required | Pass X-API-Key header with a valid key |
| 413 | File size exceeds limit | Reduce the file size and retry |
| 413 | Document exceeds page limit | Split the document and retry |
| 413 | Image dimensions exceed limit | Resize image to 2048px or smaller per side |
| 415 | Unsupported file type | Use PDF, DOCX, JPEG, PNG, ZIP, or 7z |
| 415 | Image processing requires OCR support | Use a text-based PDF or DOCX for best results |
| 500 | AI processing failed | Retry or contact support |
Tips
📌 Best Practices
- Images and scanned PDFs — JPEG/PNG resumes and scanned PDFs use OCR. Images must be 2048px or smaller on each side.
- Image size limit — Resize images to 2048px or smaller before uploading.
- Omit vs. null — Fields absent from the resume are omitted from the response entirely, not returned as null.
- Tech stack vs. skills —
skillslists all skills across the resume.tech_stackinside each experience entry lists technologies specific to that role. - Archives — ZIP and 7z archives must contain exactly one supported file. Multiple files are rejected.
🔒 Security & Privacy
- ✅ Files processed in memory, never written to disk or stored
- ✅ All requests over HTTPS
- ✅ API key authentication required on every request
- ✅ GDPR and CCPA compliant
Code Examples
Python
import requests
url = "https://api.cparse.com/resume/v1/parse"
headers = {"X-API-Key": "YOUR_API_KEY"}
with open("resume.pdf", "rb") as f:
response = requests.post(url, files={"file": f}, headers=headers)
result = response.json()
resume = result[0]["data"]
print(resume.get("name"), resume.get("email"))
print("Skills:", resume.get("skills"))
print("Experience:", len(resume.get("experience", [])), "roles")JavaScript (Node.js)
import FormData from 'form-data';
import fs from 'fs';
import axios from 'axios';
const form = new FormData();
form.append('file', fs.createReadStream('resume.pdf'));
const response = await axios.post(
'https://api.cparse.com/resume/v1/parse',
form,
{
headers: {
...form.getHeaders(),
'X-API-Key': 'YOUR_API_KEY',
},
}
);
const [result] = response.data;
const { name, email, skills, experience } = result.data;
console.log(name, email);
console.log('Skills:', skills);
console.log('Experience:', experience?.length, 'roles');