curl --request POST \
--url https://cloud.cdata.com/api/v1/admin/users \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"email": "jane.doe@example.com",
"first_name": "Jane",
"last_name": "Doe"
}
'import requests
url = "https://cloud.cdata.com/api/v1/admin/users"
payload = {
"email": "jane.doe@example.com",
"first_name": "Jane",
"last_name": "Doe"
}
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: 'jane.doe@example.com', first_name: 'Jane', last_name: 'Doe'})
};
fetch('https://cloud.cdata.com/api/v1/admin/users', 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://cloud.cdata.com/api/v1/admin/users",
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' => 'jane.doe@example.com',
'first_name' => 'Jane',
'last_name' => 'Doe'
]),
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://cloud.cdata.com/api/v1/admin/users"
payload := strings.NewReader("{\n \"email\": \"jane.doe@example.com\",\n \"first_name\": \"Jane\",\n \"last_name\": \"Doe\"\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://cloud.cdata.com/api/v1/admin/users")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"jane.doe@example.com\",\n \"first_name\": \"Jane\",\n \"last_name\": \"Doe\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://cloud.cdata.com/api/v1/admin/users")
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\": \"jane.doe@example.com\",\n \"first_name\": \"Jane\",\n \"last_name\": \"Doe\"\n}"
response = http.request(request)
puts response.read_body{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"email": "jane.doe@example.com",
"first_name": "Jane",
"last_name": "Doe",
"status": "invited",
"scim_managed": false,
"external_id": null,
"created_at": "2026-01-15T10:00:00Z",
"created_by": "00000000-0000-0000-0000-000000000001"
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "Missing required field or invalid value."
}
}{
"error": {
"code": "USER_ALREADY_EXISTS",
"message": "A user with this email already exists."
}
}Create User
Create a human user directly, outside of the SCIM provisioning flow. Use this for non-SCIM-managed users (for example, contractors, break-glass accounts, or organizations without SCIM configured). Users created via this endpoint carry scim_managed: false in the response. For SCIM-provisioned users, configure SCIM sync with your IdP. This endpoint is idempotent by external_id: a second POST with the same external_id returns the existing user instead of creating a duplicate.
curl --request POST \
--url https://cloud.cdata.com/api/v1/admin/users \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"email": "jane.doe@example.com",
"first_name": "Jane",
"last_name": "Doe"
}
'import requests
url = "https://cloud.cdata.com/api/v1/admin/users"
payload = {
"email": "jane.doe@example.com",
"first_name": "Jane",
"last_name": "Doe"
}
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: 'jane.doe@example.com', first_name: 'Jane', last_name: 'Doe'})
};
fetch('https://cloud.cdata.com/api/v1/admin/users', 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://cloud.cdata.com/api/v1/admin/users",
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' => 'jane.doe@example.com',
'first_name' => 'Jane',
'last_name' => 'Doe'
]),
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://cloud.cdata.com/api/v1/admin/users"
payload := strings.NewReader("{\n \"email\": \"jane.doe@example.com\",\n \"first_name\": \"Jane\",\n \"last_name\": \"Doe\"\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://cloud.cdata.com/api/v1/admin/users")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"jane.doe@example.com\",\n \"first_name\": \"Jane\",\n \"last_name\": \"Doe\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://cloud.cdata.com/api/v1/admin/users")
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\": \"jane.doe@example.com\",\n \"first_name\": \"Jane\",\n \"last_name\": \"Doe\"\n}"
response = http.request(request)
puts response.read_body{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"email": "jane.doe@example.com",
"first_name": "Jane",
"last_name": "Doe",
"status": "invited",
"scim_managed": false,
"external_id": null,
"created_at": "2026-01-15T10:00:00Z",
"created_by": "00000000-0000-0000-0000-000000000001"
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "Missing required field or invalid value."
}
}{
"error": {
"code": "USER_ALREADY_EXISTS",
"message": "A user with this email already exists."
}
}Authorizations
The access token received from the authorization server in the OAuth 2.0 flow.
Body
Must be globally unique across all Connect AI orgs.
The user's first name.
The user's last name. Omit for users with a single name.
Idempotency key supplied by the calling system (for example, an HR system employee ID or Terraform resource ID). A second POST with the same key returns the existing user instead of creating a duplicate. Connect AI does not generate this value; the caller provides it.
Response
Created
User identifier.
The email address of the user.
The user's first name.
The user's last name.
Current lifecycle state of the user.
active, invited, deactivated false for API-created users. true for SCIM-provisioned users.
Idempotency key supplied by the calling system.
ISO 8601 UTC.
User ID of the creator. null for SCIM-provisioned users.
Was this page helpful?