Tài liệu API v2 · MCP
Nối WA Auto với app AI và phần mềm của bạn
216 thao tác — đủ những gì làm được trong ứng dụng — có qua REST v2 và MCP, sinh từ cùng một danh mục nên tài liệu luôn khớp hệ thống. Mọi thao tác WhatsApp đi chung cổng giao việc và hạn mức với ứng dụng; tin do AI hoặc API gửi là tin tự động.
Ba cửa vào
Ba cửa dùng chung một bộ kiểm: quyền, số được dùng, gói, chống trùng, xác nhận 2 bước và nút tạm dừng khẩn.
| Cửa | Địa chỉ | Dành cho |
|---|---|---|
| REST v2 | https://<ten-mien-cua-ban>/api/public/v2 | Phần mềm của bạn, n8n, AI Entity Hub — khoá API |
| MCP đăng nhập | https://<ten-mien-cua-ban>/mcp | Claude, ChatGPT, Lovable, Cursor, VS Code — người dùng đăng nhập và chọn quyền |
| MCP bằng khoá | https://<ten-mien-cua-ban>/api/public/mcp | AI Entity Hub, n8n, OpenAI Agents SDK — khoá API |
API v1 cũ vẫn chạy ít nhất 6 tháng — xem tài liệu v1.
Xác thực & quyền
Chủ hoặc quản trị tạo khoá trong Cài đặt → Kết nối AI & API; khoá chỉ hiện một lần. Gửi khoá trong header Authorization: Bearer …. Mỗi khoá có:
- Quyền theo từng tài nguyên (đọc / ghi / gửi / xoá…). Quyền xoá tắt sẵn. Khoá không bao giờ vượt vai trò người tạo; người tạo rời workspace hoặc bị hạ quyền thì khoá tạm khoá.
- Số được dùng: mọi số, hoặc chọn số / nhãn số (tính lúc gọi — số mới gắn nhãn dùng được ngay).
- Hạn dùng và danh sách IP (tuỳ chọn), hồ sơ công cụ MCP.
App AI đăng nhập qua MCP thì người dùng chọn quyền, số và hồ sơ trên trang cho phép; app hành động bằng đúng quyền của người đó, không hơn.
curl https://<ten-mien-cua-ban>/api/public/v2/me \
-H "Authorization: Bearer $WA_AUTO_KEY"Lệnh & chờ kết quả
Mọi thao tác WhatsApp trả về lệnh (202 + header Location). Chờ tối đa 25 giây bằng header Prefer: wait=N, hoặc gọi operation_wait. Hết giờ chờ không phải lỗi — gọi chờ tiếp.
| state | Tên | Nghĩa |
|---|---|---|
queued | Đã nhận | đã vào hàng, chưa tới lượt |
waiting | Đang chờ | đang chờ một điều kiện (giờ gửi, hạn mức, số ngoại tuyến…) — có waitReason và retryAt |
running | Đang chạy | máy đang làm |
succeeded | Đã xong | xong |
partial | Một phần | lệnh nhiều phần: một số phần lỗi hoặc bị huỷ |
failed | Lỗi | lỗi — có error |
cancelled | Đã huỷ | đã huỷ phần chưa giao máy |
unverified | Chưa xác minh | máy mất liên lạc giữa chừng: có thể đã gửi — KHÔNG gửi lại |
expired | Hết hạn | quá hạn trước khi chạy được |
Lệnh unverified hoặc lỗi outcome_unknown: tin có thể đã đi. Đọc lại lệnh theo mã — không gửi lại.
Chống trùng
- REST: mọi
POSTcần headerIdempotency-Key(1–255 ký tự, mỗi lệnh một giá trị). Gọi lại cùng khoá + cùng nội dung nhận đúng kết quả cũ kèmIdempotent-Replayed: true; khác nội dung →422; lần đầu còn chạy →409. - MCP: trường
idempotencyKeytuỳ chọn; không có thì cùng một lời gọi trong 60 giây được coi là một lệnh.
Phiên bản cấu hình
Cấu hình có phiên bản (hạn mức số, luật tự động, lịch chạy…) trả ETag. Khi sửa, gửi If-Match (MCP: trường revision) với bản đã đọc; người khác sửa trước → 412 revision_conflict, đọc lại rồi sửa trên bản mới. Không bao giờ ghi đè lặng lẽ.
Xác nhận 2 bước
Thao tác xoá hoặc khó hoàn tác: lần gọi đầu trả 409 confirmation_required kèm confirmation.summary và confirmation.code (hạn 10 phút). Hỏi người dùng, rồi gọi lại đúng nội dung kèm header X-Confirmation-Code (MCP: confirmationCode). Mã chỉ dùng một lần.
Sự kiện & webhook
Đọc thay đổi bằng events_poll với con trỏ (lưu nextCursor, lần sau đọc tiếp), hoặc nhận webhook. Cả hai đọc từ cùng một nhật ký sự kiện, giao ít nhất một lần — lọc trùng theo id.
| Sự kiện | Khi nào |
|---|---|
message.received | Có tin nhắn đến |
message.status | Tin đi đổi trạng thái (đã gửi / đã tới / đã xem / lỗi) |
contact.created | Khách mới được tạo |
contact.updated | Hồ sơ khách thay đổi |
campaign.finished | Chiến dịch kết thúc |
account.state_changed | Số WhatsApp đổi trạng thái |
operation.completed | Lệnh từ API/AI xong |
operation.failed | Lệnh từ API/AI lỗi |
operation.unverified | Lệnh từ API/AI chưa xác minh được |
operation.cancelled | Lệnh từ API/AI bị huỷ |
operation.waiting | Lệnh từ API/AI đổi lý do chờ |
campaign.started | Chiến dịch bắt đầu |
campaign.paused | Chiến dịch tạm dừng |
campaign.resumed | Chiến dịch chạy tiếp |
campaign.step_sent | Một bước chiến dịch đã gửi tới khách |
group.member_joined | Có người vào nhóm |
group.member_left | Có người rời nhóm |
group.post_sent | Bài đăng theo lịch vào nhóm đã gửi |
group.join_requested | Có người xin vào nhóm |
contact.check_finished | Kiểm tra có WhatsApp xong |
contact.opted_out | Khách vào danh sách loại trừ |
schedule.run_started | Lịch chạy bắt đầu một lượt |
schedule.run_finished | Lịch chạy xong một lượt |
schedule.run_skipped | Lịch chạy bỏ qua một lượt |
schedule.paused | Lịch chạy tạm dừng |
automation.fired | Luật tự động chạy |
machine.state_changed | Máy chạy đổi trạng thái |
proxy.state_changed | Proxy đổi trạng thái |
Webhook: thêm địa chỉ https trong Cài đặt → Kết nối AI & API → Webhook. Trả 2xx trong 8 giây; lỗi thì thử lại sau 1 phút, 5 phút, 30 phút, 2 giờ, 6 giờ. Thân theo CloudEvents 1.0:
{
"specversion": "1.0",
"id": "b6f1c2d0-6c55-4c1e-9a43-5d1d3b1e7a10",
"type": "message.received",
"version": 1,
"time": "2026-10-17T07:28:01.000Z",
"source": "wa-auto/<workspace-id>",
"datacontenttype": "application/json",
"data": {
"…": "…"
},
"event": "message.received",
"at": "2026-10-17T07:28:01.000Z"
}Kiểm chữ ký: header x-wa-auto-signature = sha256= + HMAC-SHA256 của <timestamp>.<body gốc>; hoặc chuẩn Standard Webhooks (webhook-signature):
// npm i standardwebhooks — dùng đúng bí mật ký whsec_… của webhook
import { Webhook } from "standardwebhooks";
const wh = new Webhook(secret);
const event = wh.verify(rawBody, {
"webhook-id": req.header("webhook-id"),
"webhook-timestamp": req.header("webhook-timestamp"),
"webhook-signature": req.header("webhook-signature"),
}); // ném lỗi nếu sai chữ ký hoặc quá cũGiới hạn tốc độ
- Tối đa 60 yêu cầu mỗi phút cho mỗi khoá hoặc kết nối AI; quá thì
429kèmRetry-After. Mọi phản hồi có RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset. - Danh sách trả
nextCursor;limittối đa 100. Thân yêu cầu tối đa 64 KiB. - Hạn mức gửi của từng số do người dùng đặt (mặc định mở). Không xoay vòng hay đổi số để né giới hạn — cổng giao việc chặn và ghi nhận.
Mã lỗi
Lỗi theo RFC 9457 (application/problem+json): { type, title, status, detail, code, retryable, requestId }.
| HTTP | code | Ý nghĩa |
|---|---|---|
| 400 | idempotency_key_required | Lệnh POST cần header Idempotency-Key (mỗi lệnh một giá trị mới). |
| 400 | invalid_json | Thân yêu cầu không phải JSON hợp lệ. |
| 401 | unauthorized | Thiếu khoá/đăng nhập, hoặc khoá không đúng. |
| 401 | key_expired | Khoá đã hết hạn — tạo khoá mới trong Cài đặt → Kết nối AI & API. |
| 403 | key_suspended | Khoá đang tạm khoá (người tạo rời workspace hoặc bị hạ quyền) — một chủ/quản trị bấm “Nhận khoá này”. |
| 403 | ip_not_allowed | Địa chỉ IP gọi tới không nằm trong danh sách IP của khoá. |
| 403 | permission_denied | Khoá/kết nối không có quyền này, hoặc vai trò của người tạo không đủ. |
| 403 | number_not_allowed | Khoá/kết nối không được dùng số WhatsApp này (hoặc thao tác cần quyền “mọi số”). |
| 403 | principal_not_supported | Thao tác này chỉ dành cho người đăng nhập qua app AI, không dùng được bằng khoá. |
| 403 | plan_expired | Gói của workspace đã hết hạn hoặc không cho thao tác này. |
| 404 | not_found | Không có đối tượng này, hoặc bạn không được xem nó. |
| 409 | idempotency_in_progress | Yêu cầu đầu tiên với Idempotency-Key này còn đang chạy — đợi rồi gọi lại. |
| 409 | confirmation_required | Thao tác cần xác nhận 2 bước: đọc `confirmation.summary`, gọi lại kèm `confirmation.code`. |
| 410 | cursor_expired | Con trỏ sự kiện quá cũ — đọc lại từ đầu. |
| 412 | revision_conflict | Cấu hình đã bị người khác sửa sau bản bạn đọc — đọc lại rồi sửa trên bản mới. |
| 413 | body_too_large | Thân yêu cầu quá lớn. |
| 422 | validation_failed | Dữ liệu gửi lên sai kiểu hoặc thiếu trường — xem `violations`. |
| 422 | idempotency_conflict | Cùng Idempotency-Key nhưng nội dung khác lần trước. |
| 422 | confirmation_invalid | Mã xác nhận sai, đã dùng, hết hạn hoặc không khớp nội dung lần đầu. |
| 422 | operation_rejected | Thao tác đã kiểm và từ chối (số ngoại tuyến, chiến dịch chưa gửi thử…) — `detail` nói lý do. |
| 428 | precondition_required | Sửa cấu hình có phiên bản cần If-Match (hoặc trường revision) với bản đã đọc. |
| 429 | rate_limited | Quá 60 yêu cầu/phút cho một khoá hoặc kết nối — đợi theo Retry-After. |
| 429 | too_many_open_operations | Quá nhiều lệnh đang mở cùng lúc — đợi bớt lệnh kết thúc. |
| 500 | outcome_unknown | Không chắc lệnh đã chạy hay chưa — đọc lại lệnh theo mã, KHÔNG gửi lại. |
| 500 | server_error | Lỗi máy chủ — thử lại; lệnh WhatsApp không bao giờ tự gửi đôi. |
| 503 | unavailable | Dịch vụ tạm thời không sẵn sàng — thử lại sau. |
| 503 | paused | API/MCP đang tạm dừng (nút ngắt khẩn của workspace hoặc đội vận hành). |
Nối Claude / ChatGPT
- Trong app AI, thêm connector / MCP server tuỳ chỉnh với địa chỉ
https://<ten-mien-cua-ban>/mcp. - App AI mở trang đăng nhập WA Auto. Đăng nhập, chọn workspace, quyền, số được dùng và hồ sơ công cụ, rồi bấm Cho phép.
- Hỏi app AI “tôi đang có những số WhatsApp nào?” để thử. Sửa hoặc thu hồi bất cứ lúc nào trong Cài đặt → Kết nối AI & API.
Server hoặc n8n dùng cổng khoá https://<ten-mien-cua-ban>/api/public/mcp với header Authorization: Bearer ….
Hồ sơ công cụ MCP
Hồ sơ chỉ quyết định app AI thấy công cụ nào (để danh sách gọn); quyền mới quyết định làm được gì. Hồ sơ Lõi luôn có.
| Hồ sơ | Số công cụ | Ví dụ |
|---|---|---|
| Lõi (luôn có) | 11 | whoami, quick_search, numbers_list, number_get… |
| Hội thoại | 20 | inbox_summary, conversations_list, conversation_get, messages_list… |
| Số WhatsApp | 28 | numbers_list, number_get, number_add_options, number_create… |
| Khách hàng | 26 | crm_meta, contacts_list, contacts_count, contact_get… |
| Cấu hình CRM | 20 | tag_save, tag_delete, stage_save, stage_delete… |
| Nhóm | 23 | groups_summary, groups_list, group_get, group_members_list… |
| Chiến dịch | 15 | campaigns_meta, campaigns_list, campaign_get, campaign_save… |
| Tự động & lịch | 18 | campaign_waves, rules_list, rule_save, rule_enable… |
| Thư viện | 8 | library_get, template_save, template_delete, quick_reply_save… |
| Báo cáo | 5 | dashboard_get, report_get, notifications_list, notifications_unread_count… |
| Máy & proxy | 16 | machines_list, machine_get, machine_pairing_status, machine_update… |
| Quản trị workspace | 26 | inbox_settings_get, inbox_settings_save, member_numbers_set, my_working_hours_save… |
