Жизненный цикл аккаунта
Аккаунт несёт три независимых состояния: status (бизнес-переключатель, который задаёте вы), состояние аутентификации, возвращаемое GET /v1/accounts/{id}/auth, и runtime_status (живое соединение). В полезной нагрузке webhook последние два представлены как auth_status и runtime_status — обратите внимание: у самого REST-объекта аккаунта поля с именем auth_status нет.
Машина состояний аутентификации
pending_authНачальное состояние после создания аккаунта; поток ещё не запущен.
awaiting_qr_scanАктивен QR-поток; auth_payload содержит содержимое QR для отрисовки.
awaiting_codeАктивен поток с кодом; для WhatsApp verify_code из auth_payload вводится на телефоне.
awaiting_passwordПровайдер требует двухфакторный пароль после шага с кодом.
authorizedАутентификация завершена. Runtime запускается автоматически.
failedПоток завершился ошибкой; причина — в last_error. Для повтора запустите новый поток.
pending_auth→awaiting_qr_scanPOST /auth/qr/start начинает QR-поток.
pending_auth→awaiting_codePOST /auth/start начинает поток с кодом подтверждения.
awaiting_code→awaiting_passwordПровайдер требует двухфакторный пароль.
awaiting_qr_scan→authorizedПровайдер подтверждает сканирование QR.
awaiting_code→authorizedКод (или сопряжение WhatsApp) принят.
awaiting_password→authorizedПароль принят.
authorized→pending_authПровайдер аннулирует сессию — приходит событие account.auth.required, и нужен новый поток.
awaiting_*→failedПровайдер сообщает об ошибке на любом шаге ожидания (событие account.auth.failed).
awaiting_*→pending_authPOST /auth/cancel прерывает активный поток.
Машина состояний runtime
unknownНачальное состояние после создания аккаунта, а также когда у платформы нет свежего отчёта от провайдера — вызовите /runtime/refresh для ресинхронизации.
startingИдёт запуск; провайдер выводит сессию в онлайн.
runningПодключено; можно отправлять и получать сообщения.
reconnectingСоединение оборвалось, идёт автоматическое или ручное переподключение.
disconnectedПровайдер сообщил, что сессия офлайн; для восстановления выполните reconnect или start.
stoppingИдёт остановка.
stoppedНе подключено. Состояние после остановки.
errorRuntime столкнулся с неустранимой ошибкой; причина — в last_error.
unknown→startingАвтоматический запуск после успешной авторизации.
stopped→startingЯвный POST /runtime/start.
starting→runningСессия провайдера выходит в онлайн (событие account.started).
running→reconnectingСоединение обрывается либо вызван POST /runtime/reconnect.
reconnecting→runningСоединение восстановлено.
running→disconnectedПровайдер сообщает, что сессия офлайн (событие account.status.updated).
disconnected→runningPOST /runtime/reconnect или /runtime/start возвращает её в онлайн.
running→stoppingPOST /runtime/stop начинает плавную остановку.
stopping→stoppedОстановка завершена.
*→errorНеустранимая ошибка провайдера в любой момент.
*→unknownНет свежего отчёта провайдера; POST /runtime/refresh ресинхронизирует значение.
Примечания
- Account.status — ваш собственный (бизнес-переключатель, задаваемый при создании или через PATCH). Два других принадлежат платформе и доступны только для чтения: состояние аутентификации — через GET /v1/accounts/{id}/auth (его поле status), runtime_status — на объекте аккаунта.
- Успешная авторизация запускает runtime автоматически — последующий вызов POST /runtime/start безвреден и является no-op.
- Пока аккаунт авторизован, POST /auth/start, /auth/qr/start и /auth/session отклоняются с 409 account_already_authorized. Если новый поток действительно нужен, сначала вызовите POST /auth/cancel.
- Событие account.auth.required означает, что провайдер аннулировал сессию: состояние аутентификации выходит из authorized, а auth_payload несёт материал (например, новый QR) для повторной аутентификации.
- Каждое изменение runtime приходит как событие account.status.updated с auth_status и runtime_status — синхронизируйте локальную копию из webhook, а не опросом.