BAB 29. REST API SPECIFICATION
Standar API
| Item | Nilai |
|---|---|
| Base URL | /api/v1 |
| Format | JSON (application/json) |
| Authentication | Laravel Sanctum (Bearer Token) |
| Versioning | URL Versioning (/api/v1/...) |
| Error Format | RFC 7807 Problem Details |
Format Response Sukses
{
"success": true,
"message": "Berhasil",
"data": { }
}
Format Response Error
{
"success": false,
"message": "Pesan error",
"errors": { }
}
Authentication
POST /api/v1/auth/login
Login pengguna dengan NISN atau NIP.
Request:
{
"username": "1234567890",
"password": "1234567890"
}
Response 200 OK:
{
"success": true,
"data": {
"token": "1|abc123xyz...",
"user": {
"id": 1,
"name": "Thomas Andi",
"username": "1234567890",
"role": "student",
"must_change_password": false
}
}
}
POST /api/v1/auth/change-password
🔒 Requires Auth
Request:
{
"current_password": "1234567890",
"password": "NewPass123",
"password_confirmation": "NewPass123"
}
POST /api/v1/auth/logout
🔒 Requires Auth — Revoke token aktif.
Profile
GET /api/v1/profile
🔒 Requires Auth — Mengambil profil pengguna yang sedang login.
Response 200 OK:
{
"data": {
"id": 1,
"name": "Thomas Andi",
"role": "student",
"level": 5,
"xp": 1250,
"sis_score": 87.5,
"average_rating": 4.8,
"classroom": "XII IPA 1"
}
}
PUT /api/v1/profile
🔒 Requires Auth — Update profil pengguna.
GET /api/v1/profile/skills
🔒 Requires Auth — Daftar skill siswa.
PUT /api/v1/profile/skills
🔒 Requires Auth — Update skill siswa.
Request:
{
"skill_ids": [1, 3, 7, 12]
}
Requests
GET /api/v1/requests
🔒 Requires Auth — Daftar request milik siswa yang login.
Query Params: status, per_page, page
POST /api/v1/requests
🔒 Requires Auth (student) — Membuat request baru.
Request:
{
"subject_id": 2,
"topic_id": 8,
"description": "Saya tidak mengerti cara menghitung integral lipat dua",
"preferred_location": "Perpustakaan Lantai 2",
"latitude": -6.200000,
"longitude": 106.816666,
"preferred_time": "2026-08-10T14:00:00",
"duration_minutes": 90,
"tutor_count": 1
}
GET /api/v1/requests/{id}
🔒 Detail satu request.
PUT /api/v1/requests/{id}
🔒 Update request (hanya jika status pending).
DELETE /api/v1/requests/{id}
🔒 Batalkan request (hanya jika belum on_going).
Booking
POST /api/v1/bookings/{id}/accept
🔒 Requires Auth (tutor) — Terima request.
Request:
{
"scheduled_at": "2026-08-10T14:00:00"
}
POST /api/v1/bookings/{id}/reject
🔒 Requires Auth (tutor) — Tolak request.
Request:
{
"reason": "Saya sedang ada ujian"
}
POST /api/v1/bookings/{id}/reschedule
🔒 Requires Auth (tutor) — Ajukan jadwal alternatif.
Request:
{
"reschedule_time": "2026-08-11T10:00:00"
}
Meeting
POST /api/v1/meetings/check-in
🔒 Requires Auth — Check-In sesi dengan QR + GPS.
Request:
{
"qr_token": "abc123...",
"latitude": -6.200000,
"longitude": 106.816666
}
Response 200 OK:
{
"success": true,
"message": "Check-In berhasil! Sesi dimulai.",
"data": {
"meeting_id": 42,
"check_in_at": "2026-08-10T14:02:35",
"status": "on_going"
}
}
POST /api/v1/meetings/check-out
🔒 Requires Auth — Check-Out sesi.
Request:
{
"meeting_id": 42,
"summary": "Berhasil memahami konsep integral lipat dua"
}
POST /api/v1/meetings/{id}/summary
🔒 Upload dokumentasi atau foto sesi.
Rating
POST /api/v1/ratings
🔒 Requires Auth — Submit rating setelah sesi selesai.
Request:
{
"meeting_id": 42,
"ratee_id": 7,
"score": 5,
"comment": "Penjelasannya sangat jelas dan sabar",
"is_solved": true
}
Leaderboard
GET /api/v1/leaderboard
🔒 Requires Auth — Daftar leaderboard berdasarkan SIS atau XP.
Query Params: type=sis|xp, period=2026-1, per_page=20
Dashboard
GET /api/v1/dashboard/student
🔒 Requires Role: student — Statistik dan ringkasan untuk siswa.
GET /api/v1/dashboard/teacher
🔒 Requires Role: teacher — Monitoring dan statistik untuk guru.
GET /api/v1/dashboard/admin
🔒 Requires Role: admin — Statistik sekolah untuk admin.
HTTP Status Codes
| Kode | Makna |
|---|---|
200 OK | Permintaan berhasil |
201 Created | Data berhasil dibuat |
401 Unauthorized | Token tidak valid atau tidak ada |
403 Forbidden | Role tidak memiliki izin |
404 Not Found | Data tidak ditemukan |
422 Unprocessable Entity | Validasi gagal |
429 Too Many Requests | Rate limit tercapai |
500 Internal Server Error | Error sistem |