Dry run of crm.delete_cascade.execute: for a prospect, person, company or deal (entity_type + entity_id, or root: { type, id }), returns what would be deleted (the root and the linked records nobody else references), what is kept because it is shared or is a real company (with the reasons) and how many deals/prospects would lose a link. Nothing is written: it is a read, so a credential without deletion can run it, but the person behind it needs the delete permission of that entity type (as in the app, where only they see the option).
Scope
crm:read
Permission
Edit in the module
MCP tool
crm_delete_cascade_previewOn the full surface; on the compact one, mb_execute_operation with id: "crm.delete_cascade.preview".
Declared cost: up to 40 reads and 0 writes per call (they count against the daily quota).
Parameters
entity_typeenumbodyoptional
The kind of the record to delete (the root). Send entity_type + entity_id, or root.
Values: prospect, person, company, deal
entity_idstringbodyoptional
The root record, by id.
rootobjectbodyoptional
The root as crm.archive_cascade takes it: { type, id }. Send this or entity_type + entity_id, not both.
curl-X POST "https://api.mb-suite.com/v1/crm/delete-cascade/preview" \
-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/delete-cascade/preview" \
-H"Authorization: Bearer $MB_TEST_KEY"
POST/v1/crm/delete-cascade
Delete a record with its orphaned linked records
crm.delete_cascade.execute
IrreversibleSince 2026-11-01
Deletes a prospect, person, company or deal (entity_type + entity_id, or root: { type, id }) and, in cascade, the linked records that only it referenced (for example the provisional company an intake created for a person, or the only person of a company); shared records, and a company that is not provisional when the root is a person, a prospect or a deal, are kept and unlinked (crm.delete_cascade.preview says why: not_placeholder, linked_deals…). The plan is rebuilt right before deleting. The root and everything deleted go together to the 30-day trash: restoring brings the records back (a root person is re-linked to their deals and lists), not the links removed from the kept records nor the root's change history. Requires the delete permission of that entity type. 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:writeand “Allow deletions” (crm:delete in OAuth)
Permission
Edit in the module
MCP tool
crm_delete_cascade_executeOn the full surface; on the compact one, mb_execute_operation with id: "crm.delete_cascade.execute".
Declared cost: up to 400 reads and 300 writes per call (they count against the daily quota).
Parameters
entity_typeenumbodyoptional
The kind of the record to delete (the root). Send entity_type + entity_id, or root.
Values: prospect, person, company, deal
entity_idstringbodyoptional
The root record, by id.
rootobjectbodyoptional
The root as crm.archive_cascade takes it: { type, id }. Send this or entity_type + entity_id, not both.
Response
deleted_countnumber
kept_countnumber
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.