Sviluppatori

Documentazione API SMS bulk

L'API REST di SendBulkSMS invia SMS a 10,000 numeri per richiesta, restituisce subito un ID campagna e segnala ogni messaggio al tuo webhook. Utilizza JSON su HTTPS, una chiave API Bearer e applica le stesse tariffe per messaggio della console.

https://sendbulksms.cc/api/v1

Guida rapida

  1. Crea un account e ricarica il tuo saldo nella console.
  2. Apri Chiavi API e crea una chiave. Le chiavi possono essere create dopo che il primo ricarico è stato accreditato. La chiave viene mostrata una sola volta; conservala come segreto.
  3. Invia una richiesta POST a /sms con i numeri e il testo. Leggi l'ID della campagna restituito, poi segui la consegna nella console o tramite webhook.

Autenticazione

Ogni richiesta, tranne l'elenco pubblico delle tariffe, include la tua chiave nell'intestazione Authorization. Le chiavi iniziano con sbk_live_. Una nuova chiave sostituisce immediatamente la vecchia.

Authorization: Bearer sbk_live_YOUR_KEY

Invia SMS

POST/sms

Crea una campagna, la addebita dal saldo e accoda ogni messaggio. I numeri vengono puliti e deduplicati; quelli non utilizzabili sono restituiti in dropped con un motivo e non vengono addebitati.

CampoDescrizione
toobbligatorioUn numero o un array fino a 10,000 numeri in formato internazionale, ad esempio "+447700900461"
textobbligatorioTesto del messaggio, fino a 10 segmenti. Il testo GSM-7 occupa 160 caratteri per segmento, UCS-2 ne occupa 70
schedule_atopzionaleOra ISO 8601 da 5 minuti a 60 giorni nel futuro. Ometti per inviare ora
client_refopzionaleIl tuo riferimento personale, fino a 64 caratteri a-z A-Z 0-9 _ . : -, restituito nei report e nei webhook
opt_outopzionaletrue aggiunge la riga di opt-out impostata nelle impostazioni del tuo account
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"
  }'

Risposta: la campagna con il suo costo e i primi 1.000 messaggi. Recupera altri con i messaggi della campagna.

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

Stima un invio

POST/estimate

Prende lo stesso corpo di /sms e restituisce i destinatari, i segmenti, la codifica, il costo totale e il costo per paese senza addebitare o inviare nulla.

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

Stato messaggio

GET/sms/{message_id}

Restituisce un messaggio: numero, paese, segmenti, prezzo, stato, l'errore per i messaggi falliti e l'ora di ogni passaggio.

Campagne

GET/campaigns/{campaign_id}

La campagna con il suo costo, i rimborsi e un conteggio dei messaggi per stato.

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

Messaggi nell'ordine in cui sono stati accodati, fino a 1.000 per pagina.

POST/campaigns/{campaign_id}/cancel

Annulla una campagna programmata che non è ancora iniziata e rimborsa l'intero costo al saldo.

Saldo e tariffe

GET/balance

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

GET/rates

Pubblico, non serve la chiave. Ogni paese con il suo prefisso e prezzo per segmento. /rates/GB restituisce un paese.

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

Webhook di consegna

Imposta un URL webhook nella console sotto Chiavi API. Quando un messaggio raggiunge uno stato finale (consegnato o fallito) inviamo un report POST. Rispondi con qualsiasi stato 2xx entro 8 secondi; altrimenti la chiamata viene ritentata fino a 8 volte in circa 11 ore. Usa id per ignorare un report già elaborato.

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

Controlla la firma prima di fidarti di un report: HMAC-SHA256 di t + "." + raw body con il tuo segreto webhook, confrontato in tempo costante, e rifiuta tempi più vecchi di 5 minuti.

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

Stati

StatoSignificato
queuedAccettato e addebitato, in attesa del proprio turno nella coda
sentConsegnato alla rotta, in attesa del report di consegna
deliveredLa rete ha confermato la consegna al dispositivo
failedNon consegnato; l'importo viene rimborsato e l'errore indica il motivo
canceledParte di una campagna programmata annullata prima dell'invio; rimborsato

Errori

Gli errori utilizzano codici di stato HTTP e un corpo JSON: { "error": { "code": "insufficient_balance", "message": "..." } }. Una richiesta che restituisce un errore non addebita mai il saldo.

HTTPCodice
400bad_requestUn campo è mancante o non valido; il messaggio indica quale
400no_valid_numbersNessuno dei numeri in "to" può essere utilizzato
401unauthorizedLa chiave API è mancante o non valida
402insufficient_balanceIl saldo non copre l'invio; nessun addebito è stato effettuato
404not_foundLa campagna, il messaggio o l'endpoint non esistono nel tuo account
409not_scheduledSolo una campagna programmata che non è ancora iniziata può essere annullata
413too_many_recipientsPiù di 10,000 numeri in una richiesta
429rate_limitedPiù di 300 richieste al minuto per questa chiave
500server_errorRiprova; nessun addebito viene effettuato per una richiesta fallita

Limiti

  • 300 richieste al minuto per chiave API.
  • 10,000 numeri per richiesta di invio; 10 segmenti per messaggio.
  • I messaggi vengono inviati a un massimo di 200 al minuto per coda, nell'ordine in cui sono stati accettati.
  • Pianificazione da 5 minuti a 60 giorni prima.
  • I numeri nella tua lista di non invio vengono saltati e restituiti in dropped con codice suppressed; non vengono addebitati.
Documentazione API SMS Bulk: Invia SMS con un'API REST | SendBulkSMS