Kademeli Mesaj Gönder
Tek bir API isteğiyle birden fazla kanala mesaj gönderin. Cascade, mesajınızı otomatik olarak Telegram Bot, Viber Bot, Viber Business Mesajları, RCS ve SMS aracılığıyla yönlendirir.
Uç noktalar
Standart Kademeli
Mesajları mevcut tüm kanallar üzerinden sırayla yönlendirir.
Telegram-Viber Önceliği
Daha hızlı teslimat için Telegram ve Viber kanallarına öncelik verir.
Kimlik Doğrulama
Cascade API üç kimlik doğrulama başlığını destekler. En az birini ekleyin:
| Başlık | Açıklama |
|---|---|
X-Yetkilendirme-Anahtarı |
SMSBAT API anahtarı (önerilen) |
| 'X-Viber-Auth-Token' | Viber bot kimlik bilgileri |
| 'X-Tg-Bot-Anahtarı' | Telegram bot anahtarı |
İstek Yapısı
Başlıklar
Content-Type: application/json
X-Authorization-Key: your-smsbat-api-key
X-Viber-Auth-Token: your-viber-token
X-Tg-Bot-Key: your-telegram-key
İstek Gövdesi
Bir dizi mesaj nesnesi gönderin:
[
{
"id": "unique-tracking-id",
"fromName": "YourBrand",
"toPhone": "+380XXXXXXXXX",
"messageType": "transaction",
"text": "Your order #12345 has been confirmed",
"ttl": 3600,
"scheduledSent": "2025-01-25T10:00:00Z"
}
]
Parametreler
| Parametre | Tür | Gerekli | Açıklama |
|---|---|---|---|
| 'kimlik' | dize | Evet | İzleme tanımlayıcınız |
adından |
dize | Evet | Gönderenin görünen adı |
| 'Telefona' | dize | Evet | Alıcının telefon numarası (E.164 biçimi) |
| 'mesaj Türü' | dize | Evet | Mesaj türü: işlem, promo, viber_survey, flashcall |
| 'metin' | dize | Evet* | Mesaj içeriği (* çoğu tür için gereklidir) |
| 'ttl' | tamsayı | Hayır | Saniye cinsinden yaşam süresi |
| 'planlanmışGönderildi' | dize | Hayır | Planlı teslimat için ISO 8601 tarihsaat |
Mesaj Türleri
İşlem Mesajları
Sipariş onayları ve hesap güncellemeleri gibi kritik bildirimler:
{
"id": "order-12345",
"fromName": "YourStore",
"toPhone": "+380XXXXXXXXX",
"messageType": "transaction",
"text": "Your order #12345 has been confirmed and will arrive tomorrow.",
"ttl": 86400
}
Promosyon Mesajları
Zengin medya içeren pazarlama kampanyaları:
{
"id": "promo-summer-sale",
"fromName": "YourBrand",
"toPhone": "+380XXXXXXXXX",
"messageType": "promo",
"text": "Summer Sale! Up to 50% off. Shop now: https://example.com/sale",
"ttl": 259200
}
Viber Anketi
2-5 yanıt seçeneğine sahip etkileşimli anketler:
{
"id": "survey-satisfaction",
"fromName": "YourBrand",
"toPhone": "+380XXXXXXXXX",
"messageType": "viber_survey",
"text": "How satisfied are you with our service?",
"surveyOptions": [
"Very Satisfied",
"Satisfied",
"Neutral",
"Dissatisfied",
"Very Dissatisfied"
],
"ttl": 604800
}
Anket metni maksimum: 85 karakter
Hızlı Arama
Otomatik arama yoluyla telefon doğrulaması:
{
"id": "verify-user-123",
"fromName": "YourApp",
"toPhone": "+380XXXXXXXXX",
"messageType": "flashcall",
"ttl": 300
}
Örnekler
Temel İşlem
curl -X POST https://restapi.smsbat.com/api/CascadeMessage/send_message/async \
-H "Content-Type: application/json" \
-H "X-Authorization-Key: your-api-key" \
-d '[
{
"id": "tx-001",
"fromName": "YourBank",
"toPhone": "+380XXXXXXXXX",
"messageType": "transaction",
"text": "Payment of $100 was successful. Transaction ID: ABC123"
}
]'
Planlanmış Promosyon
curl -X POST https://restapi.smsbat.com/api/CascadeMessage/send_message/async \
-H "Content-Type: application/json" \
-H "X-Authorization-Key: your-api-key" \
-d '[
{
"id": "promo-001",
"fromName": "YourStore",
"toPhone": "+380XXXXXXXXX",
"messageType": "promo",
"text": "Flash Sale starts in 1 hour! Visit: https://example.com",
"scheduledSent": "2025-01-25T09:00:00Z",
"ttl": 3600
}
]'
Toplu Mesajlar
curl -X POST https://restapi.smsbat.com/api/CascadeMessage/send_message/async \
-H "Content-Type: application/json" \
-H "X-Authorization-Key: your-api-key" \
-d '[
{
"id": "bulk-001",
"fromName": "YourBrand",
"toPhone": "+380111111111",
"messageType": "transaction",
"text": "Message 1"
},
{
"id": "bulk-002",
"fromName": "YourBrand",
"toPhone": "+380222222222",
"messageType": "transaction",
"text": "Message 2"
},
{
"id": "bulk-003",
"fromName": "YourBrand",
"toPhone": "+380333333333",
"messageType": "transaction",
"text": "Message 3"
}
]'
Yanıt
Başarılı Yanıt
[
{
"messageId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"trackinId": "tx-001"
},
{
"messageId": "8b2f1e9a-4c6d-4e2a-9f8b-1a3d5c7e9f0b",
"trackinId": "tx-002"
}
]
Yanıt Alanları
| Alan | Tür | Açıklama |
|---|---|---|
| 'mesaj Kimliği' | dize (UUID) | Sistem mesajı tanımlayıcı |
| 'takip kimliği' | dize | İzleme tanımlayıcınız (talepten) |
Durum takibi için "messageId"i ve sisteminizle bağlantı kurmak için "trackinId"i kullanın.
Uygulama Örnekleri
Python
import requests
from datetime import datetime, timedelta
class CascadeMessenger:
def __init__(self, api_key):
self.base_url = 'https://restapi.smsbat.com'
self.headers = {
'Content-Type': 'application/json',
'X-Authorization-Key': api_key
}
def send_message(self, tracking_id, from_name, to_phone,
message_type, text, ttl=None, scheduled=None):
"""Send single cascade message"""
message = {
'id': tracking_id,
'fromName': from_name,
'toPhone': to_phone,
'messageType': message_type,
'text': text
}
if ttl:
message['ttl'] = ttl
if scheduled:
message['scheduledSent'] = scheduled.isoformat()
response = requests.post(
f'{self.base_url}/api/CascadeMessage/send_message/async',
headers=self.headers,
json=[message]
)
response.raise_for_status()
return response.json()[0]
def send_bulk(self, messages):
"""Send multiple messages"""
response = requests.post(
f'{self.base_url}/api/CascadeMessage/send_message/async',
headers=self.headers,
json=messages
)
response.raise_for_status()
return response.json()
# Usage
messenger = CascadeMessenger('your-api-key')
# Send single message
result = messenger.send_message(
tracking_id='order-12345',
from_name='YourStore',
to_phone='+380XXXXXXXXX',
message_type='transaction',
text='Your order has been confirmed',
ttl=86400
)
print(f"Message ID: {result['messageId']}")
# Send scheduled message
scheduled_time = datetime.now() + timedelta(hours=2)
result = messenger.send_message(
tracking_id='promo-001',
from_name='YourBrand',
to_phone='+380XXXXXXXXX',
message_type='promo',
text='Sale starts now!',
scheduled=scheduled_time
)
# Bulk send
messages = [
{
'id': f'bulk-{i}',
'fromName': 'YourBrand',
'toPhone': f'+38011111111{i}',
'messageType': 'transaction',
'text': f'Message {i}'
}
for i in range(100)
]
results = messenger.send_bulk(messages)
print(f"Sent {len(results)} messages")
JavaScript (Node.js)
const axios = require('axios');
class CascadeMessenger {
constructor(apiKey) {
this.baseUrl = 'https://restapi.smsbat.com';
this.headers = {
'Content-Type': 'application/json',
'X-Authorization-Key': apiKey
};
}
async sendMessage({ id, fromName, toPhone, messageType, text, ttl, scheduledSent }) {
const message = {
id,
fromName,
toPhone,
messageType,
text
};
if (ttl) message.ttl = ttl;
if (scheduledSent) message.scheduledSent = scheduledSent;
const response = await axios.post(
`${this.baseUrl}/api/CascadeMessage/send_message/async`,
[message],
{ headers: this.headers }
);
return response.data[0];
}
async sendBulk(messages) {
const response = await axios.post(
`${this.baseUrl}/api/CascadeMessage/send_message/async`,
messages,
{ headers: this.headers }
);
return response.data;
}
async sendTelegramViber({ id, fromName, toPhone, messageType, text }) {
const response = await axios.post(
`${this.baseUrl}/api/CascadeMessage/send_message/tg-viber/async`,
[{
id,
fromName,
toPhone,
messageType,
text
}],
{ headers: this.headers }
);
return response.data[0];
}
}
// Usage
const messenger = new CascadeMessenger('your-api-key');
// Send single message
const result = await messenger.sendMessage({
id: 'order-12345',
fromName: 'YourStore',
toPhone: '+380XXXXXXXXX',
messageType: 'transaction',
text: 'Your order has been confirmed',
ttl: 86400
});
console.log('Message ID:', result.messageId);
// Send scheduled message
const scheduledTime = new Date(Date.now() + 2 * 60 * 60 * 1000);
await messenger.sendMessage({
id: 'promo-001',
fromName: 'YourBrand',
toPhone: '+380XXXXXXXXX',
messageType: 'promo',
text: 'Sale starts now!',
scheduledSent: scheduledTime.toISOString()
});
// Bulk send
const messages = Array.from({ length: 100 }, (_, i) => ({
id: `bulk-${i}`,
fromName: 'YourBrand',
toPhone: `+38011111111${i}`,
messageType: 'transaction',
text: `Message ${i}`
}));
const results = await messenger.sendBulk(messages);
console.log(`Sent ${results.length} messages`);
PHP
<?php
class CascadeMessenger {
private $baseUrl = 'https://restapi.smsbat.com';
private $apiKey;
public function __construct($apiKey) {
$this->apiKey = $apiKey;
}
public function sendMessage($id, $fromName, $toPhone, $messageType,
$text, $ttl = null, $scheduledSent = null) {
$message = [
'id' => $id,
'fromName' => $fromName,
'toPhone' => $toPhone,
'messageType' => $messageType,
'text' => $text
];
if ($ttl !== null) {
$message['ttl'] = $ttl;
}
if ($scheduledSent !== null) {
$message['scheduledSent'] = $scheduledSent;
}
$ch = curl_init($this->baseUrl . '/api/CascadeMessage/send_message/async');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'X-Authorization-Key: ' . $this->apiKey
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([$message]));
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
return $result[0];
}
public function sendBulk($messages) {
$ch = curl_init($this->baseUrl . '/api/CascadeMessage/send_message/async');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'X-Authorization-Key: ' . $this->apiKey
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($messages));
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
}
// Usage
$messenger = new CascadeMessenger('your-api-key');
// Send single message
$result = $messenger->sendMessage(
'order-12345',
'YourStore',
'+380XXXXXXXXX',
'transaction',
'Your order has been confirmed',
86400
);
echo "Message ID: " . $result['messageId'] . "\n";
// Bulk send
$messages = [];
for ($i = 0; $i < 100; $i++) {
$messages[] = [
'id' => "bulk-$i",
'fromName' => 'YourBrand',
'toPhone' => "+38011111111$i",
'messageType' => 'transaction',
'text' => "Message $i"
];
}
$results = $messenger->sendBulk($messages);
echo "Sent " . count($results) . " messages\n";
En İyi Uygulamalar
Telefon Numaraları
Her zaman E.164 biçimini kullanın: - ✅ '+380XXXXXXXXXX' - ❌ '380XXXXXXXXXX' - ❌ '0XXXXXXXXXX'
İzleme Kimlikleri
- Her mesaj için benzersiz kimlikler kullanın
- Kimliğe bağlam ekleyin (ör. "sipariş-12345", "promo-yaz-2025")
- Kimlikleri 255 karakterin altında tutun
- Özel karakterlerden kaçının
TTL (Yaşam Süresi)
Önerilen TTL değerleri:
- OTP/Doğrulama: 300-600 saniye (5-10 dakika)
- İşlemsel: 3600-86400 saniye (1-24 saat)
- Promosyon: 86400-259200 saniye (1-3 gün)
- Anketler: 604800 saniye (7 gün)
Planlanmış Mesajlar
- 'scheduledSent' için UTC saat dilimini kullanın
- 30 günden fazla önceden planlama yapmayın
- Saat dilimi farklılıklarını hesaba katın
- Önce yakın gelecekteki programlarla test edin
Toplu Gönderim
- 100-1000 mesajdan oluşan gruplar halinde gönderin
- Hız sınırlamasını uygulayın
- Hataları incelikle ele alın
- Başarısız mesajları yeniden deneyin
Hata İşleme
HTTP Durum Kodları
| Kod | Açıklama |
|---|---|
| 200 | Başarı |
| 400 | Hatalı istek - geçersiz parametreler |
| 401 | Yetkisiz - geçersiz API anahtarı |
| 429 | Çok fazla istek |
| 500 | Sunucu hatası |
Hata Yanıtı
{
"error": {
"code": "INVALID_PHONE",
"message": "Invalid phone number format",
"field": "toPhone"
}
}
Mantığı Yeniden Dene
async function sendWithRetry(message, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
return await messenger.sendMessage(message);
} catch (error) {
if (error.response?.status === 400) {
// Don't retry validation errors
throw error;
}
if (i === maxRetries - 1) throw error;
// Exponential backoff
await new Promise(resolve =>
setTimeout(resolve, Math.pow(2, i) * 1000)
);
}
}
}
Sonraki Adımlar
- Mesaj Değişkenleri - Dinamik içerik kullan
- Mesaj Türleri - Mesaj türlerini keşfedin
- Teslimat Durumu - Teslimatı takip edin