by Zass Desuta

Dokumentasi API

Mulai ยท Memulai

Mulai

API membaca dan mengelola akunmu lewat HTTPS dan membalas JSON. Alamat dasar: https://pterokudesu.com/api/v1. Buat kunci di menu Kunci API, lalu kirim di header Authorization. Kunci lengkap hanya tampil sekali saat dibuat dan kami hanya menyimpan hash-nya.

Permintaan pertama

Terminal
curl "https://pterokudesu.com/api/v1/me" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Respons sukses selalu membungkus hasilnya di field data. Daftar panjang memakai kursor: kirim nilai berikutnya dari respons sebagai query before untuk halaman selanjutnya; nilai null berarti sudah habis.

Bentuk respons daftar

JSON
{
  "data": [ ... ],
  "berikutnya": "2026-11-01T10:00:00.000Z"
}

Izin kunci

Setiap kunci hanya boleh memanggil endpoint sesuai izin yang dipilih saat dibuat. Kunci bisa dibatasi ke alamat IP atau CIDR tertentu dan punya masa berlaku.

  • akun:bacaNama, username, dan email akun
  • server:bacaDaftar dan detail server
  • transaksi:bacaRiwayat dan detail transaksi
  • dompet:bacaSaldo, koin, dan mutasinya
  • katalog:bacaPaket, lokasi, dan metode pembayaran
  • aktivitas:bacaCatatan aktivitas akun beserta perangkat dan lokasi
  • referral:bacaKode, tautan, statistik, dan daftar undangan
  • notifikasi:bacaDaftar dan isi notifikasi akun
  • akun-panel:bacaDaftar dan detail akun panel pelangganmu
  • server:tulisMembuat pesanan, memperpanjang, dan mengatur perpanjang otomatis. Dapat memakai saldo dan koin.
  • dompet:tulisMembuat tagihan top up lewat metode pembayaran
  • notifikasi:tulisMenandai satu atau semua notifikasi sebagai sudah dibaca
  • akun-panel:tulisMembuat akun pelanggan dan mereset password akun panel

Endpoint tulis

Endpoint yang mengubah uang (beli, perpanjang, top up, batalkan) wajib membawa header Idempotency-Key berisi 8-64 karakter huruf, angka, - atau _. Permintaan yang diulang dengan kunci dan isi yang sama mengembalikan respons semula dengan header Idempotent-Replay: true tanpa membuat pesanan baru. Kunci yang sama dengan isi berbeda ditolak (422). Catatan berlaku 24 jam.

Kunci dengan izin server:tulis wajib punya batas belanja harian (Rp, hari WIB). Bila total hari ini melewati batas, permintaan ditolak dengan batas_harian_terlampaui. Pembayaran gateway yang kedaluwarsa tidak mengembalikan jatah. Izin tulis dapat dibatasi admin hanya untuk reseller dan staf.

Bayar dengan saldo langsung diproses: completed berarti server sudah dibuat, paid berarti sedang diproses (pantau lewat GET /transactions/{id} atau webhook server.siap). Metode gateway menghasilkan status pending dan objek pembayaran berisi qr_image_url, nomor_va, kode_bayar, atau url_pembayaran beserta kedaluwarsa_pada; server dibuat setelah pembayaran masuk.

Alur integrasi reseller

Urutan umum untuk aplikasi yang menjual server ke pelangganmu sendiri. Semua langkah memakai kunci API yang sama dan hanya tersedia untuk akun reseller dan staf.

  1. 1

    Siapkan kunci

    Buat kunci API dengan izin akun-panel:baca, akun-panel:tulis, katalog:baca, server:baca, server:tulis, dan transaksi:baca. Isi alamat IP server aplikasimu dan batas belanja harian. Daftarkan webhook untuk server.siap dan pembayaran.kedaluwarsa.

  2. 2

    Tampilkan katalog

    Ambil tipe panel, varian paket, dan lokasi. Simpan hasilnya di aplikasimu selama beberapa menit, jangan setiap pelanggan membuka halaman.

    Terminal
    GET /api/v1/panel-types
    GET /api/v1/plans?panel_type=public
    GET /api/v1/locations?panel_type=public&plan_id=plan_abc
  3. 3

    Buat akun pelanggan

    Satu akun pelanggan dipakai untuk semua tipe panel. Simpan id yang kamu terima di data pelangganmu dan pakai sebagai panel_account_id untuk pembelian berikutnya. Jumlahnya dibatasi kuota reseller.

    Terminal
    POST /api/v1/panel-accounts
    { "username": "pelanggan1", "email": "[email protected]" }
  4. 4

    Hitung biaya sebelum membayar

    Kirim harga bersih (harga paket dikurangi diskon dan voucher) sebagai amount. Hasilnya memuat biaya_layanan sesuai peranmu dan biaya gateway tiap metode, sehingga total yang ditagih pelanggan bisa kamu tampilkan lebih dulu. Metode saldo tidak dikenai biaya.

    Terminal
    GET /api/v1/payment-methods?amount=15000
  5. 5

    Beli server

    Selalu kirim Idempotency-Key unik per pesanan. Bila koneksi putus, kirim ulang dengan kunci yang sama dan jangan membuat kunci baru. Dengan saldo, hasilnya completed atau paid. Dengan gateway, hasilnya pending dan berisi data pembayaran untuk ditampilkan ke pelanggan.

    Terminal
    POST /api/v1/servers
    Idempotency-Key: pesanan-10293
    { "plan_id": "plan_abc", "panel_type": "public", "panel_account_id": "665f1c0e2a9b", "server_name": "Bot Discord", "payment": { "method": "saldo" } }
  6. 6

    Pantau sampai selesai

    Terima webhook server.siap, dan sebagai cadangan baca status transaksi tiap beberapa detik tidak lebih sering dari batas laju. Pesanan gateway yang tidak dibayar berakhir lewat webhook pembayaran.kedaluwarsa.

    Terminal
    GET /api/v1/transactions/{id}
    GET /api/v1/servers/{id}
  7. 7

    Perpanjang dan kelola

    Perpanjang sebelum server habis, atau aktifkan perpanjang otomatis dengan saldo. Webhook server.segera_berakhir mengingatkan sebelum masa aktif habis. Reset password pelanggan lewat endpoint reset, passwordnya hanya tampil satu kali.

    Terminal
    POST /api/v1/servers/{id}/renew
    PUT /api/v1/servers/{id}/auto-renew
    POST /api/v1/panel-accounts/{id}/reset-password

Akun

Profil akun

GET/api/v1/me

Profil akun pemilik kunci beserta daftar izin yang dimiliki kunci ini.

Izin: akun:baca

Terminal
curl -X GET "https://pterokudesu.com/api/v1/me" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Respons 200

JSON
{
  "data": {
    "id": "64f1c0e2a9",
    "nama": "Budi",
    "username": "budi123",
    "email": "[email protected]",
    "email_terverifikasi": true,
    "foto": null,
    "bergabung_pada": "2026-09-01T08:00:00.000Z",
    "izin": [
      "akun:baca",
      "server:baca"
    ]
  }
}

Info kunci ini

GET/api/v1/api-key

Nama, izin, daftar IP, batas belanja harian, masa berlaku, dan pemakaian terakhir kunci yang sedang dipakai. Tidak butuh izin khusus.

Izin: kunci apa pun

Terminal
curl -X GET "https://pterokudesu.com/api/v1/api-key" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Respons 200

JSON
{
  "data": {
    "id": "key1",
    "nama": "Bot reseller",
    "prefiks": "pdk_a1b2c3d4",
    "status": "aktif",
    "izin": [
      "server:baca",
      "server:tulis"
    ],
    "ip_diizinkan": [
      "203.0.113.0/24"
    ],
    "batas_harian": 500000,
    "dibuat_pada": "2026-10-20T08:00:00.000Z",
    "kedaluwarsa_pada": null,
    "terakhir_dipakai": "2026-11-05T09:10:00.000Z",
    "terakhir_ip": "203.0.113.7"
  }
}

Log pemakaian kunci

GET/api/v1/api-key/logs

50 pemakaian terakhir kunci ini. Disimpan 30 hari dan tampil juga di halaman detail kunci.

Izin: kunci apa pun

Parameter

NamaDiKeterangan
beforestringQueryNilai berikutnya dari respons sebelumnya untuk halaman selanjutnya.
Terminal
curl -X GET "https://pterokudesu.com/api/v1/api-key/logs" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Respons 200

JSON
{
  "data": [
    {
      "id": "l1",
      "metode": "GET",
      "jalur": "/api/v1/servers",
      "status": 200,
      "ip": "203.0.113.7",
      "waktu": "2026-11-05T09:10:00.000Z"
    }
  ],
  "berikutnya": "2026-11-01T10:00:00.000Z"
}

Server

Daftar server

GET/api/v1/servers

Semua server milik akun. Nilai status: aktif, masa_tenggang, kedaluwarsa, atau diproses.

Izin: server:baca

Terminal
curl -X GET "https://pterokudesu.com/api/v1/servers" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Respons 200

JSON
{
  "data": [
    {
      "id": "k3x9ab2q",
      "nama": "Bot Discord",
      "paket": "Panel 2GB",
      "tipe_panel": "Public Panel",
      "username_panel": "budi123",
      "status": "aktif",
      "berakhir_pada": "2026-12-01T10:00:00.000Z",
      "masa_tenggang_hingga": null,
      "spesifikasi": {
        "memori_mb": 2048,
        "disk_mb": 10240,
        "cpu_persen": 100
      },
      "durasi": "30 hari",
      "lokasi": "Singapura",
      "egg": "Node.js",
      "jumlah_perpanjangan": 1,
      "dibeli_pada": "2026-11-01T10:00:00.000Z",
      "url_panel": "https://panel.example.com",
      "garansi": {
        "maks_klaim": 3,
        "sudah_klaim": 0
      }
    }
  ]
}

Detail server

GET/api/v1/servers/{id}

Detail satu server. id adalah ID transaksi pembelian.

Izin: server:baca

Parameter

NamaDiKeterangan
idstringwajibPathID sumber daya.

Galat yang mungkin

  • 404tidak_ditemukanData tidak ditemukan.
Terminal
curl -X GET "https://pterokudesu.com/api/v1/servers/k3x9ab2q" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Respons 200

JSON
{
  "data": {
    "id": "k3x9ab2q",
    "nama": "Bot Discord",
    "paket": "Panel 2GB",
    "tipe_panel": "Public Panel",
    "username_panel": "budi123",
    "status": "aktif",
    "berakhir_pada": "2026-12-01T10:00:00.000Z",
    "masa_tenggang_hingga": null,
    "spesifikasi": {
      "memori_mb": 2048,
      "disk_mb": 10240,
      "cpu_persen": 100
    },
    "durasi": "30 hari",
    "lokasi": "Singapura",
    "egg": "Node.js",
    "jumlah_perpanjangan": 1,
    "dibeli_pada": "2026-11-01T10:00:00.000Z",
    "url_panel": "https://panel.example.com",
    "garansi": {
      "maks_klaim": 3,
      "sudah_klaim": 0
    }
  }
}

Beli server

POST/api/v1/servers

Membuat pesanan server baru. Bayar dengan saldo langsung diproses; metode gateway menghasilkan tagihan berstatus pending dan server dibuat setelah pembayaran masuk.

Izin: server:tulis ยท Wajib header Idempotency-Key

Parameter

NamaDiKeterangan
plan_idstringwajibIsiID varian dari GET /plans.
panel_typestringwajibIsiSlug tipe panel dari GET /panel-types.
panel_account_idstringIsiKhusus reseller: ID akun panel milikmu yang dipakai. Tanpa username, email, dan panel_account_id, server masuk ke akun pribadimu.
server_namestringwajibIsiNama server, maksimal 60 karakter.
usernamestringIsiKhusus reseller: username akun pelanggan baru. Wajib dikirim bersama email.
emailstringIsiKhusus reseller: email akun pelanggan baru. Ditolak untuk kunci member.
location_idintegerIsiID lokasi dari GET /locations.
egg_idintegerIsiEgg tertentu bila paket mengizinkan.
nest_idintegerIsiNest untuk egg tersebut.
extraobjectIsiTambahan berbayar: database, backup, allocation (bilangan bulat).
voucherstringIsiKode voucher.
payment.methodstringwajibIsiKode dari GET /payment-methods. saldo berarti dompet.
payment.ewallet_numberstringIsiNomor e-wallet bila metode membutuhkannya.
payment.use_coinsbooleanIsiPakai koin bersama saldo. Hanya berlaku untuk metode saldo.

Galat yang mungkin

  • 400idempotency_key_wajibSertakan header Idempotency-Key (8-64 karakter huruf, angka, - atau _) pada permintaan ini.
  • 400permintaan_tidak_validParameter permintaan tidak valid.
  • 402saldo_kurangSaldo dan koin tidak cukup.
  • 403batas_harian_terlampauiBatas belanja harian kunci ini terlampaui.
  • 403izin_tulis_ditolakIzin tulis API saat ini hanya untuk akun reseller dan staf.
  • 422tidak_bisa_diprosesPermintaan tidak bisa diproses.
Terminal
curl -X POST "https://pterokudesu.com/api/v1/servers" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Idempotency-Key: pesanan-2026-11-05-001" \
  -H "Content-Type: application/json" \
  -d '{
  "plan_id": "plan_abc",
  "panel_type": "public",
  "server_name": "Bot Discord",
  "location_id": 1,
  "payment": {
    "method": "saldo",
    "use_coins": true
  }
}'

Respons 201

JSON
{
  "data": {
    "id": "k3x9ab2q",
    "jenis": "pembelian",
    "id_server": "k3x9ab2q",
    "status": "completed",
    "total": 15000,
    "harga": 15000,
    "biaya_admin": 0,
    "metode": {
      "kode": "saldo",
      "nama": "Saldo & koin"
    },
    "pembayaran": null,
    "dompet": {
      "saldo_dipakai": 10000,
      "koin_dipakai": 5000
    },
    "dibuat_pada": "2026-11-05T10:00:00.000Z"
  }
}

Perpanjang server

POST/api/v1/servers/{id}/renew

Memperpanjang server milik akun. Gateway menghasilkan tagihan pending; saldo langsung diproses.

Izin: server:tulis ยท Wajib header Idempotency-Key

Parameter

NamaDiKeterangan
idstringwajibPathID sumber daya.
plan_idstringIsiGanti varian durasi.
voucherstringIsiKode voucher.
payment.methodstringwajibIsiKode dari GET /payment-methods. saldo berarti dompet.
payment.ewallet_numberstringIsiNomor e-wallet bila metode membutuhkannya.
payment.use_coinsbooleanIsiPakai koin bersama saldo. Hanya berlaku untuk metode saldo.

Galat yang mungkin

  • 400idempotency_key_wajibSertakan header Idempotency-Key (8-64 karakter huruf, angka, - atau _) pada permintaan ini.
  • 404tidak_ditemukanData tidak ditemukan.
  • 402saldo_kurangSaldo dan koin tidak cukup.
  • 403batas_harian_terlampauiBatas belanja harian kunci ini terlampaui.
  • 422tidak_bisa_diprosesPermintaan tidak bisa diproses.
Terminal
curl -X POST "https://pterokudesu.com/api/v1/servers/k3x9ab2q/renew" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Idempotency-Key: pesanan-2026-11-05-001" \
  -H "Content-Type: application/json" \
  -d '{
  "payment": {
    "method": "qris"
  }
}'

Respons 201

JSON
{
  "data": {
    "id": "p7c1xw9d",
    "jenis": "renewal",
    "id_server": "k3x9ab2q",
    "status": "pending",
    "total": 15750,
    "harga": 15000,
    "biaya_admin": 750,
    "metode": {
      "kode": "qris",
      "nama": "QRIS"
    },
    "pembayaran": {
      "qr_image_url": "https://example.com/qr/k3x9ab2q.png",
      "nomor_va": null,
      "kode_bayar": null,
      "url_pembayaran": null,
      "kedaluwarsa_pada": "2026-11-05T11:00:00.000Z"
    },
    "dompet": null,
    "dibuat_pada": "2026-11-05T10:00:00.000Z"
  }
}

Hitung harga perpanjangan

GET/api/v1/servers/{id}/renew/quote

Menghitung harga perpanjangan dan memeriksa voucher tanpa membuat tagihan. Voucher yang tidak valid tidak membuat permintaan gagal: alasannya ada di voucher_galat. Harga bersih bisa langsung dipakai sebagai amount di GET /payment-methods untuk melihat biaya gateway per metode.

Izin: server:baca

Parameter

NamaDiKeterangan
idstringwajibPathID sumber daya.
plan_idstringQueryVarian durasi lain dari grup paket yang sama.
voucherstringQueryKode voucher yang ingin diperiksa.

Galat yang mungkin

  • 400permintaan_tidak_validParameter permintaan tidak valid.
  • 404tidak_ditemukanData tidak ditemukan.
  • 422tidak_bisa_diprosesPermintaan tidak bisa diproses.
Terminal
curl -X GET "https://pterokudesu.com/api/v1/servers/k3x9ab2q/renew/quote?voucher=HEMAT10" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Respons 200

JSON
{
  "data": {
    "paket": {
      "id": "plan_abc",
      "durasi": "30 hari",
      "hari": 30
    },
    "harga": {
      "harga_paket": 15000,
      "diskon_paket": 0,
      "diskon_reseller": 0,
      "harga_tambahan": 0,
      "diskon_voucher": 0,
      "harga_bersih": 15000,
      "biaya_layanan": 300,
      "dasar_pembayaran": 15300
    },
    "voucher": null,
    "voucher_galat": null,
    "varian": [
      {
        "plan_id": "plan_abc",
        "durasi": "30 hari",
        "hari": 30,
        "harga": 15000
      }
    ]
  }
}

Status garansi server

GET/api/v1/servers/{id}/warranty

Apakah garansi server masih bisa diklaim. Pemeriksaan ini hanya membaca data transaksi dan tidak mengecek panel, jadi klaim tetap bisa ditolak bila server di panel masih aktif. maks_klaim atau sisa_klaim null berarti tanpa batas atau tidak berlaku. sisa_hari null berarti tanpa batas waktu.

Izin: server:baca

Parameter

NamaDiKeterangan
idstringwajibPathID sumber daya.

Galat yang mungkin

  • 404tidak_ditemukanData tidak ditemukan.
Terminal
curl -X GET "https://pterokudesu.com/api/v1/servers/k3x9ab2q/warranty" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Respons 200

JSON
{
  "data": {
    "layak": true,
    "kode_alasan": null,
    "alasan": null,
    "maks_klaim": 3,
    "sisa_klaim": 3,
    "sisa_hari": 25,
    "berlaku_sampai": "2026-12-01T10:00:00.000Z"
  }
}

Klaim garansi server

POST/api/v1/servers/{id}/warranty/claim

Membuat ulang server yang mati atau hilang dari panel dan mengembalikan kredensial barunya. Klaim ditolak bila server di panel masih aktif, sehingga mengulang permintaan aman. Password hanya muncul di respons ini, simpan segera. Maksimal 3 percobaan per 10 menit.

Izin: server:tulis

Parameter

NamaDiKeterangan
idstringwajibPathID sumber daya.

Galat yang mungkin

  • 404tidak_ditemukanData tidak ditemukan.
  • 422tidak_bisa_diprosesPermintaan tidak bisa diproses.
  • 429terlalu_banyak_permintaanTerlalu banyak permintaan. Coba lagi sebentar.
  • 403izin_tulis_ditolakIzin tulis API saat ini hanya untuk akun reseller dan staf.
Terminal
curl -X POST "https://pterokudesu.com/api/v1/servers/k3x9ab2q/warranty/claim" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{}'

Respons 200

JSON
{
  "data": {
    "id_server": "k3x9ab2q",
    "username_panel": "budi123",
    "password": "Qw71nBvR4cYd",
    "url_panel": "https://panel.example.com",
    "mode": "tambah-server"
  }
}

Status perpanjang otomatis

GET/api/v1/servers/{id}/auto-renew

Apakah perpanjang otomatis aktif untuk server ini.

Izin: server:baca

Parameter

NamaDiKeterangan
idstringwajibPathID sumber daya.
Terminal
curl -X GET "https://pterokudesu.com/api/v1/servers/k3x9ab2q/auto-renew" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Respons 200

JSON
{
  "data": {
    "id_server": "k3x9ab2q",
    "enabled": true,
    "use_coins": false,
    "hasil_terakhir": null,
    "percobaan_terakhir": null
  }
}

Atur perpanjang otomatis

PUT/api/v1/servers/{id}/auto-renew

Perpanjang otomatis memakai saldo mulai 2 hari sebelum masa aktif habis.

Izin: server:tulis

Parameter

NamaDiKeterangan
idstringwajibPathID sumber daya.
enabledbooleanwajibIsiAktifkan atau matikan.
use_coinsbooleanIsiPakai koin lebih dulu.

Galat yang mungkin

  • 400permintaan_tidak_validParameter permintaan tidak valid.
  • 404tidak_ditemukanData tidak ditemukan.
Terminal
curl -X PUT "https://pterokudesu.com/api/v1/servers/k3x9ab2q/auto-renew" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
  "enabled": true,
  "use_coins": false
}'

Respons 200

JSON
{
  "data": {
    "id_server": "k3x9ab2q",
    "enabled": true,
    "use_coins": false,
    "hasil_terakhir": null,
    "percobaan_terakhir": null
  }
}

Transaksi

Daftar transaksi

GET/api/v1/transactions

20 transaksi per halaman, terbaru lebih dulu.

Izin: transaksi:baca

Parameter

NamaDiKeterangan
statusstringQuerysemua, selesai, berjalan, atau gagal.
beforestringQueryNilai berikutnya dari respons sebelumnya untuk halaman selanjutnya.
Terminal
curl -X GET "https://pterokudesu.com/api/v1/transactions?status=berjalan" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Respons 200

JSON
{
  "data": [
    {
      "id": "k3x9ab2q",
      "paket": "Panel 2GB",
      "total": 15000,
      "status": "completed",
      "jenis": "pembelian",
      "metode": "Saldo & koin",
      "dibuat_pada": "2026-11-01T10:00:00.000Z"
    }
  ],
  "berikutnya": "2026-11-01T10:00:00.000Z"
}

Detail transaksi

GET/api/v1/transactions/{id}

Detail transaksi beserta rincian harga.

Izin: transaksi:baca

Parameter

NamaDiKeterangan
idstringwajibPathID sumber daya.

Galat yang mungkin

  • 404tidak_ditemukanData tidak ditemukan.
Terminal
curl -X GET "https://pterokudesu.com/api/v1/transactions/k3x9ab2q" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Respons 200

JSON
{
  "data": {
    "id": "k3x9ab2q",
    "paket": "Panel 2GB",
    "total": 15000,
    "status": "completed",
    "jenis": "pembelian",
    "metode": "Saldo & koin",
    "dibuat_pada": "2026-11-01T10:00:00.000Z",
    "username_panel": "budi123",
    "tipe_panel": "Public Panel",
    "durasi": "30 hari",
    "rincian": {
      "harga_paket": 15000,
      "diskon_paket": 0,
      "harga_tambahan": 0,
      "diskon_voucher": 0,
      "biaya_admin": 0
    },
    "id_server": 12
  }
}

Batalkan transaksi

POST/api/v1/transactions/{id}/cancel

Membatalkan pesanan atau perpanjangan gateway yang masih pending. Status menjadi expired dan webhook pembayaran.kedaluwarsa terkirim. Jatah belanja harian tidak dikembalikan. Bila pembayaran terlanjur masuk, pesanan tetap diproses dan permintaan ditolak.

Izin: server:tulis ยท Wajib header Idempotency-Key

Parameter

NamaDiKeterangan
idstringwajibPathID sumber daya.

Galat yang mungkin

  • 404tidak_ditemukanData tidak ditemukan.
  • 422tidak_bisa_diprosesPermintaan tidak bisa diproses.
Terminal
curl -X POST "https://pterokudesu.com/api/v1/transactions/k3x9ab2q/cancel" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Idempotency-Key: pesanan-2026-11-05-001" \
  -H "Content-Type: application/json" \
  -d '{}'

Respons 200

JSON
{
  "data": {
    "id": "k3x9ab2q",
    "jenis": "pembelian",
    "id_server": "k3x9ab2q",
    "status": "expired",
    "total": 15750,
    "harga": 15000,
    "biaya_admin": 750,
    "metode": {
      "kode": "qris",
      "nama": "QRIS"
    },
    "pembayaran": {
      "qr_image_url": "https://example.com/qr/k3x9ab2q.png",
      "nomor_va": null,
      "kode_bayar": null,
      "url_pembayaran": null,
      "kedaluwarsa_pada": "2026-11-05T11:00:00.000Z"
    },
    "dompet": null,
    "dibuat_pada": "2026-11-05T10:00:00.000Z"
  }
}

Akun panel pelanggan

Daftar akun panel

GET/api/v1/panel-accounts

Akun pelangganmu beserta tipe panel yang sudah tertaut dan jumlah servernya.

Izin: akun-panel:baca

Terminal
curl -X GET "https://pterokudesu.com/api/v1/panel-accounts" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Respons 200

JSON
{
  "data": [
    {
      "id": "665f1c0e2a9b",
      "username": "pelanggan1",
      "email": "[email protected]",
      "tipe_panel": [
        "public"
      ],
      "jumlah_server": 2,
      "dibuat_pada": "2026-10-01T08:00:00.000Z"
    }
  ]
}

Detail akun panel

GET/api/v1/panel-accounts/{id}

Satu akun panel beserta daftar servernya.

Izin: akun-panel:baca

Parameter

NamaDiKeterangan
idstringwajibPathID sumber daya.

Galat yang mungkin

  • 404tidak_ditemukanData tidak ditemukan.
Terminal
curl -X GET "https://pterokudesu.com/api/v1/panel-accounts/665f1c0e2a9b" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Respons 200

JSON
{
  "data": {
    "id": "665f1c0e2a9b",
    "username": "pelanggan1",
    "email": "[email protected]",
    "tipe_panel": [
      "public"
    ],
    "jumlah_server": 2,
    "dibuat_pada": "2026-10-01T08:00:00.000Z",
    "server": []
  }
}

Buat akun pelanggan

POST/api/v1/panel-accounts

Membuat akun pelanggan baru tanpa server dan tanpa memilih tipe panel. Pakai id-nya sebagai panel_account_id saat membeli server. Jumlah akun dibatasi sesuai kuota resellermu.

Izin: akun-panel:tulis

Parameter

NamaDiKeterangan
usernamestringwajibIsiUsername pelanggan.
emailstringwajibIsiEmail pelanggan. Tidak boleh sudah dipakai akun lain.

Galat yang mungkin

  • 400permintaan_tidak_validParameter permintaan tidak valid.
  • 422tidak_bisa_diprosesPermintaan tidak bisa diproses.
  • 403izin_tulis_ditolakIzin tulis API saat ini hanya untuk akun reseller dan staf.
Terminal
curl -X POST "https://pterokudesu.com/api/v1/panel-accounts" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
  "username": "pelanggan1",
  "email": "[email protected]"
}'

Respons 201

JSON
{
  "data": {
    "id": "665f1c0e2a9b",
    "username": "pelanggan1",
    "email": "[email protected]",
    "tipe_panel": [],
    "jumlah_server": 0,
    "dibuat_pada": "2026-10-01T08:00:00.000Z"
  }
}

Reset password

POST/api/v1/panel-accounts/{id}/reset-password

Membuat password baru di semua panel yang sudah tertaut ke akun ini. Password lama langsung tidak berlaku.

Izin: akun-panel:tulis

Parameter

NamaDiKeterangan
idstringwajibPathID sumber daya.

Galat yang mungkin

  • 404tidak_ditemukanData tidak ditemukan.
  • 403izin_tulis_ditolakIzin tulis API saat ini hanya untuk akun reseller dan staf.
Terminal
curl -X POST "https://pterokudesu.com/api/v1/panel-accounts/665f1c0e2a9b/reset-password" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{}'

Respons 200

JSON
{
  "data": {
    "id": "665f1c0e2a9b",
    "password": "Qw71nBvR4cYd"
  }
}

Dompet

Saldo dan koin

GET/api/v1/wallet

Saldo rupiah dan jumlah koin.

Izin: dompet:baca

Terminal
curl -X GET "https://pterokudesu.com/api/v1/wallet" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Respons 200

JSON
{
  "data": {
    "saldo": 75000,
    "koin": 1200,
    "mata_uang": "IDR"
  }
}

Mutasi dompet

GET/api/v1/wallet/ledger

Mutasi saldo dan koin, 20 per halaman. jenis: topup, bayar, refund, cashback, referral, konversi_koin, penyesuaian, kedaluwarsa. jumlah selalu positif.

Izin: dompet:baca

Parameter

NamaDiKeterangan
currencystringQuerysaldo atau koin.
beforestringQueryNilai berikutnya dari respons sebelumnya untuk halaman selanjutnya.
Terminal
curl -X GET "https://pterokudesu.com/api/v1/wallet/ledger?currency=saldo" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Respons 200

JSON
{
  "data": [
    {
      "id": "m1",
      "mata": "saldo",
      "jenis": "topup",
      "jumlah": 50000,
      "keterangan": "Top up via QRIS",
      "dibuat_pada": "2026-11-05T09:30:00.000Z"
    }
  ],
  "berikutnya": "2026-11-01T10:00:00.000Z"
}

Buat top up

POST/api/v1/wallet/topups

Membuat tagihan top up. Saldo bertambah otomatis begitu pembayaran masuk.

Izin: dompet:tulis ยท Wajib header Idempotency-Key

Parameter

NamaDiKeterangan
amountintegerwajibIsiNominal dalam rupiah. Batas minimal dan maksimal mengikuti metode pembayaran yang tersedia.
methodstringwajibIsiKode metode gateway dari GET /payment-methods.
ewallet_numberstringIsiNomor e-wallet bila metode membutuhkannya.

Galat yang mungkin

  • 400idempotency_key_wajibSertakan header Idempotency-Key (8-64 karakter huruf, angka, - atau _) pada permintaan ini.
  • 400permintaan_tidak_validParameter permintaan tidak valid.
  • 422tidak_bisa_diprosesPermintaan tidak bisa diproses.
Terminal
curl -X POST "https://pterokudesu.com/api/v1/wallet/topups" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Idempotency-Key: pesanan-2026-11-05-001" \
  -H "Content-Type: application/json" \
  -d '{
  "amount": 50000,
  "method": "qris"
}'

Respons 201

JSON
{
  "data": {
    "id": "t8m2zq4c",
    "jumlah": 50000,
    "biaya_admin": 750,
    "total": 50750,
    "status": "pending",
    "metode": "QRIS",
    "pembayaran": {
      "qr_image_url": "https://example.com/qr/k3x9ab2q.png",
      "nomor_va": null,
      "kode_bayar": null,
      "url_pembayaran": null,
      "kedaluwarsa_pada": "2026-11-05T11:00:00.000Z"
    },
    "dibuat_pada": "2026-11-05T10:30:00.000Z"
  }
}

Status top up

GET/api/v1/wallet/topups/{id}

Status top up: pending, completed, failed, atau expired.

Izin: dompet:baca

Parameter

NamaDiKeterangan
idstringwajibPathID sumber daya.

Galat yang mungkin

  • 404tidak_ditemukanData tidak ditemukan.
Terminal
curl -X GET "https://pterokudesu.com/api/v1/wallet/topups/t8m2zq4c" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Respons 200

JSON
{
  "data": {
    "id": "t8m2zq4c",
    "jumlah": 50000,
    "biaya_admin": 750,
    "total": 50750,
    "status": "pending",
    "metode": "QRIS",
    "pembayaran": {
      "qr_image_url": "https://example.com/qr/k3x9ab2q.png",
      "nomor_va": null,
      "kode_bayar": null,
      "url_pembayaran": null,
      "kedaluwarsa_pada": "2026-11-05T11:00:00.000Z"
    },
    "dibuat_pada": "2026-11-05T10:30:00.000Z"
  }
}

Batalkan top up

POST/api/v1/wallet/topups/{id}/cancel

Membatalkan top up yang masih pending. Tanpa isi permintaan.

Izin: dompet:tulis ยท Wajib header Idempotency-Key

Parameter

NamaDiKeterangan
idstringwajibPathID sumber daya.

Galat yang mungkin

  • 404tidak_ditemukanData tidak ditemukan.
  • 422tidak_bisa_diprosesPermintaan tidak bisa diproses.
Terminal
curl -X POST "https://pterokudesu.com/api/v1/wallet/topups/t8m2zq4c/cancel" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Idempotency-Key: pesanan-2026-11-05-001" \
  -H "Content-Type: application/json" \
  -d '{}'

Respons 200

JSON
{
  "data": {
    "id": "t8m2zq4c",
    "jumlah": 50000,
    "biaya_admin": 750,
    "total": 50750,
    "status": "expired",
    "metode": "QRIS",
    "pembayaran": {
      "qr_image_url": "https://example.com/qr/k3x9ab2q.png",
      "nomor_va": null,
      "kode_bayar": null,
      "url_pembayaran": null,
      "kedaluwarsa_pada": "2026-11-05T11:00:00.000Z"
    },
    "dibuat_pada": "2026-11-05T10:30:00.000Z"
  }
}

Katalog

Tipe panel

GET/api/v1/panel-types

Tipe panel yang bisa dibeli. slug dipakai sebagai panel_type.

Izin: katalog:baca

Terminal
curl -X GET "https://pterokudesu.com/api/v1/panel-types" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Respons 200

JSON
{
  "data": [
    {
      "slug": "public",
      "nama": "Public Panel",
      "deskripsi": "Panel untuk bot dan website."
    }
  ]
}

Paket

GET/api/v1/plans

Paket beserta varian durasi, harga, egg, dan ketersediaan stok. id varian dipakai sebagai plan_id.

Izin: katalog:baca

Parameter

NamaDiKeterangan
panel_typestringwajibQuerySlug tipe panel.

Galat yang mungkin

  • 400permintaan_tidak_validParameter permintaan tidak valid.
  • 404tidak_ditemukanData tidak ditemukan.
Terminal
curl -X GET "https://pterokudesu.com/api/v1/plans?panel_type=public" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Respons 200

JSON
{
  "data": [
    {
      "id_grup": "g1",
      "nama": "Panel 2GB",
      "memori_mb": 2048,
      "disk_mb": 10240,
      "cpu_persen": 100,
      "kuota_gratis": {
        "database": 1,
        "backup": 1,
        "allocation": 1
      },
      "varian": [
        {
          "id": "plan_abc",
          "durasi": "30 hari",
          "hari": 30,
          "harga": 15000,
          "harga_normal": 20000,
          "egg_id": 5,
          "nest_id": 1,
          "lokasi_ids": null,
          "tersedia": true
        }
      ]
    }
  ]
}

Lokasi server

GET/api/v1/locations

Lokasi untuk satu varian paket dan apakah stoknya tersedia.

Izin: katalog:baca

Parameter

NamaDiKeterangan
panel_typestringwajibQuerySlug tipe panel.
plan_idstringwajibQueryID varian paket.

Galat yang mungkin

  • 400permintaan_tidak_validParameter permintaan tidak valid.
  • 404tidak_ditemukanData tidak ditemukan.
Terminal
curl -X GET "https://pterokudesu.com/api/v1/locations?panel_type=public&plan_id=plan_abc" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Respons 200

JSON
{
  "data": [
    {
      "id": 1,
      "nama": "Singapura",
      "tersedia": true
    }
  ]
}

Hitung harga pembelian

GET/api/v1/quote

Menghitung harga pembelian dan memeriksa voucher tanpa membuat tagihan, memakai aturan yang sama dengan POST /servers termasuk biaya layanan sesuai peran akun. Voucher dicek untuk akun pemilik kunci. Voucher yang tidak valid tidak membuat permintaan gagal: alasannya ada di voucher_galat. Cashback tidak dihitung di sini. Pakai harga_bersih sebagai amount di GET /payment-methods untuk melihat biaya gateway per metode.

Izin: katalog:baca

Parameter

NamaDiKeterangan
panel_typestringwajibQuerySlug tipe panel.
plan_idstringwajibQueryID varian paket.
egg_idintegerQueryEgg pilihan, bila berbeda dari bawaan paket.
nest_idintegerQueryNest dari egg pilihan.
location_idintegerQueryLokasi untuk memeriksa stok.
extra_databaseintegerQueryTambahan database, 0-20.
extra_backupintegerQueryTambahan backup, 0-20.
extra_allocationintegerQueryTambahan allocation, 0-20.
voucherstringQueryKode voucher yang ingin diperiksa.

Galat yang mungkin

  • 400permintaan_tidak_validParameter permintaan tidak valid.
  • 404tidak_ditemukanData tidak ditemukan.
Terminal
curl -X GET "https://pterokudesu.com/api/v1/quote?panel_type=public&plan_id=plan_abc&voucher=HEMAT10" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Respons 200

JSON
{
  "data": {
    "paket": {
      "id": "plan_abc",
      "nama": "Panel 2GB",
      "durasi": "30 hari",
      "hari": 30
    },
    "harga": {
      "harga_paket": 15000,
      "diskon_paket": 0,
      "diskon_reseller": 0,
      "harga_tambahan": 2000,
      "diskon_voucher": 1700,
      "harga_bersih": 15300,
      "biaya_layanan": 306,
      "dasar_pembayaran": 15606
    },
    "voucher": {
      "kode": "HEMAT10",
      "nama": "Hemat 10%",
      "diskon": 1700
    },
    "voucher_galat": null,
    "stok_tersedia": true,
    "kuota": {
      "database": 1,
      "backup": 1,
      "allocation": 1
    }
  }
}

Metode pembayaran

GET/api/v1/payment-methods

Metode pembayaran beserta biayanya untuk nominal tertentu. biaya_layanan adalah biaya internal sesuai peran akun pemilik kunci, biaya adalah biaya gateway yang dihitung dari nominal ditambah biaya_layanan, dan biaya_total adalah jumlah keduanya yang ditambahkan ke harga. Kode saldo berarti dompet, tanpa biaya, dan hanya berlaku untuk beli dan perpanjang.

Izin: katalog:baca

Parameter

NamaDiKeterangan
amountintegerQueryHarga bersih (setelah diskon dan voucher) atau nominal top up, 1.000 sampai 2.000.000. Bawaan 50.000.

Galat yang mungkin

  • 400permintaan_tidak_validParameter permintaan tidak valid.
Terminal
curl -X GET "https://pterokudesu.com/api/v1/payment-methods?amount=50000" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Respons 200

JSON
{
  "data": [
    {
      "kode": "saldo",
      "nama": "Saldo & koin",
      "kategori": "dompet",
      "tersedia": true,
      "biaya_layanan": 0,
      "biaya": 0,
      "biaya_total": 0,
      "butuh_nomor_ewallet": false,
      "catatan": "Hanya untuk beli dan perpanjang."
    },
    {
      "kode": "qris",
      "nama": "QRIS",
      "kategori": "qris",
      "tersedia": true,
      "biaya_layanan": 300,
      "biaya": 450,
      "biaya_total": 750,
      "butuh_nomor_ewallet": false
    }
  ]
}

Aktivitas, referral, notifikasi

Daftar aktivitas

GET/api/v1/activities

Catatan aktivitas akun: aksi, IP, perkiraan lokasi, browser, dan perangkat.

Izin: aktivitas:baca

Parameter

NamaDiKeterangan
beforestringQueryNilai berikutnya dari respons sebelumnya untuk halaman selanjutnya.
Terminal
curl -X GET "https://pterokudesu.com/api/v1/activities" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Respons 200

JSON
{
  "data": [
    {
      "id": "a1",
      "aksi": "login",
      "label": "Masuk ke akun",
      "penting": false,
      "ip": "203.0.113.7",
      "lokasi": "Jakarta, Indonesia",
      "koordinat": {
        "lat": -6.2,
        "lon": 106.8
      },
      "browser": "Chrome 130",
      "os": "Android 15",
      "rincian": null,
      "waktu": "2026-11-05T09:12:00.000Z"
    }
  ],
  "berikutnya": "2026-11-01T10:00:00.000Z"
}

Detail aktivitas

GET/api/v1/activities/{id}

Satu catatan aktivitas.

Izin: aktivitas:baca

Parameter

NamaDiKeterangan
idstringwajibPathID sumber daya.

Galat yang mungkin

  • 404tidak_ditemukanData tidak ditemukan.
Terminal
curl -X GET "https://pterokudesu.com/api/v1/activities/a1" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Respons 200

JSON
{
  "data": {
    "id": "a1",
    "aksi": "login",
    "label": "Masuk ke akun",
    "penting": false,
    "ip": "203.0.113.7",
    "lokasi": "Jakarta, Indonesia",
    "koordinat": {
      "lat": -6.2,
      "lon": 106.8
    },
    "browser": "Chrome 130",
    "os": "Android 15",
    "rincian": null,
    "waktu": "2026-11-05T09:12:00.000Z"
  }
}

Ringkasan referral

GET/api/v1/referral

Kode, tautan undangan, dan statistik referral.

Izin: referral:baca

Terminal
curl -X GET "https://pterokudesu.com/api/v1/referral" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Respons 200

JSON
{
  "data": {
    "kode": "BUDI123",
    "tautan": "https://example.com/akun/daftar?ref=BUDI123",
    "total_diundang": 4,
    "menunggu": 1,
    "selesai": 3,
    "total_koin": 600,
    "kode_dipakai": null,
    "aktif": true
  }
}

Akun yang diundang

GET/api/v1/referral/relations

Daftar akun yang diundang beserta status dan reward koin. Nama disamarkan.

Izin: referral:baca

Parameter

NamaDiKeterangan
beforestringQueryNilai berikutnya dari respons sebelumnya untuk halaman selanjutnya.
Terminal
curl -X GET "https://pterokudesu.com/api/v1/referral/relations" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Respons 200

JSON
{
  "data": [
    {
      "id": "r1",
      "nama": "Si***",
      "status": "selesai",
      "reward_koin": 200,
      "dibuat_pada": "2026-10-10T08:00:00.000Z",
      "selesai_pada": "2026-10-12T08:00:00.000Z"
    }
  ],
  "berikutnya": "2026-11-01T10:00:00.000Z"
}

Daftar notifikasi

GET/api/v1/notifications

Notifikasi akun beserta jumlah yang belum dibaca (belum_dibaca).

Izin: notifikasi:baca

Parameter

NamaDiKeterangan
beforestringQueryNilai berikutnya dari respons sebelumnya untuk halaman selanjutnya.
Terminal
curl -X GET "https://pterokudesu.com/api/v1/notifications" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Respons 200

JSON
{
  "data": [
    {
      "id": "n1",
      "jenis": "server",
      "judul": "Server siap",
      "isi": "Server Bot Discord sudah aktif.",
      "tautan": "/server/k3x9ab2q",
      "dibaca": false,
      "dibuat_pada": "2026-11-05T09:00:00.000Z"
    }
  ],
  "belum_dibaca": 1,
  "berikutnya": null
}

Detail notifikasi

GET/api/v1/notifications/{id}

Satu notifikasi. Membacanya lewat API tidak menandainya dibaca.

Izin: notifikasi:baca

Parameter

NamaDiKeterangan
idstringwajibPathID sumber daya.

Galat yang mungkin

  • 404tidak_ditemukanData tidak ditemukan.
Terminal
curl -X GET "https://pterokudesu.com/api/v1/notifications/n1" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Respons 200

JSON
{
  "data": {
    "id": "n1",
    "jenis": "server",
    "judul": "Server siap",
    "isi": "Server Bot Discord sudah aktif.",
    "tautan": "/server/k3x9ab2q",
    "dibaca": false,
    "dibuat_pada": "2026-11-05T09:00:00.000Z"
  }
}

Tandai dibaca

POST/api/v1/notifications/{id}/read

Menandai satu notifikasi sebagai dibaca.

Izin: notifikasi:tulis

Parameter

NamaDiKeterangan
idstringwajibPathID sumber daya.

Galat yang mungkin

  • 404tidak_ditemukanData tidak ditemukan.
Terminal
curl -X POST "https://pterokudesu.com/api/v1/notifications/n1/read" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{}'

Respons 200

JSON
{
  "data": {
    "id": "n1",
    "jenis": "server",
    "judul": "Server siap",
    "isi": "Server Bot Discord sudah aktif.",
    "tautan": "/server/k3x9ab2q",
    "dibaca": true,
    "dibuat_pada": "2026-11-05T09:00:00.000Z"
  }
}

Tandai semua dibaca

POST/api/v1/notifications/read-all

Menandai semua notifikasi sebagai dibaca.

Izin: notifikasi:tulis

Terminal
curl -X POST "https://pterokudesu.com/api/v1/notifications/read-all" \
  -H "Authorization: Bearer pdk_a1b2c3d4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{}'

Respons 200

JSON
{
  "data": {
    "ditandai": 3
  }
}

Nilai dan status

Daftar lengkap nilai yang bisa muncul pada field bertipe pilihan. Aplikasimu sebaiknya menangani nilai yang tidak dikenal dengan wajar, karena nilai baru bisa ditambahkan.

status pada transaksi dan hasil beli atau perpanjang

Urutan normal untuk gateway: pending, paid, completed. Bayar dengan saldo langsung paid atau completed.

  • pendingMenunggu bayar. Menunggu pembayaran gateway masuk.
  • paidDiproses. Pembayaran diterima, server sedang dibuat atau diperpanjang.
  • completedSelesai. Selesai. Server sudah dibuat atau masa aktifnya sudah bertambah.
  • failedGagal. Pembayaran gagal. Tidak ada tagihan yang tersisa.
  • expiredKedaluwarsa. Tagihan kedaluwarsa atau dibatalkan sebelum dibayar.

jenis pada transaksi

Untuk transaksi perpanjangan, id_server menunjuk server yang diperpanjang.

  • pembelianPembelian
  • renewalPerpanjangan

status pada server

Yang bisa diperpanjang hanya aktif dan tenggang.

  • aktifAktif. Berjalan normal.
  • tenggangMasa tenggang. Masa aktif habis, server masih bisa diperpanjang.
  • disuspendDisuspend. Disuspend karena melewati masa tenggang. Perpanjang untuk mengaktifkan lagi.
  • dihapusDihapus. Sudah dihapus dan tidak bisa diperpanjang.
  • tidak_terverifikasiTidak terverifikasi. Server tidak ditemukan di panel. Hubungi admin.

status pada top up

Saldo bertambah hanya saat completed.

  • pendingMenunggu bayar
  • paidDiproses
  • completedBerhasil
  • failedGagal
  • expiredKedaluwarsa
  • dibatalkanDibatalkan

jenis pada mutasi dompet

Field mata bernilai saldo atau koin. jumlah selalu positif, arah ditentukan jenisnya.

  • topupTop-up saldo
  • bayarPembayaran
  • konversi_koinTukar koin
  • refundPengembalian
  • cashbackCashback
  • referralHadiah referral
  • penyesuaianPenyesuaian admin
  • kedaluwarsaKoin kedaluwarsa

jenis pada notifikasi

Notifikasi pengumuman berasal dari admin.

  • keamananKeamanan
  • transaksiTransaksi
  • serverServer
  • pengumumanPengumuman

Galat dan batas laju

Galat selalu berbentuk objek berikut dengan status HTTP yang sesuai.

Respons galat

JSON
{
  "error": {
    "kode": "izin_kurang",
    "pesan": "Kunci ini tidak punya izin untuk endpoint ini."
  }
}
  • 401tidak_terautentikasiSertakan kunci API di header Authorization: Bearer <kunci>.
  • 401kunci_tidak_validKunci API tidak valid atau sudah dicabut.
  • 401kunci_kedaluwarsaKunci API sudah kedaluwarsa.
  • 403ip_ditolakAlamat IP ini tidak ada dalam daftar yang diizinkan untuk kunci ini.
  • 403izin_kurangKunci ini tidak punya izin untuk endpoint ini.
  • 404tidak_ditemukanData tidak ditemukan.
  • 429terlalu_banyak_permintaanTerlalu banyak permintaan. Coba lagi sebentar.
  • 400permintaan_tidak_validParameter permintaan tidak valid.
  • 500kesalahan_serverTerjadi kesalahan di server. Coba lagi sebentar.
  • 400idempotency_key_wajibSertakan header Idempotency-Key (8-64 karakter huruf, angka, - atau _) pada permintaan ini.
  • 422idempotency_tidak_cocokIdempotency-Key ini sudah dipakai dengan isi permintaan yang berbeda.
  • 409permintaan_sedang_diprosesPermintaan dengan Idempotency-Key ini masih diproses. Coba lagi sebentar.
  • 403batas_harian_terlampauiBatas belanja harian kunci ini terlampaui.
  • 402saldo_kurangSaldo dan koin tidak cukup.
  • 403izin_tulis_ditolakIzin tulis API saat ini hanya untuk akun reseller dan staf.
  • 422tidak_bisa_diprosesPermintaan tidak bisa diproses.

Setiap kunci dibatasi 60 permintaan per menit dan 20 permintaan tulis per menit. Satu alamat IP dibatasi 240 permintaan per menit untuk semua kunci, termasuk 60 permintaan tulis per menit. Percobaan dengan kunci salah dari satu alamat juga dibatasi. Lewat dari itu kamu menerima 429 dengan header Retry-After.

Webhook

Kami mengirim POST berisi JSON ke URL https milikmu saat peristiwa berikut terjadi:

  • server.siapServer siap
  • server.diperpanjangServer diperpanjang
  • server.segera_berakhirServer segera berakhir
  • server.disuspendServer disuspend
  • server.dihapusServer dihapus
  • topup.berhasilTop-up berhasil
  • topup.gagalTop-up gagal
  • topup.kedaluwarsaTop-up kedaluwarsa
  • pembayaran.gagalPembayaran pesanan gagal
  • pembayaran.kedaluwarsaPembayaran pesanan kedaluwarsa
  • dompet.masukSaldo atau koin bertambah
  • dompet.keluarSaldo atau koin berkurang
  • server.siapIsi data: transaction_id, paket, hari_tersisa (null)
  • server.diperpanjangIsi data: transaction_id (server yang diperpanjang), paket, hari_tersisa (null)
  • server.segera_berakhirIsi data: transaction_id, paket, hari_tersisa
  • server.disuspendIsi data: transaction_id, paket, hari_tersisa (null)
  • server.dihapusIsi data: transaction_id, paket, hari_tersisa (null)
  • topup.berhasilIsi data: topup_id, nominal
  • topup.gagalIsi data: topup_id, nominal, total
  • topup.kedaluwarsaIsi data: topup_id, nominal, total
  • pembayaran.gagalIsi data: transaction_id, jenis, id_server, total
  • pembayaran.kedaluwarsaIsi data: transaction_id, jenis, id_server, total
  • dompet.masukIsi data: mata, jenis, jumlah, keterangan
  • dompet.keluarIsi data: mata, jenis, jumlah, keterangan
  • webhook.ujiIsi data: pesan

Contoh isi

JSON
{
  "id": "evt_server.siap_k3x9ab2q_0",
  "jenis": "server.siap",
  "dibuat_pada": "2026-11-02T10:00:00.000Z",
  "data": { "transaction_id": "k3x9ab2q", "paket": "Panel 2GB", "hari_tersisa": null }
}

dompet.masuk dan dompet.keluar dikirim setiap saldo atau koin berubah; datanya berisi mata (saldo atau koin), jenis (topup, bayar, refund, cashback, referral, konversi_koin, penyesuaian, kedaluwarsa), jumlah (selalu positif), dan keterangan. pembayaran.gagal dan pembayaran.kedaluwarsa berisi transaction_id, jenis, id_server, dan total; topup.gagal dan topup.kedaluwarsa berisi topup_id, nominal, dan total. Pembayaran lewat saldo tidak memicu peristiwa ini.

Balas dengan status 2xx dalam 8 detik. Selain itu kami mengulang hingga 6 kali dengan jeda 1, 5, 30, 120, 360 menit. Gunakan field id untuk mengabaikan pengiriman ganda. Webhook yang gagal berturut-turut dimatikan otomatis. URL tidak boleh mengarah ke alamat privat atau loopback dan pengalihan tidak diikuti.

Verifikasi tanda tangan

Berlaku untuk semua pengiriman webhook. Setiap pengiriman membawa header X-Pterokudesu-Signature: t=<detik>,v1=<hex>, X-Pterokudesu-Event, dan X-Pterokudesu-Delivery. Nilai v1 adalah HMAC-SHA256 dari {t}.{badan mentah} dengan rahasia webhook. Tolak permintaan yang cap waktunya lebih dari 5 menit dari sekarang.

Node.js

JavaScript
import { createHmac, timingSafeEqual } from "node:crypto"

function valid(rahasia, header, badanMentah) {
  const t = /t=(\d+)/.exec(header)?.[1]
  const v1 = /v1=([0-9a-f]{64})/.exec(header)?.[1]
  if (!t || !v1) return false
  if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false
  const harapan = createHmac("sha256", rahasia).update(t + "." + badanMentah).digest()
  return timingSafeEqual(harapan, Buffer.from(v1, "hex"))
}

Python

Python
import hashlib, hmac, re, time

def valid(rahasia, header, badan_mentah):
    t = re.search(r"t=(\d+)", header)
    v1 = re.search(r"v1=([0-9a-f]{64})", header)
    if not t or not v1 or abs(time.time() - int(t.group(1))) > 300:
        return False
    pesan = t.group(1).encode() + b"." + badan_mentah
    harapan = hmac.new(rahasia.encode(), pesan, hashlib.sha256).hexdigest()
    return hmac.compare_digest(harapan, v1.group(1))