v1

latestOpenAPI 3.1.02026-07-261770816.7 KB
Jobs

Create job

Create a new job from an existing template. template_job_id and number_of_openings are required; the template supplies the interview plan, scorecards, hiring team, and approval workflow, since Greenhouse Recruiting remains the source of truth for those configurations. One opening is created for each requested slot, optionally tagged with a partner opening_ids entry. Department and offices can be set either by Greenhouse id (department_id, office_ids) or by partner external_id (external_department_id, external_office_ids) — the id and external-id forms are mutually exclusive. The legacy confidential flag cannot be set through this endpoint.

post/v3/jobs

Request body

template_job_idinteger required

Id of an existing job (typically a template) used as the source for this job's interview plan, scorecards, hiring team, and approval workflow. Required — Greenhouse Recruiting remains the source of truth for these configurations, so new jobs always inherit them from a template.

number_of_openingsinteger required

Number of openings to create on the new job. Each opening can be filled by a single hire. The total open openings across the job cannot exceed Greenhouse's internal limit of 100; requests that would exceed it are rejected.

job_post_namestring

External-facing title for the job's initial internal job post (the listing shown on the company's careers site). Defaults to job_name when omitted.

notesstring

Internal HTML notes about the job, surfaced to the hiring team in the Greenhouse UI.

job_namestring

Internal job title shown to the hiring team (e.g. Senior Backend Engineer). When omitted, the template job's name is used.

department_idinteger nullable

Id of the department to assign the job to. Mutually exclusive with external_department_id.

external_department_idstring nullable

Partner-supplied external_id of the department to assign the job to. Resolved to a Greenhouse department_id in the caller's organization; unknown values are rejected. Mutually exclusive with department_id.

office_idsinteger[] nullable

Ids of the offices to assign the job to. A job can span multiple offices. Mutually exclusive with external_office_ids.

external_office_idsstring[] nullable

Partner-supplied external_id values of the offices to assign the job to. Each entry is resolved to a Greenhouse office_id in the caller's organization; unknown values are rejected. Mutually exclusive with office_ids.

requisition_idstring nullable

Partner-supplied external identifier for the requisition (e.g. an HRIS or ATS code). Free-form string and not required to be unique across the organization.

opening_idsstring[] nullable

Optional partner-supplied identifiers for the openings being created — one entry per new opening, paired positionally with number_of_openings. Each value is stored on the resulting opening as its opening_id (a free-form string, not the Greenhouse opening id) and may be null. Greenhouse enforces an internal limit of 100 open openings per job; requests that would exceed it fail.

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.

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.

custom_fieldsobject nullable