Send voice OTPs from a Node.js backend with the REST API. One HTTPS call to POST /v1/voice-otp/send, a webhook for the result, Rs 1.50 per answered minute. No package to install.
REST API
No KYC to start
No package to install
Call this from your server. Keep the API key in an environment variable, never in client code.
// Node.js 18+ (built-in fetch)
const res = await fetch("https://voice-api.edesy.in/v1/voice-otp/send", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.EDESY_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
phone_number: "9876543210", // 10-digit Indian mobile
otp_code: "482913", // optional - omit to get a 6-digit code
message_template: "Your Acme code is {{otp}}. I repeat, {{otp}}.", // optional
gather_enabled: true, // optional - ask the user to press 1
callback_url: "https://your-app.com/webhooks/voice-otp",
external_id: "signup-123", // optional - your own reference
}),
});
const call = await res.json();
// { data: { id, call_sid, phone_number, otp_code, status, created_at }, meta }
// Store call.data.otp_code against the user and compare when they type it in.Status is one of delivered, no-answer, busy or failed. dtmf_response is set when you enable press-1 confirmation.
POST https://your-app.com/webhooks/voice-otp
X-Edesy-Event: voice-otp.completed
Content-Type: application/json
{
"id": "5b1c...-uuid",
"external_id": "signup-123",
"phone_number": "9876543210",
"status": "delivered",
"dtmf_response": "1",
"duration_sec": 18,
"price": "1.5000",
"completed_at": "2026-09-26T10:15:30Z"
}Voice OTP is live today as a self-serve REST API for Indian mobile numbers. Everything in the second list we build for customers who need it - tell us your use case and volume.
Voice OTP call API
POST a phone number; we call and read the code aloud. Send your own code or let us generate a 6-digit one.
Custom message template
Put your brand name and wording in the call.
"Press 1 to confirm"
Optional keypad confirmation - also used for COD order confirmation calls.
Delivery webhook
We POST the call result (delivered, no-answer, busy, failed) to your callback URL.
Call logs and stats
Every OTP call with status and duration in the dashboard and via API.
Abuse protection
Per-number rate limit (5 calls per hour by default).
Self-serve, no KYC
Sign up, create an API key, top up a prepaid wallet with UPI or card.
English voice
Clear Indian-English voice out of the box.
Pricing
Rs 1.50 per answered minute with a 1-minute minimum, then billed on actual duration (a 90-second call costs Rs 2.25). A typical OTP call is under a minute, so most OTPs cost Rs 1.50. Unanswered calls are not charged. New accounts get Rs 20 of free credit. Volume pricing on request.
Hindi and regional-language voice
Hindi, Tamil, Telugu, Bengali, Marathi and more.
SMS OTP with voice fallback
Send by SMS first, call if it is not verified in time.
WhatsApp OTP
Authentication templates on WhatsApp.
Verify API
We store and check the code so your backend does not have to.
Automatic retries
Redial unanswered calls after a delay you choose.
Flash call / missed call verification
Verify a number without the user typing a code.
Dedicated caller ID
Call from a number reserved for your brand.
Volume pricing
Per-OTP pricing for committed monthly volumes.
Sign up at voice-otp.edesy.in, create an API key, top up the prepaid wallet and send your first voice OTP. Rs 1.50 per answered minute, no monthly fee, no KYC.