Dokumentasi

Dokumentasi API

Seluruh endpoint memerlukan header Authorization: Bearer «redac..._…», yang dapat Anda peroleh setelah mendaftar. Format respons selalu { success, data } untuk permintaan yang berhasil, atau { success: false, error: { code, message } } apabila terjadi kesalahan.

1Membuat deposit

Kirim nominal pembayaran. Sistem akan mengembalikan kode QR dinamis beserta nominal unik yang harus dibayarkan oleh pelanggan.

POST /api/v1/deposit/create
Authorization: Bearer «redac..._…»|

{ "amount": 50000, "reference": "order-123" }

→ 201
{
  "success": true,
  "data": {
    "id": "cpv...",
    "unique_amount": 50001,
    "qr_string": "000201010211...6304ABCD",
    "expires_at": "2026-09-10T05:00:00.000Z"
  }
}

Sistem menambahkan selisih nominal unik (1–999 rupiah) pada setiap transaksi. Pelanggan wajib membayar tepat sebesar nominal unik tersebut agar pembayaran dapat diidentifikasi secara otomatis, termasuk apabila terdapat beberapa pesanan dengan nominal dasar yang sama. Kode QR berlaku selama 5 menit secara bawaan.

2Memeriksa status pembayaran

GET /api/v1/deposit/status/:id
Authorization: Bearer «redac..._…»

→ { "success": true,
    "data": { "status": "paid", "paid_at": "...", "tx_id": "..." } }

status: pending → paid | expired | cancelled

3Menerima notifikasi webhook

Daftarkan URL endpoint Anda melalui dasbor merchant (menu Webhook). SAKUPAY akan mengirimkan peristiwa payment.paid dan payment.expiredke URL tersebut. Keaslian setiap notifikasi dapat diverifikasi melalui tanda tangan digital:

POST {url-milik-anda}        ← dari SAKUPAY
X-Webhook-Signature: <hex HMAC-SHA256(body, webhook_secret)>
X-Sakupay-Event: payment.paid

{ "event": "payment.paid", "payment_id": "cpv...",
  "data": { "amount": 50000, "unique_amount": 50001, ... } }

4Memeriksa saldo dan riwayat

GET /api/v1/balance
→ { "success": true,
    "data": { "balance": 99300, "available": 99300,
              "pending_withdrawal": 0 } }

GET /api/v1/payments?status=paid&per=20
→ { "success": true,
    "data": { "total": 42, "page": 1, "items": [...] } }