[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-timeline-logs\u002Fnotes":3,"docs-tabs-timeline-logs\u002Fnotes":6},{"content":4,"lastmod":5},"# Заметки\n\nТекстовая заметка, прикреплённая к одному элементу таймлайна. У каждого элемента таймлайна может быть **только одна** заметка — повторное сохранение перезаписывает предыдущую.\n\nБитрикс24 API: `crm.timeline.note.*`\nСкоуп: `crm`\n\n## Операции\n\n- [Сохранить заметку](.\u002Fnotes\u002Fsave.md) — `POST \u002Fv1\u002Ftimeline-logs\u002F:id\u002Fnote`\n- [Получить заметку](.\u002Fnotes\u002Fget.md) — `GET \u002Fv1\u002Ftimeline-logs\u002F:id\u002Fnote`\n- [Удалить заметку](.\u002Fnotes\u002Fdelete.md) — `DELETE \u002Fv1\u002Ftimeline-logs\u002F:id\u002Fnote`\n\n## Типовой сценарий\n\n1. Создать лог-запись или найти существующую: [`POST \u002Fv1\u002Ftimeline-logs`](\u002Fdocs\u002Ftimeline-logs\u002Flogs\u002Fcreate) \u002F [`GET \u002Fv1\u002Ftimeline-logs`](\u002Fdocs\u002Ftimeline-logs\u002Flogs\u002Flist).\n2. Прикрепить заметку с дополнительной информацией для менеджера: [`POST \u002Fv1\u002Ftimeline-logs\u002F:id\u002Fnote`](.\u002Fnotes\u002Fsave.md).\n3. При необходимости — обновить (тот же `POST` с новым текстом перезаписывает) или удалить ([`DELETE`](.\u002Fnotes\u002Fdelete.md)).\n\n## Смотрите также\n\n- [Таймлайн CRM](\u002Fdocs\u002Ftimeline-logs) — обзор раздела\n- [Записи журнала](\u002Fdocs\u002Ftimeline-logs\u002Flogs) — основная сущность, к которой крепятся заметки\n- [Закрепления](\u002Fdocs\u002Ftimeline-logs\u002Fpins) — закрепить запись с заметкой в верхней части таймлайна\n","2026-06-23",{"notes\u002Fsave.md":7,"notes\u002Fget.md":8,"notes\u002Fdelete.md":9},"\n## Сохранить заметку\n\n`POST \u002Fv1\u002Ftimeline-logs\u002F:id\u002Fnote`\n\nСохраняет заметку к одному элементу таймлайна. У каждого элемента таймлайна может быть только одна заметка — повторный вызов с тем же `:id` перезаписывает предыдущий текст.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `id` (path) | number | да | ID лог-записи (или другого элемента таймлайна), к которому прикрепляем заметку |\n\n## Поля запроса (body)\n\n| Поле | Тип | Обяз. | По умолч. | Описание |\n|------|-----|:-----:|-----------|---------|\n| **`entityTypeId`** | number | да | — | Тип родительской CRM-сущности — той, в чьём таймлайне находится элемент. См. [Типы сущностей](\u002Fdocs\u002Ftimeline-logs#типы-родительских-сущностей) |\n| **`entityId`** | number | да | — | ID родительской записи |\n| **`text`** | string | да | — | Текст заметки. Перезапишет существующую заметку, если она есть |\n| `itemType` | number | нет | `1` | Тип элемента: `1` — запись истории таймлайна (включая лог-записи), `2` — дело (см. [`\u002Fv1\u002Factivities`](\u002Fdocs\u002Fentities\u002Factivities)) |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimeline-logs\u002F5012\u002Fnote \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"entityTypeId\": 2,\n    \"entityId\": 100,\n    \"text\": \"Клиент обычно отвечает в течение 2 дней.\"\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimeline-logs\u002F5012\u002Fnote \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"entityTypeId\": 2,\n    \"entityId\": 100,\n    \"text\": \"Клиент обычно отвечает в течение 2 дней.\"\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimeline-logs\u002F5012\u002Fnote', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    entityTypeId: 2,\n    entityId: 100,\n    text: 'Клиент обычно отвечает в течение 2 дней.',\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimeline-logs\u002F5012\u002Fnote', {\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({\n    entityTypeId: 2,\n    entityId: 100,\n    text: 'Клиент обычно отвечает в течение 2 дней.',\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data.saved` | boolean | Всегда `true` — подтверждение операции |\n\n## Пример ответа\n\nHTTP 201:\n\n```json\n{\n  \"success\": true,\n  \"data\": { \"saved\": 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 (positive int), entityId (positive int), text (string). Optional: itemType (default 1)\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | Не передан или некорректен `entityTypeId` \u002F `entityId` \u002F `text`, либо `itemType` не равен 1 или 2 |\n| 422 | `BITRIX_ERROR` | Битрикс24 отклонил запрос (например, item с указанным `id` не существует) |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Один вызов создаёт или обновляет.** Если у элемента нет заметки — создастся; если есть — текст перезапишется. Отдельного метода для обновления нет, повторный `POST` с новым текстом и есть «обновление».\n\n**Не валидирует существование `:id` лог-записи.** Если передать `id` несуществующей записи — `save` всё равно вернёт `201 + {saved: true}`. Заметка реально не привяжется — при попытке прочитать через [`GET \u002F:id\u002Fnote`](\u002Fdocs\u002Ftimeline-logs\u002Fnotes\u002Fget) ответом будет `404 ENTITY_NOT_FOUND`. Перед `save` убедитесь, что лог-запись существует.\n\n**`itemType: 1` подходит для лог-записей и комментариев таймлайна.** Используйте `itemType: 2` только если работаете с делом из [`\u002Fv1\u002Factivities`](\u002Fdocs\u002Fentities\u002Factivities).\n\n**Заметка и лог-запись — разные понятия.** Лог-запись — самостоятельный элемент в истории таймлайна (создаётся через [`POST \u002Fv1\u002Ftimeline-logs`](\u002Fdocs\u002Ftimeline-logs\u002Flogs\u002Fcreate)). Заметка — короткий комментарий, прикреплённый к элементу. У одного элемента максимум одна заметка.\n\n**Заметку нельзя получить без `entityTypeId` + `entityId`.** Несмотря на то что заметка привязана к конкретному `itemId`, B24 требует контекст родительской сущности при чтении и удалении. Сохраняйте эти параметры при создании.\n\n## Смотрите также\n\n- [Получить заметку](\u002Fdocs\u002Ftimeline-logs\u002Fnotes\u002Fget) — прочитать текст и автора\n- [Удалить заметку](\u002Fdocs\u002Ftimeline-logs\u002Fnotes\u002Fdelete) — параметры передаются в query, не в body\n- [Создать лог-запись](\u002Fdocs\u002Ftimeline-logs\u002Flogs\u002Fcreate) — основной элемент, к которому крепится заметка\n- [Закрепить запись](\u002Fdocs\u002Ftimeline-logs\u002Fpins\u002Fpin) — выделить запись с заметкой в верхней части таймлайна\n","\n## Получить заметку\n\n`GET \u002Fv1\u002Ftimeline-logs\u002F:id\u002Fnote`\n\nВозвращает заметку, прикреплённую к одному элементу таймлайна. Если заметки нет — `404 NOTE_NOT_FOUND`.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | По умолч. | Описание |\n|----------|-----|:-----:|-----------|---------|\n| `id` (path) | number | да | — | ID лог-записи (или другого элемента таймлайна) |\n| `entityTypeId` (query) | number | да | — | Тип родительской CRM-сущности |\n| `entityId` (query) | number | да | — | ID родительской записи |\n| `itemType` (query) | number | нет | `1` | `1` — запись истории, `2` — дело |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimeline-logs\u002F5012\u002Fnote?entityTypeId=2&entityId=100\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimeline-logs\u002F5012\u002Fnote?entityTypeId=2&entityId=100\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch(\n  'https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimeline-logs\u002F5012\u002Fnote?entityTypeId=2&entityId=100',\n  { headers: { 'X-Api-Key': 'YOUR_API_KEY' } },\n)\n\nconst { success, data } = await res.json()\nconsole.log(data.text)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch(\n  'https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimeline-logs\u002F5012\u002Fnote?entityTypeId=2&entityId=100',\n  {\n    headers: {\n      'X-Api-Key': 'YOUR_APP_KEY',\n      'Authorization': 'Bearer USER_SESSION_TOKEN',\n    },\n  },\n)\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `text` | string | Текст заметки |\n| `createdBy` | number | ID пользователя, создавшего заметку. Данные пользователя по ID: `GET \u002Fv1\u002Fusers\u002F:id` |\n| `createdAt` | datetime | Дата создания, ISO 8601 с таймзоной портала |\n| `updatedBy` | number | ID пользователя, последним обновившего заметку |\n| `updatedAt` | datetime | Дата последнего обновления |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"text\": \"Клиент обычно отвечает в течение 2 дней.\",\n    \"createdBy\": 1,\n    \"createdAt\": \"2026-04-27T10:05:00+03:00\",\n    \"updatedBy\": 1,\n    \"updatedAt\": \"2026-04-27T10:05:00+03:00\"\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n404 — у элемента нет заметки:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"NOTE_NOT_FOUND\",\n    \"message\": \"No note attached to this timeline item\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | Не переданы или некорректны `entityTypeId` \u002F `entityId`, либо `itemType` не равен 1 или 2 |\n| 404 | `NOTE_NOT_FOUND` | Элемент таймлайна существует, но у него нет привязанной заметки |\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**`itemType` нужен в каждом запросе, даже на чтение.** Заметка идентифицируется не одним `itemId`, а тройкой родительских координат: `entityTypeId` + `entityId` + `itemType` + `itemId`. Если `itemType` опустить, Вайбкод подставит `1` (запись истории таймлайна) — в большинстве случаев это и нужно.\n\n**Различение «нет заметки» от «не нашёл элемент».** Эндпоинт возвращает `404 NOTE_NOT_FOUND` и в случае «у элемента нет заметки», и в случае «элемента с таким `id` не существует». Чтобы проверить, существует ли сам элемент таймлайна — используйте [`GET \u002Fv1\u002Ftimeline-logs\u002F:id`](\u002Fdocs\u002Ftimeline-logs\u002Flogs\u002Fget).\n\n## Смотрите также\n\n- [Сохранить заметку](\u002Fdocs\u002Ftimeline-logs\u002Fnotes\u002Fsave) — создать или обновить\n- [Удалить заметку](\u002Fdocs\u002Ftimeline-logs\u002Fnotes\u002Fdelete) — параметры передаются в query\n- [Получить лог-запись](\u002Fdocs\u002Ftimeline-logs\u002Flogs\u002Fget) — родительский item для заметки\n","\n## Удалить заметку\n\n`DELETE \u002Fv1\u002Ftimeline-logs\u002F:id\u002Fnote`\n\nУдаляет заметку, прикреплённую к элементу таймлайна. Параметры передаются в **query string**, не в теле запроса.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | По умолч. | Описание |\n|----------|-----|:-----:|-----------|---------|\n| `id` (path) | number | да | — | ID лог-записи (или другого элемента таймлайна) |\n| `entityTypeId` (query) | number | да | — | Тип родительской CRM-сущности |\n| `entityId` (query) | number | да | — | ID родительской записи |\n| `itemType` (query) | number | нет | `1` | `1` — запись истории, `2` — дело |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X DELETE \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimeline-logs\u002F5012\u002Fnote?entityTypeId=2&entityId=100\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X DELETE \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimeline-logs\u002F5012\u002Fnote?entityTypeId=2&entityId=100\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch(\n  'https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimeline-logs\u002F5012\u002Fnote?entityTypeId=2&entityId=100',\n  {\n    method: 'DELETE',\n    headers: { 'X-Api-Key': 'YOUR_API_KEY' },\n  },\n)\n\nconst { success, data } = await res.json()\nif (success) console.log('Заметка удалена')\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch(\n  'https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Ftimeline-logs\u002F5012\u002Fnote?entityTypeId=2&entityId=100',\n  {\n    method: 'DELETE',\n    headers: {\n      'X-Api-Key': 'YOUR_APP_KEY',\n      'Authorization': 'Bearer USER_SESSION_TOKEN',\n    },\n  },\n)\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data.deleted` | boolean | Всегда `true` — подтверждение операции |\n\n## Пример ответа\n\nHTTP 200:\n\n```json\n{\n  \"success\": true,\n  \"data\": { \"deleted\": true }\n}\n```\n\n## Пример ответа при ошибке\n\n400 — параметры переданы в body вместо query:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"Required query: entityTypeId, entityId (positive ints). Optional: itemType (default 1)\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | Параметры не переданы, переданы некорректно или передан body вместо query |\n| 422 | `BITRIX_ERROR` | Битрикс24 отклонил запрос |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `crm` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Не путать с `DELETE \u002Fv1\u002Ftimeline-logs\u002F:id`.** Там удаляется лог-запись целиком, параметров нет вообще. Здесь — удаление только заметки у элемента, нужны `entityTypeId` + `entityId`.\n\n**Идемпотентность не гарантирована.** Повторное удаление уже удалённой заметки может вернуть ошибку. Если важно сделать вызов идемпотентным — сначала проверьте через [`GET \u002Fv1\u002Ftimeline-logs\u002F:id\u002Fnote`](\u002Fdocs\u002Ftimeline-logs\u002Fnotes\u002Fget): `404 NOTE_NOT_FOUND` означает «уже нет, удалять нечего».\n\n**Не валидирует существование `:id` лог-записи.** На несуществующий `id` `delete` тоже возвращает `200 + {deleted: true}` без ошибки — silently no-op. Тоже стоит сначала проверить через `GET`.\n\n**Удаление заметки доступно любому ключу.** В отличие от `DELETE \u002Fv1\u002Ftimeline-logs\u002F:id` (где работает только тот же OAuth-ключ, который создал лог-запись), удаление заметки работает с любого ключа — независимо от того, кто её создал.\n\n## Смотрите также\n\n- [Получить заметку](\u002Fdocs\u002Ftimeline-logs\u002Fnotes\u002Fget) — проверить существование перед удалением\n- [Сохранить заметку](\u002Fdocs\u002Ftimeline-logs\u002Fnotes\u002Fsave) — создать заново после удаления\n- [Удалить лог-запись](\u002Fdocs\u002Ftimeline-logs\u002Flogs\u002Fdelete) — удалить родительский item целиком (заметка удалится вместе с ним)\n"]