Menu

API reference · CRM

Activities

crm · activities · 8 operations

GET/v1/crm/activities

List activities (timeline of an entity, or the agenda)

crm.activities.list

ReadIdempotentSince 2026-11-01

With entity_type + entity_id: the timeline of a deal, person, company or prospect (root notes, tasks, calls, meetings, emails and messages, newest first; replies and purged emails excluded; for API keys and third-party apps, emails of connected mailboxes appear only when the organization allows connected content and the credential was granted it; optional types filter). Without them: the agenda of tasks, calls and meetings by due date, with completion pending (default), done or all, an optional owner filter (team-wide only for managers; sellers get their own) and a due_from/dueTo window. Paginated by cursor.

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

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

Parameters

limitintegerqueryoptional

How many items this page brings at most (see the maximum and the default in the schema).

Default: 50

cursorstringqueryoptional

The next_cursor of the previous page, exactly as it came (only for the same list and filters); without it, the first page.

entity_typeenumqueryoptional

With entity_id: that record's timeline. Without both: the agenda (tasks, calls and meetings).

Values: deal, person, company, prospect

entity_idstringqueryoptional

The record whose timeline to list (with entity_type).

typesarray<enum>queryoptional

Only these types.

Values: call, email, meeting, note, task, whatsapp, file, custom

completionenumqueryoptional

Agenda: pending (default), done or all.

Values: pending, done, all

owner_idstringqueryoptional

Agenda: only this person's (a member's user id); a seller only sees their own.

owner_idsarray<string>queryoptional

Agenda: only these persons' (up to 10).

due_fromintegerqueryoptional

Agenda: due from this moment, epoch ms.

due_tointegerqueryoptional

Agenda: due until this moment, epoch ms.

Response

dataarray<object>
has_moreboolean
next_cursorstring

Errors

Example

curl "https://api.mb-suite.com/v1/crm/activities" \
  -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/activities" \
  -H "Authorization: Bearer $MB_TEST_KEY"
GET/v1/crm/activities/{activity_id}

Get one activity with its replies

crm.activities.get

ReadIdempotentSince 2026-11-01

Returns an activity (note, task, call, meeting, email, message…) with its links to deals, persons, companies and prospects, and the replies of a note in order. For API keys and third-party apps, an email of a connected mailbox is not found unless the organization allows connected content and the credential was granted it. Not found if the id does not exist, the email was deleted, or a seller cannot see the deal it belongs to.

Scope
crm:read
Permission
View the module
MCP tool
crm_activities_getOn the full surface; on the compact one, mb_execute_operation with id: "crm.activities.get".

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

Parameters

activity_idstringpathrequired

The activity, by id (crm.activities.list).

Response

activityobject
repliesarray<object>

Errors

Example

curl "https://api.mb-suite.com/v1/crm/activities/{activity_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/crm/activities/{activity_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/crm/activities

Create a note, reply, task, call or meeting

crm.activities.create

WriteSince 2026-11-01

Creates an activity by type. note: HTML content (sanitized), mentions, optional attachments; task: subject, due date, priority, assignee; call: optional subject, outcome, duration, completed_now for a call that already happened; meeting: subject, date, provider, URL, attendees; reply: a note under parent_activity_id that inherits its links. For note/task/call/meeting pass target (the deal, person, company or prospect it belongs to): the activity is linked to that entity and its related ones, and links can narrow the set. Mentions notify the mentioned members. Requires create_activity.

Scope
crm:write
Permission
Edit in the module
MCP tool
crm_activities_createOn the full surface; on the compact one, mb_execute_operation with id: "crm.activities.create".
Events it can emit
crm.activity.created

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

Parameters

No parameters.

Response

activity_idstring

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/crm/activities" \
  -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 POST "https://api.mb-suite.com/v1/crm/activities" \
  -H "Authorization: Bearer $MB_TEST_KEY"
PATCH/v1/crm/activities/{activity_id}

Update an activity (fields, pin, links)

crm.activities.update

WriteSince 2026-11-01

Updates an activity: subject, description, content, mentions (new ones are notified), due date, completed_at, duration, owner (a member), metadata (merged); pinned fixes it on top of the timeline; links replaces, per dimension given, the deals/companies/persons/prospects it belongs to (unknown ids are dropped). Requires edit_activity (owner or creator of the activity).

Scope
crm:write
Permission
Edit in the module
MCP tool
crm_activities_updateOn the full surface; on the compact one, mb_execute_operation with id: "crm.activities.update".

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

Parameters

activity_idstringpathrequired

The activity, by id (crm.activities.list).

updatesobjectbodyrequired

The fields to change; the rest stay as they are.

Response

oktrue

Errors

Example

curl -X PATCH "https://api.mb-suite.com/v1/crm/activities/{activity_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/crm/activities/{activity_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "updates": {}
}'
POST/v1/crm/activities/{activity_id}/complete

Complete or reopen a task, call or meeting

crm.activities.complete

WriteIdempotentSince 2026-11-01

Marks an activity as completed (completed: true, now) or pending again (false); a completed sequence task lets its enrollment continue and a completed call counts as an outbound contact. Requires edit_activity.

Scope
crm:write
Permission
Edit in the module
MCP tool
crm_activities_completeOn the full surface; on the compact one, mb_execute_operation with id: "crm.activities.complete".

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

Parameters

activity_idstringpathrequired

The activity, by id (crm.activities.list).

completedbooleanbodyrequired

true marks it done now; false makes it pending again.

Response

oktrue

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/crm/activities/{activity_id}/complete" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "completed": 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/activities/{activity_id}/complete" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "completed": true
}'
DELETE/v1/crm/activities/{activity_id}

Delete an activity

crm.activities.delete

IrreversibleSince 2026-11-01

Deletes an activity and the replies of a note; they go to the 30-day trash and restore together. An email is not deleted but emptied (a tombstone that keeps the mail sync from recreating it) and does not go to the trash. Requires delete_activity.

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

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

Parameters

activity_idstringpathrequired

The activity, by id (crm.activities.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/crm/activities/{activity_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/crm/activities/{activity_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/crm/activities/bulk/update

Reschedule, reassign or complete many activities

crm.activities.bulk.update

WriteBulk · up to 500Since 2026-11-01

Updates up to 500 activities in one call, with the changes inside updates (as in crm.activities.update): updates.due_date (epoch ms; null clears it), updates.owner_id (a member) and/or updates.completed. Activities that already are that way are left as they are (unchanged: completing one already done keeps the time it was done) and ids that do not exist (or deleted emails) are skipped (not_found). Rescheduling or completing tasks, calls and meetings updates the pending and overdue counts of their deals and prospects. Manager-tier only. Outside the screen it requires a dry run and a confirm_token.

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
Permission
Edit in the module
MCP tool
crm_activities_bulk_updateOn the full surface; on the compact one, mb_execute_operation with id: "crm.activities.bulk.update".

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

Parameters

activity_idsarray<string>bodyrequired

The activities (up to 500), by id (crm.activities.list).

updatesobjectbodyrequired

The changes, applied to every activity of the batch.

Response

updatednumber

How many activities changed.

unchangednumber

How many activities already were that way: not written.

not_foundarray<string>

The ids that do not exist in the organization (or are merged-away duplicates): skipped.

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/crm/activities/bulk/update" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "activity_ids": [
    "ACTIVITY_ID"
  ],
  "updates": {},
  "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/activities/bulk/update" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "activity_ids": [
    "ACTIVITY_ID"
  ],
  "updates": {},
  "dry_run": true
}'
POST/v1/crm/activities/bulk/delete

Delete many activities

crm.activities.bulk.delete

IrreversibleBulk · up to 500Since 2026-11-01

Deletes up to 500 activities; each goes to the 30-day trash and can be restored one by one (an email is emptied instead, as with crm.activities.delete). deleted counts the activities that existed; the other ids come back in not_found. Manager-tier only. Outside the screen it requires a dry run and a confirm_token.

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_activities_bulk_deleteOn the full surface; on the compact one, mb_execute_operation with id: "crm.activities.bulk.delete".

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

Parameters

activity_idsarray<string>bodyrequired

The activities (up to 500), by id (crm.activities.list).

Response

deletednumber

How many activities were deleted (each one goes to the 30-day trash).

not_foundarray<string>

The ids that do not exist in the organization: nothing to delete.

trash_item_idsarray<string>

The trash items this deletion left, one per record: the item_id of platform.trash.restore (POST /trash/{item_id}/restore).

trash_expires_atnumber

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

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/crm/activities/bulk/delete" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "activity_ids": [
    "ACTIVITY_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/crm/activities/bulk/delete" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "activity_ids": [
    "ACTIVITY_ID"
  ],
  "dry_run": true
}'