Menu

API reference · Members

Permission templates

members · presets · 6 operations

GET/v1/members/presets

List permission presets

members.presets.list

ReadIdempotentSince 2026-11-01

Lists the organization's permission presets by name: named configurations of per-module permissions (module_permissions for the organization and, in a workspace, child_module_permissions for the member's assigned Accounts; module id → hidden, view_only or full_access) that an owner or admin applies to members and viewers with members.presets.apply. Requires view access to Members.

Scope
members:read
Permission
View the module
MCP tool
members_presets_listOn the full surface; on the compact one, mb_execute_operation with id: "members.presets.list".

Declared cost: up to 501 reads and 0 writes per call (they count against the daily quota).

Parameters

No parameters.

Response

dataarray<object>

Errors

Example

curl "https://api.mb-suite.com/v1/members/presets" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl "https://api.mb-suite.com/v1/members/presets" \
  -H "Authorization: Bearer $MB_TEST_KEY"
GET/v1/members/presets/{preset_id}

Get one permission preset

members.presets.get

ReadIdempotentSince 2026-11-01

Returns one permission preset with its name, color, description and the two permission maps (organization and assigned Accounts). 404 permission_preset_not_found if it is not in this organization. Requires view access to Members.

Scope
members:read
Permission
View the module
MCP tool
members_presets_getOn the full surface; on the compact one, mb_execute_operation with id: "members.presets.get".

Declared cost: up to 1 reads and 0 writes per call (they count against the daily quota).

Parameters

preset_idstringpathrequired

A permission preset id (members.presets.list).

Response

idstring
namestring
colorstring | null
descriptionstring | null
module_permissionsobject
child_module_permissionsobject
created_atnumber | null
created_by_idstring | null
updated_atnumber | null

Errors

Example

curl "https://api.mb-suite.com/v1/members/presets/{preset_id}" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl "https://api.mb-suite.com/v1/members/presets/{preset_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/members/presets

Create a permission preset

members.presets.create

WriteSince 2026-11-01

Creates a permission preset: a name (up to 80 characters), an optional color and description, module_permissions (module id → hidden, view_only or full_access for this organization) and, for workspaces, child_module_permissions (the same kind of map applied in every Account assigned to the member). Modules the organization does not have are kept in the preset and skipped when it is applied. Returns the preset. Owner or admin only.

Scope
members:write
Permission
Edit in the module · Only owner, admin
MCP tool
members_presets_createOn the full surface; on the compact one, mb_execute_operation with id: "members.presets.create".

Declared cost: up to 1 reads and 1 writes per call (they count against the daily quota).

Parameters

namestringbodyrequired

The preset's name (up to 80 characters).

colorstringbodyoptional

Its color in the app (#rrggbb).

descriptionstringbodyoptional

What the preset is for (up to 300 characters).

module_permissionsobjectbodyoptional

Module id → hidden, view_only or full_access, for the organization itself.

child_module_permissionsobjectbodyoptional

Workspaces only: the overrides for the member's assigned Accounts.

Response

preset_idstring
presetobject

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/members/presets" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "name": "NAME"
}'

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/members/presets" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "name": "NAME"
}'
PATCH/v1/members/presets/{preset_id}

Update a permission preset

members.presets.update

WriteIdempotentSince 2026-11-01

Updates a permission preset: name, color, description (null or empty removes it), module_permissions (replaces the map) and child_module_permissions (replaces the map; null or {} removes it). Unknown fields are rejected. Changing a preset does not change the members it was already applied to: apply it again with members.presets.apply. 404 permission_preset_not_found. Returns the preset. Owner or admin only.

Scope
members:write
Permission
Edit in the module · Only owner, admin
MCP tool
members_presets_updateOn the full surface; on the compact one, mb_execute_operation with id: "members.presets.update".

Declared cost: up to 1 reads and 1 writes per call (they count against the daily quota).

Parameters

preset_idstringpathrequired

A permission preset id (members.presets.list).

updatesobjectbodyrequired

What changes: only the fields sent.

Response

presetobject

Errors

Example

curl -X PATCH "https://api.mb-suite.com/v1/members/presets/{preset_id}" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "updates": {}
}'

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X PATCH "https://api.mb-suite.com/v1/members/presets/{preset_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "updates": {}
}'
DELETE/v1/members/presets/{preset_id}

Delete a permission preset

members.presets.delete

IrreversibleSince 2026-11-01

Deletes a permission preset. The permissions of the members it was applied to do not change (they keep the preset id as their origin until edited). It stays 30 days in the trash, where an owner or admin can restore it with its id (platform.trash.restore). Outside the app it needs a dry run and a confirm_token, except a REST DELETE with a key allowed to delete. 404 permission_preset_not_found. Owner or admin only.

With an API key, this DELETE runs directly: the record stays 30 days in the trash and the response carries its trash_item_id. With an OAuth token, and through the MCP, it needs dry_run → confirm_token.

Scope
members:write and “Allow deletions” (members:delete in OAuth)
Permission
Edit in the module · Only owner, admin
MCP tool
members_presets_deleteOn the full surface; on the compact one, mb_execute_operation with id: "members.presets.delete".

Declared cost: up to 2 reads and 1 writes per call (they count against the daily quota).

Parameters

preset_idstringpathrequired

A permission preset id (members.presets.list).

Response

oktrue
trash_item_idstring

The trash item this deletion left: the item_id of platform.trash.restore (POST /trash/{item_id}/restore). Missing if nothing went to the trash.

trash_item_idsarray<string>

Only when the deletion left more than one copy: all of them, the first being trash_item_id.

trash_expires_atnumber

When the copy leaves the trash for good (epoch ms): 30 days after the deletion.

Errors

Example

curl -X DELETE "https://api.mb-suite.com/v1/members/presets/{preset_id}" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X DELETE "https://api.mb-suite.com/v1/members/presets/{preset_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/members/presets/{preset_id}/apply

Apply a permission preset to members

members.presets.apply

WriteBulk · up to 500IdempotentSince 2026-11-01

Applies a permission preset to up to 500 members in one write: each member's per-module permissions are replaced by the preset's (only the modules the organization has active; the rest are counted in dropped_module_count) and the preset is recorded as their origin (applied_preset_id). Owners and admins are skipped (skipped_roles): they always have full access. In a workspace of an agency the preset's child_module_permissions apply to the member's assigned Accounts too. Members not found are returned in not_found. Fires members.member.permissions_changed once per member changed. Outside the app it requires a dry run (which lists who changes) and a confirm_token. Owner or admin only.

Needs confirmation: first dry_run: true (preview and confirm_token, valid 10 minutes and for one run), then the same body with confirm_token. In a few operations only with certain data: the description says when. Why and how: Dry run and confirm_token.

Scope
members:write
Permission
Edit in the module · Only owner, admin
MCP tool
members_presets_applyOn the full surface; on the compact one, mb_execute_operation with id: "members.presets.apply".

Declared cost: up to 502 reads and 1 writes per call (they count against the daily quota).

Parameters

preset_idstringpathrequired

A permission preset id (members.presets.list).

user_idsarray<string>bodyrequired

The members that get the preset (owners and admins are skipped: they always have full access).

Response

applied_countnumber
skipped_rolesnumber
dropped_module_countnumber
not_foundarray<string>

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/members/presets/{preset_id}/apply" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "user_ids": [
    "USER_ID"
  ],
  "dry_run": true
}'

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/members/presets/{preset_id}/apply" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "user_ids": [
    "USER_ID"
  ],
  "dry_run": true
}'