Лиды
Этап лида в воронке Pleep и включение или выключение ИИ-агента в отдельном диалоге
Работа с лидом по идентификатору диалога: чтение и изменение этапа в воронке, а также включение и выключение ИИ-агента в конкретном диалоге. Используйте, чтобы держать Pleep в согласии с вашей учётной системой: переводить лид на «Продажу», когда оплата подтвердилась на вашей стороне, или выключать агента, когда в вашей карточке лида поднят флаг «не обрабатывать ИИ».
Какой идентификатор передавать
Везде используется thread_id вида thread_<uuid> — тот же, что возвращает get-threads, что стоит в ссылке на диалог в мониторе и что подставляется в Custom Tool через «Автозаполнение».
Эндпоинты
Заголовки
| Заголовок | Значение | Обязательный |
|---|---|---|
X-API-Key | Ваш API-ключ | Да |
Content-Type | application/json | Да |
Лимиты запросов
Методы этапов лида допускают 60 запросов в минуту на один API-ключ. Это отдельный лимит: у остальных методов API он равен 30.
get-statuses
Возвращает воронку целиком: идентификаторы и названия этапов. Вызовите один раз, сохраните соответствие этапов у себя и дальше работайте по id.
Тело запроса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
assistant_id | string | Нет | Нужен, только если на API-ключ заведено несколько агентов. При одном агенте не передавайте |
Ответ
| Поле | Тип | Описание |
|---|---|---|
statuses[].id | string | Идентификатор этапа |
statuses[].name | string | Название этапа |
statuses[].kind | string | Тип этапа: active, qualified, awaiting_payment, success или failure |
statuses[].order | integer | Позиция в воронке |
statuses[].description | string | null | Пояснение, когда лид должен попадать на этот этап |
statuses[].ai_enabled | boolean | false, если на этом этапе AI-агент не отвечает на входящие |
statuses[].ai_transition_locked | boolean | true, если агенту запрещено уводить лид с этого этапа |
get-lead
Текущий этап одного диалога.
Тело запроса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
thread_id | string | Да | Идентификатор диалога вида thread_<uuid> |
Ответ
| Поле | Тип | Описание |
|---|---|---|
thread_id | string | Идентификатор диалога |
assistant_id | string | Идентификатор агента |
channel | string | Канал диалога, например WABA_COEXISTENCE |
phone | string | null | Номер клиента, если у канала он есть |
message_handler | string | Кто ведёт диалог: AI или OPERATOR |
status | object | null | Текущий этап. null, если этап не присвоен |
status_set_at | string | null | Когда этап был установлен (ISO 8601) |
status_set_by | string | null | Кто установил: AI, OPERATOR_MANUAL, SCENARIO или SYSTEM |
Не нужно опрашивать по одному
Если вам нужны этапы для многих диалогов сразу, не вызывайте get-lead в цикле. get-threads возвращает lead_status вместе с каждым диалогом.
set-status
Переводит лид на этап. Делает ровно то же, что перетаскивание карточки оператором: карточка двигается на всех открытых досках в реальном времени, и запускаются сценарии, привязанные к этапу.
Тело запроса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
thread_id | string | Да | Идентификатор диалога |
status_id | string | null | Одно из двух | Идентификатор этапа. Передайте null, чтобы снять этап |
status_name | string | Одно из двух | Точное название этапа, регистр не важен. Альтернатива status_id |
answer_pending_message | boolean | Нет | По умолчанию false. См. «Ответ на ждущее сообщение» ниже |
Нужно передать ровно одно из полей status_id или status_name. Если не передать ни одного, вернётся 422: отсутствие поля не считается командой «снять этап», иначе ошибка в вашем коде молча стирала бы позицию лида в воронке.
Ответ
Если лид уже находится на этом этапе, вернётся changed: false и ничего не произойдёт: ни записи в истории, ни запуска сценариев. Повторная отправка одного и того же запроса безопасна.
Ответ на ждущее сообщение
Бывает так, что клиент уже что-то написал, пока агент до лида не допущен: например, этап запрещает агенту отвечать, пока ваша проверка заявки не завершилась. Такое сообщение сохраняется, но остаётся без ответа, и после перевода на разрешающий этап агент сам к нему не вернётся, пока клиент не напишет снова.
Передайте answer_pending_message: true, чтобы при переводе агент ответил на это сообщение. В ответе придёт answered_pending_message: true, если ждущее сообщение нашлось и агент на него отвечает, false, если отвечать было не на что.
Поле необязательное и по умолчанию выключено намеренно: перевод этапа не должен неожиданно отправлять сообщения клиентам. Массовая синхронизация этапов из вашей системы без этого флага не напишет ни одному клиенту.
Ответ не отправляется, если на новом этапе агент запрещён (ai_enabled: false), если этап снимается (status_id: null), если последним в диалоге писал не клиент, или если сообщение старше суток.
Названия-дубли
Если в воронке несколько этапов с одинаковым названием, set-status по status_name вернёт 422 STATUS_AMBIGUOUS вместо того, чтобы выбрать один наугад. В этом случае используйте status_id.
set-ai
Включает и выключает ИИ-агента в одном диалоге. Это программный эквивалент переключателя «Выключить ИИ навсегда» в карточке диалога в мониторе.
Тело запроса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
thread_id | string | Да | Идентификатор диалога |
ai_enabled | boolean | Да | false выключает агента в этом диалоге, true включает обратно |
ai_enabled должен быть настоящим JSON-логическим значением. Строка "false" вернёт 422, а не выключит агента: строка в JSON истинна, и молчаливое прочтение её как «включить» дало бы прямо противоположный результат. Отсутствие поля тоже вернёт 422, а не выключение по умолчанию.
Ответ
| Поле | Тип | Описание |
|---|---|---|
ai_enabled | boolean | Состояние после запроса |
message_handler | string | AI, если диалог ведёт агент, OPERATOR, если человек |
changed | boolean | false, если состояние уже было таким |
answered_pending_message | boolean | Агент ответил на сообщение, которое клиент написал, пока агент был выключен |
Повторная отправка одного и того же запроса безопасна: при совпадении состояния вернётся changed: false, без записи в историю диалога и без повторного пробуждения агента.
Выключение держится
ai_enabled: false выключает агента в этом диалоге насовсем. Обратно его не включит ни таймер автовозврата после ответа оператора, ни правило этапа CRM, ни перевод лида на другой этап. Единственное, что включает агента обратно, это ai_enabled: true или переключатель в мониторе.
Ответ, который уже готовится
Если в момент запроса агент уже сочиняет ответ, работают две независимые защиты.
Первая: запрос обрывает генерацию на месте. Вторая, на случай если ответ всё же успел дописаться: непосредственно перед отправкой система заново перечитывает состояние диалога и выбрасывает ответ, если агент к этому моменту выключен.
Единственное, что всё же может дойти до клиента, это часть ответа, уже переданная в мессенджер до того, как ваш запрос был получен.
Включение обратно
ai_enabled: true включает агента и сразу отвечает на сообщение, которое клиент написал, пока агент молчал, если такое сообщение есть. В answered_pending_message придёт true, если агент взялся за такое сообщение, и false, если отвечать было не на что. Те же ограничения, что и у answer_pending_message в set-status: не отвечаем, если последним писал не клиент или если сообщение старше суток.
Клиент, отписавшийся от сообщений
Если клиент написал STOP и отписался от автоматических сообщений, включить агента обратно в этом диалоге нельзя: вернётся 422 THREAD_OPTED_OUT. Отписка снимается не через API.
Коды ошибок
| HTTP-статус | Код ошибки | Описание |
|---|---|---|
| 401 | UNAUTHORIZED | Отсутствует или недействителен API-ключ |
| 404 | THREAD_NOT_FOUND | Диалога не существует либо он принадлежит другому аккаунту |
| 404 | STATUS_NOT_FOUND | Этапа нет в воронке этого агента |
| 404 | ASSISTANT_NOT_FOUND | Агента не существует либо он принадлежит другому аккаунту |
| 422 | STATUS_AMBIGUOUS | Под status_name подходит несколько этапов, используйте status_id |
| 422 | VALIDATION_ERROR | Для set-status: не передано ни status_id, ни status_name, либо переданы оба. Для set-ai: ai_enabled отсутствует или не является логическим значением |
| 422 | THREAD_OPTED_OUT | Клиент отписался от автоматических сообщений, включить агента обратно нельзя |
| 429 | RATE_LIMITED | Слишком много запросов. Лимит — 60 запросов в минуту на API-ключ |