Secure Your Users with our multi-channel Verify API
Verify API is a programmable verification engine that sends one‑time passwords (OTPs) across the channels your users actually use—SMS, Viber, WhatsApp, and Telegram. You define the rules. We execute them in real time, return delivery + verification status, and keep your UX fast and familiar.
*No credit card required

+1,000 BUSINESSES USE SMS.to FOR THEIR NEEDS
Who Benefits and How
With Verify API, your backend decides the verification flow per request. In the SMS.to UI, you maintain one Verify App that stores your default settings—channels, expiry, fallback order, and templates. If a request doesn’t include a setting, we apply your defaults.

Your Business
For Platform Owners & Developers: One default Verify App; Per‑request control via API; Client‑generated OTP support; Seamless backend integration; Detailed logs and analytics.

Your Clients
For End Users: One timely message; Delivered on familiar channels (SMS, Viber, WhatsApp, Telegram); Localized, fast, user‑friendly.
Key Capabilities
Single source of truth: One Verify App powering all verification flows.
API‑driven overrides: Tune channel order, expiry, templates, and locale per request.
Real‑time orchestration: Automatic fallback across channels until delivered or timed out.
Delivery + verification telemetry: Webhooks and searchable logs for each step.
Built‑in localization: Pre‑translated message templates for multiple languages.
Client‑generated OTP: Optionally supply your own codes when you need full control.
Statistics & Charts: Analyze your results and improve your flows accordingly

How To Configure Verify API

Set up an SMS.to Verify App
Set your defaults once: Channels & fallback order; Expiry and OTP length/format; Templates & localization; Callback URLs (webhooks).

Route by performance, region, and preference
Low WhatsApp completion in your audience? Switch to SMS. Channel unavailable in a country? Remove it from the flow. Customers active on Telegram? Prioritize Telegram. Want to try multiple channels one‑after‑another until delivered? Just define the fallback order.

Control each request via API
Override anything per request—channels, priority, expiry, template, locale. If you omit a setting, we inherit your defaults.

Smart execution + complete feedback
Verify API follows your requested (or default) logic until delivery or timeout, then streams events to your webhooks and logs everything for search and analytics.
Charging
- If WhatsApp/Viber/Telegram delivers the code: only that channel’s fee + Verify Fee.
- If we fall back to SMS: SMS is charged on send; Verify Fee only if delivered.
- No charges for skipped channels or for channels that tried but didn’t deliver.
- One channel fee per OTP, plus the Verify Fee only on successful delivery.

Verify API For Developers
Implement SMS marketing notifications, OTPs or reminders into your workflow and build apps that send SMS messages with our 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 →
Seamless Integrations
With Your Favorite Tools
SMS integrations for your preferred platform


Sign-Up for a Free Trial
Get free Call & SMS credits on Sign-Up
