Розробникам

Документація API для масової розсилки SMS

REST API SendBulkSMS надсилає SMS до 10,000 номерів за запит, одразу повертає ID кампанії та повідомляє про кожне повідомлення через ваш вебхук. Використовує JSON через HTTPS, Bearer API-ключ та стягує ті ж тарифи за повідомлення, що й консоль.

https://sendbulksms.cc/api/v1

Швидкий старт

  1. Створіть обліковий запис і поповніть баланс у консолі.
  2. Відкрийте API ключі та створіть ключ. Ключі можна створити після зарахування першого поповнення. Ключ показується один раз; зберігайте його як секрет.
  3. Надішліть POST-запит на /sms з номерами та текстом. Прочитайте повернений ідентифікатор кампанії, потім відстежуйте доставку в консолі або через вебхуки.

Автентифікація

Кожен запит, крім публічного списку тарифів, містить ваш ключ у заголовку Authorization. Ключі починаються з sbk_live_. Новий ключ негайно замінює старий.

Authorization: Bearer sbk_live_YOUR_KEY

Надіслати SMS

POST/sms

Створює кампанію, списує кошти з балансу та ставить кожне повідомлення в чергу. Номери очищаються та дедуплікуються; ті, які не можна використати, повертаються в dropped з причиною та не списуються.

ПолеОпис
toобов’язковеОдин номер або масив до 10,000 номерів у міжнародному форматі, наприклад "+447700900461"
textобов’язковеТекст повідомлення, до 10 сегментів. Текст GSM-7 вміщує 160 символів на сегмент, UCS-2-70
schedule_atопціональнеЧас у форматі ISO 8601 від 5 хвилин до 60 днів вперед. Пропустіть, щоб надіслати зараз
client_refопціональнеВаше власне посилання, до 64 символів a-z A-Z 0-9 _ . : -, повертається у звітах та вебхуках
opt_outопціональнеtrue додає рядок відмови, встановлений у налаштуваннях облікового запису
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"
  }'

Відповідь: кампанія з її вартістю та першими 1000 повідомленнями. Отримайте більше за допомогою повідомлень кампанії.

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

Оцінити відправку

POST/estimate

Приймає той самий тіло, що й /sms, і повертає отримувачів, сегменти, кодування, загальну вартість та вартість за країну без списання або відправки.

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

Статус повідомлення

GET/sms/{message_id}

Повертає одне повідомлення: номер, країна, сегменти, ціна, статус, помилка для невдалих повідомлень та час кожного кроку.

Кампанії

GET/campaigns/{campaign_id}

Кампанія з її вартістю, поверненнями та кількістю повідомлень за статусом.

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

Повідомлення в порядку їх постановки в чергу, до 1000 на сторінці.

POST/campaigns/{campaign_id}/cancel

Скасовує заплановану кампанію, яка ще не розпочалася, та повертає її повну вартість на баланс.

Баланс та тарифи

GET/balance

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

GET/rates

Публічний, ключ не потрібен. Кожна країна з її телефонним кодом та ціною за сегмент. /rates/GB повертає одну країну.

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

Вебхуки доставки

Встановіть URL вебхука в консолі в розділі API ключі. Коли повідомлення досягає фінального статусу (доставлено або не вдалося), ми надсилаємо POST-звіт на цю URL. Відповідайте будь-яким статусом 2xx протягом 8 секунд; інакше виклик повторюється до 8 разів протягом приблизно 11 годин. Використовуйте id, щоб ігнорувати звіт, який ви вже обробили.

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

Перевірте підпис перед довірою до звіту: HMAC-SHA256 від t + "." + raw body з вашим секретним ключем вебхука, порівняний у постійний час, і відхиляйте час старше 5 хвилин.

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

Статуси

СтатусЗначення
queuedПрийнято та сплачено, очікує у черзі
sentПередано маршруту, очікує звіту про доставку
deliveredМережа підтвердила доставку на пристрій
failedНе доставлено; кошти повернуто, а в полі error вказано причину
canceledЧастину запланованої кампанії скасовано до початку; кошти повернуто

Помилки

Помилки використовують HTTP-статуси та JSON-тіло: { "error": { "code": "insufficient_balance", "message": "..." } }. Запит, який повертає помилку, не списує кошти з балансу.

HTTPКод
400bad_requestВідсутнє або недійсне поле; повідомлення вказує, яке саме
400no_valid_numbersЖоден з номерів у полі "to" не може бути використаний
401unauthorizedВідсутній або недійсний API-ключ
402insufficient_balanceНа балансі недостатньо коштів для відправки; нічого не списано
404not_foundКампанія, повідомлення або ендпоінт не існують у вашому акаунті
409not_scheduledСкасувати можна лише заплановану кампанію, яка ще не розпочалася
413too_many_recipientsБільше 10,000 номерів у одному запиті
429rate_limitedБільше 300 запитів за хвилину для цього ключа
500server_errorСпробуйте ще раз; за запит, який завершився помилкою, кошти не списуються

Обмеження

  • 300 запитів на хвилину для одного API-ключа.
  • 10,000 номерів на один запит відправки; 10 сегментів на повідомлення.
  • Повідомлення відправляються зі швидкістю до 200 на хвилину в черзі, у порядку їх надходження.
  • Планування від 5 хвилин до 60 днів наперед.
  • Номери з вашого списку виключень пропускаються та повертаються в полі dropped з кодом suppressed; за них кошти не списуються.
Документація API для масової розсилки SMS: Надсилання SMS через REST API | SendBulkSMS