Send Customized SMS
Send personalized SMS messages using contact data and placeholders.
Last updated · Markdown version
Customized SMS lets you merge recipient data into the final message before it is sent.
Endpoints
HTTP
POST /api/v2/messages/sms/bulkUse the standard bulk SMS endpoint with custom_data to render one message per recipient.
Authorization
Pass your API token using standard HTTP Bearer authentication:
HTTP
Authorization: Bearer bk_live_8n6JQv3K1h9Lp0Md
Content-Type: application/jsonFor backward compatibility, legacy body credentials (apikey and apisecret) or legacy headers (X-API-Key & X-API-Secret) remain supported.
Supported placeholder formats
Bulkit supports both:
{{first_name}}__FIRST_NAME__
Common aliases like Number, Phone, and Mobile resolve to the recipient number.
Example template
TEXT
Hello {{first_name}}, your account __ACCOUNT__ is due on {{due_date}}.Example cURL Request
cURL / Bash
curl -X POST "https://api.bulkitsms.com/api/v2/messages/sms/bulk" \
-H "Authorization: Bearer bk_live_8n6JQv3K1h9Lp0Md" \
-H "Content-Type: application/json" \
-d '{
"sender": "BULK_IT",
"mobiles": ["254700000001", "254733000002"],
"message": "Hello {{first_name}}, your balance is {{balance}}.",
"custom_data": [
{
"Mobile": "254700000001",
"first_name": "Amina",
"balance": "KES 1,240"
},
{
"Mobile": "254733000002",
"first_name": "Brian",
"balance": "KES 560"
}
]
}'How it works
- the backend matches each
custom_datarow to a recipient by mobile number - placeholders are rendered before the message is stored and queued
- outbox and history show the final rendered message, not the raw template
Notes
- make sure each custom data row contains the correct recipient number
- use consistent field names across all rows
- if a placeholder value is missing, the unresolved token may remain in the message
Error response
JSON
{
"status": "error",
"message": "Invalid message"
}