</> Indian Developer Integration Hub

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.

< 80ms API Response Time
Live Webhook Delivery Receipts
Zero Setup Fee • Recharge from ₹200
POST https://nizorasms.com/api/v1/otp/send
Sample JSON Response (HTTP 200)
{
  "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 Native Implementation otp_sender.php
<?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');
}
Laravel HTTP Client app/Services/OtpService.php
<?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';
    }
}
Node.js / Express services/nizoraSms.js
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 };
Python (requests) otp_client.py
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"))
Flutter (Dart) lib/services/sms_service.dart
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;
  }
}
Java (OkHttp 3) NizoraClient.java
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 Terminal Command CLI Terminal
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.

Start Integrating in Production Today

Sign up, generate your API key, and send your first test OTP in less than 5 minutes.

Create Developer Account →