A smarter, rules‑driven approach to phone number verification

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.

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
verify api hero image

+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

 

what is verify API

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.

Get Started

verify API
easy SETUP!

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 <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))
}
				
			

Seamless Integrations
With Your Favorite Tools​

SMS integrations for your preferred platform

seamless integration mobile

Sign-Up for a Free Trial

Get free Call & SMS credits on Sign-Up

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