Skip to main content
POST
Resend a PIN
Use this when the user says they never got the code, or when the PIN has expired and you want to keep them in the same flow rather than starting over.
A resend is not a re-delivery of the earlier code. The PIN is only ever stored hashed, so there is no original to send again — every resend generates a new PIN and resets its expiry and its attempt allowance. Any code the user is still holding stops working the moment this call succeeds.

Switching channel

The most useful thing about a resend is that it does not have to use the channel the original went out on. If SMS was rejected, resend on WhatsApp against the same pinId:
Request
Omit channels to reuse the original send’s channels.

Cooldown

Each template sets a resendCooldown. A resend inside that window is rejected with resend_cooldown (429) — surface a “try again in a moment” state rather than retrying automatically. Read the current value off List templates. The PIN must also still be resendable: a PIN that is already verified returns pin_already_verified, and one whose attempts are exhausted returns pin_blocked. Both are 409 — start a new send instead.

Authorizations

Authorization
string
header
required

An API key from the OneXtel portal, Developers → API Keys, sent as Authorization: Bearer <key>.

Headers

Idempotency-Key
string

Protects a send/resend against duplicate dispatch on retry. Replaying the same key + body within 24h returns the original response verbatim; the same key with a different body is rejected (idempotency_key_reuse); a concurrent request with the same key still in flight is rejected (idempotency_in_progress).

Path Parameters

pinId
string
required
Example:

"pin_x9k2m1qz"

Body

application/json
channels
enum<string>[]

Channels to resend on. Omit to reuse the channels of the original send.

Minimum array length: 1
Available options:
sms,
whatsapp,
email
Example:
templateParams
object

Per-send override for a WhatsApp template's non-OTP placeholders, by position. Omitted positions fall back to the template's stored default.

Example:

Response

At least one channel accepted the message.

pinId
string
Example:

"pin_x9k2m1qz"

status
enum<string>
Available options:
PENDING,
VERIFIED,
EXPIRED,
BLOCKED
Example:

"PENDING"

expiresAt
string<date-time>
Example:

"2026-08-04T10:22:03.221Z"

attemptsRemaining
integer
Example:

3

channels
object[]