Create a custom field
Create a contact custom field. The field_key (the key values are stored under) is derived from field_name the same way the app does, unless you pass one.
POST
https://api.centerfy.ai/webhooks/inbound/custom-fields Headers
| Header | Required | Value | Description |
|---|---|---|---|
x-api-key | Yes | your sub-account API key (cfy_…) | Authenticates the request; or use Authorization: Bearer <key>. |
Body parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
field_name | string | Yes | — | Display name, 1–200 characters. |
field_type | string | Yes | — | One of text, number, date, select, textarea, checkbox, multiselect. |
options | string[] | null | No | — | Choices for select / multiselect fields (max 200); required and non-empty for those types. Blank entries are dropped. |
is_required | boolean | No | — | Whether the field is marked required in the app. Defaults to false. |
sort_order | integer | No | — | Display position; minimum 0. Defaults to after the existing Centerfy fields. |
field_key | string | No | — | Storage key (max 64). Lower-cased, with runs of other characters turned into _. Defaults to the same treatment of field_name. |
Request body
{
"field_name": "Plan tier",
"field_type": "select",
"options": [
"Basic",
"Pro",
"Enterprise"
]
}Example
curl -X POST "https://api.centerfy.ai/webhooks/inbound/custom-fields" \
-H "x-api-key: $CENTERFY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"field_name": "Plan tier",
"field_type": "select",
"options": [
"Basic",
"Pro",
"Enterprise"
]
}' import { CenterfyClient } from "@centerfy/sdk";
const centerfy = new CenterfyClient({ apiKey: process.env.CENTERFY_API_KEY! });
const result = await centerfy.customFields.create({
"field_name": "Plan tier",
"field_type": "select",
"options": [
"Basic",
"Pro",
"Enterprise"
]
});
console.log(result); centerfy customFields create '{"field_name":"Plan tier","field_type":"select","options":["Basic","Pro","Enterprise"]}' MCP tool: centerfy_custom_fields_create (see MCP server)
Response
{
"status": "success",
"custom_field": {
"id": "4b5c6d7e-8f90-4a1b-9c2d-3e4f5a6b7c8d",
"field_name": "Plan tier",
"field_key": "plan_tier",
"field_type": "select",
"options": [
"Basic",
"Pro",
"Enterprise"
],
"is_required": false,
"sort_order": 0,
"source": "platform",
"external_key": null,
"archived_at": null,
"created_at": "2026-10-01T10:00:00.000Z",
"updated_at": "2026-10-01T10:00:00.000Z"
}
}Errors
400— if field_name is empty, field_key has no letters or digits, or a select / multiselect field has no options.409— if a field with that key already exists in this sub-account (including archived and GoHighLevel fields).
Notes
Returns 201. New fields always have source platform.