REST API reference
Data attributes
Define the custom fields stored on people, companies, conversations and tickets.
Custom attributes hold your own data — plan, seats, MRR, invoice numbers — and are validated against their type on every write. Reads need data_attributes:read; changes need data_attributes:write.
The data attribute object
A custom attribute definition.
Fields
-
objectstring - Always
data_attribute. -
idstring - Unique id.
-
entityenum contact,company,conversationorticket.-
keystring - snake_case key used in
customAttributes. Can’t change. -
labelstring - Name shown in the dashboard.
-
typeenum string,number,boolean,date,list,url,multiline. Can’t change.-
optionsarray | null { value, label }choices forlistattributes.-
descriptionstring | null - Help text.
-
requiredToCloseboolean - Conversation attributes teammates must fill before closing.
-
visibleToCustomerboolean - Shown to the customer (conversation attributes).
-
archivedboolean - Hidden from new use; values are kept.
-
createdAttimestamp - Created.
{ "object": "data_attribute", "id": "0199a8f5-7b8c-7d9e-9f0a-1b2c3d4e5f6a", "entity": "contact", "key": "seats", "label": "Seats", "type": "number", "options": null, "description": "Paid seats on the customer’s plan.", "requiredToClose": false, "visibleToCustomer": false, "archived": false, "createdAt": "2025-03-02T11:20:00.000Z"} List data attributes
GET
/v1 /data-attributes data_attributes:read Custom attributes by entity and label. Not paginated. GET /data-attributes/{id} returns one.
Query parameters
-
entityenum contact,company,conversationorticket.-
includeArchivedboolean - Include archived attributes.
curl https://api.rabbitblaze.com/v1/data-attributes?entity=contact \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" const res = await fetch("https://api.rabbitblaze.com/v1/data-attributes?entity=contact", { headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, },})const data = await res.json() import osimport requests res = requests.get( "https://api.rabbitblaze.com/v1/data-attributes", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"}, params={ "entity": "contact", },)res.raise_for_status()data = res.json() { "items": [ { "object": "data_attribute", "id": "0199a8f5-7b8c-7d9e-9f0a-1b2c3d4e5f6a", "entity": "contact", "key": "seats", "label": "Seats", "type": "number", "options": null, "description": "Paid seats on the customer’s plan.", "requiredToClose": false, "visibleToCustomer": false, "archived": false, "createdAt": "2025-03-02T11:20:00.000Z" } ], "nextCursor": null} Create a data attribute
POST
/v1 /data-attributes data_attributes:write Creates a custom attribute. A key that already exists for the entity answers 409 conflict.
Body
-
entityenum required contact,company,conversationorticket.-
labelstring required - Up to 120 characters.
-
typeenum required string,number,boolean,date,list,url,multiline-
keystring - snake_case, up to 64 characters. Derived from the label when omitted.
-
optionsarray [{ value, label? }]forlistattributes (up to 200).-
descriptionstring | null - Up to 500 characters.
-
requiredToCloseboolean - Conversation attributes only.
-
visibleToCustomerboolean - Show it to the customer.
curl -X POST https://api.rabbitblaze.com/v1/data-attributes \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "entity": "contact", "label": "Seats", "type": "number", "description": "Paid seats on the customer’s plan."}' const res = await fetch("https://api.rabbitblaze.com/v1/data-attributes", { method: "POST", headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ entity: "contact", label: "Seats", type: "number", description: "Paid seats on the customer’s plan.", }),})const data = await res.json() import osimport requests res = requests.post( "https://api.rabbitblaze.com/v1/data-attributes", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"}, json={ "entity": "contact", "label": "Seats", "type": "number", "description": "Paid seats on the customer’s plan.", },)res.raise_for_status()data = res.json() { "object": "data_attribute", "id": "0199a8f5-7b8c-7d9e-9f0a-1b2c3d4e5f6a", "entity": "contact", "key": "seats", "label": "Seats", "type": "number", "options": null, "description": "Paid seats on the customer’s plan.", "requiredToClose": false, "visibleToCustomer": false, "archived": false, "createdAt": "2025-03-02T11:20:00.000Z"} Update a data attribute
PATCH
/v1 /data-attributes/{id} data_attributes:write Change the label, help text, options or flags, or archive it. key and type can’t change.
Path parameters
-
idstring required - The attribute id.
Body
-
labelstring - New label.
-
descriptionstring | null - New help text.
-
optionsarray - Replaces the list options.
-
requiredToCloseboolean - Conversation attributes only.
-
visibleToCustomerboolean - Show it to the customer.
-
archivedboolean - Archive or restore.
curl -X PATCH https://api.rabbitblaze.com/v1/data-attributes/0199a8f5-7b8c-7d9e-9f0a-1b2c3d4e5f6a \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "label": "Paid seats"}' const res = await fetch("https://api.rabbitblaze.com/v1/data-attributes/0199a8f5-7b8c-7d9e-9f0a-1b2c3d4e5f6a", { method: "PATCH", headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ label: "Paid seats", }),})const data = await res.json() import osimport requests res = requests.patch( "https://api.rabbitblaze.com/v1/data-attributes/0199a8f5-7b8c-7d9e-9f0a-1b2c3d4e5f6a", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"}, json={ "label": "Paid seats", },)res.raise_for_status()data = res.json() { "object": "data_attribute", "id": "0199a8f5-7b8c-7d9e-9f0a-1b2c3d4e5f6a", "entity": "contact", "key": "seats", "label": "Paid seats", "type": "number", "options": null, "description": "Paid seats on the customer’s plan.", "requiredToClose": false, "visibleToCustomer": false, "archived": false, "createdAt": "2025-03-02T11:20:00.000Z"}