Jobs

Search jobs

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.

get/v3/jobs/search

Request

  • Base URL
    https://harvest.greenhouse.io
  • URL
    https://harvest.greenhouse.io/v3/jobs/search
  • Auth
    • OAuth 2
      Authorization code: https://auth.greenhouse.io/authorize
      Client credentials
      Token URL: https://auth.greenhouse.io/token scopes: harvest:jobs:list
    • or HTTP bearer

Query parameters

cursorstring

Cursor link for pagination from previous page response header. Do not use any other parameters when using this.

per_pageinteger

Number of results per page

fieldsstring[]

Comma separated list of fields to return

searchstring

Free-text search term.

status'all' | 'open' | 'closed' | 'draft'

Filter by job lifecycle status. all returns every status.

department_idinteger

Return only jobs assigned to this department.

office_idinteger

Return only jobs assigned to this office.

externalboolean

When true, return only jobs that have at least one external (public-facing) job post.

user_idinteger

Return only jobs that the given user is assigned to. Combine with user_role to scope by role; without user_role, any role matches.

user_role'any_role' | 'hiring_manager' | 'recruiter' | 'coordinator' | 'sourcer' | 'following'

Restrict the user_id filter to a specific role on the job. Has no effect without user_id.

job_custom_field_idstring

Custom field to filter jobs by. Only applies together with job_custom_field_answer_id; on its own it is ignored and does not narrow the results.

job_custom_field_answer_idstring

Answer to match for job_custom_field_id: a custom field option id for single- and multi-select fields, a user id for user fields, or 1/0 for yes/no fields. Required for the custom field filter to apply.

templates'exclude' | 'include' | 'only'

How to filter template jobs (jobs used as scaffolding when creating new jobs). exclude (default) returns only non-template jobs, include returns both, only returns just template jobs.

Response

Successful

idinteger
created_atstring date-time
updated_atstring date-time
namestring

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_idstring 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.

notesstring nullable

Internal HTML notes about the job, surfaced to the hiring team in the Greenhouse UI. Not exposed on public job posts.

confidentialboolean

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_atstring date-time nullable

Timestamp the job first transitioned to open, in ISO 8601. null while the job is still in draft.

closed_atstring date-time nullable

Timestamp the job most recently transitioned to closed, in ISO 8601. null for jobs that are still open or draft.

is_templateboolean 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_idinteger 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_idinteger nullable

Id of the department this job is assigned to. null when no department is set.

external_department_idstring 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_idsinteger[] 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_idsstring[]

external_ids 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_fieldsobject 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.

Changes

No recorded changes to this operation across all 1 revision of this API.