---
title: "Bulk create user job permissions"
method: POST
path: "/v3/user_job_permissions/bulk"
tags: ["User Job Permissions"]
---

# Bulk create user job permissions

`POST /v3/user_job_permissions/bulk`

## Request

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

Asynchronously grant Job Admin roles on specific jobs to many users in a single call. Each item follows the same shape as `POST /v3/user_job_permissions`, with `job_id`, `user_id`, and `role_id` required, 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}`. Items whose `user_id` references a site admin create no permission row and are reported as successful with an empty result, since site admins already have access to every non-confidential job.

## 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.
    - `job_id` integer, required: Id of the job to grant access to. Must reference a job in the caller's organization.
    - `user_id` integer, required: Id of the user who should receive the role on this job. Must reference a user in the caller's organization. If the user is a site admin, the request returns `204 No Content` and no permission row is created — site admins already have access to every non-confidential job.
    - `role_id` integer, required: Id of the Job Admin role to grant on this job. Must reference a `user_role` with `role_type: job_admin`; site admin and deprecated role types are rejected.

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