Errors & status codes

Semua error memakai envelope yang sama dengan respons sukses, jadi penanganannya seragam: cek status_code, baca message, lalu tentukan retry atau tidak.

Bentuk error

json
{
  "status_code": 403,
  "message": "Forbidden resource"
}

HTTP / status_code

KodeArtiRetry?
200 / 201Sukses
400Validasi gagal / state tidak valid (mis. order bukan Created)Tidak (perbaiki request)
401JWT tidak valid/kedaluwarsaTidak (login ulang)
403API key salah/kosong, atau bukan pemilik resourceTidak
404Order/link tidak ditemukanTidak
429Rate limit terlampauiYa, dengan backoff
500Kesalahan internalYa, dengan backoff
503Layanan sementara tidak tersediaYa, dengan backoff

Error umum & solusi

PesanPenyebabSolusi
Forbidden resourceHeader api-key hilang/salahKirim API key merchant yang benar (lihat Authentication)
Order not foundorder_no/merchant_id tidak cocokPastikan order dibuat di lingkungan (testnet/mainnet) yang sama
Order is not in Created statusOrder sudah dibayar/kedaluwarsaBuat order baru untuk pembayaran berikutnya
Payment link is no longer availableKuota habis / link nonaktifBuat payment link baru
Insufficient balanceSaldo settlement kurang untuk withdrawalKurangi nominal atau tunggu settlement berikutnya
Too many login attemptsLockout sementara (5 percobaan / 15 menit)Tunggu durasi lockout
No deposit address available for this networkChannel/jaringan belum aktif untuk merchantAktifkan channel di dashboard atau hubungi tim Hashpay

Strategi retry

Backoff eksponensial dengan jitter
async function withRetry(fn, attempts = 4) {
  for (let i = 0; i < attempts; i++) {
    try {
      return await fn();
    } catch (err) {
      const retriable = [429, 500, 503].includes(err.status);
      if (!retriable || i === attempts - 1) throw err;
      const delay = Math.min(2 ** i * 500, 8000) + Math.random() * 250;
      await new Promise((r) => setTimeout(r, delay));
    }
  }
}