Alphabet supports two MFA methods: a TOTP authenticator app (such as Google Authenticator or Authy) and OTP delivery over email or SMS. Once you enable either method, a standardDocumentation Index
Fetch the complete documentation index at: https://alphabet-06152314.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
POST /api/v1/auth/login call no longer returns your access and refresh tokens directly — instead it returns a short-lived mfaToken that you exchange for tokens by completing the MFA challenge.
All MFA enrollment endpoints require an authenticated session. Complete registration and login before enabling MFA.
Authenticator app (TOTP)
Start enrollment
Call Response —
POST /api/v1/auth/mfa/enable-authenticator. The response contains an authenticatorUri (an otpauth:// URI you can render as a QR code) and a manualEntryKey for users who cannot scan a QR code.200 OKScan the QR code or enter the manual key
Open your authenticator app and either scan the QR code you rendered from
authenticatorUri or manually type in the manualEntryKey. Your app will start generating 6-digit TOTP codes.Verify and complete enrollment
Submit the 6-digit code from your authenticator app to Request bodyResponse —
POST /api/v1/auth/mfa/verify-authenticator. On success, TOTP MFA is fully enabled and the response returns your recovery codes.200 OKOTP delivery
Enable OTP
Call Request body
POST /api/v1/auth/mfa/enable-otp to request that a one-time code be sent to you through the configured delivery channel (email or SMS). A 200 OK response means the code is on its way.MFA login flow
Once MFA is enabled, the login process takes two steps instead of one.Log in as normal
Call Response —
POST /api/v1/auth/login with your email and password. Because MFA is active, the response returns an mfaToken instead of a full token pair. This token is valid for 5 minutes.200 OKComplete the MFA challenge
Submit the Request bodyResponse — Set
mfaToken and the current 6-digit code from your authenticator app (or the OTP you received) to POST /api/v1/auth/mfa/login. On success you receive the normal accessToken and refreshToken pair.200 OKuseCookies: true to receive HttpOnly cookies instead of tokens in the response body. See the authentication overview for details.You can use a recovery code in place of a TOTP or OTP code in the
verificationCode field. Each recovery code is valid for a single use.Recovery codes
Recovery codes let you sign in when you cannot access your MFA device.View current recovery codes
GET /api/v1/auth/mfa/recovery-codes returns your currently active codes. Requires a valid Authorization header.
200 OK
Regenerate recovery codes
If your codes are compromised or you have used most of them, callPOST /api/v1/auth/mfa/recovery-codes/regenerate. This immediately invalidates all existing codes and returns a fresh set of 10.
200 OK
Troubleshooting
OTP code is not arriving
OTP code is not arriving
Check that
EmailSettings (SMTP server, API key, from address) and SmsSettings (AccountSid, AuthToken, FromNumber) are correctly configured in appsettings.json. Also confirm that the Communication.EnabledChannels list includes the channel you are using (Email or Sms).OTP verify returns 400
OTP verify returns 400
OTP codes expire after 5 minutes (
MfaSettings.OtpExpiryMinutes). If verification fails, confirm the cache provider is running correctly — OTP codes are stored in the configured cache backend. Also verify that your server clock is synchronized (NTP) because TOTP codes are time-based.Authenticator code is always invalid
Authenticator code is always invalid
TOTP codes depend on accurate system time. Ensure the server and authenticator device clocks are synchronized within 30 seconds. If your authenticator app has a “sync clock” option, use it.
Account is locked after failed attempts
Account is locked after failed attempts
After 5 consecutive failed login attempts the account is locked for 5 minutes (
LockoutSettings.MaxFailedAttempts, LockoutSettings.LockoutDurationMinutes). An administrator can unlock the account immediately using POST /api/v1/admin/users/{userId}/unlock.