# Resume database

> List, read, store under your own ids and erase the resumes of a workspace: every resume parsed, scored or stored there.

Source: https://hirelayer.co/api-docs/resumes · Markdown: https://hirelayer.co/api-docs/resumes.md

The resume database of a workspace holds every resume parsed by the [Resume Parser](https://hirelayer.co/api-docs/parse-resume.md), sent to the [Resume Scorer](https://hirelayer.co/api-docs/score.md) or stored with `PUT /resumes/{application_id}`, under its `application_id`. [Talent Pool Search](https://hirelayer.co/api-docs/search-resumes.md) searches it, and the Resume Scorer and [Job Recommendations](https://hirelayer.co/api-docs/search-jobs.md) read a resume by its id. These endpoints are free.

### List stored resumes

`GET https://hirelayer.co/api/v4/resumes`

The resume database of the workspace, most recently stored first. Free.

- **Authentication:** `X-API-Key` header
- **Billing:** Free
- **Client timeout:** at least 30 seconds

#### Headers

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `HireLayer-Workspace` | `string` | No | Your customer's workspace id. Case-insensitive, created on first use. Absent, calls use `default`. |

#### Query parameters

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `limit` | `integer` | No | Page size. 1–100, default `20`. |
| `cursor` | `string` | No | The `next_cursor` of the previous page. |
| `added_after` | `string (date-time)` | No | Only resumes stored at or after this time. |

#### Example request

**cURL**

```bash
curl -g "https://hirelayer.co/api/v4/resumes?limit=20" \
  -H "X-API-Key: $HIRELAYER_API_KEY"
```

**Python**

```python
import os

import requests

response = requests.get(
    "https://hirelayer.co/api/v4/resumes?limit=20",
    headers={"X-API-Key": os.environ["HIRELAYER_API_KEY"]},
    timeout=30,
)
response.raise_for_status()

data = response.json()
print(data["data"])
```

**TypeScript**

```typescript
const response = await fetch('https://hirelayer.co/api/v4/resumes?limit=20', {
  headers: {
    'X-API-Key': process.env.HIRELAYER_API_KEY!,
  },
  signal: AbortSignal.timeout(30_000),
})

if (!response.ok) {
  throw new Error(`HireLayer ${response.status}: ${await response.text()}`)
}

const data = await response.json()
console.log(data.data)
```

#### Response `200`

A page of resumes.

| Field | Type | Description |
| --- | --- | --- |
| `data` | `object[]` |  |
| `data[].application_id` | `string` |  |
| `data[].file_name` | `string \| null` | Name of the file the resume was parsed from, as sent. `null` for a resume sent as a text or a parsed JSON. |
| `data[].candidate_name` | `string \| null` | May be absent.  |
| `data[].job_title` | `string \| null` | May be absent.  |
| `data[].created_at` | `string (date-time)` |  |
| `data[].updated_at` | `string (date-time)` |  |
| `next_cursor` | `string \| null` |  |

#### Errors

| Status | `error.code` | `error.message` | When | Retry |
| --- | --- | --- | --- | --- |
| `400` | [`invalid_request`](https://hirelayer.co/api-docs/errors.md#invalid_request) | `limit must be an integer from 1 to 100.` | `param`: `limit`. `limit` out of range. | Fix, then retry |
| `400` | [`invalid_request`](https://hirelayer.co/api-docs/errors.md#invalid_request) | `cursor is not a next_cursor returned by this API.` | `param`: `cursor`. `cursor` is not a `next_cursor` of this list. | Fix, then retry |
| `400` | [`invalid_request`](https://hirelayer.co/api-docs/errors.md#invalid_request) | `added_after must be a date or a date-time.` | `param`: `added_after`. `added_after` is not a date. | Fix, then retry |
| `400` | [`invalid_request`](https://hirelayer.co/api-docs/errors.md#invalid_request) | `HireLayer-Workspace must contain letters, digits and . _ : ~ -, up to 200 characters.` | `param`: `HireLayer-Workspace`. `HireLayer-Workspace` is not a valid id. | Fix, then retry |
| `401` | [`missing_api_key`](https://hirelayer.co/api-docs/errors.md#missing_api_key) | `The X-API-Key header is missing.` | No `X-API-Key` header. | Fix, then retry |
| `401` | [`missing_api_key`](https://hirelayer.co/api-docs/errors.md#missing_api_key) | `Authorization: Bearer is not accepted: send the key in the X-API-Key header.` | The key sent as `Authorization: Bearer`: it goes in `X-API-Key`. | Fix, then retry |
| `401` | [`missing_api_key`](https://hirelayer.co/api-docs/errors.md#missing_api_key) | `The key goes in the X-API-Key header, not in the URL.` | The key sent in the URL: it goes in `X-API-Key`. | Fix, then retry |
| `401` | [`invalid_api_key`](https://hirelayer.co/api-docs/errors.md#invalid_api_key) | `Invalid API key: it is unknown, malformed or revoked.` | The key is unknown, malformed or revoked. | Fix, then retry |
| `500` | [`internal_error`](https://hirelayer.co/api-docs/errors.md#internal_error) | `Internal error: retry later. If it persists, contact support with the request_id.` | An unexpected error. | Retry with backoff |
| `502` | [`internal_error`](https://hirelayer.co/api-docs/errors.md#internal_error) | `The service could not be reached: retry later.` | The service could not be reached. | Retry with backoff |
| `503` | [`internal_error`](https://hirelayer.co/api-docs/errors.md#internal_error) | `The credit service is briefly unavailable: retry in a second.` | The credit service is briefly unavailable. Headers: `Retry-After: <seconds>`. | Retry with backoff |
| `504` | [`internal_error`](https://hirelayer.co/api-docs/errors.md#internal_error) | `The service did not answer in time. The change may still be applied: read it before sending it again.` | No answer in time. | Retry with backoff |

Example error (`400`):

```json
{
  "error": {
    "code": "invalid_request",
    "message": "limit must be an integer from 1 to 100.",
    "param": "limit",
    "doc_url": "https://hirelayer.co/api-docs/errors#invalid_request"
  },
  "request_id": "6f1c2a4e-1d2b-4c3a-9e8f-0a1b2c3d4e5f"
}
```

### Get a stored resume

`GET https://hirelayer.co/api/v4/resumes/{application_id}`

Get a stored resume.

- **Authentication:** `X-API-Key` header
- **Billing:** Free
- **Client timeout:** at least 30 seconds

#### Path parameters

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `application_id` | `string` | Yes | The resume's id, including one returned by the legacy `/api/v3/parser` in `info_resume.application_id`. |

#### Headers

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `HireLayer-Workspace` | `string` | No | Your customer's workspace id. Case-insensitive, created on first use. Absent, calls use `default`. |

#### Example request

**cURL**

```bash
# Example ids: replace file_2c982f413a5e9e79563f8a1fcb5c7caa with an application_id returned by POST /api/v4/resumes/parse.
curl https://hirelayer.co/api/v4/resumes/file_2c982f413a5e9e79563f8a1fcb5c7caa \
  -H "X-API-Key: $HIRELAYER_API_KEY"
```

**Python**

```python
# Example ids: replace file_2c982f413a5e9e79563f8a1fcb5c7caa with an application_id returned by POST /api/v4/resumes/parse.
import os

import requests

response = requests.get(
    "https://hirelayer.co/api/v4/resumes/file_2c982f413a5e9e79563f8a1fcb5c7caa",
    headers={"X-API-Key": os.environ["HIRELAYER_API_KEY"]},
    timeout=30,
)
response.raise_for_status()

data = response.json()
print(data["resume"])
```

**TypeScript**

```typescript
// Example ids: replace file_2c982f413a5e9e79563f8a1fcb5c7caa with an application_id returned by POST /api/v4/resumes/parse.
const response = await fetch('https://hirelayer.co/api/v4/resumes/file_2c982f413a5e9e79563f8a1fcb5c7caa', {
  headers: {
    'X-API-Key': process.env.HIRELAYER_API_KEY!,
  },
  signal: AbortSignal.timeout(30_000),
})

if (!response.ok) {
  throw new Error(`HireLayer ${response.status}: ${await response.text()}`)
}

const data = await response.json()
console.log(data.resume)
```

#### Response `200`

The stored resume.

| Field | Type | Description |
| --- | --- | --- |
| `application_id` | `string` |  |
| `workspace` | `string` |  |
| `file_name` | `string \| null` | May be absent. Name of the file the resume was parsed from, as sent. `null` for a resume sent as a text or a parsed JSON. |
| `text` | `string` | The resume's plain text. |
| `resume` | `ParsedResume \| null` | The structured resume, `null` when only plain text was stored. |
| `job_ids` | `string[]` | Jobs the resume was scored against. |
| `created_at` | `string (date-time)` |  |
| `updated_at` | `string (date-time)` |  |

#### Errors

| Status | `error.code` | `error.message` | When | Retry |
| --- | --- | --- | --- | --- |
| `400` | [`invalid_request`](https://hirelayer.co/api-docs/errors.md#invalid_request) | `application_id must contain letters, digits and . _ : ~ -, up to 200 characters.` | `param`: `application_id`. `application_id` in the path is not a valid id. | Fix, then retry |
| `400` | [`invalid_request`](https://hirelayer.co/api-docs/errors.md#invalid_request) | `HireLayer-Workspace must contain letters, digits and . _ : ~ -, up to 200 characters.` | `param`: `HireLayer-Workspace`. `HireLayer-Workspace` is not a valid id. | Fix, then retry |
| `401` | [`missing_api_key`](https://hirelayer.co/api-docs/errors.md#missing_api_key) | `The X-API-Key header is missing.` | No `X-API-Key` header. | Fix, then retry |
| `401` | [`missing_api_key`](https://hirelayer.co/api-docs/errors.md#missing_api_key) | `Authorization: Bearer is not accepted: send the key in the X-API-Key header.` | The key sent as `Authorization: Bearer`: it goes in `X-API-Key`. | Fix, then retry |
| `401` | [`missing_api_key`](https://hirelayer.co/api-docs/errors.md#missing_api_key) | `The key goes in the X-API-Key header, not in the URL.` | The key sent in the URL: it goes in `X-API-Key`. | Fix, then retry |
| `401` | [`invalid_api_key`](https://hirelayer.co/api-docs/errors.md#invalid_api_key) | `Invalid API key: it is unknown, malformed or revoked.` | The key is unknown, malformed or revoked. | Fix, then retry |
| `404` | [`not_found`](https://hirelayer.co/api-docs/errors.md#not_found) | `No resume cand-42 in workspace default.` | `param`: `application_id`. No resume under this id in the workspace. | Do not retry |
| `500` | [`internal_error`](https://hirelayer.co/api-docs/errors.md#internal_error) | `Internal error: retry later. If it persists, contact support with the request_id.` | An unexpected error. | Retry with backoff |
| `502` | [`internal_error`](https://hirelayer.co/api-docs/errors.md#internal_error) | `The service could not be reached: retry later.` | The service could not be reached. | Retry with backoff |
| `503` | [`internal_error`](https://hirelayer.co/api-docs/errors.md#internal_error) | `The credit service is briefly unavailable: retry in a second.` | The credit service is briefly unavailable. Headers: `Retry-After: <seconds>`. | Retry with backoff |
| `504` | [`internal_error`](https://hirelayer.co/api-docs/errors.md#internal_error) | `The service did not answer in time. The change may still be applied: read it before sending it again.` | No answer in time. | Retry with backoff |

Example error (`400`):

```json
{
  "error": {
    "code": "invalid_request",
    "message": "application_id must contain letters, digits and . _ : ~ -, up to 200 characters.",
    "param": "application_id",
    "doc_url": "https://hirelayer.co/api-docs/errors#invalid_request"
  },
  "request_id": "6f1c2a4e-1d2b-4c3a-9e8f-0a1b2c3d4e5f"
}
```

### Store a resume already read

`PUT https://hirelayer.co/api/v4/resumes/{application_id}`

Stores under your `application_id` a resume you already have as text, or as the parsed resume JSON of `POST /resumes/parse`. Replaces the resume stored before. When its text changes, its scores become `stale` and are evaluated again only when asked; the same text sent again leaves them as they are. Free. To store a file, use `POST /resumes/parse` with `application_id`.

- **Authentication:** `X-API-Key` header
- **Content type:** `application/json`
- **Billing:** Free
- **Client timeout:** at least 60 seconds

#### Path parameters

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `application_id` | `string` | Yes | The resume's id, including one returned by the legacy `/api/v3/parser` in `info_resume.application_id`. |

#### Headers

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `HireLayer-Workspace` | `string` | No | Your customer's workspace id. Case-insensitive, created on first use. Absent, calls use `default`. |

#### Request body

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `text` | `string` | No | The resume as plain text. 1–50,000 characters. |
| `resume` | `object` | No | The parsed resume JSON, from `POST /resumes/parse` (`resume`) or the legacy `/api/v3/parser`, kept as is, 1 MB at most (`413`), arrays and objects nested 100 levels deep at most (`400`). |

Send exactly one of `text` or `resume`.

#### Example request

**cURL**

```bash
curl -X PUT https://hirelayer.co/api/v4/resumes/cand-1042 \
  -H "X-API-Key: $HIRELAYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Alex Morgan, Senior Software Engineer in Paris. 7 years of Node.js and TypeScript…"
  }'
```

**Python**

```python
import os

import requests

response = requests.put(
    "https://hirelayer.co/api/v4/resumes/cand-1042",
    headers={"X-API-Key": os.environ["HIRELAYER_API_KEY"]},
    json={
        "text": "Alex Morgan, Senior Software Engineer in Paris. 7 years of Node.js and TypeScript…",
    },
    timeout=60,
)
response.raise_for_status()

data = response.json()
print(data["application_id"])
```

**TypeScript**

```typescript
const response = await fetch('https://hirelayer.co/api/v4/resumes/cand-1042', {
  method: 'PUT',
  headers: {
    'X-API-Key': process.env.HIRELAYER_API_KEY!,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    text: 'Alex Morgan, Senior Software Engineer in Paris. 7 years of Node.js and TypeScript…',
  }),
  signal: AbortSignal.timeout(60_000),
})

if (!response.ok) {
  throw new Error(`HireLayer ${response.status}: ${await response.text()}`)
}

const data = await response.json()
console.log(data.application_id)
```

#### Response `200`

Replaced.

| Field | Type | Description |
| --- | --- | --- |
| `application_id` | `string` |  |
| `workspace` | `string` |  |
| `file_name` | `string \| null` | May be absent. Name of the file the resume was parsed from, as sent. `null` for a resume sent as a text or a parsed JSON. |
| `text` | `string` | The resume's plain text. |
| `resume` | `ParsedResume \| null` | The structured resume, `null` when only plain text was stored. |
| `job_ids` | `string[]` | Jobs the resume was scored against. |
| `created_at` | `string (date-time)` |  |
| `updated_at` | `string (date-time)` |  |

#### Response `201`

Created.

| Field | Type | Description |
| --- | --- | --- |
| `application_id` | `string` |  |
| `workspace` | `string` |  |
| `file_name` | `string \| null` | May be absent. Name of the file the resume was parsed from, as sent. `null` for a resume sent as a text or a parsed JSON. |
| `text` | `string` | The resume's plain text. |
| `resume` | `ParsedResume \| null` | The structured resume, `null` when only plain text was stored. |
| `job_ids` | `string[]` | Jobs the resume was scored against. |
| `created_at` | `string (date-time)` |  |
| `updated_at` | `string (date-time)` |  |

#### Errors

| Status | `error.code` | `error.message` | When | Retry |
| --- | --- | --- | --- | --- |
| `400` | [`invalid_request`](https://hirelayer.co/api-docs/errors.md#invalid_request) | `text or resume is required.` | `param`: `text`. Neither `text` nor `resume`, or both. | Fix, then retry |
| `400` | [`invalid_request`](https://hirelayer.co/api-docs/errors.md#invalid_request) | `text must be a string.` | `param`: `text`. `text` is not a string. | Fix, then retry |
| `400` | [`invalid_request`](https://hirelayer.co/api-docs/errors.md#invalid_request) | `resume must be the JSON object returned by the Resume Parser.` | `param`: `resume`. `resume` is not a parsed resume, or has no `info_resume.text`. | Fix, then retry |
| `400` | [`invalid_request`](https://hirelayer.co/api-docs/errors.md#invalid_request) | `application_id must contain letters, digits and . _ : ~ -, up to 200 characters.` | `param`: `application_id`. `application_id` in the path is not a valid id. | Fix, then retry |
| `400` | [`invalid_request`](https://hirelayer.co/api-docs/errors.md#invalid_request) | `Unknown field candidate.` | `param`: `candidate`. A field the call does not take. | Fix, then retry |
| `400` | [`invalid_request`](https://hirelayer.co/api-docs/errors.md#invalid_request) | `The request body is not valid JSON.` | The body is not valid JSON, not an object, or not sent as `application/json`. | Fix, then retry |
| `400` | [`invalid_request`](https://hirelayer.co/api-docs/errors.md#invalid_request) | `HireLayer-Workspace must contain letters, digits and . _ : ~ -, up to 200 characters.` | `param`: `HireLayer-Workspace`. `HireLayer-Workspace` is not a valid id. | Fix, then retry |
| `400` | [`storage_required`](https://hirelayer.co/api-docs/errors.md#storage_required) | `This workspace runs without storage (do_not_store_data): nothing can be stored in it.` | `param`: `HireLayer-Workspace`. The workspace runs without storage, and the call would store something in it. | Do not retry |
| `401` | [`missing_api_key`](https://hirelayer.co/api-docs/errors.md#missing_api_key) | `The X-API-Key header is missing.` | No `X-API-Key` header. | Fix, then retry |
| `401` | [`missing_api_key`](https://hirelayer.co/api-docs/errors.md#missing_api_key) | `Authorization: Bearer is not accepted: send the key in the X-API-Key header.` | The key sent as `Authorization: Bearer`: it goes in `X-API-Key`. | Fix, then retry |
| `401` | [`missing_api_key`](https://hirelayer.co/api-docs/errors.md#missing_api_key) | `The key goes in the X-API-Key header, not in the URL.` | The key sent in the URL: it goes in `X-API-Key`. | Fix, then retry |
| `401` | [`invalid_api_key`](https://hirelayer.co/api-docs/errors.md#invalid_api_key) | `Invalid API key: it is unknown, malformed or revoked.` | The key is unknown, malformed or revoked. | Fix, then retry |
| `413` | [`payload_too_large`](https://hirelayer.co/api-docs/errors.md#payload_too_large) | `text must be 50,000 characters or less.` | `param`: `text`. The text is over 50,000 characters. | Fix, then retry |
| `413` | [`payload_too_large`](https://hirelayer.co/api-docs/errors.md#payload_too_large) | `resume must be 1 MB or less.` | `param`: `resume`. The parsed resume is over 1 MB. | Fix, then retry |
| `413` | [`payload_too_large`](https://hirelayer.co/api-docs/errors.md#payload_too_large) | `The request body must be 10 MB or less.` | The body is over 10 MB. | Fix, then retry |
| `500` | [`internal_error`](https://hirelayer.co/api-docs/errors.md#internal_error) | `Internal error: retry later. If it persists, contact support with the request_id.` | An unexpected error. | Retry with backoff |
| `502` | [`internal_error`](https://hirelayer.co/api-docs/errors.md#internal_error) | `The service could not be reached: retry later.` | The service could not be reached. | Retry with backoff |
| `503` | [`internal_error`](https://hirelayer.co/api-docs/errors.md#internal_error) | `The credit service is briefly unavailable: retry in a second.` | The credit service is briefly unavailable. Headers: `Retry-After: <seconds>`. | Retry with backoff |
| `504` | [`internal_error`](https://hirelayer.co/api-docs/errors.md#internal_error) | `The service did not answer in time. The change may still be applied: read it before sending it again.` | No answer in time. | Retry with backoff |

Example error (`400`):

```json
{
  "error": {
    "code": "invalid_request",
    "message": "text or resume is required.",
    "param": "text",
    "doc_url": "https://hirelayer.co/api-docs/errors#invalid_request"
  },
  "request_id": "6f1c2a4e-1d2b-4c3a-9e8f-0a1b2c3d4e5f"
}
```

### Erase a resume

`DELETE https://hirelayer.co/api/v4/resumes/{application_id}`

Erases the resume, its file and all its scores (GDPR erasure). Erasing a resume that does not exist is not an error. Free.

- **Authentication:** `X-API-Key` header
- **Billing:** Free
- **Client timeout:** at least 30 seconds

#### Path parameters

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `application_id` | `string` | Yes | The resume's id, including one returned by the legacy `/api/v3/parser` in `info_resume.application_id`. |

#### Headers

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `HireLayer-Workspace` | `string` | No | Your customer's workspace id. Case-insensitive, created on first use. Absent, calls use `default`. |

#### Example request

**cURL**

```bash
curl -X DELETE https://hirelayer.co/api/v4/resumes/cand-1042 \
  -H "X-API-Key: $HIRELAYER_API_KEY"
```

**Python**

```python
import os

import requests

response = requests.delete(
    "https://hirelayer.co/api/v4/resumes/cand-1042",
    headers={"X-API-Key": os.environ["HIRELAYER_API_KEY"]},
    timeout=30,
)
response.raise_for_status()
print(response.status_code)
```

**TypeScript**

```typescript
const response = await fetch('https://hirelayer.co/api/v4/resumes/cand-1042', {
  method: 'DELETE',
  headers: {
    'X-API-Key': process.env.HIRELAYER_API_KEY!,
  },
  signal: AbortSignal.timeout(30_000),
})

if (!response.ok) {
  throw new Error(`HireLayer ${response.status}: ${await response.text()}`)
}

console.log(response.status)
```

#### Response `204`

Erased.

#### Errors

| Status | `error.code` | `error.message` | When | Retry |
| --- | --- | --- | --- | --- |
| `400` | [`invalid_request`](https://hirelayer.co/api-docs/errors.md#invalid_request) | `application_id must contain letters, digits and . _ : ~ -, up to 200 characters.` | `param`: `application_id`. `application_id` in the path is not a valid id. | Fix, then retry |
| `400` | [`invalid_request`](https://hirelayer.co/api-docs/errors.md#invalid_request) | `HireLayer-Workspace must contain letters, digits and . _ : ~ -, up to 200 characters.` | `param`: `HireLayer-Workspace`. `HireLayer-Workspace` is not a valid id. | Fix, then retry |
| `401` | [`missing_api_key`](https://hirelayer.co/api-docs/errors.md#missing_api_key) | `The X-API-Key header is missing.` | No `X-API-Key` header. | Fix, then retry |
| `401` | [`missing_api_key`](https://hirelayer.co/api-docs/errors.md#missing_api_key) | `Authorization: Bearer is not accepted: send the key in the X-API-Key header.` | The key sent as `Authorization: Bearer`: it goes in `X-API-Key`. | Fix, then retry |
| `401` | [`missing_api_key`](https://hirelayer.co/api-docs/errors.md#missing_api_key) | `The key goes in the X-API-Key header, not in the URL.` | The key sent in the URL: it goes in `X-API-Key`. | Fix, then retry |
| `401` | [`invalid_api_key`](https://hirelayer.co/api-docs/errors.md#invalid_api_key) | `Invalid API key: it is unknown, malformed or revoked.` | The key is unknown, malformed or revoked. | Fix, then retry |
| `500` | [`internal_error`](https://hirelayer.co/api-docs/errors.md#internal_error) | `Internal error: retry later. If it persists, contact support with the request_id.` | An unexpected error. | Retry with backoff |
| `502` | [`internal_error`](https://hirelayer.co/api-docs/errors.md#internal_error) | `The service could not be reached: retry later.` | The service could not be reached. | Retry with backoff |
| `503` | [`internal_error`](https://hirelayer.co/api-docs/errors.md#internal_error) | `The erasure could not be finished: send the same call again to finish it.` | An erasure could not be finished: the same call finishes it. Headers: `Retry-After: <seconds>`. | Retry with backoff |
| `504` | [`internal_error`](https://hirelayer.co/api-docs/errors.md#internal_error) | `The service did not answer in time. The change may still be applied: read it before sending it again.` | No answer in time. | Retry with backoff |

Example error (`400`):

```json
{
  "error": {
    "code": "invalid_request",
    "message": "application_id must contain letters, digits and . _ : ~ -, up to 200 characters.",
    "param": "application_id",
    "doc_url": "https://hirelayer.co/api-docs/errors#invalid_request"
  },
  "request_id": "6f1c2a4e-1d2b-4c3a-9e8f-0a1b2c3d4e5f"
}
```

## Next

- [Jobs and scores](https://hirelayer.co/api-docs/jobs.md): List, store under your own ids and delete the jobs of a workspace, edit their criteria, and read their ranking again with the recruiter’s priorities.
- [HireLayer Talent Pool Search](https://hirelayer.co/api-docs/search-resumes.md): Find the resumes closest to a job in your resume database, filtered by location and date added, in one call.
