API Reference
The CV Parser Pro API is organized around REST. Our API has predictable resource-oriented URLs, accepts JSON-encoded request bodies, returns JSON-encoded responses, and uses standard HTTP response codes and authentication.
https://cvparserpro.com/api/v1Authentication
The CV Parser Pro API uses API keys to authenticate requests. Include your API key in theX-API-Key header with every request.
curl https://cvparserpro.com/api/v1/candidates \
-H "X-API-Key: ts_your_api_key_here"Keep your API keys secure. Do not share them in publicly accessible areas such as GitHub, client-side code, or public repositories.
Quickstart
Parse a CV in three steps:
1Upload a CV file
curl -X POST https://cvparserpro.com/api/v1/parse \
-H "X-API-Key: ts_your_api_key" \
-F "[email protected]"Response includes candidate ID and credits remaining.
2Wait for parsing (15-30 seconds)
curl https://cvparserpro.com/api/v1/candidates/{candidate_id} \
-H "X-API-Key: ts_your_api_key"
# Poll until parsing_status = "completed"3Get structured data
{
"data": {
"id": "8b212bcd-a0d0-4a08-bc29-ba932b713ec1",
"full_name": "John Smith",
"email": "[email protected]",
"current_title": "Senior Software Engineer",
"years_of_experience": 8,
"skills": ["Python", "JavaScript", "React", "AWS"],
"work_history": [...],
"education": [...],
"parsing_status": "completed",
"parsing_confidence": 0.92
}
}Rate Limits
API rate limits vary by plan. Rate limit information is included in response headers.
| Plan | Requests/min | CV Parses/month |
|---|---|---|
| Free | 10 | 10 |
| Free Trial | 60 | 10 |
| Starter | 60 | 500 |
| Growth | 120 | 2,000 |
| Scale | 300 | 10,000 |
| Enterprise | 1,000 | Custom |
Category multipliers: Read endpoints (GET) get 2x the base limit. Bulk and export operations are limited to ~0.33x the base limit. Parse and write endpoints use the base limit shown above.
Rate Limit Headers
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 119
X-RateLimit-Reset: 1706403200
Parsing
Upload CV files or provide URLs to parse resumes into structured data. Each parse consumes 1 credit.
/v1/parse/v1/parse/urlPOST/v1/parse
Upload one or more CV files for parsing.
Request
curl -X POST https://cvparserpro.com/api/v1/parse \
-H "X-API-Key: ts_your_api_key" \
-F "[email protected]" \
-F "[email protected]"Response
{
"success": true,
"candidates": [
{
"id": "8b212bcd-a0d0-4a08-bc29-ba932b713ec1",
"filename": "resume1.pdf",
"status": "pending"
}
],
"credits_remaining": 495
}Supported formats: PDF, DOCX, DOC, PNG, JPG, TIFF, TXT, RTF (max 10MB per file)
POST/v1/parse/url
Parse CVs from publicly accessible URLs.
Request
curl -X POST https://cvparserpro.com/api/v1/parse/url \
-H "X-API-Key: ts_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"urls": [
"https://example.com/resume.pdf"
]
}'Response
{
"success": true,
"processed": 1,
"failed": 0,
"candidates": [
{
"id": "8b212bcd-a0d0-4a08-bc29-ba932b713ec1",
"filename": "resume.pdf",
"status": "pending"
}
],
"errors": [],
"credits_remaining": 495
}Limits
- Max 50 URLs per request
- Max URL length: 2,048 characters
- Fetch timeout: 30 seconds per URL
- Max file size: 10MB per URL
- Credits are only charged for successfully processed URLs
Private/internal URLs (localhost, 10.x, 172.16-31.x, 192.168.x) and non-HTTP protocols are blocked for security.
Candidates
Candidates are parsed CV records containing structured data like contact info, work history, education, and skills.
/v1/candidates/v1/candidates/{id}/v1/candidates/{id}/v1/candidates/{id}/v1/candidates/{id}/fileThe Candidate Object
The list endpoint returns a subset of fields. The single candidate endpoint (/v1/candidates/{id}) returns the full object including tags, jobs, parsing_errors, and metadata fields.
{
"id": "8b212bcd-a0d0-4a08-bc29-ba932b713ec1",
"full_name": "Sarah Chen",
"email": "[email protected]",
"phone": "+1 415-555-0123",
"location": "San Francisco, CA",
"current_title": "Senior Software Engineer",
"years_of_experience": 7,
"skills": ["Python", "JavaScript", "React", "AWS", "PostgreSQL"],
"languages": ["English", "Mandarin"],
"work_history": [
{
"company": "TechCorp Inc",
"title": "Senior Software Engineer",
"start_date": "2021-03",
"end_date": "present",
"is_current": true,
"description": "Led backend development for payment systems..."
}
],
"education": [
{
"institution": "Stanford University",
"degree": "Bachelor of Science",
"field": "Computer Science",
"start_year": "2013",
"end_year": "2017"
}
],
"certifications": [
{
"name": "AWS Solutions Architect",
"issuer": "Amazon Web Services",
"date": "2022"
}
],
"linkedin_url": "https://linkedin.com/in/sarahchen",
"github_url": "https://github.com/sarahchen",
"portfolio_url": "https://sarahchen.dev",
"ai_summary": "Sarah is a software engineer with 7+ years of experience...",
"original_filename": "sarah_chen_resume.pdf",
"source": "api",
"parsing_status": "completed",
"parsing_confidence": 0.94,
"parsing_errors": null,
"tags": [
{ "id": "tag-uuid", "name": "Senior Level", "color": "#D97706" }
],
"jobs": [
{
"job_id": "job-uuid",
"job_title": "Lead Engineer",
"match_score": 92,
"status": "screening",
"score_breakdown": { "skills": 95, "experience": 90, "education": 85 }
}
],
"created_at": "2026-01-28T01:39:09.804Z",
"parsed_at": "2026-01-28T01:39:35.102Z"
}GET/v1/candidates
Returns a paginated list of candidates.
Parameters
| Parameter | Default | Description |
|---|---|---|
page | 1 | Page number |
limit | 20 | Results per page (max 100) |
status | - | Filter: pending, processing, completed, failed |
skills | - | Comma-separated skills filter |
curl "https://cvparserpro.com/api/v1/candidates?page=1&limit=10&status=completed" \
-H "X-API-Key: ts_your_api_key"PATCH/v1/candidates/{id}
Update a candidate's profile fields.
Allowed Fields
full_name, email, phone, location, current_title, years_of_experience, skills, languages, linkedin_url, github_url, portfolio_url, ai_summary
curl -X PATCH https://cvparserpro.com/api/v1/candidates/{id} \
-H "X-API-Key: ts_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"full_name": "Sarah Chen-Smith",
"skills": ["Python", "Go", "Rust", "AWS"]
}'Returns the updated candidate object. System fields like parsing_status, work_history, and education cannot be modified.
DELETE/v1/candidates/{id}
Permanently delete a candidate and their uploaded CV file.
curl -X DELETE https://cvparserpro.com/api/v1/candidates/{id} \
-H "X-API-Key: ts_your_api_key"Response
{
"success": true,
"message": "Candidate deleted successfully"
}GET/v1/candidates/{id}/file
Get a signed URL for the original CV file, valid for 1 hour.
Parameters
| Parameter | Default | Description |
|---|---|---|
download | false | Set to true to redirect for download instead of returning a URL |
curl "https://cvparserpro.com/api/v1/candidates/{id}/file" \
-H "X-API-Key: ts_your_api_key"Response
{
"data": {
"url": "https://cvparserpro.supabase.co/storage/v1/object/sign/...",
"filename": "sarah_chen_resume.pdf",
"content_type": "application/pdf",
"expires_at": "2026-01-28T02:39:09.804Z"
}
}Jobs
Create job positions with requirements and match candidates against them.
/v1/jobs/v1/jobs/v1/jobs/{id}/v1/jobs/{id}/v1/jobs/{id}GET/v1/jobs
Returns a paginated list of jobs.
Parameters
| Parameter | Default | Description |
|---|---|---|
page | 1 | Page number |
limit | 50 | Results per page (max 100) |
status | - | Filter: active, paused, closed |
search | - | Search by job title (case-insensitive) |
sort | created_at | Sort field: title, status, candidate_count, created_at, updated_at |
order | desc | Sort direction: asc or desc |
curl "https://cvparserpro.com/api/v1/jobs?status=active&search=engineer" \
-H "X-API-Key: ts_your_api_key"POST/v1/jobs
Create a new job posting with skill requirements.
curl -X POST https://cvparserpro.com/api/v1/jobs \
-H "X-API-Key: ts_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"title": "Senior Backend Engineer",
"description": "We are looking for...",
"required_skills": [
{"skill": "Python", "weight": 1.0},
{"skill": "PostgreSQL", "weight": 0.8}
],
"nice_to_have_skills": [
{"skill": "Docker", "weight": 0.5}
],
"min_experience_years": 3,
"max_experience_years": 8,
"education_level": "bachelors",
"preferred_locations": ["Remote", "Mexico City"],
"salary_min": 80000,
"salary_max": 120000
}'Fields
title(required) — Job titlerequired_skills— Array of{skill, weight}objects (weight: 0.0–1.0)nice_to_have_skills— Array of optional skill objectseducation_level— One of: any, high_school, associate, bachelors, masters, phdstatus— One of: active, paused, closed (default: active)
GET/v1/jobs/{id}
Get a job with its linked candidates and match scores.
curl https://cvparserpro.com/api/v1/jobs/{id} \
-H "X-API-Key: ts_your_api_key"Response includes a candidates array with each candidate's profile, match_score, score_breakdown, and pipeline_status.
PATCH/v1/jobs/{id}
Update a job's fields. Accepts the same fields as job creation.
curl -X PATCH https://cvparserpro.com/api/v1/jobs/{id} \
-H "X-API-Key: ts_your_api_key" \
-H "Content-Type: application/json" \
-d '{"status": "closed"}'DELETE/v1/jobs/{id}
Permanently delete a job. Candidate associations are also removed.
curl -X DELETE https://cvparserpro.com/api/v1/jobs/{id} \
-H "X-API-Key: ts_your_api_key"Response
{
"success": true,
"message": "Job deleted successfully"
}Usage
Check your API usage, credit balance, and plan details.
/v1/usagecurl https://cvparserpro.com/api/v1/usage \
-H "X-API-Key: ts_your_api_key"Response
{
"plan": "growth",
"plan_name": "Growth",
"credits_total": 2000,
"credits_used": 1505,
"credits_remaining": 495,
"api_calls_this_period": 127,
"resets_at": "2026-02-12T04:15:39.058Z",
"overage_price_cents": 8
}Errors
CV Parser Pro uses conventional HTTP response codes. Codes in the 2xx range indicate success, 4xx indicate client errors, and 5xx indicate server errors.
| Code | Status | Description |
|---|---|---|
| 200 | OK | Request succeeded |
| 201 | Created | Resource created (parse, create job) |
| 400 | Bad Request | Invalid parameters or request body |
| 401 | Unauthorized | Invalid or missing API key |
| 402 | Payment Required | Insufficient credits or subscription required |
| 403 | Forbidden | Plan does not include API access |
| 404 | Not Found | Resource not found |
| 409 | Conflict | Resource already exists |
| 413 | Payload Too Large | File exceeds 10MB limit |
| 415 | Unsupported Media Type | File type not supported or wrong Content-Type |
| 429 | Too Many Requests | Rate limit exceeded (includes Retry-After header) |
| 500 | Server Error | Internal server error |
Error Response Format
Errors return a structured object with a machine-readable code and human-readable message.
{
"error": {
"code": "insufficient_credits",
"message": "Insufficient credits. You have 0 credits, but this operation requires 1.",
"details": []
}
}Common error codes: validation_error, invalid_api_key, insufficient_credits, rate_limit_exceeded, not_found, plan_limit_exceeded.
Pagination
List endpoints return paginated results with metadata.
{
"data": [...],
"meta": {
"total": 150,
"page": 1,
"limit": 20,
"total_pages": 8,
"has_next": true,
"has_prev": false
}
}| Field | Description |
|---|---|
total | Total number of results |
page | Current page number |
limit | Results per page |
total_pages | Total number of pages |
has_next | Whether more pages exist |
has_prev | Whether previous pages exist |
SDKs & Libraries
While we don't have official SDKs yet, the API is simple to use with any HTTP client.
Python
import requests
class CVParserPro:
def __init__(self, api_key):
self.api_key = api_key
self.base_url = "https://cvparserpro.com/api/v1"
self.headers = {"X-API-Key": api_key}
def parse_cv(self, file_path):
with open(file_path, "rb") as f:
response = requests.post(
f"{self.base_url}/parse",
headers=self.headers,
files={"files": f}
)
return response.json()
def get_candidate(self, candidate_id):
response = requests.get(
f"{self.base_url}/candidates/{candidate_id}",
headers=self.headers
)
return response.json()
def list_candidates(self, page=1, limit=20):
response = requests.get(
f"{self.base_url}/candidates",
headers=self.headers,
params={"page": page, "limit": limit}
)
return response.json()
# Usage
client = CVParserPro("ts_your_api_key")
result = client.parse_cv("resume.pdf")
print(result)JavaScript / TypeScript
class CVParserPro {
constructor(apiKey) {
this.apiKey = apiKey;
this.baseUrl = 'https://cvparserpro.com/api/v1';
}
async parseCV(file) {
const formData = new FormData();
formData.append('files', file);
const response = await fetch(`${this.baseUrl}/parse`, {
method: 'POST',
headers: { 'X-API-Key': this.apiKey },
body: formData,
});
return response.json();
}
async getCandidate(id) {
const response = await fetch(`${this.baseUrl}/candidates/${id}`, {
headers: { 'X-API-Key': this.apiKey },
});
return response.json();
}
async listCandidates(page = 1, limit = 20) {
const params = new URLSearchParams({ page, limit });
const response = await fetch(`${this.baseUrl}/candidates?${params}`, {
headers: { 'X-API-Key': this.apiKey },
});
return response.json();
}
}
// Usage
const client = new CVParserPro('ts_your_api_key');
const result = await client.listCandidates();
console.log(result);Ready to get started?
Sign up now and get 10 free CV parses with your trial.