curl --request PATCH \
--url https://api.withallo.com/v2/api/crm/companies/attributes/{key} \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"label": "Segment",
"is_visible": false
}
'import requests
url = "https://api.withallo.com/v2/api/crm/companies/attributes/{key}"
payload = {
"label": "Segment",
"is_visible": False
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({label: 'Segment', is_visible: false})
};
fetch('https://api.withallo.com/v2/api/crm/companies/attributes/{key}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.withallo.com/v2/api/crm/companies/attributes/{key}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'label' => 'Segment',
'is_visible' => false
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.withallo.com/v2/api/crm/companies/attributes/{key}"
payload := strings.NewReader("{\n \"label\": \"Segment\",\n \"is_visible\": false\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.withallo.com/v2/api/crm/companies/attributes/{key}")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"label\": \"Segment\",\n \"is_visible\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.withallo.com/v2/api/crm/companies/attributes/{key}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"label\": \"Segment\",\n \"is_visible\": false\n}"
response = http.request(request)
puts response.read_body{
"data": {
"key": "industry_segment",
"label": "Industry segment",
"type": "DROPDOWN",
"options": [
{
"key": "smb",
"label": "SMB"
},
{
"key": "enterprise",
"label": "Enterprise"
}
],
"is_visible": true,
"prompt": "Pick the segment that matches the company size mentioned on the call.",
"should_prompt_override": false,
"source": "allo",
"created_at": "2026-10-07T14:21:08",
"updated_at": "2026-10-07T14:21:08"
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"retryable": true,
"request_id": "<string>",
"retry_after_seconds": 123
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"retryable": true,
"request_id": "<string>",
"retry_after_seconds": 123
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"retryable": true,
"request_id": "<string>",
"retry_after_seconds": 123
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"retryable": true,
"request_id": "<string>",
"retry_after_seconds": 123
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"retryable": true,
"request_id": "<string>",
"retry_after_seconds": 123
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"retryable": true,
"request_id": "<string>",
"retry_after_seconds": 123
}
}Update company attribute
Partially updates an attribute: only the fields you send change. key and type cannot be changed. Attributes synced from a CRM integration only accept prompt, should_prompt_override and is_visible.
curl --request PATCH \
--url https://api.withallo.com/v2/api/crm/companies/attributes/{key} \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"label": "Segment",
"is_visible": false
}
'import requests
url = "https://api.withallo.com/v2/api/crm/companies/attributes/{key}"
payload = {
"label": "Segment",
"is_visible": False
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({label: 'Segment', is_visible: false})
};
fetch('https://api.withallo.com/v2/api/crm/companies/attributes/{key}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.withallo.com/v2/api/crm/companies/attributes/{key}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'label' => 'Segment',
'is_visible' => false
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.withallo.com/v2/api/crm/companies/attributes/{key}"
payload := strings.NewReader("{\n \"label\": \"Segment\",\n \"is_visible\": false\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.withallo.com/v2/api/crm/companies/attributes/{key}")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"label\": \"Segment\",\n \"is_visible\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.withallo.com/v2/api/crm/companies/attributes/{key}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"label\": \"Segment\",\n \"is_visible\": false\n}"
response = http.request(request)
puts response.read_body{
"data": {
"key": "industry_segment",
"label": "Industry segment",
"type": "DROPDOWN",
"options": [
{
"key": "smb",
"label": "SMB"
},
{
"key": "enterprise",
"label": "Enterprise"
}
],
"is_visible": true,
"prompt": "Pick the segment that matches the company size mentioned on the call.",
"should_prompt_override": false,
"source": "allo",
"created_at": "2026-10-07T14:21:08",
"updated_at": "2026-10-07T14:21:08"
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"retryable": true,
"request_id": "<string>",
"retry_after_seconds": 123
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"retryable": true,
"request_id": "<string>",
"retry_after_seconds": 123
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"retryable": true,
"request_id": "<string>",
"retry_after_seconds": 123
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"retryable": true,
"request_id": "<string>",
"retry_after_seconds": 123
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"retryable": true,
"request_id": "<string>",
"retry_after_seconds": 123
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"retryable": true,
"request_id": "<string>",
"retry_after_seconds": 123
}
}CRM_WRITEkey and type cannot be changed.
Body fields
| Field | Type | Description |
|---|---|---|
label | string | New display name |
options | array | Replaces the full option list with { label, key? } objects. DROPDOWN attributes only |
prompt | string | Instruction for the AI CRM Manager. A blank value clears it |
should_prompt_override | boolean | Whether the AI may overwrite a value that is already set |
is_visible | boolean | Show or hide the attribute in the Allo apps |
Renaming options
Option keys stay stable. To rename an option, send its currentkey with the new label. An option sent without a matching key is treated as new and gets a key derived from its label. Options missing from the list are removed.
Attributes synced from a CRM
An attribute whosesource is not allo is managed by your CRM integration. Only prompt, should_prompt_override and is_visible can be changed. Sending label or options returns 409 ATTRIBUTE_MANAGED_BY_INTEGRATION.
Response
Returns200 with the updated attribute, in the same shape as List company attributes.
Errors
| Status | Code | When |
|---|---|---|
400 | ATTRIBUTE_LABEL_INVALID | label is blank, longer than 255 characters, or has no letter or digit |
400 | ATTRIBUTE_OPTION_INVALID | options is empty, or an option label is blank, longer than 255 characters or duplicated |
400 | ATTRIBUTE_OPTIONS_NOT_SUPPORTED | options sent for an attribute that is not DROPDOWN |
403 | API_KEY_INSUFFICIENT_SCOPE | The key does not hold CRM_WRITE |
404 | TEAM_NOT_FOUND | The workspace is not on the new contact model |
404 | ATTRIBUTE_NOT_FOUND | No attribute with this key |
409 | ATTRIBUTE_MANAGED_BY_INTEGRATION | label or options sent for an attribute managed by a CRM integration |
409 | ATTRIBUTE_CONCURRENT_MODIFICATION | Attributes were modified at the same time. Retry the request |
Authorizations
Path Parameters
Attribute key, as returned by the list endpoint
"industry_segment"
Body
All fields are optional
New display name
Replaces the full option list. DROPDOWN attributes only. Send an option's current key to keep it when renaming its label.
Show child attributes
Show child attributes
Instruction the AI CRM Manager follows to fill this attribute from calls. A blank value clears it.
"Pick the segment that matches the company size mentioned on the call."
Whether the AI may overwrite a value that is already set
Show or hide the attribute in the Allo apps
Response
The updated attribute
A custom attribute on companies
Show child attributes
Show child attributes
Was this page helpful?