Deweloperzy

Dokumentacja API masowej wysyłki SMS

REST API SendBulkSMS wysyła SMS do 10,000 numerów na żądanie, natychmiast zwraca ID kampanii i raportuje każdą wiadomość na Twój webhook. Korzysta z JSON przez HTTPS, używa klucza API Bearer i pobiera takie same opłaty za wiadomość jak konsola.

https://sendbulksms.cc/api/v1

Szybki start

  1. Utwórz konto i doładuj saldo w konsoli.
  2. Otwórz Klucze API i utwórz klucz. Klucze można utworzyć po zaksięgowaniu pierwszej wpłaty. Klucz jest wyświetlany tylko raz; przechowuj go jako tajny.
  3. Wyślij żądanie POST na /sms z numerami i tekstem. Odczytaj zwrócony identyfikator kampanii, a następnie śledź dostarczenie w konsoli lub przez webhooki.

Uwierzytelnianie

Każde żądanie, z wyjątkiem publicznej listy stawek, zawiera Twój klucz w nagłówku Authorization. Klucze zaczynają się od sbk_live_. Nowy klucz natychmiast zastępuje stary.

Authorization: Bearer sbk_live_YOUR_KEY

Wyślij SMS

POST/sms

Tworzy kampanię, obciąża ją z salda i kolejkowuje każdą wiadomość. Numery są czyszczone i deduplikowane; te, których nie można użyć, są zwracane w dropped z powodem i nie są obciążane.

PoleOpis
towymaganeJeden numer lub tablica do 10,000 numerów w formacie międzynarodowym, np. "+447700900461"
textwymaganeTekst wiadomości, do 10 segmentów. Tekst GSM-7 mieści 160 znaków na segment, UCS-2 mieści 70
schedule_atopcjonalneCzas ISO 8601 od 5 minut do 60 dni w przyszłość. Pomijaj, aby wysłać teraz
client_refopcjonalneTwoje własne odniesienie, do 64 znaków a-z A-Z 0-9 _ . : -, zwracane w raportach i webhookach
opt_outopcjonalnetrue dodaje linię rezygnacji ustawioną w ustawieniach konta
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"
  }'

Odpowiedź: kampania z jej kosztem i pierwszymi 1000 wiadomości. Pobierz więcej z wiadomościami kampanii.

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

Oszacuj wysyłkę

POST/estimate

Przyjmuje to samo ciało co /sms i zwraca odbiorców, segmenty, kodowanie, całkowity koszt i koszt na kraj bez obciążania lub wysyłania czegokolwiek.

{ "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 wiadomości

GET/sms/{message_id}

Zwraca jedną wiadomość: numer, kraj, segmenty, cenę, status, błąd dla nieudanych wiadomości i czas każdego kroku.

Kampanie

GET/campaigns/{campaign_id}

Kampania z jej kosztem, zwrotami i liczbą wiadomości na status.

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

Wiadomości w kolejności, w jakiej zostały zakolejkowane, do 1000 na stronę.

POST/campaigns/{campaign_id}/cancel

Anuluje zaplanowaną kampanię, która się nie rozpoczęła, i zwraca jej pełny koszt na saldo.

Saldo i stawki

GET/balance

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

GET/rates

Publiczne, nie wymaga klucza. Każdy kraj z kodem wywoławczym i ceną za segment. /rates/GB zwraca jeden kraj.

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

Webhooki dostarczenia

Ustaw URL webhooka w konsoli w sekcji Klucze API. Gdy wiadomość osiągnie końcowy status (dostarczona lub nieudana), wysyłamy raport POST na ten adres. Odpowiedz dowolnym statusem 2xx w ciągu 8 sekund; w przeciwnym razie wywołanie jest ponawiane do 8 razy w ciągu około 11 godzin. Użyj id, aby zignorować raport, który już przetworzyłeś.

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

Sprawdź podpis przed zaufaniem raportowi: HMAC-SHA256 z t + "." + surowy body z twoim tajnym kluczem webhooka, porównywany w stałym czasie, i odrzuć czasy starsze niż 5 minut.

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

Statusy

StatusZnaczenie
queuedZaakceptowane i opłacone, oczekuje w kolejce
sentPrzekazane do trasy, oczekiwanie na raport dostarczenia
deliveredSieć potwierdziła dostarczenie do urządzenia
failedNie dostarczono; cena jest zwracana, a błąd zawiera przyczynę
canceledCzęść zaplanowanej kampanii anulowanej przed rozpoczęciem; zwrócono środki

Błędy

Błędy używają kodów statusu HTTP i ciała JSON: { "error": { "code": "insufficient_balance", "message": "..." } }. Żądanie zwracające błąd nigdy nie obciąża salda.

HTTPKod
400bad_requestBrakuje pola lub jest nieprawidłowe; wiadomość wyjaśnia, które
400no_valid_numbersŻaden z numerów w "to" nie mógł zostać użyty
401unauthorizedBrak klucza API lub jest nieprawidłowy
402insufficient_balanceSaldo nie pokrywa kosztu wysyłki; nic nie zostało obciążone
404not_foundKampania, wiadomość lub punkt końcowy nie istnieje w Twoim koncie
409not_scheduledTylko zaplanowaną kampanię, która się nie rozpoczęła, można anulować
413too_many_recipientsWięcej niż 10,000 numerów w jednym żądaniu
429rate_limitedWięcej niż 300 żądań w ciągu minuty dla tego klucza
500server_errorSpróbuj ponownie; za żądanie, które się nie powiedzie, nie ma opłaty

Ograniczenia

  • 300 żądań na minutę na klucz API.
  • 10,000 numerów na żądanie wysyłki; 10 segmentów na wiadomość.
  • Wiadomości wysyłane są z prędkością do 200 na minutę w kolejce, w kolejności ich przyjęcia.
  • Planowanie od 5 minut do 60 dni w przód.
  • Numery na liście nie do wysyłki są pomijane i zwracane w dropped z kodem suppressed; nie są obciążane.
Dokumentacja API do wysyłania masowych SMS: Wyślij SMS za pomocą REST API | SendBulkSMS