The five field types
available_options is capped at 50 values.
Configuration
Defining a field
GET /public/custom-fields/schema?object=contact (or company) lists every field the client can read or write.
POST /public/custom-fields/schema defines a field and sets its type, so it exists on every record and in the filter schema before any value is written. Repeating the call for a field this workspace owns updates its type; setting type: "text" again does not remove it (removal isn’t exposed through this endpoint).
Existing values are checked against the new type before it’s applied: a number field rejects non-numeric values, a date field rejects anything but
YYYY-MM-DD, and a dropdown rejects values outside available_options. Defining or redefining a field that already has out-of-type values fails (400) and names them.
Agency vs. client fields
Every custom field has asource: agency or client.
agency: defined in the agency’s master schema, shared across every client workspace under that agency. Its type is managed at the agency level; a client-levelPOST /public/custom-fields/schemacall against an agency-owned field is rejected with 409.client: defined for one workspace only, through that workspace’s own API key or MCP session.
Writing values
Once a field is defined, values are written per record:POST /public/contacts/{contact_id}/custom-fieldsandPATCH .../custom-fields/{field_id}set or update a contact’s value for a field.POST /public/companies/{company_id}/custom-fieldsandPATCH .../custom-fields/{field_id}do the same for companies.DELETE .../custom-fields/{field_id}removes a value.
field_name and field_value; the value is validated against the field’s type the same way schema values are.
Custom fields on custom activity types follow the same five types but are defined as part of the activity type’s schema rather than through this endpoint; see Custom activity types and custom activities.
Related endpoints and MCP tools
Public APIGET/POST /public/custom-fields/schemaPOST /public/contacts/{contact_id}/custom-fields,PATCH/DELETE .../custom-fields/{field_id}POST /public/companies/{company_id}/custom-fields,PATCH/DELETE .../custom-fields/{field_id}
list_custom_fields,create_custom_fieldupdate_contact,update_company(accept acustom_fieldsobject of key-value updates)get_filter_schema,get_field_options(custom fields appear ascustom.<name>)

