API Reference
Dokumentasi lengkap API endpoint LMS Codeverta. Semua endpoint API berada di bawah prefix /api kecuali dinyatakan lain.
Base URL​
| Environment | Base URL |
|---|---|
| Development | http://localhost:3000/api |
| Production | https://lms.codeverta.com/api |
Format Request & Response​
Request Headers​
Content-Type: application/json
Authorization: Bearer <access_token>
Response Format (Success)​
{
"success": true,
"message": "Success message",
"data": { ... }
}
Response Format (Error)​
{
"success": false,
"message": "Error message",
"error": "Error details (optional)"
}
HTTP Status Codes​
| Code | Deskripsi |
|---|---|
200 | Success |
400 | Bad Request — Input tidak valid |
401 | Unauthorized — Token tidak ada/kadaluarsa |
403 | Forbidden — Tidak punya akses |
404 | Not Found — Resource tidak ditemukan |
429 | Too Many Requests — Rate limit exceeded |
500 | Internal Server Error |
Autentikasi​
Login​
Authentikasi user dan mendapatkan access token.
Endpoint: POST /api/auth/login
Rate Limit: Critical (ketat)
Request Body:
{
"email": "user@example.com",
"password": "password123"
}
Response:
{
"success": true,
"message": "Login successful",
"data": {
"user": {
"id": "uuid",
"email": "user@example.com",
"display_name": "Display Name",
"role": 1,
"status": 1
},
"access_token": "jwt-token",
"refresh_token": "jwt-refresh-token"
}
}
Register​
Mendaftarkan user baru.
Endpoint: POST /api/auth/register
Rate Limit: Critical
Request Body:
{
"username": "newuser",
"email": "newuser@example.com",
"password": "password123",
"display_name": "New User"
}
Refresh Token​
Memperbarui access token menggunakan refresh token.
Endpoint: POST /api/auth/refresh-token
Request Body:
{
"refresh_token": "jwt-refresh-token"
}
Logout​
Endpoint: GET /api/auth/logout
WebAuthn (Passkey)​
Begin Login​
Endpoint: POST /api/auth/webauthn/login/begin
Finish Login​
Endpoint: POST /api/auth/webauthn/login/finish
Begin Discoverable Login​
Endpoint: POST /api/auth/webauthn/login/discoverable/begin
Finish Discoverable Login​
Endpoint: POST /api/auth/webauthn/login/discoverable/finish
Begin Registration​
Endpoint: POST /api/auth/webauthn/register/begin
Auth: User
Finish Registration​
Endpoint: POST /api/auth/webauthn/register/finish
Auth: User
User & Profil​
Get Self Profile​
Endpoint: GET /api/user/self
Auth: User
Update Self Profile​
Endpoint: PUT /api/user/self
Auth: User
Request Body:
{
"display_name": "Nama Baru",
"avatar": "url-avatar"
}
Delete Self Account​
Endpoint: DELETE /api/user/self
Auth: User
Dashboard​
Get Overview​
Ringkasan dashboard untuk user yang sedang login.
Endpoint: GET /api/dashboard/overview
Auth: User
Manajemen Pengguna (Admin)​
Get All Users​
Endpoint: GET /api/users
Auth: Admin
Query Parameters:
| Parameter | Tipe | Deskripsi |
|---|---|---|
page | integer | Halaman (default: 1) |
page_size | integer | Jumlah per halaman (default: 10) |
role | integer | Filter role |
status | integer | Filter status |
search | string | Pencarian nama/email |
Create User​
Endpoint: POST /api/users
Auth: Admin
Request Body:
{
"name": "New User",
"email": "user@example.com",
"password": "password123",
"role": 1,
"status": 1
}
Get User Detail​
Endpoint: GET /api/users/:id/detail
Auth: Admin
Update User​
Endpoint: PUT /api/users/:id
Auth: Admin
Update User Status​
Endpoint: PUT /api/users/:id/status
Auth: Admin
Request Body:
{
"status": 1
}
Delete User​
Endpoint: DELETE /api/users/:id
Auth: Admin
Kursus​
List Courses (Public)​
Endpoint: GET /api/lms/courses
Auth: Public
Query Parameters:
| Parameter | Tipe | Deskripsi |
|---|---|---|
page | integer | Halaman |
category | string | Filter kategori |
level | string | Filter tingkat kesulitan |
search | string | Pencarian judul |
Get Public Course​
Endpoint: GET /api/lms/courses/:id/public
Auth: Public
Get Course Detail​
Endpoint: GET /api/lms/courses/:id
Auth: User
List My Courses​
Endpoint: GET /api/lms/my-courses
Auth: User
Course Categories​
Endpoint: GET /api/lms/course-categories
Auth: Public
Get Course Certificate​
Endpoint: GET /api/lms/courses/:id/certificate
Auth: User
Get Course Assignment Summary​
Endpoint: GET /api/lms/courses/:id/assignment-summary
Auth: User
Create Course (Admin)​
Endpoint: POST /api/lms/admin/courses
Auth: Admin
Request Body:
{
"title": "Judul Kursus",
"description": "Deskripsi kursus",
"category_id": "uuid",
"difficulty": "beginner",
"price": 150000,
"cover_image": "url-gambar"
}
Update Course (Admin)​
Endpoint: PUT /api/lms/admin/courses/:id
Auth: Admin
Delete Course (Admin)​
Endpoint: DELETE /api/lms/admin/courses/:id
Auth: Admin
Modul & Pelajaran​
List Modules​
Endpoint: GET /api/lms/modules
Auth: User
Query Parameters:
| Parameter | Tipe | Deskripsi |
|---|---|---|
course_id | string | ID kursus |
List Lessons​
Endpoint: GET /api/lms/lessons
Auth: User
Query Parameters:
| Parameter | Tipe | Deskripsi |
|---|---|---|
module_id | string | ID modul |
Get Lesson Detail​
Endpoint: GET /api/lms/lessons/:id
Auth: User
Mark Lesson Progress​
Endpoint: POST /api/lms/progress
Auth: User
Request Body:
{
"lesson_id": "uuid",
"status": "completed"
}
Continue Lesson​
Endpoint: POST /api/lms/lessons/:id/continue
Auth: User
Create Module (Admin)​
Endpoint: POST /api/lms/admin/modules
Auth: Admin
Request Body:
{
"course_id": "uuid",
"title": "Modul 1: Pendahuluan",
"order": 1
}
Reorder Modules (Admin)​
Endpoint: PUT /api/lms/admin/modules/reorder
Auth: Admin
Request Body:
{
"module_ids": ["uuid1", "uuid2", "uuid3"]
}
Create Lesson (Admin)​
Endpoint: POST /api/lms/admin/lessons
Auth: Admin
Request Body:
{
"module_id": "uuid",
"title": "Pelajaran 1.1",
"content_type": "video",
"content_url": "url-video",
"duration": 15
}
Kuis​
List Quizzes​
Endpoint: GET /api/lms/quizzes
Auth: User
Query Parameters:
| Parameter | Tipe | Deskripsi |
|---|---|---|
module_id | string | ID modul |
Get Quiz Detail​
Endpoint: GET /api/lms/quizzes/:id
Auth: User
Start Quiz Attempt​
Memulai sesi pengerjaan kuis baru.
Endpoint: POST /api/lms/quizzes/:id/start
Auth: User
List Quiz Attempts​
Endpoint: GET /api/lms/quizzes/:id/attempts
Auth: User
Save Quiz Answer​
Menyimpan jawaban kuis (per soal).
Endpoint: POST /api/lms/quiz-attempts/:id/answers
Auth: User
Request Body:
{
"question_id": "uuid",
"answer": ["option_id_1"]
}
Submit Quiz Attempt​
Mengirim seluruh jawaban kuis.
Endpoint: POST /api/lms/quiz-attempts/:id/submit
Auth: User
Get Quiz Attempt Detail​
Endpoint: GET /api/lms/quiz-attempts/:id
Auth: User
Create Quiz (Admin)​
Endpoint: POST /api/lms/admin/quizzes
Auth: Admin
Request Body:
{
"module_id": "uuid",
"title": "Kuis Modul 1",
"description": "Kerjakan soal berikut",
"duration_minutes": 30,
"passing_score": 70,
"max_attempts": 3,
"show_correct_answers": true,
"shuffle_questions": true
}
Update Quiz (Admin)​
Endpoint: PUT /api/lms/admin/quizzes/:id
Auth: Admin
Delete Quiz (Admin)​
Endpoint: DELETE /api/lms/admin/quizzes/:id
Auth: Admin
Publish Quiz (Admin)​
Endpoint: POST /api/lms/admin/quizzes/:id/publish
Auth: Admin
Create Quiz Question (Admin)​
Endpoint: POST /api/lms/admin/quizzes/:id/questions
Auth: Admin
Request Body:
{
"question_type": "multiple_choice",
"question_text": "Apa ibu kota Indonesia?",
"points": 10,
"options": [
{"option_text": "Jakarta", "is_correct": true},
{"option_text": "Surabaya", "is_correct": false},
{"option_text": "Bandung", "is_correct": false}
]
}
Update Quiz Question (Admin)​
Endpoint: PUT /api/lms/admin/quiz-questions/:id
Auth: Admin
Delete Quiz Question (Admin)​
Endpoint: DELETE /api/lms/admin/quiz-questions/:id
Auth: Admin
Reorder Quiz Questions (Admin)​
Endpoint: PUT /api/lms/admin/quizzes/:id/questions/reorder
Auth: Admin
Duplicate Question (Admin)​
Endpoint: POST /api/lms/admin/quiz-questions/:id/duplicate
Auth: Admin
Import Quiz Questions CSV (Admin)​
Endpoint: POST /api/lms/admin/quizzes/:id/import-csv
Auth: Admin
Export Quiz Results CSV (Admin)​
Endpoint: GET /api/lms/admin/quizzes/:id/export-results
Auth: Admin
Get Quiz Analytics (Admin)​
Endpoint: GET /api/lms/admin/quizzes/:id/analytics
Auth: Admin
Tugas (Assignments)​
Submit Assignment​
Endpoint: POST /api/lms/lessons/:id/assignments
Auth: User
Request Body:
{
"file_url": "url-tugas",
"notes": "Catatan tambahan"
}
Get Lesson Assignments​
Endpoint: GET /api/lms/lessons/:id/assignments
Auth: User
Get My Assignment​
Endpoint: GET /api/lms/lessons/:id/my-assignment
Auth: User
Grade Assignment (Mentor/Admin)​
Endpoint: POST /api/lms/assignments/:id/grade
Auth: User (mentor/admin)
Request Body:
{
"score": 85,
"feedback": "Bagus, tapi perlu diperbaiki bagian..."
}
Sertifikat​
List My Certificates​
Endpoint: GET /api/lms/my-certificates
Auth: User
Get Certificate Template (Admin)​
Endpoint: GET /api/lms/admin/courses/:id/certificate-template
Auth: Admin
Upsert Certificate Template (Admin)​
Endpoint: PUT /api/lms/admin/courses/:id/certificate-template
Auth: Admin
Upload Certificate Template Background (Admin)​
Endpoint: POST /api/lms/admin/courses/:id/certificate-template/upload
Auth: Admin
Delete Certificate Template (Admin)​
Endpoint: DELETE /api/lms/admin/courses/:id/certificate-template
Auth: Admin
Jadwal Belajar​
Get My Schedule​
Endpoint: GET /api/lms/my-schedule
Auth: User
Query Parameters:
| Parameter | Tipe | Deskripsi |
|---|---|---|
start_date | string | Tanggal mulai (YYYY-MM-DD) |
end_date | string | Tanggal akhir (YYYY-MM-DD) |
Create Schedule Item​
Endpoint: POST /api/lms/my-schedule/items
Auth: User
Request Body:
{
"title": "Belajar Python Dasar",
"date": "2026-01-15",
"start_time": "09:00",
"end_time": "10:30",
"description": "Fokus pada tipe data"
}
Update Schedule Item​
Endpoint: PUT /api/lms/my-schedule/items/:itemId
Auth: User
Delete Schedule Item​
Endpoint: DELETE /api/lms/my-schedule/items/:itemId
Auth: User
Schedule Templates​
| Method | Endpoint | Deskripsi | Auth |
|---|---|---|---|
| POST | /api/lms/schedule-templates | Buat template | User |
| GET | /api/lms/schedule-templates | List template | User |
| GET | /api/lms/schedule-templates/:id | Detail template | User |
| PUT | /api/lms/schedule-templates/:id | Update template | User |
| DELETE | /api/lms/schedule-templates/:id | Hapus template | User |
| POST | /api/lms/schedule-templates/:id/items | Tambah item template | User |
| PUT | /api/lms/schedule-template-items/:itemId | Update item template | User |
| DELETE | /api/lms/schedule-template-items/:itemId | Hapus item template | User |
| POST | /api/lms/schedule-templates/:id/assign | Assign template | User |
Chat​
List Conversations​
Endpoint: GET /api/lms/chat/conversations
Auth: User
Create Conversation​
Endpoint: POST /api/lms/chat/conversations
Auth: User
List Messages​
Endpoint: GET /api/lms/chat/conversations/:id/messages
Auth: User
Send Message​
Endpoint: POST /api/lms/chat/conversations/:id/messages
Auth: User
Request Body:
{
"content": "Halo, saya ingin bertanya...",
"message_type": "text"
}
Lesson AI Chat​
Chat dengan asisten AI berdasarkan konteks pelajaran.
Endpoint: POST /api/lms/chat/lessons/:lessonId/ai
Auth: User
Request Body:
{
"message": "Jelaskan konsep ini lebih detail"
}
Lesson AI History​
Endpoint: GET /api/lms/chat/lessons/:lessonId/ai/messages
Auth: User
Orang Tua & Siswa​
Parent Dashboard​
Endpoint: GET /api/lms/parent/dashboard
Auth: User (parent)
List Linked Students​
Endpoint: GET /api/lms/parent/students
Auth: User (parent)
Parent Student Detail​
Endpoint: GET /api/lms/parent/students/:student_id
Auth: User (parent)
Parent Student Progress​
Endpoint: GET /api/lms/parent/students/:student_id/progress
Auth: User (parent)
Parent Student Assignments​
Endpoint: GET /api/lms/parent/students/:student_id/assignments
Auth: User (parent)
Get Student Linking Code​
Endpoint: GET /api/lms/student/linking-code
Auth: User (student)
Link Student by Code​
Endpoint: POST /api/lms/parent/link-student
Auth: User (parent)
Request Body:
{
"linking_code": "ABC-123-XYZ"
}
Unlink Student​
Endpoint: DELETE /api/lms/parent/students/:id
Auth: User (parent)
Langganan & Pembayaran​
List Subscription Plans​
Endpoint: GET /api/lms/subscription-plans
Auth: Public
Get Pricing​
Endpoint: GET /api/lms/pricing
Auth: Public
List Payment Methods​
Endpoint: GET /api/lms/payment-methods
Auth: Public
List My Subscriptions​
Endpoint: GET /api/lms/my-subscriptions
Auth: User
Create Subscription​
Endpoint: POST /api/lms/subscriptions
Auth: User
Checkout Subscription​
Endpoint: POST /api/lms/subscription-checkout
Auth: User
Get Subscription Payment​
Endpoint: GET /api/lms/subscription-payments/:id
Auth: User
Cancel Subscription​
Endpoint: POST /api/lms/subscriptions/:id/cancel
Auth: User
Get Payments List (Admin)​
Endpoint: GET /api/lms/admin/payments
Auth: Admin
Create Payment Record (Admin)​
Endpoint: POST /api/lms/admin/payments
Auth: Admin
Xendit Payment Gateway​
Initiate Payment​
Memulai proses pembayaran melalui Xendit.
Endpoint: POST /api/xendit/payment/initiate
Request Body:
{
"order_id": "uuid",
"payment_method": "QRIS",
"amount": 150000
}
Check Payment Status​
Endpoint: GET /api/xendit/payment/check/:transaction_id
Get Latest Payment​
Endpoint: GET /api/xendit/payment/latest/:order_id
Xendit Webhook​
Endpoint: POST /api/xendit/webhook
Auth: Public (Xendit callback)
Orders​
Check Price​
Endpoint: POST /api/orders/check-price
Request Body:
{
"category_id": "uuid",
"quantity": 1,
"promo_code": "PROMO2026"
}
Get Orders​
Endpoint: GET /api/orders
Auth: User
Get Order​
Endpoint: GET /api/orders/:id
Auth: User
Update Order​
Endpoint: PUT /api/orders/:id
Auth: User
Delete Order​
Endpoint: DELETE /api/orders/:id
Auth: User
Resend Order Email​
Endpoint: POST /api/orders/:id/resend-email
Auth: User
Resend Payment Receipt​
Endpoint: POST /api/orders/:id/resend-receipt
Auth: User
Settings & Configuration​
Get Public Settings​
Endpoint: GET /api/settings
Auth: Public
Get Admin Settings​
Endpoint: GET /api/settings/admin
Auth: User
Update Settings​
Endpoint: PUT /api/settings
Auth: Admin
File Management​
Upload File​
Endpoint: POST /api/file
Auth: Admin
Content-Type: multipart/form-data
Max Size: 25MB
Get All Files​
Endpoint: GET /api/file
Auth: Admin
Search Files​
Endpoint: GET /api/file/search
Auth: Admin
Download File​
Endpoint: GET /api/file/download/:file
Auth: Admin (or public via /api/files/download/:file)
Delete File​
Endpoint: DELETE /api/file/:id
Auth: Admin
Audit Logs​
Get Audit Logs​
Endpoint: GET /api/audit-logs
Auth: Admin
Rate Limit: Critical
Query Parameters:
| Parameter | Tipe | Deskripsi |
|---|---|---|
page | integer | Halaman |
user_id | string | Filter user |
action | string | Filter aksi |
start_date | string | Rentang mulai |
end_date | string | Rentang akhir |
Email & Broadcast​
Send Bulk Email (Admin)​
Endpoint: POST /api/email/send-broadcast
Auth: Admin
SES Callback​
Endpoint: POST /api/webhooks/ses-callback
Auth: Public (webhook eksternal)
Get SES Callback Logs​
Endpoint: GET /api/ses-logs
Auth: User
Get SES Callback Stats​
Endpoint: GET /api/ses-logs/stats
Auth: User
Get SES Callback by ID​
Endpoint: GET /api/ses-logs/:id
Auth: User
LMS Admin Resources​
Dynamic resource management untuk entitas LMS.
List Admin Resource​
Endpoint: GET /api/lms/admin/resources/:resource
Auth: Admin
Supported Resources:
course-categorieslearning-assetslibrary-itemspricingsubscription-plansstudentsenrollments
Create Admin Resource​
Endpoint: POST /api/lms/admin/resources/:resource
Auth: Admin
Update Admin Resource​
Endpoint: PUT /api/lms/admin/resources/:resource/:id
Auth: Admin
Delete Admin Resource​
Endpoint: DELETE /api/lms/admin/resources/:resource/:id
Auth: Admin
Learning Assets & Library​
List Learning Assets​
Endpoint: GET /api/lms/learning-assets
Auth: User
Create Learning Asset (Admin)​
Endpoint: POST /api/lms/admin/learning-assets
Auth: Admin
List Library Items​
Endpoint: GET /api/lms/library-items
Auth: Public
Upsert Library Item (Admin)​
Endpoint: POST /api/lms/admin/library-items
Auth: Admin
Tenants​
Get All Tenants​
Endpoint: GET /api/tenants
Auth: Root Admin
Create Tenant​
Endpoint: POST /api/tenants
Auth: Root Admin
Get Tenant​
Endpoint: GET /api/tenants/:id
Auth: Root Admin
Update Tenant​
Endpoint: PUT /api/tenants/:id
Auth: Root Admin
Delete Tenant​
Endpoint: DELETE /api/tenants/:id
Auth: Root Admin
Regions​
Get Provinces​
Endpoint: GET /api/regions/provinces
Get Regencies by Province​
Endpoint: GET /api/regions/regencies/:provinceID
Get Districts by Regency​
Endpoint: GET /api/regions/districts/:regencyID
Health Check​
Server Health​
Endpoint: GET /health
Auth: Public
Response:
{
"status": "healthy",
"version": "1.0.0",
"time": "2026-06-13 19:00:00 WIB"
}
Rate Limiting​
| Middleware | Rate | Scope | Endpoints |
|---|---|---|---|
| Global API | 60 req/min | IP | Semua /api/* |
| Critical | 20 req/min | IP | Login, register, audit logs |
| Upload | 10 req/min | User | File upload |
Ketika rate limit tercapai, API akan mengembalikan status 429 Too Many Requests.
Error Codes Umum​
| Error | Penyebab | Solusi |
|---|---|---|
Invalid parameters | Request body tidak sesuai format | Periksa dokumentasi endpoint |
Unauthorized | Token tidak ada/kadaluarsa | Login ulang atau refresh token |
Insufficient permission | Role user tidak mencukupi | Hubungi admin untuk upgrade role |
User not found | User ID tidak valid | Periksa ID user |
Record not found | Resource tidak ditemukan | Periksa ID resource |
Rate limit exceeded | Terlalu banyak request | Tunggu sebelum mencoba lagi |
Terakhir diperbarui: Juni 2026