Vòng đời tài khoản
Một tài khoản mang ba trạng thái độc lập: status (công tắc nghiệp vụ do bạn đặt), trạng thái xác thực trả về bởi GET /v1/accounts/{id}/auth, và runtime_status (kết nối trực tiếp). Payload webhook lộ hai trạng thái sau dưới tên auth_status và runtime_status — lưu ý bản thân đối tượng tài khoản REST không có trường tên auth_status.
Máy trạng thái xác thực
pending_authTrạng thái ban đầu sau khi tạo tài khoản; chưa có luồng nào được bắt đầu.
awaiting_qr_scanMột luồng QR đang hoạt động; auth_payload mang nội dung QR để hiển thị.
awaiting_codeMột luồng mã xác nhận đang hoạt động; với WhatsApp, verify_code trong auth_payload được nhập trên điện thoại.
awaiting_passwordProvider yêu cầu mật khẩu hai yếu tố sau bước nhập mã.
authorizedXác thực hoàn tất. Runtime được khởi động tự động.
failedLuồng thất bại; last_error mang lý do. Bắt đầu một luồng mới để thử lại.
pending_auth→awaiting_qr_scanPOST /auth/qr/start bắt đầu một luồng QR.
pending_auth→awaiting_codePOST /auth/start bắt đầu một luồng mã xác nhận.
awaiting_code→awaiting_passwordProvider yêu cầu mật khẩu hai yếu tố.
awaiting_qr_scan→authorizedProvider xác nhận thao tác quét QR.
awaiting_code→authorizedMã (hoặc ghép cặp WhatsApp) được chấp nhận.
awaiting_password→authorizedMật khẩu được chấp nhận.
authorized→pending_authProvider vô hiệu hóa phiên — sự kiện account.auth.required được phát và cần bắt đầu một luồng mới.
awaiting_*→failedProvider báo thất bại ở bất kỳ bước chờ nào (sự kiện account.auth.failed).
awaiting_*→pending_authPOST /auth/cancel hủy luồng đang hoạt động.
Trạng thái con của ủy quyền WhatsApp Passkey
passkey_requiredLuồng QR yêu cầu thêm credential Passkey. Hãy tạo phiên ủy quyền công khai.
passkey_pendingPasskey challenge đã được phát hành; đang chờ hoàn tất authorize_url hoặc gửi phản hồi WebAuthn.
passkey_confirmationProvider yêu cầu xác nhận rõ ràng sau khi kiểm tra credential.
passkey_confirmation_sentYêu cầu xác nhận đã được gửi; tiếp tục poll trạng thái xác thực.
authorizedXác thực hoàn tất. Runtime được khởi động tự động.
failedLuồng thất bại; last_error mang lý do. Bắt đầu một luồng mới để thử lại.
passkey_required→passkey_pendingGửi credential WebAuthn đã serialize qua trang được lưu trữ hoặc POST /auth/passkey-response.
passkey_pending→passkey_confirmationProvider yêu cầu người dùng xác nhận thao tác Passkey.
passkey_confirmation→passkey_confirmation_sentPOST /auth/passkey-confirm gửi xác nhận của người dùng.
passkey_pending→authorizedProvider chấp nhận credential mà không cần bước xác nhận bổ sung.
passkey_confirmation_sent→authorizedProvider chấp nhận credential đã được xác nhận.
passkey_*→failedProvider từ chối hoặc không thể hoàn tất luồng Passkey.
Máy trạng thái runtime
unknownTrạng thái ban đầu sau khi tạo tài khoản, và bất cứ khi nào nền tảng không có báo cáo mới từ provider — gọi /runtime/refresh để đồng bộ lại.
startingĐang khởi động; provider đang đưa phiên online.
runningĐã kết nối, có thể gửi và nhận.
reconnectingKết nối bị rớt và việc kết nối lại (tự động hoặc thủ công) đang diễn ra.
disconnectedProvider báo phiên đã offline; kết nối lại hoặc khởi động để khôi phục.
stoppingĐang dừng.
stoppedKhông kết nối. Trạng thái sau khi dừng.
errorRuntime gặp lỗi không thể khôi phục; last_error mang lý do.
unknown→startingTự khởi động sau khi ủy quyền thành công.
stopped→startingGọi POST /runtime/start một cách tường minh.
starting→runningPhiên của provider lên online (sự kiện account.started).
running→reconnectingKết nối bị rớt, hoặc POST /runtime/reconnect được gọi.
reconnecting→runningKết nối được thiết lập lại.
running→disconnectedProvider báo phiên offline (sự kiện account.status.updated).
disconnected→runningPOST /runtime/reconnect hoặc /runtime/start đưa nó trở lại.
running→stoppingPOST /runtime/stop bắt đầu dừng êm.
stopping→stoppedViệc dừng hoàn tất.
*→errorLỗi provider không thể khôi phục, tại bất kỳ thời điểm nào.
*→unknownKhông có báo cáo mới từ provider; POST /runtime/refresh đồng bộ lại giá trị.
Ghi chú
- Account.status thuộc về bạn (công tắc bật/tắt nghiệp vụ, đặt khi tạo hoặc qua PATCH). Hai trạng thái còn lại do nền tảng sở hữu và chỉ đọc: trạng thái xác thực qua GET /v1/accounts/{id}/auth (trường status của nó), runtime_status trên đối tượng tài khoản.
- Ủy quyền thành công thường tự khởi động runtime. POST /runtime/start là yêu cầu khởi động rõ ràng; chỉ gọi khi runtime_status thực tế vẫn cần và xử lý operation_status trả về.
- Khi đang authorized, POST /auth/start, /auth/qr/start và /auth/session bị từ chối với 409 account_already_authorized. Hãy gọi POST /auth/cancel trước nếu bạn thật sự cần một luồng mới.
- Sự kiện account.auth.required nghĩa là provider đã vô hiệu hóa phiên: trạng thái xác thực rời khỏi authorized và auth_payload mang dữ liệu (chẳng hạn QR mới) để xác thực lại.
- account.status.updated báo cáo thay đổi xác thực hoặc runtime mà provider quan sát được, nhưng không được bảo đảm cho mọi chuyển trạng thái đã yêu cầu. Sau action hoặc reconnect, hãy đối chiếu trạng thái webhook bằng GET /v1/accounts/{account_id} hoặc POST /runtime/refresh.