Menu

API reference · CRM

Calendar

crm · calendar · 7 operations

GET/v1/crm/calendar/vendors

List the sellers whose calendar you can see

crm.calendar.vendors.list

ReadIdempotentSince 2026-11-01

Lists the sellers of the organization with a Google or Outlook calendar connected that the caller can see (their own; owners and admins see all; colleagues depending on each seller's sharing: open, private or custom), with providers, sharing settings, overlay color, the last good sync, the state of the sync in words (sync_status ok, failing, stale or never; sync_status_text) and the raw error of a failing one. Their user_id is the vendor_user_id of the calendar operations. Read-only.

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

Declared cost: up to 400 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/calendar/vendors" \
  -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/calendar/vendors" \
  -H "Authorization: Bearer $MB_TEST_KEY"
GET/v1/crm/calendar/events

List calendar events and bookings in a time window

crm.calendar.events.list

ReadIdempotentConnected mailboxes and calendarsSince 2026-11-01

For API keys and third-party apps this operation exists only when the organization's owner allows connected calendar content and the credential was granted it; even then it reads only the calendar of the user the credential acts as (other vendor_user_ids are not found) and returns only the events whose organizer or attendees include a CRM person or company (plus the CRM bookings), never the whole calendar; busy-only (masked) events are omitted for them. Returns the events of one or more sellers' Google or Outlook calendars (mirrored in MB Suite) and their confirmed CRM bookings between start_ms and end_ms (ms UTC, at most 62 days; default seller: the caller). Calendars a seller does not share with the caller are skipped; when they share only busy/free, their events come masked (summary '__masked__', masked: true, no attendees). Bookings come in their own list (their calendar event is not repeated) and never include the booker's cancel/reschedule tokens; a booking's booker_email is an empty string when an AI Setter booked without the person's email (reach them by booker_phone).

Only if the organization allows it and the credential has it granted; it returns only what is linked to the CRM from the caller's own mailbox. Connected mailboxes and calendars

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

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

Parameters

start_msintegerqueryrequired

Window start, epoch ms.

end_msintegerqueryrequired

Window end, epoch ms (at most 62 days after start_ms).

vendor_user_idsarray<string>queryoptional

Sellers (user ids from crm.calendar.vendors.list), up to 50; default: the caller.

Response

eventsarray<object>
bookingsarray<object>

Errors

Example

curl "https://api.mb-suite.com/v1/crm/calendar/events?start_ms=0&end_ms=0" \
  -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/calendar/events?start_ms=0&end_ms=0" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/crm/calendar/events

Create a calendar event or schedule a meeting

crm.calendar.events.create

WriteSince 2026-11-01

Creates an event in a seller's Google or Outlook calendar (default: the caller's; another seller's only for an owner or admin, and only if they allow admin edits) with optional location, attendees (they get the invitation) and a Meet/Teams link (with_meet). With meeting it schedules a meeting with a CRM record instead: the event goes to the caller's own calendar with a video link by default, a 'meeting' activity is logged on the deal, person, company or prospect (and the records linked to it) and the deals' last activity moves. Needs a connected calendar (integration_not_connected otherwise); when the provider does not confirm the creation it answers external_outcome_unknown (the event may exist: look at the calendar before creating it again). Returns the event_id that crm.calendar.events.update and delete take. Requires manage_own_calendar_events / manage_any_calendar_events, or create_activity for a meeting.

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_calendar_events_createOn the full surface; on the compact one, mb_execute_operation with id: "crm.calendar.events.create".
Events it can emit
crm.activity.created

Declared cost: up to 20 reads and 10 writes per call (they count against the daily quota). Touches an external platform (google): it counts against the external operations quota.

Parameters

summarystringbodyrequired

The event's title (a meeting's, up to 300 characters).

start_msintegerbodyrequired

Start, epoch ms.

end_msintegerbodyrequired

End, epoch ms.

time_zonestringbodyrequired

IANA time zone of the event (America/Argentina/Buenos_Aires).

vendor_user_idstringbodyoptional

The seller whose calendar it is (user_id from crm.calendar.vendors.list); default: the caller. A meeting always goes to the caller's own calendar.

descriptionstringbodyoptional

The event's description.

locationstringbodyoptional

Where it is.

attendeesarray<object>bodyoptional

Up to 50 attendees: each one gets the invitation.

with_meetbooleanbodyoptional

Add a Google Meet / Teams link (default: no for an event, yes for a meeting).

providerenumbodyoptional

google or microsoft (Outlook): only when the seller has both connected; default: the one of the mirrored event or the seller's connection.

Values: google, microsoft

meetingobjectbodyoptional

Schedule a meeting with a CRM record: besides the event, a 'meeting' activity is logged on it.

Response

event_idstring
html_linkstring
meet_linkstring
activity_idstring

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/crm/calendar/events" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "summary": "SUMMARY",
  "start_ms": 0,
  "end_ms": 0,
  "time_zone": "TIME_ZONE",
  "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. In the practice organization this operation is not simulated (it reaches another platform): it answers 409 sandbox_external_unavailable.

PATCH/v1/crm/calendar/events/{event_id}

Move, resize or edit a calendar event

crm.calendar.events.update

WriteSince 2026-11-01

Updates an event of a seller's Google or Outlook calendar (default: the caller's), by its event_id (the one crm.calendar.events.create returned, or, for a credential with connected calendar content, the one of crm.calendar.events.list). start_ms + end_ms move it (it checks free/busy first and answers slot_conflict on an overlap, unless skip_conflict_check); end_ms alone changes its duration; summary, description, location or attendees edit its details. time_zone is required when the time changes. A booking's event is moved with crm.bookings.reschedule instead. Another seller's calendar only for an owner or admin, and only if they allow admin edits. Requires manage_own_calendar_events / manage_any_calendar_events.

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_calendar_events_updateOn the full surface; on the compact one, mb_execute_operation with id: "crm.calendar.events.update".

Declared cost: up to 6 reads and 1 writes per call (they count against the daily quota). Touches an external platform (google): it counts against the external operations quota.

Parameters

event_idstringpathrequired

The event's id in Google or Outlook: event_id of crm.calendar.events.create, or id of crm.calendar.events.list (when the credential has connected content).

vendor_user_idstringbodyoptional

The seller whose calendar it is (user_id from crm.calendar.vendors.list); default: the caller.

providerenumbodyoptional

google or microsoft (Outlook): only when the seller has both connected; default: the one of the mirrored event or the seller's connection.

Values: google, microsoft

start_msintegerbodyoptional

New start, epoch ms (with end_ms: it moves the event).

end_msintegerbodyoptional

New end, epoch ms (alone: it changes the duration).

time_zonestringbodyoptional

IANA time zone; required when the time changes.

skip_conflict_checkbooleanbodyoptional

Move it without checking overlaps with other events (default: answers slot_conflict).

summarystringbodyoptional

New title.

descriptionstringbodyoptional

New description.

locationstringbodyoptional

New location.

attendeesarray<object>bodyoptional

The whole new list of attendees.

Response

oktrue

Errors

Example

curl -X PATCH "https://api.mb-suite.com/v1/crm/calendar/events/{event_id}" \
  -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. In the practice organization this operation is not simulated (it reaches another platform): it answers 409 sandbox_external_unavailable.

DELETE/v1/crm/calendar/events/{event_id}

Delete a calendar event

crm.calendar.events.delete

IrreversibleSince 2026-11-01

Deletes an event from a seller's Google or Outlook calendar (default: the caller's) and its mirror in MB Suite, by its event_id (from crm.calendar.events.create or, with connected calendar content, crm.calendar.events.list); the attendees get the provider's cancellation. The dry run says whether the event is in MB Suite's mirror (validated false when it is not: it may not exist). A copy (title, time, attendees) stays 30 days in the trash for reference, without automatic restore: the event no longer exists in the provider. To cancel a booking use crm.bookings.cancel. Another seller's calendar only for an owner or admin, and only if they allow admin edits. Requires manage_own_calendar_events / manage_any_calendar_events.

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

Declared cost: up to 6 reads and 2 writes per call (they count against the daily quota). Touches an external platform (google): it counts against the external operations quota.

Parameters

event_idstringpathrequired

The event's id in Google or Outlook: event_id of crm.calendar.events.create, or id of crm.calendar.events.list (when the credential has connected content).

vendor_user_idstringbodyoptional

The seller whose calendar it is (user_id from crm.calendar.vendors.list); default: the caller.

providerenumbodyoptional

google or microsoft (Outlook): only when the seller has both connected; default: the one of the mirrored event or the seller's connection.

Values: google, microsoft

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/calendar/events/{event_id}" \
  -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. In the practice organization this operation is not simulated (it reaches another platform): it answers 409 sandbox_external_unavailable.

PATCH/v1/crm/calendar/sharing/{vendor_user_id}

Change who sees a seller's calendar

crm.calendar.sharing.update

WriteIdempotentSince 2026-11-01

Updates a seller's calendar sharing inside MB Suite: who sees it (view_mode open, private, or custom with allowed_user_ids), how much colleagues see (view_details_mode all, crm_related or busy_only), whether owners and admins may edit it (allow_admin_edit) and its overlay color. Fields left out keep their value. The seller and allowed_user_ids must be people with access to the organization (vendor_not_found, recipient_without_access). Own calendar: requires manage_own_booking; another seller's: owner, admin or CRM admin only.

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

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

Parameters

vendor_user_idstringpathrequired

The seller whose calendar sharing changes: a person with access to the organization (crm.calendar.vendors.list or crm.team.list).

view_modeenumbodyoptional

Who sees it: open (every colleague), private (only the seller, owners and admins) or custom (allowed_user_ids).

Values: open, private, custom

allowed_user_idsarray<string>bodyoptional

With view_mode custom: who sees it, up to 200 people with access to the organization.

view_details_modeenumbodyoptional

How much colleagues see: all, crm_related (only events with CRM contacts) or busy_only (free/busy).

Values: all, crm_related, busy_only

allow_admin_editbooleanbodyoptional

Whether owners and admins may edit this calendar.

calendar_colorstringbodyoptional

Overlay color in the shared calendar, #rrggbb.

Response

oktrue

Errors

Example

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

Sync a seller's calendar now

crm.calendar.sync

WriteSince 2026-11-01

Pulls the latest changes of a seller's connected Google and/or Outlook calendars into MB Suite right away (the mirror also syncs by itself every few minutes). Anyone who can see that calendar may run it; there is a short cooldown between runs (cooldown_active with retry_after). Returns the events upserted and deleted; error carries the first provider failure, if any, while the other providers still applied.

Scope
crm:write
Permission
View the module
MCP tool
crm_calendar_syncOn the full surface; on the compact one, mb_execute_operation with id: "crm.calendar.sync".

Declared cost: up to 200 reads and 500 writes per call (they count against the daily quota). Touches an external platform (google): it counts against the external operations quota.

Parameters

vendor_user_idstringbodyrequired

The seller whose calendar syncs (user_id from crm.calendar.vendors.list).

Response

upsertednumber
deletednumber
providersarray<enum>

Values: google, microsoft

errorstring

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/crm/calendar/sync" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "vendor_user_id": "VENDOR_USER_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. In the practice organization this operation is not simulated (it reaches another platform): it answers 409 sandbox_external_unavailable.