POST/v1/otp/resend
Send a one-time password again
Sends the same code again and extends its expiry, under a cooldown and a per-OTP send ceiling. The code your user may already have received stays valid. Note the message body is the gateway default, not the template you passed to POST /v1/otp/send — a template is not stored, so pass it on every send if the wording matters to you.
AuthenticationDevice token
Response
200 — Accepted. The same code is on its way again and `expiresAt` has moved forward.
{
"status": true,
"otpId": "",
"expiresAt": "2026-09-04T09:12:03Z",
"messageId": ""
}| Field | Type | Description |
|---|
status | true | Always true on a successful request. |
otpId | string | The id of this one-time password. Pass it back to POST /v1/otp/verify — verification is by id, never by phone number. |
expiresAt | string | When the code stops being accepted, ISO 8601. A resend moves this forward. |
messageId | string | The message carrying the code. Follow it with GET /v1/messages/{id} or the message.status webhook to tell "never delivered" apart from "typed wrong". |
Failure modes
Every failure answers with the same envelope: { "status": false, "reason": "…" }. Match on reason, never on the status alone — the full vocabulary is on the Errors page.
| Field | Type | Description |
|---|
400 | error | The one-time password is no longer pending, or the device is not connected. |
401 | error | The token is missing, malformed or revoked. |
403 | error | An account token was used; resending needs the device token. |
404 | error | No one-time password with that id belongs to this device. |
429 | error | Still inside the 60-second cooldown, or this code has already been sent the maximum number of times. Wait the seconds in retryAfter, or send a new code. |