Panel API v1

REST API Documentation

Cek paket, CPU, dan expired server panel kamu secara programatik. Autentikasi lewat header API key berawalan btzpanel_.

https://btzpanel.my.id

Quick Start

  1. Login ke Server Saya lalu tekan Buat API Key.
  2. Simpan key (prefix btzpanel_) — hanya ditampilkan sekali.
  3. Kirim di header: Authorization: Bearer <apiKey>.
  4. Panggil GET https://btzpanel.my.id/api/v1/servers.

Autentikasi

Sertakan API key di salah satu header berikut. Key tidak boleh lewat query string.

Authorization: Bearer btzpanel_xxx
X-API-Key: btzpanel_xxx
curl -s https://btzpanel.my.id/api/v1/servers \
  -H "Authorization: Bearer btzpanel_xxxxxxxxxxxxxxxx"

Try It Out

Tempel API key kamu, pilih endpoint, lalu kirim. Key hanya dipakai di browser ini dan tidak disimpan oleh server.

Rate Limit

Dua lapis, dihitung per API key. Lewat batas = HTTP 429.

60
request / menit
2
request / detik (t/s)
5
burst

Header respons:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 42
X-RateLimit-Reset: 1730467200
X-RateLimit-TPS-Limit: 2
Retry-After: 1
GET/api/v1/key

Info key yang dipakai: preview, email, status, dan limit.

{
  "success": true,
  "data": {
    "keyPreview": "btzpanel_...a1b2",
    "email": "user@example.com",
    "tier": "default",
    "active": true,
    "createdAt": "2026-11-01T00:00:00.000Z",
    "rotatedAt": null,
    "lastUsedAt": "2026-11-01T08:30:00.000Z",
    "rateLimit": { "rpm": 60, "tps": 2, "burst": 5, "remaining": 42 }
  }
}
GET/api/v1/servers

Daftar semua server milik pemilik key.

{
  "success": true,
  "data": {
    "total": 1,
    "servers": [
      {
        "panelId": "123",
        "identifier": "a1b2c3d4",
        "name": "server-pro",
        "package": "Pro 1",
        "cpu": 100,
        "cpuLabel": "100%",
        "ram": 3584,
        "ramLabel": "3584 MB",
        "disk": 4608,
        "diskLabel": "4608 MB",
        "status": "active",
        "suspended": false,
        "expiredAt": "2026-12-12T00:00:00.000Z",
        "expiredLabel": "12/12/2026",
        "daysLeft": 41,
        "isUnlimited": false
      }
    ]
  }
}
GET/api/v1/servers/:panelId

Detail satu server. Hanya server milik pemilik key.

curl https://btzpanel.my.id/api/v1/servers/123 \
  -H "Authorization: Bearer btzpanel_xxxxxxxxxxxxxxxx"

Response 200 memakai skema yang sama dengan item di /api/v1/servers. Jika bukan milik key: 404 NOT_FOUND.

POST/api/v1/key/rotate

Rotasi key. Key lama langsung tidak berlaku; key baru hanya dikembalikan sekali.

{
  "success": true,
  "data": {
    "apiKey": "btzpanel_NEWKEYONLYSHOWNONCE",
    "keyPreview": "btzpanel_...z9y8",
    "rotatedAt": "2026-11-01T09:00:00.000Z"
  }
}

Kode Error

HTTPcodeArti
401MISSING_KEYHeader key tidak ada
401INVALID_KEYKey salah / sudah dicabut
403FORBIDDENBukan pemilik server
404NOT_FOUNDServer tidak ditemukan
429RATE_LIMITEDKena limit RPM / TPS
500SERVER_ERRORError internal
{ "success": false, "code": "RATE_LIMITED", "message": "Kuota request per menit habis." }

Contoh Integrasi

Script cek server yang expired < 3 hari:

const KEY = 'btzpanel_xxxxxxxxxxxxxxxx';
const res = await fetch('https://btzpanel.my.id/api/v1/servers', {
  headers: { Authorization: `Bearer ${KEY}` }
});
const { data } = await res.json();
for (const s of data.servers) {
  if (s.daysLeft !== null && s.daysLeft <= 3) {
    console.log(`⚠ ${s.name} (${s.package}) expired dalam ${s.daysLeft} hari`);
  }
}

FAQ

Key bocor, bagaimana?
Tekan Rotate di Server Saya (atau POST /api/v1/key/rotate). Key lama langsung tidak berlaku.
Kenapa expired - / null?
Server Lifetime/Unlimited tidak punya tanggal expired. Cek field isUnlimited.
Bisa kelola (buat/hapus) server?
Belum. API v1 read-only: cek paket, CPU, dan expired.