Skip to main content
POST
Create custom company attribute
Required scope: CRM_WRITE

Body fields

Key derivation

The key is derived from the label: lowercase, accents removed, runs of non-alphanumeric characters replaced by _, truncated to 64 characters. Industry segment becomes industry_segment. Option keys are derived the same way. A label that resolves to a reserved key is rejected with ATTRIBUTE_KEY_RESERVED. The reserved keys are: id, name, phone_numbers, website, industry, logo_url, last_activity, activity_history, sms_content, created_at and updated_at.

Response

Returns 201 with the created attribute. source is allo, and already_existed is false.

Creating the same attribute twice

The call is safe to repeat. If an attribute with the same key and type already exists, the endpoint returns 201 with that attribute and already_existed set to true. Nothing is created and the existing definition is left unchanged. If the key exists with a different type, the request returns 409 ATTRIBUTE_KEY_CONFLICT.

Limits

Each type has a fixed number of slots per team. Once a type is full, creating another attribute of that type returns 409 ATTRIBUTE_SLOTS_EXHAUSTED. Delete an unused attribute or use another type. Custom attributes are only available to teams on the new contact model. Other teams get 404 TEAM_NOT_FOUND.

Errors

Authorizations

Authorization
string
header
required

Body

application/json
label
string
required

Display name of the attribute. The attribute key is derived from it: lowercase, accents removed, runs of non-alphanumeric characters replaced by _, truncated to 64 characters. Labels that resolve to a reserved key are rejected.

Example:

"Industry segment"

type
enum<string>
required
Available options:
TEXT,
NUMBER,
DATE,
BOOLEAN,
DROPDOWN
Example:

"DROPDOWN"

options
object[]

Allowed values. Required, with at least one option, for DROPDOWN; rejected for other types.

prompt
string | null

Instruction the AI CRM Manager follows to fill this attribute from calls. A blank value clears it.

Example:

"Pick the segment that matches the company size mentioned on the call."

should_prompt_override
boolean

Whether the AI may overwrite a value that is already set

Response

The attribute that was created, or the existing one when already_existed is true

data
object

A custom attribute on companies