Menú

Referencia de la API · CRM

Empresas

crm · companies · 9 operaciones

GET/v1/crm/companies

List companies

crm.companies.list

LecturaIdempotenteDesde 2026-11-01

Lists companies most recently updated first, paginated by cursor; domain keeps only the companies with that domain (a host or a URL: https://www.acme.com/about → acme.com; one stored as www.acme.com matches too; 400 invalid_domain when no host can be read from it). Archived companies 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. 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).

Alcance
crm:read
Permiso
Ver el módulo
Tool del MCP
crm_companies_listEn la superficie completa; en la compacta, mb_execute_operation con id: "crm.companies.list".

Costo declarado: hasta 201 lecturas y 0 escrituras por llamada (cuentan en el cupo diario).

Parámetros

limitintegerqueryopcional

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

Por defecto: 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.

include_archivedbooleanqueryopcional

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

Por defecto: false

domainstringqueryopcional

Only the companies with this domain. A host or a URL works (https://www.acme.com/about → acme.com), and a company stored as www.acme.com matches too. 400 invalid_domain when no host can be read from it.

Respuesta

dataarray<object>
has_moreboolean
next_cursorstring

Errores

Ejemplo

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

Probar con tu API key de prueba

Con una API key de prueba el pedido va siempre a tu organización de práctica: datos de ejemplo que puedes reiniciar.

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

Get one company

crm.companies.get

LecturaIdempotenteDesde 2026-11-01

Returns a company with its domain, industry, size, contact data, owner, labels, custom fields and aggregates: person_count (live persons), open_deal_count, won_deal_count and total_won_value in total_won_currency (deals won in other currencies are in won_value_by_currency, never added together), kept up to date when its deals and persons change. Not found if the id does not exist or the seller's scope hides 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 fields are left out of the response (the permissions guide lists what each platform allows).

Alcance
crm:read
Permiso
Ver el módulo
Tool del MCP
crm_companies_getEn la superficie completa; en la compacta, mb_execute_operation con id: "crm.companies.get".

Costo declarado: hasta 2 lecturas y 0 escrituras por llamada (cuentan en el cupo diario).

Parámetros

company_idstringrutarequerido

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

Respuesta

idstring
org_idstring
namestring
created_atnumber
updated_atnumber
domainstring | null

The company's web host (acme.com), lowercase.

industrystring | null
sizestring | null
websitestring | null
linked_instring | null
logo_urlstring | null
origin_channelsarray<string> | null

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

countrystring | null

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

addressobject | null
phonestring | null
phonesarray<string>
emailstring | null
emailsarray<string>
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
person_countnumber | null

Live persons (not archived) linked to the company.

open_deal_countnumber | null

Open deals of the company (not archived).

won_deal_countnumber | null

Won deals of the company (not archived).

total_won_valuenumber | null

The value of its won deals in total_won_currency (deals in other currencies are in won_value_by_currency, never added together).

total_won_currencystring | null

ISO 4217 code of total_won_value: the currency of most won deals.

won_value_by_currencyobject | null

Won value per currency (ISO 4217 → amount).

is_placeholderboolean

true for a provisional company an automatic intake created with the person's name or phone: confirm it with crm.companies.update (is_placeholder false) or rename it.

is_archivedboolean
archived_atnumber | null
merged_into_idstring | null

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

created_by_idstring | null

Who created the company: 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 company, resolved when the record is read.

Errores

Ejemplo

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

Probar con tu API key de prueba

Con una API key de prueba el pedido va siempre a tu organización de práctica: datos de ejemplo que puedes reiniciar.

curl "https://api.mb-suite.com/v1/crm/companies/{company_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/crm/companies

Create a company

crm.companies.create

EscrituraDesde 2026-11-01

Creates a company with name, domain, industry, size, website, country, phones, emails, owner, labels and custom fields; created: true. The domain is stored as a bare host (https://www.Acme.com/ → acme.com); without one, it is taken from website when that is a business domain (never a free email provider, a social network or a no-website answer like notengo.com). If a company with the same name already exists (ignoring case, accents, extra spaces and punctuation: Ñandú, nandu and ÑANDÚ are the same), nothing is written: its id comes back with created: false and matched_by: name. With dedupe_by_domain: true, a company with the same domain (www. or not) is reused the same way (matched_by: domain); by default it is not, as in the app, because subsidiaries share a domain. A merged-away duplicate never comes back (the company that remains does); archived companies count. A seller with restricted scope who cannot see that company gets 409 company_exists_not_visible instead (param name, or domain/website with dedupe_by_domain): its id never comes back and nothing is written. The owner must be a member or an AI position (owner_not_member), labels must be company labels (label_not_found), custom fields must exist for companies with a value of their type (custom_field_unknown, custom_field_invalid), and outside the screen every phone must be readable (with its country code or with country: invalid_phone). Requires create_company.

Alcance
crm:write
Permiso
Editar en el módulo · Acción del CRM: create_company
Tool del MCP
crm_companies_createEn la superficie completa; en la compacta, mb_execute_operation con id: "crm.companies.create".
Eventos que puede emitir
crm.company.created

Costo declarado: hasta 77 lecturas y 1 escrituras por llamada (cuentan en el cupo diario).

Parámetros

namestringcuerporequerido

The company's name.

domainstringcuerpoopcional

Its web host (acme.com; a URL works too: it is stored as the bare host).

industrystringcuerpoopcional

Its industry, as text.

sizeenumcuerpoopcional

How many people work there.

Valores: solo, 2-10, 11-50, 51-200, 201-1000, 1000+

websitestring (uri)cuerpoopcional

Its website URL (without domain, a business website also fills domain).

linked_instring (uri)cuerpoopcional

Its LinkedIn page URL.

logo_urlstring (uri)cuerpoopcional

A URL of its logo.

countrystringcuerpoopcional

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

phonestringcuerpoopcional

The primary phone, with its country code or local with country.

phonesarray<string>cuerpoopcional

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

emailstring (email)cuerpoopcional

The primary email.

emailsarray<string>cuerpoopcional

Every email of the company.

owner_idstringcuerpoopcional

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

label_idsarray<string>cuerpoopcional

Company labels (crm.labels.list with entity company).

custom_fieldsobjectcuerpoopcional

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

dedupe_by_domainbooleancuerpoopcional

true: when no company has the same name, reuse one with the same domain (taken from domain, or from website when domain is not given; www. or not) instead of creating another. Free email providers, social networks and no-website answers like notengo.com never match. Default false, as in the app: subsidiaries share a domain.

Respuesta

company_idstring
createdboolean

true when the company is new; false when one already existed (company_id is hers and nothing was written).

matched_byenum

Why an existing company came back (only with created: false): its normalized name, or its domain with dedupeByDomain.

Valores: name, domain

Errores

Ejemplo

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

Probar con tu API key de prueba

Con una API key de prueba el pedido va siempre a tu organización de práctica: datos de ejemplo que puedes reiniciar.

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

Update a company

crm.companies.update

EscrituraDesde 2026-11-01

Updates one or more fields of a company; a renamed company propagates its name to its deals (company_name, up to 500) and activities, as in the app. It does NOT rewrite the company_name stored on its persons (the app does not either): to change it there, use crm.persons.update or crm.persons.set_primary_company. The domain is stored as a bare host (https://www.Acme.com/ → acme.com; null clears it); setting website on a company without a domain also fills its domain when website is a business one. is_placeholder: false confirms a provisional company (created by an automatic intake and named after the person or the phone); editing other fields does not confirm it, renaming it to a real name does, and the audit log records the confirmation. is_placeholder: false alone on a company that is not provisional writes nothing (no audit, no webhook, updated_at unchanged) and returns the company as it is. Requires edit_company (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 fields are left out of the response (the permissions guide lists what each platform allows).

Alcance
crm:write
Permiso
Editar en el módulo
Tool del MCP
crm_companies_updateEn la superficie completa; en la compacta, mb_execute_operation con id: "crm.companies.update".
Eventos que puede emitir
crm.company.updated

Costo declarado: hasta 2 lecturas y 502 escrituras por llamada (cuentan en el cupo diario).

Parámetros

company_idstringrutarequerido

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

updatesobjectcuerporequerido

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

Respuesta

companyobject

Errores

Ejemplo

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

Probar con tu API key de prueba

Con una API key de prueba el pedido va siempre a tu organización de práctica: datos de ejemplo que puedes reiniciar.

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

Delete a company

crm.companies.delete

IrreversibleDesde 2026-11-01

Deletes a company (its persons and deals keep their references and are not deleted; use crm.delete_cascade for that). It goes to the 30-day trash. Requires delete_company.

Con una API key, este DELETE se ejecuta directo: el registro queda 30 días en la papelera y la respuesta trae su trash_item_id. Con un token OAuth, y por el MCP, pide dry_run → confirm_token.

Alcance
crm:write y «Permitir eliminar» (crm:delete en OAuth)
Permiso
Editar en el módulo · Acción del CRM: delete_company
Tool del MCP
crm_companies_deleteEn la superficie completa; en la compacta, mb_execute_operation con id: "crm.companies.delete".
Eventos que puede emitir
crm.company.deleted

Costo declarado: hasta 1 lecturas y 2 escrituras por llamada (cuentan en el cupo diario).

Parámetros

company_idstringrutarequerido

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

Respuesta

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.

Errores

Ejemplo

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

Probar con tu API key de prueba

Con una API key de prueba el pedido va siempre a tu organización de práctica: datos de ejemplo que puedes reiniciar.

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

Archive or unarchive a company

crm.companies.archive

EscrituraIdempotenteDesde 2026-11-01

Archives (archived: true) or restores (false) a company; archived companies leave the lists but keep everything. Idempotent: changed is false when it already was that way. Returns the company as it is now. Requires edit_company. 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 fields are left out of the response (the permissions guide lists what each platform allows).

Alcance
crm:write
Permiso
Editar en el módulo
Tool del MCP
crm_companies_archiveEn la superficie completa; en la compacta, mb_execute_operation con id: "crm.companies.archive".

Costo declarado: hasta 1 lecturas y 1 escrituras por llamada (cuentan en el cupo diario).

Parámetros

company_idstringrutarequerido

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

archivedbooleancuerporequerido

true archives it; false brings it back.

Respuesta

changedboolean
companyobject

Errores

Ejemplo

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

Probar con tu API key de prueba

Con una API key de prueba el pedido va siempre a tu organización de práctica: datos de ejemplo que puedes reiniciar.

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

Delete many companies

crm.companies.bulk.delete

IrreversibleMasiva · hasta 500Desde 2026-11-01

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

Pide confirmación: primero dry_run: true (vista previa y confirm_token, que vale 10 minutos y una sola vez), después el mismo cuerpo con confirm_token. En unas pocas, solo con ciertos datos: la descripción dice cuándo. Por qué y cómo: Vista previa y confirmación.

Alcance
crm:write y «Permitir eliminar» (crm:delete en OAuth)
Permiso
Editar en el módulo · Acción del CRM: bulk_delete_companies
Tool del MCP
crm_companies_bulk_deleteEn la superficie completa; en la compacta, mb_execute_operation con id: "crm.companies.bulk.delete".
Eventos que puede emitir
crm.company.deleted

Costo declarado: hasta 500 lecturas y 1000 escrituras por llamada (cuentan en el cupo diario).

Parámetros

company_idsarray<string>cuerporequerido

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

Respuesta

deletednumber

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

Errores

Ejemplo

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

Probar con tu API key de prueba

Con una API key de prueba el pedido va siempre a tu organización de práctica: datos de ejemplo que puedes reiniciar.

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

Add or remove labels on many companies

crm.companies.bulk.update_labels

EscrituraMasiva · hasta 500Desde 2026-11-01

Adds and/or removes labels (ids from crm.labels.list with entity company) on up to 500 companies. A label that is not a company label of the organization is label_not_found (with details.unknown_ids). Companies 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 companies and names those that would change. Requires bulk_update_companies. Outside the screen it requires a dry run and a confirm_token.

Pide confirmación: primero dry_run: true (vista previa y confirm_token, que vale 10 minutos y una sola vez), después el mismo cuerpo con confirm_token. En unas pocas, solo con ciertos datos: la descripción dice cuándo. Por qué y cómo: Vista previa y confirmación.

Alcance
crm:write
Permiso
Editar en el módulo · Acción del CRM: bulk_update_companies
Tool del MCP
crm_companies_bulk_update_labelsEn la superficie completa; en la compacta, mb_execute_operation con id: "crm.companies.bulk.update_labels".

Costo declarado: hasta 540 lecturas y 500 escrituras por llamada (cuentan en el cupo diario).

Parámetros

company_idsarray<string>cuerporequerido

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

to_addarray<string>cuerpoopcional

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

to_removearray<string>cuerpoopcional

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

Respuesta

updatednumber

How many companies changed.

unchangednumber

How many companies 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).

Errores

Ejemplo

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

Probar con tu API key de prueba

Con una API key de prueba el pedido va siempre a tu organización de práctica: datos de ejemplo que puedes reiniciar.

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

Set the owner of many companies

crm.companies.bulk.update_owner

EscrituraMasiva · hasta 500Desde 2026-11-01

Sets (or clears with null) the owner of up to 500 companies: a member's user id (members.members.list) or an AI position's ai-… id (owner_not_member otherwise). Companies 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 companies and names those that would change. Requires bulk_update_companies. Outside the screen it requires a dry run and a confirm_token.

Pide confirmación: primero dry_run: true (vista previa y confirm_token, que vale 10 minutos y una sola vez), después el mismo cuerpo con confirm_token. En unas pocas, solo con ciertos datos: la descripción dice cuándo. Por qué y cómo: Vista previa y confirmación.

Alcance
crm:write
Permiso
Editar en el módulo · Acción del CRM: bulk_update_companies
Tool del MCP
crm_companies_bulk_update_ownerEn la superficie completa; en la compacta, mb_execute_operation con id: "crm.companies.bulk.update_owner".

Costo declarado: hasta 501 lecturas y 500 escrituras por llamada (cuentan en el cupo diario).

Parámetros

company_idsarray<string>cuerporequerido

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

owner_idstring | nullcuerporequerido

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

Respuesta

updatednumber

How many companies changed.

unchangednumber

How many companies 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).

Errores

Ejemplo

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

Probar con tu API key de prueba

Con una API key de prueba el pedido va siempre a tu organización de práctica: datos de ejemplo que puedes reiniciar.

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