# Register a job

> POST /jobs/ stores a job description once and returns a job_id, so a backlog of CVs can be evaluated without re-sending the same text. Optional and free.

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

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

**Optional and free.** Stores a job description and returns a `job_id` scoped to your credential, so a backlog of CVs stops re-sending the same text.

> [!NOTE]
> This is an evaluation helper, not a job board. There is no listing, no pagination, no organisation and no pipeline. Only the description you send is stored, never a candidate, a CV or a result.

## Request

`application/json`

| Field | Type | Notes |
|---|---|---|
| `job_details` (required) | string | Plain text pasted from your careers page, or a JSON object of structured requirements. |
| `language` | string | Default ISO 639-1 code for candidate-facing prose. |
| `label` | string | Your own name for the job. Echoed back. |

## Example

```bash
curl -X POST https://api.curriculo.me/public/jobs/ \
  -H 'Authorization: Bearer key_abc123_yoursecret' \
  -H 'Content-Type: application/json' \
  -d '{"job_details": "Senior backend engineer, Python and FastAPI, Seoul", "label": "BE-Seoul"}'
```

## Response

```json
{"job_id": "job_abc123", "label": "BE-Seoul"}
```

Send that `job_id` on [`POST /evaluate/`](/docs/api/evaluate/) or [`POST /evaluate/async`](/docs/background-processing/) in place of `job_details`.

## Errors

| Status | Typical cause |
|---|---|
| `400` | Malformed `job_details`. |
| `422` | `job_details` is missing. |

`/evaluate/` returns `404` for an unknown `job_id`, or one registered by a different account. Ids are scoped to the credential that created them.
