Send SMS to Contacts
Send SMS to one or more recipients using your Bulkit sender ID and available account credit.
Last updated · Markdown version
It is suitable for:
- transactional SMS
- operational alerts
- scheduled notifications
- sending one message to multiple saved contact numbers
Endpoint title
Send SMS to Contacts
What this endpoint does
Queues an SMS message for one or more recipient numbers using a sender ID assigned to your account.
Endpoints
POST /api/v2/messages/sms/bulkAuthorization
Bulkit recommends authenticating requests using a single Bearer token in the Authorization HTTP header:
Authorization: Bearer <your_api_key>Legacy compatibility: Passing apikey and apisecret directly in the JSON body, or via legacy X-API-Key and X-API-Secret headers, remains supported for existing integrations.
HTTP method and path
POST /api/v2/messages/sms/bulkAuthorization requirements
- Recommended:
Authorization: Bearer <your_api_key>in the HTTP header. - Legacy:
apikeyandapisecretprovided in the JSON body or custom headers.
Endpoint code block
POST https://api.bulkitsms.com/api/v2/messages/sms/bulk
Authorization: Bearer bk_live_8n6JQv3K1h9Lp0Md
Content-Type: application/jsonAuthorization header example
Authorization: Bearer bk_live_8n6JQv3K1h9Lp0MdError response
{
"status": "error",
"message": "Invalid number"
}Suggested usage
Use this endpoint for both single-recipient and multi-recipient SMS sends when you want one consistent integration pattern.
Request examples
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 John, your order #BK-2041 has been dispatched.",
"scheduled_at": "2026-03-10T09:15:00+03:00"
}'Parameters
| Parameter | Required | Type | Description | Validation |
|---|---|---|---|---|
sender | Yes | string | Sender ID name assigned to your account (e.g. BULK_IT) | Must exist, be active, and belong to your account |
mobiles | Yes | array of strings | One or more recipient mobile numbers | Use normalized Kenyan numbers such as 254700000001 |
message | Yes | string | SMS body to send to all recipients in the request | Cannot be blank |
scheduled_at | No | string | Future send time | Use timezone-aware ISO 8601 such as 2026-03-10T09:15:00+03:00 |
sender_id | Legacy | string / int | Legacy UUID or numeric Sender ID | Backward-compatible alternative to sender |
apikey | Legacy | string | Legacy body authentication key | Optional when using Authorization: Bearer |
apisecret | Legacy | string | Legacy secret paired with API key | Optional when using Authorization: Bearer |
Success response example
{
"status": "success",
"message": "Bulk SMS processed",
"data": {
"requested": 2,
"queued": 2,
"failed": []
}
}Error response examples
Invalid credentials
{
"status": "error",
"message": "Invalid credentials"
}Insufficient balance
{
"status": "error",
"message": "Insufficient balance"
}Invalid number
{
"status": "error",
"message": "Invalid number"
}Invalid sender ID
{
"status": "error",
"message": "Invalid sender ID"
}Invalid message
{
"status": "error",
"message": "Invalid message"
}Restricted send time
{
"status": "error",
"message": "Restricted send time"
}Partial bulk failure example
{
"status": "success",
"message": "Bulk SMS processed",
"data": {
"requested": 3,
"queued": 2,
"failed": [
{
"mobile": "12345",
"message": "Invalid number"
}
]
}
}Notes and best practices
- validate and normalize phone numbers before sending
- keep sender IDs mapped to the right environment and use case
- check balance before high-volume sends
- use
scheduled_atwith timezone offsets to avoid ambiguity - if you use a promotional sender ID, avoid scheduling Safaricom traffic outside 8:00 AM to 6:00 PM Africa/Nairobi time
Single-recipient alternative
If you are sending to one recipient only, Bulkit also provides:
POST /api/v2/messages/smsUse the bulk endpoint when you want one consistent integration for both single and multi-recipient sends.