Entwickler

Bulk-SMS API-Dokumentation

Die SendBulkSMS REST-API sendet SMS an 10,000 Nummern pro Anfrage, gibt sofort eine Kampagnen-ID zurück und meldet jede Nachricht an Ihren Webhook. Sie verwendet JSON über HTTPS, einen Bearer API-Schlüssel und berechnet die gleichen pro Nachricht Preise wie die Konsole.

https://sendbulksms.cc/api/v1

Schnellstart

  1. Erstellen Sie ein Konto und laden Sie Ihr Guthaben in der Konsole auf.
  2. Öffnen Sie API-Schlüssel und erstellen Sie einen Schlüssel. Schlüssel können nach der ersten Guthabenaufladung erstellt werden. Der Schlüssel wird einmal angezeigt; bewahren Sie ihn als Geheimnis auf.
  3. Senden Sie eine POST-Anfrage an /sms mit den Nummern und dem Text. Lesen Sie die zurückgegebene Kampagnen-ID und verfolgen Sie dann die Zustellung in der Konsole oder über Webhooks.

Authentifizierung

Jede Anfrage außer der öffentlichen Preisliste trägt Ihren Schlüssel im Authorization-Header. Schlüssel beginnen mit sbk_live_. Ein neuer Schlüssel ersetzt den alten sofort.

Authorization: Bearer sbk_live_YOUR_KEY

SMS senden

POST/sms

Erstellt eine Kampagne, belastet sie vom Guthaben und reiht jede Nachricht in die Warteschlange ein. Nummern werden bereinigt und dedupliziert; solche, die nicht verwendet werden können, werden in dropped mit einem Grund zurückgegeben und nicht belastet.

FeldBeschreibung
toerforderlichEine Nummer oder ein Array von bis zu 10,000 Nummern im internationalen Format, zum Beispiel "+447700900461"
texterforderlichNachrichtentext, bis zu 10 Segmenten. GSM-7-Text passt in 160 Zeichen pro Segment, UCS-2 in 70
schedule_atoptionalISO 8601-Zeit von 5 Minuten bis zu 60 Tagen im Voraus. Lassen Sie dies weg, um sofort zu senden
client_refoptionalIhr eigener Verweis, bis zu 64 Zeichen aus a-z A-Z 0-9 _ . : -, wird in Berichten und Webhooks zurückgegeben
opt_outoptionaltrue fügt den Abmeldehinweis hinzu, der in Ihren Kontoeinstellungen festgelegt ist
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"
  }'

Antwort: die Kampagne mit ihren Kosten und den ersten 1.000 Nachrichten. Holen Sie mehr mit Kampagnennachrichten.

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

Sendung schätzen

POST/estimate

Nimmt den gleichen Body wie /sms und gibt die Empfänger, Segmente, Kodierung, Gesamtkosten und die Kosten pro Land zurück, ohne etwas zu belasten oder zu senden.

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

Nachrichtenstatus

GET/sms/{message_id}

Gibt eine Nachricht zurück: Nummer, Land, Segmente, Preis, Status, den Fehler für fehlgeschlagene Nachrichten und die Zeit jedes Schritts.

Kampagnen

GET/campaigns/{campaign_id}

Die Kampagne mit ihren Kosten, Rückerstattungen und einer Anzahl von Nachrichten pro Status.

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

Nachrichten in der Reihenfolge, in der sie in die Warteschlange gestellt wurden, bis zu 1.000 pro Seite.

POST/campaigns/{campaign_id}/cancel

Bricht eine geplante Kampagne ab, die noch nicht gestartet ist, und erstattet die vollen Kosten an das Guthaben zurück.

Guthaben und Preise

GET/balance

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

GET/rates

Öffentlich, kein Schlüssel benötigt. Jedes Land mit seiner Vorwahl und dem Preis pro Segment. /rates/GB gibt ein Land zurück.

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

Zustellungswebhooks

Legen Sie eine Webhook-URL in der Konsole unter API-Schlüssel fest. Wenn eine Nachricht einen endgültigen Status erreicht (zugestellt oder fehlgeschlagen), senden wir einen Bericht per POST dorthin. Antworten Sie mit einem beliebigen 2xx-Status innerhalb von 8 Sekunden; andernfalls wird der Aufruf bis zu 8 Mal über etwa 11 Stunden wiederholt. Verwenden Sie id, um einen Bericht zu ignorieren, den Sie bereits verarbeitet haben.

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

Überprüfen Sie die Signatur, bevor Sie einem Bericht vertrauen: HMAC-SHA256 von t + "." + raw body mit Ihrem Webhook-Geheimnis, verglichen in konstanter Zeit, und lehnen Sie Zeiten ab, die älter als 5 Minuten sind.

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

StatusBedeutung
queuedAkzeptiert und belastet, wartet auf seinen Platz in der Warteschlange
sentAn die Route übergeben, wartet auf den Zustellbericht
deliveredDas Netzwerk hat die Zustellung an das Handy bestätigt
failedNicht zugestellt; der Preis wird erstattet und der Fehler enthält den Grund
canceledTeil einer geplanten Kampagne, die vor dem Start abgebrochen wurde; erstattet

Fehler

Fehler verwenden HTTP-Statuscodes und einen JSON-Body: { "error": { "code": "insufficient_balance", "message": "..." } }. Eine Anfrage, die einen Fehler zurückgibt, belastet das Guthaben nicht.

HTTPCode
400bad_requestEin Feld fehlt oder ist ungültig; die Nachricht erklärt welches
400no_valid_numbersKeine der Nummern in "to" konnte verwendet werden
401unauthorizedDer API-Schlüssel fehlt oder ist ungültig
402insufficient_balanceDas Guthaben deckt den Versand nicht ab; es wurde nichts belastet
404not_foundDie Kampagne, Nachricht oder der Endpunkt existiert nicht in Ihrem Konto
409not_scheduledNur eine geplante Kampagne, die noch nicht gestartet wurde, kann abgebrochen werden
413too_many_recipientsMehr als 10,000 Nummern in einer Anfrage
429rate_limitedMehr als 300 Anfragen pro Minute für diesen Schlüssel
500server_errorVersuchen Sie es erneut; für eine fehlgeschlagene Anfrage wird keine Gebühr erhoben

Limits

  • 300 Anfragen pro Minute pro API-Schlüssel.
  • 10,000 Nummern pro Versandanfrage; 10 Segmente pro Nachricht.
  • Nachrichten werden mit bis zu 200 pro Minute pro Warteschlange in der Reihenfolge ihres Eingangs versendet.
  • Planung von 5 Minuten bis zu 60 Tagen im Voraus.
  • Nummern auf Ihrer Nicht-Senden-Liste werden übersprungen und in dropped mit dem Code suppressed zurückgegeben; sie werden nicht belastet.
Bulk SMS API Dokumentation: SMS versenden mit einer REST API | SendBulkSMS