Update the user's membership in the company
Changes only what the user edit screen allows you to change within the company.
email and password belong to the person’s account, which is the same across every company
they belong to. For that reason they cannot be changed through the API. If the body has no field
that can be changed, the response is 400 ERR_API_USER_NO_WRITABLE_FIELDS.
There is no user DELETE. To remove someone’s access, use PUT /users/{id}/active.
curl --request PUT \
--url https://api.connectadesk.com/api/v1/users/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Gabriel Goulart",
"profileId": 21,
"maxOpenTickets": 5,
"queueIds": [
7
],
"channelsIds": [
4
]
}
'import requests
url = "https://api.connectadesk.com/api/v1/users/{id}"
payload = {
"name": "Gabriel Goulart",
"profileId": 21,
"maxOpenTickets": 5,
"queueIds": [7],
"channelsIds": [4]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Gabriel Goulart',
profileId: 21,
maxOpenTickets: 5,
queueIds: [7],
channelsIds: [4]
})
};
fetch('https://api.connectadesk.com/api/v1/users/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.connectadesk.com/api/v1/users/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Gabriel Goulart',
'profileId' => 21,
'maxOpenTickets' => 5,
'queueIds' => [
7
],
'channelsIds' => [
4
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.connectadesk.com/api/v1/users/{id}"
payload := strings.NewReader("{\n \"name\": \"Gabriel Goulart\",\n \"profileId\": 21,\n \"maxOpenTickets\": 5,\n \"queueIds\": [\n 7\n ],\n \"channelsIds\": [\n 4\n ]\n}")
req, _ := http.NewRequest("PUT", 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))
}HttpResponse<String> response = Unirest.put("https://api.connectadesk.com/api/v1/users/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Gabriel Goulart\",\n \"profileId\": 21,\n \"maxOpenTickets\": 5,\n \"queueIds\": [\n 7\n ],\n \"channelsIds\": [\n 4\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.connectadesk.com/api/v1/users/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Gabriel Goulart\",\n \"profileId\": 21,\n \"maxOpenTickets\": 5,\n \"queueIds\": [\n 7\n ],\n \"channelsIds\": [\n 4\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": 3,
"email": "gabriel@exemplo.com.br",
"name": "Gabriel Goulart",
"profile": {
"id": 20,
"name": "Admin"
},
"isOwner": false,
"active": true,
"online": true,
"approved": true,
"maxOpenTickets": 15,
"lastLogin": "2026-08-19T08:12:00.000Z",
"queues": [
{
"id": 13,
"name": "Comercial"
}
],
"createdAt": "2026-01-08T12:00:00.000Z",
"updatedAt": "2026-08-19T08:30:00.000Z"
}
}{
"error": {
"code": "ERR_API_NOT_FOUND",
"message": "Registro não encontrado."
}
}{
"error": {
"code": "ERR_API_VALIDATION",
"message": "O parâmetro `application` é obrigatório e aceita \"contact\" ou \"card\"."
}
}Authorizations
API token in the sk_live_… format.
Path Parameters
Body
Display name in this company.
2"Gabriel Goulart"
Permission profile of this person in this company. Use the id from GET /profiles. The company owner has no profile, and the field is ignored for them.
An id that does not belong to this company returns 422 ERR_API_PROFILE_NOT_FOUND.
21
Legacy way to choose the profile, kept for integrations that already use it. Prefer profileId.
| value | meaning |
|---|---|
admin | The company's default Admin profile. |
user | The company's default Agent profile. |
If profileId is also sent, profileId wins.
admin, user Maximum number of simultaneous tickets. Send null to remove the limit.
5
The person's queues. The list you send fully replaces the previous one.
[7]
The person's channels. The list you send fully replaces the previous one.
[4]
Response
OK
User from the company's point of view. The id is the user's id in this company, and the email belongs to the person's account. Name, profile, activation, presence and ticket limit are set per company, so the same user can have different values in each company.
Super admin accounts never appear.
Show child attributes
Show child attributes
{ "id": 3, "email": "gabriel@exemplo.com.br", "name": "Gabriel Goulart", "profile": { "id": 20, "name": "Admin" }, "isOwner": false, "active": true, "online": true, "approved": true, "maxOpenTickets": 15, "lastLogin": "2026-08-19T08:12:00.000Z", "queues": [{ "id": 13, "name": "Comercial" }], "createdAt": "2026-01-08T12:00:00.000Z", "updatedAt": "2026-08-19T08:30:00.000Z" }
curl --request PUT \
--url https://api.connectadesk.com/api/v1/users/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Gabriel Goulart",
"profileId": 21,
"maxOpenTickets": 5,
"queueIds": [
7
],
"channelsIds": [
4
]
}
'import requests
url = "https://api.connectadesk.com/api/v1/users/{id}"
payload = {
"name": "Gabriel Goulart",
"profileId": 21,
"maxOpenTickets": 5,
"queueIds": [7],
"channelsIds": [4]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Gabriel Goulart',
profileId: 21,
maxOpenTickets: 5,
queueIds: [7],
channelsIds: [4]
})
};
fetch('https://api.connectadesk.com/api/v1/users/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.connectadesk.com/api/v1/users/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Gabriel Goulart',
'profileId' => 21,
'maxOpenTickets' => 5,
'queueIds' => [
7
],
'channelsIds' => [
4
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.connectadesk.com/api/v1/users/{id}"
payload := strings.NewReader("{\n \"name\": \"Gabriel Goulart\",\n \"profileId\": 21,\n \"maxOpenTickets\": 5,\n \"queueIds\": [\n 7\n ],\n \"channelsIds\": [\n 4\n ]\n}")
req, _ := http.NewRequest("PUT", 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))
}HttpResponse<String> response = Unirest.put("https://api.connectadesk.com/api/v1/users/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Gabriel Goulart\",\n \"profileId\": 21,\n \"maxOpenTickets\": 5,\n \"queueIds\": [\n 7\n ],\n \"channelsIds\": [\n 4\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.connectadesk.com/api/v1/users/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Gabriel Goulart\",\n \"profileId\": 21,\n \"maxOpenTickets\": 5,\n \"queueIds\": [\n 7\n ],\n \"channelsIds\": [\n 4\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": 3,
"email": "gabriel@exemplo.com.br",
"name": "Gabriel Goulart",
"profile": {
"id": 20,
"name": "Admin"
},
"isOwner": false,
"active": true,
"online": true,
"approved": true,
"maxOpenTickets": 15,
"lastLogin": "2026-08-19T08:12:00.000Z",
"queues": [
{
"id": 13,
"name": "Comercial"
}
],
"createdAt": "2026-01-08T12:00:00.000Z",
"updatedAt": "2026-08-19T08:30:00.000Z"
}
}{
"error": {
"code": "ERR_API_NOT_FOUND",
"message": "Registro não encontrado."
}
}{
"error": {
"code": "ERR_API_VALIDATION",
"message": "O parâmetro `application` é obrigatório e aceita \"contact\" ou \"card\"."
}
}
