Subaccount admins
The team members who sign in and work in the workspaces they are given.
The team members who sign in and work in the workspaces they are given.
Every route takes Authorization: Bearer <ACCESS_TOKEN> unless the auth line says otherwise. Ids are numbers. Errors use the shape on the errors page.
| Route | Scope | What it does |
|---|---|---|
GET /v1/subaccount-admins | subaccount_admins.read | The account's subaccount admins, newest first. |
GET /v1/subaccount-admins/{id} | subaccount_admins.read | One subaccount admin. |
POST /v1/subaccount-admins | subaccount_admins.write | Add a team member and email them an invitation. |
PATCH /v1/subaccount-admins/{id} | subaccount_admins.write | Rename, activate / deactivate, or change their workspaces, device limits and devices. |
DELETE /v1/subaccount-admins/{id} | subaccount_admins.write | Remove the person and all their access. |
List subaccount admins
GET https://api.bluereacher.com/v1/subaccount-adminsAuth: Bearer access token. Scope: subaccount_admins.read.
The account's subaccount admins, newest first.
Only a token installed by the account owner can use the subaccount admin endpoints.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
status | query | enum | no | Default both. |
search | query | string | no | Matches name or email. |
page | query | number | no | Default 1. |
limit | query | number | no | 1–100, default 25. Anything else is a 400. |
Request
curl -X GET "https://api.bluereacher.com/v1/subaccount-admins?page=1&limit=25" \
-H "Authorization: Bearer <ACCESS_TOKEN>"Responses
A 200 reply (OK):
{
"success": true,
"data": [
{
"id": 41,
"name": "Sam Doe",
"email": "sam@example.com",
"status": "active",
"workspaces": [
{
"id": 7,
"name": "Lee Studio"
}
],
"devices": {
"imessage": []
},
"device_limits": {
"imessage": 0
},
"created_at": "2026-10-27T09:00:00.000Z"
}
],
"pagination": {
"page": 1,
"limit": 25,
"max_limit": 100,
"total": 1,
"total_pages": 1
}
}| Status | When | Message |
|---|---|---|
| 200 | OK | |
| 401 | Missing or invalid token | Invalid or expired access token. |
| 403 | Missing scope | Missing scope(s): subaccount_admins.read. This integration was granted: … |
| 403 | The token was installed by a subaccount admin, not the account owner | Only a token installed by the account owner can manage subaccount admins. |
Response fields
subaccount_admin: Each item in data. Fields:
| Field | Type | Description |
|---|---|---|
id | number | Example: 41 |
name | string | Full name. |
email | string | The email they sign in with. |
status | string | "active" or "inactive". An inactive admin cannot sign in. Example: active |
workspaces | array<object> | The workspaces they can work in: id and name. |
devices | object | |
device_limits | object | |
created_at | string (ISO 8601) | When they were added. |
Get subaccount admin
GET https://api.bluereacher.com/v1/subaccount-admins/{id}Auth: Bearer access token. Scope: subaccount_admins.read.
One subaccount admin.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | number | yes | Subaccount admin id. |
Request
curl -X GET "https://api.bluereacher.com/v1/subaccount-admins/41" \
-H "Authorization: Bearer <ACCESS_TOKEN>"Responses
A 200 reply (OK):
{
"success": true,
"data": {
"id": 41,
"name": "Sam Doe",
"email": "sam@example.com",
"status": "active",
"workspaces": [
{
"id": 7,
"name": "Lee Studio"
}
],
"devices": {
"imessage": []
},
"device_limits": {
"imessage": 0
},
"created_at": "2026-10-27T09:00:00.000Z"
}
}| Status | When | Message |
|---|---|---|
| 200 | OK | |
| 401 | Missing or invalid token | Invalid or expired access token. |
| 403 | Missing scope | Missing scope(s): subaccount_admins.read. This integration was granted: … |
| 403 | The token was installed by a subaccount admin, not the account owner | Only a token installed by the account owner can manage subaccount admins. |
| 404 | Not a subaccount admin of the installer | Subaccount admin not found or not accessible to this token |
Response fields
subaccount_admin. Fields:
| Field | Type | Description |
|---|---|---|
id | number | Example: 41 |
name | string | Full name. |
email | string | The email they sign in with. |
status | string | "active" or "inactive". An inactive admin cannot sign in. Example: active |
workspaces | array<object> | The workspaces they can work in: id and name. |
devices | object | |
device_limits | object | |
created_at | string (ISO 8601) | When they were added. |
Invite subaccount admin
POST https://api.bluereacher.com/v1/subaccount-adminsAuth: Bearer access token. Scope: subaccount_admins.write.
Add a team member and email them an invitation.
No password is sent or set through the API. The person gets the same invitation email as from the dashboard, with a link to set their own password (valid 24 hours, works once). After that they can use Forgot password on the sign-in page.
Device limits come first. The limit and the ids can be sent in the same request.
Only devices on the installer's own account can be assigned (404 otherwise).
Plan, white label and 2FA settings are set on the dashboard.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
name | body | string | yes | Full name, up to 255 characters. |
email | body | string | yes | They sign in with it. Must not be registered already. |
workspace_ids | body | array<number> | no | Workspaces of the account they can work in. Default none. |
status | body | enum | no | Default active. |
imessage_quantity | body | number | no | How many iMessage devices they may hold. At most your plan's iMessage quantity. Default 0. |
imessage_device_ids | body | array<number> | no | iMessage devices — ids where channel is "imessage". No more than imessage_quantity. Default 0. |
Request
curl -X POST "https://api.bluereacher.com/v1/subaccount-admins" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"name": "Sam Doe",
"email": "sam@example.com",
"workspace_ids": [
7
]
}'Responses
A 201 reply (Invited):
{
"success": true,
"message": "Subaccount admin invited. They set their password from the invitation email (link valid 24 hours).",
"data": {
"id": 41,
"name": "Sam Doe",
"email": "sam@example.com",
"status": "active",
"workspaces": [
{
"id": 7,
"name": "Lee Studio"
}
],
"devices": {
"imessage": []
},
"device_limits": {
"imessage": 0
},
"created_at": "2026-10-27T09:00:00.000Z"
}
}| Status | When | Message |
|---|---|---|
| 201 | Invited | |
| 400 | Missing or invalid field | email must be a valid email address |
| 401 | Missing or invalid token | Invalid or expired access token. |
| 403 | Missing scope | Missing scope(s): subaccount_admins.write. This integration was granted: … |
| 403 | The token was installed by a subaccount admin, not the account owner | Only a token installed by the account owner can manage subaccount admins. |
| 404 | A workspace is not the account's | One or more workspaces not found or not accessible to this token |
| 404 | A device is not the account's | One or more workspaces or devices not found or not accessible to this token |
| 409 | The email is already registered | That email is already registered |
Response fields
subaccount_admin. Fields:
| Field | Type | Description |
|---|---|---|
id | number | Example: 41 |
name | string | Full name. |
email | string | The email they sign in with. |
status | string | "active" or "inactive". An inactive admin cannot sign in. Example: active |
workspaces | array<object> | The workspaces they can work in: id and name. |
devices | object | |
device_limits | object | |
created_at | string (ISO 8601) | When they were added. |
Update subaccount admin
PATCH https://api.bluereacher.com/v1/subaccount-admins/{id}Auth: Bearer access token. Scope: subaccount_admins.write.
Rename, activate / deactivate, or change their workspaces, device limits and devices.
Send only what changes; everything else stays as it is.
For workspaces send either workspace_ids (the whole new set — [] removes all) or add_workspace_ids / remove_workspace_ids, not both.
Device limits come first. The limit and the ids can be sent in the same request.
Only devices on the installer's own account can be assigned (404 otherwise).
Both can go in one request (remove one, add another). A device already held is never swapped out: if adding would take the admin past the channel's limit, the request is refused with 400 and nothing changes — raise the limit or remove a device first. A channel you do not send is left as it is, and so is a limit you do not send. A limit cannot go below the devices the admin holds.
email, password, by_pass_2fa, wl_allowed and plan_id cannot be changed through the API (400).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | number | yes | Subaccount admin id. |
name | body | string | no | Full name, up to 255 characters. |
status | body | enum | no | Inactive stops them signing in. |
workspace_ids | body | array<number> | no | The whole new set of workspaces. |
add_workspace_ids | body | array<number> | no | Workspaces to give them. |
remove_workspace_ids | body | array<number> | no | Workspaces to take away. |
imessage_quantity | body | number | no | How many iMessage devices they may hold. At most your plan's iMessage quantity. Added to what they already hold. |
imessage_device_ids | body | array<number> | no | iMessage devices — ids where channel is "imessage". No more than imessage_quantity. Added to what they already hold. |
remove_imessage_device_ids | body | array<number> | no | iMessage devices to take away. |
Request
curl -X PATCH "https://api.bluereacher.com/v1/subaccount-admins/41" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"status": "active",
"add_workspace_ids": [
9
]
}'Responses
A 200 reply (OK):
{
"success": true,
"message": "Subaccount admin updated",
"data": {
"id": 41,
"name": "Sam Doe",
"email": "sam@example.com",
"status": "active",
"workspaces": [
{
"id": 7,
"name": "Lee Studio"
},
{
"id": 9,
"name": "Harbour Dental"
}
],
"devices": {
"imessage": []
},
"device_limits": {
"imessage": 0
},
"created_at": "2026-10-27T09:00:00.000Z"
}
}| Status | When | Message |
|---|---|---|
| 200 | OK | |
| 400 | Nothing to update, or a field that cannot be changed | email cannot be changed through the API |
| 400 | A limit below the devices held, or above your plan | imessage_quantity cannot be above your plan's iMessage limit (2). |
| 401 | Missing or invalid token | Invalid or expired access token. |
| 403 | Missing scope | Missing scope(s): subaccount_admins.write. This integration was granted: … |
| 403 | The token was installed by a subaccount admin, not the account owner | Only a token installed by the account owner can manage subaccount admins. |
| 404 | Not a subaccount admin of the installer | Subaccount admin not found or not accessible to this token |
| 404 | A workspace or device that is not on the installer's account | One or more workspaces or devices not found or not accessible to this token |
Response fields
subaccount_admin. Fields:
| Field | Type | Description |
|---|---|---|
id | number | Example: 41 |
name | string | Full name. |
email | string | The email they sign in with. |
status | string | "active" or "inactive". An inactive admin cannot sign in. Example: active |
workspaces | array<object> | The workspaces they can work in: id and name. |
devices | object | |
device_limits | object | |
created_at | string (ISO 8601) | When they were added. |
Delete subaccount admin
DELETE https://api.bluereacher.com/v1/subaccount-admins/{id}Auth: Bearer access token. Scope: subaccount_admins.write.
Remove the person and all their access.
Their account, workspace and device access are deleted. Cannot be undone; to stop them signing in for now, set status to inactive instead.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | number | yes | Subaccount admin id. |
Request
curl -X DELETE "https://api.bluereacher.com/v1/subaccount-admins/41" \
-H "Authorization: Bearer <ACCESS_TOKEN>"Responses
A 200 reply (OK):
{
"success": true,
"message": "Subaccount admin deleted"
}| Status | When | Message |
|---|---|---|
| 200 | OK | |
| 401 | Missing or invalid token | Invalid or expired access token. |
| 403 | Missing scope | Missing scope(s): subaccount_admins.write. This integration was granted: … |
| 403 | The token was installed by a subaccount admin, not the account owner | Only a token installed by the account owner can manage subaccount admins. |
| 404 | Not a subaccount admin of the installer | Subaccount admin not found or not accessible to this token |

