[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-telephony\u002Fcrm\u002Ffinish":3,"docs-tabs-telephony\u002Fcrm\u002Ffinish":6},{"content":4,"lastmod":5},"\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","2026-07-07",{}]