Skip to content

Get users through verification without making them wait.

Deliver OTPs, login verification, password resets, and security alerts through a controlled messaging path with real-time status and fallback.

A verification code arriving on a phone beside a laptop, with the route that carried it drawn above

Every second of delivery friction becomes authentication friction.

Users do not distinguish between a messaging route and the product. When the code is late, duplicated, or sent to an unavailable channel, the login experience feels broken.

  • An auth request taking a low-latency route in under three seconds to an auto-expiring code

    Delay becomes drop-off

    A verification code that arrives after the user has switched screens or requested another code creates confusion and abandonment.

  • An idempotency guard turning three user taps into a single active verification code

    Uncontrolled retries create competing codes

    Repeated taps and network retries can issue duplicate sends unless the authentication and messaging states are coordinated.

  • A failed primary SMS route falling back automatically to WhatsApp or a voice OTP

    One unavailable route blocks access

    Carrier filtering, unsupported channels, or temporary route issues should not silently end the verification attempt.

Meet Sent: reliable delivery for the verification state your product owns.

A person reading a verification message that names the product, the code and how long it lasts

From verification request to confirmed access

Your authentication service owns the code and verification state. Sent delivers the approved message through the configured route and returns the status of every attempt.

Everything needed for a clear, observable verification flow.

Sent keeps message delivery fast, traceable, and recoverable while your authentication service remains the source of truth.

  • A verification message carrying the code, its expiry and a warning not to share it

    Deliver codes with clear context

    Use a dedicated template containing the code, expiry, product name, and a warning not to share it.

  • Repeated taps held behind a cooldown so only one active code is ever sent

    Control the resend experience

    Coordinate cooldowns, attempt limits, code invalidation, and idempotent requests so retries do not create ambiguity.

  • A timed-out SMS route moving down a defined channel order to WhatsApp or a voice OTP

    Fall back when a channel is unavailable

    Use a defined channel order so a verification attempt can move to another supported route when appropriate.

  • A delivery event arriving by webhook to update the interface and the support log

    Watch every attempt in real time

    Use message status webhooks to update the UI, enable recovery, and give support a clear failure reason.

Keep authentication logic and delivery logic correctly separated.

Give each system one clear responsibility, then connect the verification session and delivery record with stable identifiers.

Raw system data held inside the authentication service while only delivery variables travel onward

Security around every verification attempt.

  • Store keys in environment variables, separate them by environment, rotate them, and never expose them in browser or mobile code.

  • Check the signature on every delivery webhook before it is allowed to change a verification state, and drop any payload that does not pass.

  • Rate-limit verification requests per user and per number, so repeated or automated attempts are dropped before they reach a route.

API keys held server-side and separated by environment rather than exposed to the client

Frequently asked questions

Immediately. Once you verify your email and phone number, Sent gives you six pre-built OTP and verification templates. They are already approved on SMS, WhatsApp, and RCS, so no review is needed. Light onboarding allows up to 500 real sends per day per template. Custom templates follow once your full account setup is complete.

The code, how long it stays valid, your product name, and a warning not to share the code. Pass the code and expiry as template variables. On SMS, avoid emoji and curly quotes so the message stays within 160 characters and is billed as one SMS.

Let Sent choose: send without naming a channel. Sent then uses the best channel each user can receive, and if that channel can't deliver, it moves the same code to the next one, ending at SMS. Don't list several channels in one request, because Sent sends a separate code on each channel you list.

Your authentication service controls resends. It sets the waiting time between resends and the maximum number of attempts, and cancels the old code whenever it issues a new one. Each new code is a new Sent request. If your backend retries the same request because of a network error, an idempotency key stops Sent from sending a duplicate.

Store the Sent message ID with the verification session. Status webhooks then report when the code is queued, sent, delivered, or failed, with a reason code if it failed. Your screen can offer "try another way" as soon as a failure arrives. A delivered message doesn't mean the user verified; only your authentication service can confirm that.

Three IDs: your verification session ID, the request ID Sent returns with every API response, and the message ID. With those, support can look up the message's status, the channel it used, the reason code if it failed, and when each step happened. Together these show exactly where the attempt stopped.

Limit verification requests per user and per phone number in your own system, so automated or repeated attempts are dropped before they reach Sent. Keep your Sent API key on the server, never in browser or mobile code. Before any delivery webhook can change a verification state, check its signature to confirm it came from Sent.