# Results

Every module in an onboarding flow reports its outcome to your `IncodeWelcome.OnboardingListener`. Most modules deliver a **result object** through a dedicated callback. A few modules only signal completion, using a no-argument callback or a Boolean callback.

This page lists every result and error object. The groups match the categories on [Modules](https://developer.incode.com/docs/android-individual-modules). For the full field list of a result type, go to its module page or [API Reference](https://developer.incode.com/docs/android-api-reference).

Call `IncodeWelcome.deleteUserLocalData(context)` from `onSuccess()`, `onError(Throwable)`, and `onUserCancelled()` after you finish a session to [clean up local user data](https://developer.incode.com/docs/android-capture-only-sdk#clean-up-local-user-data).

***

## Result Delivery

Results arrive on the module's success callback, such as `onIdProcessed(IdProcessResult)`. `IncodeWelcome.OnboardingListener` declares this callback. Some callbacks also appear on narrower listener interfaces, such as `IdProcessListener` and `PhoneNumberListener`.

`ResultCode` is the shared status most result objects carry, typically inherited from `BaseResult`. It reports the module's outcome, such as `SUCCESS`, `ERROR`, `USER_CANCELLED`or `EMULATOR_DETECTED`. See `ResultCode` in [API Reference](https://developer.incode.com/docs/android-api-reference).

Some modules do not return a result object. They signal completion with a no-argument callback, such as `onUserConsentCompleted()`, or a Boolean callback, such as `onTaxIdValidationCompleted(boolean)`. When a related result type exists internally, the tables below name it so you can find its fields in [API Reference](https://developer.incode.com/docs/android-api-reference), even though the type is never passed to your listener.

***

## Error Delivery

Errors surface on the shared `OnboardingListener.onError(Throwable)` path. The throwable is a generic `Throwable` unless a module defines its own exception subtype. Each table's Module-Specific Errors section notes any exception types.

When a result object has an `error` field, that field carries the same failure cause for that step.

***

## Collect Identity Data

| Module                                    | Result Object              | Delivered Via                                                                                         |
| ----------------------------------------- | -------------------------- | ----------------------------------------------------------------------------------------------------- |
| [Document Scan](doc:module-document-scan) | `DocumentValidationResult` | `onDocumentValidationCompleted(DocumentType, DocumentValidationResult)`                               |
| [Dynamic Forms](doc:module-dynamic-forms) | `DynamicFormsResult`       | `onDynamicFormsCompleted(DynamicFormsResult)`                                                         |
| [Email](doc:module-email)                 | `EmailAddressResult`       | `onAddEmailCompleted(EmailAddressResult)`                                                             |
| [Geolocation](doc:module-geolocation)     | `GeolocationResult`        | `onGeolocationFetched(GeolocationResult)`; `onGeolocationUnavailable(Throwable)` when there is no fix |
| [ID Info](doc:module-id-info)             | `IdInfoResult`             | `onIdInfoCompleted(IdInfoResult)`                                                                     |
| [ID Scan](doc:module-id-scan)             | `IdScanResult`             | `onIdFrontCompleted(IdScanResult)` and `onIdBackCompleted(IdScanResult)`                              |
| [Name](doc:module-name)                   | `NameResult`               | `onAddNameCompleted(NameResult)`                                                                      |
| [NFC Scan](doc:module-nfc-scan)           | `NfcScanResult`            | `onNfcScanCompleted(NfcScanResult)`                                                                   |
| [Phone](doc:module-phone)                 | `PhoneNumberResult`        | `onAddPhoneCompleted(PhoneNumberResult)`                                                              |
| [QR Scan](doc:module-qr-scan)             | `QRScanResult`             | `onQRScanCompleted(QRScanResult)`                                                                     |
| [Selfie Scan](doc:module-selfie)          | `SelfieScanResult`         | `onSelfieScanCompleted(SelfieScanResult)`                                                             |
| [Video Selfie](doc:module-video-selfie)   | `VideoSelfieResult`        | `onVideoRecorded(VideoSelfieResult)`                                                                  |

### Module-Specific Errors

Unless noted below, a module's errors surface on the shared `onError` path.

- **Geolocation**: On `onGeolocationUnavailable`, `GeolocationUnavailableException` fires if there is no fix. `LocationPermissionDeniedException` fires if the user denies permission.
- **NFC Scan**: `MissingNfcDependencyException`, thrown when the `nfc` library dependency is absent.
- **QR Scan**: `QRCodeUploadException`, thrown when Incode cannot upload the decoded code.
- **Video Selfie**: `VideoSelfieException` subtypes: `SelfieNotMatchedException`, `AudioNotMatchedException`, `FacesNotMatchedException`, `MaxVideoLengthReachedException`, and `VideoUploadException`.

***

## Verify and Authenticate

| Module                                                    | Result Object                                           | Delivered Via                                             |
| --------------------------------------------------------- | ------------------------------------------------------- | --------------------------------------------------------- |
| [Antifraud](doc:module-antifraud)                         | `AntifraudResult`                                       | `onAntifraudCompleted(AntifraudResult)`                   |
| [CURP Validation](doc:module-curp-validation)             | `CurpValidationResult`                                  | `onCurpValidationCompleted(CurpValidationResult)`         |
| [Custom Watchlist](doc:module-custom-watchlist)           | `CustomWatchlistResult`                                 | `onCustomWatchlistProcessed(CustomWatchlistResult)`       |
| [eKYB (Electronic Know-Your-Business)](doc:module-ekyb)   | `EKYBResult`                                            | `onEKYBChecksCompleted(EKYBResult)`                       |
| [eKYC (Electronic Know-Your-Customer)](doc:module-ekyc)   | `EKYCResult`                                            | `onEKYCChecksCompleted(EKYCResult)`                       |
| [Face Authentication](doc:module-face-authentication)     | `FaceAuthenticationResult`                              | `onFaceAuthenticationCompleted(FaceAuthenticationResult)` |
| [Face Match](doc:module-face-match)                       | `FaceMatchResult`                                       | `onFaceMatchCompleted(FaceMatchResult)`                   |
| [Global Watchlist](doc:module-global-watchlist)           | `GlobalWatchlistResult`                                 | `onGlobalWatchlistProcessed(GlobalWatchlistResult)`       |
| [Government Validation](doc:module-government-validation) | No payload. Related type: `GovernmentValidationResult`. | `onGovernmentValidationCompleted(boolean success)`        |
| [Process ID](doc:module-process-id)                       | `IdProcessResult`                                       | `onIdProcessed(IdProcessResult)`                          |
| [Tax ID Validation](doc:module-tax-id-validation)         | No payload. Related type: `TaxIdValidationResult`.      | `onTaxIdValidationCompleted(boolean isSuccess)`           |

### Module-Specific Errors

Unless noted below, a module's errors surface on the shared `onError` path.

- **Face Authentication**: `FaceAuthenticationException`, carrying a `FaceAuthenticationErrorCode`, such as a detected spoof attempt.

## Capture Signatures and Consent

These modules' errors surface on the shared `onError` path.

| Module                                                          | Result object                                  | Delivered via                                                                                       |
| --------------------------------------------------------------- | ---------------------------------------------- | --------------------------------------------------------------------------------------------------- |
| [AES (Advanced Electronic Signature)](doc:module-aes)           | `AESResult`                                    | `onAESCompleted(AESResult)`                                                                         |
| [Combined Consent](doc:module-combined-consent)                 | `CombinedConsentResult`                        | `onCombinedConsentCompleted(CombinedConsentResult)`                                                 |
| [Machine Learning Consent](doc:module-machine-learning-consent) | `MachineLearningConsentResult`                 | `onMachineLearningConsentCompleted(MachineLearningConsentResult)`                                   |
| [QES (Qualified Electronic Signature)](doc:module-qes)          | `QESResult`                                    | `onQESCompleted(QESResult)`                                                                         |
| [Signature](doc:module-signature)                               | `SignatureFormResult`                          | `onSignatureCollected(SignatureFormResult)`                                                         |
| [User Consent](doc:module-user-consent)                         | No payload. Related type: `UserConsentResult`. | `onUserConsentCompleted()`, a no-argument callback. `onUserCancelled()` fires if the user declines. |

## Add Human-Assisted Verification

This module's errors surface on the shared `onError` path.

| Module                                               | Result object                                                                  | Delivered via                                                                                                        |
| ---------------------------------------------------- | ------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------- |
| [Conference (Assisted Video)](doc:module-conference) | No payload. Related type: `VideoConferenceResult`. Not passed to the callback. | `onConferenceEnded()`. Queue updates arrive through `onQueuePositionChanged(int)` and `onEstimatedWaitingTime(int)`. |

## Configure the User Experience

This module's errors surface on the shared `onError` path.

| Module                                    | Result object | Delivered via                                                                                                                                               |
| ----------------------------------------- | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [Custom Module](doc:module-custom-module) | No payload.   | `CustomModuleListener.onCustomModuleStarted(callbackName, onCustomModuleCompleted)`. You return a `CustomModuleStatus`: `OK`, `FAIL`, `WARN`, or `UNKNOWN`. |

## Configure Android-Specific Experiences

These modules' errors surface on the shared `onError` path.

| Module                                                | Result object                                        | Delivered via                                          |
| ----------------------------------------------------- | ---------------------------------------------------- | ------------------------------------------------------ |
| [Accept Video Selfie](doc:module-accept-video-selfie) | No payload. Related type: `AcceptVideoSelfieResult`. | `onUserAcceptedVideoSelfie()`, a no-argument callback. |
| [Approval](doc:module-approval)                       | `ApproveResult`                                      | `onApproveCompleted(ApproveResult)`                    |
| [Captcha](doc:module-captcha)                         | `CaptchaResult`                                      | `onCaptchaCollected(CaptchaResult)`                    |
| [Intro](doc:module-intro)                             | No payload.                                          | `onIntroCompleted()`, a no-argument callback.          |
| [Results](doc:module-results)                         | `UserScoreResult`                                    | `onResultsShown(UserScoreResult)`                      |

<br />
