Gửi tin nhắn xếp tầng
Gửi tin nhắn trên nhiều kênh với một yêu cầu API duy nhất. Cascade tự động định tuyến tin nhắn của bạn thông qua Telegram Bot, Viber Bot, Viber Business Messages, RCS và SMS.
Điểm cuối
Tầng tiêu chuẩn
Định tuyến tin nhắn qua tất cả các kênh có sẵn theo trình tự.
Ưu tiên Telegram-Viber
Ưu tiên kênh Telegram và Viber để giao hàng nhanh hơn.
Xác thực
API Cascade hỗ trợ ba tiêu đề xác thực. Bao gồm ít nhất một:
| Tiêu đề | Mô tả |
|---|---|
X-Ủy quyền-Khóa |
Khóa API SMSBAT (được khuyến nghị) |
X-Viber-Auth-Token |
Thông tin xác thực bot Viber |
X-Tg-Bot-Key |
Khóa bot Telegram |
Cấu trúc yêu cầu
Tiêu đề
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
Nội dung yêu cầu
Gửi một mảng các đối tượng tin nhắn:
[
{
"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"
}
]
Thông số
| Tham số | Loại | Bắt buộc | Mô tả |
|---|---|---|---|
id |
chuỗi | Có | Mã định danh theo dõi của bạn |
fromName |
chuỗi | Có | Tên hiển thị của người gửi |
toPhone |
chuỗi | Có | Số điện thoại người nhận (định dạng E.164) |
loại tin nhắn |
chuỗi | Có | Loại tin nhắn: giao dịch, khuyến mãi, viber_survey, flashcall |
văn bản |
chuỗi | Có* | Nội dung tin nhắn (* bắt buộc đối với hầu hết các loại) |
ttl |
số nguyên | Không | Thời gian tồn tại tính bằng giây |
đã lên lịch |
chuỗi | Không | Ngày giờ ISO 8601 cho giao hàng theo lịch trình |
Loại tin nhắn
Tin nhắn giao dịch
Các thông báo quan trọng như xác nhận đơn hàng và cập nhật tài khoản:
{
"id": "order-12345",
"fromName": "YourStore",
"toPhone": "+380XXXXXXXXX",
"messageType": "transaction",
"text": "Your order #12345 has been confirmed and will arrive tomorrow.",
"ttl": 86400
}
Tin nhắn khuyến mãi
Chiến dịch tiếp thị với đa phương tiện:
{
"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
}
Khảo sát Viber
Các cuộc thăm dò tương tác với 2-5 tùy chọn phản hồi:
{
"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
}
Văn bản khảo sát tối đa: 85 ký tự
Cuộc gọi chớp nhoáng
Xác minh số điện thoại qua cuộc gọi tự động:
{
"id": "verify-user-123",
"fromName": "YourApp",
"toPhone": "+380XXXXXXXXX",
"messageType": "flashcall",
"ttl": 300
}
Ví dụ
Giao dịch cơ bản
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"
}
]'
Khuyến mãi theo lịch trình
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
}
]'
Tin nhắn hàng loạt
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"
}
]'
Phản hồi
Phản hồi thành công
[
{
"messageId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"trackinId": "tx-001"
},
{
"messageId": "8b2f1e9a-4c6d-4e2a-9f8b-1a3d5c7e9f0b",
"trackinId": "tx-002"
}
]
Trường phản hồi
| Lĩnh vực | Loại | Mô tả |
|---|---|---|
messageId |
chuỗi (UUID) | Mã nhận dạng thông báo hệ thống |
trackinId |
chuỗi | Mã định danh theo dõi của bạn (từ yêu cầu) |
Sử dụng messageId để theo dõi trạng thái và trackinId để tương quan với hệ thống của bạn.
Ví dụ triển khai
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";
Các phương pháp hay nhất
Số điện thoại
Luôn sử dụng định dạng E.164:
- ✅ +380XXXXXXXXX
- ❌ 380XXXXXXXXX
- ❌ 0XXXXXXXXX
ID theo dõi
- Sử dụng ID duy nhất cho mỗi tin nhắn
- Bao gồm ngữ cảnh trong ID (ví dụ:
order-12345,promo-summer-2025) - Giữ ID dưới 255 ký tự
- Tránh các ký tự đặc biệt
TTL (Thời gian tồn tại)
Giá trị TTL được đề xuất:
- OTP/Xác minh: 300-600 giây (5-10 phút)
- Giao dịch: 3600-86400 giây (1-24 giờ)
- Khuyến mại: 86400-259200 giây (1-3 ngày)
- Khảo sát: 604800 giây (7 ngày)
Tin nhắn đã lên lịch
- Sử dụng múi giờ UTC cho
sentedSent - Không đặt lịch trước quá 30 ngày
- Tài khoản cho sự khác biệt múi giờ
- Trước tiên hãy thử nghiệm với lịch trình trong tương lai gần
Gửi hàng loạt
- Gửi theo đợt 100-1000 tin nhắn
- Thực hiện giới hạn tỷ lệ
- Xử lý lỗi khéo léo
- Thử lại tin nhắn thất bại
Xử lý lỗi
Mã trạng thái HTTP
| Mã | Mô tả |
|---|---|
| 200 | Thành công |
| 400 | Yêu cầu không hợp lệ - tham số không hợp lệ |
| 401 | Trái phép - khóa API không hợp lệ |
| 429 | Quá nhiều yêu cầu |
| 500 | Lỗi máy chủ |
Phản hồi lỗi
{
"error": {
"code": "INVALID_PHONE",
"message": "Invalid phone number format",
"field": "toPhone"
}
}
Thử lại logic
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)
);
}
}
}
Các bước tiếp theo
- Biến tin nhắn - Sử dụng nội dung động
- Loại tin nhắn - Khám phá các loại tin nhắn
- Trạng thái giao hàng - Theo dõi việc giao hàng