Pilih bahasa

Pilihan ini berlaku untuk seluruh situs dan tersimpan di perangkat Anda.

Integrasi mitra & vendor

API mitra untuk data sekolah.

Baca sekolah, staf, tagihan, dan kehadiran dari SekolahOS lewat REST yang berversi dan bertanda tangan.

Permukaan integrasi

Domain yang terbuka untuk mitra

Setiap kunci API diberi cakupan per domain dan per sekolah. Cakupan yang tidak diminta tidak pernah terbaca.

Batas data SekolahOS tidak menyimpan data penggajian atau kompensasi. Permukaan mitra hanya memaparkan nama, NIP, dan status kepegawaian — gaji, komponen upah, potongan, dan slip tetap berada di sistem penggajian Anda sebagai sumber kebenaran.
roster.read · roster.pii

Roster & staf

Yayasan, sekolah, dan staf aktif beserta NIP dan status kepegawaian. NIK hanya untuk kunci dengan roster.pii.

finance.read

Keuangan

Tagihan beserta total, terbayar, dan sisa terutang. Uang selalu string 2dp dengan mata uang.

attendance.read

Kehadiran

Rekap harian per siswa dengan enam status tetap. Foto gerbang tidak pernah diekspor.

events

Kejadian

Webhook bertanda tangan atau polling untuk siswa baru, pembayaran ter-settle, dan rotasi kunci. Berlaku untuk semua kunci.

01

Autentikasi yang bisa dirotasi

Pasangan key-id dan secret per yayasan, ditandatangani HMAC-SHA256 per permintaan. Rotasi tanpa downtime.

02

Aman diulang

Setiap endpoint mutasi menerima Idempotency-Key. Kirim ulang permintaan yang sama dan Anda mendapat respons yang sama.

03

Webhook, dengan jaring polling

Webhook bertanda tangan untuk kejadian domain, lima kali coba ulang — dan endpoint events bila penerima Anda pernah mati.

MCP

Sambungkan asisten AI ke data sekolah.

Claude Desktop, Claude Code, Cursor, dan klien MCP lain bisa membaca data sekolah Anda lewat Partner API. Hanya-baca, dibatasi cakupan kunci, dan setiap panggilan tercatat.

01

Terbitkan kunci

Admin yayasan menerbitkan kunci di konsol, menu Mitra & kunci API. Mulai dari kunci ak_test_ dengan cakupan baca saja.

02

Pasang jembatan

Unduh satu berkas Python tanpa dependensi. Klien MCP tidak bisa membuat tanda tangan HMAC, jadi jembatan ini menandatangani tiap permintaan di komputer Anda. Secret tidak pernah dikirim.

03

Tambahkan ke klien

Tempel konfigurasi untuk klien Anda, mulai ulang, lalu tanyakan: sekolah apa saja yang bisa dibaca? Panduan lengkap ada di bagian MCP dokumentasi.

Sandbox Kunci berawalan ak_test_ selalu menabrak data sintetis dan tidak pernah mengirim notifikasi ke orang tua. Gunakan itu untuk seluruh pengembangan.

Autentikasi

Setiap permintaan membawa key-id di header dan tanda tangan HMAC-SHA256 atas timestamp + method + path + body. Secret tidak pernah dikirim. Permintaan dengan timestamp lebih dari 300 detik ditolak.

X-EduCore-Key-Id:    ak_live_7Qp2R9
X-EduCore-Signature: t=1789632650,v1=9f...
Idempotency-Key:     4f0a1b2c-...
AturanKetentuan
CakupanDitetapkan yayasan, per domain dan per sekolah. Tidak bisa diperluas oleh mitra.
RotasiDua kunci aktif maksimal 30 hari. Kunci lama jadi read-only saat hari ke-23.
IP allow-listOpsional per kunci. Permintaan dari alamat di luar daftar ditolak dengan IP_NOT_ALLOWED.

Versi & deprekasi

Versi ada di path, bukan header. Perubahan yang memutus kontrak selalu menjadi /api/v2/ baru; penambahan field opsional bukan perubahan yang memutus. Versi lama hidup 12 bulan setelah pengganti keluar, dan mengirim header Sunset sejak hari pertama.

Konvensi

AturanBentuk
Paginasi?cursor=&limit= → {results, next_cursor}
Uang{"amount": "1500000.00", "currency": "IDR"}
WaktuISO 8601 UTC — 2026-09-17T02:14:00Z
IdempotensiIdempotency-Key — disimpan 7 hari

Format uang adalah string dengan mata uang di level objek yang sama. Jangan pernah menjumlahkan lintas mata uang: endpoint agregat mengembalikan array total per mata uang, bukan satu angka.

Error

Semua error adalah RFC 9457 application/problem+json. Cabangkan logika pada code — string SCREAMING_SNAKE yang stabil — bukan pada prosa detail.

{
  "type":     "/errors/scope-denied",
  "title":    "Scope not granted",
  "status":   403,
  "detail":   "Key lacks roster.pii",
  "instance": "/api/v1/partner/_",
  "code":     "SCOPE_DENIED"
}
StatusCode
401SIGNATURE_INVALID
403SCOPE_DENIED
400VALIDATION_ERROR
403IP_NOT_ALLOWED
404NOT_FOUND
409IDEMPOTENCY_MISMATCH
429RATE_LIMITED

Webhook & polling

Webhook adalah jalur utama. Daftarkan satu endpoint HTTPS per lingkungan, terima POST bertanda tangan, dan balas 2xx dalam 5 detik. Kegagalan dicoba ulang lima kali hingga 6 jam; setelahnya kejadian tetap tersedia lewat polling.

KejadianDipicu saat
roster.student.enrolledSiswa aktif baru di sekolah dalam cakupan kunci
finance.payment.settledPembayaran VA atau QRIS ter-settle dan teralokasi
integration.key.rotatedKunci dirotasi — 30 hari sebelum yang lama mati

Endpoint

Metode & jalurKeterangan
GET /partner/foundations
roster.read
Yayasan yang memberi Anda akses
GET /partner/schools
roster.read
Sekolah dalam cakupan kunci
GET /partner/staff?school_id
roster.read
Staf aktif beserta NIP dan status, kursor terpaginasi; NIK hanya dengan roster.pii
GET /partner/invoices?status
finance.read
Tagihan dan sisa terutang
GET /partner/attendance/daily?date
attendance.read
Kehadiran harian per siswa
GET /partner/events?since=cursor
—
Aliran kejadian — alternatif webhook
POST /partner/mcp
sesuai alat
Server MCP hanya-baca untuk asisten AI; lihat bagian MCP
POST /partner/webhooks
—
Daftarkan endpoint penerima webhook

MCP

Endpoint POST /partner/mcp adalah server Model Context Protocol (HTTP, mode JSON tanpa sesi) di belakang autentikasi dan batas laju yang sama dengan endpoint lain. Isinya alat hanya-baca; kunci hanya melihat alat sesuai cakupannya, dan baris yang dikembalikan sama persis dengan REST: batas sekolah, batas yayasan, NIK hanya dengan roster.pii.

Jangan tempel secret ke klien AI Jembatan membaca secret dari variabel lingkungan di komputer Anda dan tidak pernah mengirimnya; hanya tanda tangan HMAC yang berangkat. Jangan menyimpan secret di berkas yang masuk repositori. Kunci produksi sebaiknya diberi IP allow-list dan cakupan sekecil mungkin.

Persiapan

  1. Python 3.8 ke atas di komputer yang menjalankan klien AI (python3 --version; di Windows gunakan python).
  2. Unduh educore_mcp_bridge.py dan simpan di folder tetap, misalnya ~/sekolahos/.
  3. Periksa berkas sebelum dijalankan: shasum -a 256 educore_mcp_bridge.py harus menghasilkan 177f51df1cb11dea603f32a03809fca400a4f0e5e5dfbabf378f50d3f3a0c080.
  4. Minta admin yayasan menerbitkan kunci. Catat key-id dan secret; secret hanya tampil sekali.
  5. Simpan secret di pengelola kata sandi atau keychain sistem operasi, bukan di berkas yang disinkronkan atau masuk ke git. Minta kunci dengan scope seperlunya dan batasi dengan daftar IP.
VariabelIsi
EDUCORE_API_BASEhttps://schoolday.live/api/v1/
EDUCORE_KEY_IDKey-id, misalnya ak_test_7Qp2R9
EDUCORE_KEY_SECRETSecret yang tampil saat kunci diterbitkan

Panduan per klien

Claude Desktop
  1. Buka Settings → Developer → Edit Config; berkas claude_desktop_config.json terbuka.
  2. Tambahkan server berikut, ganti path dan kredensialnya:
{
  "mcpServers": {
    "sekolahos": {
      "command": "python3",
      "args": ["/Users/anda/sekolahos/educore_mcp_bridge.py"],
      "env": {
        "EDUCORE_API_BASE": "https://schoolday.live/api/v1/",
        "EDUCORE_KEY_ID": "ak_test_...",
        "EDUCORE_KEY_SECRET": "..."
      }
    }
  }
}
  1. Keluar sepenuhnya dari Claude Desktop lalu buka lagi. Ikon alat muncul di kotak percakapan dengan server sekolahos.
Claude Code

Satu perintah di terminal:

claude mcp add sekolahos \
  --env EDUCORE_API_BASE=https://schoolday.live/api/v1/ \
  --env EDUCORE_KEY_ID=ak_test_... \
  --env EDUCORE_KEY_SECRET=... \
  -- python3 ~/sekolahos/educore_mcp_bridge.py

Periksa dengan claude mcp list, atau ketik /mcp di dalam sesi.

Cursor

Buat ~/.cursor/mcp.json (atau .cursor/mcp.json di proyek) dengan isi yang sama seperti Claude Desktop di atas, lalu aktifkan server di Settings → MCP.

Klien MCP lain

Klien apa pun yang mendukung server MCP lokal (stdio) cukup diberi perintah python3 /path/educore_mcp_bridge.py dan tiga variabel lingkungan di atas. Untuk menguji tanpa klien AI, gunakan MCP Inspector:

EDUCORE_API_BASE=https://schoolday.live/api/v1/ \
EDUCORE_KEY_ID=ak_test_... EDUCORE_KEY_SECRET=... \
npx @modelcontextprotocol/inspector python3 educore_mcp_bridge.py

Uji cepat dari terminal

Kirim satu pesan JSON-RPC ke jembatan; balasannya daftar alat yang boleh dipakai kunci Anda:

echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | python3 educore_mcp_bridge.py

Alat yang tersedia

AlatCakupanFungsi
list_schoolsroster.readSekolah dalam cakupan kunci
list_classesroster.readRombel dengan tingkat dan tahun ajaran. Filter: school_id
list_studentsroster.read
roster.pii
Siswa dengan NIS, status, dan kelas saat ini; NISN hanya dengan roster.pii; NIK, tanggal lahir, alamat, dan kontak wali tidak pernah dikirim. Filter: school_id, class_group_id, status, q (sebagian nama)
list_staffroster.read
roster.pii
Staf aktif dengan NIP dan status; NIK hanya dengan roster.pii. Filter: school_id
list_invoicesfinance.readTagihan dan sisa terutang. Filter: status, school_id, student_id, period, due_from, due_to
get_daily_attendanceattendance.readKehadiran siswa untuk satu hari. Wajib: date (YYYY-MM-DD)
get_attendance_rangeattendance.readKehadiran siswa untuk rentang tanggal (maksimal 31 hari). Wajib: date_from, date_to. Filter: school_id, student_id, status

Semua alat menerima limit (maksimal 200) dan before_id. Jawaban memuat next_before_id; teruskan nilainya untuk halaman berikutnya. Tidak ada alat tulis; pendaftaran webhook tetap hanya lewat REST. Satu kunci boleh memanggil alat paling banyak 120 kali per menit (di bawah batas 600 permintaan).

Jika tidak jalan

GejalaPenyebab dan perbaikan
Server tidak muncul di klienPath berkas salah atau Python tidak ada di PATH. Jalankan perintah command dari terminal untuk melihat pesan galatnya.
SIGNATURE_INVALIDSecret salah, kunci sudah dicabut atau kedaluwarsa, atau jam komputer melenceng lebih dari 300 detik.
IP_NOT_ALLOWEDKunci memakai IP allow-list dan alamat komputer Anda belum terdaftar.
SCOPE_DENIEDKunci tidak punya cakupan untuk alat itu. Minta admin yayasan menerbitkan kunci baru dengan cakupan yang sesuai.
RATE_LIMITEDBatas 600 permintaan per menit per kunci dipakai bersama REST dan MCP.

Untuk reseller dan integrator

Setiap kunci API berlaku untuk tepat satu yayasan; tidak ada kunci yang menjangkau beberapa yayasan. Jika Anda mengintegrasikan banyak sekolah, minta admin tiap yayasan menerbitkan kunci untuk Anda di konsol, menu Mitra & kunci API, dengan cakupan seminimal mungkin. Simpan tiap rahasia di brankas Anda sendiri, satu per yayasan.

Untuk membantu konfigurasi di dalam konsol, admin yayasan membuat login staf biasa dengan peran seperlunya. Reseller tidak mendapat akses lintas yayasan.

Batas laju

BatasNilai
Permintaan per kunci600 / menit
Baris maksimal per halaman kursor200
Interval polling tercepat yang diizinkan30 detik

Melewati batas menghasilkan 429 RATE_LIMITED dengan header Retry-After.