---
title: "Send a one-time code or issue a tap-to-verify link"
method: POST
path: "/v1/verifications"
tags: ["Public API"]
---

# Send a one-time code or issue a tap-to-verify link

`POST /v1/verifications`

## Request

- Base URL: `https://otprun.com`
- URL: `https://otprun.com/v1/verifications`
- Auth: HTTP bearer

## Request body

- CreateInputBody7
  - `app_name` string: Replaces {app} in the text, defaults to the project sender name
  - `channels` string[], nullable: Tried in order; omit to use the project routing policy (WhatsApp first, Telegram as fallback)
  - `code_length` integer
  - `locale` string: BCP 47 tag of the message, defaults to the project locale
  - `max_attempts` integer
  - `mode` 'outbound' | 'inbound': Defaults to outbound
  - `to` string: Recipient phone in international format such as +77010000000, required for outbound
  - `ttl_seconds` integer

## Response `201`

Created

- VerificationBody
  - `attempts` integer, required
  - `channel_used` 'whatsapp_gateway' | 'telegram' | 'telegram_gateway' | 'whatsapp_official', nullable, required: Channel that carries the code, null until chosen
  - `code_length` integer, required
  - `created_at` string, date-time, required
  - `delivered_at` string, date-time, nullable, required
  - `error_code` string, required
  - `expires_at` string, date-time, required
  - `failed_at` string, date-time, nullable, required
  - `id` string, uuid, required
  - `inbound` VerificationInboundBody, required
    - `tg_link` string, required: t.me deep link that confirms the user in the Telegram bot, empty when no bot is available
    - `wa_link` string, required: wa.me link the user taps to send the code, empty when no WhatsApp slot is connected
  - `inbound_link` string, required: wa.me link for inbound verifications, empty otherwise
  - `locale` string, required
  - `max_attempts` integer, required
  - `mode` 'outbound' | 'inbound' | 'relay' | 'login', required: relay: the code came from an auth provider such as Supabase, which also checks it; login: an OTP Run sign-in code
  - `project_id` integer, required
  - `sent_at` string, date-time, nullable, required
  - `slot_id` string, nullable, required
  - `status` 'pending' | 'sent' | 'delivered' | 'verified' | 'failed' | 'expired' | 'canceled' | 'locked', required
  - `to_phone` string, required: E.164 recipient, empty for inbound verifications without an expected phone
  - `verified_at` string, date-time, nullable, required

## Other responses

- `409`: Conflict
- `422`: Unprocessable Entity
- `429`: Too Many Requests
- `500`: Internal Server Error

---

[API](https://skmtc.dev/otprun/apis/otp-run-api.md) · [All operations](https://skmtc.dev/otprun/apis/otp-run-api/llms.txt) · [OpenAPI document](https://skmtc.dev/otprun/apis/otp-run-api/revisions/43d40d5f4050?raw)
