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 note on
phone/web(multifield): on update,phone,webonly add rows. A PATCH with{"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. To change or delete a single row, sendfmas an object keyed by the rowid— see the section below. An object with anidfield insidephone,weborfm[]is still refused:400 MULTIFIELD_ID_NOT_SUPPORTED, and nothing is written.
Frequently updated fields
| Parameter | Type | Description |
|---|---|---|
Parametertitle |
Typestring | DescriptionName |
Parameterphone |
Typestring | string[] | object[] | DescriptionPhone. 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" }] |
Parameteremail |
Typestring | string[] | object[] | DescriptionEmail. 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" }] |
Parameterweb |
Typestring | string[] | object[] | DescriptionWebsite. 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" }] |
ParameterassignedById |
Typenumber | DescriptionResponsible person. List: GET /v1/users |
Parameterindustry |
Typestring | DescriptionIndustry. List: GET /v1/statuses?filter[entityId]=INDUSTRY |
ParameterufCrm* |
Typeper field schema | DescriptionA 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" }
]
}
Change or delete a single multifield row — `fm` keyed by row `id`
Send fm as an object. A key is a row id from fm in the GET response: a non-empty value changes that row, an empty value deletes it. A key n0, n1, … adds a new row. All three actions can be combined in one request.
{
"fm": {
"11": { "typeId": "PHONE", "valueType": "MOBILE", "value": "+14155550100" },
"10": { "typeId": "EMAIL", "value": "" },
"n0": { "typeId": "WEB", "valueType": "WORK", "value": "https://example.com" }
}
}
- A row accepts only
typeId,valueTypeandvalue.typeIdis the channel:PHONE,EMAILorWEB.valueTypeis required when a row changes: send the current one to keep it. A new row defaults toWORK, a deletion needs none. - Before writing, Vibecode reads the company and checks that every
idis a row of this company with the sametypeId. Otherwise —409 MULTIFIELD_ROW_NOT_FOUND, and nothing is written. - After writing, the company is read again: every changed row is compared with the requested value (a phone by its digits, an email case-insensitively, a website case-insensitively only in its scheme and host), new rows by channel, subtype and value. Rows someone else added meanwhile do not spoil the comparison. If the change is not visible —
422 MULTIFIELD_NOT_APPLIED, with the re-read record indata. If it is visible but a row the request did not name is gone or changed —200with theMULTIFIELD_OTHER_ROWS_CHANGEDwarning inmeta.warnings, with that rowidindetails.lostRowsordetails.changedRows. This happens when someone else edited the record meanwhile or Bitrix24 applied the write to that row too. If the re-read record carriesfmin an unknown shape —200with theMULTIFIELD_UNVERIFIEDwarning inmeta.warnings. - If the row was deleted between the read and the write (the write waits for the account queue and for rate-limit repeats), Bitrix24 creates it again with the requested value: the answer is
422 MULTIFIELD_NOT_APPLIED, with the rowidinerror.details.keys. - This form has not been checked on a self-hosted Bitrix24 account yet. If the CRM module applies it differently, the answer is
422 MULTIFIELD_NOT_APPLIEDor theMULTIFIELD_OTHER_ROWS_CHANGEDwarning: the write has already happened, so compare the record indatabefore sending anything again. - An
fmobject cannot be combined withphone,emailandwebin one request. An array inphone,email,webandfm[]still only add rows. - This form is available only in this
PATCH. Batch updates, import and create acceptfmonly as an array.
Response fields
| Field | Type | Description |
|---|---|---|
Fielddata |
Typeobject | DescriptionThe 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 |
|---|---|---|
| HTTP404 | CodeENTITY_NOT_FOUND |
DescriptionCompany not found |
| HTTP403 | CodeACCESS_DENIED |
DescriptionNo access |
| HTTP400 | CodeINVALID_REQUEST |
DescriptionInvalid fields |
| HTTP400 | CodeINVALID_MULTIFIELD_SHAPE |
DescriptionWrong shape for phone, email or web: the form with upper-case VALUE / VALUE_TYPE keys is not accepted; the expected shape is [{ "value", "typeId" }]. The same code is returned when phone, email or web holds an object without value — for example empty or with keys such as n0, 0 or 011 — or a number or true/false, on its own or as an array item. For fm as an object — when a key is neither a row id nor n0, n1, …, the object is empty, a row has fields other than typeId, valueType, value, typeId is not PHONE/EMAIL/WEB, value is not a string, a new row has an empty value, a changed row has no valueType, or phone/email/web is sent next to it. A string, a number or a boolean in fm returns the same code. The request is refused and nothing is written |
| HTTP400 | CodeMULTIFIELD_ID_NOT_SUPPORTED |
Descriptionphone, email, web or the raw fm[] contains an object with an id field. In an array Bitrix24 neither updates nor deletes a row by id — it would append a duplicate — so the request is refused and nothing is written. The same refusal applies when phone, email or web is sent as an object keyed by row ids. To change or delete a row, send fm as an object keyed by the row id |
| HTTP409 | CodeMULTIFIELD_ROW_NOT_FOUND |
DescriptionAn fm key is the id of a row this company does not have, or of a row of another channel (typeId). error.details holds key and typeId. Nothing is written: read the record again and take the id from its fm |
| HTTP404, 429, 502 | CodeMULTIFIELD_PRECHECK_FAILED |
DescriptionThe current fm rows could not be read before writing: the company does not exist (404), the account or the Vibecode queue refused the read for a rate limit (429 with Retry-After), fm came in an unknown shape or the read failed (502; the same status when Bitrix24 refused with a 4xx). The cause is in error.details.cause. Nothing is written |
| HTTP422 | CodeMULTIFIELD_NOT_APPLIED |
DescriptionBitrix24 accepted the write, but the re-read record does not show the requested fm change: error.details.keys holds the keys that were not confirmed, lostRows the id of rows the request did not name that are gone, changedRows the id of such rows whose value changed, addedRows and expectedAddedRows how many rows were added and how many were expected, and the re-read record is in data. The write may be partial: compare the record before sending anything again |
| HTTP403 | CodeSCOPE_DENIED |
DescriptionThe API key does not have the crm scope |
| HTTP401 | CodeTOKEN_MISSING |
DescriptionThe API key has no configured tokens |
Full list of common API errors — Errors.