Magpadala ng Cascade Messages
Magpadala ng mga mensahe sa maraming channel na may iisang kahilingan sa API. Awtomatikong ruta ng Cascade ang iyong mensahe sa pamamagitan ng Telegram Bot, Viber Bot, Viber Business Messages, RCS, at SMS.
Mga Endpoint
Karaniwang Cascade
Niruruta ang mga mensahe sa lahat ng available na channel sa pagkakasunud-sunod.
Priyoridad ng Telegram-Viber
Inuuna ang mga Telegram at Viber channel para sa mas mabilis na paghahatid.
Pagpapatotoo
Sinusuportahan ng Cascade API ang tatlong header ng pagpapatunay. Isama ang hindi bababa sa isa:
| Header | Paglalarawan |
|---|---|
X-Authorization-Key |
SMSBAT API key (inirerekomenda) |
X-Viber-Auth-Token |
Mga kredensyal ng Viber bot |
X-Tg-Bot-Key |
Telegram bot key |
Istraktura ng Kahilingan
Mga Header
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
Katawan ng Kahilingan
Magpadala ng hanay ng mga bagay ng mensahe:
[
{
"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"
}
]
Mga Parameter
| Parameter | Uri | Kinakailangan | Paglalarawan |
|---|---|---|---|
id |
string | Oo | Ang iyong tracking identifier |
fromName |
string | Oo | Display name ng nagpadala |
toPhone |
string | Oo | Numero ng telepono ng tatanggap (E.164 format) |
messageType |
string | Oo | Uri ng mensahe: transaksyon, promo, viber_survey, flashcall |
teksto |
string | Oo* | Nilalaman ng mensahe (* kinakailangan para sa karamihan ng mga uri) |
ttl |
integer | Hindi | Time-to-live sa ilang segundo |
scheduledSent |
string | Hindi | ISO 8601 datetime para sa nakaiskedyul na paghahatid |
Mga Uri ng Mensahe
Mga Mensahe sa Transaksyon
Mga kritikal na notification tulad ng pagkumpirma ng order at pag-update ng account:
{
"id": "order-12345",
"fromName": "YourStore",
"toPhone": "+380XXXXXXXXX",
"messageType": "transaction",
"text": "Your order #12345 has been confirmed and will arrive tomorrow.",
"ttl": 86400
}
Mga Mensahe ng Promo
Mga kampanya sa marketing na may rich media:
{
"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 Survey
Mga interactive na botohan na may 2-5 na opsyon sa pagtugon:
{
"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
}
Maximum na text ng survey: 85 character
Flash na Tawag
Pag-verify ng telepono sa pamamagitan ng awtomatikong tawag:
{
"id": "verify-user-123",
"fromName": "YourApp",
"toPhone": "+380XXXXXXXXX",
"messageType": "flashcall",
"ttl": 300
}
Mga halimbawa
Pangunahing Transaksyon
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"
}
]'
Naka-iskedyul na Promo
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
}
]'
Mga Bultuhang Mensahe
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"
}
]'
Tugon
Tagumpay na Tugon
[
{
"messageId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"trackinId": "tx-001"
},
{
"messageId": "8b2f1e9a-4c6d-4e2a-9f8b-1a3d5c7e9f0b",
"trackinId": "tx-002"
}
]
Mga Patlang ng Tugon
| Patlang | Uri | Paglalarawan |
|---|---|---|
messageId |
string (UUID) | Tagatukoy ng mensahe ng system |
trackinId |
string | Ang iyong tracking identifier (mula sa kahilingan) |
Gamitin ang messageId para sa pagsubaybay sa status at trackinId para sa pag-uugnay sa iyong system.
Mga Halimbawa ng Pagpapatupad
Sawa
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";
Pinakamahuhusay na Kasanayan
Mga Numero ng Telepono
Palaging gamitin ang format na E.164:
- ✅ +380XXXXXXXXX
- ❌ 380XXXXXXXXX
- ❌ 0XXXXXXXXX
Mga Tracking ID
- Gumamit ng mga natatanging ID para sa bawat mensahe
- Isama ang konteksto sa ID (hal.,
order-12345,promo-summer-2025) - Panatilihin ang mga ID sa ilalim ng 255 character
- Iwasan ang mga espesyal na karakter
TTL (Time-to-Live)
Inirerekomendang mga halaga ng TTL:
- OTP/Verification: 300-600 segundo (5-10 minuto)
- Transaksyonal: 3600-86400 segundo (1-24 na oras)
- Promosyonal: 86400-259200 segundo (1-3 araw)
- Survey: 604800 segundo (7 araw)
Mga Naka-iskedyul na Mensahe
- Gamitin ang timezone ng UTC para sa
scheduledSent - Huwag mag-iskedyul ng higit sa 30 araw nang maaga
- Itala ang mga pagkakaiba sa timezone
- Subukan muna ang malapit na hinaharap na mga iskedyul
Bultuhang Pagpapadala
- Magpadala ng mga batch ng 100-1000 na mensahe
- Ipatupad ang paglilimita sa rate
- Pangasiwaan ang mga error nang maayos
- Subukan muli ang mga nabigong mensahe
Error sa Paghawak
Mga HTTP Status Code
| Code | Paglalarawan |
|---|---|
| 200 | Tagumpay |
| 400 | Masamang kahilingan - di-wastong mga parameter |
| 401 | Hindi awtorisado - di-wastong API key |
| 429 | Masyadong maraming kahilingan |
| 500 | Error sa server |
Error na Tugon
{
"error": {
"code": "INVALID_PHONE",
"message": "Invalid phone number format",
"field": "toPhone"
}
}
Subukang muli ang 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)
);
}
}
}
Mga Susunod na Hakbang
- Mga Variable ng Mensahe - Gumamit ng dynamic na nilalaman
- Mga Uri ng Mensahe - Galugarin ang mga uri ng mensahe
- Status ng Paghahatid - Subaybayan ang paghahatid