> ## Documentation Index
> Fetch the complete documentation index at: https://docs.otp.id/llms.txt
> Use this file to discover all available pages before exploring further.

# Voice OTP integration

> Use Voice OTP to deliver a four-digit code in a phone call, then verify it through the standard V3 flow.

Use Voice when you want OTP.ID to call a user and read an OTP aloud. Your merchant's Voice channel must be active before you request a Voice OTP. Voice is available only through [`POST /v3/request`](/api-reference/request-otp); it does not support `POST /v3/send`.

## Flow overview

<Steps>
  <Step title="Create the Voice transaction">
    Send the destination phone number and an explicit brand to `POST /v3/request` with `channel: "voice"`.
  </Step>

  <Step title="Tell the user to listen for the call">
    OTP.ID places a call and reads the brand followed by the four OTP digits one at a time.
  </Step>

  <Step title="Verify the entered code">
    Collect the four digits from the user and call `POST /v3/verify` with the `otp_id` returned by the request.
  </Step>
</Steps>

## Create a Voice OTP

Send the phone number as digits only in international format beginning with `62`. `brand` is required. Voice always uses four numeric digits, even if you include `otp_length` in the request.

```json theme={null}
{
  "channel": "voice",
  "destination": "628111111111",
  "brand": "Bukakios"
}
```

The call follows this spoken pattern, with each OTP digit read separately:

```text theme={null}
Kode Bukakios 1 6 7 8
```

Use `data.otp_id` from the normal V3 response for verification. The request response does not confirm that the user answered the call or the final delivery cost.

## Verify the Voice OTP

Use the ordinary V3 verification flow. Submit the four digits the user heard; do not generate or supply the Voice OTP yourself.

```bash theme={null}
curl -X POST https://api.otp.id/v3/verify \
  -H "Authorization: Bearer <api_key>" \
  -H "Content-Type: application/json" \
  -d '{
    "otp_id": "OTP20260812VOIC000001",
    "otp": "1678"
  }'
```

## Troubleshooting

### `CHANNEL_UNAVAILABLE`

Voice is not active for your merchant or is temporarily unavailable. Confirm that your merchant Voice channel has been activated, then retry the request later if the channel is temporarily unavailable.

### Request returns `status: "failed"`

The delivery provider could not complete the request. Check that the destination number is a valid reachable phone number in `62...` format, then let the user retry or use another available channel. Do not treat a request response as confirmation that the user answered the call.

### The user did not receive or understand the code

Ask the user to listen for the call again through a new OTP request after the current OTP expires or is no longer usable. The code is always four numeric digits and is read one digit at a time.
