Invite user to the company
The API does not create users directly. People join the company by invitation, because they
set their own password. The membership starts as pending (approved: false) and becomes active
when the person accepts the invitation by email.
If the email already has an account in the system, the invitation only links that account to the company.
The token needs the users: POST permission. The invitation is recorded in the name of the
admin who created the token.
Available only on self-service installations. On other installations, the response is
403 ERR_SELF_SERVICE_DISABLED.
curl --request POST \
--url https://api.connectadesk.com/api/v1/users/invites \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"email": "marina@exemplo.com.br",
"profileId": 21,
"name": "Gabriel Goulart",
"queueIds": [
7
],
"channelsIds": [
4
],
"maxOpenTickets": 5
}
'import requests
url = "https://api.connectadesk.com/api/v1/users/invites"
payload = {
"email": "marina@exemplo.com.br",
"profileId": 21,
"name": "Gabriel Goulart",
"queueIds": [7],
"channelsIds": [4],
"maxOpenTickets": 5
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
email: 'marina@exemplo.com.br',
profileId: 21,
name: 'Gabriel Goulart',
queueIds: [7],
channelsIds: [4],
maxOpenTickets: 5
})
};
fetch('https://api.connectadesk.com/api/v1/users/invites', 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/invites",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'email' => 'marina@exemplo.com.br',
'profileId' => 21,
'name' => 'Gabriel Goulart',
'queueIds' => [
7
],
'channelsIds' => [
4
],
'maxOpenTickets' => 5
]),
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/invites"
payload := strings.NewReader("{\n \"email\": \"marina@exemplo.com.br\",\n \"profileId\": 21,\n \"name\": \"Gabriel Goulart\",\n \"queueIds\": [\n 7\n ],\n \"channelsIds\": [\n 4\n ],\n \"maxOpenTickets\": 5\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.connectadesk.com/api/v1/users/invites")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"marina@exemplo.com.br\",\n \"profileId\": 21,\n \"name\": \"Gabriel Goulart\",\n \"queueIds\": [\n 7\n ],\n \"channelsIds\": [\n 4\n ],\n \"maxOpenTickets\": 5\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.connectadesk.com/api/v1/users/invites")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"email\": \"marina@exemplo.com.br\",\n \"profileId\": 21,\n \"name\": \"Gabriel Goulart\",\n \"queueIds\": [\n 7\n ],\n \"channelsIds\": [\n 4\n ],\n \"maxOpenTickets\": 5\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_VALIDATION",
"message": "O campo `number` é obrigatório."
}
}{
"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.
Body
Email of the person who will receive the invitation.
"marina@exemplo.com.br"
Permission profile of this person in this company. Use the id from GET /profiles.
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. With neither, the person joins as Agent.
admin, user Name shown in the company. If not sent, the account name is used.
"Gabriel Goulart"
Queues the person will work in.
[7]
Channels the person can see.
[4]
Maximum number of simultaneous tickets. If not sent, there is no limit.
5
Language of the invitation email sent to the person:
| value | meaning |
|---|---|
pt-BR | Brazilian Portuguese. |
en-US | English. |
pt-BR, en-US Response
Invitation sent. Returns the newly created membership, in the same format as
GET /users/{id}, with approved: false until the person accepts the invitation by email. The id
returned is already the membership id and can be used in the next calls.
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 POST \
--url https://api.connectadesk.com/api/v1/users/invites \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"email": "marina@exemplo.com.br",
"profileId": 21,
"name": "Gabriel Goulart",
"queueIds": [
7
],
"channelsIds": [
4
],
"maxOpenTickets": 5
}
'import requests
url = "https://api.connectadesk.com/api/v1/users/invites"
payload = {
"email": "marina@exemplo.com.br",
"profileId": 21,
"name": "Gabriel Goulart",
"queueIds": [7],
"channelsIds": [4],
"maxOpenTickets": 5
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
email: 'marina@exemplo.com.br',
profileId: 21,
name: 'Gabriel Goulart',
queueIds: [7],
channelsIds: [4],
maxOpenTickets: 5
})
};
fetch('https://api.connectadesk.com/api/v1/users/invites', 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/invites",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'email' => 'marina@exemplo.com.br',
'profileId' => 21,
'name' => 'Gabriel Goulart',
'queueIds' => [
7
],
'channelsIds' => [
4
],
'maxOpenTickets' => 5
]),
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/invites"
payload := strings.NewReader("{\n \"email\": \"marina@exemplo.com.br\",\n \"profileId\": 21,\n \"name\": \"Gabriel Goulart\",\n \"queueIds\": [\n 7\n ],\n \"channelsIds\": [\n 4\n ],\n \"maxOpenTickets\": 5\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.connectadesk.com/api/v1/users/invites")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"marina@exemplo.com.br\",\n \"profileId\": 21,\n \"name\": \"Gabriel Goulart\",\n \"queueIds\": [\n 7\n ],\n \"channelsIds\": [\n 4\n ],\n \"maxOpenTickets\": 5\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.connectadesk.com/api/v1/users/invites")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"email\": \"marina@exemplo.com.br\",\n \"profileId\": 21,\n \"name\": \"Gabriel Goulart\",\n \"queueIds\": [\n 7\n ],\n \"channelsIds\": [\n 4\n ],\n \"maxOpenTickets\": 5\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_VALIDATION",
"message": "O campo `number` é obrigatório."
}
}{
"error": {
"code": "ERR_API_VALIDATION",
"message": "O parâmetro `application` é obrigatório e aceita \"contact\" ou \"card\"."
}
}
