Bỏ qua tới nội dung

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.

stateTênNghĩ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ạymáy đang làm
succeededĐã xongxong
partialMột phầnlệnh nhiều phần: một số phần lỗi hoặc bị huỷ
failedLỗilỗi — có error
cancelledĐã huỷđã huỷ phần chưa giao máy
unverifiedChưa xác minhmáy mất liên lạc giữa chừng: có thể đã gửi — KHÔNG gửi lại
expiredHết hạnquá 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 POST cần header Idempotency-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èm Idempotent-Replayed: true; khác nội dung → 422; lần đầu còn chạy → 409.
  • MCP: trường idempotencyKey tuỳ 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ệnKhi nào
message.receivedCó tin nhắn đến
message.statusTin đi đổi trạng thái (đã gửi / đã tới / đã xem / lỗi)
contact.createdKhách mới được tạo
contact.updatedHồ sơ khách thay đổi
campaign.finishedChiến dịch kết thúc
account.state_changedSố WhatsApp đổi trạng thái
operation.completedLệnh từ API/AI xong
operation.failedLệnh từ API/AI lỗi
operation.unverifiedLệnh từ API/AI chưa xác minh được
operation.cancelledLệnh từ API/AI bị huỷ
operation.waitingLệnh từ API/AI đổi lý do chờ
campaign.startedChiến dịch bắt đầu
campaign.pausedChiến dịch tạm dừng
campaign.resumedChiến dịch chạy tiếp
campaign.step_sentMột bước chiến dịch đã gửi tới khách
group.member_joinedCó người vào nhóm
group.member_leftCó người rời nhóm
group.post_sentBài đăng theo lịch vào nhóm đã gửi
group.join_requestedCó người xin vào nhóm
contact.check_finishedKiểm tra có WhatsApp xong
contact.opted_outKhách vào danh sách loại trừ
schedule.run_startedLịch chạy bắt đầu một lượt
schedule.run_finishedLịch chạy xong một lượt
schedule.run_skippedLịch chạy bỏ qua một lượt
schedule.pausedLịch chạy tạm dừng
automation.firedLuật tự động chạy
machine.state_changedMáy chạy đổi trạng thái
proxy.state_changedProxy đổ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ì 429 kèm Retry-After. Mọi phản hồi có RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset.
  • Danh sách trả nextCursor; limit tố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 }.

HTTPcodeÝ nghĩa
400idempotency_key_requiredLệnh POST cần header Idempotency-Key (mỗi lệnh một giá trị mới).
400invalid_jsonThân yêu cầu không phải JSON hợp lệ.
401unauthorizedThiếu khoá/đăng nhập, hoặc khoá không đúng.
401key_expiredKhoá đã hết hạn — tạo khoá mới trong Cài đặt → Kết nối AI & API.
403key_suspendedKhoá đ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”.
403ip_not_allowedĐịa chỉ IP gọi tới không nằm trong danh sách IP của khoá.
403permission_deniedKhoá/kết nối không có quyền này, hoặc vai trò của người tạo không đủ.
403number_not_allowedKhoá/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ố”).
403principal_not_supportedThao tác này chỉ dành cho người đăng nhập qua app AI, không dùng được bằng khoá.
403plan_expiredGói của workspace đã hết hạn hoặc không cho thao tác này.
404not_foundKhông có đối tượng này, hoặc bạn không được xem nó.
409idempotency_in_progressYêu cầu đầu tiên với Idempotency-Key này còn đang chạy — đợi rồi gọi lại.
409confirmation_requiredThao tác cần xác nhận 2 bước: đọc `confirmation.summary`, gọi lại kèm `confirmation.code`.
410cursor_expiredCon trỏ sự kiện quá cũ — đọc lại từ đầu.
412revision_conflictCấ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.
413body_too_largeThân yêu cầu quá lớn.
422validation_failedDữ liệu gửi lên sai kiểu hoặc thiếu trường — xem `violations`.
422idempotency_conflictCùng Idempotency-Key nhưng nội dung khác lần trước.
422confirmation_invalidMã xác nhận sai, đã dùng, hết hạn hoặc không khớp nội dung lần đầu.
422operation_rejectedThao 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.
428precondition_requiredSửa cấu hình có phiên bản cần If-Match (hoặc trường revision) với bản đã đọc.
429rate_limitedQuá 60 yêu cầu/phút cho một khoá hoặc kết nối — đợi theo Retry-After.
429too_many_open_operationsQuá nhiều lệnh đang mở cùng lúc — đợi bớt lệnh kết thúc.
500outcome_unknownKhông chắc lệnh đã chạy hay chưa — đọc lại lệnh theo mã, KHÔNG gửi lại.
500server_errorLỗi máy chủ — thử lại; lệnh WhatsApp không bao giờ tự gửi đôi.
503unavailableDịch vụ tạm thời không sẵn sàng — thử lại sau.
503pausedAPI/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

  1. Trong app AI, thêm connector / MCP server tuỳ chỉnh với địa chỉ https://<ten-mien-cua-ban>/mcp.
  2. 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.
  3. 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ó)11whoami, quick_search, numbers_list, number_get…
Hội thoại20inbox_summary, conversations_list, conversation_get, messages_list…
Số WhatsApp28numbers_list, number_get, number_add_options, number_create…
Khách hàng26crm_meta, contacts_list, contacts_count, contact_get…
Cấu hình CRM20tag_save, tag_delete, stage_save, stage_delete…
Nhóm23groups_summary, groups_list, group_get, group_members_list…
Chiến dịch15campaigns_meta, campaigns_list, campaign_get, campaign_save…
Tự động & lịch18campaign_waves, rules_list, rule_save, rule_enable…
Thư viện8library_get, template_save, template_delete, quick_reply_save…
Báo cáo5dashboard_get, report_get, notifications_list, notifications_unread_count…
Máy & proxy16machines_list, machine_get, machine_pairing_status, machine_update…
Quản trị workspace26inbox_settings_get, inbox_settings_save, member_numbers_set, my_working_hours_save…