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.

Base URL
https://cvparserpro.com/api/v1

Authentication

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.

PlanRequests/minCV Parses/month
Free1010
Free Trial6010
Starter60500
Growth1202,000
Scale30010,000
Enterprise1,000Custom

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.

POST
/v1/parse
POST
/v1/parse/url

POST/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.

GET
/v1/candidates
GET
/v1/candidates/{id}
PATCH
/v1/candidates/{id}
DELETE
/v1/candidates/{id}
GET
/v1/candidates/{id}/file

The 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

ParameterDefaultDescription
page1Page number
limit20Results 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

ParameterDefaultDescription
downloadfalseSet 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.

GET
/v1/jobs
POST
/v1/jobs
GET
/v1/jobs/{id}
PATCH
/v1/jobs/{id}
DELETE
/v1/jobs/{id}

GET/v1/jobs

Returns a paginated list of jobs.

Parameters

ParameterDefaultDescription
page1Page number
limit50Results per page (max 100)
status-Filter: active, paused, closed
search-Search by job title (case-insensitive)
sortcreated_atSort field: title, status, candidate_count, created_at, updated_at
orderdescSort 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 title
  • required_skills — Array of {skill, weight} objects (weight: 0.0–1.0)
  • nice_to_have_skills — Array of optional skill objects
  • education_level — One of: any, high_school, associate, bachelors, masters, phd
  • status — 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.

GET
/v1/usage
curl 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.

CodeStatusDescription
200OKRequest succeeded
201CreatedResource created (parse, create job)
400Bad RequestInvalid parameters or request body
401UnauthorizedInvalid or missing API key
402Payment RequiredInsufficient credits or subscription required
403ForbiddenPlan does not include API access
404Not FoundResource not found
409ConflictResource already exists
413Payload Too LargeFile exceeds 10MB limit
415Unsupported Media TypeFile type not supported or wrong Content-Type
429Too Many RequestsRate limit exceeded (includes Retry-After header)
500Server ErrorInternal 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
  }
}
FieldDescription
totalTotal number of results
pageCurrent page number
limitResults per page
total_pagesTotal number of pages
has_nextWhether more pages exist
has_prevWhether 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.