Turn one send into thousands of delivered texts

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.

Free trialTalk to an expert


*No credit card required

TrustRadius
TrustRadius Five Star Rating
G2 Rating
G2 4.5 Rating
Capterra Rating
Capterra Five Star Rating
TrustPilot Rating
TrustPilot Four Star Rating
Bulk SMS Hero

+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.

smsto features optout compliance

Features to manage your campaigns

Bulk SMS

Web and API in one place

Marketers can schedule. Developers can automate. Same inbox. Same reports.

SMS Marketing

Two-way SMS where available

Let customers reply to confirm, reschedule, or ask a question. Availability varies by country.

Bulk SMS

Delivery receipts and analytics

Track what was sent and delivered. See performance data to improve the next bulk message.

Bulk SMS

Personalisation at scale

Use fields and templates so each bulk text still feels personal.

Bulk SMS

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.

Bulk SMS

Opt-out and compliance helpers

Respect quiet hours and opt-out rules. Built-in STOP keyword support included.

Bulk SMS

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

Start with a free trial to test delivery and flows. No credit card required. Move to pay-as-you-go with volume discounts when you are ready. Add an estimate in seconds. Choose country and to see your rate. If you work in education or a nonprofit, ask about tailored pricing.
Note: “Free” refers to your free trial for testing. Carrier and routing costs mean ongoing sending is billed per message.

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

recommended
  • 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.

Get Started

verify API
easy SETUP!

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 <api_key>' \
--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"
}'
				
			
				
					<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => '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 <api_key>',
    '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 <api_key>',
    '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 <api_key>"
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 <api_key>',
  '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 <api_key>")
  .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 <api_key>")
  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))
}
				
			

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

Sending to opted-in contacts keeps your brand safe and your delivery healthy. Here is a simple checklist for every bulk message:
  • 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.
If you want help with templates for alerts, reminders, or mass SMS marketing, we can share simple examples.

Get Started

Seamless Integrations
With Your Favorite Tools​

SMS integrations for your preferred platform

seamless integration mobile

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.

Learn how we collect and use your information by visiting our Privacy Notice
SMS.to SignUp

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.

see coverage directory