The Fastest OTP SMS API Built for Modern Developers
Drop our ultra-low latency REST API into PHP, Node.js, Python, Laravel, or Flutter in 5 minutes. Guaranteed sub-2.5s OTP delivery, real-time webhooks, and automatic carrier failover.
{
"status": "success",
"job_id": "job_94a8e2b19f03",
"phone": "919876543210",
"units_deducted": 1,
"balance_remaining": "₹482.40",
"operator_route": "AIRTEL_PRIORITY",
"dispatched_at": "2026-10-13T10:14:02.418Z"
}
Copy-Paste SDK Snippets Across All Popular Stacks
Pick your language below and start verifying users in production within minutes.
<?php
declare(strict_types=1);
$apiKey = 'YOUR_NIZORA_API_KEY';
$payload = json_encode([
'phone' => '919876543210',
'otp' => '482910',
'template_id' => 'TPL_LOGIN_VERIFY'
]);
$ch = curl_init('https://nizorasms.com/api/v1/otp/send');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $payload,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json'
],
CURLOPT_TIMEOUT => 5
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$result = json_decode((string)$response, true);
if ($httpCode === 200 && ($result['status'] ?? '') === 'success') {
echo "OTP Sent Successfully! Job ID: " . $result['job_id'];
} else {
echo "Failed to send OTP: " . ($result['message'] ?? 'Unknown error');
}
<?php
namespace App\Services;
use Illuminate\Support\Facades\Http;
class OtpService
{
public function sendOtp(string $phone, string $otp): bool
{
$response = Http::withToken(config('services.nizorasms.api_key'))
->post('https://nizorasms.com/api/v1/otp/send', [
'phone' => $phone,
'otp' => $otp,
'template_id' => 'TPL_LOGIN_VERIFY',
]);
return $response->successful() && $response->json('status') === 'success';
}
}
const axios = require('axios');
async function dispatchOtp(phone, otpCode) {
try {
const response = await axios.post(
'https://nizorasms.com/api/v1/otp/send',
{
phone: phone,
otp: otpCode,
template_id: 'TPL_LOGIN_VERIFY'
},
{
headers: {
'Authorization': `Bearer ${process.env.NIZORA_API_KEY}`,
'Content-Type': 'application/json'
},
timeout: 5000
}
);
return response.data;
} catch (error) {
console.error('NizoraSMS Error:', error.response?.data || error.message);
throw error;
}
}
module.exports = { dispatchOtp };
import requests
def send_otp(phone: str, otp_code: str) -> dict:
url = "https://nizorasms.com/api/v1/otp/send"
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
payload = {
"phone": phone,
"otp": otp_code,
"template_id": "TPL_LOGIN_VERIFY"
}
response = requests.post(url, json=payload, headers=headers, timeout=5)
response.raise_for_status()
return response.json()
# Example usage
# res = send_otp("919876543210", "591024")
# print("Job:", res.get("job_id"))
import 'dart:convert';
import 'package:http/http.dart' as http;
class NizoraSmsService {
static const String _endpoint = 'https://nizorasms.com/api/v1/otp/send';
static const String _apiKey = 'YOUR_API_KEY';
static Future<bool> sendVerificationOtp(String phone, String otp) async {
final response = await http.post(
Uri.parse(_endpoint),
headers: {
'Authorization': 'Bearer $_apiKey',
'Content-Type': 'application/json',
},
body: jsonEncode({
'phone': phone,
'otp': otp,
'template_id': 'TPL_LOGIN_VERIFY',
}),
);
if (response.statusCode == 200) {
final data = jsonDecode(response.body);
return data['status'] == 'success';
}
return false;
}
}
import okhttp3.*;
import java.io.IOException;
public class NizoraClient {
private static final OkHttpClient client = new OkHttpClient();
public static void sendOtp(String phone, String otp) throws IOException {
MediaType JSON = MediaType.get("application/json; charset=utf-8");
String json = "{\"phone\":\"" + phone + "\",\"otp\":\"" + otp + "\",\"template_id\":\"TPL_LOGIN_VERIFY\"}";
RequestBody body = RequestBody.create(json, JSON);
Request request = new Request.Builder()
.url("https://nizorasms.com/api/v1/otp/send")
.header("Authorization", "Bearer YOUR_API_KEY")
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
System.out.println("Response: " + response.body().string());
}
}
}
curl -X POST https://nizorasms.com/api/v1/otp/send \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"phone": "919876543210",
"otp": "839120",
"template_id": "TPL_LOGIN_VERIFY"
}'
Standard API Response & Error Codes
Predictable JSON status codes for effortless error handling in your backend.
| HTTP Code | Status Code | Description | Recommended Action |
|---|---|---|---|
| 200 OK | success |
OTP accepted & pushed to carrier pipe | Store job_id for delivery receipt reconciliation |
| 400 Bad Request | ERR_INVALID_PHONE |
Mobile number format invalid or missing country code | Validate 10-digit Indian number before request |
| 401 Unauthorized | ERR_INVALID_KEY |
Bearer token missing, expired, or invalid | Verify your API key in the NizoraSMS panel |
| 402 Payment Required | ERR_LOW_BALANCE |
Wallet credits exhausted | Top up your wallet balance in panel (min ₹200) |
| 429 Rate Limited | ERR_RATE_LIMIT |
Too many requests within sliding window | Respect throttle headers or request quota increase |
Frequently Asked Questions — Developer API Integration
Everything Indian developers need to know about API quotas, libraries, and carrier delivery.
How long does it take to integrate NizoraSMS OTP API?
Most developers complete integration in less than 5 minutes. All you need is an account, your API key from the panel, and our single POST endpoint to start delivering real-time OTPs.
Which programming languages and frameworks are supported?
NizoraSMS provides standard REST API endpoints compatible with any language including PHP, Node.js, Python, Laravel, Java, Go, Ruby, Flutter (Dart), and cURL.
How do I handle OTP delivery webhooks (DLR callbacks)?
You can configure your webhook callback URL in your dashboard. When the carrier delivers the SMS to the handset, NizoraSMS instantly dispatches an HTTP POST event with delivery status and latency timestamps.
What is the API response time and delivery latency?
Our REST API responds in under 80 milliseconds, and the actual OTP delivery to user handsets takes between 1.8 and 2.5 seconds across Airtel, Jio, Vi, and BSNL networks in India.