[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-telephony\u002Fcrm":3,"docs-tabs-telephony\u002Fcrm":6},{"content":4,"lastmod":5},"# Звонки в CRM\n\nРегистрация входящих и исходящих внешних звонков в CRM Битрикс24, отображение карточки звонка оператору, завершение со статусом и длительностью, прикрепление текстовой транскрипции диалога.\n\nBitrix24 API: `telephony.externalcall.*`, `telephony.call.attachTranscription`\nСкоуп: `telephony`\n\n## Операции\n\n- [Зарегистрировать звонок](.\u002Fcrm\u002Fregister.md) — `POST \u002Fv1\u002Fcalls\u002Fregister`\n- [Завершить звонок](.\u002Fcrm\u002Ffinish.md) — `POST \u002Fv1\u002Fcalls\u002F:callId\u002Ffinish`\n- [Показать карточку](.\u002Fcrm\u002Fshow.md) — `POST \u002Fv1\u002Fcalls\u002F:callId\u002Fshow`\n- [Скрыть карточку](.\u002Fcrm\u002Fhide.md) — `POST \u002Fv1\u002Fcalls\u002F:callId\u002Fhide`\n- [Прикрепить транскрипцию](.\u002Fcrm\u002Ftranscription.md) — `POST \u002Fv1\u002Fcalls\u002F:callId\u002Ftranscription`\n\n## Типовой сценарий\n\n1. Входящий звонок поступил во внешнюю АТС → `POST \u002Fv1\u002Fcalls\u002Fregister` с `crmCreate: true` создаёт лид, если номер не найден в CRM. В ответе — `CALL_ID` и `CRM_ENTITY_ID`.\n2. Карточка показывается оператору: `POST \u002Fv1\u002Fcalls\u002F:callId\u002Fshow`.\n3. Звонок завершается: `POST \u002Fv1\u002Fcalls\u002F:callId\u002Ffinish` с длительностью и кодом результата.\n4. После распознавания речи прикрепляется транскрипция: `POST \u002Fv1\u002Fcalls\u002F:callId\u002Ftranscription` со списком реплик.\n\n## Смотрите также\n\n- [Телефония — обзор](..\u002Ftelephony.md)\n- [Линии](.\u002Flines.md) — линии для параметра `lineNumber` в register\n- [Исходящие звонки](.\u002Foutbound.md) — для инициации звонков через API\n","2026-06-23",{"crm\u002Fregister.md":7,"crm\u002Ffinish.md":8,"crm\u002Fshow.md":9,"crm\u002Fhide.md":10,"crm\u002Ftranscription.md":11},"\n## Зарегистрировать звонок\n\n`POST \u002Fv1\u002Fcalls\u002Fregister`\n\nРегистрирует входящий или исходящий звонок в Битрикс24 CRM. При `crmCreate: true` создаёт лид, если номер телефона не найден среди существующих сущностей. Возвращает `callId` для всех последующих операций со звонком.\n\n## Поля запроса (body)\n\n| Параметр | Тип | Обяз. | По умолч. | Описание |\n|----------|-----|:-----:|-----------|---------|\n| `userId` | number | да | — | ID пользователя Битрикс24, принимающего звонок. [Список пользователей](\u002Fdocs\u002Fentities\u002Fusers) |\n| `phoneNumber` | string | да | — | Номер телефона звонящего в международном формате |\n| `type` | number | нет | — | Направление: `1` — исходящий, `2` — входящий, `3` — входящий с перенаправлением, `4` — обратный звонок, `5` — информационный |\n| `lineNumber` | string | нет | — | Номер внешней линии приложения. [Список линий](\u002Fdocs\u002Ftelephony\u002Flines\u002Flist) |\n| `crmCreate` | boolean | нет | `false` | `true` — создать лид, если номер не найден в CRM |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalls\u002Fregister \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"userId\": 1,\n    \"phoneNumber\": \"+79161234567\",\n    \"type\": 2,\n    \"crmCreate\": true\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalls\u002Fregister \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"userId\": 1,\n    \"phoneNumber\": \"+79161234567\",\n    \"type\": 2,\n    \"crmCreate\": true\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalls\u002Fregister', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    userId: 1,\n    phoneNumber: '+79161234567',\n    type: 2,\n    crmCreate: true,\n  }),\n})\n\nconst { success, data } = await res.json()\nconst callId = data.callId\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalls\u002Fregister', {\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    userId: 1,\n    phoneNumber: '+79161234567',\n    type: 2,\n    crmCreate: true,\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `callId` | string | Идентификатор звонка для всех последующих операций |\n| `crmCreatedLead` | number \\| null | ID созданного лида. `null`, если лид не создан |\n| `crmCreatedEntities` | array | Массив созданных CRM-сущностей `[{entityType, entityId}]` |\n| `crmEntityType` | string | Тип привязанной CRM-сущности: `LEAD`, `CONTACT`, `COMPANY` или пустая строка |\n| `crmEntityId` | number \\| null | ID привязанной CRM-сущности. `null`, если сущность не привязана |\n\n## Пример ответа\n\nHTTP 201 — звонок зарегистрирован, создан новый лид:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"callId\": \"externalCall.00b1e735843c558431be668e3687a58b.1777974304\",\n    \"crmCreatedLead\": 1001069,\n    \"crmCreatedEntities\": [{\"entityType\": \"LEAD\", \"entityId\": 1001069}],\n    \"crmEntityType\": \"LEAD\",\n    \"crmEntityId\": 1001069\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n400 — не переданы обязательные параметры:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"MISSING_PARAMS\",\n    \"message\": \"Required: userId (number), phoneNumber (string)\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `MISSING_PARAMS` | Не передан `userId` или `phoneNumber` |\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Неверный API-ключ |\n| 401 | `TOKEN_MISSING` | Ключ не имеет настроенных токенов Битрикс24 |\n| 401 | `KEY_INACTIVE` | API-ключ неактивен или отозван |\n| 403 | `SCOPE_DENIED` | Ключу не хватает скоупа `telephony` |\n| 422 | `BITRIX_ERROR` | Битрикс24 вернул ошибку (текст в `error.message`) |\n| 429 | `RATE_LIMITED` | Превышен лимит запросов |\n| 502 | `BITRIX_UNAVAILABLE` | Битрикс24 недоступен |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Поиск существующей CRM-сущности при `crmCreate: true`.** Битрикс24 сначала ищет лид, контакт или компанию с совпадающим номером телефона. При нахождении `crmEntityId` указывает на существующую сущность, а `crmCreatedLead` остаётся `null`. Новый лид создаётся только если совпадений нет.\n\n**`CRM_*` поля пустые при `crmCreate: false`.** Привязка к CRM может произойти автоматически при завершении через [`POST \u002Fv1\u002Fcalls\u002F:callId\u002Ffinish`](.\u002Ffinish.md), если Битрикс24 найдёт совпадение по номеру в момент завершения.\n\n**`callId` — обязательный параметр для всех следующих шагов.** Сохраните его сразу: все операции `show`, `hide`, `finish`, `transcription` принимают `callId` в пути запроса.\n\n## Смотрите также\n\n- [Завершить звонок](.\u002Ffinish.md)\n- [Показать карточку](.\u002Fshow.md)\n- [Скрыть карточку](.\u002Fhide.md)\n- [Прикрепить транскрипцию](.\u002Ftranscription.md)\n- [Лиды](\u002Fdocs\u002Fentities\u002Fleads) — сущности, создаваемые при `crmCreate: true`\n- [Контакты](\u002Fdocs\u002Fentities\u002Fcontacts) — альтернативная привязка по номеру телефона\n- [Линии](\u002Fdocs\u002Ftelephony\u002Flines) — источник значений для `lineNumber`\n","\n## Завершить звонок\n\n`POST \u002Fv1\u002Fcalls\u002F:callId\u002Ffinish`\n\nЗавершает зарегистрированный звонок: фиксирует длительность и итоговый статус, создаёт дело в связанной CRM-сущности. Вызывайте после окончания разговора, до прикрепления транскрипции.\n\n## Параметры\n\n| Параметр | В | Тип | Обяз. | Описание |\n|----------|---|-----|:-----:|---------|\n| `callId` | path | string | да | `callId` из ответа [`POST \u002Fv1\u002Fcalls\u002Fregister`](.\u002Fregister.md) |\n\n## Поля запроса (body)\n\n| Параметр | Тип | Обяз. | По умолч. | Описание |\n|----------|-----|:-----:|-----------|---------|\n| `userId` | number | да | — | ID пользователя Битрикс24, завершившего звонок. [Список пользователей](\u002Fdocs\u002Fentities\u002Fusers) |\n| `duration` | number | да | — | Длительность звонка в секундах |\n| `statusCode` | string | нет | `\"200\"` при duration > 0, иначе `\"304\"` | Код завершения: `\"200\"` успешно, `\"304\"` пропущен, `\"403\"` запрещено, `\"486\"` занято, `\"603\"` отклонён, `\"603-S\"` отменён клиентом, `\"402\"` нет средств, `\"404\"` неверный номер, `\"423\"` заблокирован, `\"480\"` временно недоступен, `\"484\"` \u002F `\"503\"` недоступное направление, `\"OTHER\"` |\n| `add_to_chat` | boolean | нет | — | Добавить событие о звонке в чат сотрудника |\n| `vote` | number | нет | — | Оценка звонка: `1`–`5`. Попадает в поле `CALL_VOTE` («Оценка», звёздочки) раздела [Статистика звонков](\u002Fdocs\u002Ftelephony\u002Fanalytics\u002Fstatistics). Допускается также UPPER-форма `VOTE` |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalls\u002FCALL_ID\u002Ffinish \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"userId\": 1,\n    \"duration\": 120,\n    \"statusCode\": \"200\"\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalls\u002FCALL_ID\u002Ffinish \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"userId\": 1,\n    \"duration\": 120,\n    \"statusCode\": \"200\"\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst callId = 'externalCall.00b1e735843c558431be668e3687a58b.1777974304'\n\nconst res = await fetch(`https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalls\u002F${callId}\u002Ffinish`, {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    userId: 1,\n    duration: 120,\n    statusCode: '200',\n  }),\n})\n\nconst { success, data } = await res.json()\nconsole.log('Дело:', data.crmActivityId)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst callId = 'externalCall.00b1e735843c558431be668e3687a58b.1777974304'\n\nconst res = await fetch(`https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalls\u002F${callId}\u002Ffinish`, {\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    userId: 1,\n    duration: 120,\n    statusCode: '200',\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `callId` | string | Идентификатор звонка |\n| `externalCallId` | string \\| null | Внешний идентификатор, переданный при регистрации |\n| `portalUserId` | number | ID пользователя Битрикс24 |\n| `phoneNumber` | string | Номер телефона |\n| `portalNumber` | string | Номер линии на портале |\n| `incoming` | string | Тип звонка: `\"1\"` — исходящий, `\"2\"` — входящий, `\"3\"` — входящий с перенаправлением, `\"4\"` — обратный звонок, `\"5\"` — информационный |\n| `callDuration` | number | Длительность в секундах |\n| `callStartDate` | object | Дата начала звонка. Возвращается как пустой объект `{}` — см. [особенности](#известные-особенности) |\n| `callStatus` | number | Статус завершения |\n| `callVote` | number | Оценка звонка |\n| `cost` | number | Стоимость звонка |\n| `costCurrency` | string | Валюта стоимости |\n| `callFailedCode` | string | Переданный `statusCode` |\n| `callFailedReason` | string | Текстовое описание причины завершения |\n| `restAppId` | number \\| null | ID приложения |\n| `restAppName` | string \\| false | Имя приложения |\n| `crmActivityId` | number \\| false | ID созданного дела. `false`, если сущность не привязана |\n| `comment` | string \\| null | Комментарий к звонку |\n| `id` | number | Внутренний ID записи о звонке |\n| `ERRORS` | object \\| null | Ошибки, не прервавшие завершение (например `ACTIVITY_CREATION`) |\n| `crmEntityType` | string | Тип привязанной CRM-сущности (только при наличии привязки) |\n| `crmEntityId` | number | ID привязанной CRM-сущности (только при наличии привязки) |\n\n## Пример ответа\n\nHTTP 200 — звонок завершён, дело создано:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"callId\": \"externalCall.00b1e735843c558431be668e3687a58b.1777974304\",\n    \"externalCallId\": null,\n    \"portalUserId\": 1,\n    \"phoneNumber\": \"+79161234567\",\n    \"portalNumber\": \"REST_APP:\",\n    \"incoming\": \"2\",\n    \"callDuration\": 120,\n    \"callStartDate\": {},\n    \"callStatus\": 1,\n    \"callVote\": 0,\n    \"cost\": 0,\n    \"costCurrency\": \"\",\n    \"callFailedCode\": \"200\",\n    \"callFailedReason\": \"\",\n    \"restAppId\": null,\n    \"restAppName\": false,\n    \"crmActivityId\": 7995,\n    \"comment\": null,\n    \"crmEntityType\": \"LEAD\",\n    \"crmEntityId\": 1001069,\n    \"id\": 61\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n400 — не переданы обязательные параметры:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"MISSING_PARAMS\",\n    \"message\": \"Required: userId (number), duration (number, seconds)\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `MISSING_PARAMS` | Не передан `userId` или `duration` |\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Неверный API-ключ |\n| 401 | `TOKEN_MISSING` | Ключ не имеет настроенных токенов Битрикс24 |\n| 401 | `KEY_INACTIVE` | API-ключ неактивен или отозван |\n| 403 | `SCOPE_DENIED` | Ключу не хватает скоупа `telephony` |\n| 422 | `BITRIX_ERROR` | Битрикс24 вернул ошибку (текст в `error.message`) |\n| 429 | `RATE_LIMITED` | Превышен лимит запросов |\n| 502 | `BITRIX_UNAVAILABLE` | Битрикс24 недоступен |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**`callStartDate` всегда возвращается как пустой объект `{}`.** Реальную дату начала звонка смотрите в [статистике](\u002Fdocs\u002Ftelephony\u002Fanalytics\u002Fstatistics).\n\n**`CRM_ACTIVITY_ID: false` при отсутствии привязки.** В поле `ERRORS.ACTIVITY_CREATION` возвращается текстовое описание причины. Звонок при этом считается завершённым.\n\n**Значение `statusCode` влияет на метку в CRM.** Явная передача позволяет зафиксировать причину завершения независимо от длительности.\n\n## Смотрите также\n\n- [Зарегистрировать звонок](.\u002Fregister.md)\n- [Прикрепить транскрипцию](.\u002Ftranscription.md)\n- [Показать карточку](.\u002Fshow.md)\n- [Статистика звонков](\u002Fdocs\u002Ftelephony\u002Fanalytics\u002Fstatistics) — дата начала и другие поля\n- [Лиды](\u002Fdocs\u002Fentities\u002Fleads) — CRM-сущность, создаваемая при регистрации\n- [Контакты](\u002Fdocs\u002Fentities\u002Fcontacts) — CRM-сущность, к которой может быть привязан звонок\n- [Сделки](\u002Fdocs\u002Fentities\u002Fdeals) — звонок попадает в таймлайн связанной сделки\n","\n## Показать карточку звонка\n\n`POST \u002Fv1\u002Fcalls\u002F:callId\u002Fshow`\n\nОтображает карточку активного звонка поверх открытых окон Битрикс24 у указанного пользователя. Вызывайте после [`POST \u002Fv1\u002Fcalls\u002Fregister`](.\u002Fregister.md), пока звонок не завершён.\n\n## Параметры\n\n| Параметр | В | Тип | Обяз. | Описание |\n|----------|---|-----|:-----:|---------|\n| `callId` | path | string | да | `CALL_ID` из ответа [`POST \u002Fv1\u002Fcalls\u002Fregister`](.\u002Fregister.md) |\n\n## Поля запроса (body)\n\n| Параметр | Тип | Обяз. | По умолч. | Описание |\n|----------|-----|:-----:|-----------|---------|\n| `userId` | number | да | — | ID пользователя Битрикс24, которому показывается карточка. [Список пользователей](\u002Fdocs\u002Fentities\u002Fusers) |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalls\u002FCALL_ID\u002Fshow \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"userId\": 1}'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalls\u002FCALL_ID\u002Fshow \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"userId\": 1}'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst callId = 'externalCall.00b1e735843c558431be668e3687a58b.1777974304'\n\nconst res = await fetch(`https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalls\u002F${callId}\u002Fshow`, {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({ userId: 1 }),\n})\n\nconst { success, data } = await res.json()\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst callId = 'externalCall.00b1e735843c558431be668e3687a58b.1777974304'\n\nconst res = await fetch(`https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalls\u002F${callId}\u002Fshow`, {\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({ userId: 1 }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `data` | boolean | `true` — карточка показана успешно; `false` — карточка не показана (звонок не найден или уже завершён) |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": true\n}\n```\n\n## Пример ответа при ошибке\n\n400 — не передан обязательный параметр:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"MISSING_PARAMS\",\n    \"message\": \"Required: userId (number)\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `MISSING_PARAMS` | Не передан `userId` |\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Неверный API-ключ |\n| 401 | `TOKEN_MISSING` | Ключ не имеет настроенных токенов Битрикс24 |\n| 401 | `KEY_INACTIVE` | API-ключ неактивен или отозван |\n| 403 | `SCOPE_DENIED` | Ключу не хватает скоупа `telephony` |\n| 422 | `BITRIX_ERROR` | Битрикс24 вернул ошибку (текст в `error.message`) |\n| 429 | `RATE_LIMITED` | Превышен лимит запросов |\n| 502 | `BITRIX_UNAVAILABLE` | Битрикс24 недоступен |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Признак успеха — поле `data`, не HTTP-статус.** При несуществующем или уже завершённом `callId` Битрикс24 возвращает `HTTP 200` с `data: false`. Проверяйте значение поля, а не код ответа.\n\n**`userId` не обязан совпадать с тем, кто регистрировал звонок.** Карточку можно показать любому пользователю портала — например, супервизору или замещающему оператору.\n\n## Смотрите также\n\n- [Зарегистрировать звонок](.\u002Fregister.md)\n- [Скрыть карточку](.\u002Fhide.md)\n- [Завершить звонок](.\u002Ffinish.md)\n","\n## Скрыть карточку звонка\n\n`POST \u002Fv1\u002Fcalls\u002F:callId\u002Fhide`\n\nУбирает карточку активного звонка поверх открытых окон Битрикс24 у указанного пользователя. Симметричен [`POST \u002Fv1\u002Fcalls\u002F:callId\u002Fshow`](.\u002Fshow.md).\n\n## Параметры\n\n| Параметр | В | Тип | Обяз. | Описание |\n|----------|---|-----|:-----:|---------|\n| `callId` | path | string | да | `CALL_ID` из ответа [`POST \u002Fv1\u002Fcalls\u002Fregister`](.\u002Fregister.md) |\n\n## Поля запроса (body)\n\n| Параметр | Тип | Обяз. | По умолч. | Описание |\n|----------|-----|:-----:|-----------|---------|\n| `userId` | number | да | — | ID пользователя Битрикс24, у которого скрывается карточка. [Список пользователей](\u002Fdocs\u002Fentities\u002Fusers) |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalls\u002FCALL_ID\u002Fhide \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"userId\": 1}'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalls\u002FCALL_ID\u002Fhide \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"userId\": 1}'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst callId = 'externalCall.00b1e735843c558431be668e3687a58b.1777974304'\n\nconst res = await fetch(`https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalls\u002F${callId}\u002Fhide`, {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({ userId: 1 }),\n})\n\nconst { success, data } = await res.json()\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst callId = 'externalCall.00b1e735843c558431be668e3687a58b.1777974304'\n\nconst res = await fetch(`https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalls\u002F${callId}\u002Fhide`, {\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({ userId: 1 }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `data` | boolean | `true` — карточка скрыта успешно; `false` — карточка не найдена (звонок не существует или уже завершён) |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": true\n}\n```\n\n## Пример ответа при ошибке\n\n400 — не передан обязательный параметр:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"MISSING_PARAMS\",\n    \"message\": \"Required: userId (number)\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `MISSING_PARAMS` | Не передан `userId` |\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Неверный API-ключ |\n| 401 | `TOKEN_MISSING` | Ключ не имеет настроенных токенов Битрикс24 |\n| 401 | `KEY_INACTIVE` | API-ключ неактивен или отозван |\n| 403 | `SCOPE_DENIED` | Ключу не хватает скоупа `telephony` |\n| 422 | `BITRIX_ERROR` | Битрикс24 вернул ошибку (текст в `error.message`) |\n| 429 | `RATE_LIMITED` | Превышен лимит запросов |\n| 502 | `BITRIX_UNAVAILABLE` | Битрикс24 недоступен |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Признак успеха — поле `data`, не HTTP-статус.** При несуществующем `callId` Битрикс24 возвращает `HTTP 200` с `data: false`. Проверяйте значение поля, а не код ответа.\n\n**`userId` не обязан совпадать с тем, кто регистрировал звонок.** Карточку можно скрыть у любого пользователя портала.\n\n## Смотрите также\n\n- [Показать карточку](.\u002Fshow.md)\n- [Зарегистрировать звонок](.\u002Fregister.md)\n- [Завершить звонок](.\u002Ffinish.md)\n","\n## Прикрепить транскрипцию\n\n`POST \u002Fv1\u002Fcalls\u002F:callId\u002Ftranscription`\n\nПрикрепляет текстовую транскрипцию диалога к завершённому звонку в Битрикс24. Звонок должен быть предварительно завершён через [`POST \u002Fv1\u002Fcalls\u002F:callId\u002Ffinish`](.\u002Ffinish.md).\n\n## Параметры\n\n| Параметр | В | Тип | Обяз. | Описание |\n|----------|---|-----|:-----:|---------|\n| `callId` | path | string | да | `callId` из ответа [`POST \u002Fv1\u002Fcalls\u002Fregister`](.\u002Fregister.md) |\n\n## Поля запроса (body)\n\n| Параметр | Тип | Обяз. | По умолч. | Описание |\n|----------|-----|:-----:|-----------|---------|\n| `messages` | array | да | — | Массив реплик диалога. Каждый элемент: `{side, startTime, stopTime, message}`. Не может быть пустым |\n| `messages[].side` | string | да | — | Сторона диалога: `\"User\"` — оператор, `\"Client\"` — клиент |\n| `messages[].startTime` | number | да | — | Время начала реплики в секундах от начала записи (≥ 0) |\n| `messages[].stopTime` | number | да | — | Время окончания реплики в секундах (> 0) |\n| `messages[].message` | string | да | — | Текст реплики (непустая строка) |\n| `cost` | number | нет | — | Стоимость распознавания |\n| `costCurrency` | string | нет | — | Валюта стоимости (например `\"RUB\"`) |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalls\u002FCALL_ID\u002Ftranscription \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"messages\": [\n      {\"side\": \"User\", \"startTime\": 0, \"stopTime\": 3, \"message\": \"Здравствуйте, чем могу помочь?\"},\n      {\"side\": \"Client\", \"startTime\": 4, \"stopTime\": 9, \"message\": \"Здравствуйте, хотел уточнить статус заказа\"}\n    ]\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalls\u002FCALL_ID\u002Ftranscription \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"messages\": [\n      {\"side\": \"User\", \"startTime\": 0, \"stopTime\": 3, \"message\": \"Здравствуйте, чем могу помочь?\"},\n      {\"side\": \"Client\", \"startTime\": 4, \"stopTime\": 9, \"message\": \"Здравствуйте, хотел уточнить статус заказа\"}\n    ]\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst callId = 'externalCall.00b1e735843c558431be668e3687a58b.1777974304'\n\nconst res = await fetch(`https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalls\u002F${callId}\u002Ftranscription`, {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    messages: [\n      { side: 'User', startTime: 0, stopTime: 3, message: 'Здравствуйте, чем могу помочь?' },\n      { side: 'Client', startTime: 4, stopTime: 9, message: 'Здравствуйте, хотел уточнить статус заказа' },\n    ],\n  }),\n})\n\nconst { success, data } = await res.json()\nconsole.log('ID транскрипции:', data.transcriptId)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst callId = 'externalCall.00b1e735843c558431be668e3687a58b.1777974304'\n\nconst res = await fetch(`https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcalls\u002F${callId}\u002Ftranscription`, {\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    messages: [\n      { side: 'User', startTime: 0, stopTime: 3, message: 'Здравствуйте, чем могу помочь?' },\n      { side: 'Client', startTime: 4, stopTime: 9, message: 'Здравствуйте, хотел уточнить статус заказа' },\n    ],\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `transcriptId` | number | Внутренний ID транскрипции на портале Битрикс24 |\n\n## Пример ответа\n\nHTTP 200 — транскрипция прикреплена:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"transcriptId\": 3\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n400 — не передан массив реплик:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"MISSING_PARAMS\",\n    \"message\": \"Required: messages (non-empty array of {side, startTime, stopTime, message})\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `MISSING_PARAMS` | Не передан `messages` или массив пустой |\n| 400 | `INVALID_MESSAGE_SHAPE` | Некорректная структура элемента `messages[i]`: неверный `side`, тип или диапазон `startTime`\u002F`stopTime`, пустой `message`. В тексте ошибки — индекс некорректного элемента и нарушенное поле |\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Неверный API-ключ |\n| 401 | `TOKEN_MISSING` | Ключ не имеет настроенных токенов Битрикс24 |\n| 401 | `KEY_INACTIVE` | API-ключ неактивен или отозван |\n| 403 | `SCOPE_DENIED` | Ключу не хватает скоупа `telephony` |\n| 422 | `BITRIX_ERROR` | Битрикс24 вернул ошибку (текст в `error.message`) |\n| 429 | `RATE_LIMITED` | Превышен лимит запросов |\n| 502 | `BITRIX_UNAVAILABLE` | Битрикс24 недоступен |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**На незавершённом звонке Битрикс24 вернёт ошибку.** Порядок операций: `register` → `finish` → `transcription`.\n\n**Вайбкод валидирует структуру `messages` локально.** Каждый элемент проверяется до отправки в Битрикс24. Ошибка `INVALID_MESSAGE_SHAPE` содержит индекс некорректного элемента и точное описание нарушенного ограничения — это позволяет исправить конкретный элемент без повторной отправки всего массива.\n\n**`transcriptId` используется только внутри портала.** Внешних эндпоинтов для чтения транскрипций по этому ID нет.\n\n## Смотрите также\n\n- [Завершить звонок](.\u002Ffinish.md) — обязательный шаг перед транскрипцией\n- [Зарегистрировать звонок](.\u002Fregister.md)\n- [Статистика звонков](\u002Fdocs\u002Ftelephony\u002Fanalytics\u002Fstatistics) — просмотр записей завершённых звонков\n"]