CareChat Bot API
Gửi thông báo từ hệ thống của bạn tới khách hàng, nhân viên hoặc nhóm trên CareChat, và nhận tin nhắn họ gửi lại để trả lời tự động. Cách dùng giống Telegram Bot API: một token, gọi HTTPS, nhận JSON.
Giới thiệu
Bot là một tài khoản đặc biệt trên CareChat do bạn tạo ra và điều khiển bằng mã (token). Bot dùng được cho hai việc:
- Gửi thông báo một chiều: đơn hàng mới, OTP nội bộ, cảnh báo máy chủ, nhắc lịch... tới một người hoặc cả nhóm.
- Nối hội thoại hai chiều: nhận tin người dùng gửi cho bot (qua
getUpdateshoặc webhook) rồi trả lời bằng chatbot, CRM, hệ thống CSKH của bạn.
Người dùng tìm bot bằng @username trong ô tìm kiếm tin nhắn của CareChat, bấm Bắt đầu, hoặc thêm bot vào nhóm như thêm một thành viên. Bot chỉ nhắn được cho người đã bắt đầu chat với bot và nhóm có bot - không thể tự nhắn người lạ.
Bắt đầu nhanh
- Đăng nhập my.carechat.vn/bots → Tạo bot: đặt tên và username (kết thúc bằng
bot, vdshop_bot). Sao chép token dạng123:AbCd.... - Trên CareChat, người nhận tìm
@shop_bot→ mở chat → bấm Bắt đầu (gửi/start). Muốn gửi vào nhóm: thêm@shop_botvào nhóm. - Gọi
getUpdatesđể thấy tin/startvà lấymessage.chat.id(hoặc gọigetChatsđể liệt kê mọi cuộc trò chuyện bot đang ở). - Gửi tin bằng
sendMessagevớichat_idvừa lấy.
Kiểm tra token:
curl "https://api.carechat.vn/api/chatapp/bot/123:AbCdEfGhIjKlMnOpQrStUvWxYz0123456789_-Xy/getMe"Cách gọi API
Mọi method có dạng:
https://api.carechat.vn/api/chatapp/bot/<TOKEN>/<method>- Dùng
GEThoặcPOST. Tham số gửi qua query string, JSON (application/json), form (application/x-www-form-urlencoded) hoặcmultipart/form-data(bắt buộc khi tải file ảnh lên). - Tên method không phân biệt hoa thường. Dữ liệu và kết quả dùng UTF-8.
- Thành công: HTTP 200 với
{"ok": true, "result": ...}. Lỗi: mã HTTP bằngerror_codekèmdescriptionmô tả lý do (tiếng Việt).
{
"ok": false,
"error_code": 400,
"description": "Không tìm thấy cuộc trò chuyện (chat_id sai hoặc bot không ở trong cuộc trò chuyện này)"
}chat_id là gì
Mỗi cuộc trò chuyện có một mã số công khai chat_id (giống Telegram). Bot dùng mã này để gửi tin; mã có sẵn trong mọi tin / cập nhật bot nhận được ở message.chat.id.
| Loại | Dạng chat_id | Ví dụ |
|---|---|---|
| Chat riêng với bot | 10 chữ số | 4829104731 |
| Nhóm | -100 + 10 chữ số | -1007426193058 |
getChats để lấy mã mới. Truyền chat_id dạng số hoặc chuỗi đều được.Gửi thông báo
Gửi tin văn bản
sendMessage gửi tối đa 4000 ký tự (hỗ trợ emoji, xuống dòng). Muốn trả lời một tin cụ thể thì thêm reply_to_message_id.
curl -X POST "https://api.carechat.vn/api/chatapp/bot/123:AbCdEfGhIjKlMnOpQrStUvWxYz0123456789_-Xy/sendMessage" \
-H "Content-Type: application/json" \
-d '{"chat_id": -1001234567890, "text": "Đơn hàng #1024 đã giao thành công ✅"}'Gửi ảnh
sendPhoto nhận file tải lên (multipart, trường photo) hoặc URL ảnh http(s) công khai. JPEG / PNG / GIF / WebP, tối đa 10 MB, kèm chú thích caption.
# Tải file ảnh lên (multipart)
curl -X POST "https://api.carechat.vn/api/chatapp/bot/123:AbCdEfGhIjKlMnOpQrStUvWxYz0123456789_-Xy/sendPhoto" \
-F chat_id=1234567890 \
-F caption="Hoá đơn tháng 10" \
-F [email protected]
# Hoặc đưa URL ảnh công khai
curl -X POST "https://api.carechat.vn/api/chatapp/bot/123:AbCdEfGhIjKlMnOpQrStUvWxYz0123456789_-Xy/sendPhoto" \
-H "Content-Type: application/json" \
-d '{"chat_id": 1234567890, "photo": "https://example.com/banner.jpg", "caption": "Khuyến mãi"}'Sửa / xoá tin đã gửi
Lưu result.message_id sau khi gửi để sửa nội dung bằng editMessageText (vd cập nhật trạng thái đơn) hoặc thu hồi bằng deleteMessage.
Nhận tin nhắn (getUpdates)
Mỗi khi người dùng nhắn cho bot, sửa tin, hoặc thêm / mời bot ra khỏi nhóm, CareChat tạo một cập nhật (Update) có update_id tăng dần. Cách đơn giản nhất để nhận là long polling: gọi getUpdates với timeout tới 50 giây - không có tin thì máy chủ giữ kết nối và trả về ngay khi có tin mới.
- Gửi
offset=update_idlớn nhất đã xử lý + 1 để xác nhận; các cập nhật cũ hơn bị xoá khỏi hàng đợi. - Cập nhật chưa xác nhận được giữ 24 giờ, tối đa 1000 cập nhật mỗi bot (quá thì bỏ cái cũ nhất).
- Không dùng được
getUpdateskhi bot đang đặt webhook (lỗi 409).
// Bot trả lời tự động bằng long polling (không cần máy chủ có IP / tên miền công khai)
let offset = 0;
while (true) {
const res = await fetch(`${API}/getUpdates?timeout=50&offset=${offset}`);
const { ok, result, description } = await res.json();
if (!ok) {
console.error(description);
await new Promise((r) => setTimeout(r, 5000));
continue;
}
for (const update of result) {
offset = update.update_id + 1; // lần gọi sau xác nhận đã xử lý
const msg = update.message;
if (!msg?.text) continue;
if (msg.text.startsWith('/start')) {
await sendMessage(msg.chat.id, `Chào ${msg.from.first_name}! Mã chat của bạn là ${msg.chat.id}`);
} else {
await sendMessage(msg.chat.id, 'Shop đã nhận tin, nhân viên sẽ phản hồi sớm.');
}
}
}Một cập nhật tin nhắn:
{
"update_id": 1042,
"message": {
"message_id": 8812,
"from": { "id": 315, "is_bot": false, "first_name": "Nguyễn Văn A" },
"chat": { "id": 4829104731, "type": "private", "first_name": "Nguyễn Văn A" },
"date": 1791709842,
"text": "/start",
"entities": [{ "type": "bot_command", "offset": 0, "length": 6 }]
}
}Webhook (nhận tin tức thì)
Có máy chủ HTTPS công khai thì đặt webhook: mỗi cập nhật được POST (JSON một Update) tới URL của bạn ngay khi phát sinh, không cần giữ kết nối polling.
curl -X POST "https://api.carechat.vn/api/chatapp/bot/123:AbCdEfGhIjKlMnOpQrStUvWxYz0123456789_-Xy/setWebhook" \
-H "Content-Type: application/json" \
-d '{"url": "https://shop.example.com/carechat/webhook", "secret_token": "chuoi_bi_mat_cua_ban"}'- URL phải là
https://, cổng 443, 80, 88 hoặc 8443, tên miền trỏ ra Internet (không nhận IP nội bộ). - Header
X-CareChat-Bot-Api-Secret-Token(vàX-Telegram-Bot-Api-Secret-Tokencho thư viện Telegram) mangsecret_tokenbạn đặt - hãy kiểm tra để chặn request giả. - Trả mã
2xxtrong 15 giây = đã nhận. Lỗi / quá giờ thì CareChat gửi lại theo đúng thứ tự, giãn cách 5 giây tăng dần tới 10 phút, trong 24 giờ. Xem lỗi gần nhất bằnggetWebhookInfohoặc ở trang Bot. - Gỡ webhook để quay lại polling:
deleteWebhook(thêmdrop_pending_updates=trueđể bỏ cập nhật đang chờ).
import express from 'express';
const app = express();
app.use(express.json());
app.post('/carechat/webhook', async (req, res) => {
// Chỉ nhận request mang đúng secret_token đã đặt ở setWebhook
if (req.get('X-CareChat-Bot-Api-Secret-Token') !== process.env.CARECHAT_WEBHOOK_SECRET) {
return res.sendStatus(403);
}
res.sendStatus(200); // trả 2xx ngay, xử lý sau (quá 15 giây bị tính là lỗi và gửi lại)
const msg = req.body.message;
if (msg?.text) await sendMessage(msg.chat.id, 'Shop đã nhận: ' + msg.text);
});
app.listen(3000);Bot trong nhóm
Chủ / quản trị nhóm thêm bot bằng @username như thêm thành viên. Bot nhận cập nhật my_chat_member (trạng thái member) kèm chat_id của nhóm; bị mời ra thì trạng thái left.
{
"update_id": 1043,
"my_chat_member": {
"chat": { "id": -1007426193058, "type": "group", "title": "Kho Hà Nội" },
"from": { "id": 315, "is_bot": false, "first_name": "Nguyễn Văn A" },
"date": 1791709900,
"old_chat_member": { "user": { "id": 57, "is_bot": true, "first_name": "CSKH Shop", "username": "shop_bot" }, "status": "left" },
"new_chat_member": { "user": { "id": 57, "is_bot": true, "first_name": "CSKH Shop", "username": "shop_bot" }, "status": "member" }
}
}Chế độ riêng tư (mặc định bật): trong nhóm bot chỉ nhận tin bắt đầu bằng lệnh /... (vd /baocao, /baocao@shop_bot), tin có nhắc @shop_bot và tin trả lời tin của bot. Tắt chế độ này ở trang Bot → Cài đặt nếu bot cần đọc mọi tin trong nhóm. Chat riêng luôn nhận mọi tin. Bot không nhận tin của bot khác.
Danh sách method
GET / POSTgetMe
Kiểm tra token, trả thông tin bot (User có thêm can_join_groups, can_read_all_group_messages).
GET / POSTsendMessage
Gửi tin văn bản. Trả về Message đã gửi.
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| chat_id | Số / chuỗi | Có | chat_id của cuộc trò chuyện bot đang ở |
| text | Chuỗi | Có | Nội dung, 1-4000 ký tự. Hiển thị dạng văn bản thuần (chưa hỗ trợ parse_mode HTML / Markdown). |
| reply_to_message_id | Số | Không | Trả lời một tin trong cùng cuộc trò chuyện |
| reply_parameters | JSON | Không | Cách viết mới của Telegram: {"message_id": 8812} |
GET / POSTsendPhoto
Gửi một ảnh. Trả về Message đã gửi.
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| chat_id | Số / chuỗi | Có | chat_id của cuộc trò chuyện bot đang ở |
| photo | File / URL | Có | File tải lên (multipart) hoặc URL http(s) công khai. JPEG, PNG, GIF, WebP, tối đa 10 MB. |
| caption | Chuỗi | Không | Chú thích, tối đa 4000 ký tự |
| reply_to_message_id | Số | Không | Trả lời một tin |
GET / POSTeditMessageText
Sửa nội dung tin văn bản do chính bot gửi. Trả về Message sau khi sửa (người dùng thấy nhãn "đã sửa").
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| chat_id | Số / chuỗi | Có | chat_id của cuộc trò chuyện bot đang ở |
| message_id | Số | Có | Tin của bot |
| text | Chuỗi | Có | Nội dung mới |
GET / POSTdeleteMessage
Thu hồi tin do bot gửi. Trả true.
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| chat_id | Số / chuỗi | Có | chat_id của cuộc trò chuyện bot đang ở |
| message_id | Số | Có | Tin cần xoá |
GET / POSTgetUpdates
Lấy cập nhật mới (long polling). Trả mảng Update theo thứ tự update_id.
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| offset | Số | Không | update_id đầu tiên cần lấy; mọi cập nhật nhỏ hơn được xác nhận và xoá. Số âm -N = chỉ giữ N cập nhật mới nhất. |
| limit | Số | Không | 1-100, mặc định 100 |
| timeout | Số | Không | Số giây chờ khi chưa có cập nhật, 0-50 (mặc định 0 = trả về ngay) |
| allowed_updates | Mảng JSON | Không | Loại cập nhật nhận: message, edited_message, my_chat_member (mặc định cả ba). Được lưu lại cho lần sau. |
GET / POSTsetWebhook
Đặt webhook. Trả true.
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| url | Chuỗi | Có | URL https nhận cập nhật |
| secret_token | Chuỗi | Không | 1-256 ký tự A-Z a-z 0-9 _ -, gửi lại trong header X-CareChat-Bot-Api-Secret-Token |
| drop_pending_updates | Boolean | Không | Bỏ các cập nhật đang chờ |
| allowed_updates | Mảng JSON | Không | Như getUpdates |
GET / POSTdeleteWebhook
Gỡ webhook, quay lại dùng getUpdates. Tham số drop_pending_updates (tuỳ chọn). Trả true.
GET / POSTgetWebhookInfo
Trạng thái webhook: url, pending_update_count, last_error_date, last_error_message, allowed_updates.
GET / POSTgetChat
Thông tin một cuộc trò chuyện (Chat) kèm member_count. Tham số chat_id.
GET / POSTgetChatMemberCount
Số thành viên (tính cả bot). Tham số chat_id.
GET / POSTgetChats
Riêng CareChat: liệt kê mọi cuộc trò chuyện bot đang ở (mảng Chat có member_count) - tiện lấy lại chat_id mà không cần đọc cập nhật cũ.
GET / POSTleaveChat
Bot rời nhóm. Tham số chat_id (chỉ nhóm). Trả true.
GET / POSTgetFile
Thông tin file ảnh trong tin (file_id lấy từ message.photo): file_size, mime_type, file_path. Tải nội dung file bằng:
GET https://api.carechat.vn/api/chatapp/botfile/<TOKEN>/<file_id>Đối tượng dữ liệu
Update
Có update_id và đúng một trong các trường: message (tin mới), edited_message (tin vừa sửa), my_chat_member (bot được thêm vào / rời cuộc trò chuyện; người dùng mở chat riêng với bot cũng tạo cập nhật này).
User
{ "id": 315, "is_bot": false, "first_name": "Nguyễn Văn A" }
// Bot: { "id": 57, "is_bot": true, "first_name": "CSKH Shop", "username": "shop_bot" }Để bảo vệ người dùng, Bot API không trả email / số điện thoại của họ.
Chat
| Trường | Mô tả |
|---|---|
id | chat_id (số) |
type | "private" (chat riêng với bot) hoặc "group" |
title | Tên nhóm (nhóm) |
first_name | Tên người dùng (chat riêng) |
member_count | Chỉ có ở getChat / getChats |
Message
{
"message_id": 8812,
"from": User,
"chat": { "id": -1007426193058, "type": "group", "title": "Kho Hà Nội" },
"date": 1791709842, // Unix time (giây)
"edit_date": 1791709900, // có khi tin đã sửa
"text": "Nội dung", // tin văn bản
"entities": [ { "type": "bot_command", "offset": 0, "length": 6 } ],
"caption": "Chú thích", // tin ảnh
"photo": [ { "file_id": "991", "file_unique_id": "991", "width": 1280, "height": 720, "file_size": 183022 } ],
"photos": [ ... ], // tin nhiều ảnh: đủ mọi ảnh (photo chỉ có ảnh đầu)
"reply_to_message": Message // tin được trả lời (một tầng)
}Giới hạn & mã lỗi
| Giới hạn | Giá trị |
|---|---|
| Tin văn bản / chú thích | 4000 ký tự |
| Ảnh | 10 MB / ảnh, JPEG / PNG / GIF / WebP |
| Tốc độ gọi API | Khoảng 300 request / phút mỗi bot (vượt mức nhận 429, đọc header Retry-After) |
| Cập nhật chờ | Tối đa 1000 / bot, giữ 24 giờ |
| Long polling | timeout tối đa 50 giây |
| Số bot | 20 bot mỗi tài khoản |
| error_code | Ý nghĩa |
|---|---|
| 400 | Tham số sai, chat_id không tồn tại / bot không ở trong cuộc trò chuyện, tin quá dài... |
| 401 | Token sai, đã đổi, hoặc bot đang tắt |
| 404 | Method không tồn tại / không tìm thấy file |
| 409 | Gọi getUpdates khi đang có webhook |
| 413 | Dữ liệu gửi lên quá lớn |
| 429 | Gọi quá nhanh, thử lại sau Retry-After giây |
| 503 | CareChat đang bảo trì |
So với Telegram Bot API
Tên method, tham số và đối tượng đặt theo Telegram nên nhiều thư viện Telegram dùng lại được bằng cách đổi địa chỉ API (vd python-telegram-bot base_url="https://api.carechat.vn/api/chatapp/bot/"). Khác biệt chính:
- Chỉ hỗ trợ các method liệt kê ở trên; gọi method khác nhận 404.
- Tin hiển thị văn bản thuần, chưa định dạng HTML / Markdown (parse_mode bị bỏ qua).
- Nhóm có
typelàgroup(không có supergroup / channel).photochỉ có một kích thước. - Tải file qua
/botfile/<TOKEN>/<file_id>thay vì/file/bot<TOKEN>/<file_path>. - Có thêm
getChatsvà trườngphotos(tin nhiều ảnh).
Bảo mật
- Token là mật khẩu của bot: chỉ để ở máy chủ (biến môi trường), không đưa vào mã chạy trên trình duyệt / app.
- Lộ token: vào trang Bot → Đổi token, token cũ hết hiệu lực ngay.
- Webhook: luôn đặt
secret_tokenvà kiểm tra header trước khi xử lý. - Tắt bot (trang Bot → Cài đặt) để tạm dừng mọi lời gọi API mà không mất cấu hình.