List existing data attributes: GET /data_attributes?model=contact or ?model=company to understand what is already defined before creating duplicates.
Create a new attribute: POST /data_attributes with 'name' (the display name), 'model' ('contact' or 'company'), 'data_type' ('string', 'integer', 'float', 'boolean', 'date', or 'list'), and optionally 'description' and 'options' for list types.
The response includes an 'id', the computed 'full_name' (used as the key when setting attribute values on contacts), and 'api_writable' flag.
Set attribute values on a contact via PUT /contacts/{id} with 'custom_attributes': {'{full_name}': value} — the key must be the full_name returned when creating the attribute.
Update an attribute's description or options via PUT /data_attributes/{attribute_id}; you cannot change the data_type after creation.
Archive an attribute you no longer need with PATCH /data_attributes/{attribute_id} by setting 'archived': true — this hides it from the UI but preserves historical data.
Known gotchas
Attribute 'full_name' is auto-generated from 'name' and includes a prefix (e.g., 'custom_attributes.my_attribute') — always use the returned full_name, not the name, when writing values to contacts.
List-type attributes require the 'options' array to be defined at creation time; adding new options later is possible but removing options does not clear existing values on contacts that already have them.
Intercom enforces a maximum number of custom attributes per workspace depending on the plan — exceeding this limit returns a 422 with a message about attribute limits.
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp