[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-timeline-logs\u002Fbindings\u002Fbind":3,"docs-tabs-timeline-logs\u002Fbindings\u002Fbind":6},{"content":4,"lastmod":5},"\n## Привязать запись\n\n`POST \u002Fv1\u002Ftimeline-logs\u002F:id\u002Fbind`\n\nПривязывает существующую лог-запись к дополнительной CRM-сущности — в её таймлайне появится та же запись. Используется, когда одно событие должно быть видно сразу в нескольких карточках: сделке, контакте, компании.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `id` (path) | number | да | ID лог-записи |\n\n## Поля запроса (body)\n\n| Поле | Тип | Обяз. | Описание |\n|------|-----|:-----:|---------|\n| **`entityId`** | number | да | ID сущности, к которой привязываем |\n| **`entityTypeId`** | number | да* | Числовой тип CRM-сущности. См. [Типы сущностей](\u002Fdocs\u002Ftimeline-logs#типы-родительских-сущностей) |\n| **`entityType`** | string | да* | Строковый код типа: `\"lead\"`, `\"deal\"`, `\"contact\"`, `\"company\"`, `\"quote\"`, `\"order\"`, `\"smart_invoice\"`, `\"dynamic_\u003CentityTypeId>\"` |\n\n*Передайте **либо** `entityTypeId`, **либо** `entityType` — Вайбкод сам подставит нужное в B24-вызов. Если переданы оба, `entityType` имеет приоритет.\n\n## Поддерживаемые типы\n\n| `entityTypeId` | `entityType` |\n|:---:|---|\n| 1 | `lead` |\n| 2 | `deal` |\n| 3 | `contact` |\n| 4 | `company` |\n| 7 | `quote` |\n| 14 | `order` |\n| 31 | `smart_invoice` |\n| ≥ 128 | `dynamic_\u003CentityTypeId>` (произвольный смарт-процесс) |\n\nЛюбой `entityTypeId` \u003C 128, отсутствующий в таблице, возвращает `400 INVALID_ENTITY_TYPE_ID`. Список смарт-процессов портала — [`GET \u002Fv1\u002Fsmart-processes`](\u002Fdocs\u002Fentities\u002Fsmart-processes\u002Flist).\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimeline-logs\u002F5012\u002Fbind \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"entityTypeId\": 3, \"entityId\": 50 }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimeline-logs\u002F5012\u002Fbind \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"entityTypeId\": 3, \"entityId\": 50 }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\n\u002F\u002F Привязать к контакту\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimeline-logs\u002F5012\u002Fbind', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({ entityTypeId: 3, entityId: 50 }),\n})\n\nconst { success } = await res.json()\n\n\u002F\u002F Альтернатива — указать тип строкой (полезно для смарт-процессов)\nawait fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimeline-logs\u002F5012\u002Fbind', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({ entityType: 'dynamic_174', entityId: 1 }),\n})\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimeline-logs\u002F5012\u002Fbind', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({ entityTypeId: 3, entityId: 50 }),\n})\n\nconst { success } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data.bound` | boolean | Всегда `true` — подтверждение привязки |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": { \"bound\": true }\n}\n```\n\n## Пример ответа при ошибке\n\n400 — `entityTypeId` без отображения на `ENTITY_TYPE`:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"INVALID_ENTITY_TYPE_ID\",\n    \"message\": \"entityTypeId=99 has no ENTITY_TYPE mapping. Use 1=lead, 2=deal, 3=contact, 4=company, 7=quote, 14=order, 31=smart_invoice, or ≥128 for smart-processes.\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | Не передан `entityId` или ни `entityTypeId`, ни `entityType` |\n| 400 | `INVALID_ENTITY_TYPE_ID` | `entityTypeId` \u003C 128 и нет в таблице маппинга |\n| 422 | `BITRIX_ERROR` | Битрикс24 отклонил запрос (например, `entityType` неизвестен или сущность не существует) |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Родительская сущность уже привязана автоматически.** При создании лог-записи через [`POST \u002Fv1\u002Ftimeline-logs`](\u002Fdocs\u002Ftimeline-logs\u002Flogs\u002Fcreate) для `entityTypeId+entityId` запись уже считается привязанной к этой паре. `bind` нужен только для **дополнительных** сущностей.\n\n**Регистр строкового `entityType` не важен.** Вайбкод приводит к нижнему регистру — `\"DEAL\"`, `\"Deal\"`, `\"deal\"` дают одинаковый результат. В ответах [`bindings.list`](\u002Fdocs\u002Ftimeline-logs\u002Fbindings\u002Flist) тип всегда возвращается в нижнем регистре.\n\n**Привязка к одной и той же паре идемпотентна на уровне B24.** Повторный `bind` к уже привязанной сущности — операция отдаст `200 + {bound: true}` без ошибки. В списке привязок дубликат не появится.\n\n**Нельзя привязать к произвольному типу.** Если в `entityType` передать что-то отсутствующее в B24-словаре (`\"random\"`, `\"foo\"`), B24 вернёт `ENTITY_TYPE is not defined or invalid.` — Вайбкод пробросит это как `422 BITRIX_ERROR`. Проверка списка типов на стороне Вайбкод идёт только по `entityTypeId`-маппингу.\n\n**Не валидирует существование `:id` лог-записи.** Если в пути передать `id` несуществующей лог-записи — `bind` всё равно вернёт `200 + {bound: true}` без ошибки. Привязка не создастся, потому что нет источника. Перед `bind` стоит убедиться, что лог-запись существует ([`GET \u002Fv1\u002Ftimeline-logs\u002F:id`](\u002Fdocs\u002Ftimeline-logs\u002Flogs\u002Fget)) или использовать `id`, только что вернувшийся из [`POST \u002Fv1\u002Ftimeline-logs`](\u002Fdocs\u002Ftimeline-logs\u002Flogs\u002Fcreate).\n\n## Смотрите также\n\n- [Отвязать](\u002Fdocs\u002Ftimeline-logs\u002Fbindings\u002Funbind) — обратная операция\n- [Список привязок](\u002Fdocs\u002Ftimeline-logs\u002Fbindings\u002Flist) — все сущности, к которым запись привязана\n- [Создать запись](\u002Fdocs\u002Ftimeline-logs\u002Flogs\u002Fcreate) — родительская сущность привязывается автоматически\n","2026-06-24",{}]