# Parse a CV

> POST /parse/ reads one to 10 CVs (PDF or DOCX, 10 MB each) into structured JSON: contact details, roles with dates, education and skills. $0.01 per CV.

**Source:** /docs/api/parse/ (Curriculo Docs)  
**Updated:** 15 October 2026  
**Contact:** hello@curriculo.me

```http
POST https://api.curriculo.me/public/parse/
```

**Stateless.** Reads a PDF or DOCX into structured JSON: contact details, title, roles with dates, education, skills. Nothing is stored. Values stay in the CV's own language and script; nothing is translated or rewritten. A field the CV does not contain comes back empty rather than absent, and list fields are always arrays.

**Price:** $0.01 per CV: one CV costs $0.01, ten cost $0.10. CVs that fail are not charged.

## What does the parse endpoint return?

`POST /parse/` reads a PDF or DOCX CV and returns structured JSON: name, contact details, title, roles with dates, education and skills. Values stay in the CV's own language and script, missing fields come back empty instead of absent, and list fields are always arrays. Nothing you send is stored.

## Request

`multipart/form-data`

| Field | Type | Notes |
|---|---|---|
| `files` | file[] | One to 10 documents, PDF or DOCX, 10 MB each. Repeat the field per document. |
| `file` | file | Single-document alias, kept for existing integrations. |

## Example

One document:

```bash
curl -X POST https://api.curriculo.me/public/parse/ \
  -H 'Authorization: Bearer key_abc123_yoursecret' \
  -F 'files=@/path/to/candidate.pdf'
```

Several documents (one request, results in input order):

```bash
curl -X POST https://api.curriculo.me/public/parse/ \
  -H 'Authorization: Bearer key_abc123_yoursecret' \
  -F 'files=@candidate_a.pdf' \
  -F 'files=@candidate_b.docx'
```

## Response

One document returns that document's object:

```json
{
  "name": "Jordan Rivera",
  "title": "Lead Software Engineer",
  "email": "jordan.rivera@example.com",
  "experience": [ … ],
  "technical_skills": [ … ]
}
```

Several documents return a `results` array, one entry per input, in input order. A document that cannot be read returns its own error entry while the others succeed. See [Batching](/docs/batching/).

## Timing

Typically under 90 seconds per document. Keep your client timeout above five minutes. For a backlog, use [`POST /parse/async`](/docs/background-processing/) with up to 25 links per task.

## Errors

| Status | Typical cause |
|---|---|
| `400` | Empty, unreadable or password-protected document. |
| `413` | A document over 10 MB, more than 10 documents, or a request body over 12 MB. |
| `504` | Processing exceeded 300 seconds. Send fewer documents per request. |

See [Errors](/docs/errors/).
