Phiên bản API v1
Tài liệu API AxisMeet
AxisMeet là hạ tầng phòng họp trực tuyến. Máy chủ hình tiếng do AxisMeet vận hành, ứng dụng của bạn không cần biết gì về WebRTC — chỉ gọi API để tạo phòng, xin vé cho từng người, rồi mở liên kết phòng trong trình duyệt.
Gọi POST /api/v1/phong, lưu maPhong trả về cùng buổi học phía bạn.
Gọi POST /api/v1/phong/{maPhong}/ve, chuyển người dùng tới liên kết nhận được.
Gọi GET /api/v1/phong/{maPhong} để biết ai vào, lúc nào, ở bao lâu.
Địa chỉ gốc: https://meet.axisdev.vn
Xác thực
Mỗi ứng dụng được cấp một cặp apiKey và apiSecret. Gửi kèm trong header của mọi lời gọi:
Authorization: Bearer ak_xxxxxxxx:sk_xxxxxxxxHoặc tách thành hai header nếu hệ thống của bạn tiện hơn:
X-Api-Key: ak_xxxxxxxx
X-Api-Secret: sk_xxxxxxxxKhóa bí mật chỉ hiện đúng một lần lúc cấp và lưu dạng băm, không ai đọc lại được. Mất khóa thì cấp khóa mới trong trang quản trị — khóa cũ mất hiệu lực ngay lập tức.
Khóa chỉ được dùng ở phía máy chủ. Đừng nhúng vào mã chạy trên trình duyệt hay ứng dụng di động.
Quy ước chung
Mọi phản hồi đều là JSON theo một trong hai dạng:
{ "thanhCong": true, "duLieu": { ... } }
{ "thanhCong": false, "loi": "Mô tả lỗi bằng tiếng Việt" }maPhonggồm chữ thường và dấu gạch ngang, dạngabc-defg-hij.- Thời điểm theo chuẩn ISO 8601, múi giờ UTC.
- Danh sách có phân trang qua
trangvàmoiTrang, tối đa 100 dòng mỗi trang.
Tạo phòng
Tham số
| Tên | Kiểu | Mô tả |
|---|---|---|
tenbắt buộc | chuỗi | Tên phòng hiển thị cho người tham gia |
cheDo | GROUP | ONE_ON_ONE | Mặc định GROUP. Chế độ ONE_ON_ONE tự giới hạn 2 người |
soNguoiToiDa | số | Tối đa bằng hạn mức của ứng dụng. Bỏ trống thì lấy đúng hạn mức |
maNgoai | chuỗi | Mã buổi học phía bạn, dùng để đối chiếu và tra cứu |
batDauDuKien | ISO 8601 | Thời điểm dự kiến bắt đầu |
ketThucDuKien | ISO 8601 | Thời điểm dự kiến kết thúc |
dungMaThamGia | true | false | Bật thì sinh mã 6 số riêng cho chủ phòng và cho khách |
Ví dụ
curl -X POST https://meet.axisdev.vn/api/v1/phong \
-H "Authorization: Bearer $AXISMEET_KEY:$AXISMEET_SECRET" \
-H "Content-Type: application/json" \
-d '{
"ten": "Lớp TCF nhóm buổi tối",
"cheDo": "GROUP",
"soNguoiToiDa": 8,
"maNgoai": "buoi-2026-09-28-A"
}'Phản hồi · 201
{
"thanhCong": true,
"duLieu": {
"maPhong": "kmt-pdrs-nhq",
"ten": "Lớp TCF nhóm buổi tối",
"cheDo": "GROUP",
"trangThai": "OPEN",
"soNguoiToiDa": 8,
"maChuPhong": null,
"maKhach": null,
"maNgoai": "buoi-2026-09-28-A",
"lienKetThamGia": "https://meet.axisdev.vn/phong/kmt-pdrs-nhq",
"taoLuc": "2026-09-28T12:00:00.000Z"
}
}Danh sách phòng
Tham số truy vấn
| Tên | Kiểu | Mô tả |
|---|---|---|
trangThai | OPEN | LOCKED | CLOSED | Lọc theo trạng thái phòng |
maNgoai | chuỗi | Tìm đúng phòng theo mã buổi học phía bạn |
trang | số | Mặc định 1 |
moiTrang | số | Mặc định 20, tối đa 100 |
Mỗi phòng trả kèm soNguoiDangTrongPhong đếm trực tiếp từ máy chủ video — dùng được để hiện dấu "đang có người" trên lịch của bạn.
Chi tiết phòng
Trả về đầy đủ thông tin phòng và lichSuThamGia — 50 lượt gần nhất, mỗi lượt có tên, thời điểm vào, thời điểm ra và số giây có mặt. Đây là số liệu để đối chiếu giờ dạy.
{
"thanhCong": true,
"duLieu": {
"maPhong": "kmt-pdrs-nhq",
"trangThai": "OPEN",
"soNguoiDangTrongPhong": 3,
"lichSuThamGia": [
{
"ten": "Cô Lan",
"danhTinh": "gv-17",
"vaiTro": "HOST",
"vaoLuc": "2026-09-28T12:01:10.000Z",
"raLuc": "2026-09-28T13:32:44.000Z",
"soGiay": 5494
}
]
}
}Sửa phòng
| Tên | Kiểu | Mô tả |
|---|---|---|
ten | chuỗi | Đổi tên phòng |
soNguoiToiDa | số | Chỉ áp dụng cho phòng chế độ GROUP |
batDauDuKien | ISO 8601 | Gửi null để xóa |
ketThucDuKien | ISO 8601 | Gửi null để xóa |
trangThai | OPEN | LOCKED | CLOSED | Xem bảng bên dưới |
Ba trạng thái phòng
OPEN— ai có mã đều vào được.LOCKED— chỉ vé vai tròHOSTvào được. Dùng khi lớp đã bắt đầu và không muốn ai vào giữa chừng.CLOSED— đóng hẳn, người đang trong phòng bị ngắt kết nối.
Đóng phòng
Tương đương đổi trangThai sang CLOSED. Bản ghi phòng vẫn giữ lại để tra số liệu về sau, không bị xóa khỏi hệ thống.
Phát vé vào phòng
Gọi mỗi khi một người bấm vào lớp. Vé có hiệu lực 4 giờ và chỉ dùng được cho đúng phòng đó. Đây là chỗ hệ thống của bạn quyết định ai được vào — AxisMeet không biết học viên của bạn là ai.
Tham số
| Tên | Kiểu | Mô tả |
|---|---|---|
tenbắt buộc | chuỗi | Tên hiển thị trong phòng |
danhTinh | chuỗi | Mã người dùng phía bạn. Nên có, để số liệu quy được về đúng người |
vaiTro | HOST | GUEST | HOST cho giáo viên, GUEST cho học viên. Mặc định GUEST |
Ví dụ
curl -X POST https://meet.axisdev.vn/api/v1/phong/kmt-pdrs-nhq/ve \
-H "Authorization: Bearer $AXISMEET_KEY:$AXISMEET_SECRET" \
-H "Content-Type: application/json" \
-d '{ "danhTinh": "gv-17", "ten": "Cô Lan", "vaiTro": "HOST" }'Phản hồi · 200
{
"thanhCong": true,
"duLieu": {
"maPhong": "kmt-pdrs-nhq",
"ten": "Lớp TCF nhóm buổi tối",
"maTruyCap": "eyJhbGciOiJIUzI1NiJ9...",
"diaChiMayChu": "wss://meet.axisdev.vn",
"hetHanLuc": "2026-09-28T16:00:00.000Z",
"maDieuKhien": "eyJhbGciOiJIUzI1NiJ9...",
"choPhepGhiHinh": true,
"lienKetThamGia": "https://meet.axisdev.vn/phong/kmt-pdrs-nhq?ve=..."
}
}Cách đơn giản nhất: chuyển người dùng tới lienKetThamGia. Nếu muốn nhúng phòng vào giao diện riêng, dùng maTruyCap và diaChiMayChu với thư viện khách LiveKit.
Ghi hình buổi họp
Ghi hình phải được bật cho ứng dụng của bạn trong trang quản trị. Khi đã bật, vé vai trò HOST sẽ kèm thêm maDieuKhien — thứ duy nhất mở được chức năng ghi hình. Học viên không có mã này nên không tự quay được buổi học.
Không cần xác thực. Trả về phòng có đang được ghi hay không, ai bật và bật từ lúc nào.
{
"thanhCong": true,
"duLieu": {
"choPhep": true,
"dangGhi": true,
"dangXuLy": false,
"batDauLuc": "2026-09-28T12:05:00.000Z",
"nguoiBatDau": "Cô Lan"
}
}Gửi kèm header X-Ma-Dieu-Khien lấy từ vé chủ phòng. Mỗi phòng chỉ ghi được một bản tại một thời điểm.
curl -X POST https://meet.axisdev.vn/api/phong/kmt-pdrs-nhq/ghi-hinh \
-H "X-Ma-Dieu-Khien: $MA_DIEU_KHIEN"Cũng cần X-Ma-Dieu-Khien. Sau khi dừng, file mất khoảng vài chục giây để xử lý xong, rồi tải về được trong trang quản trị.
Người vận hành hạ tầng nhìn thấy mọi bản ghi và tải về được. Hãy báo trước cho người học rằng buổi học có thể được ghi lại — trong phòng luôn hiện dấu chấm đỏ "Đang ghi hình" khi máy đang quay.
Thống kê sử dụng
| Tên | Kiểu | Mô tả |
|---|---|---|
tu | ISO 8601 | Mặc định 30 ngày trước |
den | ISO 8601 | Mặc định thời điểm hiện tại |
{
"thanhCong": true,
"duLieu": {
"tongSoPhong": 128,
"phongDangMo": 12,
"soLuotThamGia": 940,
"soNguoiKhacNhau": 86,
"soPhutNguoi": 41230,
"phongDungNhieuNhat": [ { "maPhong": "...", "soPhutNguoi": 1840 } ],
"hanMuc": { "soPhongDongThoi": 2, "soNguoiMoiPhong": 20 }
}
}soPhutNguoi là tổng số phút của tất cả người tham gia cộng lại — dùng để đối chiếu giờ dạy hoặc chia chi phí nội bộ giữa các bộ phận.
Mã lỗi
Lỗi luôn trả { "thanhCong": false, "loi": "..." } kèm mã HTTP tương ứng:
| Mã | Ý nghĩa | Cách xử lý |
|---|---|---|
| 401 | Khóa sai hoặc thiếu | Kiểm tra lại header, hoặc cấp khóa mới |
| 403 | Ứng dụng bị tạm ngưng, phòng của ứng dụng khác, hoặc chưa được bật ghi hình | Liên hệ người vận hành hạ tầng |
| 404 | Không tìm thấy phòng | Kiểm tra mã phòng đã lưu |
| 409 | Phòng đã đóng, đã đủ người, hoặc đang ghi hình rồi | Mở phòng khác hoặc nâng hạn mức |
| 422 | Dữ liệu gửi lên không hợp lệ | Đọc trường loi để biết sai chỗ nào |
| 423 | Phòng đang khóa, chỉ chủ phòng vào được | Xin vé vai trò HOST, hoặc mở khóa phòng |
| 429 | Hết số phòng đồng thời của gói | Chờ phòng khác kết thúc, hoặc nâng hạn mức |
| 503 | Máy chủ chưa bật tính năng ghi hình | Liên hệ người vận hành hạ tầng |
Mã 429 đáng chú ý khi xếp lịch: nó cho biết khung giờ đó đã dùng hết số phòng được phép chạy song song, nên chặn được việc xếp trùng ngay từ lúc tạo lịch.
Ví dụ tích hợp
Một lớp gọi API gọn cho ứng dụng Node.js hoặc Next.js:
const GOC = process.env.AXISMEET_URL;
const KHOA = `${process.env.AXISMEET_KEY}:${process.env.AXISMEET_SECRET}`;
async function goi(duongDan, tuyChon = {}) {
const phanHoi = await fetch(`${GOC}${duongDan}`, {
...tuyChon,
headers: {
authorization: `Bearer ${KHOA}`,
"content-type": "application/json",
...tuyChon.headers,
},
});
const ketQua = await phanHoi.json();
if (!phanHoi.ok || !ketQua.thanhCong) throw new Error(ketQua.loi ?? "Lỗi AxisMeet");
return ketQua.duLieu;
}
export function taoPhongChoBuoiHoc(buoi) {
return goi("/api/v1/phong", {
method: "POST",
body: JSON.stringify({
ten: buoi.tenLop,
cheDo: buoi.soHocVien > 1 ? "GROUP" : "ONE_ON_ONE",
soNguoiToiDa: buoi.soHocVien + 1,
maNgoai: buoi.id,
batDauDuKien: buoi.batDau,
ketThucDuKien: buoi.ketThuc,
}),
});
}
export function xinVe(maPhong, nguoi) {
return goi(`/api/v1/phong/${maPhong}/ve`, {
method: "POST",
body: JSON.stringify({
danhTinh: nguoi.id,
ten: nguoi.hoTen,
vaiTro: nguoi.laGiaoVien ? "HOST" : "GUEST",
}),
});
}
export function soLieuBuoiHoc(maPhong) {
return goi(`/api/v1/phong/${maPhong}`);
}Xử lý lỗi hết phòng khi xếp lịch
try {
const ve = await xinVe(buoi.maPhong, nguoiDung);
return { chuyenToi: ve.lienKetThamGia };
} catch (loi) {
if (String(loi.message).includes("phòng đồng thời")) {
return { thongBao: "Khung giờ này đã kín phòng, vui lòng chọn giờ khác" };
}
throw loi;
}