Skip to content

    How to Choose an SMS API in India

    Six questions to put to any SMS API before you build on it, read against the real NotifyTech AI request: the DLT fields, the access steps, the delivery webhook and the price of a message.

    Transactional SMS, Per Message
    ₹0.25
    Languages In The Code Samples
    3
    Approval Time, Developer Page
    24-48h

    Read against the developer page, the documentation and the Services page, 20 October 2026

    • NotifyTech AI Team
    • 6 min read
    • Development

    What an SMS API has to do in India

    An SMS API is a JSON call that sends one text. In India that call is only the start: every commercial SMS also has to match a registered sender, header and template, and what happens to it afterwards comes back as a delivery report.

    This checklist covers what to ask of any provider, then reads the NotifyTech AI SMS request against it, line by line. It names no competitors and ranks nothing. It is not legal advice: check your DLT portal for your own registrations.

    The NotifyTech AI SMS API at a glance

    Endpoint
    POST /v1/sms/send, JSON over HTTPS
    Authentication
    An API key sent as a Bearer token
    India fields
    sender_id, dlt_entity_id and dlt_template_id
    Delivery reports
    A webhook: message.delivered and message.failed
    Code samples
    Node.js, Python, PHP
    Price
    ₹0.25/msg transactional, ₹0.15/msg promotional

    What does an SMS API have to carry in India?

    Ask which of your registrations the request carries: the sender ID, the entity ID and the template ID. TRAI’s rules are checked against what you registered on every message, so the API either takes these IDs in the request, as ours does, or holds them for you. Ask which.

    • An entity registered as yours

      Commercial SMS is sent by a registered sender. You register your entity on a DLT portal and get an entity ID, which the request carries as dlt_entity_id.

    • A header you have been approved

      Commercial SMS may only use registered headers. Your approved header goes in sender_id, and its format is set on your DLT portal.

    • A template that matches the text

      The fixed part of each template is hashed, so every message can be checked against it. The template ID goes in dlt_template_id, the text has to match the registered wording, and a template belongs to one header.

    • Links only if they are whitelisted

      A URL, APK, OTT link or call-back number that is not whitelisted has not been permitted in SMS since 1 October 2024.

    • A declared telemarketer chain

      Since December 2024, a message whose chain is not defined, or does not match the declared one, is rejected. Changing provider is therefore also a change to your registration.

    How does access to the API work?

    Access is not a self-serve sign-up. You tell us what you are building, get verified, and then receive an API key and a secret key. The developer page lists approval at 24-48h.

    • Tell us what you're building

      Active NotifyTech AI account.

    • Get verified

      Verified business profile. Registered Principal Entity (PE) ID. Approved sender ID / header. Approval time: 24-48h.

    • Get your keys

      API key & secret key. IP whitelisting (optional). Webhook URL configured.

    Your DLT registrations follow your access provider’s own timeline, so the go-live date is whichever of the two comes last.

    How do you find out what happened to a message?

    Delivery reports arrive at a webhook you control. Ours sends message.delivered and message.failed, and signs each request. SMS has no read receipt, so Delivered is the last status you will see.

    • Events by webhook, not by polling

      The developer page documents two events, message.delivered and message.failed. It documents no endpoint for polling a message’s status, so store what the webhook tells you.

    • A signature on every call

      Each webhook carries an X-NotifyTech-Signature header. The sample checks it against your webhook secret, answers 401 if it does not match, and replies 200 once the event is handled.

    • A failed event carries an error

      message.failed includes the message ID and an error field, which the sample logs. Keep both with the message.

    • No event means unknown

      If nothing arrives for a message, call it unknown, not failed and not delivered, and decide what your app does next. A status event is not proof that a person read the message.

    Handle WebhooksPHP · webhook.php · message.delivered
    <?php// webhook.php - Handle delivery reports$payload = file_get_contents('php://input');$data = json_decode($payload, true);$signature =  $_SERVER['HTTP_X_NOTIFYTECH_SIGNATURE'];$secret = 'your_webhook_secret';if (!verifySignature($payload, $signature, $secret)) {    http_response_code(401);    exit('Invalid signature');}switch ($data['event']) {    case 'message.delivered':        updateMessageStatus(          $data['message_id'], 'delivered'        );        break;    case 'message.failed':        updateMessageStatus(          $data['message_id'], 'failed'        );        logError($data['error']);        break;}http_response_code(200);echo json_encode(['status' => 'processed']);

    This is the delivery-report sample from the developer page. The secret and the helper functions are placeholders.

    What does an SMS cost?

    Our listed prices are ₹0.25/msg per transactional message and ₹0.15/msg per promotional message. Those are the per-message prices only, so ask any provider what else a month will include.

    Transactional SMS
    ₹0.25/msg: OTP, order and payment messages
    Promotional SMS
    ₹0.15/msg: bulk marketing campaigns
    DLT registration
    Fees are set by each access provider; confirm them on your portal
    Which product a message uses
    Decided when you register the template; confirm with our team

    Check the Services page for the current prices.

    What does a real request look like?

    This is the NotifyTech AI SMS request from the developer page, with the six questions marked on the lines that answer them. Where a line is missing, the question stays open: ask it before you build.

    Send SMS with DLTPython · POST /v1/sms/send
    import requestsdef send_sms():    url = "https://api.notifytechai.com/v1/sms/send"    headers = {        "Authorization": "Bearer YOUR_API_KEY",        "Content-Type": "application/json"    }    payload = {        "to": "+919876543210",        "message": "Your OTP is 123456",        "sender_id": "YOUR_SENDER_ID",        "dlt_entity_id": "1234567890123456",        "dlt_template_id": "1234567890123456789"    }    response = requests.post(        url, json=payload, headers=headers    )    return response.json()result = send_sms()print(result)

    The code, the IDs and the key are placeholders from the developer page. Your template decides the message text.

    1. Question 1: Is it a plain JSON call you can make from any language?

      Shown on line 4
      POST /v1/sms/send with a JSON body. The samples are in Node.js, Python, PHP.
      Still open
      The sample sends one message per call. Bulk sending is not shown.
    2. Question 2: How does it authenticate, and can you limit where calls come from?

      Shown on line 6
      An API key sent as a Bearer token, with a key and secret key issued to you. IP whitelisting is optional.
      Still open
      Key rotation is not shown.
    3. Question 3: Which sender does the message go out as?

      Shown on line 12
      sender_id is your approved header.
      Still open
      The header’s format is set on your DLT portal.
    4. Question 4: Does the request carry your DLT IDs?

      Shown on line 13 to 14
      dlt_entity_id and dlt_template_id travel with the message text, which has to match the registered template.
      Still open
      Registering the entity, header and template is yours to do.
    5. Question 5: What comes back, and how do you hear about delivery?

      Shown on line 17
      The call returns the reply body. Delivery arrives later by webhook as message.delivered or message.failed.
      Still open
      The reply body and error codes are not documented in the sample.
    6. Question 6: What are the limits, and how do retries stay safe?

      Not on any line
      Not shown in the sample.
      Still open
      A rate limit and a retry-safety key would be named here, and neither is. Ask for the Rate Limiting & Throttling guide.

    Frequently Asked Questions

    Common questions about choosing and using an SMS API in India

    1. Your sender ID, entity ID and template ID. TRAI’s rules are checked against what you registered on a DLT portal, so each commercial SMS has to match a registered header and template. NotifyTech AI’s request carries sender_id, dlt_entity_id and dlt_template_id. Registering them is your job, on your access provider’s portal.

    References & Further Reading

    TRAI’s own documents behind the India fields in this checklist

    • TCCCPR 2018, consolidated

      TRAI’s Telecom Commercial Communications Customer Preference Regulations as consolidated on 21 May 2026: the rules for senders, headers, templates, consent and scrubbing. The gazetted text prevails.

      Read the Regulations
    • TRAI Direction, 28 October 2024

      Whitelisting of URLs, APKs, OTT links and call-back numbers, and rejection of messages whose telemarketer chain is undefined or does not match.

      Read the Direction
    • SMS traceability, Press Release 92/2024

      TRAI’s December 2024 note on the chain declaration and the rejection of messages sent through unregistered paths.

      Read the Release

    Request your API keys

    Tell us what you are building and we will set up your API keys. Real people on support, Mon–Sat, 9–7 IST.

    We use cookies to improve your experience.

    By accepting, you agree to our cookie policy and analytics tracking.