For AI agents: markdown of this page — /docs-content-en/entities/companies/update.md documentation index — /llms.txt
Update company
PATCH /v1/companies/:id
Updates company fields. Pass only the fields you want to change. For the full list, see the field reference.
Important about
phone/web(multifield): On update, Bitrix24 only adds new multifield records. A PATCH{"email": "new@y.com"}to a company that already has an email will not replace the old one — the company will end up with two emails. This is Bitrix24-specific behavior, not Vibecode. To replace or delete email/phone/web, edit the company through the Bitrix24 UI. An object with anidfield (an attempt to update or delete a single row) is not accepted by this PATCH:400 MULTIFIELD_ID_NOT_SUPPORTED, and nothing is written.
Frequently updated fields
| Parameter | Type | Description |
|---|---|---|
title |
string | Name |
phone |
string | string[] | object[] | Phone. Accepts three forms: a string "+1...", an array of strings ["+1...", "+1..."], or an array of objects [{ "value": "+1...", "typeId": "WORK" }, …]. typeId: WORK | HOME | MOBILE | OTHER (default WORK). Important: the UPPER form [{ "VALUE": "...", "VALUE_TYPE": "WORK" }] is not accepted — it returns 400 INVALID_MULTIFIELD_SHAPE. Use camelCase: [{ "value": "...", "typeId": "WORK" }] |
email |
string | string[] | object[] | Email. Accepts three forms: a string "a@b.com", an array of strings ["a@b.com", "b@c.com"], or an array of objects [{ "value": "a@b.com", "typeId": "WORK" }, …]. typeId: WORK | HOME | MAILING | OTHER (default WORK). Important: the UPPER form [{ "VALUE": "...", "VALUE_TYPE": "WORK" }] is not accepted — it returns 400 INVALID_MULTIFIELD_SHAPE. Use camelCase: [{ "value": "...", "typeId": "WORK" }] |
web |
string | string[] | object[] | Website. Accepts three forms: a string "https://acme.com", an array of strings, or an array of objects [{ "value": "https://...", "typeId": "WORK" }]. typeId: WORK | HOME | OTHER (default WORK). Important: the UPPER form [{ "VALUE": "...", "VALUE_TYPE": "WORK" }] is not accepted — it returns 400 INVALID_MULTIFIELD_SHAPE. Use camelCase: [{ "value": "...", "typeId": "WORK" }] |
assignedById |
number | Assigned person. List: GET /v1/users |
industry |
string | Industry. List: GET /v1/statuses?filter[entityId]=INDUSTRY |
ufCrm* |
per field schema | A user field of the Bitrix24 account, for example ufCrmProjectCode. The actual name and type are in the schema GET /v1/companies/fields, and the value format for each type is in User fields (UF). An enumeration field takes the option ID from the field's items array in the schema, and a multiple field takes an array of such IDs. If you send the option label VALUE instead of the ID, the value is lost: a single-value field gets 0. A number that is not among the options is stored as is. Neither the label nor a non-existent ID raises an error, and the request returns 200, so map the label to its ID on your side and check the stored value of this field in the response data |
Examples
curl — personal key
curl -X PATCH "https://vibecode.bitrix24.com/v1/companies/1" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "title": "Acme Inc. (updated)", "industry": "MANUFACTURING" }'
curl — OAuth application
curl -X PATCH "https://vibecode.bitrix24.com/v1/companies/1" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "title": "Acme Inc. (updated)", "industry": "MANUFACTURING" }'
JavaScript — personal key
const res = await fetch('https://vibecode.bitrix24.com/v1/companies/1', {
method: 'PATCH',
headers: {
'X-Api-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({ title: 'Acme Inc. (updated)', industry: 'MANUFACTURING' }),
})
const { success, data } = await res.json()
JavaScript — OAuth application
const res = await fetch('https://vibecode.bitrix24.com/v1/companies/1', {
method: 'PATCH',
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({ title: 'Acme Inc. (updated)', industry: 'MANUFACTURING' }),
})
const { success, data } = await res.json()
Alternative form — array of objects with explicit `typeId`
If you need to specify several values or an explicit type (HOME, OTHER):
{
"phone": [
{ "value": "+12025550123", "typeId": "WORK" },
{ "value": "+12025550124", "typeId": "OTHER" }
],
"email": [
{ "value": "info@example.com", "typeId": "WORK" },
{ "value": "sales@example.com", "typeId": "MAILING" }
],
"web": [
{ "value": "https://example.com", "typeId": "WORK" },
{ "value": "https://example.com", "typeId": "OTHER" }
]
}
Response fields
| Field | Type | Description |
|---|---|---|
data |
object | The updated company object with all fields — see Fields |
The updated company object — see Company fields.
Response example
{
"success": true,
"data": {
"id": 1,
"title": "Acme Inc. (updated)",
"industry": "MANUFACTURING",
"assignedById": 1,
"createdTime": "2020-05-08T10:48:20+00:00",
"updatedTime": "2026-04-15T12:00:00+00:00"
}
}
Error response example
404 — company not found:
{
"success": false,
"error": {
"code": "ENTITY_NOT_FOUND",
"message": "Item not found"
}
}
Errors
| HTTP | Code | Description |
|---|---|---|
| 404 | ENTITY_NOT_FOUND |
Company not found |
| 403 | ACCESS_DENIED |
No access |
| 400 | INVALID_REQUEST |
Invalid fields |
| 400 | MULTIFIELD_ID_NOT_SUPPORTED |
phone, email, web or the raw fm[] contains an object with an id field. Bitrix24 neither updates nor deletes a single multifield row through this call — it would append a duplicate — so the request is refused and nothing is written |
| 403 | SCOPE_DENIED |
The API key does not have the crm scope |
| 401 | TOKEN_MISSING |
The API key has no configured tokens |
Full list of common API errors — Errors.