---
title: "Bulk update openings"
method: PATCH
path: "/v3/openings/bulk"
tags: ["Openings"]
---

# Bulk update openings

`PATCH /v3/openings/bulk`

Asynchronously patch many openings in a single call, commonly for HRIS integrations that close batches of headcount with `status: "closed"` and `close_reason_id`, or reconcile partner `opening_id` values after a sync. Each item follows the same shape as `PATCH /v3/openings/{id}` with an additional `id` key identifying the opening, and is processed independently. A `bulk_action_uuid` is returned immediately. Per-item success or failure is reported through `GET /v3/bulk_requests/{bulk_action_uuid}`.

## Request body

- object
  - `callback_url` string — Optional HTTPS URL Greenhouse will POST to when every row in `data` has finished. Omit to poll `GET /v3/bulk_requests/{bulk_action_uuid}` instead.
  - `data` object[], required — Array of single-resource update payloads to process. Each item must include the integer `id` of the record to update and otherwise match the schema of the matching non-bulk PATCH endpoint; rows are validated and executed independently.
    - `job_id` integer — Id of the job (requisition) this opening belongs to. Provided to disambiguate the opening; reassigning an opening to a different job is not supported.
    - `opening_id` string — Partner-supplied external identifier for the opening (e.g. an HRIS or ATS position id). Free-form string, not required to be unique across the organization.
    - `close_reason_id` integer — ID of the `close_reason` to record when closing the opening, for example Hire - New Headcount, On Hold, or Requisition Cancelled. Resolve via `GET /v3/close_reasons`. On an open opening, supplying `close_reason_id` without also setting status to closed returns 422; on an already-closed opening, `close_reason_id` can be updated on its own.
    - `status` 'open' | 'closed' — Transition the opening's lifecycle. Pass `closed` to close an open opening (optionally with `close_reason_id`); pass `open` to reopen a closed opening that has not been filled.
    - `target_start_on` string, date — Target start date for the hire that will fill this opening, in ISO 8601 (`YYYY-MM-DD`).
    - `custom_fields` union[] — Values to set on this opening's opening 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=opening`). Replaces the existing values wholesale — send the full desired list, not a delta.
      - 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
              - …
            - number
            - object
              - …
            - object
              - …
            - object
              - …
        - 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
              - …
            - number
            - object
              - …
            - object
              - …
            - object
              - …
    - `id` integer, required

## Response `202`

Accepted

- object
  - `bulk_action_uuid` string — UUID assigned to the new bulk request. Use this with `GET /v3/bulk_requests/{bulk_action_uuid}` to monitor progress and retrieve per-row results.
  - `status` string — Initial lifecycle state of the new bulk request, typically `building` immediately after creation. See the bulk request response schema for the full set of values.
  - `status_url` string — Relative path that returns the current status of the bulk request. Append this to your Harvest base URL to fetch the latest state.

## Other responses

- `401` — Unauthorized
- `413` — Payload is larger than 10MB
- `422` — Validation Error
- `429` — Client has more than 5 active jobs

---

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