CareChat
Nhà phát triển

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 getUpdates hoặ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

  1. Đăng nhập my.carechat.vn/bots → Tạo bot: đặt tên và username (kết thúc bằng bot, vd shop_bot). Sao chép token dạng 123:AbCd....
  2. 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_bot vào nhóm.
  3. Gọi getUpdates để thấy tin /start và lấy message.chat.id (hoặc gọi getChats để liệt kê mọi cuộc trò chuyện bot đang ở).
  4. Gửi tin bằng sendMessage với chat_id vừ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 GET hoặc POST. Tham số gửi qua query string, JSON (application/json), form (application/x-www-form-urlencoded) hoặc multipart/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ằng error_code kèm description mô 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ạiDạng chat_idVí dụ
Chat riêng với bot10 chữ số4829104731
Nhóm-100 + 10 chữ số-1007426193058
Chủ / quản trị nhóm có thể đổi chat_id của nhóm (khi lộ mã). Khi đó gọi 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_id lớ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 getUpdates khi 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-Token cho thư viện Telegram) mang secret_token bạn đặt - hãy kiểm tra để chặn request giả.
  • Trả mã 2xx trong 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ằng getWebhookInfo hoặc ở trang Bot.
  • Gỡ webhook để quay lại polling: deleteWebhook (thêm drop_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ểuBắt buộcMô tả
chat_idSố / chuỗiCóchat_id của cuộc trò chuyện bot đang ở
textChuỗiCó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_idSốKhôngTrả lời một tin trong cùng cuộc trò chuyện
reply_parametersJSONKhôngCá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ểuBắt buộcMô tả
chat_idSố / chuỗiCóchat_id của cuộc trò chuyện bot đang ở
photoFile / URLCóFile tải lên (multipart) hoặc URL http(s) công khai. JPEG, PNG, GIF, WebP, tối đa 10 MB.
captionChuỗiKhôngChú thích, tối đa 4000 ký tự
reply_to_message_idSốKhôngTrả 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ểuBắt buộcMô tả
chat_idSố / chuỗiCóchat_id của cuộc trò chuyện bot đang ở
message_idSốCóTin của bot
textChuỗiCóNội dung mới

GET / POSTdeleteMessage

Thu hồi tin do bot gửi. Trả true.

Tham sốKiểuBắt buộcMô tả
chat_idSố / chuỗiCóchat_id của cuộc trò chuyện bot đang ở
message_idSố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ểuBắt buộcMô tả
offsetSốKhôngupdate_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.
limitSốKhông1-100, mặc định 100
timeoutSốKhôngSố giây chờ khi chưa có cập nhật, 0-50 (mặc định 0 = trả về ngay)
allowed_updatesMảng JSONKhôngLoạ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ểuBắt buộcMô tả
urlChuỗiCóURL https nhận cập nhật
secret_tokenChuỗiKhông1-256 ký tự A-Z a-z 0-9 _ -, gửi lại trong header X-CareChat-Bot-Api-Secret-Token
drop_pending_updatesBooleanKhôngBỏ các cập nhật đang chờ
allowed_updatesMảng JSONKhôngNhư 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ườngMô tả
idchat_id (số)
type"private" (chat riêng với bot) hoặc "group"
titleTên nhóm (nhóm)
first_nameTên người dùng (chat riêng)
member_countChỉ 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ạnGiá trị
Tin văn bản / chú thích4000 ký tự
Ảnh10 MB / ảnh, JPEG / PNG / GIF / WebP
Tốc độ gọi APIKhoả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 pollingtimeout tối đa 50 giây
Số bot20 bot mỗi tài khoản
error_codeÝ nghĩa
400Tham số sai, chat_id không tồn tại / bot không ở trong cuộc trò chuyện, tin quá dài...
401Token sai, đã đổi, hoặc bot đang tắt
404Method không tồn tại / không tìm thấy file
409Gọi getUpdates khi đang có webhook
413Dữ liệu gửi lên quá lớn
429Gọi quá nhanh, thử lại sau Retry-After giây
503CareChat đang bảo trì
Gọi sai token liên tục
Nhiều request token sai / đường dẫn không tồn tại từ cùng một IP có thể khiến IP đó bị chặn tạm thời. Hãy dừng tiến trình khi nhận 401.

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ó type là group (không có supergroup / channel). photo chỉ 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 getChats và trường photos (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_token và 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.