For AI agents: markdown of this page — /docs-content-en/entities/deals/contacts-set.md documentation index — /llms.txt
Replace deal contacts
PUT /v1/deals/:id/contacts
Sets the full list of deal contacts in one call: links the listed contacts and unlinks all others.
To add one contact without unlinking the rest, use POST /v1/deals/:id/contacts.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
Parameterid (path) |
Typenumber | Requiredyes | DescriptionDeal ID. List: GET /v1/deals |
Request fields (body)
| Field | Type | Required | Description |
|---|---|---|---|
Fielditems |
Typearray | Requiredyes | DescriptionThe new set of deal contacts, including already linked contacts that should stay. Contacts missing from the array are unlinked. An empty array [] unlinks all contacts |
Fielditems[].contactId |
Typenumber | Requiredyes | DescriptionContact ID. List: GET /v1/contacts |
Fielditems[].isPrimary |
Typeboolean | Requiredno | DescriptionPrimary contact of the deal. If no element has true, the first element of the array becomes primary; if several elements have true, the first of them does |
Fielditems[].sort |
Typenumber | Requiredno | DescriptionPosition of the contact in the list. If omitted, the value is assigned based on the element's position in the array |
Examples
curl — personal key
curl -X PUT "https://vibecode.bitrix24.com/v1/deals/8785/contacts" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"items": [
{ "contactId": 2925, "sort": 10 },
{ "contactId": 2921, "isPrimary": true, "sort": 20 }
]
}'
curl — OAuth application
curl -X PUT "https://vibecode.bitrix24.com/v1/deals/8785/contacts" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"items": [
{ "contactId": 2925, "sort": 10 },
{ "contactId": 2921, "isPrimary": true, "sort": 20 }
]
}'
JavaScript — personal key
const res = await fetch('https://vibecode.bitrix24.com/v1/deals/8785/contacts', {
method: 'PUT',
headers: {
'X-Api-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
items: [
{ contactId: 2925, sort: 10 },
{ contactId: 2921, isPrimary: true, sort: 20 },
],
}),
})
const { success, data } = await res.json()
console.log('Deal contacts:', data.length)
JavaScript — OAuth application
const res = await fetch('https://vibecode.bitrix24.com/v1/deals/8785/contacts', {
method: 'PUT',
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({
items: [
{ contactId: 2925, sort: 10 },
{ contactId: 2921, isPrimary: true, sort: 20 },
],
}),
})
const { success, data } = await res.json()
Response fields
| Field | Type | Description |
|---|---|---|
Fieldsuccess |
Typeboolean | DescriptionAlways true on success |
Fielddata |
Typearray | DescriptionAll links of the deal after the replacement, ordered by sort. An empty array after "items": [] |
Fielddata[].contactId |
Typenumber | DescriptionContact ID. Get the contact: GET /v1/contacts/:id |
Fielddata[].isPrimary |
Typeboolean | DescriptionPrimary contact of the deal. true on exactly one link |
Fielddata[].sort |
Typenumber | DescriptionPosition of the contact in the list |
Fielddata[].roleId |
Typenumber | DescriptionRole of the contact in the deal. The link methods do not save it |
Response example
{
"success": true,
"data": [
{ "contactId": 2925, "sort": 10, "isPrimary": false, "roleId": 0 },
{ "contactId": 2921, "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 its contactId is not a positive integer. The message names the element index: items[0] requires 'contactId' |
| HTTP404 | CodeENTITY_NOT_FOUND |
DescriptionNo deal with this id |
| HTTP401 | CodeMISSING_API_KEY |
DescriptionThe X-Api-Key header is missing |
| HTTP401 | CodeTOKEN_MISSING |
DescriptionNo Bitrix24 tokens are attached to the key |
| HTTP403 | CodeSCOPE_DENIED |
DescriptionThe key lacks the crm scope |
| HTTP403 | CodeWRITE_BLOCKED_READONLY_KEY |
DescriptionThe key is read-only. Replacing contacts 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
- Contact existence is not checked. An ID that matches no contact is linked without an error and appears in the deal's list of links. Before replacing, check the contacts with
GET /v1/contacts/:id. - The role is not saved. A
roleIdfield in anitemselement is accepted without an error but is not saved: the new link comes back withroleIdequal to0.