> This page is for version v1.
> For other versions, use one of these documentation indexes:
> - v2 (default): https://autodesk-poc.ferndocs.com/v2/llms.txt
> - v1: https://autodesk-poc.ferndocs.com/v1/llms.txt

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://autodesk-poc.ferndocs.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://autodesk-poc.ferndocs.com/_mcp/server.

# Update project user

PATCH https://developer.api.autodesk.com/construction/admin/v1/projects/{projectId}/users/{userId}
Content-Type: application/json

Updates information about the specified user in a project.

Note that the `Authorization` header token can be obtained either via a [three-legged](https://aps.autodesk.com/en/docs/oauth/v2/tutorials/get-3-legged-token/) OAuth flow, or via a [two-legged](https://aps.autodesk.com/en/docs/oauth/v2/tutorials/get-2-legged-token/) Oauth flow *with user impersonation*, for which the `User-Id` header is required.

Note that the response includes only the updated fields along with the Forma ID of the user.

**Note:** This operation is not backward compatible with BIM 360 projects. It only works with Autodesk Construction Cloud projects.

Reference: https://autodesk-poc.ferndocs.com/v1/acc-admin/project-users/update-project-user

## Authentication

- OAuth2 — send the obtained token as `Authorization: Bearer <token>`
- `Authorization` header (bearer token, required) — **OAuth 2.0 (3-legged)** — user context required. Also accepts a Secure Service Account (SSA) token, which is headless like a two-legged flow but classified as three-legged because it preserves user context. **Authorization Code Flow** Authorization URL: [https://developer.api.autodesk.com/authentication/v2/authorize](https://developer.api.autodesk.com/authentication/v2/authorize) Token URL: [https://developer.api.autodesk.com/authentication/v2/token](https://developer.api.autodesk.com/authentication/v2/token) Refresh URL: [https://developer.api.autodesk.com/authentication/v2/token](https://developer.api.autodesk.com/authentication/v2/token) Scopes: - `data:read` — read your data - `account:read` — read account and project data - `account:write` — modify account and project data

## Request

### Path parameters

- `projectId` (string, required) — The ID of the project. This corresponds to project ID in the [Data Management API](https://aps.autodesk.com/en/docs/data/v2/). To convert a project ID in the Data Management API into a project ID in the Forma API you need to remove the "**b.**\" prefix. For example, a project ID of `b.a4be0c34a-4ab7` translates to a project ID of `a4be0c34a-4ab7`.
- `userId` (string, required) — The ID of the user. To find the ID call [GET users](https://aps.autodesk.com/en/docs/acc/v1/reference/http/admin-projectsprojectId-users-GET/). You can use either the Forma ID (`id`) or the Autodesk ID (`autodeskId`).

### Headers

- `Accept-Language` (string, optional, default: en) — This header is not currently supported in the hub Admin API.
- `Region` (string, optional) — Specifies the region where your request should be routed. If not set, the request is routed automatically, which may result in a slight increase in latency. Possible values: `US`, `EMEA`. For a complete list of supported regions, see the [Regions](https://aps.autodesk.com/en/docs/acc/v1/overview/acc-regions/) page.
- `User-Id` (string, optional) — The ID of a user on whose behalf your request is acting. Your app has access to all users specified by the administrator in the SaaS integrations UI. Provide this header value to identify the user to be affected by the request. You can use either the user's Forma ID (`id`), or their Autodesk ID (`autodeskId`). Note that this header is required for hub Admin POST, PATCH, and DELETE endpoints if you want to use a 2-legged authentication context. This header is optional for hub Admin GET endpoints.

### Body (application/json)

This endpoint expects a patchProjectUserRequest.

- `id` (string, optional) — The Forma ID of the user.
- `name` (string, optional) — The full name of the user.
- `firstName` (string, optional) — The user's first name. This data syncs from the user's Autodesk profile.
- `lastName` (string, optional) — The user's last name. This data syncs from the user's Autodesk profile.
- `addressLine1` (string, optional) — The user's address line 1. This data syncs from the user's Autodesk profile.
- `addressLine2` (string, optional) — The user's address line 2. This data syncs from the user's Autodesk profile.
- `city` (string, optional) — The User's city. This data syncs from the user's Autodesk profile.
- `stateOrProvince` (string, optional) — The state or province of the user. The accepted values here change depending on which country is provided. This data syncs from the user's Autodesk profile.
- `postalCode` (string, optional) — The zip or postal code of the user. This data syncs from the user's Autodesk profile.
- `country` (string, optional) — The user's country. This data syncs from the user's Autodesk profile.
- `phone` (projectUserResource/properties/phone, optional) — The user's phone number. This data syncs from the user's Autodesk profile.
- `accessLevels` (projectUserResource/properties/accessLevels, optional) — Flags indicating the user's access levels in the hub.
- `companyId` (string, optional) — The ID of the company that the user is representing in the project. To obtain a list of all company IDs associated with a project, call [GET projects/:projectId/companies](https://aps.autodesk.com/en/docs/acc/v1/reference/http/projects-:project_id-companies-GET/).
- `companyName` (string, optional) — The name of the company to which the user belongs.
- `roleIds` (list of string, optional) — A list of IDs of the roles that the user belongs to in the project.
- `status` (string, optional) — The status of the user on the hub. A pending user could be waiting for its products to activate or the user hasn't accepted an email to create a hub with Autodesk. Possible values: `active`, `pending`, `disabled`, and `deleted`.'
- `products` (list of ProjectUserProductsResponseItems, optional) — Information about the products activated in the specified project for this user. Do not include this field if the requester has Member Manager access level.
- `imageUrl` (string, optional) — The URL of the user's avatar. This data syncs from the user's Autodesk profile.
- `autodeskId` (string, optional) — The ID of the user's Autodesk profile.
- `analyticsId` (string, optional) — An ID of the user to be used for analytics.
- `jobTitle` (string, optional) — The user's job title. This data syncs from the user's Autodesk profile.
- `industry` (string, optional) — The industry the user works in. This data syncs from the user's Autodesk profile.
- `aboutMe` (string, optional) — A short bio about the user. This data syncs from the user's Autodesk profile.

## Response

### 200

The project user was successfully updated. The response includes only the fields being updated along with the Forma ID of the user.

- `id` (string, optional) — The Forma ID of the user.
- `email` (string, optional) — The email of the user.
- `name` (string, optional) — The full name of the user.
- `firstName` (string, optional) — The user's first name. This data syncs from the user's Autodesk profile.
- `lastName` (string, optional) — The user's last name. This data syncs from the user's Autodesk profile.
- `addressLine1` (string, optional) — The user's address line 1. This data syncs from the user's Autodesk profile.
- `addressLine2` (string, optional) — The user's address line 2. This data syncs from the user's Autodesk profile.
- `city` (string, optional) — The User's city. This data syncs from the user's Autodesk profile.
- `stateOrProvince` (string, optional) — The state or province of the user. The accepted values here change depending on which country is provided. This data syncs from the user's Autodesk profile.
- `postalCode` (string, optional) — The zip or postal code of the user. This data syncs from the user's Autodesk profile.
- `country` (string, optional) — The user's country. This data syncs from the user's Autodesk profile.
- `phone` (projectUserResource/properties/phone, optional) — The user's phone number. This data syncs from the user's Autodesk profile.
- `accessLevels` (projectUserResource/properties/accessLevels, optional) — Flags indicating the user's access levels in the hub.
- `addedOn` (datetime, optional) — The timestamp when the user was first given access to any product on the project.
- `updatedAt` (datetime, optional) — The timestamp when the project user was last updated, in ISO 8601 format.
- `companyId` (string, optional) — The ID of the company that the user is representing in the project. To obtain a list of all company IDs associated with a project, call [GET projects/:projectId/companies](https://aps.autodesk.com/en/docs/acc/v1/reference/http/projects-:project_id-companies-GET/).
- `companyName` (string, optional) — The name of the company to which the user belongs.
- `roleIds` (list of string, optional) — A list of IDs of the roles that the user belongs to in the project.
- `roles` (list of any, optional) — A list of the role IDs and names that are associated with the user in the project.
- `status` (string, optional) — The status of the user on the hub. A pending user could be waiting for its products to activate or the user hasn't accepted an email to create a hub with Autodesk. Possible values: `active`, `pending`, `disabled`, and `deleted`.'
- `products` (list of ProjectUserProductsResponseItems, optional) — Information about the products activated in the specified project for this user. Do not include this field if the requester has Member Manager access level.
- `imageUrl` (string, optional) — The URL of the user's avatar. This data syncs from the user's Autodesk profile.
- `autodeskId` (string, optional) — The ID of the user's Autodesk profile.
- `analyticsId` (string, optional) — An ID of the user to be used for analytics.
- `jobTitle` (string, optional) — The user's job title. This data syncs from the user's Autodesk profile.
- `industry` (string, optional) — The industry the user works in. This data syncs from the user's Autodesk profile.
- `aboutMe` (string, optional) — A short bio about the user. This data syncs from the user's Autodesk profile.
- `jobId` (string, optional) — Not relevant - we don't currently support this field.

## Errors

### 400 Bad Request Error

The request could not be understood by the server due to malformed syntax.

- `status` (integer, optional) — The status code for the error.
- `type` (string, optional) — HQ defined error code for the type of error.
- `title` (string, optional) — The title of the error. ex: Bad Request.
- `detail` (string, optional) — A detailed description of the error with possible suggestions for fixing them.
- `id` (string, optional) — A unique id for the request.
- `errors` (list of fieldError, optional) — List of field validation errors.

### 401 Unauthorized Error

Request has not been applied because it lacks valid authentication credentials for the target resource.

- `authenticationUrl` (string, optional) — The url used for authenticating the user.
- `status` (integer, optional) — The status code for the error.
- `type` (string, optional) — HQ defined error code for the type of error.
- `title` (string, optional) — The title of the error. ex: Bad Request.
- `detail` (string, optional) — A detailed description of the error with possible suggestions for fixing them.
- `id` (string, optional) — A unique id for the request.

### 403 Forbidden Error

The server understood the request but refuses to authorize it.

- `status` (integer, optional) — The status code for the error.
- `type` (string, optional) — HQ defined error code for the type of error.
- `title` (string, optional) — The title of the error. ex: Bad Request.
- `detail` (string, optional) — A detailed description of the error with possible suggestions for fixing them.
- `id` (string, optional) — A unique id for the request.

### 404 Not Found Error

The resource could not be found.

- `status` (integer, optional) — The status code for the error.
- `type` (string, optional) — HQ defined error code for the type of error.
- `title` (string, optional) — The title of the error. ex: Bad Request.
- `detail` (string, optional) — A detailed description of the error with possible suggestions for fixing them.
- `id` (string, optional) — A unique id for the request.

### 410 Gone Error

Access to the target resource is no longer available.

- `status` (integer, optional) — The status code for the error.
- `type` (string, optional) — HQ defined error code for the type of error.
- `title` (string, optional) — The title of the error. ex: Bad Request.
- `detail` (string, optional) — A detailed description of the error with possible suggestions for fixing them.
- `id` (string, optional) — A unique id for the request.

### 415 Unsupported Media Type Error

The server refuses to accept the request because the payload format is in an unsupported format.

- `status` (integer, optional) — The status code for the error.
- `type` (string, optional) — HQ defined error code for the type of error.
- `title` (string, optional) — The title of the error. ex: Bad Request.
- `detail` (string, optional) — A detailed description of the error with possible suggestions for fixing them.
- `id` (string, optional) — A unique id for the request.

### 429 Too Many Requests Error

User has sent too many requests in a given amount of time.

- `any`

### 500 Internal Server Error

An unexpected error occurred on the server.

- `status` (integer, optional) — The status code for the error.
- `type` (string, optional) — HQ defined error code for the type of error.
- `title` (string, optional) — The title of the error. ex: Bad Request.
- `detail` (string, optional) — A detailed description of the error with possible suggestions for fixing them.
- `id` (string, optional) — A unique id for the request.

### 503 Service Unavailable Error

Server is not ready to handle the request.

- `status` (integer, optional) — The status code for the error.
- `type` (string, optional) — HQ defined error code for the type of error.
- `title` (string, optional) — The title of the error. ex: Bad Request.
- `detail` (string, optional) — A detailed description of the error with possible suggestions for fixing them.
- `id` (string, optional) — A unique id for the request.

## Types

### projectUserResource/properties/phone

The user's phone number. This data syncs from the user's Autodesk profile.

- `number` (string, optional) — User's phone number
- `phoneType` (any, optional, default: mobile) — The user's phone type. Possible values: `home`, `mobile`, or `office`. Default value: `mobile`.
- `extension` (string, optional) — User's phone extension.

### projectUserResource/properties/accessLevels

Flags indicating the user's access levels in the hub.

- `accountAdmin` (boolean, optional) — Indicates whether the user is a hub administrator for the hub. Possible values: - `true`: The user is a hub administrator. - `false`: The user is not a hub administrator.
- `projectAdmin` (boolean, optional) — Indicates whether the user is a project administrator for the project. Possible values: - `true`: The user is a project administrator. - `false`: The user is not a project administrator.
- `executive` (boolean, optional) — Indicates whether the user is an executive in the hub. Possible values: - `true`: The user is an executive. - `false`: The user is not an executive.

### ProjectUserProductsResponseItems

- `key` (enum, required) — A machine-readable identifier for the product (e.g., docs, build). Each product has a unique key used throughout the API for identification, filtering, and integration logic (e.g., in query parameters like `filter[key]`). Possible values: Forma - `autoSpecs`, `build`, `cost`, `designCollaboration`, `docs`, `insight`, `modelCoordination`, `projectAdministration`, `formaBidBoard` and `takeoff`. BIM 360 - `assets`, `costManagement`, `designCollaboration`, `documentManagement`, `field`, `fieldManagement`, `glue`, `insight`, `modelCoordination`, `plan`, `projectAdministration`, `projectHome`, `projectManagement` and `quantification`. Note that this endpoint returns only Forma products. Other endpoints, such as [GET projects](https://aps.autodesk.com/en/docs/acc/v1/reference/http/admin-accountsaccountidprojects-GET/) and [GET projects/:projectId](https://aps.autodesk.com/en/docs/acc/v1/reference/http/admin-projects-projectId-GET/), may return both Forma and BIM 360 projects. In those responses, product keys may include BIM 360 values.
  - Allowed values: `assets`, `autoSpecs`, `build`, `buildingConnected`, `capitalPlanning`, `cost`, `costManagement`, `designCollaboration`, `docs`, `documentManagement`, `field`, `fieldManagement`, `financials`, `glue`, `workshopxr`, `insight`, `modelCoordination`, `plan`, `projectAdministration`, `projectHome`, `projectManagement`, `quantification`, `takeoff`, `info360Insight`, `info360Plant`, `info360Asset`, `info360Model`, `forma`, `datum`, `datcls`, `formaBidBoard`
- `access` (enum, required) — The user's type of access to the product identified by `key`. Possible values: - `administrator` - `member` - `none` Note that when you're using a POST or PATCH endpoint to set this value, you must adhere to the following guidelines: - If you set a product's `key` to `projectAdministration` and you set `access` to `none`, all other products should be set to `member` access for the user. - If you set a product's `key` to `projectAdministration` and you set `access` to `administrator`, all other products should be set to `administrator` access for the user. - You cannot set a product's `key` to `projectAdministration` and set `access` to `member`.
  - Allowed values: `administrator`, `member`, `none`

### fieldError

Error description for a field validation error.

- `type` (string, optional) — HQ defined error code for the type of error.
- `field` (string, optional) — Name of the field associated to the error.
- `title` (string, optional) — Title for the error.
- `detail` (string, optional) — A detailed description of the error so the user knows how to fix it.

## Examples

**Request**

```json
{}
```

**Response**

```json
{
  "id": "39712a51-bd64-446a-9c72-48c4e43d0a0d",
  "companyId": "c32ffb13-83f8-43fb-bddf-3e5c0c2dda24",
  "roleIds": [
    "cda845af-05f0-4c46-9108-71b993946c35",
    "b8e84a73-7506-4d3f-b221-93691df2a359"
  ],
  "products": [
    {
      "key": "projectAdministration",
      "access": "administrator"
    },
    {
      "key": "designCollaboration",
      "access": "administrator"
    },
    {
      "key": "build",
      "access": "administrator"
    },
    {
      "key": "cost",
      "access": "administrator"
    },
    {
      "key": "modelCoordination",
      "access": "administrator"
    },
    {
      "key": "docs",
      "access": "administrator"
    },
    {
      "key": "insight",
      "access": "administrator"
    },
    {
      "key": "takeoff",
      "access": "administrator"
    }
  ]
}
```

**SDK Code**

```python
import requests

url = "https://developer.api.autodesk.com/construction/admin/v1/projects/367d5cc2-9008-462c-96e5-c9491db85d93/users/6cc15635-2fbd-4f73-afbe-abd833408a1d"

payload = {}
headers = {
    "Accept-Language": "en",
    "Region": "US",
    "User-Id": "6cc15635-2fbd-4f73-afbe-abd833408a1d",
    "Authorization": "<token>.",
    "Content-Type": "application/json"
}

response = requests.patch(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://developer.api.autodesk.com/construction/admin/v1/projects/367d5cc2-9008-462c-96e5-c9491db85d93/users/6cc15635-2fbd-4f73-afbe-abd833408a1d';
const options = {
  method: 'PATCH',
  headers: {
    'Accept-Language': 'en',
    Region: 'US',
    'User-Id': '6cc15635-2fbd-4f73-afbe-abd833408a1d',
    Authorization: '<token>.',
    'Content-Type': 'application/json'
  },
  body: '{}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://developer.api.autodesk.com/construction/admin/v1/projects/367d5cc2-9008-462c-96e5-c9491db85d93/users/6cc15635-2fbd-4f73-afbe-abd833408a1d"

	payload := strings.NewReader("{}")

	req, _ := http.NewRequest("PATCH", url, payload)

	req.Header.Add("Accept-Language", "en")
	req.Header.Add("Region", "US")
	req.Header.Add("User-Id", "6cc15635-2fbd-4f73-afbe-abd833408a1d")
	req.Header.Add("Authorization", "<token>.")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://developer.api.autodesk.com/construction/admin/v1/projects/367d5cc2-9008-462c-96e5-c9491db85d93/users/6cc15635-2fbd-4f73-afbe-abd833408a1d")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Patch.new(url)
request["Accept-Language"] = 'en'
request["Region"] = 'US'
request["User-Id"] = '6cc15635-2fbd-4f73-afbe-abd833408a1d'
request["Authorization"] = '<token>.'
request["Content-Type"] = 'application/json'
request.body = "{}"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.patch("https://developer.api.autodesk.com/construction/admin/v1/projects/367d5cc2-9008-462c-96e5-c9491db85d93/users/6cc15635-2fbd-4f73-afbe-abd833408a1d")
  .header("Accept-Language", "en")
  .header("Region", "US")
  .header("User-Id", "6cc15635-2fbd-4f73-afbe-abd833408a1d")
  .header("Authorization", "<token>.")
  .header("Content-Type", "application/json")
  .body("{}")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('PATCH', 'https://developer.api.autodesk.com/construction/admin/v1/projects/367d5cc2-9008-462c-96e5-c9491db85d93/users/6cc15635-2fbd-4f73-afbe-abd833408a1d', [
  'body' => '{}',
  'headers' => [
    'Accept-Language' => 'en',
    'Authorization' => '<token>.',
    'Content-Type' => 'application/json',
    'Region' => 'US',
    'User-Id' => '6cc15635-2fbd-4f73-afbe-abd833408a1d',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://developer.api.autodesk.com/construction/admin/v1/projects/367d5cc2-9008-462c-96e5-c9491db85d93/users/6cc15635-2fbd-4f73-afbe-abd833408a1d");
var request = new RestRequest(Method.PATCH);
request.AddHeader("Accept-Language", "en");
request.AddHeader("Region", "US");
request.AddHeader("User-Id", "6cc15635-2fbd-4f73-afbe-abd833408a1d");
request.AddHeader("Authorization", "<token>.");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "Accept-Language": "en",
  "Region": "US",
  "User-Id": "6cc15635-2fbd-4f73-afbe-abd833408a1d",
  "Authorization": "<token>.",
  "Content-Type": "application/json"
]
let parameters = [] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://developer.api.autodesk.com/construction/admin/v1/projects/367d5cc2-9008-462c-96e5-c9491db85d93/users/6cc15635-2fbd-4f73-afbe-abd833408a1d")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "PATCH"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```