# 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 request.

**Source:** /docs/api/parse/ (Curriculo Docs)  
**Updated:** 12 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 request, whether it carries one CV or ten.

## 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": [ … ],
  "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

40 to 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/).
