---
title: Mobile SDK De-Enrollment
description: Learn how to use the PingOne Recognize Mobile SDK.
component: recognize
page_id: recognize:mobile-sdk:mobile-sdk-de-enrollment
canonical_url: https://docs.pingidentity.com/recognize/mobile-sdk/mobile-sdk-de-enrollment.html
llms_txt: https://docs.pingidentity.com/recognize/llms.txt
docs_for_agents: https://developer.pingidentity.com/build-with-ai/docs-for-agents.md
revdate: April 20, 2026
section_ids:
  quick-start: Quick Start
  android: Android
  ios: iOS
  android-4-6: Android 4.6
  ios-4-6: iOS 4.6
  flutter: Flutter
  react-native: React Native
  de-enrollment-configuration: De-Enrollment Configuration
  camera-delay: Camera Delay
  success-feedback: Success Feedback
  liveness-settings: Liveness Settings
---

# Mobile SDK De-Enrollment

De-enrollment is the biometric equivalent of account deletion. Keyless performs an [authentication](mobile-sdk-authentication.html) to compare the user's facial biometrics with the ones computed during [enrollment](mobile-sdk-enrollment.html). If the biometrics match, the user is authenticated and their account is removed from Keyless. This operation is **irreversible**.

## Quick Start

### Android

```kotlin
val configuration = BiomDeEnrollConfig()

Keyless.deEnroll(
    deEnrollmentConfiguration = configuration,
    onCompletion = { result ->
        when (result) {
            is Keyless.KeylessResult.Success -> Log.d("KeylessSDK ", "De-enroll success")
            is Keyless.KeylessResult.Failure -> Log.d("KeylessSDK ", "De-enroll failure - error code ${result.error.code}")
        }
    }
)
```

### iOS

```swift
let configuration = BiomDeEnrollConfig()
    .build()

Keyless.deEnroll(
    deEnrollmentConfiguration: configuration,
    onCompletion: { error in
        if let error = error {
              print("De-Enrollment finished with error: \(error.message)")
        } else {
              print("De-Enrollment finished with success")
        }
    }
)
```

### Android 4.6

```kotlin
val configuration = DeEnrollmentConfiguration.builder.build()

Keyless.deEnroll(
    deEnrollmentConfiguration = configuration,
    onCompletion = { result ->
        when (result) {
            is Keyless.KeylessResult.Success -> Log.d("KeylessSDK ", "De-enroll success")
            is Keyless.KeylessResult.Failure -> Log.d("KeylessSDK ", "De-enroll failure - error code ${result.error.code}")
        }
    }
)
```

### iOS 4.6

```swift
let configuration = Keyless.DeEnrollmentConfiguration.builder
    .build()

Keyless.deEnroll(
    deEnrollmentConfiguration: configuration,
    onCompletion: { error in
        if let error = error {
              print("De-Enrollment finished with error: \(error.message)")
        } else {
              print("De-Enrollment finished with success")
        }
    }
)
```

### Flutter

```dart
import 'package:keyless_flutter_sdk/keyless.dart';
import 'package:keyless_flutter_sdk/models/configurations/deenrollment_configuration.dart';

// Biometric de-enrollment
final configuration = BiomDeEnrollConfig(
    livenessConfiguration: LivenessConfiguration.passiveStandaloneHigh,
    livenessTimeout: 60,
    cameraDelaySeconds: 0
);

// Or PIN-based de-enrollment
final configuration = PinDeEnrollConfig(
    pin: "1234"
);

try {
    await Keyless.instance.deEnroll(configuration);
    print("De-enrollment successful");
} catch (error) {
    print("De-enrollment failed: $error");
}
```

### React Native

```javascript
import Keyless, {
  BiomDeEnrollConfig,
  PinDeEnrollConfig,
  LivenessConfiguration
} from '@react-native-keyless/sdk';

// Biometric de-enrollment
const biometricDeEnroll = async () => {
  const config = new BiomDeEnrollConfig();
  const result = await Keyless.deEnroll(config);
  result.fold({
    onSuccess: () => {
      console.log('De-enrollment successful');
    },
    onFailure: (error) => {
      console.error('De-enrollment failed:', error);
    },
  });
};

// PIN-based de-enrollment
const pinDeEnroll = async () => {
  const config = new PinDeEnrollConfig('1234');
  const result = await Keyless.deEnroll(config);
  result.fold({
    onSuccess: () => {
      console.log('De-enrollment successful');
    },
    onFailure: (error) => {
      console.error('De-enrollment failed:', error);
    },
  });
};
```

## De-Enrollment Configuration

### Camera Delay

Use `cameraDelaySeconds` to specify the delay (in seconds) between when the camera preview appears and when liveness processing starts.

### Success Feedback

Use `showSuccessFeedback` to show a `Success` text on top of the screen when de-enrollment is successful.

### Liveness Settings

Using `livenessConfiguration` you can configure the liveness security level during enrollment. The possible liveness configurations are under `LivenessSettings.LivenessConfiguration`:

```none
DEVELOPMENT
LEVEL_1        // recommended configuration
LEVEL_2
```

You can also specify `livenessEnvironmentAware`, which is by default set to `true`, to enhance liveness detection. This parameter helps ensure the user is in a suitable setting for verification.

More details on liveness are in the dedicated [Liveness Settings](mobile-sdk-liveness-settings.html) section.
