Menu

API reference · API & MCP

Webhooks

developer_platform · webhooks · 11 operations

GET/v1/webhooks

List the organization's webhook subscriptions

platform.webhooks.list

ReadIdempotentSince 2026-11-01

Lists every webhook subscription of the organization with its status, events, last delivery and 7-day success rate, plus the plan's cap of active subscriptions. Secrets and the values of static headers never come back. Owners and admins only. Module: API & MCP (developer_platform), even though the id starts with platform.; the credential needs the developer_platform:read scope.

Scope
developer_platform:read
Permission
View the module · Only owner, admin
MCP tool
platform_webhooks_listOn the full surface; on the compact one, mb_execute_operation with id: "platform.webhooks.list".

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

Parameters

No parameters.

Response

dataarray<object>
max_activenumber

Errors

Example

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

Get one webhook subscription

platform.webhooks.get

ReadIdempotentSince 2026-11-01

Returns one webhook subscription with its events, status, counters and last delivery. The signing secret is never returned: rotate it to get a new one. Module: API & MCP (developer_platform), even though the id starts with platform.; the credential needs the developer_platform:read scope.

Scope
developer_platform:read
Permission
View the module · Only owner, admin
MCP tool
platform_webhooks_getOn the full surface; on the compact one, mb_execute_operation with id: "platform.webhooks.get".

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

Parameters

webhook_idstringpathrequired

The webhook subscription id (platform.webhooks.list).

Response

webhookobject

Errors

Example

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

List the event types a webhook can subscribe to

platform.webhooks.events

ReadIdempotentSince 2026-11-01

Returns the catalog of event types a webhook can subscribe to, one row per event in a flat list: type, module, group, a one-line summary and a description of when it fires. Filter with module, or ask for one event with type to get its example payload too (include_examples brings the example of every listed event: the whole catalog with examples does not fit in one response). Through the MCP, without module, type or include_examples, the rows come without description (a light index of every event: ask with module or type to read when each one fires); through the API every row has it. Use it to pick events before creating a subscription. Owners and admins only; the events of a private module only where it is enabled, and those of a module MB Suite has not opened for the organization, or that only carry the data of a platform whose terms do not allow sending it this way, are not listed; an event that carries it only sometimes (a lead from that platform, a change on it) is listed, does not arrive when it carries it, and arrives without that platform's fields when they are only part of it (the permissions guide lists the platforms). 400 invalid_input (param type) when type is not an event type. Module: API & MCP (developer_platform), even though the id starts with platform.; the credential needs the developer_platform:read scope.

Scope
developer_platform:read
Permission
View the module · Only owner, admin
MCP tool
platform_webhooks_eventsOn the full surface; on the compact one, mb_execute_operation with id: "platform.webhooks.events".

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

Parameters

modulestringqueryoptional

Only the events of this module (crm, task_management…: the module of each event).

typestringqueryoptional

Only this event type (crm.deal.created…), with its example payload.

include_examplesbooleanqueryoptional

Bring the example payload of every listed event (by default only with type: the full catalog with examples is too large for one response).

Default: false

Response

dataarray<object>

Errors

Example

curl "https://api.mb-suite.com/v1/webhooks/events" \
  -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/webhooks/events" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/webhooks

Create a webhook subscription

platform.webhooks.create

WriteSince 2026-11-01

Creates a subscription that receives the chosen events at an https URL, signed with a secret that is returned ONCE in this response (store it: it cannot be read again, only rotated). The destination must be a public host: private, internal and MB Suite's own addresses are rejected. A workspace can also listen to its child accounts with child_scope. Only the event types platform.webhooks.events lists for the organization are accepted (400 invalid_input otherwise). Up to 20 active subscriptions per organization. Owners and admins only. Module: API & MCP (developer_platform), even though the id starts with platform.; the credential needs the developer_platform:write scope.

Instructions for agents

Show the secret to the person once and tell them to store it now. Explain that MB-Signature is an HMAC-SHA256 of ${t}.${body} and that retries continue for 72 hours.

Scope
developer_platform:write
Permission
Edit in the module · Only owner, admin
MCP tool
platform_webhooks_createOn the full surface; on the compact one, mb_execute_operation with id: "platform.webhooks.create".

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

Parameters

urlstringbodyrequired

The https address that receives the deliveries (a POST per event, signed with the subscription's secret). Private and internal addresses are refused.

eventsarray<enum>bodyrequired

The event types to receive, as platform.webhooks.events lists them (crm.deal.created…).

Values: crm.lead.created, crm.deal.created, crm.deal.stage_changed, crm.deal.won, crm.deal.lost, crm.deal.reopened, crm.deal.archived, crm.deal.updated, crm.deal.deleted, crm.person.created, crm.person.updated, crm.person.deleted, crm.company.created, crm.company.updated, crm.company.deleted, crm.activity.created, job.completed, monitors.monitor.assigned, monitors.monitor.unassigned, monitors.template.published, dashboards.dashboard.created, dashboards.dashboard.deleted, dashboards.dashboard.exported, dashboards.template.published, reports.instance.generated, reports.instance.finalized, reports.instance.published, reports.pdf.ready, reports.pdf.failed, reports.template.published

descriptionstringbodyoptional

A note to recognize the subscription (up to 200 characters).

child_scope"all" | array<string>bodyoptional

Only for a workspace: also receive the events of its Accounts, all of them (all) or a list of account ids (platform.orgs.list). Empty: only the workspace's own events.

Default: []

payload_modeenumbodyoptional

snapshot: each delivery carries the record as it was at the event; thin: only its ids (read the record with the API).

Values: snapshot, thin · Default: "snapshot"

api_versionenumbodyoptional

The API version that shapes the payload (the current one by default).

Values: 2026-11-01 · Default: "2026-11-01"

headers_staticobjectbodyoptional

Fixed headers sent with every delivery (an authorization token of your receiver, for example): up to 5, names with letters, digits and dashes; the headers MB Suite sets (mb-signature, content-type…) cannot be overridden.

Response

webhookobject
secretstring

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/webhooks" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "url": "URL",
  "events": [
    "crm.lead.created"
  ]
}'

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/webhooks" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "url": "URL",
  "events": [
    "crm.lead.created"
  ]
}'
PATCH/v1/webhooks/{webhook_id}

Edit, disable or reactivate a webhook subscription

platform.webhooks.update

WriteIdempotentSince 2026-11-01

Changes the URL (re-checked against private addresses; the failure streak restarts), description, events, child scope, payload mode, static headers or status of a subscription. New events must be ones platform.webhooks.events lists for the organization (400 invalid_input otherwise). status=disabled_user pauses it (queued deliveries are cancelled); status=active reactivates it and, with resend_failed=true, re-queues what failed or was cancelled in the 72 hours before it was disabled (once per delivery; it needs the API and the MCP turned on for the organization: 403 otherwise, and nothing changes). Owners and admins only. Module: API & MCP (developer_platform), even though the id starts with platform.; the credential needs the developer_platform:write scope.

Scope
developer_platform:write
Permission
Edit in the module · Only owner, admin
MCP tool
platform_webhooks_updateOn the full surface; on the compact one, mb_execute_operation with id: "platform.webhooks.update".

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

Parameters

webhook_idstringpathrequired

The webhook subscription id (platform.webhooks.list).

updatesobjectbodyrequired

What changes: only the fields sent.

Response

webhookobject
resentnumber

Errors

Example

curl -X PATCH "https://api.mb-suite.com/v1/webhooks/{webhook_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/webhooks/{webhook_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "updates": {}
}'
DELETE/v1/webhooks/{webhook_id}

Delete a webhook subscription

platform.webhooks.delete

IrreversibleSince 2026-11-01

Deletes the subscription, its signing secret and cancels its queued deliveries. Past deliveries stay 30 days for the record. This is not a customer record, so it does not go to the trash and cannot be undone: outside the screen it requires a dry run and a confirm_token. Owners and admins only. Module: API & MCP (developer_platform), even though the id starts with platform.; the credential needs the developer_platform:write scope and permission to delete.

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
developer_platform:write and “Allow deletions” (developer_platform:delete in OAuth)
Permission
Edit in the module · Only owner, admin
MCP tool
platform_webhooks_deleteOn the full surface; on the compact one, mb_execute_operation with id: "platform.webhooks.delete".

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

Parameters

webhook_idstringpathrequired

The webhook subscription id (platform.webhooks.list).

Response

webhook_idstring

Errors

Example

curl -X DELETE "https://api.mb-suite.com/v1/webhooks/{webhook_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.

curl -X DELETE "https://api.mb-suite.com/v1/webhooks/{webhook_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "dry_run": true
}'
POST/v1/webhooks/{webhook_id}/test

Send a test event to one subscription

platform.webhooks.test

WriteSince 2026-11-01

Sends a webhook.test event to this subscription only, signed and delivered exactly like a real one (with retries), even if the subscription is disabled: it is the way to check the receiver and the signature before relying on real events or reactivating. It needs the API and the MCP turned on for the organization: otherwise 403 with the reason (platform_not_enabled, platform_requires_paid_plan…) and nothing is sent. Module: API & MCP (developer_platform), even though the id starts with platform.; the credential needs the developer_platform:write scope.

Scope
developer_platform:write
Permission
Edit in the module · Only owner, admin
MCP tool
platform_webhooks_testOn the full surface; on the compact one, mb_execute_operation with id: "platform.webhooks.test".
Events it can emit
webhook.test

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

Parameters

webhook_idstringpathrequired

The webhook subscription id (platform.webhooks.list).

messagestringbodyoptional

A text for the test event (Hello from MB Suite by default).

Response

event_idstring | null
deliveriesnumber

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/webhooks/{webhook_id}/test" \
  -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/webhooks/{webhook_id}/test" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/webhooks/{webhook_id}/rotate-secret

Rotate the signing secret of a subscription

platform.webhooks.rotate_secret

WriteSince 2026-11-01

Generates a new signing secret and returns it ONCE. For 24 hours every delivery is signed with both the new and the previous secret (two v1= values in MB-Signature), so the receiver can switch without missing events. Owners and admins only. Module: API & MCP (developer_platform), even though the id starts with platform.; the credential needs the developer_platform:write scope.

Scope
developer_platform:write
Permission
Edit in the module · Only owner, admin
MCP tool
platform_webhooks_rotate_secretOn the full surface; on the compact one, mb_execute_operation with id: "platform.webhooks.rotate_secret".

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

Parameters

webhook_idstringpathrequired

The webhook subscription id (platform.webhooks.list).

Response

secretstring
secret_prefixstring
previous_secret_expires_atnumber

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/webhooks/{webhook_id}/rotate-secret" \
  -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/webhooks/{webhook_id}/rotate-secret" \
  -H "Authorization: Bearer $MB_TEST_KEY"
GET/v1/webhooks/{webhook_id}/deliveries

List the deliveries of a subscription

platform.webhooks.deliveries.list

ReadIdempotentSince 2026-11-01

Lists the deliveries of one subscription, newest first, with status, attempt count, response code and the attempts' details (up to 12 per delivery). Filter by one status or several to see what failed or is still retrying. Deliveries are kept 30 days. Module: API & MCP (developer_platform), even though the id starts with platform.; the credential needs the developer_platform:read scope.

Scope
developer_platform:read
Permission
View the module · Only owner, admin
MCP tool
platform_webhooks_deliveries_listOn the full surface; on the compact one, mb_execute_operation with id: "platform.webhooks.deliveries.list".

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

Parameters

webhook_idstringpathrequired

The webhook subscription id (platform.webhooks.list).

statusenumqueryoptional

Only the deliveries in this status: pending, retrying, succeeded, failed, disabled (the subscription was off, or the API and the MCP stayed off for the organization for 72 hours: platform_off) or skipped_scope (outside its child scope).

Values: pending, retrying, succeeded, failed, disabled, skipped_scope

statusesarray<enum>queryoptional

Several statuses at once (pending and retrying: the ones still on their way).

Values: pending, retrying, succeeded, failed, disabled, skipped_scope

limitintegerqueryoptional

How many deliveries this page brings at most.

Default: 50

cursorstringqueryoptional

The next_cursor of the previous page, exactly as it came; without it, the first page.

Response

dataarray<object>
has_moreboolean
next_cursorstring

Errors

Example

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

Get one delivery with the request that was sent

platform.webhooks.deliveries.get

ReadIdempotentSince 2026-11-01

Returns a delivery with its attempts, the event it carried and the request as it was sent (headers and body, in the payload mode and API version fixed when the event was emitted). The signature value is not reproduced and static header values are masked. The data of connected platforms whose terms do not allow it through the API does not come: an event that carries it answers 403 platform_terms_restricted, and the rest comes without those fields (the permissions guide lists the platforms). Module: API & MCP (developer_platform), even though the id starts with platform.; the credential needs the developer_platform:read scope.

Scope
developer_platform:read
Permission
View the module · Only owner, admin
MCP tool
platform_webhooks_deliveries_getOn the full surface; on the compact one, mb_execute_operation with id: "platform.webhooks.deliveries.get".

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

Parameters

webhook_idstringpathrequired

The webhook subscription id (platform.webhooks.list).

delivery_idstringpathrequired

The delivery id (platform.webhooks.deliveries.list).

Response

deliveryobject
eventobject | null

The event it carried; null when it is no longer kept.

requestobject | null

The request as it was sent; null without its event, or when it was not sent because a platform's terms do not allow it.

Errors

Example

curl "https://api.mb-suite.com/v1/webhooks/{webhook_id}/deliveries/{delivery_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/webhooks/{webhook_id}/deliveries/{delivery_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/webhooks/{webhook_id}/deliveries/{delivery_id}/resend

Resend a delivery to its destination

platform.webhooks.deliveries.resend

WriteSince 2026-11-01

Queues a new delivery of the same event to the same subscription, right now, with the full retry schedule. The original delivery is kept and marked as resent; the new one points to it with resend_of. The subscription must be active, and the API and the MCP turned on for the organization (403 with the reason otherwise, and nothing is queued). Module: API & MCP (developer_platform), even though the id starts with platform.; the credential needs the developer_platform:write scope.

Scope
developer_platform:write
Permission
Edit in the module · Only owner, admin
MCP tool
platform_webhooks_deliveries_resendOn the full surface; on the compact one, mb_execute_operation with id: "platform.webhooks.deliveries.resend".

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

Parameters

webhook_idstringpathrequired

The webhook subscription id (platform.webhooks.list).

delivery_idstringpathrequired

The delivery id (platform.webhooks.deliveries.list).

Response

delivery_idstring

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/webhooks/{webhook_id}/deliveries/{delivery_id}/resend" \
  -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/webhooks/{webhook_id}/deliveries/{delivery_id}/resend" \
  -H "Authorization: Bearer $MB_TEST_KEY"