Toplu SMS API referansı

BulkSMSOnline REST API, metin mesajlarını kendi yazılımınızdan 227 ülkeye, konsolla aynı fiyatlar, segment kuralları, zamanlama ve iadelerle gönderir. İstekler ve yanıtlar HTTPS üzerinden JSON'dur ve her nihai teslimat durumu imzalı bir webhook olarak sunucunuza gönderilebilir.

Temel URLhttps://bulksmsonline.cc/api/v1

Genel bakış

API'yi, mesajlar kendi sistemleriniz tarafından tetiklendiğinde kullanın: bir mağazadan sipariş güncellemeleri, bir giriş formundan kodlar, bir rezervasyon aracından hatırlatıcılar. En fazla 10,000 numara içeren bir POST /v1/messages isteği bir kampanya oluşturur, bakiyeden ücret keser ve her mesajı kuyruğa alır. API ile oluşturulan kampanyalar da konsolda teslimat raporlarıyla birlikte görünür.

  • Tüm tutarlar, beş ondalık basamaklı string olarak ABD doları cinsindendir, örneğin "0.00534".
  • Telefon numaraları uluslararası formattadır, başında + işareti olsun veya olmasın; boşluklar ve tireler kaldırılır.
  • Zamanlar UTC zaman diliminde ISO 8601 formatındadır, örneğin 2026-12-01T09:00:00Z.
  • Mesaj ve kampanya kimlikleri MSG-XXXX-XXXX-XXXX ve CMP-XXXX-XXXX-XXXX gibi görünür.

Kimlik Doğrulama

Konsolda API bölümü altında bir API anahtarı oluşturun (anahtarlar ilk bakiyenizi yükledikten sonra açılır). Her isteğin Authorization başlığında gönderin. Bir anahtar, bso_api_ ile başlayan ve ardından 36 karakterden oluşur; sadece bir kez gösterilir, bu nedenle sunucunuzda bir sır olarak saklayın. Yeni bir anahtar oluşturmak öncekini anında değiştirir.

Authorization: Bearer bso_api_0123456789abcdef0123456789abcdef0123
Content-Type: application/json

Sınırlar

İsteklerAnahtar başına dakikada 300; fazlası 429 rate_limited yanıtı verir
İstek başına numara sayısı10,000
Mesaj metniYazıldığı gibi 2,000 karakter, en fazla 10 segment
Zamanlamasend_at, 5 dakikadan 60 güne kadar ileri bir tarih
Gönderim hızıKuyruk başına dakikada 400 mesaj
Webhook yeniden denemeleriYaklaşık 22 saat boyunca 9 deneme

Mesaj gönder

POST/v1/messages

Bir veya daha fazla numaraya bir metin gönderir. İstek kabul edildiğinde tam maliyet bakiyeden alınır; teslim edilemeyen her mesaj daha sonra iade edilir. Yanıt 201 durum kodunu ve her mesajla birlikte kampanyayı içerir.

AlanAçıklama
togerekliUluslararası formatta bir numara veya en fazla 10,000 numaradan oluşan bir dizi. Tekrarlanan numaralar bir kez gönderilir; okunamayanlar atlananlar listesinde belirtilir.
textgerekliMesaj, en fazla 2,000 karakter ve 10 segment. GSM-7 metni SMS başına 160 karakter, Unicode 70 karakter tutar.
send_atisteğe bağlıGönderimi planlamak için ISO 8601 zamanı, 5 dakika ile 60 gün sonrası. Şimdi göndermek için boş bırakın.
opt_outisteğe bağlıtrue, konsol ayarlarından alınan abonelikten çıkma satırını sona yeni bir satır olarak ekler.
client_refisteğe bağlıKendi referansınız, en fazla 64 harf, rakam ve _ . : -. Raporlarda ve webhook'larda döndürülür.
curl -X POST https://bulksmsonline.cc/api/v1/messages \
  -H "Authorization: Bearer $BSO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"to":["+447700900412","+33612345678"],"text":"Order 4521 has shipped. Track it at shop.example/t/4521","client_ref":"order-4521"}'
HTTP/1.1 201 Created
{
  "id": "CMP-7KQ2-M9XA-4HTD",
  "status": "sending",
  "channel": "api",
  "recipients": 2,
  "segments": 1,
  "encoding": "GSM-7",
  "cost": "0.02158",
  "refunded": "0.00000",
  "client_ref": "order-4521",
  "send_at": null,
  "counts": { "queued": 2, "submitted": 0, "delivered": 0, "failed": 0, "canceled": 0 },
  "skipped": [],
  "balance": "118.43120",
  "messages": [
    { "id": "MSG-3RTW-81KD-ZQ0P", "to": "+447700900412", "country": "GB", "segments": 1, "price": "0.00834", "status": "queued" },
    { "id": "MSG-5HNA-4C2E-7YVB", "to": "+33612345678", "country": "FR", "segments": 1, "price": "0.01324", "status": "queued" }
  ]
}

Gönderim tahmini al

POST/v1/quote

/v1/messages ile aynı gövdeyi alır, herhangi bir gönderme veya ücretlendirme yapmadan tam maliyeti, segmentleri ve kodlamayı döndürür. Kullanıcılarınıza onaylamadan önce bir fiyat göstermek için kullanın.

{
  "recipients": 2,
  "skipped": [],
  "segments": 1,
  "encoding": "GSM-7",
  "cost": "0.02158",
  "balance": "118.45278",
  "countries": [ { "country": "GB", "recipients": 1, "cost": "0.00834" }, { "country": "FR", "recipients": 1, "cost": "0.01324" } ]
}

Bakiye

GET/v1/balance

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

Tarifeler

GET/v1/rates

GET/v1/rates/{country}

Her hedef için veya bir iki harfli ISO ülke kodu için bir SMS segmentinin fiyatı. Bu iki uç nokta herkese açıktır ve anahtar gerektirmez.

{ "country": "DE", "name": "Germany", "calling_code": "+49", "price": "0.01544", "currency": "USD", "per": "segment" }

Mesaj durumu

GET/v1/messages/{id}

{
  "id": "MSG-3RTW-81KD-ZQ0P",
  "campaign_id": "CMP-7KQ2-M9XA-4HTD",
  "to": "+447700900412",
  "country": "GB",
  "segments": 1,
  "price": "0.00834",
  "status": "delivered",
  "error": null,
  "created_at": "2026-11-07T09:00:02Z",
  "submitted_at": "2026-11-07T09:00:03Z",
  "final_at": "2026-11-07T09:00:08Z"
}

Kampanyalar

GET/v1/campaigns/{id}

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

İlki, kampanyayı durum bazlı sayımlarla döndürür; ikincisi mesajlarını sayfalar, sayfa başına en fazla 1.000. Konsoldan gönderilen kampanyalar, sayfalarında gösterilen kimlik ile aynı şekilde okunabilir.

Planlanmış gönderimi iptal et

POST/v1/campaigns/{id}/cancel

send_at ile oluşturulmuş ve henüz başlamamış bir kampanyayı durdurur. Her mesaj iptal edilir ve tam maliyet bakiyeye iade edilir. Zaten gönderimde olan bir kampanya 409 not_scheduled ile yanıt verir.

Teslimat webhook'ları

Konsolda API altına her nihai durumu (teslim edildi veya başarısız) bir POST isteği olarak almak için bir HTTPS URL'si ekleyin. 8 saniye içinde herhangi bir 2xx durumu ile yanıt verin. Diğer yanıtlar ve zaman aşımları 20 saniye, 1, 5 ve 15 dakika, ardından 1, 3, 6 ve 12 saat sonra yeniden denenir, toplam 9 deneme. Aynı olay iki kez gelebilir, bu yüzden onu bir kez işlemek için event_id kullanın.

POST https://your-server.example/sms-status
Content-Type: application/json
X-BulkSMSOnline-Signature: t=1794042008,v1=5f0c2a...e91b

{
  "type": "message.status",
  "event_id": "ev_8f1c22d0a4b97e63c1f0",
  "sent_at": "2026-11-07T09:00:09Z",
  "data": {
    "message_id": "MSG-3RTW-81KD-ZQ0P",
    "campaign_id": "CMP-7KQ2-M9XA-4HTD",
    "to": "+447700900412",
    "country": "GB",
    "status": "delivered",
    "error": null,
    "segments": 1,
    "price": "0.00834",
    "currency": "USD",
    "client_ref": "order-4521",
    "final_at": "2026-11-07T09:00:08Z"
  }
}

İmzayı doğrula

Başlık, Unix zamanı t ve webhook gizli anahtarınızla "t.raw_body" dizesinin HMAC-SHA256 imzası v1'i onaltılık olarak içerir. JSON'u ayrıştırmadan önce ham gövde üzerinde hesaplayın, sabit zamanda karşılaştırın ve beş dakikadan eski olayları reddedin.

import crypto from "node:crypto";

export function verify(rawBody, 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 = crypto.createHmac("sha256", secret).update(m[1] + "." + rawBody).digest("hex");
  return crypto.timingSafeEqual(Buffer.from(want), Buffer.from(m[2]));
}

Durumlar

queuedKabul edildi ve kuyruktan çıkmayı bekliyor
submittedHedef ağa teslim edildi
deliveredTelefon tarafından onaylandı (nihai)
failedTeslim edilemedi; ücret iade edildi (nihai)
canceledGönderimden önce iptal edilen planlanmış bir kampanyanın parçası (nihai)

Kampanya durumu scheduled, sending, complete veya canceled.

Hatalar

Hatalar bir HTTP durumu ve bir JSON gövdesi ile yanıt verir: { "error": { "code": "insufficient_balance", "message": "..." } }. Bir istek hata ile yanıt verdiğinde hiçbir şey ücretlendirilmez.

HTTPKodAnlam
400invalid_requestBir alan eksik veya geçersiz; mesaj hangisi olduğunu söyler.
400invalid_jsonGövde JSON formatında değil.
400no_valid_numbersHiçbir numara okunamadı.
401unauthorizedAnahtar eksik, bozuk veya değiştirilmiş.
402insufficient_balanceBakiye maliyeti karşılamıyor; bakiye yükleyip tekrar gönderin.
404not_foundBilinmeyen kimlik veya uç nokta.
409not_scheduledSadece henüz başlamamış bir planlanmış kampanya iptal edilebilir.
413too_many_recipientsBir istekte 10,000'den fazla numara.
429rate_limitedBir dakikada 300'den fazla istek.
500server_errorİsteği tekrar deneyin; hiçbir ücret alınmadı.

Konsoldan bir API anahtarı alın

Bir hesap oluşturun, ilk bakiyenizi yükleyin ve API altında bir anahtar oluşturun. İlk isteğiniz bir dakika sonra gönderilebilir.

Hesap oluştur
Toplu SMS API Referansı: REST Uç Noktaları ve Webhook'lar | BulkSMSOnline