---
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`

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; rows are validated and executed independently in their own Sidekiq jobs.
    - `name` string, required — Display label for the option. Must be unique among active options on the same custom field; if an archived option already has this name, it is silently reactivated instead of creating 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.net/greenhouse/apis/auth-api.md) · [All operations](https://skmtc.net/greenhouse/apis/auth-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/greenhouse/auth-api/versions/9517a2e54640/schema)
