[
  {
    "code": "missing_api_key",
    "http": "401",
    "meaning": "Header autentikasi belum dikirim.",
    "action": "Kirim Authorization: Bearer KEY atau X-API-Key."
  },
  {
    "code": "invalid_api_key",
    "http": "401",
    "meaning": "Key salah, dicabut, atau diganti.",
    "action": "Periksa key aktif di API Reseller Center."
  },
  {
    "code": "forbidden",
    "http": "403",
    "meaning": "Akun tidak diizinkan memakai API.",
    "action": "Role Staff tidak memiliki akses reseller; hubungi Admin bila perlu."
  },
  {
    "code": "rate_limited",
    "http": "429",
    "meaning": "Batas request tercapai.",
    "action": "Tunggu sesuai detik dalam message, lalu ulang. Jangan polling rapat."
  },
  {
    "code": "invalid_server",
    "http": "400",
    "meaning": "Server di luar 1–5.",
    "action": "Isi server dengan angka 1 sampai 5."
  },
  {
    "code": "missing_parameter",
    "http": "400",
    "meaning": "Parameter wajib belum lengkap.",
    "action": "Ikuti tabel parameter per server dan gunakan ID dari katalog."
  },
  {
    "code": "invalid_parameter",
    "http": "400",
    "meaning": "Format negara, layanan, atau harga salah.",
    "action": "Salin ID/quoted_price dari response katalog tanpa mengubah format."
  },
  {
    "code": "invalid_provider",
    "http": "400",
    "meaning": "Pilihan abstrak SERVER 1 tidak valid.",
    "action": "Gunakan provider_1, provider_2, atau provider_3."
  },
  {
    "code": "missing_idempotency_key",
    "http": "400",
    "meaning": "Key permintaan OTP belum valid.",
    "action": "Simpan satu key unik 16–128 karakter untuk satu order beserta retry."
  },
  {
    "code": "invalid_idempotency_key",
    "http": "400",
    "meaning": "Key permintaan SMM belum valid.",
    "action": "Kirim Idempotency-Key 16–128 karakter."
  },
  {
    "code": "idempotency_conflict",
    "http": "409",
    "meaning": "Key sama dipakai dengan payload berbeda.",
    "action": "Untuk retry pertahankan payload asli. Key baru hanya untuk pesanan baru."
  },
  {
    "code": "duplicate_request",
    "http": "409",
    "meaning": "Token pernah dipakai; dapat muncul pada permintaan lama sebelum pembaruan.",
    "action": "Jangan langsung mengulang pembelian dengan key baru; periksa order atau hubungi Admin."
  },
  {
    "code": "service_not_found",
    "http": "404",
    "meaning": "Layanan tidak ditemukan.",
    "action": "Ambil katalog layanan terbaru."
  },
  {
    "code": "not_found",
    "http": "404",
    "meaning": "Pesanan OTP tidak ditemukan pada akun pemilik key.",
    "action": "Periksa order_id dan akun pemilik key."
  },
  {
    "code": "order_not_found",
    "http": "404",
    "meaning": "Pesanan SMM tidak ditemukan pada akun ini.",
    "action": "Gunakan order_id SMM, bukan ID lokal atau ID OTP."
  },
  {
    "code": "user_not_found",
    "http": "404",
    "meaning": "Akun pemilik key tidak ditemukan.",
    "action": "Hubungi Admin."
  },
  {
    "code": "number_unavailable",
    "http": "400",
    "meaning": "Offer sudah habis atau tidak tersedia.",
    "action": "Ambil pilihan nomor terbaru, kemudian pilih offer lain."
  },
  {
    "code": "price_mismatch",
    "http": "409",
    "meaning": "Harga berubah saat validasi.",
    "action": "Ambil offer/quote baru dan tinjau harga sebelum membuat order baru."
  },
  {
    "code": "pricing_locked",
    "http": "503",
    "meaning": "Pemesanan SERVER 3 sedang dibatasi.",
    "action": "Tunggu atau pilih server lain."
  },
  {
    "code": "server_unavailable",
    "http": "503",
    "meaning": "Katalog atau server sementara tidak tersedia.",
    "action": "Ulangi katalog nanti atau pilih server lain."
  },
  {
    "code": "provider_unavailable",
    "http": "503",
    "meaning": "Katalog sementara belum dapat dimuat.",
    "action": "Ulangi permintaan baca setelah jeda."
  },
  {
    "code": "provider_error",
    "http": "503",
    "meaning": "Server tidak dapat memproses permintaan.",
    "action": "Untuk GET dapat dicoba lagi. Untuk POST pastikan hasil lama dulu; gunakan key yang sama."
  },
  {
    "code": "order_rejected",
    "http": "409",
    "meaning": "Order ditolak, quote kedaluwarsa, saldo kurang, atau syarat akun belum terpenuhi.",
    "action": "Baca message. Periksa saldo/quote dan hasil order; jangan berasumsi setiap 409 berarti saldo sudah kembali."
  },
  {
    "code": "invalid_order",
    "http": "400",
    "meaning": "Parameter order SMM belum valid.",
    "action": "Periksa target, service_id, quantity dan comments."
  },
  {
    "code": "order_pending",
    "http": "202",
    "meaning": "Pembelian SMM masih diperiksa.",
    "action": "Simpan reservation_ref; pantau order_id bila tersedia. Jangan buat pembelian pengganti."
  },
  {
    "code": "cancel_wait",
    "http": "409",
    "meaning": "Belum melewati batas pembatalan 3 menit.",
    "action": "Tunggu dan cek status lagi sebelum membatalkan."
  },
  {
    "code": "otp_received",
    "http": "409",
    "meaning": "Kode sudah diterima.",
    "action": "Pesanan tidak dapat dibatalkan untuk refund."
  },
  {
    "code": "insufficient_balance",
    "http": "402",
    "meaning": "Saldo reseller tidak cukup.",
    "action": "Tambah saldo lalu tinjau ulang order."
  },
  {
    "code": "provider_uncertain",
    "http": "503",
    "meaning": "Hasil pembelian belum pasti.",
    "action": "Jangan ulang dengan key berbeda; simpan request dan hubungi Admin."
  },
  {
    "code": "provider_missing_order_id",
    "http": "502",
    "meaning": "Server belum mengembalikan ID order; saldo bisa tertahan.",
    "action": "Jangan melakukan pembelian pengganti. Minta pemeriksaan Admin."
  },
  {
    "code": "local_persistence_error",
    "http": "500",
    "meaning": "Hasil pembelian belum berhasil dicatat lokal.",
    "action": "Saldo dapat ditahan untuk rekonsiliasi. Simpan key permintaan dan hubungi Admin."
  }
]
