Deliver OTP codes to users via automated voice calls. Send a phone number and OTP, and the recipient receives a voice call with each digit spoken individually for maximum clarity. No app installation or data connection required.
The Call API lets you deliver one-time passwords (OTPs) to your users via automated voice calls. It is designed for scenarios where SMS delivery is unreliable, the user is on a feature phone, or you need an additional layer of verification.
With a single API call, you provide the recipient's phone number and the OTP code. The service places an outbound call and reads each digit individually so the user can easily copy the code.
Feature phones, smartphones, and landlines — no app needed.
Each digit spoken individually to avoid confusion between similar numbers.
Monitor call status, delivery rates, and daily analytics from the dashboard.
https://APIURL.tetrax.in/v1.The Call API uses API key authentication. You must include your trx_call_* API key in the x-api-key header of every request.
trx_call_* key.x-api-key header.Authorization: Bearer <token>.Send your first OTP voice call in under a minute. Replace the API key and phone number with your own values.
GET /v1/call/calls to check delivery status./v1/call/otpInitiate an OTP voice call to the specified phone number. The recipient will receive a call and hear the OTP digits spoken individually.
Response
{
"success": true,
"callId": "call_1712345678",
"message": "OTP voice call initiated successfully",
"call": {
"id": 1,
"phone": "+919876543210",
"otp": "4324",
"status": "initiated",
"called_at": "2026-07-23T12:00:00.000Z"
}
}| Parameter | Type | Required | Description |
|---|---|---|---|
| phone | string | Yes | Recipient phone number with country code. E.g., +919876543210 for India. |
| otp | string | Yes | The OTP code to deliver. Must be a 3–10 digit numeric string. |
/v1/call/callsRetrieve the OTP call history for your account. Supports pagination and status filtering.
Response
{
"calls": [
{
"id": 1,
"phone": "+919876543210",
"otp": "4324",
"status": "completed",
"duration_seconds": 45,
"called_at": "2026-07-23T12:00:00.000Z",
"error_message": null
}
],
"total": 128,
"page": 1
}| Parameter | Type | Required | Description |
|---|---|---|---|
| limit | integer | No | Number of records to return. Default: 20. Max: 100. |
| status | string | No | Filter by call status: initiated, ringing, answered, completed, failed, busy, no-answer. |
| page | integer | No | Page number for pagination. Default: 1. |
/v1/call/analyticsGet OTP call analytics including total calls, success rate, and daily breakdown for the current month.
Response
{
"summary": {
"total_calls": 128,
"successful_calls": 115,
"failed_calls": 13,
"success_rate": 89.84
},
"daily": [
{ "date": "2026-07-01", "total": 15, "successful": 14, "failed": 1 },
{ "date": "2026-07-02", "total": 22, "successful": 20, "failed": 2 }
]
}The Call API uses standard HTTP status codes to indicate success or failure. Error responses include a descriptive message in the response body.
| Code | Description |
|---|---|
| 200 | OK — OTP call initiated successfully. |
| 400 | Bad Request — Missing or invalid parameters (phone, otp). Check that phone includes country code and OTP is 3–10 digits. |
| 401 | Unauthorized — Missing or invalid API key. Include the x-api-key header with a valid trx_call_ key. |
| 403 | Forbidden — The API key does not have Call permissions. Generate a trx_call_ key from the dashboard. |
| 429 | Too Many Requests — Rate limit exceeded. Retry after the time specified in the Retry-After header. |
| 402 | Payment Required — Insufficient wallet balance. Top up your prepaid wallet from the Billing page. |
| 502 | Bad Gateway — The voice call provider failed to initiate the call. Retry the request. |
Rate limits protect the API from abuse and ensure fair usage across all customers. Limits are enforced per API key and configured per account (set per account — no monthly fee).
| Account | Max Calls Per Minute | Price Per Call |
|---|---|---|
| Standard | Up to 120 calls/min | ₹0.28/call |
| Enterprise | 300 calls/min | Custom |
Retry-Afterheader indicating the number of seconds to wait before retrying.The Call API sends real-time call status updates to a webhook URL when the status of an OTP call changes. Webhooks allow you to track delivery without polling.
| Event | Description |
|---|---|
| initiated | Call has been queued and the provider is attempting to connect. |
| ringing | The recipient's phone is ringing. |
| answered | The recipient answered the call. The OTP is being delivered. |
| completed | The call ended successfully after OTP delivery. |
| failed | The call could not be completed due to a provider error. |
| busy | The recipient's line was busy. |
| no-answer | The recipient did not answer the call. |
| Parameter | Type | Description |
|---|---|---|
| call_id | string | Unique identifier for the OTP call. Matches the callId returned by the send endpoint. |
| status | string | Current status of the call: initiated, ringing, answered, completed, failed, busy, or no-answer. |
| duration | integer | Call duration in seconds. Only present for answered/completed calls. |
The Call API uses prepaid wallet billing at a flat ₹0.28 per OTP call — no subscriptions, no monthly fees. Every account pays the same rate; each successful call deducts ₹0.28 from your wallet in real time.
Same rate for every account — no subscriptions, no monthly fees. Top up your wallet and pay per call.
New to the Call API? Follow our step-by-step setup guide with code examples in Node.js, Python, PHP, and Java.
Test the Call API interactively from the OTP Playground in your dashboard.
Was this page helpful?
Help us improve our documentation.