curl --request POST \
--url https://api.assembly.com/v1/internal-users \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"email": "jordan.lee@example.com",
"familyName": "Lee",
"givenName": "Jordan",
"role": "staff"
}
'import requests
url = "https://api.assembly.com/v1/internal-users"
payload = {
"email": "jordan.lee@example.com",
"familyName": "Lee",
"givenName": "Jordan",
"role": "staff"
}
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
email: 'jordan.lee@example.com',
familyName: 'Lee',
givenName: 'Jordan',
role: 'staff'
})
};
fetch('https://api.assembly.com/v1/internal-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://api.assembly.com/v1/internal-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' => 'jordan.lee@example.com',
'familyName' => 'Lee',
'givenName' => 'Jordan',
'role' => 'staff'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>"
],
]);
$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.assembly.com/v1/internal-users"
payload := strings.NewReader("{\n \"email\": \"jordan.lee@example.com\",\n \"familyName\": \"Lee\",\n \"givenName\": \"Jordan\",\n \"role\": \"staff\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
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.assembly.com/v1/internal-users")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"jordan.lee@example.com\",\n \"familyName\": \"Lee\",\n \"givenName\": \"Jordan\",\n \"role\": \"staff\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.assembly.com/v1/internal-users")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"email\": \"jordan.lee@example.com\",\n \"familyName\": \"Lee\",\n \"givenName\": \"Jordan\",\n \"role\": \"staff\"\n}"
response = http.request(request)
puts response.read_body{
"avatarImageUrl": "https://portal.example.com/avatars/jordan.png",
"companyAccessList": [
"550e8400-e29b-41d4-a716-446655440000"
],
"createdAt": "2024-01-15T09:30:00Z",
"deleted": true,
"email": "jordan.lee@example.com",
"fallbackColor": "#4F46E5",
"familyName": "Lee",
"givenName": "Jordan",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isClientAccessLimited": true,
"object": "client",
"role": "admin",
"updatedAt": "2024-02-20T14:05:00Z"
}{
"code": "<string>",
"data": "<unknown>",
"message": "<string>"
}{
"code": "<string>",
"data": "<unknown>",
"message": "<string>"
}{
"code": "<string>",
"data": "<unknown>",
"message": "<string>"
}{
"code": "<string>",
"data": "<unknown>",
"message": "<string>"
}Invite an internal user
Creates an internal user (portal team member) and emails them an invite. Only workspace admins can invite. Fails with 400 when the plan’s internal-user limit is reached or the email already belongs to a member. On plans that bill per seat, the invite adds a billable seat.
curl --request POST \
--url https://api.assembly.com/v1/internal-users \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"email": "jordan.lee@example.com",
"familyName": "Lee",
"givenName": "Jordan",
"role": "staff"
}
'import requests
url = "https://api.assembly.com/v1/internal-users"
payload = {
"email": "jordan.lee@example.com",
"familyName": "Lee",
"givenName": "Jordan",
"role": "staff"
}
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
email: 'jordan.lee@example.com',
familyName: 'Lee',
givenName: 'Jordan',
role: 'staff'
})
};
fetch('https://api.assembly.com/v1/internal-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://api.assembly.com/v1/internal-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' => 'jordan.lee@example.com',
'familyName' => 'Lee',
'givenName' => 'Jordan',
'role' => 'staff'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>"
],
]);
$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.assembly.com/v1/internal-users"
payload := strings.NewReader("{\n \"email\": \"jordan.lee@example.com\",\n \"familyName\": \"Lee\",\n \"givenName\": \"Jordan\",\n \"role\": \"staff\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
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.assembly.com/v1/internal-users")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"jordan.lee@example.com\",\n \"familyName\": \"Lee\",\n \"givenName\": \"Jordan\",\n \"role\": \"staff\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.assembly.com/v1/internal-users")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"email\": \"jordan.lee@example.com\",\n \"familyName\": \"Lee\",\n \"givenName\": \"Jordan\",\n \"role\": \"staff\"\n}"
response = http.request(request)
puts response.read_body{
"avatarImageUrl": "https://portal.example.com/avatars/jordan.png",
"companyAccessList": [
"550e8400-e29b-41d4-a716-446655440000"
],
"createdAt": "2024-01-15T09:30:00Z",
"deleted": true,
"email": "jordan.lee@example.com",
"fallbackColor": "#4F46E5",
"familyName": "Lee",
"givenName": "Jordan",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isClientAccessLimited": true,
"object": "client",
"role": "admin",
"updatedAt": "2024-02-20T14:05:00Z"
}{
"code": "<string>",
"data": "<unknown>",
"message": "<string>"
}{
"code": "<string>",
"data": "<unknown>",
"message": "<string>"
}{
"code": "<string>",
"data": "<unknown>",
"message": "<string>"
}{
"code": "<string>",
"data": "<unknown>",
"message": "<string>"
}Authorizations
Body
Internal user to invite
Email is the address the invite is sent to; it becomes the user's login.
"jordan.lee@example.com"
FamilyName is the invitee's last (family) name.
"Lee"
GivenName is the invitee's first (given) name.
"Jordan"
Role defaults to staff; admins can manage workspace settings and team members.
admin, staff "staff"
Response
Created
AvatarImageUrl is the URL of the internal user's avatar image. Read-only.
"https://portal.example.com/avatars/jordan.png"
CompanyAccessList is the set of company IDs the internal user can access when isClientAccessLimited is true. Empty when the user has access to all companies.
["550e8400-e29b-41d4-a716-446655440000"]
Created is the RFC 3339 timestamp at which the object was created.
"2024-01-15T09:30:00Z"
Deleted is true when the object has been deleted; present only on delete responses.
true
Email is the internal user's email address, used as the unique login identifier within the portal.
"jordan.lee@example.com"
FallbackColor is the hex color (e.g. "#4F46E5") used as the avatar background when no avatar image is set. The native pattern documents intent; the constraint is re-applied to the spec by the enrich-openapi post-processing step.
^#[0-9a-fA-F]{6}$"#4F46E5"
FamilyName is the internal user's last (family) name.
"Lee"
GivenName is the internal user's first (given) name.
"Jordan"
ID is the unique identifier of the object.
"550e8400-e29b-41d4-a716-446655440000"
IsClientAccessLimited is true when the internal user can only access the companies listed in companyAccessList; false (or null) grants access to all companies.
true
Object is the type of the object (e.g. "client", "company").
client, internalUser, company, customField, customFieldOption, file, fileChannel, folder, messageChannel, message, notification Role is the internal user's workspace role. Admins, including the workspace owner, manage workspace settings and team members; staff do not.
admin, staff "admin"
Updated is the RFC 3339 timestamp at which the object was last updated.
"2024-02-20T14:05:00Z"