Bulk SMS API for India: REST, Webhooks and DLT Support
Our bulk SMS API for India lets your app send OTPs, alerts and campaigns with one HTTPS request. It accepts DLT entity and template IDs, returns a message ID straight away and posts delivery reports to your webhook as they arrive.

A bulk SMS API lets your software send SMS with an HTTPS request. In India, each request must carry your DLT entity ID, template ID and approved sender ID. Our REST and HTTP API returns a message ID, posts delivery reports to your webhook, and supports Unicode, scheduling and high-volume OTP traffic.
Send your first SMS from code
Pass your sender ID, the DLT template ID and the filled message. Delivery reports arrive at your webhook URL.
# Send an SMS with your DLT template curl -X POST "https://api.smsgatewayproviders.com/v1/sms" \ -H "Authorization: Bearer YOUR_API_KEY" \ -d sender="ACMEIN" \ -d to="9198XXXXXXXX" \ -d template_id="1107XXXXXXXXXXXXXXX" \ -d message="482913 is your login OTP for AcmeIn. Valid for 10 minutes. - AcmeIn" \ -d dlr_url="https://yourapp.in/webhooks/dlr"
$ch = curl_init("https://api.smsgatewayproviders.com/v1/sms"); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ["Authorization: Bearer YOUR_API_KEY"], CURLOPT_POSTFIELDS => http_build_query([ "sender" => "ACMEIN", "to" => "9198XXXXXXXX", "template_id" => "1107XXXXXXXXXXXXXXX", "message" => "482913 is your login OTP for AcmeIn. Valid for 10 minutes. - AcmeIn", ]), ]); echo curl_exec($ch);
const res = await fetch("https://api.smsgatewayproviders.com/v1/sms", { method: "POST", headers: { Authorization: `Bearer ${process.env.SMS_KEY}` }, body: new URLSearchParams({ sender: "ACMEIN", to: "9198XXXXXXXX", template_id: "1107XXXXXXXXXXXXXXX", message: "482913 is your login OTP for AcmeIn. Valid for 10 minutes. - AcmeIn", }), }); console.log(await res.json()); // { status: "queued", id: "..." }
import requests r = requests.post( "https://api.smsgatewayproviders.com/v1/sms", headers={"Authorization": "Bearer YOUR_API_KEY"}, data={"sender": "ACMEIN", "to": "9198XXXXXXXX", "template_id": "1107XXXXXXXXXXXXXXX", "message": "482913 is your login OTP for AcmeIn. Valid for 10 minutes. - AcmeIn"}, ) print(r.json())
REST, HTTP and XML
Use HTTPS REST, simple HTTP GET/POST or XML, whichever suits your stack.
DLR webhooks
Delivery status is pushed to your URL, so you never poll for results.
DLT fields built in
Pass entity ID and template ID with each request for clean operator checks.
High throughput
The platform handles up to about 10,000 SMS a second at peak.
How our bulk SMS API in India works
You create an API key in the panel and call our endpoint over HTTPS. Each request carries the sender ID, one or more mobile numbers, the message text and your DLT details. The API checks the request, queues the message and returns a unique message ID for each number.
Store that message ID against your own record, such as an order or login attempt. When the operator reports the final status, we post it to your webhook with the same ID, so you can update your system without extra calls.
Pick the style that suits your stack. The REST API takes JSON over HTTPS. The simple HTTP API takes the same fields as URL parameters, which suits older ERP and billing software. The XML API serves systems that already exchange XML. All three support scheduling, Unicode and personalised variables.
DLT parameters every request needs
If the text does not match the template, the operator rejects it. Copy templates from the panel instead of retyping them in code.
- Entity ID: your Principal Entity ID from the DLT portal.
- Template ID: the ID of the approved template this message uses.
- Sender ID: the 6-character header linked to that template.
- Message text that matches the template exactly, with each {#var#} replaced by its value.
- A Unicode flag for Tamil, Hindi or other non-English text.
Delivery reports and error handling
Your webhook receives the message ID, mobile number, status and time. Reply with HTTP 200 quickly and process the data in the background. Use the message ID to ignore duplicates if a report arrives twice.
Split errors into two groups. Timeouts and server errors are safe to retry after a short wait that grows each time. Validation errors, such as a wrong template ID, invalid number or low balance, will fail again, so log them and alert your team. Watch the rate-limit response too: slow down, then retry. For campaigns, send many numbers in one request instead of one call per number.
OTP best practice and SMS pumping protection
OTP traffic needs a template on a service or transactional header, so it reaches DND numbers at any hour. SMS pumping is a fraud where bots trigger OTPs to many numbers to run up your bill. It often shows up as a sudden spike in OTP requests with very few codes entered. A few rules stop most of it.
- Use 4 to 6 digit codes that expire in 5 to 10 minutes, with one active code per user.
- Add a resend cooldown and a daily cap per number, per IP and per device.
- Put a captcha or similar check before the OTP request on signup pages.
- Allow only the country codes you serve and block the rest.
- Track OTPs sent against OTPs verified and alert on sudden drops.
- Keep API keys on your server, never inside app or browser code.
Sending outside India too?
We also send SMS and WhatsApp messages to customers abroad, with help on each country's sender ID and consent rules.
How it works
Sign up and get a key
Create an account and generate an API key from the panel settings.
Add your DLT details
Load your entity ID, sender IDs and template IDs so the API can use them.
Test and set your webhook
Send a test SMS to your own number and confirm the delivery report reaches your URL.
Go live with limits
Switch production traffic on, with OTP rate limits and error alerts in place.
Frequently asked questions
How do I integrate an SMS API into my website or app?
Generate an API key in the panel, then make an HTTPS request from your server with the sender ID, mobile number, message text, entity ID and template ID. Any language that can call a URL works, including PHP, Python, Node.js, Java and .NET. Test with your own number first, then set up your delivery report webhook.
Does the API support DLT entity ID and template ID?
Yes. Every request can carry your DLT entity ID and template ID along with the sender ID. The message text must match the approved template, with variables filled in. If you store templates in the panel, you can copy the exact text into your code to avoid mismatch rejections.
How do I get delivery reports through the API?
Add a webhook URL in your account. When the operator confirms delivery or failure, we post the message ID, number, status and timestamp to that URL. Your server should reply with HTTP 200 quickly and process the data afterwards. Reports are also visible in the panel.
What is SMS pumping and how can I prevent it?
SMS pumping is fraud where bots request OTPs for large numbers of phone numbers to inflate your SMS spend. Prevent it with resend cooldowns, daily caps per number and IP, a captcha before OTP requests, blocking country codes you do not serve, and alerts when the ratio of verified to sent OTPs drops.
Can I send Tamil or Hindi SMS through the API?
Yes. Send the text in UTF-8 and set the Unicode option in your request. Unicode messages hold 70 characters in one part and 67 per part once split, so check length before you register the template. The same template rules apply as for English messages.
Related pages
Send your first SMS today
From ₹0.15 per delivered SMS, credits valid for a year, and DLT help from a real person.


