[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-timeline-logs\u002Fpins":3,"docs-tabs-timeline-logs\u002Fpins":6},{"content":4,"lastmod":5},"# Закрепления\n\nЗакрепление лог-записи в верхней части таймлайна CRM-сущности. Закреплённые записи всегда видны при открытии карточки сделки, лида, контакта или компании — независимо от того, сколько событий появилось позже.\n\nБитрикс24 API: `crm.timeline.item.pin\u002Funpin`\nСкоуп: `crm`\n\n## Операции\n\n- [Закрепить запись](.\u002Fpins\u002Fpin.md) — `POST \u002Fv1\u002Ftimeline-logs\u002F:id\u002Fpin`\n- [Открепить запись](.\u002Fpins\u002Funpin.md) — `POST \u002Fv1\u002Ftimeline-logs\u002F:id\u002Funpin`\n\n## Типовой сценарий\n\n1. Создать важную лог-запись: [`POST \u002Fv1\u002Ftimeline-logs`](\u002Fdocs\u002Ftimeline-logs\u002Flogs\u002Fcreate).\n2. Закрепить, чтобы она оставалась наверху: [`POST \u002Fv1\u002Ftimeline-logs\u002F:id\u002Fpin`](.\u002Fpins\u002Fpin.md). Менеджер увидит её каждый раз при открытии карточки.\n3. Когда событие потеряет актуальность — открепить: [`POST \u002Fv1\u002Ftimeline-logs\u002F:id\u002Funpin`](.\u002Fpins\u002Funpin.md).\n\n## Смотрите также\n\n- [Таймлайн CRM](\u002Fdocs\u002Ftimeline-logs) — обзор раздела\n- [Записи журнала](\u002Fdocs\u002Ftimeline-logs\u002Flogs) — создание записей, которые потом можно закреплять\n","2026-06-23",{"pins\u002Fpin.md":7,"pins\u002Funpin.md":8},"\n## Закрепить запись\n\n`POST \u002Fv1\u002Ftimeline-logs\u002F:id\u002Fpin`\n\nЗакрепляет лог-запись в верхней части таймлайна родительской CRM-сущности. Закреплённые записи всегда видны при открытии карточки — менеджеру не нужно скроллить историю, чтобы увидеть важное событие.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `id` (path) | number | да | ID лог-записи (или другого элемента таймлайна) |\n\n## Поля запроса (body)\n\n| Поле | Тип | Обяз. | Описание |\n|------|-----|:-----:|---------|\n| **`entityTypeId`** | number | да | Тип родительской CRM-сущности |\n| **`entityId`** | number | да | ID родительской записи |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimeline-logs\u002F5012\u002Fpin \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"entityTypeId\": 2, \"entityId\": 100 }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimeline-logs\u002F5012\u002Fpin \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"entityTypeId\": 2, \"entityId\": 100 }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimeline-logs\u002F5012\u002Fpin', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({ entityTypeId: 2, entityId: 100 }),\n})\n\nconst { success } = await res.json()\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimeline-logs\u002F5012\u002Fpin', {\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: 2, entityId: 100 }),\n})\n\nconst { success } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data.pinned` | boolean | Всегда `true` — подтверждение, что запись закреплена |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": { \"pinned\": true }\n}\n```\n\n## Пример ответа при ошибке\n\n400 — пропущены обязательные поля:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"Required body: entityTypeId, entityId (positive ints)\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | Не переданы или некорректны `entityTypeId` \u002F `entityId` либо `id` не положительное целое |\n| 404 | `ENTITY_NOT_FOUND` | Элемент таймлайна с указанным `id` не существует |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Закрепление работает не только для лог-записей.** Эндпоинт принимает `id` любого элемента таймлайна — включая комментарии пользователя из [`\u002Fv1\u002Ftimelines`](\u002Fdocs\u002Fentities\u002Ftimelines) и дела ([`\u002Fv1\u002Factivities`](\u002Fdocs\u002Fentities\u002Factivities)). Если знаете `id` комментария — его тоже можно закрепить через этот эндпоинт.\n\n**Повторный pin идемпотентен.** Закрепить уже закреплённую запись — операция тоже отдаст `200 + {pinned: true}`. Открепить запись — отдельный вызов [`POST \u002Funpin`](\u002Fdocs\u002Ftimeline-logs\u002Fpins\u002Funpin).\n\n**Закрепление не зависит от привязок.** Если запись привязана к нескольким сущностям через [`bind`](\u002Fdocs\u002Ftimeline-logs\u002Fbindings\u002Fbind), pin закрепляет её только в указанной паре `entityTypeId+entityId`. Чтобы закрепить во всех связанных карточках — отдельные вызовы pin для каждой.\n\n## Смотрите также\n\n- [Открепить запись](\u002Fdocs\u002Ftimeline-logs\u002Fpins\u002Funpin) — обратная операция\n- [Привязать к ещё одной сущности](\u002Fdocs\u002Ftimeline-logs\u002Fbindings\u002Fbind) — мультибиндинг с возможностью pin в каждой\n- [Создать запись](\u002Fdocs\u002Ftimeline-logs\u002Flogs\u002Fcreate) — создать перед закреплением\n","\n## Открепить запись\n\n`POST \u002Fv1\u002Ftimeline-logs\u002F:id\u002Funpin`\n\nСнимает закрепление с лог-записи. Запись остаётся в таймлайне, но больше не выделяется в верхней части карточки — отображается в общей хронологии.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `id` (path) | number | да | ID лог-записи (или другого элемента таймлайна) |\n\n## Поля запроса (body)\n\n| Поле | Тип | Обяз. | Описание |\n|------|-----|:-----:|---------|\n| **`entityTypeId`** | number | да | Тип родительской CRM-сущности |\n| **`entityId`** | number | да | ID родительской записи |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimeline-logs\u002F5012\u002Funpin \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"entityTypeId\": 2, \"entityId\": 100 }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimeline-logs\u002F5012\u002Funpin \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"entityTypeId\": 2, \"entityId\": 100 }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimeline-logs\u002F5012\u002Funpin', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({ entityTypeId: 2, entityId: 100 }),\n})\n\nconst { success } = await res.json()\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimeline-logs\u002F5012\u002Funpin', {\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: 2, entityId: 100 }),\n})\n\nconst { success } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data.pinned` | boolean | Всегда `false` — подтверждение, что запись больше не закреплена |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": { \"pinned\": false }\n}\n```\n\n## Пример ответа при ошибке\n\n400 — пропущены обязательные поля:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"Required body: entityTypeId, entityId (positive ints)\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | Не переданы или некорректны `entityTypeId` \u002F `entityId` либо `id` не положительное целое |\n| 404 | `ENTITY_NOT_FOUND` | Элемент таймлайна с указанным `id` не существует |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Идемпотентно.** Открепить незакреплённую запись — `200 + {pinned: false}`, без ошибки.\n\n**Не удаляет запись.** Это только снятие выделения, сама лог-запись остаётся в таймлайне. Чтобы убрать из истории — [`DELETE \u002Fv1\u002Ftimeline-logs\u002F:id`](\u002Fdocs\u002Ftimeline-logs\u002Flogs\u002Fdelete).\n\n## Смотрите также\n\n- [Закрепить запись](\u002Fdocs\u002Ftimeline-logs\u002Fpins\u002Fpin) — обратная операция\n- [Удалить запись](\u002Fdocs\u002Ftimeline-logs\u002Flogs\u002Fdelete) — убрать из таймлайна полностью\n"]