---
title: "Update user"
method: PATCH
path: "/v3/users/{id}"
tags: ["Users"]
---

# Update user

`PATCH /v3/users/{id}`

Patch an existing user's profile fields. Only the keys included in the request body are modified; all other fields are left unchanged. Array assignments (`office_ids`, `department_ids`, `interviewer_tag_ids`) fully replace the existing set — pass an empty array to clear it. A `primary_email` update is only accepted when the new value is already a verified email address on the user's account. To toggle activation, site admin status, or job-level permissions, use the dedicated endpoints (`activate`, `deactivate`, `revoke_permissions`, `/v3/user_job_permissions`) rather than this one.

## Path parameters

- `id` integer, required

## Request body

- object
  - `first_name` string
  - `last_name` string
  - `primary_email` string, email — New primary email for the user. Must already be a verified email address on the user's account — call the V1/V2 endpoint to add and verify a new email address before promoting it here.
  - `job_title` string — New job title for the user's Greenhouse profile.
  - `employee_id` string — Partner-supplied external employee identifier (typically the user's HRIS or payroll id) to set on the user.
  - `office_ids` integer[] — Greenhouse office ids to pin the user to. Replaces the user's current office assignments. Mutually exclusive with `external_office_ids`.
  - `external_office_ids` string[] — External office identifiers (the offices' `external_id`) to pin the user to. Replaces the user's current office assignments. Mutually exclusive with `office_ids`.
  - `department_ids` integer[] — Greenhouse department ids to pin the user to. Replaces the user's current department assignments. Mutually exclusive with `external_department_ids`.
  - `external_department_ids` string[] — External department identifiers (the departments' `external_id`) to pin the user to. Replaces the user's current department assignments. Mutually exclusive with `department_ids`.
  - `interviewer_tag_ids` integer[] — Ids of interviewer tags to apply to the user. Replaces the user's current set of interviewer tags.
  - `custom_fields` union[]
    - 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
          - boolean
          - number — User ID
          - union
            - string[]
            - number[]
      - 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
          - boolean
          - number — User ID
          - union
            - string[]
            - number[]

## Response `200`

Successful

- object
  - `id` integer
  - `created_at` string, date-time
  - `updated_at` string, date-time
  - `first_name` string, nullable
  - `last_name` string, nullable
  - `primary_email` string — Primary email address on the user's account. Sign-in identifier and the address Greenhouse uses for outbound mail; additional verified addresses are not surfaced here. Service accounts (integration/ISU users) have no email and are excluded from this endpoint by default; when included via `show_service_accounts=true`, their `primary_email` is an empty string.
  - `job_title` string, nullable — Free-form job title set on the user's Greenhouse profile (e.g. `Senior Recruiter`). Not synchronized with any HRIS title.
  - `agency_id` integer, nullable — Id of the staffing agency this user belongs to, when the user is an external agency recruiter rather than an employee of your organization. `null` for in-house users.
  - `name` string, nullable — Concatenation of `first_name` and `last_name` rendered as a single display string. Provided for convenience; partners that need either component should read `first_name`/`last_name` directly.
  - `deactivated` boolean — Whether the user has been deactivated. Deactivated users cannot sign in or be assigned to new jobs, but their historical activity (notes, scorecards, emails) is preserved. Toggle via `POST /v3/users/{id}/deactivate` and `POST /v3/users/{id}/activate`.
  - `site_admin` boolean — Whether the user holds the Site Admin role. Site admins have unrestricted access to every non-confidential job and to organization-level settings. Demote a site admin to a Basic user with `POST /v3/users/{id}/revoke_permissions`.
  - `employee_id` string, nullable — Partner-supplied external employee identifier, typically the user's HRIS or payroll id. Free-form string; not unique across organizations and `null` when no employee id has been set.
  - `linked_candidate_ids` integer[] — Ids of candidate records linked to this user. Populated when an employee is represented by both a user record (for Greenhouse access) and a candidate record (for past or internal applications).
  - `office_ids` integer[] — Ids of the offices this user is assigned to. Used to scope future job permissions and to filter the user list by office. Empty when the user is not pinned to any office.
  - `department_ids` integer[] — Ids of the departments this user is assigned to. Used to scope future job permissions and to filter the user list by department. Empty when the user is not pinned to any department.
  - `interviewer_tags` object[] — Interviewer tags applied to this user — the labeled skill or panel groupings (e.g. `Senior Engineer`, `Bar Raiser`) used to suggest qualified interviewers when building an interview plan. Each entry pairs the tag's `id` with its `name`.
    - `id` integer, required
    - `name` string, required
  - `emails` string[] — All email addresses on the user's account, including the primary address and any additional verified addresses.
  - `custom_fields` object, nullable

## Other responses

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

---

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