Menu

API reference · CRM

Custom fields

crm · custom_fields · 4 operations

GET/v1/crm/custom-fields

List custom field definitions

crm.custom_fields.list

ReadIdempotentSince 2026-11-01

Lists the custom fields defined in the org (name, slug, type, options, required, group, visibility), optionally for one entity: deal, person, company, prospect or product. The slug is the key used in each record's custom_fields.

Scope
crm:read
Permission
View the module
MCP tool
crm_custom_fields_listOn the full surface; on the compact one, mb_execute_operation with id: "crm.custom_fields.list".

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

Parameters

entityenumqueryoptional

Only the fields of this kind of record; without it, all of them.

Values: deal, person, company, prospect, product

Response

dataarray<object>

Errors

Example

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

Create a custom field

crm.custom_fields.create

WriteSince 2026-11-01

Defines a custom field for an entity with a type (text, number, currency, date, select, multiselect, url, email, phone, checkbox, user, rating, progress, files…), options for selects, required flag, help text, group and visibility. The slug (lowercase, digits, underscore) is derived from the name unless given and must be unique per entity. Requires manage_custom_fields.

Scope
crm:write
Permission
Edit in the module · CRM action: manage_custom_fields
MCP tool
crm_custom_fields_createOn the full surface; on the compact one, mb_execute_operation with id: "crm.custom_fields.create".

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

Parameters

namestringbodyrequired

The field's name, as the app shows it (up to 80 characters).

typeenumbodyrequired

What the field holds; values are checked against it when records are written.

Values: text, longtext, number, currency, currencyCode, country, date, datetime, daterange, select, multiselect, url, email, phone, checkbox, user, member, members, rating, progress, files

entityenumbodyrequired

The kind of record the field belongs to.

Values: deal, person, company, prospect, product

slugstringbodyoptional

The key of the field in the records' customFields (lowercase letters, numbers and _); without it, it comes from the name. 409 custom_field_slug_taken if that entity already has it.

optionsarray<object>bodyoptional

For select and multiselect: the options (up to 100).

is_requiredbooleanbodyoptional

The app asks for it before saving the record.

default_valueanybodyoptional

The value a new record starts with (up to 2 KB).

help_textstringbodyoptional

A hint shown under the field (up to 300 characters).

group_namestringbodyoptional

The section of the record where the field is shown.

show_in_tablebooleanbodyoptional

Shown as a column in the lists.

show_in_drawerbooleanbodyoptional

Shown in the record's side panel.

Response

field_idstring

Errors

Example

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

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/crm/custom-fields" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "name": "NAME",
  "type": "text",
  "entity": "deal"
}'
PATCH/v1/crm/custom-fields/{field_id}

Update a custom field

crm.custom_fields.update

WriteSince 2026-11-01

Updates the name, options, required flag, default value, help text, group, visibility or order of a custom field: send them at the top level or inside updates (not both: updates_conflict), at least one (no_changes otherwise). The slug and the type do not change (the stored values depend on them). Returns the field as saved and changed: false when it already was that way (nothing written). Requires manage_custom_fields.

Scope
crm:write
Permission
Edit in the module · CRM action: manage_custom_fields
MCP tool
crm_custom_fields_updateOn the full surface; on the compact one, mb_execute_operation with id: "crm.custom_fields.update".

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

Parameters

field_idstringpathrequired

The field, by id (crm.custom_fields.list).

namestringbodyoptional

The field's name, as the app shows it (up to 80 characters).

optionsarray<object>bodyoptional

For select and multiselect: the options (up to 100).

is_requiredbooleanbodyoptional

The app asks for it before saving the record.

default_valueanybodyoptional

The value a new record starts with (up to 2 KB).

help_textstringbodyoptional

A hint shown under the field (up to 300 characters).

group_namestringbodyoptional

The section of the record where the field is shown.

show_in_tablebooleanbodyoptional

Shown as a column in the lists.

show_in_drawerbooleanbodyoptional

Shown in the record's side panel.

orderintegerbodyoptional

Its position among the fields of that entity (0 first).

updatesobjectbodyoptional

The same fields, grouped as in the other CRM edits (crm.deals.update…): send them here or at the top level, not both.

Response

oktrue
changedboolean

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

fieldobject

Errors

Example

curl -X PATCH "https://api.mb-suite.com/v1/crm/custom-fields/{field_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 -X PATCH "https://api.mb-suite.com/v1/crm/custom-fields/{field_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY"
DELETE/v1/crm/custom-fields/{field_id}

Delete a custom field definition

crm.custom_fields.delete

IrreversibleSince 2026-11-01

Deletes the definition of a custom field; the values already stored in records are kept and simply stop being shown. The definition goes to the 30-day trash. Requires manage_custom_fields.

With an API key, this DELETE runs directly: the record stays 30 days in the trash and the response carries its trash_item_id. With an OAuth token, and through the MCP, it needs dry_run → confirm_token.

Scope
crm:write and “Allow deletions” (crm:delete in OAuth)
Permission
Edit in the module · CRM action: manage_custom_fields
MCP tool
crm_custom_fields_deleteOn the full surface; on the compact one, mb_execute_operation with id: "crm.custom_fields.delete".

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

Parameters

field_idstringpathrequired

The field, by id (crm.custom_fields.list).

Response

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.

Errors

Example

curl -X DELETE "https://api.mb-suite.com/v1/crm/custom-fields/{field_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 -X DELETE "https://api.mb-suite.com/v1/crm/custom-fields/{field_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY"