Documentation Index
Fetch the complete documentation index at: https://docs.privy.io/llms.txt
Use this file to discover all available pages before exploring further.
Unenrolling an MFA method requires MFA verification.
Allow users to remove previously enrolled MFA methods from their account.
React
React Native
Swift
Android
Privy allows users to delete MFA methods via the unenrollWithSms, unenrollWithTotp, and unenrollWithPasskey methods returned from the useMfaEnrollment hook:import {useMfaEnrollment} from '@privy-io/react-auth';
const {unenrollWithSms, unenrollWithTotp, unenrollWithPasskey} = useMfaEnrollment();
Unenrolling SMS
To remove SMS as an MFA method:Unenrolling TOTP
To remove TOTP as an MFA method:await unenrollWithTotp();
Unenrolling passkeys
To remove passkeys as an MFA method:await unenrollWithPasskey();
Complete example
Example unenrolling SMS/TOTP/passkey
import {useMfaEnrollment} from '@privy-io/react-auth';
export default function MfaUnenrollment() {
const {unenrollWithSms, unenrollWithTotp, unenrollWithPasskey} = useMfaEnrollment();
return (
<div>
<button onClick={unenrollWithSms}>Unenroll SMS</button>
<button onClick={unenrollWithTotp}>Unenroll TOTP</button>
<button onClick={unenrollWithPasskey}>Unenroll passkey</button>
</div>
);
}
Privy allows users to delete MFA methods via the unenrollMfa method returned from the useMfaEnrollment hook:import {useMfaEnrollment} from '@privy-io/expo';
const {unenrollMfa} = useMfaEnrollment();
Unenrolling SMS
To remove SMS as an MFA method:await unenrollMfa({method: 'sms'});
Unenrolling TOTP
To remove TOTP as an MFA method:await unenrollMfa({method: 'totp'});
Unenrolling passkeys
To remove passkeys as an MFA method:await unenrollMfa({method: 'passkey'});
By default, unenrolling a passkey will also unlink it as a valid login method. To modify this behavior, set the removeForLogin option to false:await unenrollMfa({method: 'passkey', removeForLogin: false});
Complete example
Example unenrolling SMS/TOTP/passkey
import {useMfaEnrollment} from '@privy-io/expo';
export default function MfaUnenrollment() {
const {unenrollMfa} = useMfaEnrollment();
return (
<YStack>
<Button onPress={() => unenrollMfa({method: 'sms'})}>
<Text>Unenroll SMS</Text>
</Button>
<Button onPress={() => unenrollMfa({method: 'totp'})}>
<Text>Unenroll TOTP</Text>
</Button>
<Button onPress={() => unenrollMfa({method: 'passkey'})}>
<Text>Unenroll passkey</Text>
</Button>
</YStack>
);
}
Privy allows users to unenroll from MFA methods via the unenroll method on each MFA namespace:guard let user = await privy.getUser() else { return }
// Unenroll from specific MFA methods
try await user.mfa.sms.unenroll()
try await user.mfa.totp.unenroll()
try await user.mfa.passkeys.unenroll()
Unenrolling SMS
To remove SMS as an MFA method:let updatedUser = try await user.mfa.sms.unenroll()
Unenrolling TOTP
To remove TOTP as an MFA method:let updatedUser = try await user.mfa.totp.unenroll()
Unenrolling passkeys
To remove passkeys as an MFA method:let updatedUser = try await user.mfa.passkeys.unenroll()
By default, unenrolling a passkey will also unlink it as a valid login method. To keep the passkey as a login method, set the removeForLogin parameter to false:let updatedUser = try await user.mfa.passkeys.unenroll(removeForLogin: false)
Privy allows users to unenroll from MFA methods via the unenroll method on each MFA namespace:val user = privy.getUser() ?: return
// Unenroll from specific MFA methods
user.mfa.sms.unenroll()
user.mfa.totp.unenroll()
user.mfa.passkeys.unenroll()
Unenrolling SMS
To remove SMS as an MFA method:user.mfa.sms.unenroll()
.onSuccess { updatedUser ->
// SMS MFA removed successfully
}
.onFailure { error ->
// Handle error
}
Unenrolling TOTP
To remove TOTP as an MFA method:user.mfa.totp.unenroll()
.onSuccess { updatedUser ->
// TOTP MFA removed successfully
}
.onFailure { error ->
// Handle error
}
Unenrolling passkeys
To remove passkeys as an MFA method:user.mfa.passkeys.unenroll()
.onSuccess { updatedUser ->
// Passkey MFA removed successfully
}
.onFailure { error ->
// Handle error
}
By default, unenrolling a passkey will also unlink it as a valid login method. To keep the passkey as a login method, set the removeForLogin parameter to false:user.mfa.passkeys.unenroll(removeForLogin = false)
.onSuccess { updatedUser ->
// Passkey MFA removed, but passkey still valid for login
}