---
title: "Bulk create custom field options"
method: POST
path: "/v3/custom_field_options/bulk"
tags: ["Custom Field Options"]
---

# Bulk create custom field options

`POST /v3/custom_field_options/bulk`

## Request

- Base URL: `https://harvest.greenhouse.io`
- URL: `https://harvest.greenhouse.io/v3/custom_field_options/bulk`
- Auth: OAuth 2
  - Authorization code: `https://auth.greenhouse.io/authorize`
  - Client credentials
  - Token URL: `https://auth.greenhouse.io/token` scopes: `harvest:custom_field_options:create`

Asynchronously add many options at once, typically for HRIS sync workflows that replace or extend a dropdown's option set in a single pass. Each item includes its own `custom_field_id`, so one batch can target multiple parent fields. 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 create payloads to process. Each item must match the schema of the matching non-bulk POST endpoint.
    - `name` string, required: Display label for the option. Must be unique among active options on the same custom field. If an archived option on the field already has this name, the create reactivates that option under its original id instead of adding a duplicate.
    - `sort_order` integer, required: Display position within the dropdown. Lower values render first. Greenhouse does not normalize gaps, so partners managing reorderings typically space values (e.g. 10, 20, 30) to leave room for inserts.
    - `custom_field_id` integer, required: Id of the parent custom field. Must be a `single_select` or `multi_select` field in the caller's organization.
    - `external_id` string: Optional caller-supplied identifier from the partner's source system (e.g. an HRIS row id). Stored verbatim and returned on subsequent reads as `external_id`.

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