Account (nick)
Một tài khoản nhắn tin đã kết nối, ví dụ một nick Zalo. Mỗi account cóchannel, status, mode, capabilities và bắt buộc đi qua một proxy riêng.
Mode
Vòng đời trạng thái
Gửi vào nick chưa sẵn sàng trả
409 ACCOUNT_NOT_READY kèm details.status.
Capability
Mỗi kênh khai báo khả năng trongGET /channels và capabilities của account, ví dụ send_text, send_image, friend_requests, search_by_phone, message_stranger. Hành động ngoài khả năng trả 422 CAPABILITY_NOT_SUPPORTED. Công cụ MCP tự ẩn khi workspace không có nick nào hỗ trợ.
Định danh
ID công khai có tiền tố:acc_ (account), cnv_ (hội thoại), msg_ (tin nhắn, kể cả tin đang chờ gửi), med_ (media), evt_ (event webhook). Hãy coi chúng là chuỗi mờ. external_id / user_external_id là id phía kênh.
Gửi tin và client_msg_id
POST /messages bắt buộc client_msg_id (8 đến 64 ký tự). Máy chủ suy ra msg_ id từ giá trị này, nên retry sau lỗi mạng hay timeout không bao giờ gửi hai lần. message.id trả về chính là message.id trong webhook message.sent.
?wait=true(mặc định): chờ tối đa 15 giây (45 giây với media). Quá hạn trả202vớistatus: "pending".message.idtrong202luôn có hàng thật trong hội thoại: máy chủ tạo hàngpendingtrước khi xếp lệnh gửi. Hàng này luôn kết thúc ởsenthoặcfailed(lệnh hết hạn, nick chưa kết nối, vượt giới hạn, hoặc quá 5 phút không có kết quả đều chuyểnfailed), không bao giờ treo mãi.- Gửi lại cùng
client_msg_id: tinsenttrả200với tin cũ; tin đangpendingtrả202với chính hàng đó và không gửi lại (lần gửi đầu có thể đã tới kênh); chỉ tinfailedmới được gửi lại thật. - Phản hồi
202không được lưu theoIdempotency-Key: gửi lại luôn thấy trạng thái hiện tại.
Phân trang
Danh sách trả{ "data": [...], "next_cursor": "..." }. Truyền cursor để lấy trang kế, next_cursor: null là hết. Cursor là chuỗi mờ. Tối đa limit=100. Tin nhắn trả mới nhất trước.
GET /conversations/:id/messages?direction=after&cursor=... dùng để poll tin mới: next_cursor luôn trỏ tới tin mới nhất vừa trả (hoặc giữ nguyên cursor bạn gửi khi chưa có tin mới), nên bạn dùng lại được ở lần poll kế tiếp.