Menu

Referência da API · CRM

Pessoas

crm · persons · 21 operações

GET/v1/crm/persons/{person_id}/messages

List the messages of all of a person's conversations

crm.persons.messages.list

LeituraIdempotenteDesde 2026-11-01

Lists the messages of every inbox conversation linked to a person (WhatsApp on any line and Instagram, Messenger or TikTok direct messages), newest first, in one call instead of one crm.messages.list per conversation, paginated by cursor (limit up to 200). Each message comes as in crm.messages.list (conversation_id, direction, content (the text), media, template, delivery status, who sent it, external_id), with attachments as links signed for one hour (media_urls_expire_at) and without the raw platform payload. Filters: since and until (epoch ms, both exclusive), channel (only the person's conversations of that channel) and direction (inbound: what the contacts wrote; outbound: what the house sent), the last one applied to the page that was read, so a page can bring fewer than limit while has_more is true (follow next_cursor). It reads the person's 30 conversations with the most recent activity: with more, conversations_truncated is true and the older conversations are left out (read them with crm.conversations.list with person_id and crm.messages.list). The same conversations crm.conversations.list shows are included: conversations on a line that belongs to another part of the product never are, and a seller with restricted scope only gets the conversations they own or those on lines they work. Not found (person_not_found) if the person does not exist or the seller cannot see them. Requires view_inbox. With TikTok, their terms limit it through the API and the MCP: what they do not allow answers 403 platform_terms_restricted, and their records are left out of the response (the permissions guide lists what each platform allows).

Escopo
crm:read
Permissão
Ver o módulo · Ação do CRM: view_inbox
Tool do MCP
crm_persons_messages_listNa superfície completa; na compacta, mb_execute_operation com id: "crm.persons.messages.list".

Custo declarado: até 260 leituras e 0 escritas por chamada (contam na cota diária).

Parâmetros

person_idstringrotaobrigatório
limitintegerqueryopcional

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

Padrão: 50

cursorstringqueryopcional

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

sinceintegerqueryopcional

Only messages created after this time (epoch ms, exclusive): to poll, the createdAt of the last message you handled.

untilintegerqueryopcional

Only messages created before this time (epoch ms, exclusive).

channelenumqueryopcional

Only the person's conversations of this channel.

Valores: whatsapp, instagram, facebook, tiktok, email

directionenumqueryopcional

Only what the contacts wrote (inbound) or what the house sent (outbound); applied to the page that was read, so a page can bring fewer than limit while has_more is true.

Valores: inbound, outbound

Resposta

dataarray<object>
has_moreboolean
next_cursorstring
conversations_truncatedboolean

Present (true) when the person has more than 30 conversations: only the messages of the 30 with the most recent activity were read.

Erros

Exemplo

curl "https://api.mb-suite.com/v1/crm/persons/{person_id}/messages" \
  -H "Authorization: Bearer $MB_API_KEY"

Testar com a sua API key de teste

Com uma API key de teste o pedido vai sempre para a sua organização de prática: dados de exemplo que você pode reiniciar.

curl "https://api.mb-suite.com/v1/crm/persons/{person_id}/messages" \
  -H "Authorization: Bearer $MB_TEST_KEY"
GET/v1/crm/persons

List persons

crm.persons.list

LeituraIdempotenteDesde 2026-11-01

Lists persons (contacts) most recently updated first, paginated by cursor; company_id keeps only the persons linked to that company. Each person carries their contactability: do_not_contact, unsubscribed_at, bounced_at, whatsapp_unreachable, and the name of their primary company as stored on their record (company_name). Archived persons are left out unless include_archived is true; merged-away duplicates never appear. A seller with restricted scope only gets their own, the free ones and those of their deals. Both filters apply to the page read, so a page can bring fewer than limit while has_more is true: follow next_cursor until has_more is false. Use crm.persons.lookup to find one by email or phone. With Google Ads, LinkedIn or TikTok, their terms limit it through the API and the MCP: what they do not allow answers 403 platform_terms_restricted, and their records or fields are left out of the response (the permissions guide lists what each platform allows).

Escopo
crm:read
Permissão
Ver o módulo
Tool do MCP
crm_persons_listNa superfície completa; na compacta, mb_execute_operation com id: "crm.persons.list".

Custo declarado: até 201 leituras e 0 escritas por chamada (contam na cota diária).

Parâmetros

limitintegerqueryopcional

How many items this page brings at most (default 20, up to 200).

Padrão: 20

cursorstringqueryopcional

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

company_idstringqueryopcional

Only the persons linked to this company (as their primary company or another one).

include_archivedbooleanqueryopcional

Include archived records (left out by default; merged-away duplicates never come).

Padrão: false

Resposta

dataarray<object>
has_moreboolean
next_cursorstring

Erros

Exemplo

curl "https://api.mb-suite.com/v1/crm/persons" \
  -H "Authorization: Bearer $MB_API_KEY"

Testar com a sua API key de teste

Com uma API key de teste o pedido vai sempre para a sua organização de prática: dados de exemplo que você pode reiniciar.

curl "https://api.mb-suite.com/v1/crm/persons" \
  -H "Authorization: Bearer $MB_TEST_KEY"
GET/v1/crm/persons/{person_id}

Get one person

crm.persons.get

LeituraIdempotenteDesde 2026-11-01

Returns a person with their emails, phones, companies (company_name: their primary company's name as stored on their record), owner, labels and custom fields, and whether they can be contacted: do_not_contact, unsubscribed_at (emails), bounced_at and whatsapp_unreachable (their number has no WhatsApp). Not found if the id does not exist or the seller's scope hides them. With Google Ads, LinkedIn or TikTok, their terms limit it through the API and the MCP: what they do not allow answers 403 platform_terms_restricted, and their records or fields are left out of the response (the permissions guide lists what each platform allows).

Escopo
crm:read
Permissão
Ver o módulo
Tool do MCP
crm_persons_getNa superfície completa; na compacta, mb_execute_operation com id: "crm.persons.get".

Custo declarado: até 2 leituras e 0 escritas por chamada (contam na cota diária).

Parâmetros

person_idstringrotaobrigatório

The person, by id (crm.persons.list, crm.persons.lookup or crm.search).

Resposta

idstring
org_idstring
first_namestring
full_namestring
created_atnumber
updated_atnumber
last_namestring | null
emailstring | null

The primary email (one of emails).

emailsarray<string>
phonestring | null

The primary phone, E.164 when it could be read (one of phones).

phonesarray<string>
job_titlestring | null
countrystring | null

ISO-2 country; local phone numbers are read with it.

websitestring | null
linked_in_urlstring | null
avatar_urlstring | null
company_idsarray<string>

Every company of the person (primary_company_id is one of them).

primary_company_idstring | null
company_namestring | null

Name of the person's primary company as stored on their record: copied when a company becomes their primary one (or written directly); renaming the company later does not update it (read the company for its current name).

owner_idstring | null

The owner: a member's user id (members.members.list), or an AI position's ai-… id.

owner_namestring | null

The name of the owner, resolved when the record is read.

label_idsarray<string>
custom_fieldsobject
do_not_contactboolean
unsubscribed_atnumber | null

When the person unsubscribed from emails (epoch ms); sequences and campaigns leave them out.

bounced_atnumber | null

When an email to the person bounced (epoch ms).

whatsapp_unreachableboolean | null

true when WhatsApp reported that their number has no WhatsApp or cannot receive messages (learned from a failed send).

whatsapp_unreachable_atnumber | null

When whatsapp_unreachable was set, epoch ms.

source_channelstring | null

Where the person came from: meta, google, whatsapp, web, manual, csv…

origin_channelsarray<string> | null

The lead channels (as in source_channel) of platforms with their own terms whose data the person carries: added when a form or a message from one of them creates or completes the person, never removed.

attributionobject | null
first_seen_atnumber | null

When the person first entered the CRM, epoch ms.

last_seen_atnumber | null

When the person last came in through an intake (a form, a message, a booking), epoch ms.

last_activity_atnumber | null

Last activity linked to the person, epoch ms.

chat_data_suggestionsarray<object> | null

Phones, emails and sites found in the person's chats and not decided yet: accept or dismiss each with crm.persons.chat_data.update.

is_archivedboolean
archived_atnumber | null
merged_into_idstring | null

Set on a duplicate absorbed by a merge: the person that kept it (lists never return these).

created_by_idstring | null

Who created the person: a member's user id (members.members.list), or an AI position's ai-… id.

created_by_namestring | null

The name of who created the person, resolved when the record is read.

Erros

Exemplo

curl "https://api.mb-suite.com/v1/crm/persons/{person_id}" \
  -H "Authorization: Bearer $MB_API_KEY"

Testar com a sua API key de teste

Com uma API key de teste o pedido vai sempre para a sua organização de prática: dados de exemplo que você pode reiniciar.

curl "https://api.mb-suite.com/v1/crm/persons/{person_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY"
GET/v1/crm/persons/{person_id}/context

Get a person with their company and deals

crm.persons.context

LeituraIdempotenteDesde 2026-11-01

Returns the person, their primary company and their deals in one call: what you need to talk about them. deals are the deals where the person is linked or is the main contact (up to 50 of each), open, won and lost, not archived, open first and then the most recently moved. Not found if the person does not exist or is out of scope. With Google Ads, LinkedIn or TikTok, their terms limit it through the API and the MCP: what they do not allow answers 403 platform_terms_restricted, and their records or fields are left out of the response (the permissions guide lists what each platform allows).

Escopo
crm:read
Permissão
Ver o módulo
Tool do MCP
crm_persons_contextNa superfície completa; na compacta, mb_execute_operation com id: "crm.persons.context".

Custo declarado: até 23 leituras e 0 escritas por chamada (contam na cota diária).

Parâmetros

person_idstringrotaobrigatório

The person, by id (crm.persons.list, crm.persons.lookup or crm.search).

Resposta

personobject | null
companyobject | null
dealsarray<object>

Erros

Exemplo

curl "https://api.mb-suite.com/v1/crm/persons/{person_id}/context" \
  -H "Authorization: Bearer $MB_API_KEY"

Testar com a sua API key de teste

Com uma API key de teste o pedido vai sempre para a sua organização de prática: dados de exemplo que você pode reiniciar.

curl "https://api.mb-suite.com/v1/crm/persons/{person_id}/context" \
  -H "Authorization: Bearer $MB_TEST_KEY"
GET/v1/crm/persons/lookup

Find a person by email or phone (or many phones)

crm.persons.lookup

LeituraIdempotenteDesde 2026-11-01

Finds the person that has the given email (any of their emails) or phone (normalized to E.164): person is the first one that is not a merged-away duplicate, by email first and then by phone, or null when there is no match or the seller's scope hides them. matches lists every record that has that email or that phone, not just one: the merged-away duplicates too (merged: true and merged_into_id, the record that remains), archived ones, and for the phone also the records that store it in another of its forms (the Argentine 9, the Mexican 1), each with matched_by (email, phone); up to 25 per value, only those the caller can see. phones (up to 30; by REST ?phones=a,b) looks up many numbers in one call: by_phone has one entry per number, in the order asked, with the number as asked, its E.164 form (normalized: null when it cannot be read as a phone with a country code, and then it is not looked up), person_id (the same rule as person) and its matches; person and matches stay those of email and phone. Use it before creating a person to avoid duplicates, and to find sibling records of a number before writing to it. With Google Ads, LinkedIn or TikTok, their terms limit it through the API and the MCP: what they do not allow answers 403 platform_terms_restricted, and their records or fields are left out of the response (the permissions guide lists what each platform allows).

Escopo
crm:read
Permissão
Ver o módulo
Tool do MCP
crm_persons_lookupNa superfície completa; na compacta, mb_execute_operation com id: "crm.persons.lookup".

Custo declarado: até 802 leituras e 0 escritas por chamada (contam na cota diária).

Parâmetros

emailstring (email)queryopcional

An email to look for (any of a person's emails, case does not matter).

phonestringqueryopcional

A phone to look for, with its country code or local with country.

phonesarray<string>queryopcional

Up to 30 phones looked up in one call (by REST: ?phones=a,b or the key repeated). Each one gets its own entry in byPhone, in the order asked; person and matches stay those of email and phone.

countrystringqueryopcional

ISO-2 country (AR, MX…) to read phones written without their country code (011 4000-0002 with AR is +541140000002). Without it, only phones with their country code (+54 11 4000-0002, 0054…) are looked up.

Resposta

personobject | null
matchesarray<object>
by_phonearray<object>

Erros

Exemplo

curl "https://api.mb-suite.com/v1/crm/persons/lookup" \
  -H "Authorization: Bearer $MB_API_KEY"

Testar com a sua API key de teste

Com uma API key de teste o pedido vai sempre para a sua organização de prática: dados de exemplo que você pode reiniciar.

curl "https://api.mb-suite.com/v1/crm/persons/lookup" \
  -H "Authorization: Bearer $MB_TEST_KEY"
GET/v1/crm/persons/similar

Find prior deals and prospects that look like this contact

crm.persons.similar

LeituraIdempotenteDesde 2026-11-01

Given a person and/or company (or a prospect, looked up by its person and company), returns the prior deals and prospects that look related: same person, a duplicate person with the same email or phone, the same company or another company on the same web domain. strong matches first. Use it before creating a deal or prospect to avoid working a contact twice.

Escopo
crm:read
Permissão
Ver o módulo
Tool do MCP
crm_persons_similarNa superfície completa; na compacta, mb_execute_operation com id: "crm.persons.similar".

Custo declarado: até 40 leituras e 0 escritas por chamada (contam na cota diária).

Parâmetros

person_idstringqueryopcional

The person, by id (crm.persons.list, crm.persons.lookup or crm.search).

company_idstringqueryopcional

The company, by id (crm.companies.list or crm.search).

prospect_idstringqueryopcional

A prospect: looked up by its person and company.

Resposta

dealsarray<object>
prospectsarray<object>

Erros

Exemplo

curl "https://api.mb-suite.com/v1/crm/persons/similar" \
  -H "Authorization: Bearer $MB_API_KEY"

Testar com a sua API key de teste

Com uma API key de teste o pedido vai sempre para a sua organização de prática: dados de exemplo que você pode reiniciar.

curl "https://api.mb-suite.com/v1/crm/persons/similar" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/crm/persons

Create a person

crm.persons.create

EscritaDesde 2026-11-01

Creates a person (contact) with name, emails, phones, job title, links, country, an optional company (becomes their primary company), owner, labels and custom fields; created: true. If a person already has the primary email (any of their emails), nothing is written: their id comes back with created: false and matched_by: email (a merged-away duplicate never comes back, the record that remains does; archived persons count). A seller with restricted scope who cannot see that person gets 409 person_exists_not_visible instead: their id never comes back and nothing is written. It does not deduplicate by phone: use crm.persons.lookup first. company_name is only the text shown on the record: it does not link a company (use company_id, from crm.companies.list or crm.companies.create, for that). Labels must be person labels (crm.labels.list with entity person: label_not_found otherwise), custom fields must exist for persons with a value of their type (custom_field_unknown, custom_field_invalid), the owner must be a member or an AI position (owner_not_member), and outside the screen every phone must be readable (with its country code or with country: invalid_phone otherwise). A new person fires the person_created sequence trigger, unless skip_automations is true (the audit log says what was skipped); the crm.person.created webhook fires either way. Requires create_person.

Escopo
crm:write
Permissão
Editar no módulo · Ação do CRM: create_person
Tool do MCP
crm_persons_createNa superfície completa; na compacta, mb_execute_operation com id: "crm.persons.create".
Eventos que pode emitir
crm.person.created

Custo declarado: até 7 leituras e 1 escritas por chamada (contam na cota diária).

Parâmetros

first_namestringcorpoobrigatório

First name, as written.

last_namestringcorpoopcional

Last name.

emailstring (email)corpoopcional

The primary email (it is also added to emails).

emailsarray<string>corpoopcional

Every email of the person (the primary one included).

phonestringcorpoopcional

The primary phone, with its country code (+54 11 4000-0002) or local with country; it is also added to phones.

phonesarray<string>corpoopcional

Every phone of the person, each with its country code or local with country (outside the screen, one that cannot be read is invalid_phone).

job_titlestringcorpoopcional

Their job title.

linked_in_urlstring (uri)corpoopcional

Their LinkedIn profile URL.

websitestring (uri)corpoopcional

Their personal website URL.

countrystringcorpoopcional

ISO-2 country (AR, MX…): local phone numbers are read with it.

company_idstringcorpoopcional

The company (crm.companies.list or crm.companies.create): it becomes their primary company.

company_namestringcorpoopcional

Only the text shown as their company: it does not link a company (use company_id).

owner_idstringcorpoopcional

The owner: a member's user id or an AI position's ai-… id.

label_idsarray<string>corpoopcional

Person labels (crm.labels.list with entity person).

custom_fieldsobjectcorpoopcional

Custom fields: slug (crm.custom_fields.list with entity person) → value of the field's type.

skip_automationsbooleancorpoopcional

true: the new person does not enter the sequences that start when a contact is created (the person_created trigger). Recorded in the audit log (skip_automations, automationsSkipped). The crm.person.created webhook still fires, and deduplication by email works as always.

Resposta

person_idstring
createdboolean

true when the person is new; false when one with that email already existed (person_id is hers and nothing was written).

matched_byenum

Why an existing person came back (only with created: false).

Valores: email

Erros

Exemplo

curl -X POST "https://api.mb-suite.com/v1/crm/persons" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "first_name": "FIRST_NAME"
}'

Testar com a sua API key de teste

Com uma API key de teste o pedido vai sempre para a sua organização de prática: dados de exemplo que você pode reiniciar.

curl -X POST "https://api.mb-suite.com/v1/crm/persons" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "first_name": "FIRST_NAME"
}'
POST/v1/crm/persons/{person_id}/do-not-contact

Mark one person as do-not-contact (or clear it)

crm.persons.set_do_not_contact

EscritaIdempotenteDesde 2026-11-01

Sets do_not_contact on a person: send value or do_not_contact (the same flag, by the name it has on the person) with true to mark them, or with false to clear it and let them be contacted again. MB Suite stops starting the contact with a person marked «Do not contact»: sequences leave them out, the AI Setter does not write first (it still answers what they write), the voice agent does not call them, and a manual email, a WhatsApp template or an SMS to them is refused (409 do_not_contact) unless a person of the team confirms it on a closed basis (about their account, a charge or support, or because they asked us to write); a WhatsApp marketing template never goes to them. A reply to what they wrote after being marked still goes out, and so does WhatsApp free text (Meta only delivers it within 24 hours of their message). reason (optional, up to 500 characters) says why and is kept in the audit log of the change (the record has no field for it). Idempotent: if nothing changes, nothing is logged (changed: false). Requires edit_person.

Escopo
crm:write
Permissão
Editar no módulo
Tool do MCP
crm_persons_set_do_not_contactNa superfície completa; na compacta, mb_execute_operation com id: "crm.persons.set_do_not_contact".

Custo declarado: até 1 leituras e 1 escritas por chamada (contam na cota diária).

Parâmetros

person_idstringrotaobrigatório

The person, by id (crm.persons.list, crm.persons.lookup or crm.search).

valuebooleancorpoopcional

true marks the person as do-not-contact; false clears it. Same as do_not_contact.

do_not_contactbooleancorpoopcional

The same flag with the name it has on the person (do_not_contact): send this or value.

reasonstringcorpoopcional

Why (the lead asked not to be called, a wrong number…). It is kept in the audit log of the change; the person's record has no field for it.

Resposta

changedboolean

false when the person already was that way: nothing was written.

do_not_contactboolean

The value the person has now.

Erros

Exemplo

curl -X POST "https://api.mb-suite.com/v1/crm/persons/{person_id}/do-not-contact" \
  -H "Authorization: Bearer $MB_API_KEY"

Testar com a sua API key de teste

Com uma API key de teste o pedido vai sempre para a sua organização de prática: dados de exemplo que você pode reiniciar.

curl -X POST "https://api.mb-suite.com/v1/crm/persons/{person_id}/do-not-contact" \
  -H "Authorization: Bearer $MB_TEST_KEY"
PATCH/v1/crm/persons/{person_id}

Update a person

crm.persons.update

EscritaDesde 2026-11-01

Updates one or more fields of a person: names, emails (the full list replaces; a single email is added), phones, job title, links, country, companies and primary company, owner, labels, custom fields, do-not-contact. A renamed person propagates their name to their deals and activities. Labels, custom fields, owner and phones are checked as in crm.persons.create. Returns the person as saved. Requires edit_person (a seller edits their own, the free ones and those of their deals). With Google Ads, LinkedIn or TikTok, their terms limit it through the API and the MCP: what they do not allow answers 403 platform_terms_restricted, and their records or fields are left out of the response (the permissions guide lists what each platform allows).

Escopo
crm:write
Permissão
Editar no módulo
Tool do MCP
crm_persons_updateNa superfície completa; na compacta, mb_execute_operation com id: "crm.persons.update".
Eventos que pode emitir
crm.person.updated

Custo declarado: até 2 leituras e 502 escritas por chamada (contam na cota diária).

Parâmetros

person_idstringrotaobrigatório

The person, by id (crm.persons.list, crm.persons.lookup or crm.search).

updatesobjectcorpoobrigatório

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

Resposta

personobject

Erros

Exemplo

curl -X PATCH "https://api.mb-suite.com/v1/crm/persons/{person_id}" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "updates": {}
}'

Testar com a sua API key de teste

Com uma API key de teste o pedido vai sempre para a sua organização de prática: dados de exemplo que você pode reiniciar.

curl -X PATCH "https://api.mb-suite.com/v1/crm/persons/{person_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "updates": {}
}'
DELETE/v1/crm/persons/{person_id}

Delete a person

crm.persons.delete

IrreversívelDesde 2026-11-01

Deletes a person. They go to the 30-day trash (restoring re-links them to the deals and lists they were removed from); their deals lose the link (the next person becomes primary) and their activities and conversations are kept. Prefer crm.persons.archive to just hide them. Requires delete_person.

Com uma API key, este DELETE roda direto: o registro fica 30 dias na lixeira e a resposta traz o seu trash_item_id. Com um token OAuth, e pelo MCP, pede dry_run → confirm_token.

Escopo
crm:write e «Permitir exclusões» (crm:delete no OAuth)
Permissão
Editar no módulo · Ação do CRM: delete_person
Tool do MCP
crm_persons_deleteNa superfície completa; na compacta, mb_execute_operation com id: "crm.persons.delete".
Eventos que pode emitir
crm.person.deleted

Custo declarado: até 10 leituras e 10 escritas por chamada (contam na cota diária).

Parâmetros

person_idstringrotaobrigatório

The person, by id (crm.persons.list, crm.persons.lookup or crm.search).

Resposta

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.

Erros

Exemplo

curl -X DELETE "https://api.mb-suite.com/v1/crm/persons/{person_id}" \
  -H "Authorization: Bearer $MB_API_KEY"

Testar com a sua API key de teste

Com uma API key de teste o pedido vai sempre para a sua organização de prática: dados de exemplo que você pode reiniciar.

curl -X DELETE "https://api.mb-suite.com/v1/crm/persons/{person_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/crm/persons/{person_id}/archive

Archive or unarchive a person

crm.persons.archive

EscritaIdempotenteDesde 2026-11-01

Archives (archived: true) or restores (false) a person; archived persons leave the lists but keep everything. Idempotent: changed is false when they already were that way. Returns the person as they are now. Requires edit_person. With Google Ads, LinkedIn or TikTok, their terms limit it through the API and the MCP: what they do not allow answers 403 platform_terms_restricted, and their records or fields are left out of the response (the permissions guide lists what each platform allows).

Escopo
crm:write
Permissão
Editar no módulo
Tool do MCP
crm_persons_archiveNa superfície completa; na compacta, mb_execute_operation com id: "crm.persons.archive".

Custo declarado: até 1 leituras e 1 escritas por chamada (contam na cota diária).

Parâmetros

person_idstringrotaobrigatório

The person, by id (crm.persons.list, crm.persons.lookup or crm.search).

archivedbooleancorpoobrigatório

true archives them; false brings them back.

Resposta

changedboolean
personobject

Erros

Exemplo

curl -X POST "https://api.mb-suite.com/v1/crm/persons/{person_id}/archive" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "archived": true
}'

Testar com a sua API key de teste

Com uma API key de teste o pedido vai sempre para a sua organização de prática: dados de exemplo que você pode reiniciar.

curl -X POST "https://api.mb-suite.com/v1/crm/persons/{person_id}/archive" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "archived": true
}'
POST/v1/crm/persons/{person_id}/companies

Link a person to a company

crm.persons.companies.add

EscritaIdempotenteDesde 2026-11-01

Adds a company to the person's companies; if they had none it becomes their primary company. Already linked: nothing is written (changed: false). Requires edit_person.

Escopo
crm:write
Permissão
Editar no módulo
Tool do MCP
crm_persons_companies_addNa superfície completa; na compacta, mb_execute_operation com id: "crm.persons.companies.add".

Custo declarado: até 2 leituras e 1 escritas por chamada (contam na cota diária).

Parâmetros

person_idstringrotaobrigatório

The person, by id (crm.persons.list, crm.persons.lookup or crm.search).

company_idstringcorpoobrigatório

The company, by id (crm.companies.list or crm.search).

Resposta

oktrue
changedboolean

false when the link was already that way: nothing was written.

Erros

Exemplo

curl -X POST "https://api.mb-suite.com/v1/crm/persons/{person_id}/companies" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "company_id": "COMPANY_ID"
}'

Testar com a sua API key de teste

Com uma API key de teste o pedido vai sempre para a sua organização de prática: dados de exemplo que você pode reiniciar.

curl -X POST "https://api.mb-suite.com/v1/crm/persons/{person_id}/companies" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "company_id": "COMPANY_ID"
}'
POST/v1/crm/persons/{person_id}/companies/remove

Unlink a person from a company

crm.persons.companies.remove

EscritaIdempotenteDesde 2026-11-01

Removes a company from the person's companies; if it was their primary company, the next one takes over. Not linked: nothing is written (changed: false). Requires edit_person.

Escopo
crm:write
Permissão
Editar no módulo
Tool do MCP
crm_persons_companies_removeNa superfície completa; na compacta, mb_execute_operation com id: "crm.persons.companies.remove".

Custo declarado: até 2 leituras e 1 escritas por chamada (contam na cota diária).

Parâmetros

person_idstringrotaobrigatório

The person, by id (crm.persons.list, crm.persons.lookup or crm.search).

company_idstringcorpoobrigatório

The company, by id (crm.companies.list or crm.search).

Resposta

oktrue
changedboolean

false when the link was already that way: nothing was written.

Erros

Exemplo

curl -X POST "https://api.mb-suite.com/v1/crm/persons/{person_id}/companies/remove" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "company_id": "COMPANY_ID"
}'

Testar com a sua API key de teste

Com uma API key de teste o pedido vai sempre para a sua organização de prática: dados de exemplo que você pode reiniciar.

curl -X POST "https://api.mb-suite.com/v1/crm/persons/{person_id}/companies/remove" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "company_id": "COMPANY_ID"
}'
POST/v1/crm/persons/{person_id}/companies/primary

Set the primary company of a person

crm.persons.set_primary_company

EscritaIdempotenteDesde 2026-11-01

Makes a company the person's primary one (adding it to their companies if needed); their denormalized company name follows. Already the primary one: nothing is written (changed: false). Requires edit_person.

Escopo
crm:write
Permissão
Editar no módulo
Tool do MCP
crm_persons_set_primary_companyNa superfície completa; na compacta, mb_execute_operation com id: "crm.persons.set_primary_company".

Custo declarado: até 2 leituras e 1 escritas por chamada (contam na cota diária).

Parâmetros

person_idstringrotaobrigatório

The person, by id (crm.persons.list, crm.persons.lookup or crm.search).

company_idstringcorpoobrigatório

The company, by id (crm.companies.list or crm.search).

Resposta

oktrue
changedboolean

false when the link was already that way: nothing was written.

Erros

Exemplo

curl -X POST "https://api.mb-suite.com/v1/crm/persons/{person_id}/companies/primary" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "company_id": "COMPANY_ID"
}'

Testar com a sua API key de teste

Com uma API key de teste o pedido vai sempre para a sua organização de prática: dados de exemplo que você pode reiniciar.

curl -X POST "https://api.mb-suite.com/v1/crm/persons/{person_id}/companies/primary" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "company_id": "COMPANY_ID"
}'
PATCH/v1/crm/persons/{person_id}/chat-data

Accept or dismiss a chat-data suggestion

crm.persons.chat_data.update

EscritaDesde 2026-11-01

Resolves one suggestion that the person wrote in a chat (a phone, an email, a website): accept writes it to their record (a phone may need a country), dismiss hides it. The key and message_id come from the person's chat_data_suggestions. Requires edit_person.

Escopo
crm:write
Permissão
Editar no módulo
Tool do MCP
crm_persons_chat_data_updateNa superfície completa; na compacta, mb_execute_operation com id: "crm.persons.chat_data.update".

Custo declarado: até 2 leituras e 1 escritas por chamada (contam na cota diária).

Parâmetros

person_idstringrotaobrigatório

The person, by id (crm.persons.list).

keystringcorpoobrigatório

The suggestion's key, from the person's chatDataSuggestions.

message_idstringcorpoobrigatório

The message the suggestion was found in, from chatDataSuggestions.

decisionenumcorpoobrigatório

accept writes it to the person; dismiss hides it.

Valores: accept, dismiss

countrystringcorpoopcional

For a phone without its country code: the ISO-2 country to read it with.

Resposta

oktrue
kindstring
channelstring

Erros

Exemplo

curl -X PATCH "https://api.mb-suite.com/v1/crm/persons/{person_id}/chat-data" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "key": "KEY",
  "message_id": "MESSAGE_ID",
  "decision": "accept"
}'

Testar com a sua API key de teste

Com uma API key de teste o pedido vai sempre para a sua organização de prática: dados de exemplo que você pode reiniciar.

curl -X PATCH "https://api.mb-suite.com/v1/crm/persons/{person_id}/chat-data" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "key": "KEY",
  "message_id": "MESSAGE_ID",
  "decision": "accept"
}'
POST/v1/crm/persons/bulk/delete

Delete many persons

crm.persons.bulk.delete

IrreversívelEm massa · até 500Desde 2026-11-01

Deletes up to 500 persons; each goes to the 30-day trash (restorable one by one) and leaves their deals and lists. deleted counts the persons that existed; the other ids come back in not_found. Requires bulk_delete_persons (Manager-tier). Outside the screen it requires a dry run and a confirm_token.

Pede confirmação: primeiro dry_run: true (prévia e confirm_token, válido por 10 minutos e por uma única execução), depois o mesmo corpo com confirm_token. Em algumas poucas, só com certos dados: a descrição diz quando. Por que e como: Prévia e confirmação.

Escopo
crm:write e «Permitir exclusões» (crm:delete no OAuth)
Permissão
Editar no módulo · Ação do CRM: bulk_delete_persons
Tool do MCP
crm_persons_bulk_deleteNa superfície completa; na compacta, mb_execute_operation com id: "crm.persons.bulk.delete".
Eventos que pode emitir
crm.person.deleted

Custo declarado: até 2000 leituras e 1000 escritas por chamada (contam na cota diária).

Parâmetros

person_idsarray<string>corpoobrigatório

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

Resposta

deletednumber

How many persons 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.

countnumber

Same as deleted (kept for older clients).

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.

Erros

Exemplo

curl -X POST "https://api.mb-suite.com/v1/crm/persons/bulk/delete" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "person_ids": [
    "PERSON_ID"
  ],
  "dry_run": true
}'

Testar com a sua API key de teste

Com uma API key de teste o pedido vai sempre para a sua organização de prática: dados de exemplo que você pode reiniciar.

curl -X POST "https://api.mb-suite.com/v1/crm/persons/bulk/delete" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "person_ids": [
    "PERSON_ID"
  ],
  "dry_run": true
}'
POST/v1/crm/persons/bulk/labels

Add or remove labels on many persons

crm.persons.bulk.update_labels

EscritaEm massa · até 500Desde 2026-11-01

Adds and/or removes labels (ids from crm.labels.list with entity person) on up to 500 persons; fires the label_added sequence trigger for the labels that are really new. A label that is not a person label of the organization is label_not_found (with details.unknown_ids). Persons that already have exactly those labels are left as they are (unchanged) and ids that do not exist are skipped (not_found). The dry run reads the same persons and names those that would change. Requires bulk_update_persons. Outside the screen it requires a dry run and a confirm_token.

Pede confirmação: primeiro dry_run: true (prévia e confirm_token, válido por 10 minutos e por uma única execução), depois o mesmo corpo com confirm_token. Em algumas poucas, só com certos dados: a descrição diz quando. Por que e como: Prévia e confirmação.

Escopo
crm:write
Permissão
Editar no módulo · Ação do CRM: bulk_update_persons
Tool do MCP
crm_persons_bulk_update_labelsNa superfície completa; na compacta, mb_execute_operation com id: "crm.persons.bulk.update_labels".

Custo declarado: até 540 leituras e 500 escritas por chamada (contam na cota diária).

Parâmetros

person_idsarray<string>corpoobrigatório

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

to_addarray<string>corpoopcional

Label ids to add (crm.labels.list with entity person), up to 20; send to_add, to_remove or both.

to_removearray<string>corpoopcional

Label ids to remove (crm.labels.list with entity person), up to 20; send to_add, to_remove or both.

Resposta

updatednumber

How many persons changed.

unchangednumber

How many persons already were that way: not written.

not_foundarray<string>

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

countnumber

Same as updated (kept for older clients).

Erros

Exemplo

curl -X POST "https://api.mb-suite.com/v1/crm/persons/bulk/labels" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "person_ids": [
    "PERSON_ID"
  ],
  "dry_run": true
}'

Testar com a sua API key de teste

Com uma API key de teste o pedido vai sempre para a sua organização de prática: dados de exemplo que você pode reiniciar.

curl -X POST "https://api.mb-suite.com/v1/crm/persons/bulk/labels" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "person_ids": [
    "PERSON_ID"
  ],
  "dry_run": true
}'
POST/v1/crm/persons/bulk/owner

Set the owner of many persons

crm.persons.bulk.update_owner

EscritaEm massa · até 500Desde 2026-11-01

Sets (or clears with null) the owner of up to 500 persons: a member's user id (members.members.list) or an AI position's ai-… id (owner_not_member otherwise). Persons that already have that owner are left as they are (unchanged) and ids that do not exist are skipped (not_found). The dry run reads the same persons and names those that would change. Requires bulk_update_persons. Outside the screen it requires a dry run and a confirm_token.

Pede confirmação: primeiro dry_run: true (prévia e confirm_token, válido por 10 minutos e por uma única execução), depois o mesmo corpo com confirm_token. Em algumas poucas, só com certos dados: a descrição diz quando. Por que e como: Prévia e confirmação.

Escopo
crm:write
Permissão
Editar no módulo · Ação do CRM: bulk_update_persons
Tool do MCP
crm_persons_bulk_update_ownerNa superfície completa; na compacta, mb_execute_operation com id: "crm.persons.bulk.update_owner".

Custo declarado: até 501 leituras e 500 escritas por chamada (contam na cota diária).

Parâmetros

person_idsarray<string>corpoobrigatório

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

owner_idstring | nullcorpoobrigatório

The new owner (a member's user id or an AI position's ai-… id); null leaves them without one.

Resposta

updatednumber

How many persons changed.

unchangednumber

How many persons already were that way: not written.

not_foundarray<string>

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

countnumber

Same as updated (kept for older clients).

Erros

Exemplo

curl -X POST "https://api.mb-suite.com/v1/crm/persons/bulk/owner" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "person_ids": [
    "PERSON_ID"
  ],
  "owner_id": "OWNER_ID",
  "dry_run": true
}'

Testar com a sua API key de teste

Com uma API key de teste o pedido vai sempre para a sua organização de prática: dados de exemplo que você pode reiniciar.

curl -X POST "https://api.mb-suite.com/v1/crm/persons/bulk/owner" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "person_ids": [
    "PERSON_ID"
  ],
  "owner_id": "OWNER_ID",
  "dry_run": true
}'
POST/v1/crm/persons/bulk/company

Set the primary company of many persons

crm.persons.bulk.update_company

EscritaEm massa · até 500Desde 2026-11-01

Makes a company the primary one of up to 500 persons (adding it to their companies), or clears the primary company with null without removing any. Persons that already have that primary company are left as they are (unchanged) and ids that do not exist are skipped (not_found). The dry run reads the same persons and names those that would change. Requires bulk_update_persons. Outside the screen it requires a dry run and a confirm_token.

Pede confirmação: primeiro dry_run: true (prévia e confirm_token, válido por 10 minutos e por uma única execução), depois o mesmo corpo com confirm_token. Em algumas poucas, só com certos dados: a descrição diz quando. Por que e como: Prévia e confirmação.

Escopo
crm:write
Permissão
Editar no módulo · Ação do CRM: bulk_update_persons
Tool do MCP
crm_persons_bulk_update_companyNa superfície completa; na compacta, mb_execute_operation com id: "crm.persons.bulk.update_company".

Custo declarado: até 501 leituras e 500 escritas por chamada (contam na cota diária).

Parâmetros

person_idsarray<string>corpoobrigatório

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

company_idstring | nullcorpoobrigatório

The company that becomes their primary one (crm.companies.list); null clears the primary company without removing any.

company_namestring | nullcorpoopcional

The company's name as shown on their records (by default, the company's).

Resposta

updatednumber

How many persons changed.

unchangednumber

How many persons already were that way: not written.

not_foundarray<string>

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

countnumber

Same as updated (kept for older clients).

Erros

Exemplo

curl -X POST "https://api.mb-suite.com/v1/crm/persons/bulk/company" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "person_ids": [
    "PERSON_ID"
  ],
  "company_id": "COMPANY_ID",
  "dry_run": true
}'

Testar com a sua API key de teste

Com uma API key de teste o pedido vai sempre para a sua organização de prática: dados de exemplo que você pode reiniciar.

curl -X POST "https://api.mb-suite.com/v1/crm/persons/bulk/company" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "person_ids": [
    "PERSON_ID"
  ],
  "company_id": "COMPANY_ID",
  "dry_run": true
}'
POST/v1/crm/persons/bulk/do-not-contact

Mark many persons as do-not-contact (or clear it)

crm.persons.bulk.set_do_not_contact

EscritaEm massa · até 500Desde 2026-11-01

Sets do_not_contact on up to 500 persons (send value or do_not_contact, true or false), as crm.persons.set_do_not_contact does on one. MB Suite stops starting the contact with a person marked «Do not contact»: sequences leave them out, the AI Setter does not write first (it still answers what they write), the voice agent does not call them, and a manual email, a WhatsApp template or an SMS to them is refused (409 do_not_contact) unless a person of the team confirms it on a closed basis (about their account, a charge or support, or because they asked us to write); a WhatsApp marketing template never goes to them. A reply to what they wrote after being marked still goes out, and so does WhatsApp free text (Meta only delivers it within 24 hours of their message). Persons that already are that way are left as they are (unchanged) and ids that do not exist are skipped (not_found). The dry run reads the same persons and names those that would change. Requires bulk_update_persons. Outside the screen it requires a dry run and a confirm_token.

Pede confirmação: primeiro dry_run: true (prévia e confirm_token, válido por 10 minutos e por uma única execução), depois o mesmo corpo com confirm_token. Em algumas poucas, só com certos dados: a descrição diz quando. Por que e como: Prévia e confirmação.

Escopo
crm:write
Permissão
Editar no módulo · Ação do CRM: bulk_update_persons
Tool do MCP
crm_persons_bulk_set_do_not_contactNa superfície completa; na compacta, mb_execute_operation com id: "crm.persons.bulk.set_do_not_contact".

Custo declarado: até 500 leituras e 500 escritas por chamada (contam na cota diária).

Parâmetros

person_idsarray<string>corpoobrigatório

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

valuebooleancorpoopcional

true marks the persons as do-not-contact; false clears it. Same as do_not_contact.

do_not_contactbooleancorpoopcional

The same flag with the name it has on the person (do_not_contact): send this or value.

Resposta

updatednumber

How many persons changed.

unchangednumber

How many persons already were that way: not written.

not_foundarray<string>

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

countnumber

Same as updated (kept for older clients).

Erros

Exemplo

curl -X POST "https://api.mb-suite.com/v1/crm/persons/bulk/do-not-contact" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "person_ids": [
    "PERSON_ID"
  ],
  "dry_run": true
}'

Testar com a sua API key de teste

Com uma API key de teste o pedido vai sempre para a sua organização de prática: dados de exemplo que você pode reiniciar.

curl -X POST "https://api.mb-suite.com/v1/crm/persons/bulk/do-not-contact" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "person_ids": [
    "PERSON_ID"
  ],
  "dry_run": true
}'
GET/v1/crm/persons/{person_id}/enrollments

List the sequence enrollments of a person

crm.persons.enrollments.list

LeituraIdempotenteDesde 2026-11-01

Lists the sequence enrollments of one person across every sequence, newest first, paginated by cursor (limit up to 200), with the same fields as crm.sequences.enrollments.list (sequence_id, status, current step, pause and exit reasons, counters, last_history). Use it to know which sequences are writing to a contact before enrolling them in another one. Not found (person_not_found) if the person does not exist or a seller with restricted scope cannot see them. Requires view access to the CRM.

Escopo
crm:read
Permissão
Ver o módulo
Tool do MCP
crm_persons_enrollments_listNa superfície completa; na compacta, mb_execute_operation com id: "crm.persons.enrollments.list".

Custo declarado: até 203 leituras e 0 escritas por chamada (contam na cota diária).

Parâmetros

person_idstringrotaobrigatório

The person: an id from crm.persons.list.

limitintegerqueryopcional

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

Padrão: 50

cursorstringqueryopcional

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

Resposta

dataarray<object>
has_moreboolean
next_cursorstring

Erros

Exemplo

curl "https://api.mb-suite.com/v1/crm/persons/{person_id}/enrollments" \
  -H "Authorization: Bearer $MB_API_KEY"

Testar com a sua API key de teste

Com uma API key de teste o pedido vai sempre para a sua organização de prática: dados de exemplo que você pode reiniciar.

curl "https://api.mb-suite.com/v1/crm/persons/{person_id}/enrollments" \
  -H "Authorization: Bearer $MB_TEST_KEY"