Звонок голосовым агентом
Исходящий звонок голосового агента по номеру телефона через API Pleep, сейчас или в назначенное время, и ответ, дозвонились или нет
Запуск одного исходящего звонка голосового агента из ваших систем. Переписка в WhatsApp для этого не нужна, достаточно номера телефона. В ответе приходит результат: взял ли человек трубку.
Звонок можно и запланировать на потом, например перезвонить клиенту завтра в 11:00. Как это сделать, смотрите ниже в разделе «Запланировать звонок».
Эндпоинты
Заголовки
| Заголовок | Значение | Обязательный |
|---|---|---|
X-API-Key | Ваш API-ключ | Да |
Content-Type | application/json | Да |
Кому звонить
phone: номер в международном формате, например+77001234567. Плюс, пробелы и дефисы можно оставить. Казахстанский номер можно передать и с восьмёркой:87001234567.thread_id: идентификатор диалога. Номер Pleep возьмёт из диалога, а звонок продолжит этот диалог: агент увидит переписку, и расшифровка звонка попадёт туда же. Это тот же идентификатор, что в этапах лида и в получении диалогов.
Можно передать оба поля: тогда агент звонит на phone, а звонок продолжает диалог thread_id. Если у диалога нет номера, например это Instagram или Telegram, передайте phone.
Какой агент звонит
Если в аккаунте один голосовой агент, указывать его не нужно. С thread_id звонит голосовой агент того ассистента, который ведёт диалог. Если голосовых агентов несколько, передайте voice_agent_id: его можно узнать у поддержки.
Когда Pleep звонит
Только в рабочие часы из настроек аккаунта. Если рабочие часы выключены, с 9:00 до 21:00 по часовому поясу аккаунта. Вне этих часов API не звонит и отвечает 409 OUTSIDE_CALLING_HOURS с полем opens_at: с этого момента звонить можно. Запланируйте звонок на это время: передайте scheduled_at.
Pleep не звонит людям, которые отказались от звонков и сообщений, и контактам, заблокированным в мониторе.
Тело запроса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
phone | string | Да, если нет thread_id | Номер, на который звонить |
thread_id | string | Да, если нет phone | Диалог, который продолжит звонок, например thread_0765c2bd-980d-4c65-aeea-d04069646be5 |
voice_agent_id | string | Если голосовых агентов несколько | Какой голосовой агент звонит |
assistant_id | string | Нет | Звонит голосовой агент этого ассистента |
first_message | string | Нет | Первая фраза агента в этом звонке, до 2000 символов |
extra_prompt | string | Нет | Указания агенту только на этот звонок, до 20 000 символов. Например, о чём спросить |
scheduled_at | string | Нет | Позвонить не сейчас, а в это время. ISO 8601 с часовым поясом, например 2026-11-12T15:00:00+05:00 |
replace_scheduled | boolean | Нет | Только с scheduled_at: если у лида уже есть запланированный звонок, отменить его и запланировать этот |
Пример
Ответ
Запрос ждёт, пока человек возьмёт трубку или вызов закончится. Обычно это до 30 секунд, поэтому таймаут HTTP-клиента ставьте не меньше 60 секунд.
| Поле | Описание |
|---|---|
thread_id | Диалог, в котором сохранится звонок и его расшифровка |
conversation_id | Идентификатор звонка |
call_status | Чем закончился вызов, значения ниже |
answered | true, если человек взял трубку, false, если нет, null, если пока неизвестно |
hangup_cause | Код причины от оператора связи, если вызов не состоялся. Например, 17 занято, 19 нет ответа |
script_applied | Есть, только если вы передали first_message или extra_prompt: дошли ли они до агента |
call_status | Что значит |
|---|---|
connected | Человек взял трубку, агент разговаривает |
no_answer | Человек не взял трубку |
busy | Занято |
rejected | Вызов отклонён (код 21): человек сбросил его, или сеть не пропустила вызов, и телефон мог не зазвонить |
not_connected | Соединиться не удалось, например номер не обслуживается |
network_error | Сбой сети оператора |
initiated | Вызов отправлен, результат неизвестен |
Не повторяйте запрос вслепую
504 CALL_RESULT_UNKNOWN значит, что линия не сообщила результат вовремя. Звонок мог пройти, и повтор позвонит человеку второй раз. Сначала проверьте диалог через получение диалогов.
Звонок расходует минуты голосового агента так же, как звонок из сценария.
Запланировать звонок
Передайте в make-call поле scheduled_at. Pleep не звонит сразу, а сохраняет звонок и отвечает 202. В назначенное время голосовой агент звонит и продолжает тот же диалог. Если вы передали только phone, Pleep найдёт диалог по номеру или создаст новый, и в мониторе в нём появится строка «Звонок запланирован на …».
- Время нужно указывать с часовым поясом:
+05:00илиZ. Время без пояса API не примет. Пустоеscheduled_atAPI тоже не примет и ответит422: чтобы позвонить сразу, не передавайте это поле совсем. - Голосовой агент должен уметь звонить уже при планировании. Если к нему не подключён номер, API ответит
409 VOICE_AGENT_NOT_READY, как и на звонок сейчас. - Часы звонков те же, что для звонка сейчас. Время вне них API отклонит с
409 OUTSIDE_CALLING_HOURS, вopens_atбудет ближайшее время послеscheduled_at, когда звонить можно. Время в прошлом API отклонит с422 SCHEDULED_AT_IN_PAST. - Перед самым звонком Pleep проверяет всё заново: не отказался ли человек от звонков, не заблокирован ли контакт, остались ли минуты, готов ли голосовой агент. Если рабочие часы с тех пор поменялись и время оказалось вне них, звонок переносится на ближайшее разрешённое время, а в
moved_fromостаётся исходное. - Если человек ещё говорит с агентом (звонок начался в последние 35 минут и не закончился), звонок сдвигается на 3 минуты с причиной
CALL_IN_PROGRESS, до трёх раз.moved_fromпри этом не меняется. После третьего раза агент звонит. - Один звонок на лида. Если у диалога или у этого номера уже есть запланированный звонок (например, ИИ-агент запланировал его в переписке с этим номером), API ответит
409 SCHEDULED_CALL_EXISTSи вернёт его вscheduled_call. Чтобы заменить его новым, передайте"replace_scheduled": true: старый получит статусcancelledс причинойREPLACED.
ИИ-агент тоже умеет планировать звонки сам, когда клиент просит перезвонить. Для этого включите расширение «Запланированные звонки». Такие звонки попадают в тот же список с "source": "agent" и так же заменяют друг друга. Если клиент передумал, агент сам отменяет звонок (причина CANCELLED_BY_AGENT). Лиду в этапе, где ИИ выключен, агент звонок не планирует и говорит, что с клиентом свяжется менеджер.
Ответ 202:
Время в ответах всегда в UTC.
| Поле | Описание |
|---|---|
id | Идентификатор запланированного звонка, для отмены |
thread_id | Диалог, который продолжит звонок |
phone | Номер, на который позвонит агент |
scheduled_at | Когда звонить |
status | Что со звонком сейчас, значения ниже |
status_reason | Почему звонок отменён, не состоялся или перенесён, значения ниже |
moved_from | Исходное время, если звонок перенесли из-за часов звонков |
source | api: запланирован через API, agent: запланировал ИИ-агент |
extra_prompt, first_message | Указания на этот звонок. У звонка от ИИ-агента в extra_prompt его заметка, о чём звонок |
call_status | Когда звонок сделан: чем закончился вызов, как в ответе на звонок сейчас |
conversation_id | Идентификатор звонка, когда он сделан |
finished_at | Когда звонок сделан, отменён или не состоялся |
replaced_scheduled_call_id | Только в ответе make-call: звонок, вместо которого запланирован этот |
status | Что значит |
|---|---|
scheduled | Ждёт своего времени |
calling | Агент набирает номер |
done | Звонок сделан. Чем закончился, смотрите в call_status |
cancelled | Отменён через API, отменён ИИ-агентом по просьбе клиента, отменён вручную в мониторе или заменён новым |
skipped | Не сделан намеренно: человек отказался от звонков, контакт заблокирован, расширение выключено, ИИ больше не работает с лидом, чат забрал менеджер или сделка закрыта |
failed | Позвонить не удалось |
status_reason | Что значит |
|---|---|
REPLACED | Вместо него запланирован новый звонок этому лиду |
CANCELLED_BY_API | Отменён через cancel-scheduled-call |
CANCELLED_BY_AGENT | Клиент передумал в разговоре, и ИИ-агент отменил звонок. Так отменяется и звонок, запланированный через API |
CANCELLED_IN_MONITOR | Отменён вручную в мониторе, кнопкой «Отменить звонок» в чате. Так можно отменить и звонок, запланированный через API |
OUTSIDE_CALLING_HOURS | Перенесён: назначенное время оказалось вне часов звонков |
CALL_IN_PROGRESS | Перенесён на 3 минуты: человек ещё говорил с агентом. Бывает у звонка со статусом scheduled |
OUTREACH_SUPPRESSED | Человек отказался от звонков и сообщений |
CONTACT_BLOCKED | Контакт заблокирован в мониторе |
EXTENSION_OFF | Звонок от ИИ-агента, а расширение «Запланированные звонки» выключили |
LEAD_STATUS_AI_DISABLED | Звонок от ИИ-агента, а лида перенесли в этап воронки, где ИИ выключен |
LEAD_STATUS_REQUIRED | Звонок от ИИ-агента, у лида нет этапа воронки, а ИИ работает только с лидами в этапах |
OPERATOR_MODE | Звонок от ИИ-агента, а после того как его запланировали, чат забрал менеджер |
LEAD_CLOSED | Звонок от ИИ-агента, а после того как его запланировали, лида перевели в успешный или проигранный этап |
NO_CALLING_HOURS | В рабочих часах нет ни одного дня для звонков |
VOICE_QUOTA_EXCEEDED | Закончились минуты голосового агента или подписка неактивна |
VOICE_AGENT_NOT_READY | Голосовой агент не может звонить, например к нему не подключён номер |
CALL_FAILED | Позвонить не удалось |
CALL_RESULT_UNKNOWN | Линия не сообщила результат вовремя, звонок мог пройти |
INTERRUPTED | Звонок прервался во время набора. Повторно Pleep не звонит, чтобы не позвонить человеку дважды |
Список запланированных звонков
Все звонки аккаунта, запланированные через API и ИИ-агентом, сначала новые.
| Параметр | Описание |
|---|---|
thread_id | Только звонки этого диалога |
status | Только звонки с этим статусом, например scheduled |
limit | Сколько звонков вернуть, от 1 до 200. По умолчанию 100 |
cursor | next_cursor из предыдущего ответа, чтобы получить следующую страницу |
Отменить запланированный звонок
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
scheduled_call_id | string | Да | id запланированного звонка |
В ответе звонок со статусом cancelled и причиной CANCELLED_BY_API. Отменить можно только звонок со статусом scheduled. Для звонка, который уже набирается или сделан, API ответит 409 SCHEDULED_CALL_NOT_CANCELLABLE и вернёт его в scheduled_call.
Коды ошибок
| HTTP-статус | Код ошибки | Описание |
|---|---|---|
| 401 | UNAUTHORIZED | Отсутствует или недействителен API-ключ |
| 402 | VOICE_QUOTA_EXCEEDED | Закончились минуты голосового агента или подписка неактивна |
| 404 | THREAD_NOT_FOUND | Диалога с таким thread_id нет в аккаунте ключа |
| 404 | VOICE_AGENT_NOT_FOUND | Голосового агента нет в аккаунте ключа |
| 404 | SCHEDULED_CALL_NOT_FOUND | Запланированного звонка с таким scheduled_call_id нет в аккаунте ключа |
| 409 | OUTSIDE_CALLING_HOURS | Сейчас нерабочее время. В поле opens_at время, с которого можно звонить |
| 409 | OUTREACH_SUPPRESSED | Человек отказался от звонков и сообщений, или контакт заблокирован в мониторе |
| 409 | VOICE_AGENT_NOT_READY | Голосовой агент пока не может звонить, например к нему не подключён номер |
| 409 | SCHEDULED_CALL_EXISTS | У лида уже есть запланированный звонок, он в scheduled_call. Отмените его или передайте "replace_scheduled": true |
| 409 | SCHEDULED_CALL_NOT_CANCELLABLE | Звонок уже набирается, сделан или отменён |
| 422 | NO_PHONE | У диалога нет номера. Передайте phone |
| 422 | INVALID_PHONE | phone не похож на номер телефона |
| 422 | SCHEDULED_AT_IN_PAST | scheduled_at уже прошло |
| 422 | VALIDATION_ERROR | Нет ни phone, ни thread_id, поле не строка или длиннее допустимого, scheduled_at пустое или без часового пояса, голосовых агентов несколько и не передан voice_agent_id, или диалог принадлежит другому ассистенту |
| 429 | RATE_LIMITED | Слишком много запросов. Лимит: 60 запросов в минуту на API-ключ |
| 502 | CALL_FAILED | Позвонить не удалось. Можно повторить позже |
| 504 | CALL_RESULT_UNKNOWN | Результат неизвестен, звонок мог пройти. Не повторяйте, не проверив диалог |