SMS

Reliable SMS API for every critical notification

OTPs, order updates, payment confirmations, and account alerts—critical SMS are delivered instantly, every time. Zoho CPaaS (formerly ZeptoMail) gives you a dedicated SMS channel built for transactional messaging, with everything you need to go live fast and scale without friction.*

*Currently available in IN DC only.


const url = "https://cpaas.zoho.com/v1.1/sms";
const token = "<token>";

const requestBody = {
  sender_key: "<sender_key>",
  template_key: "<template_key>",
  to: [{ mobile_no: "<mobile_no>" }],
  merge_info: { "<merge_key>": "<merge_value>" }
};

fetch(url, {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: token
  },
  body: JSON.stringify(requestBody)
})
  .then((response) => response.json())
  .then((resp) => console.log("success"))
  .catch((error) => console.log(error, "error"));
                                            

curl "https://cpaas.zoho.com/v1.1/sms" \
  -X POST \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -H "Authorization: <token>" \
  -d '{
    "sender_key": "<sender_key>",
    "template_key": "<template_key>",
    "to": [{"mobile_no": "<mobile_no>"}],
    "merge_info": {"<merge_key>": "<merge_value>"}
  }' 
                                            

using System;
using System.Net;
using System.Text;
using System.IO;
using Newtonsoft.Json.Linq;

namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {
            System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
            var baseAddress = "https://cpaas.zoho.com/v1.1/sms";

            var http = (HttpWebRequest)WebRequest.Create(new Uri(baseAddress));
            http.Accept = "application/json";
            http.ContentType = "application/json";
            http.Method = "POST";
            http.PreAuthenticate = true;
            http.Headers.Add("Authorization", "<token>");
            JObject parsedContent = JObject.Parse("{'sender_key': '<sender_key>','template_key': '<template_key>','to': [{'mobile_no': '<mobile_no>'}],'merge_info': {'<merge_key>': '<merge_value>'}}");

            ASCIIEncoding encoding = new ASCIIEncoding();
            Byte[] bytes = encoding.GetBytes(parsedContent.ToString());
            Stream newStream = http.GetRequestStream();
            newStream.Write(bytes, 0, bytes.Length);
            newStream.Close();

            var response = http.GetResponse();
            var stream = response.GetResponseStream();
            var sr = new StreamReader(stream);
            var content = sr.ReadToEnd();
            Console.WriteLine(content);
        }
    }
}
                                            

import requests

url = "https://cpaas.zoho.com/v1.1/sms"

payload = "{\n\"sender_key\": \"<sender_key>\",\n\"template_key\": \"<template_key>\",\n\"to\": [{\"mobile_no\": \"<mobile_no>\"}],\n\"merge_info\": {\"<merge_key>\": \"<merge_value>\"}\n}"
headers = {
    "accept": "application/json",
    "content-type": "application/json",
    "authorization": "<token>",
}

response = requests.request("POST", url, data=payload, headers=headers)
print(response.text)
                                            

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
    CURLOPT_URL => "https://cpaas.zoho.com/v1.1/sms",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_POSTFIELDS => "{\n\"sender_key\": \"<sender_key>\",\n\"template_key\": \"<template_key>\",\n\"to\": [{\"mobile_no\": \"<mobile_no>\"}],\n\"merge_info\": {\"<merge_key>\": \"<merge_value>\"}\n}",
    CURLOPT_HTTPHEADER => array(
        "accept: application/json",
        "authorization: <token>",
        "cache-control: no-cache",
        "content-type: application/json",
    ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
    echo "cURL Error #:" . $err;
} else {
    echo $response;
}
?>
                                            

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import org.json.JSONObject;

public class SmsSendApi {
    public static void main(String[] args) throws Exception {
        String postUrl = "https://cpaas.zoho.com/v1.1/sms";
        BufferedReader br = null;
        HttpURLConnection conn = null;
        String output = null;
        StringBuffer sb = new StringBuffer();
        try {
            URL url = new URL(postUrl);
            conn = (HttpURLConnection) url.openConnection();
            conn.setDoOutput(true);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("Accept", "application/json");
            conn.setRequestProperty("Authorization", "<token>");
            JSONObject object = new JSONObject("{\n\"sender_key\": \"<sender_key>\",\n\"template_key\": \"<template_key>\",\n\"to\": [{\"mobile_no\": \"<mobile_no>\"}],\n\"merge_info\": {\"<merge_key>\": \"<merge_value>\"}\n}");
            OutputStream os = conn.getOutputStream();
            os.write(object.toString().getBytes());
            os.flush();
            br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
            while ((output = br.readLine()) != null) {
                sb.append(output);
            }
            System.out.println(sb.toString());
        } catch (Exception e) {
            br = new BufferedReader(new InputStreamReader((conn.getErrorStream())));
            while ((output = br.readLine()) != null) {
                sb.append(output);
            }
            System.out.println(sb.toString());
        } finally {
            if (br != null) br.close();
            if (conn != null) conn.disconnect();
        }
    }
}         
                                            

QUICK START

Go from signup to first send in minutes.

One API call is all it takes. Point to your template, pass in your variables, and Zoho CPaaS handles the rest like routing, delivery, and tracking. Whether you're sending a single OTP or thousands of alerts, the integration stays the same.

templatevariablesroutedelivered

PRICING

Pay for what you send. Nothing more.

Credit-based model
No monthly payments
No lock-ins

Our SMS channel runs on a credit-based model. Buy credits and spend them as you send. No monthly payments or lock-ins.

View Pricing

Every critical message, delivered on time.

Zoho CPaaS's SMS channel is purpose-built for messages triggered by user actions and business events. Whether it's a one-time password or a shipping update, your customers get the right message at exactly the right moment.

OTPs and authentication

Deliver one-time passwords for login, account verification, and transaction sign-off. These are high-frequency dispatches where every second counts.

Order and shipment updates

Keep customers in the loop from order placed to doorstep. Every message includes dynamic order IDs, tracking links, and delivery windows.

Payment and transaction alerts

Confirm payments, flag failed transactions, and send debit or credit alerts instantly after every financial event. They're key touchpoints during high-value transactions.

Appointment reminders

Reduce no-shows with timely appointment confirmations for clinics, service centers, and bookings. Personalize each message with name, time, and location variables.

Account and system alerts

Notify users of password changes, new device logins, subscription renewals, and usage warnings to keep them informed of important activity in their accounts.

Service and ticket updates

Update customers on ticket status, field engineer arrival, and service completion. Stay in touch with your customers every step of the way.

Everything you need to manage senders and templates.

Structure your SMS traffic the way your business is organized—by product, region, or environment. Senders and templates are designed to stay organized as your usage scales.

Sender management

SENDERS

Sender management

Each sender maps to a registered sender ID, which is the name your customers see when they receive your SMS. Create multiple senders for different products or regions, associate them with the Agents that need to use them, and keep delivery data cleanly separated per sender.

TEMPLATES

Template control

Build reusable message templates with {{var}} placeholders for names, amounts, links, or any dynamic content. Assign a human-readable alias to each template and reference it in your API calls instead of the system-generated key. Submit them for regulatory approval directly from the platform.

Template control

ANALYTICS

Deep analytics for every message

Analytic data in Zoho CPaaS is available at three levels—by sender, by agent, and by template—giving you full visibility into your SMS performance at whatever granularity you need.

Delivery overview chart

Delivery overview chart

A time-series chart plots your SMS traffic across all four delivery statuses. The default view covers the last 15 days and is configurable, making it easy to spot patterns, spikes, and drops at a glance.

Delivery status breakdown

Delivery status breakdown

Every message is tracked across four statuses, such as Sent, Delivered, Undelivered, and Process failed. These counts are available at the sender, Agent, and template level, so you always know where a message stands and where failures are originating.

Bounce count and categories

Bounce count and categories

Track bounce counts separately and break them down by category, so you can understand why messages are failing, not just know that they are.

Bounce by sender and Agent

Bounce by sender and Agent

See which sender IDs and which Agents are contributing to bounces. This makes it straightforward to isolate whether a delivery issue is tied to a specific registered sender, a particular integration, or an environment like sandbox versus production.

Message logs

Every message dispatched through an Agent is recorded in its Logs tab. It's a searchable, timestamped record of individual sends, delivery statuses, and failure reasons.

Message logs

Get reliable SMS delivery for your business in minutes.