Kirim notifikasi ke karyawan dari sistem lain — script, cron server lain, n8n, webhook, bot WhatsApp.
Owner: buka Kelola → 🔑 API Key, beri nama, tekan Buat key.
jss_ + 64 huruf dan cuma ditampilkan sekali. Yang disimpan server cuma sidik jarinya, jadi kalau hilang tidak ada yang bisa menunjukkannya lagi — termasuk kami. Cabut yang lama, buat baru. Salah satu dari dua header ini — pilih yang gampang buat alatmu:
Authorization: Bearer jss_xxxxxxxx...
X-API-Key: jss_xxxxxxxx...
Key menentukan perusahaan. Tidak ada parameter tenant di endpoint mana pun — kalau ada, satu key bocor cukup untuk mengirim ke seluruh perusahaan di platform ini.
Cuma mengirim notifikasi ke karyawan perusahaan pemiliknya, plus membaca daftar nama + id karyawan (supaya kamu punya cara mendapatkan user_id tanpa menebak).
Dia tidak bisa membaca gaji, absen, email, rekening, atau notifikasi siapa pun; tidak bisa mengubah apa pun; tidak bisa menyentuh perusahaan lain. Sengaja sesempit itu — kredensial yang hidup di server lain akan bocor cepat atau lambat, dan yang menentukan seberapa parah akibatnya adalah seberapa sedikit yang bisa dilakukannya.
GET/api/v1/notif.php?aksi=ping
curl "https://staff.jidanshoppu.com/api/v1/notif.php?aksi=ping" \ -H "Authorization: Bearer jss_xxx"
{ "ok": true, "key": "n8n produksi", "perusahaan": "Perusahaan Kamu" }
GET/api/v1/notif.php?aksi=karyawan
— untuk mendapatkan user_id.
curl "https://staff.jidanshoppu.com/api/v1/notif.php?aksi=karyawan" \ -H "Authorization: Bearer jss_xxx"
{
"ok": true,
"karyawan": [
{ "user_id": 3, "nama": "Sela", "peran": "staff" },
{ "user_id": 5, "nama": "Syauqi", "peran": "staff" }
]
}
Cuma id, nama, dan peran. Tidak ada email/rate/rekening — key ini untuk mengirim notifikasi, bukan untuk membaca data orang.
POST/api/v1/notif.php — terima JSON maupun form.
| Field | Wajib | Keterangan |
|---|---|---|
judul | ya | maks 120 huruf |
isi | ya | maks 255 huruf |
user_id | tidak | id karyawan. 0 atau tidak dikirim = semua karyawan aktif |
jenis | tidak | info (default), kasbon, gaji, bonus, timer, absen. Cuma menentukan ikonnya; nilai asing jatuh ke info |
url | tidak | harus path internal diawali / |
curl -X POST https://staff.jidanshoppu.com/api/v1/notif.php \
-H "Authorization: Bearer jss_xxx" \
-H "Content-Type: application/json" \
-d '{
"judul": "Besok libur",
"isi": "Tanggal 17 libur, timer tidak perlu dinyalakan."
}'
{ "ok": true, "terkirim": 5 }
curl -X POST https://staff.jidanshoppu.com/api/v1/notif.php \ -H "X-API-Key: jss_xxx" \ -d "user_id=3" \ -d "judul=Cek transaksi kamu" \ -d "isi=Ada penyesuaian baru bulan ini." \ -d "jenis=gaji" \ -d "url=/staff/transaksi.php"
url wajib path internal. https://… dan //evil.com ditolak dengan 400. //evil.com ikut ditolak walau diawali garis miring: browser membacanya sebagai alamat ke host lain. Karyawan yang sedang membuka portal mendengar bunyi dan melihat popup dalam ≤20 detik. Yang tidak sedang membuka akan disapa saat dia masuk. Semuanya masuk halaman Notifikasi mereka, dan tiap pengiriman lewat API tercatat di audit log dengan nama keynya.
60 permintaan per menit per key. Tiap respons membawa:
X-RateLimit-Limit: 60 X-RateLimit-Remaining: 57
Lewat batas → 429 + Retry-After: 60.
| Kode | Arti |
|---|---|
200 | Berhasil |
400 | Parameter salah, body JSON rusak, atau url bukan path internal |
401 | Key tidak dikirim, salah, atau sudah dicabut |
404 | user_id bukan karyawan perusahaan ini |
405 | Method salah |
429 | Lewat rate limit |
| Gejala | Sebabnya biasanya |
|---|---|
401 padahal keynya benar |
Sebagian server membuang header Authorization sebelum sampai ke PHP. Coba X-API-Key — header biasa yang tidak pernah disentuh server. Kalau itu jalan tapi Bearer tidak, kabari kami. |
401 tiba-tiba, padahal tadi jalan |
Keynya dicabut owner. Cek di halaman API Key. |
400 "url harus path internal" |
Kamu mengirim https://…. Pakai /staff/transaksi.php. |
200 tapi "terkirim": 0 |
Karyawannya tidak aktif, atau perusahaannya belum punya karyawan aktif. |
Butuh karyawan login ke aplikasimu pakai akun JS Staff (bukan cuma kirim notifikasi)? Itu SSO — panduan pasangnya di sini.