B BGWA Docs
Referensi API

Kode error

Daftar kode HTTP, alasan penolakan, dan cara menanganinya.

BGWA memakai kode status HTTP standar. Semua respons error berupa JSON dengan field error (penjelasan yang bisa ditampilkan ke pengguna). Penolakan dari penjaga pengiriman juga memuat reason (kode mesin) dan, bila relevan, retry_after (detik).

Contoh penolakan 429
{
  "error": "Batas pengiriman ke penerima baru jam ini sudah tercapai. Coba lagi nanti.",
  "reason": "hourly_new_limit",
  "retry_after": 1320
}

Header Retry-After ikut dikirim bersama retry_after agar klien HTTP standar dapat menunggu otomatis.

Kode status HTTP

StatusArtiPerlu dicoba ulang?
200Berhasil. Untuk POST /messages berarti pesan diterima ke antrean.–
401API key tidak valid, tidak dikirim, atau sudah dicabut.Tidak. Perbaiki key.
403Langganan pemilik device tidak aktif atau akun disuspend.Tidak, sampai paket diperpanjang.
404Pesan tidak ditemukan (ID salah atau milik device lain).Tidak.
409Device belum terhubung ke WhatsApp, atau webhook belum diatur.Setelah masalah diperbaiki.
422Permintaan tidak valid atau ditolak aturan: nomor salah, duplikat, isi seragam, terlalu banyak tautan, penerima berhenti, nomor tidak terdaftar.Tidak, ubah dulu permintaannya.
429Terlalu banyak request, kuota habis, batas penerima baru tercapai, atau antrean penuh.Ya, setelah Retry-After.
502Worker WhatsApp tidak merespons.Ya, dengan jeda singkat.
503Pengiriman sementara dijeda (device dijeda, kontak baru dijeda, daftar nomor kotor, sistem sibuk).Ya, setelah Retry-After.

Kode reason penolakan

Muncul pada POST /messages ketika penjaga menolak pesan. Pesan yang ditolak tidak memakai kuota.

ReasonHTTPArti dan solusi
not_on_whatsapp422Nomor tujuan tidak terdaftar di WhatsApp. Hapus dari daftar Anda.
duplicate_message422Pesan sama ke nomor sama dalam 10 menit. Tunggu atau ubah isi.
content_repetitive422Isi terlalu seragam untuk banyak penerima baru. Variasikan dengan spintax atau {nama}.
too_many_links422Lebih dari 2 tautan dalam satu pesan. Kurangi tautan.
recipient_opted_out422Penerima membalas STOP/berhenti. Jangan dikirimi lagi.
otp_invalid422OTP lebih dari 200 karakter atau berisi tautan.
otp_rate_limited429Batas OTP per jam tercapai. Tunggu sesuai retry_after.
daily_new_limit429Batas penerima baru harian tercapai. Coba lagi besok.
hourly_new_limit429Batas penerima baru per jam tercapai.
daily_existing_limit429Batas pesan harian ke kontak lama tercapai.
queue_full429Antrean device sudah penuh. Tunggu beberapa menit.
schedule_unavailable429Pesan tidak bisa dijadwalkan saat ini. Coba lagi nanti.
new_contacts_paused503WhatsApp membatasi akun memulai chat baru, jadi pengiriman ke kontak baru dijeda. Kontak lama tetap bisa.
invalid_numbers_high503Terlalu banyak nomor tidak terdaftar belakangan ini. Bersihkan daftar nomor.
device_paused503Device dijeda sementara karena gangguan. Coba lagi beberapa saat.
queue_busy503Sistem sedang sibuk. Coba lagi sebentar.

Kesalahan validasi

Bila field wajib hilang atau salah format, API menjawab 422 dengan struktur validasi:

422 Unprocessable Content
{
  "message": "The to field is required.",
  "errors": {
    "to": ["The to field is required."]
  }
}

Nomor yang tidak bisa dinormalkan dijawab dengan {"error": "Nomor tujuan tidak valid. Gunakan format 08... atau 62..."}.

Menangani error dengan benar

Contoh penanganan (Node.js)
async function kirim(to, text) {
  const res = await fetch('https://bgwa.web.id/api/v1/messages', {
    method: 'POST',
    headers: {
      Authorization: 'Bearer ' + process.env.BGWA_API_KEY,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ to, text }),
  });
  const data = await res.json();

  if (res.ok) return data;                       // antre: simpan data.id

  if (res.status === 429 || res.status === 503) {
    const wait = Number(res.headers.get('Retry-After') || 60);
    throw Object.assign(new Error(data.error), { retryAfter: wait });  // jadwalkan ulang
  }
  if (res.status === 401 || res.status === 403 || res.status === 409) {
    throw new Error('Perlu tindakan: ' + data.error);                  // jangan diulang otomatis
  }
  throw new Error(data.error || 'Gagal (' + res.status + ')');         // 422: perbaiki permintaan
}