Menu

API reference · Accounts

Custom fields

child_orgs · custom_fields · 7 operations

GET/v1/accounts/custom-fields

List the account custom fields

child_orgs.custom_fields.list

ReadIdempotentSince 2026-11-01

Lists the custom fields the workspace defined for its accounts, in their order: name, slug (the key of the value in each account's custom_fields), type (text, number, select, multiselect, date, daterange, checkbox, user, rating, progress, files…), options of selects, required flag, help text, group and visibility in the table and the drawer. Up to 100 fields. Read the values of one account with child_orgs.custom_fields.get_values.

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

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

Parameters

No parameters.

Response

dataarray<object>

Errors

Example

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

Create an account custom field

child_orgs.custom_fields.create

WriteSince 2026-11-01

Defines a custom field for the workspace's accounts, at the end of the order: name, type, options for select and multiselect, required flag, default value, help text, group and visibility in the table and the drawer. The slug (lowercase letters, digits and underscores) is derived from the name unless given and must be unique in the workspace (custom_field_slug_taken, 409); up to 100 fields (limit_reached, 409, details.resource account_custom_fields). Owners and admins. Returns the field.

Scope
child_orgs:write
Permission
Edit in the module · Only owner, admin
MCP tool
child_orgs_custom_fields_createOn the full surface; on the compact one, mb_execute_operation with id: "child_orgs.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

The kind of value: text, longtext, number, currency (an amount), currency_code (an ISO 4217 code; currencyCode is accepted too), country, date, datetime, daterange, select or multiselect (with options), url, email, phone, checkbox, user or member (one member of the workspace or the account: the field holds their uid; the two are the same), members (a list of members' uids), rating, progress or files.

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

slugstringbodyoptional

The key of the value in each account's custom_fields (lowercase letters, digits and underscores; derived from the name when absent). It cannot change later.

optionsarray<object>bodyoptional

For select and multiselect: the choices (up to 100), each with value, label and an optional color.

is_requiredbooleanbodyoptional

Whether the app marks the field as required.

default_valueanybodyoptional

The value a new account gets (up to 2 KB, of the field's type).

help_textstringbodyoptional

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

group_namestringbodyoptional

The group the field is shown in, in the account's profile (up to 60 characters).

show_in_tablebooleanbodyoptional

Whether the Accounts table shows it as a column.

show_in_drawerbooleanbodyoptional

Whether the account's side panel shows it.

Response

field_idstring
fieldobject

Errors

Example

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

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/accounts/custom-fields" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "name": "NAME",
  "type": "text"
}'
PATCH/v1/accounts/custom-fields/{field_id}

Update an account custom field

child_orgs.custom_fields.update

WriteIdempotentSince 2026-11-01

Changes the name, options, required flag, default value, help text, group, visibility or order of an account custom field; null clears the help text, the group or the default value. The slug and the type do not change (the stored values depend on them). Fields not sent keep their value. Owners and admins. Returns the field.

Scope
child_orgs:write
Permission
Edit in the module · Only owner, admin
MCP tool
child_orgs_custom_fields_updateOn the full surface; on the compact one, mb_execute_operation with id: "child_orgs.custom_fields.update".

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

Parameters

field_idstringpathrequired

Custom field definition id (from child_orgs.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 choices (up to 100), each with value, label and an optional color. Replaces the whole list.

is_requiredbooleanbodyoptional

Whether the app marks the field as required.

default_valueany | nullbodyoptional

The value a new account gets (up to 2 KB, of the field's type). null removes it.

help_textstring | nullbodyoptional

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

group_namestring | nullbodyoptional

The group the field is shown in, in the account's profile (up to 60 characters). null removes it.

show_in_tablebooleanbodyoptional

Whether the Accounts table shows it as a column.

show_in_drawerbooleanbodyoptional

Whether the account's side panel shows it.

orderintegerbodyoptional

Its position among the account fields (0 = the first); child_orgs.custom_fields.reorder sets the whole order at once.

Response

fieldobject

Errors

Example

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

Delete an account custom field

child_orgs.custom_fields.delete

IrreversibleSince 2026-11-01

Deletes the definition of an account custom field. The values the accounts stored under its slug are kept and simply stop being shown; the definition stays 30 days in the trash and, restored, shows them again. Owners and admins. Outside the app it needs a dry run and a confirm_token, except a REST DELETE with a key allowed to delete.

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

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

Parameters

field_idstringpathrequired

Custom field definition id (from child_orgs.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/accounts/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/accounts/custom-fields/{field_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/accounts/custom-fields/reorder

Reorder the account custom fields

child_orgs.custom_fields.reorder

WriteIdempotentSince 2026-11-01

Sets the order of the account custom fields, shared by everyone in the workspace (columns of the Accounts table and the account drawer): the ids sent go first, in that order; the fields not sent keep their relative order after them. Unknown ids are refused. Owners and admins. Returns every field id with its new position.

Scope
child_orgs:write
Permission
Edit in the module · Only owner, admin
MCP tool
child_orgs_custom_fields_reorderOn the full surface; on the compact one, mb_execute_operation with id: "child_orgs.custom_fields.reorder".

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

Parameters

ordered_idsarray<string>bodyrequired

Field ids in the new order. Fields not listed keep their relative order after these.

Response

dataarray<object>

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/accounts/custom-fields/reorder" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "ordered_ids": [
    "ORDERED_ID"
  ]
}'

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/accounts/custom-fields/reorder" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "ordered_ids": [
    "ORDERED_ID"
  ]
}'
GET/v1/accounts/{account_id}/custom-fields

Get an account's custom field values

child_orgs.custom_fields.get_values

ReadIdempotentSince 2026-11-01

Returns the values of the account custom fields stored in one account, keyed by slug (only fields defined today; empty fields are absent). Value formats: text as strings, numbers, timestamps in milliseconds for dates, { from, to } for date ranges, option values for selects, member uids for people, and the uploaded files' metadata for files fields. Needs to see the account (members only see their assigned ones).

Scope
child_orgs:read
Permission
View the module
MCP tool
child_orgs_custom_fields_get_valuesOn the full surface; on the compact one, mb_execute_operation with id: "child_orgs.custom_fields.get_values".

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

Parameters

account_idstringpathrequired

Account id: a child organization of this workspace (the ids of platform.orgs.list).

Response

account_idstring
custom_fieldsobject

Errors

Example

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

Set an account's custom field values

child_orgs.custom_fields.set_values

WriteIdempotentSince 2026-11-01

Writes custom field values of one account, keyed by slug (child_orgs.custom_fields.list). By default only the fields sent change and null clears one; with replace: true the account keeps exactly the fields sent. Each new value is validated against its field's type (custom_field_invalid; custom_field_unknown for a slug that does not exist): text, numbers, timestamps in milliseconds for dates, { from, to } for date ranges, option values for selects, uids of workspace members for people, 0–5 for rating and 0–100 for progress. Files are uploaded in the app (custom_field_not_writable). Owners, admins and members, on accounts they can see. Returns the stored values and the slugs that changed.

Scope
child_orgs:write
Permission
Edit in the module · Only owner, admin, member
MCP tool
child_orgs_custom_fields_set_valuesOn the full surface; on the compact one, mb_execute_operation with id: "child_orgs.custom_fields.set_values".

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

Parameters

account_idstringpathrequired

Account id: a child organization of this workspace (the ids of platform.orgs.list).

custom_fieldsobjectbodyrequired

Values keyed by field slug; null clears a field.

replacebooleanbodyoptional

true: the account keeps exactly the fields sent (the rest are cleared). Default false: only the fields sent change.

Response

account_idstring
custom_fieldsobject
changedarray<string>

Errors

Example

curl -X PATCH "https://api.mb-suite.com/v1/accounts/{account_id}/custom-fields" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "custom_fields": {}
}'

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/accounts/{account_id}/custom-fields" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "custom_fields": {}
}'