Base URL
Send transactional and promotional SMS over HTTPS REST under https://api.smstake.com/v1/sms/. Authenticate with an API key query parameter or a Bearer token. JSON bodies use Content-Type: application/json. Commercial SMS in India must use DLT-approved sender_id and template_id values. API access is provided after onboarding.
This page is the public developer reference for the SMSTAKE Bulk SMS API. Related docs: RCS API reference, Bulk SMS service, SMSTAKE blog, and the DLR webhook integration guide.
Authentication
Use either method. Do not send both unless your account is configured to accept them together.
API key (query parameter)
POST https://api.smstake.com/v1/sms/send?apikey=YOUR_KEY
Content-Type: application/json
Bearer token (header)
Authorization: Bearer <your_api_token>
Content-Type: application/json
- Use HTTPS only.
- Store keys and tokens in environment variables or a secrets manager.
- Rotate credentials if they are exposed.
Endpoints
| Method | URL | Purpose |
|---|---|---|
| POST | https://api.smstake.com/v1/sms/send | Send one transactional or promotional SMS |
| POST | https://api.smstake.com/v1/sms/batch | Send multiple SMS messages in one request |
Mandatory parameters
| Field | Description |
|---|---|
sender_id | Approved DLT header (sender ID), for example SMSTKE |
template_id | DLT content template ID registered for your Principal Entity |
mobile | Recipient mobile number with country code, for example +919876543210 |
message | Message text that matches the approved DLT template (including variable values) |
Optional fields commonly used in integrations include client_ref (your internal reference) and route (transactional or promotional). Exact optional fields for your account are confirmed during onboarding. See the DLT registration guide if you still need entity, header or template approval.
Single SMS send
POST https://api.smstake.com/v1/sms/send
HTTP REST
POST https://api.smstake.com/v1/sms/send
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json
{
"sender_id": "SMSTKE",
"template_id": "1207165123456789012",
"mobile": "+919876543210",
"message": "Your OTP is 482913. Valid for 5 minutes.",
"route": "transactional",
"client_ref": "otp_session_88421"
}
Node.js
const res = await fetch('https://api.smstake.com/v1/sms/send', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.SMSTAKE_API_TOKEN}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
sender_id: 'SMSTKE',
template_id: '1207165123456789012',
mobile: '+919876543210',
message: 'Your OTP is 482913. Valid for 5 minutes.',
route: 'transactional',
client_ref: 'otp_session_88421'
})
});
const data = await res.json();
console.log(data);
Python
import os
import requests
resp = requests.post(
'https://api.smstake.com/v1/sms/send',
headers={
'Authorization': f"Bearer {os.environ['SMSTAKE_API_TOKEN']}",
'Content-Type': 'application/json',
},
json={
'sender_id': 'SMSTKE',
'template_id': '1207165123456789012',
'mobile': '+919876543210',
'message': 'Your OTP is 482913. Valid for 5 minutes.',
'route': 'transactional',
'client_ref': 'otp_session_88421',
},
timeout=30,
)
print(resp.json())
Example success response
{
"status": "accepted",
"message_id": "msg_8f3k2j9x1m",
"channel": "sms",
"mobile": "+919876543210",
"client_ref": "otp_session_88421"
}
Batch Bulk SMS
POST https://api.smstake.com/v1/sms/batch
HTTP REST
POST https://api.smstake.com/v1/sms/batch?apikey=YOUR_KEY
Content-Type: application/json
{
"messages": [
{
"sender_id": "SMSTKE",
"template_id": "1207165123456789012",
"mobile": "+919876543210",
"message": "Hi Ananya, your order ORD-1001 is out for delivery.",
"route": "transactional",
"client_ref": "order_1001"
},
{
"sender_id": "SMSTKE",
"template_id": "1207165123456789012",
"mobile": "+919812345678",
"message": "Hi Rohan, your order ORD-1002 is out for delivery.",
"route": "transactional",
"client_ref": "order_1002"
}
]
}
Node.js
const res = await fetch(
`https://api.smstake.com/v1/sms/batch?apikey=${process.env.SMSTAKE_API_KEY}`,
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
messages: [
{
sender_id: 'SMSTKE',
template_id: '1207165123456789012',
mobile: '+919876543210',
message: 'Hi Ananya, your order ORD-1001 is out for delivery.',
route: 'transactional',
client_ref: 'order_1001'
},
{
sender_id: 'SMSTKE',
template_id: '1207165123456789012',
mobile: '+919812345678',
message: 'Hi Rohan, your order ORD-1002 is out for delivery.',
route: 'transactional',
client_ref: 'order_1002'
}
]
})
}
);
console.log(await res.json());
Python
import os
import requests
resp = requests.post(
'https://api.smstake.com/v1/sms/batch',
params={'apikey': os.environ['SMSTAKE_API_KEY']},
json={
'messages': [
{
'sender_id': 'SMSTKE',
'template_id': '1207165123456789012',
'mobile': '+919876543210',
'message': 'Hi Ananya, your order ORD-1001 is out for delivery.',
'route': 'transactional',
'client_ref': 'order_1001',
},
{
'sender_id': 'SMSTKE',
'template_id': '1207165123456789012',
'mobile': '+919812345678',
'message': 'Hi Rohan, your order ORD-1002 is out for delivery.',
'route': 'transactional',
'client_ref': 'order_1002',
},
]
},
timeout=30,
)
print(resp.json())
Example batch response
{
"status": "accepted",
"results": [
{ "client_ref": "order_1001", "message_id": "msg_a1", "mobile": "+919876543210", "status": "accepted" },
{ "client_ref": "order_1002", "message_id": "msg_a2", "mobile": "+919812345678", "status": "accepted" }
]
}
DLR webhooks
Register an HTTPS endpoint to receive delivery reports as JSON POSTs. Verify X-SMSTAKE-Signature on the raw request body before you trust the payload. Return 200 OK quickly and deduplicate by message_id + status.
Example DLR payload
POST https://yourapp.com/webhooks/smstake/dlr
Content-Type: application/json
X-SMSTAKE-Signature: sha256=...
{
"event": "message.dlr",
"message_id": "msg_8f3k2j9x1m",
"channel": "sms",
"mobile": "+919876543210",
"sender_id": "SMSTKE",
"status": "delivered",
"status_code": "DELIVRD",
"delivered_at": "2026-10-19T10:15:04+05:30",
"submitted_at": "2026-10-19T10:15:02+05:30",
"template_id": "1207165123456789012",
"client_ref": "otp_session_88421",
"error_code": null,
"error_message": null
}
Signature verification
- Read the raw body bytes before JSON parsing.
- Compute HMAC-SHA256 using your webhook signing secret.
- Compare with the hex digest in
X-SMSTAKE-Signature(prefix may besha256=). - Reject the request if the signature does not match.
Worked examples for Express and FastAPI are in the DLR webhook integration guide. Status meanings are covered in SMS delivery reports explained.
HTTP response codes
| HTTP status | Meaning |
|---|---|
| 200 / 202 | Request accepted for processing |
| 400 | Invalid JSON, missing mandatory fields, or template mismatch |
| 401 | Missing or invalid API key / Bearer token |
| 403 | Credentials valid but not allowed for this route or sender |
| 429 | Rate limit exceeded; retry with backoff |
| 5xx | Temporary server or upstream issue; safe to retry with backoff |
Next steps
- Request a demo for API onboarding and sandbox access
- RCS API developer reference
- SMSTAKE blog for DLT, OTP and delivery guides
- DLT registration guide
- OTP SMS guide
- Bulk SMS service page