Bulk OTP API
Send OTPs at scale with reliable delivery, idempotent sends, and real-time tracking. Perfect for applications with thousands of daily verifications.
✦ No credit card required · Free plan available · Setup in 5 minutes
Built for High-Volume OTP Delivery
-
Built for Scale
Our API handles high throughput with wallet-based billing. Top up your wallet and send as many OTPs as you need without per-request payment friction.
-
Fast Delivery
Multi-provider routing ensures fast delivery even at high volumes. If one provider is slow or overloaded, we automatically route through an alternative.
-
Track Every Message
Full delivery tracking for every OTP sent. Monitor delivery rates, identify failures, and get complete audit trails via the Messages API.
-
Idempotent at Scale
Idempotency keys prevent duplicates even during bulk operations. Safe to retry failed requests without worrying about double-sends.
Works with every language. Just a single POST request.
curl -X POST https://api.startmessaging.com/otp/send \
-H "Content-Type: application/json" \
-H "X-API-Key: sm_live_your_api_key_here" \
-d '{
"phoneNumber": "+919876543210",
"templateId": "YOUR_TEMPLATE_ID",
"variables": {
"otp": "123456",
"appName": "YourApp"
}
}' const response = await fetch("https://api.startmessaging.com/otp/send", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-Key": "sm_live_your_api_key_here",
},
body: JSON.stringify({
phoneNumber: "+919876543210",
templateId: "YOUR_TEMPLATE_ID",
variables: {
otp: "123456",
appName: "YourApp",
},
}),
});
const data = await response.json();
console.log(data); import requests
response = requests.post(
"https://api.startmessaging.com/otp/send",
headers={
"Content-Type": "application/json",
"X-API-Key": "sm_live_your_api_key_here",
},
json={
"phoneNumber": "+919876543210",
"templateId": "YOUR_TEMPLATE_ID",
"variables": {
"otp": "123456",
"appName": "YourApp"
},
},
)
data = response.json()
print(data) $ch = curl_init("https://api.startmessaging.com/otp/send");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: sm_live_your_api_key_here",
],
CURLOPT_POSTFIELDS => json_encode([
"phoneNumber" => "+919876543210",
"templateId" => "YOUR_TEMPLATE_ID",
"variables" => [
"otp" => "123456",
"appName" => "YourApp"
]
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true); import java.net.http.*;
import java.net.URI;
HttpClient client = HttpClient.newHttpClient();
String body = """
{
"phoneNumber": "+919876543210",
"templateId": "YOUR_TEMPLATE_ID",
"variables": {
"otp": "123456",
"appName": "YourApp"
}
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.startmessaging.com/otp/send"))
.header("Content-Type", "application/json")
.header("X-API-Key", "sm_live_your_api_key_here")
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body()); package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"io"
)
func main() {
payload, _ := json.Marshal(map[string]interface{}{
"phoneNumber": "+919876543210",
"templateId": "YOUR_TEMPLATE_ID",
"variables": map[string]string{
"otp": "123456",
"appName": "YourApp",
},
})
req, _ := http.NewRequest("POST", "https://api.startmessaging.com/otp/send", bytes.NewBuffer(payload))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("X-API-Key", "sm_live_your_api_key_here")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
} Bulk OTP FAQ
Is there a rate limit for bulk sending?
The API supports high throughput for production use. If you need very high volume (100,000+ OTPs/month), contact us for optimized rate limits and volume pricing.
Can I send OTPs to multiple numbers in one API call?
Each API call sends one OTP to one phone number. For bulk sending, make parallel API calls with unique idempotency keys for each request.
How do I handle failures in bulk sends?
Each request returns a unique otpRequestId and messageId. Track delivery status per message. Failed sends can be safely retried using the same idempotency key.
Related Pages
Send OTPs at Scale
Top up your wallet and start sending. No rate limit negotiations, no contracts.