team.user.create
Adds a new member to the team. If the email does not yet have a Manus account, a personal account is created automatically and immediately deactivated outside the team scope. role must be TEAM_MEMBER_ROLE_SUPER_ADMIN, TEAM_MEMBER_ROLE_ADMIN, TEAM_MEMBER_ROLE_MEMBER, or TEAM_MEMBER_ROLE_GUEST — TEAM_MEMBER_ROLE_OWNER and TEAM_MEMBER_ROLE_UNSPECIFIED are rejected.
curl --request POST \
--url https://api.manus.im/v2/team.user.create \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"email": "new.user@example.com"
}
'import requests
url = "https://api.manus.im/v2/team.user.create"
payload = { "email": "new.user@example.com" }
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: 'new.user@example.com'})
};
fetch('https://api.manus.im/v2/team.user.create', 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.manus.im/v2/team.user.create",
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' => 'new.user@example.com'
]),
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.manus.im/v2/team.user.create"
payload := strings.NewReader("{\n \"email\": \"new.user@example.com\"\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.manus.im/v2/team.user.create")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"new.user@example.com\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.manus.im/v2/team.user.create")
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\": \"new.user@example.com\"\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"request_id": "<string>",
"user": {
"email": "<string>",
"status": "USER_STATUS_ACTIVE",
"role": "TEAM_MEMBER_ROLE_OWNER",
"user_name": "<string>",
"team_user_id": "<string>",
"delegated_to": "<string>",
"delegated_profiles": [
{
"team_user_id": "<string>",
"display_name": "<string>",
"role": "TEAM_MEMBER_ROLE_OWNER",
"delegated_at": "2023-11-07T05:31:56Z"
}
],
"original_email": "<string>"
}
}{
"ok": false,
"request_id": "<string>",
"error": {
"code": "<string>",
"message": "<string>"
}
}TEAM_MEMBER_ROLE_SUPER_ADMIN, TEAM_MEMBER_ROLE_ADMIN, TEAM_MEMBER_ROLE_MEMBER, or TEAM_MEMBER_ROLE_GUEST. TEAM_MEMBER_ROLE_OWNER and TEAM_MEMBER_ROLE_UNSPECIFIED return invalid_argument — transfer ownership in the UI instead. Guests do not consume a paid seat.Display name: Optional. If first_name and/or last_name are provided they are joined with a space; otherwise user_name is used as-is.Idempotency: The endpoint is not idempotent — calling it twice with the same email returns already_exists on the second call. Read the existing record with team.user.detail first if you may be retrying.Protocols: Also callable via Connect RPC. See Protocols.Authorizations
Body
Email of the user to add. Must be a valid RFC 5321 address.
254"new.user@example.com"
Initial team role. Accepts TEAM_MEMBER_ROLE_SUPER_ADMIN, TEAM_MEMBER_ROLE_ADMIN, TEAM_MEMBER_ROLE_MEMBER, or TEAM_MEMBER_ROLE_GUEST. TEAM_MEMBER_ROLE_OWNER is rejected.
TEAM_MEMBER_ROLE_OWNER, TEAM_MEMBER_ROLE_ADMIN, TEAM_MEMBER_ROLE_MEMBER, TEAM_MEMBER_ROLE_SUPER_ADMIN, TEAM_MEMBER_ROLE_GUEST Display name. Optional; if omitted, the name is composed from first_name + last_name.
255"New User"
First name. Optional.
255"New"
Last name. Optional.
255"User"
Response
Team member created successfully.
true
A team member.
Hide child attributes
Hide child attributes
Email address. After delegation this field becomes delegate-xxx@manus.im — the pre-delegation address is preserved in original_email.
Status of a team member.
USER_STATUS_ACTIVE, USER_STATUS_INACTIVE, USER_STATUS_REMOVED Team role. TEAM_MEMBER_ROLE_OWNER is read-only and cannot be granted via API (transfer ownership in the UI). Guest members do not consume a paid seat.
TEAM_MEMBER_ROLE_OWNER, TEAM_MEMBER_ROLE_ADMIN, TEAM_MEMBER_ROLE_MEMBER, TEAM_MEMBER_ROLE_SUPER_ADMIN, TEAM_MEMBER_ROLE_GUEST Display name. Sourced from team_user_relation.Name (set via team.user.rename) when present, otherwise falls back to the underlying user's name. Omitted when neither is set.
Stable identifier for the team member, unique within the team. Use this (not email) for any subsequent profile-management call.
If this profile is currently delegated, the team_user_id of the assignee.
Profiles delegated to this user. Only populated by single-record responses (team.user.detail, team.user.update, etc.). team.user.list omits this field to avoid N+1 fan-out.
Hide child attributes
Hide child attributes
ID of the delegated profile.
Display name. Falls back to the original (pre-delegation) email when the profile has no name set.
Team role. TEAM_MEMBER_ROLE_OWNER is read-only and cannot be granted via API (transfer ownership in the UI). Guest members do not consume a paid seat.
TEAM_MEMBER_ROLE_OWNER, TEAM_MEMBER_ROLE_ADMIN, TEAM_MEMBER_ROLE_MEMBER, TEAM_MEMBER_ROLE_SUPER_ADMIN, TEAM_MEMBER_ROLE_GUEST When the delegation was created.
Pre-delegation email. Only present for currently-delegated profiles.
curl --request POST \
--url https://api.manus.im/v2/team.user.create \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"email": "new.user@example.com"
}
'import requests
url = "https://api.manus.im/v2/team.user.create"
payload = { "email": "new.user@example.com" }
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: 'new.user@example.com'})
};
fetch('https://api.manus.im/v2/team.user.create', 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.manus.im/v2/team.user.create",
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' => 'new.user@example.com'
]),
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.manus.im/v2/team.user.create"
payload := strings.NewReader("{\n \"email\": \"new.user@example.com\"\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.manus.im/v2/team.user.create")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"new.user@example.com\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.manus.im/v2/team.user.create")
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\": \"new.user@example.com\"\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"request_id": "<string>",
"user": {
"email": "<string>",
"status": "USER_STATUS_ACTIVE",
"role": "TEAM_MEMBER_ROLE_OWNER",
"user_name": "<string>",
"team_user_id": "<string>",
"delegated_to": "<string>",
"delegated_profiles": [
{
"team_user_id": "<string>",
"display_name": "<string>",
"role": "TEAM_MEMBER_ROLE_OWNER",
"delegated_at": "2023-11-07T05:31:56Z"
}
],
"original_email": "<string>"
}
}{
"ok": false,
"request_id": "<string>",
"error": {
"code": "<string>",
"message": "<string>"
}
}