---
title: "Update a user"
method: PUT
path: "/api/v1/users/{id}"
tags: ["users"]
---

# Update a user

`PUT /api/v1/users/{id}`

## Request

- Base URL: `https://app.accessowl.io`
- URL: `https://app.accessowl.io/api/v1/users/{id}`
- Auth: HTTP bearer

Updates the given fields of the user; omitted fields stay untouched and null clears a field. A user managed by an HRIS directory integration gets its name and org info from the directory, so these fields are refused. Its manager can only be changed together with manager_override set to true, which stops the directory sync from changing the manager; manager_override false hands the manager back to the directory.

## Path parameters

- `id` string, uuid, required

## Headers

- `Idempotency-Key` string

## Request body

- UpdateUser: Request body for updating a user. Omitted fields stay untouched; null clears a field. For a user managed by an HRIS directory integration, name and org-info fields are refused and a manager change requires manager_override.
  - `departments` string[]: Departments the user belongs to
  - `employment_type` 'full_time' | 'part_time' | 'contract' | 'freelance' | 'internship' | 'apprenticeship' | 'working_student' | 'training', nullable: Employment type
  - `first_name` string: First name
  - `job_title` string, nullable: Job title
  - `last_name` string: Last name
  - `location_city` string, nullable: City location
  - `manager_override` boolean: Only relevant for a user managed by an HRIS directory integration. true is required to change the manager and stops the directory sync from changing it; false hands the manager back to the directory.
  - `manager_user_id` string, uuid, nullable: Manager user ID. The user's own ID marks them as an executive, who reports to no one.
  - `teams` string[]: Teams the user belongs to

## Response `200`

User updated

- User: A user in the organization
  - `deactivated_at` string, date-time, nullable: Deactivation timestamp
  - `departments` string[]: Departments the user belongs to
  - `email` string, email, required: Email address
  - `employment_type` 'full_time' | 'part_time' | 'contract' | 'freelance' | 'internship' | 'apprenticeship' | 'working_student' | 'training', nullable: Employment type
  - `first_name` string, required: First name
  - `full_name` string: Full name (computed)
  - `id` string, uuid, required: User ID
  - `inserted_at` string, date-time: Creation timestamp
  - `job_title` string, nullable: Job title
  - `last_name` string, required: Last name
  - `location_city` string, nullable: City location
  - `manager_user_id` string, uuid, nullable: Manager user ID
  - `offboarding_scheduled_at` string, date-time, nullable: When the planned offboarding starts
  - `onboarding_scheduled_at` string, date-time, nullable: When the planned onboarding starts provisioning
  - `status` 'active' | 'inactive' | 'onboarding' | 'onboarding_provisioning_planned' | 'offboarding' | 'offboarding_planned' | 'offboarded', required: Current status
  - `teams` string[]: Teams the user belongs to
  - `updated_at` string, date-time: Last update timestamp

## Other responses

- `400`: Bad request
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Not found
- `409`: Conflict
- `422`: Validation error
- `429`: Too many requests

## Changes

- **2026-10-31** `5a1f071e40d8`: 2 breaking, 4 warning, 3 info
  - response property `errors/additionalProperties/items/` list-of-types was widened by adding types `object` to media type `application/json` of response `422`
  - removed the required property `message` from the response with the `401` status
  - removed the optional property `errors` from the response with the `401` status
  - removed the optional property `errors` from the response with the `403` status
  - …5 more
- **2026-09-30** `1cc0fedf0bf8`: 2 info
  - added the optional property `offboarding_scheduled_at` to the response with the `200` status
  - added the optional property `onboarding_scheduled_at` to the response with the `200` status
- **2026-09-30** `56ece6c3256d`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/accessowl/apis/accessowl-api/changes/api/v1/users/:id/put.md)

---

[API](https://skmtc.dev/accessowl/apis/accessowl-api.md) - [All operations](https://skmtc.dev/accessowl/apis/accessowl-api/llms.txt) - [OpenAPI document](https://skmtc.dev/accessowl/apis/accessowl-api/revisions/ff38c63d8807?raw)
