API Documentation
Dokumentasi lengkap untuk mengintegrasikan aplikasi Anda dengan SMAGE ID. API ini menyediakan akses data member yang terdaftar di sistem SSO.
Daftar Isi
1 Autentikasi
Setiap request ke API harus menyertakan API Key melalui HTTP header. API key didapatkan dari admin panel ScholarGate di menu Portal & API.
| Header | Tipe | Keterangan |
|---|---|---|
X-API-Key |
string | Wajib. API key 64 karakter yang digenerate dari admin panel. |
Verifikasi Domain
Selain API key, sistem juga memverifikasi domain pengirim request melalui header Origin atau Referer. Domain harus cocok dengan yang didaftarkan saat generate API key.
* saat development untuk melewati pengecekan domain.
2 Base URL
https://portal.smage.my.id/api/v1
3 Endpoints
/api/v1/test
Endpoint sederhana untuk mengetes koneksi API dan memastikan API key + verifikasi domain sudah benar. Cocok dipakai sebagai health-check oleh aplikasi pendukung.
Contoh Request
curl -X GET "https://portal.smage.my.id/api/v1/test" \
-H "X-API-Key: YOUR_API_KEY_HERE"
Contoh Response (200 OK)
{
"success": true,
"data": {
"status": "ok",
"server_time": "2026-04-03T12:34:56+07:00"
},
"meta": {
"app_name": "CBT Exam System",
"request_domain": "app-pendukung.sch.id",
"request_domain_source": "origin",
"origin": "https://app-pendukung.sch.id",
"referer": null,
"ip": "203.0.113.10"
}
}
Catatan Role keluar: dipakai untuk siswa mutasi/keluar (non-aktif). Data masih bisa diakses via API, namun user tidak dapat login/claim akun sampai admin mengembalikan role menjadi siswa.
/api/v1/members
Mengambil seluruh data member yang terdaftar di database ScholarGate SSO.
Query Parameters (Opsional)
| Parameter | Tipe | Default | Keterangan |
|---|---|---|---|
search |
string | - | Cari berdasarkan nama, NIK, NISN, NIS, NIP, email |
email |
string | - | Cari spesifik berdasarkan Google Email member |
role |
string | - | Filter role: siswa, guru, tendik, alumni, keluar |
page |
integer | 1 | Nomor halaman |
per_page |
integer | 50 | Jumlah data per halaman (maks 100) |
Contoh Request
curl -X GET "https://portal.smage.my.id/api/v1/members?role=siswa&page=1&per_page=10" \
-H "X-API-Key: YOUR_API_KEY_HERE"
Contoh Response (200 OK)
{
"success": true,
"data": [
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"nama": "Ahmad Rizky Pratama",
"role": "siswa",
"jenis_kelamin": "L",
"nik": "3275011234560001",
"nomor_kk": "3174010101010101",
"nisn": "0051234567",
"nis": "2024.10.001",
"nip": null,
"tempat_lahir": "Jakarta",
"tanggal_lahir": "2008-03-15",
"agama": "Islam",
"kelas": "XII IPA 1",
"academic_year_id": "8d3h-7ns8-29sj-10dm",
"academic_year_name": "2024/2025",
"google_email": "ahmad.rizky@school.sch.id",
"google_name": "Ahmad Rizky Pratama",
"google_avatar": "https://lh3.googleusercontent.com/...",
"email_pribadi": "ahmad@gmail.com",
"no_telepon": "081234567890",
"alamat": "Jl. Merdeka No. 123",
"kode_pos": "11750",
"ayah_nama": "Budi Pratama",
"ibu_nama": "Siti Pratama",
"wali_nama": null,
"is_claimed": true,
"claimed_at": "2025-03-15 10:30:00",
"created_at": "2025-01-01 08:00:00",
"updated_at": "2025-03-15 10:30:00"
}
],
"meta": {
"total": 150,
"page": 1,
"per_page": 10,
"total_pages": 15,
"app_name": "CBT Exam System"
}
}
/api/v1/members/lookup
Mencari satu member secara spesifik berdasarkan email Google mereka. Endpoint ini berguna bagi aplikasi pendukung untuk mengecek apakah user Google sudah terdaftar di SSO ScholarGate sebelum mengizinkan login lokal.
Query Parameters
| Parameter | Tipe | Default | Keterangan |
|---|---|---|---|
email |
string | - | Wajib. Email Google pengguna. |
Contoh Request
curl -X GET "https://portal.smage.my.id/api/v1/members/lookup?email=ahmad.rizky@school.sch.id" \
-H "X-API-Key: YOUR_API_KEY_HERE"
Contoh Response (200 OK - Jika ditemukan)
{
"success": true,
"found": true,
"data": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"nama": "Ahmad Rizky Pratama",
"role": "siswa",
"google_email": "ahmad.rizky@school.sch.id"
// ... field lainnya (NIK/NISN/NIS, biodata, orang tua/wali, dll) ...
},
"meta": {
"app_name": "CBT Exam System"
}
}
Contoh Response (404 Not Found - Jika tidak ada)
{
"success": false,
"found": false,
"error": "Member not found",
"message": "Email ahmad.rizky@school.sch.id belum terdaftar di SSO. Pengguna harus mendaftar di ScholarGate terlebih dahulu."
}
/api/v1/academic-year/active
Mengambil data tahun pelajaran yang sedang aktif di sistem.
Contoh Request
curl -X GET "https://portal.smage.my.id/api/v1/academic-year/active" \
-H "X-API-Key: YOUR_API_KEY_HERE"
Contoh Response (200 OK)
{
"success": true,
"data": {
"id": "8d3h-7ns8-29sj-10dm",
"name": "2024/2025",
"is_active": true,
"created_at": "2024-06-01 00:00:00"
},
"meta": {
"app_name": "CBT Exam System"
}
}
4 Error Handling
| HTTP Code | Error | Penyebab |
|---|---|---|
| 401 | API key is required | Header X-API-Key tidak disertakan |
| 403 | Unauthorized | API key salah, nonaktif, atau domain tidak cocok |
{
"success": false,
"error": "Unauthorized",
"message": "API key tidak valid atau domain tidak sesuai dengan yang terdaftar."
}
5 Contoh Implementasi
P PHP (cURL)
<?php
$apiKey = 'YOUR_API_KEY_HERE';
$baseUrl = 'https://portal.smage.my.id/api/v1';
$ch = curl_init($baseUrl . '/members?role=siswa&per_page=20');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'X-API-Key: ' . $apiKey,
],
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode === 200) {
$data = json_decode($response, true);
foreach ($data['data'] as $member) {
echo $member['nama'] . ' - ' . $member['kelas'] . "\n";
}
} else {
echo "Error: " . $response;
}
JS JavaScript (Fetch)
const API_KEY = 'YOUR_API_KEY_HERE';
const BASE_URL = 'https://portal.smage.my.id/api/v1';
async function getMembers(role = '', page = 1) {
const params = new URLSearchParams({ role, page, per_page: 20 });
const response = await fetch(
`${BASE_URL}/members?${params}`,
{
headers: {
'X-API-Key': API_KEY,
}
}
);
if (!response.ok) {
const err = await response.json();
throw new Error(err.message);
}
return await response.json();
}
// Usage
getMembers('siswa')
.then(res => console.log(res.data))
.catch(err => console.error(err));
Py Python (requests)
import requests
API_KEY = 'YOUR_API_KEY_HERE'
BASE_URL = 'https://portal.smage.my.id/api/v1'
headers = {
'X-API-Key': API_KEY,
}
response = requests.get(
f'{BASE_URL}/members',
headers=headers,
params={'role': 'guru', 'per_page': 50}
)
if response.status_code == 200:
data = response.json()
for member in data['data']:
print(f"{member['nama']} - {member['role']}")
else:
print(f"Error {response.status_code}: {response.text}")