Skip to main content

API Reference

Dokumentasi lengkap API endpoint LMS Codeverta. Semua endpoint API berada di bawah prefix /api kecuali dinyatakan lain.


Base URL​

EnvironmentBase URL
Developmenthttp://localhost:3000/api
Productionhttps://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​

CodeDeskripsi
200Success
400Bad Request — Input tidak valid
401Unauthorized — Token tidak ada/kadaluarsa
403Forbidden — Tidak punya akses
404Not Found — Resource tidak ditemukan
429Too Many Requests — Rate limit exceeded
500Internal 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:

ParameterTipeDeskripsi
pageintegerHalaman (default: 1)
page_sizeintegerJumlah per halaman (default: 10)
roleintegerFilter role
statusintegerFilter status
searchstringPencarian 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:

ParameterTipeDeskripsi
pageintegerHalaman
categorystringFilter kategori
levelstringFilter tingkat kesulitan
searchstringPencarian 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:

ParameterTipeDeskripsi
course_idstringID kursus

List Lessons​

Endpoint: GET /api/lms/lessons

Auth: User

Query Parameters:

ParameterTipeDeskripsi
module_idstringID 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:

ParameterTipeDeskripsi
module_idstringID 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:

ParameterTipeDeskripsi
start_datestringTanggal mulai (YYYY-MM-DD)
end_datestringTanggal 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​

MethodEndpointDeskripsiAuth
POST/api/lms/schedule-templatesBuat templateUser
GET/api/lms/schedule-templatesList templateUser
GET/api/lms/schedule-templates/:idDetail templateUser
PUT/api/lms/schedule-templates/:idUpdate templateUser
DELETE/api/lms/schedule-templates/:idHapus templateUser
POST/api/lms/schedule-templates/:id/itemsTambah item templateUser
PUT/api/lms/schedule-template-items/:itemIdUpdate item templateUser
DELETE/api/lms/schedule-template-items/:itemIdHapus item templateUser
POST/api/lms/schedule-templates/:id/assignAssign templateUser

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)

Endpoint: POST /api/lms/parent/link-student

Auth: User (parent)

Request Body:

{
"linking_code": "ABC-123-XYZ"
}

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:

ParameterTipeDeskripsi
pageintegerHalaman
user_idstringFilter user
actionstringFilter aksi
start_datestringRentang mulai
end_datestringRentang 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-categories
  • learning-assets
  • library-items
  • pricing
  • subscription-plans
  • students
  • enrollments

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​

MiddlewareRateScopeEndpoints
Global API60 req/minIPSemua /api/*
Critical20 req/minIPLogin, register, audit logs
Upload10 req/minUserFile upload

Ketika rate limit tercapai, API akan mengembalikan status 429 Too Many Requests.


Error Codes Umum​

ErrorPenyebabSolusi
Invalid parametersRequest body tidak sesuai formatPeriksa dokumentasi endpoint
UnauthorizedToken tidak ada/kadaluarsaLogin ulang atau refresh token
Insufficient permissionRole user tidak mencukupiHubungi admin untuk upgrade role
User not foundUser ID tidak validPeriksa ID user
Record not foundResource tidak ditemukanPeriksa ID resource
Rate limit exceededTerlalu banyak requestTunggu sebelum mencoba lagi

Terakhir diperbarui: Juni 2026