Tài liệu này mô tả nhóm API download học liệu trên Trục LMS:
GET /api/lms-base/learning-resources/downloadGET /api/lms-base/learning-resources/{id}/downloadPOST /api/lms-base/learning-resources/download/batch
Môi trường endpoint:
- Môi trường Production (
PROD):https://partner.vstudy.edu.vn/ - Môi trường Development (
DEV):https://lmsbpartnerapi.vstudy.edu.vn/
Lưu ý: các ví dụ curl trong tài liệu này đang dùng endpoint môi trường Development (DEV). Khi triển khai thật, đổi sang môi trường Production (PROD).
Header dùng chung:
X-Api-Key: <api-key-don-vi-duoc-cap>Content-Type: application/json(cho APIPOST)
1. Quy tắc nghiệp vụ download
- Chỉ tải được học liệu có
ApprovalStatus = Approved. - Trạng thái kiểm duyệt cho phép tải:
ModerationStatus in (Normal, ReviewedSafe). - Học liệu
Pending,Rejected,Hidden,Removed,UnderReviewkhông cho tải. - Khi tải thành công, hệ thống tự ghi nhận lượt tải theo đơn vị tải.
- Lượt tải được ghi nhận theo ngữ cảnh đơn vị tải:
DoetCode,DivisionCode,SchoolCode,EducationLevelCode(không theo đơn vị chia sẻ học liệu).
1.1. Lưu ý triển khai bắt buộc cho đơn vị tích hợp
- Sau khi tải học liệu thành công, đơn vị cần tải đầy đủ tất cả file/media liên quan về lưu trữ cục bộ tại LMS của đơn vị:
thumbnailUrl- các URL file/media trong
contents[].content(bao gồm URL trongsrc/href/posternếutype=TEXT) - với
type=SCORM, tải file package.zipgốc
- Khi hiển thị học liệu trên LMS của đơn vị, nên dùng URL nội bộ đã lưu cục bộ thay vì phụ thuộc trực tiếp URL trên trục.
- Mục tiêu là bảo đảm học liệu vẫn sử dụng được ổn định nếu sau này học liệu trên trục bị gỡ bỏ, thay đổi đường dẫn, hoặc thay đổi quyền truy cập.
2. Tra cứu danh sách học liệu cho phép tải
- Method:
GET - Path:
/api/lms-base/learning-resources/download
2.1. Query params
| Field | Kiểu dữ liệu | Giới hạn | Bắt buộc | Ghi chú |
|---|---|---|---|---|
educationLevelCode | string / null | Tối đa 20 ký tự | Không | Lọc theo cấp học |
doetCode | string / null | Tối đa 20 ký tự | Không | Lọc theo Sở GDĐT |
divisionCode | string / null | Tối đa 20 ký tự | Không | Lọc theo xã/phường |
schoolCode | string / null | Tối đa 50 ký tự | Không | Lọc theo trường |
gradeCode | string / null | Tối đa 20 ký tự | Không | Lọc theo khối |
subjectCode | string / null | Tối đa 20 ký tự | Không | Lọc theo môn |
orderBy | int / null | 1 hoặc 2 | Không | 1=ViewCount, 2=LikeCount. Mặc định: 1 |
skip | int / null | >= 0 | Không | Mặc định 0 |
take | int / null | 1..200 | Không | Mặc định 20 |
Ví dụ:
curl --location --get 'https://lmsbpartnerapi.vstudy.edu.vn/api/lms-base/learning-resources/download' \
--header 'X-Api-Key: <api-key-don-vi-duoc-cap>' \
--data-urlencode 'doetCode=01' \
--data-urlencode 'educationLevelCode=02' \
--data-urlencode 'orderBy=1' \
--data-urlencode 'skip=0' \
--data-urlencode 'take=20'bash
items[].contents ở API này chỉ trả metadata nội dung (id, name, type, displayOrder, description), không trả trường content.
Ví dụ response:
{
"success": true,
"message": "Lấy danh sách học liệu tải về thành công.",
"data": {
"total": 120,
"skip": 0,
"take": 20,
"items": [
{
"id": "01KPPVMHC7Z9BTY2P6XGW3F1GF",
"title": "Bài học: So sánh phân số",
"thumbnailUrl": "https://cdn.example.vn/partner/thumb-phan-so.png",
"doetCode": "01",
"divisionCode": "0001",
"divisionName": "Phường A",
"schoolCode": "0100004006",
"schoolName": "THCS B",
"educationLevelCode": "04",
"educationLevelName": "Trung học cơ sở",
"yearCode": 2025,
"yearName": "Năm học 2025-2026",
"semesterCode": 1,
"semesterName": "Học kỳ 1",
"gradeCode": "06",
"gradeName": "Lớp 6",
"subjectCode": "0601",
"subjectName": "Toán",
"knowledgeUnitCode": "201100101",
"knowledgeUnitName": "So sánh phân số",
"authorName": "Nguyễn Văn A",
"viewCount": 1200,
"likeCount": 230,
"downloadCount": 58,
"contents": [
{
"id": "01KPPVQ0PKY33AYZ6T72PC6C2V",
"learningResourceId": "01KPPVMHC7Z9BTY2P6XGW3F1GF",
"name": "Nội dung chính",
"displayOrder": 1,
"type": "TEXT",
"description": "Mô tả ngắn"
}
],
"createdAt": "2026-04-20T08:30:00Z",
"updatedAt": "2026-04-22T10:00:00Z"
}
]
}
}json
3. Tải chi tiết 1 học liệu
- Method:
GET - Path:
/api/lms-base/learning-resources/{id}/download
3.1. Query params đơn vị tải
| Field | Kiểu dữ liệu | Bắt buộc | Giới hạn | Ghi chú |
|---|---|---|---|---|
doetCode | string | Có | Tối đa 20 ký tự | Mã Sở của đơn vị tải |
divisionCode | string / null | Không | Tối đa 20 ký tự | Mã xã/phường quản lý của đơn vị tải |
schoolCode | string | Có | Tối đa 50 ký tự | Mã trường của đơn vị tải |
educationLevelCode | string | Có | Tối đa 20 ký tự | Mã cấp học của đơn vị tải |
contentIds | array<string> / null | Không | Tối đa 200 ULID/lần | Nếu bỏ trống thì trả toàn bộ nội dung; nếu truyền thì mỗi id phải thuộc học liệu |
Ví dụ tải toàn bộ nội dung:
curl --location --get 'https://lmsbpartnerapi.vstudy.edu.vn/api/lms-base/learning-resources/01KPPVMHC7Z9BTY2P6XGW3F1GF/download' \
--header 'X-Api-Key: <api-key-don-vi-duoc-cap>' \
--data-urlencode 'doetCode=01' \
--data-urlencode 'schoolCode=0100004006' \
--data-urlencode 'educationLevelCode=04'bash
Ví dụ tải chọn lọc theo nội dung:
curl --location --get 'https://lmsbpartnerapi.vstudy.edu.vn/api/lms-base/learning-resources/01KPPVMHC7Z9BTY2P6XGW3F1GF/download' \
--header 'X-Api-Key: <api-key-don-vi-duoc-cap>' \
--data-urlencode 'doetCode=01' \
--data-urlencode 'schoolCode=0100004006' \
--data-urlencode 'educationLevelCode=04' \
--data-urlencode 'contentIds=01KPPVQ0PKY33AYZ6T72PC6C2V'bash
Ví dụ response:
{
"success": true,
"message": "Tải dữ liệu học liệu thành công.",
"data": {
"id": "01KPPVMHC7Z9BTY2P6XGW3F1GF",
"title": "Bài học: So sánh phân số",
"partnerName": "LMS Partner A",
"thumbnailUrl": "https://cdn.example.vn/partner/thumb-phan-so.png",
"doetCode": "01",
"divisionCode": "0001",
"divisionName": "Phường A",
"schoolCode": "0100004006",
"schoolName": "THCS B",
"educationLevelCode": "04",
"educationLevelName": "Trung học cơ sở",
"yearCode": 2025,
"yearName": "Năm học 2025-2026",
"semesterCode": 1,
"semesterName": "Học kỳ 1",
"gradeCode": "06",
"gradeName": "Lớp 6",
"subjectCode": "0601",
"subjectName": "Toán",
"knowledgeUnitCode": "201100101",
"knowledgeUnitName": "So sánh phân số",
"authorName": "Nguyễn Văn A",
"contents": [
{
"id": "01KPPVQ0PKY33AYZ6T72PC6C2V",
"learningResourceId": "01KPPVMHC7Z9BTY2P6XGW3F1GF",
"name": "Nội dung chính",
"displayOrder": 1,
"type": "TEXT",
"content": "<p>Nội dung đã chuẩn hóa</p>",
"description": "Mô tả ngắn"
},
{
"id": "01KPPVQ57SP4J5N7VE6P0E4G5A",
"learningResourceId": "01KPPVMHC7Z9BTY2P6XGW3F1GF",
"name": "Bài giảng SCORM",
"displayOrder": 2,
"type": "SCORM",
"content": "https://cdn.example.vn/partner/scorm/bai-giang.zip",
"description": "SCORM gốc để tải"
}
],
"createdAt": "2026-04-20T08:30:00Z",
"updatedAt": "2026-04-22T10:00:00Z"
}
}json
Lưu ý SCORM khi download:
contents[].contentcủatype=SCORMtrả về URL package.zipgốc để đơn vị tải xuống.- Không trả URL trang view SCORM nội bộ của hệ thống.
4. Tải theo lô nhiều học liệu
- Method:
POST - Path:
/api/lms-base/learning-resources/download/batch
Request body:
{
"doetCode": "01",
"divisionCode": "0001",
"schoolCode": "0100004006",
"educationLevelCode": "04",
"ids": [
"01KPPVMHC7Z9BTY2P6XGW3F1GF",
"01KPPVMHC7Z9BTY2P6XGW3F1GG"
]
}json
Ràng buộc:
idsbắt buộc, không rỗng.- Tối đa
200id/lần. - Mỗi id phải đúng định dạng ULID.
- Trùng id trong cùng request sẽ bị từ chối.
- Kết quả có thể thành công một phần; cần đọc
data[].success.
Ví dụ response tải lô (thành công một phần):
{
"success": false,
"message": "Xử lý tải 2 học liệu, thành công 1, thất bại 1.",
"data": [
{
"id": "01KPPVMHC7Z9BTY2P6XGW3F1GF",
"success": true,
"message": "Tải dữ liệu học liệu thành công.",
"data": {
"id": "01KPPVMHC7Z9BTY2P6XGW3F1GF",
"title": "Bài học: So sánh phân số",
"contents": [
{
"id": "01KPPVQ0PKY33AYZ6T72PC6C2V",
"learningResourceId": "01KPPVMHC7Z9BTY2P6XGW3F1GF",
"name": "Nội dung chính",
"displayOrder": 1,
"type": "TEXT",
"content": "<p>Nội dung đã chuẩn hóa</p>",
"description": "Mô tả ngắn"
}
]
}
},
{
"id": "01KPPVMHC7Z9BTY2P6XGW3F1GG",
"success": false,
"message": "Không tìm thấy học liệu.",
"data": null
}
]
}json
5. Ghi nhận lượt tải
Các API tải chi tiết (GET {id}/download) và tải lô (POST download/batch) tự động ghi nhận lượt tải khi xử lý thành công.
- Nếu ghi nhận lượt tải lỗi, API trả thông báo:
Không thể ghi nhận lượt tải học liệu ở thời điểm hiện tại.
- Với tải lô, lỗi có thể xảy ra theo từng phần tử trong
data[].
6. Lỗi thường gặp
| Message lỗi | Nguyên nhân | Cách xử lý |
|---|---|---|
Chỉ cho phép tải học liệu đã duyệt và không thuộc trạng thái tạm ẩn/gỡ bỏ. | Học liệu chưa đạt điều kiện tải | Chỉ tải học liệu đã duyệt, trạng thái kiểm duyệt cho phép |
Mã sở giáo dục của đơn vị tải là bắt buộc. | Thiếu doetCode | Bổ sung doetCode hợp lệ |
Mã trường của đơn vị tải là bắt buộc. | Thiếu schoolCode | Bổ sung schoolCode hợp lệ |
Mã cấp học của đơn vị tải là bắt buộc. | Thiếu educationLevelCode | Bổ sung educationLevelCode hợp lệ |
Số lượng ContentIds tối đa trong một lần tải là 200. | Truyền quá số lượng cho phép | Chia nhỏ request |
ContentId không thuộc học liệu: ... | contentIds không nằm trong học liệu yêu cầu | Lấy lại danh sách nội dung đúng của học liệu rồi gọi lại |
Số lượng Id tối đa trong một lần tải là 200. | Tải lô vượt giới hạn | Chia nhỏ theo lô |
Không tìm thấy học liệu. | Id không tồn tại hoặc không còn khả dụng | Kiểm tra lại id trước khi tải |
7. Reference liên quan
- Tài liệu tổng quan dùng chung: Hướng dẫn tích hợp API Chia sẻ học liệu
- Danh mục mapping mã dùng chung theo Sở: knowledge-units
