Skip to main content
People, Companies, Deals, and Custom Object records all carry a custom_attributes (or data) JSONB field. The schema engine enforces typing only for keys you’ve explicitly declared — unknown keys pass through.

The four cases

This means an agent can experiment freely with new fields, then formalize the ones that stick by calling POST /schema/:object_type/attributes.

Supported data_type values

Defining an attribute

Once defined, writes to People are validated: custom_attributes.tier must be one of the three enum values.

Modifying an attribute (PATCH)

You can change display_name, default_value, is_required, and append to enum_values. data_type is frozen after creation (changing it requires a data migration; not in v1). Enum removal isn’t allowed in v1 — only append.

Deprecating an attribute (DELETE)

DELETE is soft. The definition gets deprecated_at set; existing data is left intact; new writes of the key are rejected.
After deprecation, GET /schema/person shows the attribute with "deprecated": true.

Audit trail

Every schema mutation (POST / PATCH / DELETE / POST /custom-objects) appends a row to schema_migrations with the calling api_key_id, the action, and a JSON details blob.