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

# Search jobs

`GET /v3/jobs/search`

## Request

- Base URL: `https://harvest.greenhouse.io`
- URL: `https://harvest.greenhouse.io/v3/jobs/search`
- 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

Search jobs by free-text term, returning the same job shape as `GET /v3/jobs` with hiring-team and custom-field filters (assigned user and role, department, office, external posting, custom field answer, templates). Use this when you need to combine free-text matching with those filters; for simple lookups by id or timestamp, prefer the list endpoint.

## Query parameters

- `cursor` string
- `per_page` integer
- `fields` string[]
- `search` string
- `status` 'all' | 'open' | 'closed' | 'draft'
- `department_id` integer
- `office_id` integer
- `external` boolean
- `user_id` integer
- `user_role` 'any_role' | 'hiring_manager' | 'recruiter' | 'coordinator' | 'sourcer' | 'following'
- `job_custom_field_id` string
- `job_custom_field_answer_id` string
- `templates` 'exclude' | 'include' | 'only'

## 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)
