Mga Developer

Dokumentasyon ng Bulk SMS API

Ang SendBulkSMS REST API ay nagpapadala ng SMS sa 10,000 mga numero bawat request, nagbabalik ng campaign ID agad at nagre-report ng bawat mensahe sa iyong webhook. Ito ay nagsasalita ng JSON sa HTTPS, gumagamit ng Bearer API key at nagcha-charge ng parehong per-message rates tulad ng console.

https://sendbulksms.cc/api/v1

Quick start

  1. Gumawa ng account at mag-top up ng balance sa console.
  2. Buksan ang API keys at gumawa ng key. Magagawa ang mga key pagkatapos ma-credit ang unang top-up. Ang key ay ipapakita minsan; itago ito bilang lihim.
  3. Magpadala ng POST request sa /sms kasama ang mga numero at text. Basahin ang ibinalik na campaign ID, pagkatapos sundan ang delivery sa console o sa pamamagitan ng webhooks.

Authentication

Bawat request maliban sa public rate list ay nagdadala ng iyong key sa Authorization header. Ang mga key ay nagsisimula sa sbk_live_. Ang bagong key ay papalit agad sa lumang key.

Authorization: Bearer sbk_live_YOUR_KEY

Magpadala ng SMS

POST/sms

Gumagawa ng kampanya, sisingilin ito mula sa balance at i-queue ang bawat mensahe. Nililinis at dine-duplicate ang mga numero; ang mga hindi magagamit ay ibabalik sa dropped kasama ang dahilan at hindi sisingilin.

FieldDescription
torequiredIsang numero o array ng hanggang 10,000 numero sa international format, halimbawa "+447700900461"
textrequiredText ng mensahe, hanggang 10 segment. Ang GSM-7 text ay kasya sa 160 character bawat segment, ang UCS-2 ay kasya sa 70
schedule_atoptionalISO 8601 time mula 5 minuto hanggang 60 araw sa hinaharap. Huwag isama para magpadala agad
client_refoptionalIyong sariling reference, hanggang 64 ng a-z A-Z 0-9 _ . : -, ibabalik sa mga report at webhooks
opt_outoptionaltrue ay magdadagdag ng opt-out line na nakatakda sa iyong account settings
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"
  }'

Response: ang kampanya kasama ang gastos nito at ang unang 1,000 mensahe. Kumuha pa gamit ang campaign messages.

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 }
  ]
}

Tantyahin ang pagpapadala

POST/estimate

Tumanggap ng parehong body tulad ng /sms at ibalik ang mga recipient, segment, encoding, kabuuang gastos at gastos bawat bansa nang walang singil o pagpapadala.

{ "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 ng mensahe

GET/sms/{message_id}

Nagbabalik ng isang mensahe: numero, bansa, segment, presyo, status, error para sa mga nabigong mensahe at oras ng bawat hakbang.

Mga kampanya

GET/campaigns/{campaign_id}

Ang kampanya kasama ang gastos nito, mga refund at bilang ng mga mensahe bawat status.

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

Mga mensahe sa pagkakasunud-sunod na na-queue, hanggang 1,000 bawat pahina.

POST/campaigns/{campaign_id}/cancel

Kinakansela ang isang naka-schedule na kampanya na hindi pa nagsisimula at ibabalik ang buong gastos nito sa balance.

Balance at mga rate

GET/balance

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

GET/rates

Public, hindi kailangan ng key. Bawat bansa kasama ang calling code at presyo bawat segment. /rates/GB ay nagbabalik ng isang bansa.

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

Mga webhook ng delivery

Itakda ang isang webhook URL sa console sa ilalim ng API keys. Kapag ang isang mensahe ay umabot sa final status (delivered o failed) ay mag-POST kami ng report dito. Sagutin ng kahit anong 2xx status sa loob ng 8 segundo; kung hindi, ang tawag ay uulitin hanggang 8 beses sa loob ng 11 oras. Gamitin ang id para huwag pansinin ang report na naproseso mo na.

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"
  }
}

Suriin ang signature bago magtiwala sa report: HMAC-SHA256 ng t + "." + raw body gamit ang iyong webhook secret, ikumpara sa constant time, at tanggihan ang mga oras na mas matanda sa 5 minuto.

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);
}

Mga status

KatayuanKahulugan
queuedTinanggap at siningil, naghihintay ng turn sa pila
sentNaipasa sa ruta, naghihintay ng delivery report
deliveredKinumpirma ng network ang paghahatid sa handset
failedHindi naihatid; ibinalik ang presyo at ang error ay naglalaman ng dahilan
canceledBahagi ng isang naka-schedule na kampanya na kinansela bago ito magsimula; ibinalik ang bayad

Mga error

Ang mga error ay gumagamit ng HTTP status codes at JSON body: { "error": { "code": "insufficient_balance", "message": "..." } }. Ang isang request na nagbabalik ng error ay hindi sisingilin sa balance.

HTTPCode
400bad_requestNawawala o hindi wasto ang isang field; ipinapaliwanag ng mensahe kung alin
400no_valid_numbersWalang magagamit na numero sa "to"
401unauthorizedNawawala o hindi wasto ang API key
402insufficient_balanceHindi sapat ang balance para sa pagpapadala; walang sinisingil
404not_foundHindi umiiral ang kampanya, mensahe o endpoint sa iyong account
409not_scheduledTanging isang naka-schedule na kampanya na hindi pa nagsisimula ang maaaring kanselahin
413too_many_recipientsHigit sa 10,000 na numero sa isang request
429rate_limitedHigit sa 300 na request sa isang minuto para sa key na ito
500server_errorSubukan muli; walang singil para sa isang request na nabigo

Mga limitasyon

  • 300 na request kada minuto bawat API key.
  • 10,000 na numero bawat send request; 10 segment bawat mensahe.
  • Ang mga mensahe ay umaalis hanggang sa 200 kada minuto bawat pila, sa pagkakasunud-sunod na tinanggap.
  • Pag-schedule mula 5 minuto hanggang 60 araw nang maaga.
  • Ang mga numero sa iyong do-not-send list ay lalaktawan at ibabalik sa dropped na may code na suppressed; hindi sila sisingilin.
Bulk SMS API Documentation: Magpadala ng SMS gamit ang REST API | SendBulkSMS