Pengembang

Dokumentasi API SMS massal

API REST SendBulkSMS mengirim SMS ke 10,000 nomor per permintaan, mengembalikan ID kampanye segera, dan melaporkan setiap pesan ke webhook Anda. API menggunakan JSON melalui HTTPS, menggunakan kunci API Bearer, dan mengenakan tarif per pesan yang sama seperti konsol.

https://sendbulksms.cc/api/v1

Mulai cepat

  1. Buat akun dan isi saldo Anda di konsol.
  2. Buka API keys dan buat kunci. Kunci dapat dibuat setelah pengisian pertama dikreditkan. Kunci hanya ditampilkan sekali; simpan sebagai rahasia.
  3. Kirim permintaan POST ke /sms dengan nomor dan teks. Baca ID kampanye yang dikembalikan, lalu pantau pengiriman di konsol atau melalui webhook.

Autentikasi

Setiap permintaan kecuali daftar tarif publik membawa kunci Anda di header Authorization. Kunci dimulai dengan sbk_live_. Kunci baru menggantikan yang lama segera.

Authorization: Bearer sbk_live_YOUR_KEY

Kirim SMS

POST/sms

Membuat kampanye, menagihnya dari saldo dan mengantre setiap pesan. Nomor dibersihkan dan dihapus duplikat; yang tidak dapat digunakan dikembalikan di dropped dengan alasan dan tidak dikenakan biaya.

KolomDeskripsi
towajibSatu nomor atau array hingga 10,000 nomor dalam format internasional, contohnya "+447700900461"
textwajibTeks pesan, hingga 10 segmen. Teks GSM-7 muat 160 karakter per segmen, UCS-2 muat 70
schedule_atopsionalWaktu ISO 8601 dari 5 menit hingga 60 hari ke depan. Abaikan untuk mengirim sekarang
client_refopsionalReferensi Anda sendiri, hingga 64 karakter a-z A-Z 0-9 _ . : -, dikembalikan dalam laporan dan webhook
opt_outopsionaltrue menambahkan baris opt-out yang diatur di pengaturan akun Anda
curl -X POST https://sendbulksms.cc/api/v1/sms \
  -H "Authorization: Bearer sbk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to": ["+447700900461", "+5511955550123"],
    "text": "Hi, your order 4821 ships today.",
    "client_ref": "orders-4821"
  }'

Respons: kampanye dengan biayanya dan 1.000 pesan pertama. Ambil lebih banyak dengan pesan kampanye.

HTTP/1.1 201 Created
{
  "id": "CP-7KQ2-M9XA-4HTD",
  "status": "sending",
  "source": "api",
  "recipients": 2,
  "segments": 1,
  "encoding": "GSM-7",
  "cost": "0.01078",
  "refunded": "0.00000",
  "client_ref": "orders-4821",
  "scheduled_at": null,
  "created_at": "2026-11-07T10:32:04.118Z",
  "done_at": null,
  "counts": { "queued": 2, "sent": 0, "delivered": 0, "failed": 0, "canceled": 0 },
  "dropped": [],
  "balance": "248.30422",
  "messages": [
    { "id": "SM-2RBW-8MZN-QF6K", "campaign_id": "CP-7KQ2-M9XA-4HTD", "to": "+447700900461", "country": "GB", "parts": 1, "price": "0.00819", "status": "queued", "error": null, "created_at": "2026-11-07T10:32:04.118Z", "sent_at": null, "done_at": null }
  ]
}

Estimasi pengiriman

POST/estimate

Mengambil body yang sama seperti /sms dan mengembalikan penerima, segmen, encoding, total biaya dan biaya per negara tanpa menagih atau mengirim apa pun.

{ "recipients": 2, "dropped": [], "segments": 1, "encoding": "GSM-7", "cost": "0.01078", "balance": "248.31500",
  "countries": [ { "country": "GB", "recipients": 1, "cost": "0.00819" }, { "country": "BR", "recipients": 1, "cost": "0.00259" } ] }

Status pesan

GET/sms/{message_id}

Mengembalikan satu pesan: nomor, negara, segmen, harga, status, kesalahan untuk pesan yang gagal dan waktu setiap langkah.

Kampanye

GET/campaigns/{campaign_id}

Kampanye dengan biaya, pengembalian dana dan jumlah pesan per status.

GET/campaigns/{campaign_id}/messages?offset=0&limit=100

Pesan dalam urutan antrean, hingga 1.000 per halaman.

POST/campaigns/{campaign_id}/cancel

Membatalkan kampanye terjadwal yang belum dimulai dan mengembalikan biaya penuh ke saldo.

Saldo dan tarif

GET/balance

{ "balance": "248.31500", "currency": "USD" }

GET/rates

Publik, tidak perlu kunci. Setiap negara dengan kode panggilan dan harga per segmen. /rates/GB mengembalikan satu negara.

{ "updated": "2026-11-07", "rates": [ { "country": "GB", "name": "United Kingdom", "calling_code": "+44", "price": "0.00819", "currency": "USD", "unit": "SMS segment" } ] }

Webhook pengiriman

Atur URL webhook di konsol di bawah API keys. Ketika pesan mencapai status akhir (terkirim atau gagal) kami POST laporan ke sana. Jawab dengan status 2xx dalam 8 detik; jika tidak, panggilan akan diulang hingga 8 kali dalam sekitar 11 jam. Gunakan id untuk mengabaikan laporan yang sudah Anda proses.

POST https://your-server.example/sms-status
Content-Type: application/json
X-SendBulkSMS-Signature: t=1794047524,v1=5f0c3b9e...

{
  "event": "message.status",
  "id": "evt_8c1d2e4f6a7b9c0d1e2f",
  "created_at": "2026-11-07T10:32:09.004Z",
  "data": {
    "message_id": "SM-2RBW-8MZN-QF6K",
    "campaign_id": "CP-7KQ2-M9XA-4HTD",
    "to": "+447700900461",
    "country": "GB",
    "status": "delivered",
    "error": null,
    "parts": 1,
    "price": "0.00819",
    "client_ref": "orders-4821",
    "done_at": "2026-11-07T10:32:08.912Z"
  }
}

Periksa tanda tangan sebelum mempercayai laporan: HMAC-SHA256 dari t + "." + raw body dengan rahasia webhook Anda, dibandingkan dalam waktu konstan, dan tolak waktu yang lebih lama dari 5 menit.

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

// raw = the request body exactly as received (string), header = X-SendBulkSMS-Signature
export function verify(raw, header, secret) {
  const m = /^t=(\d+),v1=([0-9a-f]{64})$/.exec(header || "");
  if (!m || Math.abs(Date.now() / 1000 - Number(m[1])) > 300) return false;
  const want = Buffer.from(createHmac("sha256", secret).update(m[1] + "." + raw).digest("hex"));
  const got = Buffer.from(m[2]);
  return want.length === got.length && timingSafeEqual(want, got);
}

Status

StatusArti
queuedDiterima dan dikenakan biaya, menunggu gilirannya dalam antrian
sentDiteruskan ke rute, menunggu laporan pengiriman
deliveredJaringan mengonfirmasi pengiriman ke ponsel
failedTidak terkirim; biaya dikembalikan dan error berisi alasannya
canceledBagian dari kampanye terjadwal yang dibatalkan sebelum dimulai; dana dikembalikan

Kesalahan

Error menggunakan kode status HTTP dan badan JSON: { "error": { "code": "insufficient_balance", "message": "..." } }. Permintaan yang mengembalikan error tidak akan mengurangi saldo.

HTTPKode
400bad_requestKolom tidak ada atau tidak valid; pesan menjelaskan yang mana
400no_valid_numbersTidak ada nomor dalam "to" yang dapat digunakan
401unauthorizedKunci API tidak ada atau tidak valid
402insufficient_balanceSaldo tidak mencukupi untuk pengiriman; tidak ada biaya yang dikenakan
404not_foundKampanye, pesan, atau endpoint tidak ada di akun Anda
409not_scheduledHanya kampanye terjadwal yang belum dimulai yang dapat dibatalkan
413too_many_recipientsLebih dari 10,000 nomor dalam satu permintaan
429rate_limitedLebih dari 300 permintaan dalam satu menit untuk kunci ini
500server_errorCoba lagi; tidak ada biaya untuk permintaan yang gagal

Batasan

  • 300 permintaan per menit per kunci API.
  • 10,000 nomor per permintaan pengiriman; 10 segmen per pesan.
  • Pesan dikirim hingga 200 per menit per antrian, sesuai urutan penerimaan.
  • Penjadwalan dari 5 menit hingga 60 hari ke depan.
  • Nomor dalam daftar jangan-kirim akan dilewati dan dikembalikan di dropped dengan kode suppressed; tidak dikenakan biaya.
Dokumentasi API SMS Massal: Kirim SMS dengan REST API | SendBulkSMS