---
title: "Create job"
method: POST
path: "/v3/jobs"
tags: ["Jobs"]
---

# Create job

`POST /v3/jobs`

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.

## Request body

- object
  - `template_job_id` integer, 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_openings` integer, 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_name` string — 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.
  - `notes` string — Internal HTML notes about the job, surfaced to the hiring team in the Greenhouse UI.
  - `job_name` string — Internal job title shown to the hiring team (e.g. `Senior Backend Engineer`). When omitted, the template job's name is used.
  - `department_id` integer, nullable — Id of the department to assign the job to. Mutually exclusive with `external_department_id`.
  - `external_department_id` string, 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_ids` integer[], nullable — Ids of the offices to assign the job to. A job can span multiple offices. Mutually exclusive with `external_office_ids`.
  - `external_office_ids` string[], 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_id` string, 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_ids` string[], 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.
  - `custom_fields` union[] — Values to set on this job's job custom fields. Each entry identifies the field by `custom_field_id` or `name_key` and supplies a `value` whose shape matches the field's `value_type` (see `GET /v3/custom_fields?field_type=job`).
    - union
      - object
        - `name_key` string, required — Required if custom_field_id is not provided. Exactly one of name_key or custom_field_id must be specified.
        - `custom_field_id` integer — Required if name_key is not provided. Exactly one of name_key or custom_field_id must be specified.
        - `value` union
          - string
          - string
          - string
          - string
          - string
          - boolean
          - number — User ID
          - union
            - string[]
            - number[]
          - number
          - object
            - `amount` number, required
            - `currency_code` string, required
          - object
            - `min_amount` number, required
            - `max_amount` number, required
            - `currency_code` string, required
          - object
            - `min_value` number, required
            - `max_value` number, required
      - object
        - `name_key` string — Required if custom_field_id is not provided. Exactly one of name_key or custom_field_id must be specified.
        - `custom_field_id` integer, required — Required if name_key is not provided. Exactly one of name_key or custom_field_id must be specified.
        - `value` union
          - string
          - string
          - string
          - string
          - string
          - boolean
          - number — User ID
          - union
            - string[]
            - number[]
          - number
          - object
            - `amount` number, required
            - `currency_code` string, required
          - object
            - `min_amount` number, required
            - `max_amount` number, required
            - `currency_code` string, required
          - object
            - `min_value` number, required
            - `max_value` number, required

## Response `201`

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.
  - `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.
  - `custom_fields` object, nullable

## Other responses

- `401` — Unauthorized
- `403` — Forbidden
- `422` — Unprocessable Content

---

[API](https://skmtc.dev/greenhouse/apis/auth-api.md) · [All operations](https://skmtc.dev/greenhouse/apis/auth-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/greenhouse/auth-api/revisions/9517a2e54640/schema)
