REST API

SMS API — Send & Receive Text Messages | BulkSMS.ca

Complete REST API for sending and receiving SMS messages. Send single SMS, bulk messages, schedule campaigns, and track delivery status in real-time.

Base URL: https://api.bulksms.ca

What is the BulkSMS.ca SMS API?

The BulkSMS.ca SMS API is a RESTful API that lets developers send and receive SMS messages programmatically. It supports single and bulk message sending, scheduling, delivery tracking, template management, and webhook notifications. Authentication uses API keys passed in the Authorization header. The API returns JSON responses and supports up to 1,000 requests per minute.

Authentication

Authorization Header
Authorization: Bearer YOUR_API_KEY Content-Type: application/json

Include your API key in the Authorization header of every request. API keys are available in your BulkSMS.ca dashboard under Settings > API Keys.

API Endpoints

POST/v2/send

Send a single SMS message to one recipient.

Auth: API Key
Request Body
{ "to": "9198XXXXXXXX", "message": "Hello from BulkSMS!", "sender": "BULKSMS", "route": "transactional" }
Response (200 OK)
{ "status": "success", "message_id": "msg_abc123", "to": "9198XXXXXXXX", "status_code": "202", "credits_used": 1 }
POST/v2/send-bulk

Send bulk SMS to up to 10,000 recipients.

Auth: API Key
Request Body
{ "to": ["9198XXXXXXXX", "9198XXXXXXXX"], "message": "Hello!", "sender": "BULKSMS", "route": "promotional" }
Response (200 OK)
{ "status": "success", "batch_id": "batch_xyz789", "total": 1000, "credits_used": 1000 }
POST/v2/schedule

Schedule an SMS for future delivery.

Auth: API Key
Request Body
{ "to": "9198XXXXXXXX", "message": "Reminder: Your appointment is tomorrow.", "sender": "BULKSMS", "schedule_time": "2026-06-20T10:00:00+05:30" }
Response (200 OK)
{ "status": "success", "schedule_id": "sch_456def", "scheduled_for": "2026-06-20T10:00:00+05:30" }
GET/v2/status/{message_id}

Get delivery status of a sent message.

Auth: API Key
Response (200 OK)
{ "message_id": "msg_abc123", "to": "9198XXXXXXXX", "status": "delivered", "delivered_at": "2026-06-15T14:30:22+05:30", "operator": "Jio" }
GET/v2/balance

Check your account credit balance.

Auth: API Key
Response (200 OK)
{ "balance": 15420, "currency": "INR", "expiry_date": "2027-06-15" }
GET/v2/templates

List all approved DLT templates.

Auth: API Key
Response (200 OK)
{ "templates": [ { "id": "tpl_001", "name": "Order Confirmation", "content": "Dear {#var#}, your order {#var#} is confirmed." } ] }
DELETE/v2/schedule/{schedule_id}

Cancel a scheduled message.

Auth: API Key
Response (200 OK)
{ "status": "success", "message": "Scheduled message cancelled" }

SDK Code Examples

cURL
curl (built-in)
curl -X POST https://api.bulksms.ca/v2/send \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "9198XXXXXXXX",
    "message": "Hello from BulkSMS!",
    "sender": "BULKSMS"
  }'
Python
pip install requests
import requests

headers = {
    "Authorization": "Bearer YOUR_API_KEY",
    "Content-Type": "application/json"
}
data = {
    "to": "9198XXXXXXXX",
    "message": "Hello from BulkSMS!",
    "sender": "BULKSMS"
}
response = requests.post("https://api.bulksms.ca/v2/send", json=data, headers=headers)
print(response.json())
Node.js
npm install axios
const axios = require('axios');

const response = await axios.post('https://api.bulksms.ca/v2/send', {
  to: '9198XXXXXXXX',
  message: 'Hello from BulkSMS!',
  sender: 'BULKSMS'
}, {
  headers: { Authorization: 'Bearer YOUR_API_KEY' }
});
console.log(response.data);
PHP
composer require guzzlehttp/guzzle
$client = new GuzzleHttp\Client();
$response = $client->post('https://api.bulksms.ca/v2/send', [
  'headers' => ['Authorization' => 'Bearer YOUR_API_KEY'],
  'json' => [
    'to' => '9198XXXXXXXX',
    'message' => 'Hello from BulkSMS!',
    'sender' => 'BULKSMS'
  ]
]);
echo $response->getBody();

Webhooks

Configure webhooks in your dashboard to receive real-time event notifications.

Supported Events

message.deliveredmessage.failedmessage.sentmessage.expiredmessage.rejected
Webhook Payload Example
{
  "event": "message.delivered",
  "message_id": "msg_abc123",
  "to": "9198XXXXXXXX",
  "status": "delivered",
  "operator": "Jio",
  "delivered_at": "2026-06-15T14:30:22+05:30",
  "timestamp": "2026-06-15T14:30:22+05:30"
}

Error Codes

Code
Description
200
Success — Message queued for delivery
400
Bad Request — Invalid parameters or missing fields
401
Unauthorized — Invalid or missing API key
403
Forbidden — Insufficient credits or access denied
404
Not Found — Message or template ID not found
429
Rate Limited — Too many requests, retry after
500
Server Error — Internal server error, contact support

FAQs

How do I send an SMS using the API?

Make a POST request to /v2/send with your API key in the Authorization header. Include the recipient phone number, message text, and sender ID in the JSON body. The API returns a message ID for tracking.

What is the rate limit for the SMS API?

The SMS API supports up to 1,000 requests per minute per API key. For higher volumes, contact our sales team for dedicated infrastructure.

Can I send bulk SMS via API?

Yes, use the /v2/send-bulk endpoint to send messages to up to 10,000 recipients in a single request. Each recipient is billed as one SMS.

How do I track SMS delivery?

Use the /v2/status/{msg_id} endpoint to check delivery status. Alternatively, configure webhooks to receive real-time delivery notifications.

Is the SMS API DLT compliant?

Yes, all SMS sent through our API are automatically routed through DLT-registered templates and sender IDs. Ensure your templates are approved before sending.

Ready to Integrate?

Get your API key and start building.

All APIs