Menu

API reference · Contacts

Email

contacts · email · 2 operations

GET/v1/contacts/email/senders

List the From addresses for Contacts emails

contacts.email.list_senders

ReadIdempotentSince 2026-11-01

Lists the From addresses this person can use with contacts.email.send: the senders of the organization's verified email domain (for agency people working in an Account, also the agency's, with ids that start with agency:). A member only gets their own address. Empty when no verified domain applies: then sending is not available (the organization has to verify its domain in Settings). Returns the senders and default_sender_id.

Scope
contacts:read
Permission
View the module
MCP tool
contacts_email_list_sendersOn the full surface; on the compact one, mb_execute_operation with id: "contacts.email.list_senders".

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

Parameters

No parameters.

Response

dataarray<object>
default_sender_idstring | null

Errors

Example

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

Send an email from Contacts

contacts.email.send

WriteSince 2026-11-01

SENDS an email (Amazon SES), like the compose window of the Contacts screen: to (1 to 20 addresses), cc (up to 20; addresses already in to are dropped), subject, html (the body; it is sanitized before sending: scripts, forms, iframes and event handlers are removed) and sender_id (one of contacts.email.list_senders; MB Suite's own address is not allowed here). The body goes inside the organization's email layout with the brand of the sender (logo, name, color). It reaches real inboxes and cannot be undone: outside the app it always runs in two steps — dry_run=true runs the same checks (sender allowed, body not empty) and says from which address, with which subject and to whom it goes, with a confirm_token (10 minutes); then call it again with the confirm_token. Confirm the recipients and the content with the person first. Returns the provider message_id, the From and the final recipients. Errors: sender_not_allowed (403), empty_body; when SES does not take it, external_rejected, external_rate_limited or external_outcome_unknown (the email may have gone out: do not send it again blindly). Requires full access to Contacts.

Instructions for agents

Tell the person the email was sent, from which address and to whom.

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
contacts:write
Permission
Edit in the module
MCP tool
contacts_email_sendOn the full surface; on the compact one, mb_execute_operation with id: "contacts.email.send".
Events it can emit
contacts.email.sent

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

Parameters

toarray<string>bodyrequired

Recipients (1 to 20 email addresses).

subjectstringbodyrequired

The subject (one line).

htmlstringbodyrequired

The body in HTML (sanitized before sending).

sender_idstringbodyrequired

A sender id from contacts.email.list_senders (never MB Suite's own address).

ccarray<string>bodyoptional

Copies (up to 20); addresses already in to are dropped.

localeenumbodyoptional

The language of the email's footer: es (default), en or pt-BR.

Values: es, en, pt-BR

Response

message_idstring | null
fromstring
toarray<string>
ccarray<string>

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/contacts/email/send" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "to": [
    "TO"
  ],
  "subject": "SUBJECT",
  "html": "HTML",
  "sender_id": "SENDER_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. In the practice organization this operation is not simulated (it reaches another platform): it answers 409 sandbox_external_unavailable.