Menu

API reference · CRM

Team

crm · team · 7 operations

GET/v1/crm/team

List the CRM team (sellers and AI agents)

crm.team.list

ReadIdempotentSince 2026-11-01

Lists the CRM team in display order: the organization members added as sellers (kind human), with their CRM role (sales_rep, sales_manager or crm_admin), name, email and photo, and the AI agents (kind ai_agent) that can own records, with whether their position is enabled. The user_id is what deals, persons, companies and prospects take as owner_id. Each entry also carries the seller scope stored for it (scope own or all, blocked and read-only pipelines). Email signatures are not included. Org owners and admins act as CRM admins even when they are not on the list.

Scope
crm:read
Permission
View the module
MCP tool
crm_team_listOn the full surface; on the compact one, mb_execute_operation with id: "crm.team.list".

Declared cost: up to 201 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/crm/team" \
  -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/crm/team" \
  -H "Authorization: Bearer $MB_TEST_KEY"
GET/v1/crm/team/available-members

List org members who can join the CRM team

crm.team.available_members

ReadIdempotentSince 2026-11-01

Lists the organization members who are not in the CRM team yet and can be added with crm.team.add, with user_id, profile name (empty when they never set one), email, organization role and photo. Viewers are left out: they cannot operate the CRM.

Scope
crm:read
Permission
View the module
MCP tool
crm_team_available_membersOn the full surface; on the compact one, mb_execute_operation with id: "crm.team.available_members".

Declared cost: up to 200 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/crm/team/available-members" \
  -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/crm/team/available-members" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/crm/team

Add an org member to the CRM team

crm.team.add

WriteSince 2026-11-01

Adds an organization member (not a viewer) to the CRM team with a CRM role: sales_rep (works their own records; limited by the seller scope when the org enforces it), sales_manager (operates the whole team's records) or crm_admin (also configures the CRM). Use crm.team.available_members to find who can be added. The seller scope starts turned off, also for a new team: turn it on with crm.settings.seller_scope.update. Only owners, admins and CRM admins can manage the team.

Scope
crm:write
Permission
Edit in the module
MCP tool
crm_team_addOn the full surface; on the compact one, mb_execute_operation with id: "crm.team.add".

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

Parameters

user_idstringbodyrequired

The organization member to add, from crm.team.available_members.

crm_roleenumbodyrequired

CRM role: sales_rep (works their own records; limited by the seller scope when enforced), sales_manager (the whole team's records) or crm_admin (also configures the CRM).

Values: sales_rep, sales_manager, crm_admin

Response

user_idstring
crm_roleenum

Values: sales_rep, sales_manager, crm_admin

ordernumber
added_atnumber
added_by_idstring
kindenum

Values: human, ai_agent

scopeenum

Values: all, own

blocked_pipeline_idsarray<string>
read_only_pipeline_idsarray<string>

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/crm/team" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "user_id": "USER_ID",
  "crm_role": "sales_rep"
}'

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/crm/team" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "user_id": "USER_ID",
  "crm_role": "sales_rep"
}'
POST/v1/crm/team/{user_id}/remove

Remove a seller from the CRM team

crm.team.remove

IrreversibleIdempotentSince 2026-11-01

Removes a user from the CRM team: they are no longer offered as an owner in the CRM pickers and are taken out of every mailbox's custom privacy list; their email signatures, stored on their team entry, are deleted. Their deals, persons and prospects keep them as owner (reassign them first if needed), and assignment rules that list them as a participant keep them until edited with crm.assignment_rules.update. It does not go to the trash: add them back with crm.team.add. The dry run names them and counts the signatures that go away (crm_user_not_found when they are not in the team). Only owners, admins and CRM admins.

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
crm:write and “Allow deletions” (crm:delete in OAuth)
Permission
Edit in the module
MCP tool
crm_team_removeOn the full surface; on the compact one, mb_execute_operation with id: "crm.team.remove".

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

Parameters

user_idstringpathrequired

The team member's user id, from crm.team.list.

Response

oktrue

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/crm/team/{user_id}/remove" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "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/crm/team/{user_id}/remove" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "dry_run": true
}'
PATCH/v1/crm/team/{user_id}

Change a team member's CRM role

crm.team.update_role

WriteIdempotentSince 2026-11-01

Changes the CRM role of a team member (sales_rep, sales_manager or crm_admin) and recomputes their seller scope in the same write. Returns changed: false, without writing, when they already had that role. Fails with crm_user_not_found if they are not in the team. Only owners, admins and CRM admins.

Scope
crm:write
Permission
Edit in the module
MCP tool
crm_team_update_roleOn the full surface; on the compact one, mb_execute_operation with id: "crm.team.update_role".

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

Parameters

user_idstringpathrequired

The team member's user id, from crm.team.list.

crm_roleenumbodyrequired

CRM role: sales_rep (works their own records; limited by the seller scope when enforced), sales_manager (the whole team's records) or crm_admin (also configures the CRM).

Values: sales_rep, sales_manager, crm_admin

Response

changedboolean

Errors

Example

curl -X PATCH "https://api.mb-suite.com/v1/crm/team/{user_id}" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "crm_role": "sales_rep"
}'

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/crm/team/{user_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "crm_role": "sales_rep"
}'
POST/v1/crm/team/reorder

Reorder the CRM team

crm.team.reorder

WriteIdempotentSince 2026-11-01

Sets the display order of the CRM team (the Team table and the owner pickers): ordered_ids is the list of user_ids from crm.team.list in the new order, up to 500, each one once. Every id must already be in the team: otherwise nothing changes and it answers crm_user_not_found with details.missing_ids. Only owners, admins and CRM admins.

Scope
crm:write
Permission
Edit in the module
MCP tool
crm_team_reorderOn the full surface; on the compact one, mb_execute_operation with id: "crm.team.reorder".

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

Parameters

ordered_idsarray<string>bodyrequired

The team's user ids (crm.team.list) in the new order, each once, up to 500.

Response

oktrue

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/crm/team/reorder" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "ordered_ids": [
    "ORDERED_ID"
  ]
}'

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/crm/team/reorder" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "ordered_ids": [
    "ORDERED_ID"
  ]
}'
POST/v1/crm/team/{user_id}/out-of-office

Mark a seller out of office, or back, in every assignment rule

crm.team.out_of_office

WriteIdempotentSince 2026-11-01

Marks a seller out of office (is_out_of_office: true, optionally until oof_until in epoch milliseconds) or back, in every assignment rule where they are a participant. While out, the rules skip them when assigning new leads, and an hourly job reassigns, through the same rule, their open deals with no activity for 3 days, and clears the flag once oof_until passes. Returns how many rules changed. Anyone can set their own; someone else's requires manage_assignment.

Scope
crm:write
Permission
Edit in the module
MCP tool
crm_team_out_of_officeOn the full surface; on the compact one, mb_execute_operation with id: "crm.team.out_of_office".

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

Parameters

user_idstringpathrequired

The seller (user id from crm.team.list).

is_out_of_officebooleanbodyrequired

true marks them out of office, false back.

oof_untilintegerbodyoptional

Until when, epoch ms: the flag clears itself then.

Response

updated_rulesnumber

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/crm/team/{user_id}/out-of-office" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "is_out_of_office": 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/crm/team/{user_id}/out-of-office" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "is_out_of_office": true
}'