Lewati ke konten utama

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