Przejdź do treści
smsbulk

API masowych SMS v1

Niewielkie REST API do wysyłania masowych SMS-ów z Twojego oprogramowania: JSON na wejściu i wyjściu, klucze Bearer, te same ceny i kontrole co w konsoli oraz podpisane webhooki dla raportów dostarczenia. Podstawowy URL https://smsbulk.cc/rest/v1

Przegląd

Wyślij do maksymalnie 8,000 numerów na żądanie, każdy z własnymi wartościami do scalenia, a API wycenia każdego odbiorcę z własnym scalonym tekstem, dokładnie jak konsola. Najpierw poproś o wycenę z tym samym treścią, aby poznać koszt; nic nie jest wysyłane ani naliczane przez wycenę. Czasy są w formacie ISO 8601 w UTC, pieniądze są ciągiem znaków w dolarach amerykańskich z pięcioma miejscami po przecinku.

curl https://smsbulk.cc/rest/v1/send \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "recipients": [
      { "to": "+14155550142", "fields": { "name": "Maria" } },
      { "to": "+447400123456", "fields": { "name": "Tom" } }
    ],
    "text": "Hi {{name}}, your order ships today.",
    "client_ref": "order-batch-17"
  }'

Uwierzytelnianie

Utwórz klucz w konsoli w sekcji API i webhooki; klucze stają się dostępne po pierwszym doładowaniu środków. Wysyłaj go w każdym żądaniu jako token Bearer. Klucz jest pokazywany tylko raz; możesz przechowywać do 5 kluczy i odwołać dowolny z nich w dowolnym momencie.

Authorization: Bearer smsb_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Ceny

Publiczne, nie wymaga klucza. Cena za segment SMS dla każdego celu lub dla jednego kodu ISO.

GEThttps://smsbulk.cc/rest/v1/rates

GEThttps://smsbulk.cc/rest/v1/rates/{ISO}

{
  "country": "US",
  "name": "United States",
  "dial_code": "+1",
  "rate": "0.00485",
  "currency": "USD",
  "per": "message segment"
}

Środki

GEThttps://smsbulk.cc/rest/v1/credit

{ "credit": "125.40000", "currency": "USD", "account": "A418820037715" }

Wycenia

Wycenia wysyłkę bez jej wysyłania. Przyjmuje tę samą treść co Send.

POSThttps://smsbulk.cc/rest/v1/quote

PoleZnaczenie
toJeden numer lub lista. Międzynarodowy format z + jest najbezpieczniejszy; numery lokalne wymagają default_country.
recipientsZamiast to: lista { to, fields }, gdzie fields wypełniają pola scalające, takie jak {{name}}.
textWiadomość, do 2,000 znaków i 10 segmentów po scaleniu.
default_countryKod ISO używany dla numerów zapisanych bez +, takich jak GB. Powraca do domyślnego zapisanego w Ustawieniach.
opt_outDodaje zapisane przez Ciebie sformułowanie rezygnacji jako ostatnią linię (najpierw zapisz je w Ustawieniach).
{
  "recipients": 2,
  "messages": 2,
  "segments": { "min": 1, "max": 1 },
  "encoding": "GSM-7",
  "total": "0.01240",
  "currency": "USD",
  "credit": "125.40000",
  "credit_after": "125.38760",
  "countries": [
    { "country": "US", "recipients": 1, "rate": "0.00485", "segments": 1, "subtotal": "0.00485" },
    { "country": "GB", "recipients": 1, "rate": "0.00755", "segments": 1, "subtotal": "0.00755" }
  ],
  "left_out": []
}

Wyślij

Tworzy kampanię, pobiera jej całkowity koszt z Twoich środków i kolejkowuje wiadomości. Odpowiada kodem 201 z kampanią. Numery, których nie można wysłać, są wymienione w left_out i nigdy nie są naliczane.

POSThttps://smsbulk.cc/rest/v1/send

PoleZnaczenie
to / recipients / text / default_country / opt_outJak w Quote.
send_atCzas rozpoczęcia w formacie ISO 8601, 5 minut do 90 dni naprzód. Pomijaj, aby wysłać teraz.
nameTwoja etykieta dla kampanii, do 80 znaków.
client_refTwoje własne odniesienie, do 64 znaków, zwracane w każdej wiadomości i webhooku.
HTTP/1.1 201 Created
{
  "campaign": {
    "id": "C507318264409",
    "name": null,
    "status": "sending",
    "source": "api",
    "test": false,
    "recipients": 2,
    "cost": "0.01240",
    "refunded": "0.00000",
    "net_cost": "0.01240",
    "currency": "USD",
    "send_at": null,
    "created_at": "2026-11-07T14:02:11.000Z",
    "started_at": "2026-11-07T14:02:11.000Z",
    "finished_at": null,
    "client_ref": "order-batch-17"
  },
  "messages": 2,
  "left_out": []
}

Kampanie

GEThttps://smsbulk.cc/rest/v1/campaigns?limit=25&before={id}

GEThttps://smsbulk.cc/rest/v1/campaigns/{id}

GEThttps://smsbulk.cc/rest/v1/campaigns/{id}/messages?status=failed&limit=100&after={message id}

Pojedyncza kampania zawiera liczniki według statusów: w kolejce, wysłane, dostarczone, nieudane i anulowane. Listy wiadomości stronicowane z after i has_more; do 1,000 na stronę.

Wiadomości

GEThttps://smsbulk.cc/rest/v1/messages/{id}

GEThttps://smsbulk.cc/rest/v1/messages?to=%2B14155550142&status=delivered&client_ref=order-batch-17&limit=50

{
  "id": "M220947781305",
  "campaign": "C507318264409",
  "to": "+14155550142",
  "country": "US",
  "segments": 1,
  "encoding": "GSM-7",
  "price": "0.00485",
  "status": "delivered",
  "reason": null,
  "reason_text": null,
  "refunded": false,
  "client_ref": "order-batch-17",
  "created_at": "2026-11-07T14:02:11.000Z",
  "sent_at": "2026-11-07T14:02:12.000Z",
  "finished_at": "2026-11-07T14:02:16.000Z"
}

Anuluj zaplanowaną kampanię

POSThttps://smsbulk.cc/rest/v1/campaigns/{id}/cancel

Działa do czasu rozpoczęcia. Cały koszt wraca do Twoich środków w jednej linii księgowej, a status kampanii zmienia się na anulowany.

Webhooki

Ustaw URL endpointu w konsoli. Wysyłamy POST JSON dla message.delivered, message.failed i campaign.done, plus test po naciśnięciu Wyślij testowe zdarzenie. Każde zdarzenie zawiera cztery nagłówki, a każda odpowiedź 2xx w ciągu 10 sekund jest uznawana za otrzymaną.

PoleZnaczenie
Smsbulk-EventNazwa zdarzenia, np. message.delivered.
Smsbulk-DeliveryIdentyfikator dostawy, ten sam przy każdym ponownym próbie jednego zdarzenia.
Smsbulk-TimestampSekundy Unix, kiedy ta próba została podpisana.
Smsbulk-Signaturesha256= następnie base64 HMAC-SHA256 znacznika czasu, nowej linii i surowego ciała, kluczowane z twoim sekretem sbw_.

Dostarczenie jest próbowane 8 razy: natychmiast, a następnie po 1 minucie, 5 minutach, 15 minutach, 1 godzinie, 3 godzinach, 6 godzinach i 12 godzinach. Każda próba jest pokazywana w dzienniku dostarczenia konsoli z jej statusem HTTP i początkiem Twojej odpowiedzi.

{
  "id": "dlv_3f9a1c07b2e44d58a6c1",
  "event": "message.failed",
  "created": "2026-11-07T14:02:16.000Z",
  "data": {
    "message": "M220947781305",
    "campaign": "C507318264409",
    "to": "+447400123456",
    "country": "GB",
    "status": "failed",
    "reason": "not_in_service",
    "segments": 1,
    "price": "0.00755",
    "client_ref": "order-batch-17"
  }
}

Zweryfikuj podpis

import crypto from "node:crypto";

// raw = the request body exactly as received (string), secret = your sbw_ signing secret
export function verify(raw, headers, secret) {
  const ts = headers["smsbulk-timestamp"];
  const want = "sha256=" + crypto.createHmac("sha256", secret).update(ts + "\n" + raw).digest("base64");
  const got = headers["smsbulk-signature"] || "";
  const fresh = Math.abs(Date.now() / 1000 - Number(ts)) < 300;
  return fresh && got.length === want.length && crypto.timingSafeEqual(Buffer.from(got), Buffer.from(want));
}

Błędy i limity

Błędy wykorzystują status HTTP i treść JSON: {"error":{"code":"insufficient_credit","message":"..."}}. Nic nie jest naliczane, gdy żądanie nie powiedzie się.

PoleZnaczenie
400 bad_jsonCiało nie jest JSON.
401 unauthorizedBrakujący, źle sformułowany lub unieważniony klucz.
402 insufficient_creditŁączna kwota przekracza Twoje środki. Doładuj konto w konsoli.
404 not_foundNie znaleziono takiego endpointu, kampanii, wiadomości lub kodu ISO na tym koncie.
409 not_scheduledAnulowanie zostało zażądane dla kampanii, która już się rozpoczęła.
422 text_missing, text_too_long, too_many_segmentsWiadomość jest pusta, przekracza 2,000 znaków lub 10 segmentów dla jednego odbiorcy.
422 no_recipients, too_many, recipients_missingBrak numeru do wysłania, więcej niż 8,000 numerów lub brak zarówno 'to', jak i 'recipients'.
422 schedule_range, bad_send_atsend_at poza zakresem 5 minut do 90 dni lub nie jest prawidłowym czasem.
422 opt_out_unsetopt_out jest ustawione na true, ale nie zapisano tekstu w Ustawieniach.
429 rate_limitedWięcej niż 300 żądań w ciągu minuty dla tego klucza.

Każda odpowiedź zawiera X-RateLimit-Limit, X-RateLimit-Remaining i X-RateLimit-Reset.

Pominięte kody

Numery usunięte przed wyceną wracają w left_out z ich pozycją na liście, wartością, którą wysłałeś, kodem i prostym powodem.

PoleZnaczenie
no_country_codeBrak + i brak domyślnego kraju.
too_short / too_longMniej niż 8 lub więcej niż 15 cyfr.
not_a_numberLitery lub symbole, które nie są częścią numeru.
nanp_lengthNumer +1 bez jedenastu cyfr.
not_coveredMiejsce docelowe poza naszą listą.
duplicateTen sam numer pojawił się wcześniej w żądaniu.
suppressedNumer znajduje się na Twojej liście nie do wysyłania.

Statusy i powody

PoleZnaczenie
queuedOczekiwanie na opuszczenie naszej kolejki.
sentPrzekazane do sieci, oczekiwanie na raport dostarczenia. Większość raportów przychodzi w ciągu kilku minut; niektóre sieci zajmują do 24 godzin.
deliveredSieć potwierdziła, że telefon otrzymał wiadomość.
failedNie dostarczono. Cena została zwrócona na Twoje konto.
canceledNie wysłano, ponieważ anulowano. Zwrócono środki.
PoleZnaczenie
network_errorBłąd sieci
switched_offTelefon wyłączony lub poza zasięgiem
not_in_serviceNumer nieaktywny
blockedZablokowane przez sieć lub odbiorcę
landlineNumer stacjonarny lub numer, który nie może odbierać SMS-ów
content_filterOdrzucone przez filtr treści sieci
expiredPrzedawnione: brak raportu przed limitem czasu sieci
unknownNieznana odpowiedź sieci
canceledAnulowane przed wysłaniem

Pytania dotyczące API? Otwórz zgłoszenie w konsoli lub przeczytaj FAQ.

Dokumentacja API Bulk SMS v1: Wyślij, Wycena, Webhooki | SMSBulk