> This page is for API, version 2026-01-01 (Stable) (default).
> For other versions, use one of these documentation indexes:
> - 2026-01-01 (Stable) (default): https://developer.deel.com/api/stable/llms.txt

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://developer.deel.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://developer.deel.com/_mcp/server.

# Manage jobs

> How to create and list ATS jobs, understand job statuses, and retrieve job postings.

Jobs are the core unit of the ATS pipeline. Each job represents an open or draft position and must have at least one team, one location, and one employment type before it can receive applications.

Before creating a job, complete the [Getting started](/api/ats-guides/getting-started) guide to retrieve the required reference IDs.

## Job lifecycle

A job moves through the following statuses:

| Status                 | Description                       |
| ---------------------- | --------------------------------- |
| `DRAFT`                | Job created but not yet published |
| `WAITING_FOR_APPROVAL` | Pending approval before opening   |
| `APPROVED`             | Approved but not yet open         |
| `NOT_APPROVED`         | Approval rejected                 |
| `OPEN`                 | Accepting applications            |
| `CLOSED`               | No longer accepting applications  |
| `ARCHIVED`             | Removed from active listings      |

Jobs are opened and closed in the Deel application. The API supports creating jobs and reading their status.

## Create a job

Use [`POST /ats/jobs`](/api/ats-endpoints/ats-jobs/create-ats-job) to create a new job. Provide a `title`, at least one `team_id`, at least one `location_id`, and at least one `employment_type_id`.

#### Request

```bash
curl --request POST 'https://api.letsdeel.com/rest/ats/jobs' \
  --header 'Authorization: Bearer YOUR-TOKEN-HERE' \
  --header 'Content-Type: application/json' \
  --data '{
    "data": {
      "title": "Senior Software Engineer",
      "team_ids": ["team_01hxyz123abc"],
      "location_ids": ["loc_01hxyz456def"],
      "employment_type_ids": ["et_01hxyz789ghi"],
      "department_ids": ["dept_01hxyzjklmno"],
      "richtext_description": "<p>We are looking for a Senior Software Engineer to join our platform team.</p>",
      "is_confidential": false
    }
  }'
```

#### Response

```json
{
  "data": {
    "id": "job_01hxyzpqrstu",
    "title": "Senior Software Engineer",
    "status": "DRAFT",
    "job_teams": [
      {
        "id": "jt_01hxyz111vwx",
        "team": {
          "id": "team_01hxyz123abc",
          "name": "Platform"
        }
      }
    ],
    "job_locations": [
      {
        "id": "jl_01hxyz222yza",
        "location": {
          "id": "loc_01hxyz456def",
          "name": "Remote — Global"
        }
      }
    ],
    "job_employment_types": [
      {
        "id": "jet_01hxyz333bcd",
        "employment_type": {
          "id": "et_01hxyz789ghi",
          "name": "Full-time"
        }
      }
    ],
    "created_at": "2026-05-04T10:00:00Z",
    "updated_at": "2026-05-04T10:00:00Z",
    "applications_count": 0,
    "is_confidential": false
  }
}
```

Store the returned `job.id`. You will need it when creating applications.

> **Tip**
>
> The `job_employment_types[].id` field (the join record ID, e.g. `jet_01hxyz333bcd`) is different from the `employment_type.id`. When creating applications, use the `job_employment_type_id` (the join record ID), not the employment type ID directly.

## List and filter jobs

Use [`GET /ats/jobs`](/api/ats-endpoints/ats-jobs/retrieve-a-list-of-ats-jobs) to retrieve jobs. You can filter by status, location, team, employment type, or department.

#### Request

```bash
curl --request GET 'https://api.letsdeel.com/rest/ats/jobs?status=OPEN&limit=20' \
  --header 'Authorization: Bearer YOUR-TOKEN-HERE'
```

Available filters:

| Parameter             | Type            | Description                                 |
| --------------------- | --------------- | ------------------------------------------- |
| `status`              | array           | Filter by job status (e.g. `OPEN`, `DRAFT`) |
| `location_ids`        | array           | Filter by location IDs                      |
| `team_ids`            | array           | Filter by team IDs                          |
| `employment_type_ids` | array           | Filter by employment type IDs               |
| `department_ids`      | array           | Filter by department IDs                    |
| `search`              | string          | Full-text search across job titles          |
| `updated_after`       | ISO 8601 string | Return jobs updated after this timestamp    |
| `cursor`              | string          | Pagination cursor from previous response    |
| `limit`               | integer         | Results per page                            |

## Retrieve job postings

Job postings are the published representations of jobs on job boards. Retrieve them to sync listing data with an external system.

#### Request

```bash
curl --request GET 'https://api.letsdeel.com/rest/ats/job-postings?job_id=job_01hxyzpqrstu' \
  --header 'Authorization: Bearer YOUR-TOKEN-HERE'
```

You can also retrieve postings for a specific job board:

#### Request

```bash
curl --request GET 'https://api.letsdeel.com/rest/ats/job-boards/{job_board_id}/job-postings' \
  --header 'Authorization: Bearer YOUR-TOKEN-HERE'
```

Job posting sources include: `INTERNAL_CAREER_PAGE`, `EXTERNAL_CAREER_PAGE`, and `LINKEDIN`.

> **Warning**
>
> Job postings are read-only via the API. No endpoint exists to create, publish, or unpublish a posting, and Deel provides no embeddable widget. Use the Deel application to manage job board publications.

## Best practices

* **Retrieve reference IDs fresh at startup**: Location, employment type, and department IDs rarely change but should be fetched at integration startup rather than hardcoded.
* **Store `job_employment_type_id` alongside `job_id`**: You need the join record ID (not the employment type ID) when creating applications. Retrieve it from [`GET /ats/jobs`](/api/ats-endpoints/ats-jobs/retrieve-a-list-of-ats-jobs) and store it with the job record.
* **Use `updated_after` for sync**: When polling for job changes, use the `updated_after` filter with the timestamp of your last successful sync to retrieve only changed records.

## Next steps

#### [Candidates and applications](/api/ats-guides/manage-candidates-and-applications)

Create candidates and submit applications to the jobs you just created.

#### [Getting started](/api/ats-guides/getting-started)

Review how to retrieve team, location, and employment type IDs.

#### [Authentication](/api/authentication)

Learn how to generate and manage API tokens.

#### [ATS overview](/api/ats-guides/introduction)

Review the full ATS data model and limitations.