Drop in a CV in any format — get back clean structured JSON in <2 seconds. REST, JSON-only, bearer-token auth. Choose your AI provider (Claude, GPT-4, or local spaCy NER) at the workspace level.
cvparser converts CVs into a normalised candidate object validated by Zod. Upload PDF, DOCX, DOC or HTML to /v1/parse, or send plain text to /v1/parse/text. Every parse runs through the same extractor pipeline.
All non-demo requests must include an Authorization header with a workspace bearer token. Tokens are managed in your Dashboard. Live keys start with cvp_live_; sandbox keys with cvp_test_.
Send your first parse with a single command. The response wraps the candidate object in { success, data }. Costs 1 credit on a 2xx response. To only extract the sections you need (and cut LLM cost), see Selecting sections below.
curl -X POST https://api.cvparser.io/v1/parse \
-H "Authorization: Bearer cvp_live_a8f...kT2" \
-F "file=@./candidate.pdf"{
"success": true,
"data": {
"fullName": "Sarah Chen",
"headline": "Senior Frontend Engineer",
"email": "sarah.chen@gmail.com",
"phone": "+44 7700 900123",
"location": "London, UK",
"linkedin": "https://linkedin.com/in/sarahchen",
"github": null,
"website": null,
"bio": "Frontend engineer with 8+ years...",
"confidence": 0.994,
"workHistory": { "confidence": 0.97, "items": [ ... ] },
"education": { "confidence": 0.99, "items": [ ... ] },
"skills": { "confidence": 0.96, "items": [ ... ] }
}
}By default a parse returns every CV section. Pass `?sections=` (on /parse) or a JSON `sections: []` field (on /parse/text) to extract only what you need — the request builds a reduced JSON schema, trims the prompt, and costs proportionally less. The response still uses the same envelope; unrequested sections are simply omitted from `data`.
curl -X POST "https://api.cvparser.io/v1/parse?sections=workHistory,skills" \
-H "Authorization: Bearer cvp_live_a8f...kT2" \
-F "file=@./candidate.pdf"{
"success": true,
"data": {
"workHistory": { "confidence": 0.97, "items": [ ... ] },
"skills": { "confidence": 0.96, "items": [ ... ] }
}
}cvparser uses conventional HTTP status codes. 2xx for success, 4xx for client errors (validation, auth, quota), 5xx for our problems. Errors always include a JSON envelope { success: false, error: string }.
60 requests / minute per workspace by default — get in touch to raise it. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset; a rejected request returns 429 with Retry-After. The public demo endpoint is limited separately to 5 requests / hour per IP.
Every parse returns a Candidate envelope validated by the @cvparser/types Zod schema. Below are the top-level keys. See the shared schema for the full nested shape.
Multipart upload. PDF, DOCX, DOC and HTML are supported; any other file type is rejected with 400. For plain text, post to /v1/parse/text with a JSON body instead. Costs 1 credit per parse — charged only on a 2xx response.
curl -X POST https://api.cvparser.io/v1/parse \
-H "Authorization: Bearer cvp_live_a8f...kT2" \
-F "file=@./candidate.pdf"{
"success": true,
"data": {
"fullName": "Sarah Chen",
"headline": "Senior Frontend Engineer",
"email": "sarah.chen@gmail.com",
"phone": "+44 7700 900123",
"location": "London, UK",
"linkedin": "https://linkedin.com/in/sarahchen",
"github": null,
"website": null,
"bio": "Frontend engineer with 8+ years...",
"confidence": 0.994,
"workHistory": { "confidence": 0.97, "items": [ ... ] },
"education": { "confidence": 0.99, "items": [ ... ] },
"skills": { "confidence": 0.96, "items": [ ... ] }
}
}Send pre-extracted CV text directly — skips file extraction. Useful when you already have the text from another source.
curl -X POST https://api.cvparser.io/v1/parse/text \
-H "Authorization: Bearer cvp_live_a8f...kT2" \
-H "Content-Type: application/json" \
-d '{ "text": "Sarah Chen\nSenior Frontend Engineer..." }'{
"success": true,
"data": {
"fullName": "Sarah Chen",
...
}
}Unauthenticated, IP-rate-limited demo endpoint. Same response shape as /parse. Use it to wire up trial flows or evaluation harnesses without provisioning a key.
curl -X POST https://api.cvparser.io/demo/parse \
-F "file=@./candidate.pdf"{
"success": true,
"data": { ... }
}The API is plain REST — any HTTP client works. Below are the no-dependency choices for the popular languages.
global fetch + FormData (built-in)pip install requestsnet/http + mime/multipartcurl, fetch, axios — anything