Dokumentasi / API REST

API REST

Semua yang bisa dilakukan di panel adalah panggilan API publik. Panel web, MCP, dan skrip Anda memakai API yang sama.

Dasar

HalNilai
Basis URLhttps://app.saka.work/api/v1
AutentikasiAuthorization: Bearer saka_… (buat di Pengaturan, lihat Buat token)
FormatJSON. Kirim Content-Type: application/json untuk permintaan yang mengubah.
IsianKolom yang tidak dikenal ditolak, agar salah ketik tidak diam-diam diabaikan.
Terminal
export SAKA_TOKEN="saka_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Format galat

Setiap galat memakai bentuk yang sama, sehingga bisa dibaca manusia maupun agent AI:

JSON
{
  "galat": {
    "kode": "server-terputus",
    "arti": "Server sedang tidak tersambung ke sakapanel.",
    "langkah": "Pastikan server hidup dan agent berjalan: `systemctl status saka-agent`. Aplikasi di server tetap jalan walau terputus."
  }
}

Contoh kode yang sering muncul: belum-masuk (401), server-tidak-ada (404), server-terputus (409), perlu-konfirmasi (400), batas-server (403), isian-rusak (400), agent-sedang-diperbarui.

Tugas yang berjalan lama

Aksi di server dikirim sebagai tugas. Bila selesai cepat, jawabannya langsung berisi hasil. Bila belum, jawabannya 202 berisi tugas dan catatan cara memantaunya. Pantau dengan GET /tugas/{id} sampai keadaan menjadi selesai atau gagal. Pembuatan klaster database, load balancer, dan situs dipantau lewat GET /database/{id}, GET /lb/{id}, dan GET /situs/{id} (keadaan: dibuat, siap, atau gagal).

Endpoint utama

Semua jalur di bawah relatif terhadap /api/v1.

KelompokMetodeJalurKeterangan
AkunGET/akunProfil akun dan status Telegram.
GET/tokenDaftar token API.
POST/tokenBuat token. Isian {"nama"}. Rahasia hanya ditampilkan sekali.
DELETE/token/{id}Cabut token.
POST/telegram/tautanTautan untuk menghubungkan Telegram (30 menit).
DELETE/telegramPutuskan Telegram.
ServerGET/serverDaftar server beserta status terakhir.
POST/serverBuat perintah pasang. Isian {"nama"}.
GET/server/{id}Detail satu server.
PATCH/server/{id}Ganti nama. Isian {"nama"}.
GET/server/{id}/metrik?jam=24Riwayat metrik dari server (maks. 720 jam).
GET/server/{id}/tugas50 tugas terakhir di server ini.
POST/server/{id}/perbaikiIsian {"jenis": "swap" | "firewall-cek" | "firewall", "port": ["80/tcp"]}.
GET/server/{id}/lepasRencana Lepas server: apa saja yang akan dihapus.
DELETE/server/{id}Lepas server. Isian {"konfirmasi": "<nama server>", "simpan_cadangan": true}.
AplikasiGET/resepKatalog aplikasi siap pasang (tanpa login).
POST/server/{id}/aplikasiPasang aplikasi. Isian {"resep", "nama", "variabel"}.
POST/server/{id}/aplikasi/{nama}/mulai-ulangMulai ulang aplikasi.
GET/server/{id}/aplikasi/{nama}/log?baris=100Log terakhir aplikasi.
POST/server/{id}/aplikasi/{nama}/aksiAksi kelola, misalnya {"aksi": "akses.daftar"}.
DELETE/server/{id}/aplikasi/{nama}Hapus aplikasi. Isian {"konfirmasi": "<nama aplikasi>"}.
DatabaseGET/databaseDaftar klaster.
POST/databaseBuat klaster. Isian {"mesin", "nama", "mode", "data": [id, id], "saksi": id}.
GET/database/{id}Detail, status anggota, dan alamat sambungan.
POST/database/{id}/sandiBaca sandi langsung dari server data.
POST/database/{id}/proxySambungkan server aplikasi. Isian {"server_id"}.
DELETE/database/{id}/proxy/{server}Lepas proxy dari satu server aplikasi.
DELETE/database/{id}Hapus klaster. Isian {"konfirmasi": "<nama klaster>"}.
Load balancerGET/lbDaftar load balancer.
POST/lbBuat load balancer.
GET/lb/{id}Detail dan kesehatan tujuan dari tiap penyeimbang.
DELETE/lb/{id}Hapus. Isian {"konfirmasi": "<nama lb>"}.
SitusGET/situsDaftar situs (bisa disaring ?server_id=).
POST/situsBuat situs. Isian {"nama", "server_id", "jenis", "domain", "php", "bahasa", "db", "klaster_id", "sumber"}. Lihat Situs.
GET/situs/{id}Detail dan status: DNS, HTTPS, cadangan, SFTP tanpa sandi.
PATCH/situs/{id}Ubah nama, domain, atau versi PHP. Isian {"nama", "domain", "php"}.
DELETE/situs/{id}Hapus. Isian {"konfirmasi": "<nama situs>", "simpan_cadangan": true}.
POST/situs/{id}/rahasiaBaca sandi database, SFTP, dan admin WordPress langsung dari server.
POST/situs/{id}/cadanganCadangkan sekarang.
POST/situs/{id}/pulihkanPulihkan. Isian {"berkas": "<nama cadangan>", "konfirmasi": "<nama situs>"}.
Tugas & peringatanGET/tugas/{id}Keadaan tugas, kemajuan, dan hasilnya.
GET/peringatan?aktif=1Peringatan (aktif saja bila aktif=1).

Aksi yang menghapus atau mengganti isi (aplikasi, klaster, load balancer, situs, pulihkan situs, Lepas server) menolak permintaan dengan kode perlu-konfirmasi sampai isian konfirmasi berisi nama sumber daya. Tunjukkan dulu ke pengguna apa yang akan dihapus.

Contoh curl

Daftar server

curl
curl -s https://app.saka.work/api/v1/server \
  -H "Authorization: Bearer $SAKA_TOKEN"

Jawaban berisi server: tiap server punya id (misalnya srv_…), nama, ip, os, terhubung, dan status (CPU, RAM, disk, aplikasi, kesiapan).

Buat klaster database

curl
curl -s -X POST https://app.saka.work/api/v1/database \
  -H "Authorization: Bearer $SAKA_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "mesin": "postgresql",
    "nama": "toko-produksi",
    "mode": "sinkron",
    "data": ["srv_aaaaaaaaaaaaaaaa", "srv_bbbbbbbbbbbbbbbb"],
    "saksi": "srv_cccccccccccccccc"
  }'

mesin: postgresql (bawaan) atau mariadb. mode: asinkron (bawaan) atau sinkron; MariaDB selalu sinkron. Jawaban 202 berisi klaster dengan keadaan: "dibuat". Pantau:

curl
curl -s https://app.saka.work/api/v1/database/<id-klaster> \
  -H "Authorization: Bearer $SAKA_TOKEN"

Buat load balancer

curl
curl -s -X POST https://app.saka.work/api/v1/lb \
  -H "Authorization: Bearer $SAKA_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "nama": "toko-lb",
    "mode": "proxy",
    "domain": ["toko.contoh.id"],
    "penyeimbang": ["srv_1111111111111111", "srv_2222222222222222"],
    "tujuan": ["srv_3333333333333333", "srv_4444444444444444"],
    "cadangan": [],
    "port_tujuan": 8080,
    "kebijakan": "bergiliran",
    "sticky": false,
    "path_sehat": "/"
  }'

mode: proxy (bawaan) atau dns (tanpa domain). kebijakan: bergiliran atau koneksi_tersedikit. port_tujuan bawaan 80. Penyeimbang 1 atau 2 server.

Jalankan perbaikan lalu pantau tugas

curl
curl -s -X POST https://app.saka.work/api/v1/server/<id-server>/perbaiki \
  -H "Authorization: Bearer $SAKA_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"jenis": "swap"}'
curl
curl -s https://app.saka.work/api/v1/tugas/<id-tugas> \
  -H "Authorization: Bearer $SAKA_TOKEN"

Jawaban berisi tugas (id, perintah, keadaan: antre, berjalan, selesai, atau gagal, lewat: panel, api, atau mcp), kemajuan (langkah yang sedang dikerjakan), dan hasil bila sudah selesai.