For AI agents: markdown of this page — /docs-content-en/entities/companies/contacts-set.md documentation index — /llms.txt
Replace company contacts
PUT /v1/companies/:id/contacts
Defines the company's entire set of contacts in one call: links the contacts from the list and unlinks all others.
To add one contact without unlinking the others, use POST /v1/companies/:id/contacts.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
Parameterid (path) |
Typenumber | Requiredyes | DescriptionCompany ID. List: GET /v1/companies |
Request fields (body)
| Field | Type | Required | Description |
|---|---|---|---|
Fielditems |
Typearray | Requiredyes | DescriptionThe new set of the company's contacts, including already linked contacts that must stay. Contacts missing from the array are unlinked. An empty array [] unlinks all contacts |
Fielditems[].contactId |
Typenumber | Requiredyes | DescriptionContact ID. List: GET /v1/contacts. A string of digits is also accepted, for example "2991" |
Fielditems[].isPrimary |
Typeboolean | Requiredno | DescriptionIgnored: replacing makes the company primary for every contact in items, and they have isPrimary: true in the response |
Fielditems[].sort |
Typenumber | Requiredno | DescriptionThe contact's position in the list. Defaults to 10 for the first item, 20 for the second, and so on |
Examples
curl — personal key
curl -X PUT "https://vibecode.bitrix24.com/v1/companies/3123/contacts" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"items": [
{ "contactId": 2991, "sort": 10 },
{ "contactId": 2987, "sort": 20 }
]
}'
curl — OAuth application
curl -X PUT "https://vibecode.bitrix24.com/v1/companies/3123/contacts" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"items": [
{ "contactId": 2991, "sort": 10 },
{ "contactId": 2987, "sort": 20 }
]
}'
JavaScript — personal key
const res = await fetch('https://vibecode.bitrix24.com/v1/companies/3123/contacts', {
method: 'PUT',
headers: {
'X-Api-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
items: [
{ contactId: 2991, sort: 10 },
{ contactId: 2987, sort: 20 },
],
}),
})
const { success, data } = await res.json()
console.log('Contacts linked to the company:', data.length)
JavaScript — OAuth application
const res = await fetch('https://vibecode.bitrix24.com/v1/companies/3123/contacts', {
method: 'PUT',
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({
items: [
{ contactId: 2991, sort: 10 },
{ contactId: 2987, sort: 20 },
],
}),
})
const { success, data } = await res.json()
Response fields
| Field | Type | Description |
|---|---|---|
Fieldsuccess |
Typeboolean | DescriptionAlways true on success |
Fielddata |
Typearray | DescriptionAll of the company's links after the replacement, in sort order. An empty array after "items": [] |
Fielddata[].contactId |
Typenumber | DescriptionContact ID. Get the contact: GET /v1/contacts/:id |
Fielddata[].isPrimary |
Typeboolean | DescriptionThe company is primary for this contact: its ID arrives in the contact's companyId field |
Fielddata[].sort |
Typenumber | DescriptionThe contact's position in the list |
Fielddata[].roleId |
Typenumber | DescriptionThe contact's role in the company. The link methods do not save it |
Response example
{
"success": true,
"data": [
{ "contactId": 2991, "sort": 10, "isPrimary": true, "roleId": 0 },
{ "contactId": 2987, "sort": 20, "isPrimary": true, "roleId": 0 }
]
}
Error response example
400 — the body has no items array:
{
"success": false,
"error": {
"code": "INVALID_PARAMS",
"message": "items must be an array (use [] to unlink all)"
}
}
Errors
| HTTP | Code | Description |
|---|---|---|
| HTTP400 | CodeINVALID_PARAMS |
Descriptionid is not a positive integer |
| HTTP400 | CodeINVALID_PARAMS |
Descriptionitems is missing or is not an array |
| HTTP400 | CodeINVALID_PARAMS |
DescriptionAn items element is not an object. The message starts with the element index: items[0] must be an object |
| HTTP400 | CodeINVALID_PARAMS |
DescriptionAn items element has no contactId, or contactId is not a positive integer. The message names the element index: items[0] requires 'contactId' |
| HTTP404 | CodeENTITY_NOT_FOUND |
DescriptionNo company with this id |
| HTTP401 | CodeMISSING_API_KEY |
DescriptionThe X-Api-Key header is missing |
| HTTP401 | CodeTOKEN_MISSING |
DescriptionThe API key has no Bitrix24 tokens configured |
| HTTP403 | CodeSCOPE_DENIED |
DescriptionThe key has no crm scope |
| HTTP403 | CodeWRITE_BLOCKED_READONLY_KEY |
DescriptionThe key is in read-only mode. Replacing requires a key with write access |
| HTTP429 | CodeRATE_LIMITED |
DescriptionRate limit exceeded. Retry after the delay in the Retry-After header |
| HTTP502 | CodeBITRIX_UNAVAILABLE |
DescriptionBitrix24 is unavailable. Retry the request later |
Full list of common API errors — Errors.
Known specifics
- The company becomes the contacts' primary company. For every contact in
items, including already linked ones, thecompanyIdfield returns the ID of this company, and the contact's link to its previous primary company getsisPrimary: false. - Contact existence is not checked. An ID that does not belong to any contact is linked without an error and appears in the company's list of links. Before replacing, check the contacts with
GET /v1/contacts/:id. - The role is not saved. The
roleIdfield in anitemselement is accepted without an error but is not saved: the new link hasroleIdequal to0in the response.