---
title: "List jobs"
method: GET
path: "/v3/jobs"
tags: ["Jobs"]
---

# List jobs

`GET /v3/jobs`

## Request

- Base URL: `https://harvest.greenhouse.io`
- URL: `https://harvest.greenhouse.io/v3/jobs`
- Auth: one of:
  - OAuth 2
    - Authorization code: `https://auth.greenhouse.io/authorize`
    - Client credentials
    - Token URL: `https://auth.greenhouse.io/token` scopes: `harvest:jobs:list`
  - HTTP bearer

Jobs are the open requisitions and hiring plans your organization is recruiting against. A job carries the role's department, offices, hiring team, interview plan, and custom fields, and is the parent of the openings (headcount slots), job posts (public listings), and applications attached to it. In V3 these related collections live on their own resource endpoints — `/v3/openings`, `/v3/job_posts`, `/v3/applications`, `/v3/job_hiring_managers`, etc. — rather than inlined on the job. Filter by `status` (`open`, `closed`, `draft`), department, office, requisition id, or custom field selection; the response is scoped to jobs the caller's permissions can see.

## Query parameters

- `cursor` string
- `per_page` integer
- `ids` integer[]
- `created_at` object
  - `gte` string, date-time
  - `lte` string, date-time
  - `gt` string, date-time
  - `lt` string, date-time
- `updated_at` object
  - `gte` string, date-time
  - `lte` string, date-time
  - `gt` string, date-time
  - `lt` string, date-time
- `fields` string[]
- `opened_at` object
  - `gte` string, date-time
  - `lte` string, date-time
  - `gt` string, date-time
  - `lt` string, date-time
- `closed_at` object
  - `gte` string, date-time
  - `lte` string, date-time
  - `gt` string, date-time
  - `lt` string, date-time
- `requisition_id` string
- `department_id` integer
- `office_id` integer
- `custom_field_option_id` integer
- `confidential` boolean
- `status` 'open' | 'draft' | 'closed'

## Response `200`

Successful

- object[]
  - `id` integer
  - `created_at` string, date-time
  - `updated_at` string, date-time
  - `name` string: Internal job title shown to the hiring team in Greenhouse (e.g. `Senior Backend Engineer`). Distinct from the external-facing title on each `job_post`.
  - `requisition_id` string, nullable: Partner-supplied external identifier for the requisition (e.g. an HRIS or ATS code). Free-form string, not unique across the organization, and `null` when no external id has been set.
  - `notes` string, nullable: Internal HTML notes about the job, surfaced to the hiring team in the Greenhouse UI. Not exposed on public job posts.
  - `confidential` boolean: If `true`, the job is restricted to users explicitly granted access on the Hiring Team. The legacy Confidential Jobs feature has been sunset — this flag cannot be set on new jobs and is preserved for jobs that already had it enabled.
  - `status` 'open' | 'draft' | 'closed': Lifecycle status of the job. `draft` while it is being scaffolded, `open` once it has at least one open opening, and `closed` after every opening is closed. A job moves to `closed` automatically when its last open opening is closed via `PATCH /v3/openings/{id}`.
  - `opened_at` string, date-time, nullable: Timestamp the job first transitioned to `open`, in ISO 8601. `null` while the job is still in `draft`.
  - `closed_at` string, date-time, nullable: Timestamp the job most recently transitioned to `closed`, in ISO 8601. `null` for jobs that are still `open` or `draft`.
  - `is_template` boolean, nullable: If `true`, this job is a template used as the source for new jobs rather than a real requisition. Templates do not accept applications; reference them via `template_job_id` on `POST /v3/jobs`.
  - `copied_from_id` integer, nullable: Id of the job (typically a template) this job was copied from on creation. `null` when the job was not created from another job.
  - `department_id` integer, nullable: Id of the department this job is assigned to. `null` when no department is set.
  - `external_department_id` string, nullable: `external_id` of the department this job is assigned to, for partners that reconcile jobs against an HRIS by external id. Mirrors the `external_department_id` accepted on create and update. `null` when no department is set or the department has no external id.
  - `office_ids` integer[], nullable: Ids of the offices this job is assigned to. A job can span multiple offices; empty array or `null` when no offices are set.
  - `external_office_ids` string[]: `external_id`s of the offices this job is assigned to, for partners that reconcile jobs against an HRIS by external id. Mirrors the `external_office_ids` accepted on create and update. Offices with no external id set are omitted, so this can be shorter than `office_ids`.
  - `custom_fields` object, nullable: Job custom field values keyed by each field's `name_key`. Only includes fields that apply to this job's offices and departments, by the same rules the Job Info page uses. A field restricted to offices or departments (see `GET /v3/custom_field_offices` and `GET /v3/custom_field_departments`) is left out unless the job is in one of them or in a child of one. A field restricted on both needs a match on each. A job with no offices or departments includes every field. `PATCH /v3/jobs/{id}` returns a 422 for a non-null value on a field left out here. A field that applies but has no value is returned with `value: null`.

---

[API](https://skmtc.dev/greenhouse/apis/harvest-api.md) - [All operations](https://skmtc.dev/greenhouse/apis/harvest-api/llms.txt) - [OpenAPI document](https://skmtc.dev/greenhouse/apis/harvest-api/revisions/822822e3f771?raw)
