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