curl --request POST \
--url https://app.base44.com/api/workspace/members/bulk/remove \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"emails": [
"dana@acme.com",
"sam@acme.com"
]
}
'import requests
url = "https://app.base44.com/api/workspace/members/bulk/remove"
payload = { "emails": ["dana@acme.com", "sam@acme.com"] }
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({emails: ['dana@acme.com', 'sam@acme.com']})
};
fetch('https://app.base44.com/api/workspace/members/bulk/remove', 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://app.base44.com/api/workspace/members/bulk/remove",
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([
'emails' => [
'dana@acme.com',
'sam@acme.com'
]
]),
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://app.base44.com/api/workspace/members/bulk/remove"
payload := strings.NewReader("{\n \"emails\": [\n \"dana@acme.com\",\n \"sam@acme.com\"\n ]\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://app.base44.com/api/workspace/members/bulk/remove")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"emails\": [\n \"dana@acme.com\",\n \"sam@acme.com\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/workspace/members/bulk/remove")
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 \"emails\": [\n \"dana@acme.com\",\n \"sam@acme.com\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"results": [
{
"email": "dana@acme.com",
"message": "Member role updated to editor.",
"status": "success"
}
]
}{
"detail": {
"message": "Some members could not be updated. No changes were applied.",
"errors": [
{
"email": "sam@acme.com",
"error_code": "MEMBER_NOT_FOUND",
"message": "Member sam@acme.com not found in workspace 67e0b12c4d8a3f005b21c9e4"
}
]
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Remove workspace members in bulk
Removes up to 200 people from a workspace at once, the same way as Remove workspace member.
Removing someone takes away their access to the workspace and its apps right away:
- Apps they own move to the workspace owner, and their webhooks go to the owner too.
- Their personal access tokens for the workspace are deleted, and integrations they connected in the workspace are disconnected.
- They leave every custom group.
- If this was the last workspace they could sign in to, their Base44 account is disabled.
Removing someone whose invitation is still pending cancels the invitation.
You can’t remove yourself or the workspace owner.
Every item is checked before anything changes. If any item can’t be applied, nothing changes and the request returns a 400 whose detail.errors lists each rejected item with its email, a message, and an error_code when there is one. A member who isn’t in the workspace, or a change you couldn’t make on the single-member endpoint, is reported there rather than as a 403 or 404. A 200 lists every person removed in results, in request order. Retrying a request that succeeded returns a 400 listing those people as not found.
People are handled one at a time before any membership is deleted. If a 409 stops the request, nobody is removed, but the people handled before the blocked one have already lost their app access and personal access tokens. Send the request again once the block clears.
This is limited to 5 requests per minute, shared by Update workspace member roles in bulk, Remove workspace members in bulk, and Set member credit limits in bulk. A signed-in session has its own limit, and every personal access token for the workspace shares one. Some workspaces have a different limit.
curl --request POST \
--url https://app.base44.com/api/workspace/members/bulk/remove \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"emails": [
"dana@acme.com",
"sam@acme.com"
]
}
'import requests
url = "https://app.base44.com/api/workspace/members/bulk/remove"
payload = { "emails": ["dana@acme.com", "sam@acme.com"] }
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({emails: ['dana@acme.com', 'sam@acme.com']})
};
fetch('https://app.base44.com/api/workspace/members/bulk/remove', 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://app.base44.com/api/workspace/members/bulk/remove",
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([
'emails' => [
'dana@acme.com',
'sam@acme.com'
]
]),
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://app.base44.com/api/workspace/members/bulk/remove"
payload := strings.NewReader("{\n \"emails\": [\n \"dana@acme.com\",\n \"sam@acme.com\"\n ]\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://app.base44.com/api/workspace/members/bulk/remove")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"emails\": [\n \"dana@acme.com\",\n \"sam@acme.com\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/workspace/members/bulk/remove")
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 \"emails\": [\n \"dana@acme.com\",\n \"sam@acme.com\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"results": [
{
"email": "dana@acme.com",
"message": "Member role updated to editor.",
"status": "success"
}
]
}{
"detail": {
"message": "Some members could not be updated. No changes were applied.",
"errors": [
{
"email": "sam@acme.com",
"error_code": "MEMBER_NOT_FOUND",
"message": "Member sam@acme.com not found in workspace 67e0b12c4d8a3f005b21c9e4"
}
]
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Authorizations
Personal access token, sent as Authorization: Bearer <token>.
Query Parameters
Body
People to remove in one request.
Emails of the members or pending invitees to remove, 1 to 200, exactly as email in List workspace members returns them. Each email can appear once.
1 - 200 elements["dana@acme.com", "sam@acme.com"]
Response
Everyone was removed.
The outcome of each item.
One entry per item, in request order.
Show child attributes
Show child attributes
[
{
"email": "dana@acme.com",
"message": "Member role updated to editor.",
"status": "success"
}
]
Was this page helpful?