Bulk SMS Sender for faster customer reach
Reach your customers in seconds with bulk text messages that land and get read.
Send from the web by importing a CSV list, or send from your app using our API.
Track delivery. See replies. Scale when you are ready. Send from the web or integrate in minutes with clear docs, webhooks, and delivery receipts.
Used by businesses worldwide. Built for teams and developers. Sender ID options vary by market.
*No credit card required
+1,000 BUSINESSES USE SMS.to FOR THEIR needs
How sending works in 3 simple steps
Get set up fast and start sending today
1Create or import contacts
Paste numbers or upload CSV. Organize with lists and tags so you can send bulk messages to the right group.
2Compose and personalize
Write your text. Add fields like name or order number. Save templates for alerts, reminders, and mass text messaging.
3Send and track
See delivery receipts. View replies where two-way SMS is supported. Use webhooks to push status to your system.
Want the API route? You can send bulk SMS with a single request. If you need sample requests, we will share a quick start.
Features to manage your campaigns
Web and API in one place
Marketers can schedule. Developers can automate. Same inbox. Same reports.
Two-way SMS where available
Let customers reply to confirm, reschedule, or ask a question. Availability varies by country.
Delivery receipts and analytics
Track what was sent and delivered. See performance data to improve the next bulk message.
Personalisation at scale
Use fields and templates so each bulk text still feels personal.
Segmentation and scheduling
Send to saved lists. Use your two custom fields per contact to create simple segments or personalise messages. Schedule sends for the time window that fits each audience.
Opt-out and compliance helpers
Respect quiet hours and opt-out rules. Built-in STOP keyword support included.
Global reach with local rules
Send to many countries from one place. Check local sender ID and pricing before you send.
Pricing and free trial that grows with you
Turn messages into measurable results

Higher response on time-sensitive alerts
Customers see texts fast, which reduces missed appointments and WISMO tickets.

Fewer manual follow-ups
Use templates and lists to run mass texting in minutes.

Clear delivery insight
Delivery receipts help you spot routing or content issues early.
You may be looking at tools that do only broadcast texting or only API sending. SMS.to gives you both. That means your team can run a campaign while your app sends OTPs and updates from the same place.
Text em all!
Built for developers who want clean integration
- Clear REST endpoints to send bulk SMS, fetch DLRs, and receive webhooks.
- Webhooks for delivery and incoming messages so you can update your CRM or ticketing tool.
- API keys and project separation so teams can work safely.
- Quick start with sample requests and environment variables.
Need rate limit or retry guidance? Tell us your expected concurrency and region mix. We will suggest safe defaults.
SMS API For Developers
Implement SMS notifications, OTP, reminders etc. into your workflow and build apps that send SMS with our redundant SSL SMS API. *
curl --location 'https://api.sms.to/sms/send' \
--header 'Authorization: Bearer ' \
--header 'Content-Type: application/json' \
--data '{
"message": "This is test and \n this is a new line",
"to": "+35799999999999",
"bypass_optout": true,
"sender_id": "SMSto",
"callback_url": "https://example.com/callback/handler"
}'
'https://api.sms.to/sms/send',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS =>'{
"message": "This is test and \\n this is a new line",
"to": "+35799999999999",
"bypass_optout": true,
"sender_id": "SMSto",
"callback_url": "https://example.com/callback/handler"
}',
CURLOPT_HTTPHEADER => array(
'Authorization: Bearer ',
'Content-Type: application/json'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
var https = require('follow-redirects').https;
var fs = require('fs');
var options = {
'method': 'POST',
'hostname': 'api.sms.to',
'path': '/sms/send',
'headers': {
'Authorization': 'Bearer ',
'Content-Type': 'application/json'
},
'maxRedirects': 20
};
var req = https.request(options, function (res) {
var chunks = [];
res.on("data", function (chunk) {
chunks.push(chunk);
});
res.on("end", function (chunk) {
var body = Buffer.concat(chunks);
console.log(body.toString());
});
res.on("error", function (error) {
console.error(error);
});
});
var postData = JSON.stringify({
"message": "This is test and \n this is a new line",
"to": "+35799999999999",
"bypass_optout": true,
"sender_id": "SMSto",
"callback_url": "https://example.com/callback/handler"
});
req.write(postData);
req.end();
require "uri"
require "json"
require "net/http"
url = URI("https://api.sms.to/sms/send")
https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = "Bearer "
request["Content-Type"] = "application/json"
request.body = JSON.dump({
"message": "This is test and \n this is a new line",
"to": "+35799999999999",
"bypass_optout": true,
"sender_id": "SMSto",
"callback_url": "https://example.com/callback/handler"
})
response = https.request(request)
puts response.read_body
import http.client
import json
conn = http.client.HTTPSConnection("api.sms.to")
payload = json.dumps({
"message": "This is test and \n this is a new line",
"to": "+35799999999999",
"bypass_optout": True,
"sender_id": "SMSto",
"callback_url": "https://example.com/callback/handler"
})
headers = {
'Authorization': 'Bearer ',
'Content-Type': 'application/json'
}
conn.request("POST", "/sms/send", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n \"message\": \"This is test and \\n this is a new line\",\r\n \"to\": \"+35799999999999\",\r\n \"bypass_optout\": true,\r\n \"sender_id\": \"SMSto\",\r\n \"callback_url\": \"https://example.com/callback/handler\"\r\n}");
Request request = new Request.Builder()
.url("https://api.sms.to/sms/send")
.method("POST", body)
.addHeader("Authorization", "Bearer ")
.addHeader("Content-Type", "application/json")
.build();
Response response = client.newCall(request).execute();
package main
import (
"fmt"
"strings"
"net/http"
"io/ioutil"
)
func main() {
url := "https://api.sms.to/sms/send"
method := "POST"
payload := strings.NewReader(`{`+"
"+`
"message": "This is test and \n this is a new line",`+"
"+`
"to": "+35799999999999",`+"
"+`
"bypass_optout": true,`+"
"+`
"sender_id": "SMSto",`+"
"+`
"callback_url": "https://example.com/callback/handler"`+"
"+`
}`)
client := &http.Client {
}
req, err := http.NewRequest(method, url, payload)
if err != nil {
fmt.Println(err)
return
}
req.Header.Add("Authorization", "Bearer ")
req.Header.Add("Content-Type", "application/json")
res, err := client.Do(req)
if err != nil {
fmt.Println(err)
return
}
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}
GET API KEY →
Local coverage and sender IDs
Check the rules before you send. Some countries need pre-registration or have specific sender ID formats. Two-way SMS availability also varies.
Compliance and good practice
- Use clear consent and keep a record.
- Add opt-out text and honour it.
- Respect local quiet hours and content rules.
- Keep messages short and useful.
- Test with a small group before a full send.
Seamless Integrations
With Your Favorite Tools
SMS integrations for your preferred platform
What Our Users Say
Start sending bulk texts in minutes
Create an account and try your first bulk SMS workflow today
Want a demo? Book a quick call and we will show you the bulk message sender flow, the inbox, and the reports.
Try first for free and pick the plan that fits.
FAQ
(Bulk SMS Essentials)
Yes. You can start with a free trial to test sending and delivery. After that, pricing is pay-as-you-go. This keeps things fair and compliant with carrier rules.
Yes. Delivery receipts are standard. Two-way SMS where available. Let customers reply to confirm, reschedule, or ask a question. Availability varies by country.
Yes. Add fields like name, time, or order number. Save templates so your team can reuse best-performing copy.
Most teams send a first message in under an hour once credentials are set. We provide sample requests and webhook tips. If you need deeper help, we can guide you.
Download prices for all countries . Rates vary by country.
Kick things off with the free trial. For ongoing needs, talk to us about nonprofit or education pricing.