Request a code, receive it by email or SMS, enter it once — done. Each code expires after ten minutes and works exactly once. The system automatically locks out anyone who tries too many wrong guesses, making it impractical for attackers while staying completely invisible to real users.
Each delivery channel (email, SMS) has an independent 60-second cooldown between sends. Failed verification attempts are counted and trigger a lockout after a configurable threshold (default 5). Lockouts are per-user, per-channel, and stored in Redis — no database write per attempt. Cooldown and lockout periods are configurable per application.
Email OTPs are delivered via Resend (primary) with automatic fallback to Brevo. SMS OTPs are delivered via Mobile Labs or Twilio depending on tenant configuration. Provider selection is per-tenant, allowing different organizations to use different delivery infrastructure with no code changes.