AxisMeet

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.

Tạo phòng khi xếp lịch

Gọi POST /api/v1/phong, lưu maPhong trả về cùng buổi học phía bạn.

Phát vé khi có người vào

Gọi POST /api/v1/phong/{maPhong}/ve, chuyển người dùng tới liên kết nhận được.

Lấy số liệu sau buổi họ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_xxxxxxxx

Hoặ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_xxxxxxxx

Khó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" }
  • maPhong gồm chữ thường và dấu gạch ngang, dạng abc-defg-hij.
  • Thời điểm theo chuẩn ISO 8601, múi giờ UTC.
  • Danh sách có phân trang qua trang và moiTrang, tối đa 100 dòng mỗi trang.

Tạo phòng

POST/api/v1/phongTạo một phòng mới

Tham số

TênKiểuMô tả
tenbắt buộcchuỗiTên phòng hiển thị cho người tham gia
cheDoGROUP | ONE_ON_ONEMặc định GROUP. Chế độ ONE_ON_ONE tự giới hạn 2 người
soNguoiToiDasố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
maNgoaichuỗiMã buổi học phía bạn, dùng để đối chiếu và tra cứu
batDauDuKienISO 8601Thời điểm dự kiến bắt đầu
ketThucDuKienISO 8601Thời điểm dự kiến kết thúc
dungMaThamGiatrue | falseBậ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

GET/api/v1/phongLiệt kê phòng của ứng dụng

Tham số truy vấn

TênKiểuMô tả
trangThaiOPEN | LOCKED | CLOSEDLọc theo trạng thái phòng
maNgoaichuỗiTìm đúng phòng theo mã buổi học phía bạn
trangsốMặc định 1
moiTrangsố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

GET/api/v1/phong/{maPhong}Thông tin phòng kèm lịch sử tham gia

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

PATCH/api/v1/phong/{maPhong}Đổi thông tin hoặc trạng thái
TênKiểuMô tả
tenchuỗiĐổi tên phòng
soNguoiToiDasốChỉ áp dụng cho phòng chế độ GROUP
batDauDuKienISO 8601Gửi null để xóa
ketThucDuKienISO 8601Gửi null để xóa
trangThaiOPEN | LOCKED | CLOSEDXem 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ò HOST và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

DELETE/api/v1/phong/{maPhong}Lối tắt đó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

POST/api/v1/phong/{maPhong}/veCấp quyền vào phòng cho một người

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ênKiểuMô tả
tenbắt buộcchuỗiTên hiển thị trong phòng
danhTinhchuỗiMã người dùng phía bạn. Nên có, để số liệu quy được về đúng người
vaiTroHOST | GUESTHOST 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.

GET/api/phong/{maPhong}/ghi-hinhXem trạng thái ghi hình

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"
  }
}
POST/api/phong/{maPhong}/ghi-hinhBắt đầu ghi hình

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"
DELETE/api/phong/{maPhong}/ghi-hinhDừng ghi hình

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

GET/api/v1/thong-keSố liệu tổng hợp theo khoảng thời gian
TênKiểuMô tả
tuISO 8601Mặc định 30 ngày trước
denISO 8601Mặ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ĩaCách xử lý
401Khóa sai hoặc thiếuKiể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ìnhLiên hệ người vận hành hạ tầng
404Không tìm thấy phòngKiểm tra mã phòng đã lưu
409Phòng đã đóng, đã đủ người, hoặc đang ghi hình rồiMở phòng khác hoặc nâng hạn mức
422Dữ liệu gửi lên không hợp lệĐọc trường loi để biết sai chỗ nào
423Phòng đang khóa, chỉ chủ phòng vào đượcXin vé vai trò HOST, hoặc mở khóa phòng
429Hết số phòng đồng thời của góiChờ phòng khác kết thúc, hoặc nâng hạn mức
503Máy chủ chưa bật tính năng ghi hìnhLiê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;
}