> ## Documentation Index > Fetch the complete documentation index at: https://www.canva.dev/docs/admin/llms.txt > Use this file to discover all available pages before exploring further. # Update user Updates a user that is already managed by the caller's organization. Only the fields provided in the request are updated, and any omitted fields are left unchanged. The `name` object fields (`display_name`, `first_name`, and `last_name`) must be updated together. To clear a first or last name, set it to an empty string. Blank first and last names are allowed. ## HTTP method and URL path PATCH https\://api.canva.com/admin/v1/users/\{userId} ### Rate limit This operation is rate limited to 1000 requests per minute for your app. ## Authentication and authorization This endpoint requires a valid access token that was generated using client credentials. ### Scopes The access token must have all the following [scopes](/docs/admin/appendix/scopes) (permissions): * `admin:user:write` ## Header parameters Provides credentials to authenticate the request, in the form of a `Bearer` token. For example: `Authorization: Bearer {token}` Indicates the media type of the information sent in the request. This must be set to `application/json`. For example: `Content-Type: application/json` ## Path parameters The user ID. ## Body parameters The name fields to update for the user. Properties of name} defaultExpanded={true}> The display name of the user. **Minimum length:** `1` The first name of the user. Set to an empty string to clear the first name. The last name of the user. Set to an empty string to clear the last name. The locale of the user, as an IETF BCP 47 language tag. Must be a supported language. The SAML account details used to link the user to the organization's identity provider for SSO. Properties of saml_account} defaultExpanded={true}> The issuer id or entity id of the SAML identity provider. Often a unique URL, but not always. Must resolve to an identity provider owned by the caller's organization. **Minimum length:** `1` The SAML NameID that identifies the user to the identity provider. This value is case sensitive, and shouldn't change. **Minimum length:** `1` ## Example request Examples for using the `/v1/users/{userId}` endpoint: ```sh curl --request PATCH 'https://api.canva.com/admin/v1/users/{userId}' \ --header 'Authorization: Bearer {token}' \ --header 'Content-Type: application/json' \ --data '{ "name": { "display_name": "Joe Smith", "first_name": "Joe", "last_name": "Smith" }, "locale": "en-GB", "saml_account": { "idp_issuer": "https://sso.acme.com/saml/metadata", "name_id": "joe.smith@acme.com" } }' ``` ```js const fetch = require("node-fetch"); fetch("https://api.canva.com/admin/v1/users/{userId}", { method: "PATCH", headers: { "Authorization": "Bearer {token}", "Content-Type": "application/json", }, body: JSON.stringify({ "name": { "display_name": "Joe Smith", "first_name": "Joe", "last_name": "Smith" }, "locale": "en-GB", "saml_account": { "idp_issuer": "https://sso.acme.com/saml/metadata", "name_id": "joe.smith@acme.com" } }), }) .then(async (response) => { const data = await response.json(); console.log(data); }) .catch(err => console.error(err)); ``` ```java import java.io.IOException; import java.net.URI; import java.net.http.*; public class ApiExample { public static void main(String[] args) throws IOException, InterruptedException { HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.canva.com/admin/v1/users/{userId}")) .header("Authorization", "Bearer {token}") .header("Content-Type", "application/json") .method("PATCH", HttpRequest.BodyPublishers.ofString("{\"name\": {\"display_name\": \"Joe Smith\", \"first_name\": \"Joe\", \"last_name\": \"Smith\"}, \"locale\": \"en-GB\", \"saml_account\": {\"idp_issuer\": \"https://sso.acme.com/saml/metadata\", \"name_id\": \"joe.smith@acme.com\"}}")) .build(); HttpResponse response = HttpClient.newHttpClient().send( request, HttpResponse.BodyHandlers.ofString() ); System.out.println(response.body()); } } ``` ```py import requests headers = { "Authorization": "Bearer {token}", "Content-Type": "application/json" } data = { "name": { "display_name": "Joe Smith", "first_name": "Joe", "last_name": "Smith" }, "locale": "en-GB", "saml_account": { "idp_issuer": "https://sso.acme.com/saml/metadata", "name_id": "joe.smith@acme.com" } } response = requests.patch("https://api.canva.com/admin/v1/users/{userId}", headers=headers, json=data ) print(response.json()) ``` ```csharp using System.Net.Http; var client = new HttpClient(); var request = new HttpRequestMessage { Method = HttpMethod.Patch, RequestUri = new Uri("https://api.canva.com/admin/v1/users/{userId}"), Headers = { { "Authorization", "Bearer {token}" }, }, Content = new StringContent( "{\"name\": {\"display_name\": \"Joe Smith\", \"first_name\": \"Joe\", \"last_name\": \"Smith\"}, \"locale\": \"en-GB\", \"saml_account\": {\"idp_issuer\": \"https://sso.acme.com/saml/metadata\", \"name_id\": \"joe.smith@acme.com\"}}", Encoding.UTF8, "application/json" ), }; using (var response = await client.SendAsync(request)) { response.EnsureSuccessStatusCode(); var body = await response.Content.ReadAsStringAsync(); Console.WriteLine(body); }; ``` ```go package main import ( "fmt" "io" "net/http" "strings" ) func main() { payload := strings.NewReader(`{ "name": { "display_name": "Joe Smith", "first_name": "Joe", "last_name": "Smith" }, "locale": "en-GB", "saml_account": { "idp_issuer": "https://sso.acme.com/saml/metadata", "name_id": "joe.smith@acme.com" } }`) url := "https://api.canva.com/admin/v1/users/{userId}" req, _ := http.NewRequest("PATCH", url, payload) req.Header.Add("Authorization", "Bearer {token}") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(string(body)) } ``` ```php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://api.canva.com/admin/v1/users/{userId}", CURLOPT_CUSTOMREQUEST => "PATCH", CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => array( 'Authorization: Bearer {token}', 'Content-Type: application/json', ), CURLOPT_POSTFIELDS => json_encode([ "name" => [ "display_name" => "Joe Smith", "first_name" => "Joe", "last_name" => "Smith" ], "locale" => "en-GB", "saml_account" => [ "idp_issuer" => "https://sso.acme.com/saml/metadata", "name_id" => "joe.smith@acme.com" ] ]) )); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if (empty($err)) { echo $response; } else { echo "Error: " . $err; } ``` ```ruby require 'net/http' require 'uri' url = URI('https://api.canva.com/admin/v1/users/{userId}') http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Patch.new(url) request['Authorization'] = 'Bearer {token}' request['Content-Type'] = 'application/json' request.body = < ## Success response If successful, the endpoint returns a `200` response with a JSON body with the following parameters: A user. Properties of user} defaultExpanded={true}> The user ID. The display name of the user. The email address of the user. The first name of the user. The last name of the user. When the user was last active, as a Unix timestamp (in seconds since the Unix Epoch). The locale of the user, as an IETF BCP 47 language tag. The role of the user in the organization. **Available values:** * `admin` * `brand_designer` * `member` The SAML account details used to link the user to the organization's identity provider for SSO. Properties of saml_account}> The issuer id or entity id of the SAML identity provider. Often a unique URL, but not always. Must resolve to an identity provider owned by the caller's organization. **Minimum length:** `1` The SAML NameID that identifies the user to the identity provider. This value is case sensitive, and shouldn't change. **Minimum length:** `1` ## Example response ```json { "user": { "id": "UAAAAAAAAA1", "display_name": "Joe Smith", "email": "joe@acme.com", "first_name": "Joe", "last_name": "Smith", "last_active_at": 1750300000, "locale": "en", "role": "admin" } } ``` ## Error responses ### 400 Bad Request A short string indicating what failed. This field can be used to handle errors programmatically. For a complete list of error codes, see [Error responses](/docs/admin/error-responses/). A human-readable description of what went wrong. #### Example error responses ##### The display name is not allowed ```json { "code": "invalid_field", "message": "The supplied display_name is not allowed." } ``` ##### The locale is not a supported language ```json { "code": "invalid_field", "message": "The locale {locale} is not a supported language." } ``` ##### The user is not managed by the organization ```json { "code": "user_not_managed", "message": "User {userId} is not managed by the organization" } ``` ### 403 Forbidden A short string indicating what failed. This field can be used to handle errors programmatically. For a complete list of error codes, see [Error responses](/docs/admin/error-responses/). A human-readable description of what went wrong. #### Example error response ##### The SAML identity provider is not owned by the caller's organization (or doesn't exist) ```json { "code": "permission_denied", "message": "The identity provider is not owned by your organization." } ``` ### 409 Conflict A short string indicating what failed. This field can be used to handle errors programmatically. For a complete list of error codes, see [Error responses](/docs/admin/error-responses/). A human-readable description of what went wrong. #### Example error responses ##### The user is already linked to a different SAML identity provider ```json { "code": "user_linked_to_another_idp", "message": "User {userId} already has a SAML account linked to a different identity provider." } ``` ##### The SAML name ID is already in use ```json { "code": "saml_name_id_not_available", "message": "The SAML name ID {nameId} is already associated with another user." } ``` ##### The user is awaiting consent from a previous request ```json { "code": "user_pending_consent", "message": "A previous request for this user is awaiting their consent. Wait for them to accept before retrying." } ```