---
title: "Results"
url: "https://developer.incode.com/sdk-reference/ios-results/"
section: "sdk-reference"
group: "iOS SDK"
version: "v1.1"
status: "live"
---
# Results

Every module in an onboarding flow reports its outcome to your `IncdOnboardingDelegate`. Most modules deliver a **result object** through a dedicated callback. A few modules signal completion without a result object: for example, [Video Conference](/sdk-reference/module-conference/) reports a success `Bool` and an optional error.

This page lists every result and error object. The groups match the categories on [Modules](/sdk-reference/ios-individual-modules/). For the full field list of a result type, see its module page.

The flow's terminal callbacks are `onSuccess()` when the flow finishes, `userCancelledSession()` when the user cancels, and `onError(_:)` when it fails.

***

## Result Delivery

Results arrive on the module's success callback, such as `onIdProcessed(_ result: IdProcessResult)`. `IncdOnboardingDelegate` declares all of these result callbacks. The SDK also defines narrower delegate protocols for specific scenarios:

- `IDCaptureControllerDelegate`: Real-time callbacks while capturing an ID.
- `IncdLoginDelegate`: Face-login sync progress.
- `IncdOnboardingVideoConferenceDelegate`: Assisted-video-conference callbacks.

The iOS SDK has no single shared status type. Each result struct carries its own fields describing the module's outcome. For example, `GovernmentValidationResult` exposes `success: Bool` and `error: IncdError?`, while `IdScanResult` exposes `scanStatus: IncdIdScanStatus` (an enum with cases such as `ok`, `errorGlare`, and `errorSharpness`). See [each individual module's page](/sdk-reference/ios-individual-modules/).

A few modules do not return a result object. They signal completion with a callback that carries only a status: for example, `onVideoConferenceCompleted(_ success: Bool, _ error: VideoConferenceError?)`.

***

## Error Delivery

Errors surface on the shared `onError(_ error: IncdFlowError)` path. `IncdFlowError` is a single enum with cases such as `initError(_:)`, `error(_:)` (wrapping an `IncdError`), `sessionCreationFailed(_:)`, `permissionsDenied`, `declinedToSignDocument`, `captchaNotVerified(_:)`, `videoSelfieNotCompleted(_:)`, `sectionAlreadyRunning(_:)`, `watchlistProcessFailed(_:)`, and `interrupted`.

Flow-level failures are reported through `IncdFlowError` on `onError(_:)`. In addition, several modules define their own error enum, carried by the `error` field of that module's result object: for example, `VideoSelfieResult.error` (`VideoSelfieError`), `IdScanResult.error` (`IncdIdScanError`), and `FaceAuthenticationResult.error` (`FaceAuthenticationError`). When a result object has such an `error` field, it carries that module's specific failure cause for the step.



### Face Capture and Face Authentication Video Recording Errors

`SelfieScanResult` and `FaceAuthenticationResult` gain a new optional field:

```swift
public var videoRecordingError: SelfieScanError?          // on SelfieScanResult
public var videoRecordingError: FaceAuthenticationError?  // on FaceAuthenticationResult
```

`SelfieScanError` and `FaceAuthenticationError` each gain a new case:

```swift
case insufficientStorageForVideoRecording  // new
```

The case is reported when Deepsight video recording is skipped because the device has less than 15 MB of free storage. It is non-fatal: the face capture itself completes normally, and the skip is surfaced only via `videoRecordingError`. The `error` field remains reserved for terminal failures, so existing error handling is unaffected. If you `switch` exhaustively over `SelfieScanError` or `FaceAuthenticationError`, add a handler for this case.



***

## Collect Identity Data

| Module                                                                                   | Result Object        | Delivered Via                                                                                                                                                                                                  |
| ---------------------------------------------------------------------------------------- | -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [Document Capture](/sdk-reference/module-document-scan/) | `DocumentScanResult` | `onDocumentScanCompleted(_ result: DocumentScanResult)`                                                                                                                                                        |
| [Dynamic Forms](/sdk-reference/module-dynamic-forms/)    | `DynamicFormsResult` | `onDynamicFormCompleted(_ result: DynamicFormsResult)`                                                                                                                                                         |
| [Email](/sdk-reference/module-email/)                    | `EmailAddressResult` | `onAddEmailAddressCompleted(_ result: EmailAddressResult)`                                                                                                                                                     |
| [Full Name](/sdk-reference/module-full-name/)            | `UserNameInfoResult` | `onAddFullNameCompleted(_ result: UserNameInfoResult)`                                                                                                                                                         |
| [Geolocation](/sdk-reference/module-geolocation/)        | `GeolocationResult`  | `onGeolocationCompleted(_ result: GeolocationResult)`                                                                                                                                                          |
| [ID Capture](/sdk-reference/module-id-scan/)             | `IdScanResult`       | `onIdFrontCompleted(_ result: IdScanResult)`<br />`onIdFrontAttemptCompleted(_ result: IdScanResult)`<br />`onIdBackCompleted(_ result: IdScanResult)`<br />`onIdBackAttemptCompleted(_ result: IdScanResult)` |
| [ID OCR](/sdk-reference/module-id-info/)                 | `OcrResult`          | `onOcrCompleted()`                                                                                                                                                                                             |
| [NFC](/sdk-reference/module-nfc-scan/)                   | `NFCScanResult`      | `onNFCScanCompleted(_ result: NFCScanResult)`                                                                                                                                                                  |
| [Phone](/sdk-reference/module-phone/)                    | `PhoneNumberResult`  | `onAddPhoneNumberCompleted(_ result: PhoneNumberResult)`                                                                                                                                                       |
| [QR Scan](/sdk-reference/module-qr-scan/)                | `QRScanResult`       | `onQRScanCompleted(_ result: QRScanResult)`                                                                                                                                                                    |
| [Selfie](/sdk-reference/module-selfie/)                  | `SelfieScanResult`   | `onSelfieScanCompleted(_ result: SelfieScanResult)`<br />`onSelfieAttemptCompleted(_ result: SelfieScanResult)`                                                                                                |
| [Video Selfie](/sdk-reference/module-video-selfie/)      | `VideoSelfieResult`  | `onVideoSelfieCompleted(_ result: VideoSelfieResult)`                                                                                                                                                          |

### Module-Specific Errors

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

- **Selfie**: `SelfieScanResult.error` remains the terminal selfie failure. `SelfieScanResult.videoRecordingError` reports a non-fatal Deepsight recording problem independently. If the device has less than 15 MB of free storage, capture continues without video and `videoRecordingError` is `insufficientStorageForVideoRecording`.
- **Video Selfie**: Unlike most modules, a Video Selfie failure ends the flow. `VideoSelfieResult.error` (`VideoSelfieError`) is delivered through `onVideoSelfieCompleted(_:)` whenever captured video or audio data exists; if `error` is non-`nil`, the SDK additionally calls `onError(_:)` with `IncdFlowError.videoSelfieNotCompleted(_:)`, wrapping that same `VideoSelfieError`. Cases include `videoSelfieNotAuthorized`, `screenRecordingPermissionsDenied`, `recordingMicrophonePermissionsDenied`, `voiceConsentMicrophonePermissionsDenied`, `internalError(_:)`, and `error(_:)` (wrapping an `IncdError`).

***

## Verify and Authenticate

| Module                                                                                                | Result Object                 | Delivered Via                                                           |
| ----------------------------------------------------------------------------------------------------- | ----------------------------- | ----------------------------------------------------------------------- |
| [Antifraud](/sdk-reference/module-antifraud/)                         | `AntifraudResult`             | `onAntifraudCompleted(_ result: AntifraudResult)`                       |
| [CURP Validation](/sdk-reference/module-curp-validation/)             | `CURPValidationResult`        | `onCURPValidationCompleted(_ result: CURPValidationResult)`             |
| [Custom Watchlist](/sdk-reference/module-custom-watchlist/)           | `CustomWatchlistResult`       | `onCustomWatchlistCompleted(_ result: CustomWatchlistResult)`           |
| [eKYB (electronic Know-Your-Business)](/sdk-reference/module-ekyb/)   | `EkybResult`                  | `onExternalValidationEkybCompleted(_ result: EkybResult)`               |
| [eKYC (electronic Know-Your-Customer)](/sdk-reference/module-ekyc/)   | `EKYCResult`                  | `onEKYCCompleted(_ result: EKYCResult)`                                 |
| [Face Authentication](/sdk-reference/module-face-authentication/)     | `FaceAuthenticationResult`    | `onFaceAuthenticationCompleted(_ result: FaceAuthenticationResult)`     |
| [Face Match](/sdk-reference/module-face-match/)                       | `FaceMatchResult`             | `onFaceMatchCompleted(_ result: FaceMatchResult)`                       |
| [Global Watchlist](/sdk-reference/module-global-watchlist/)           | `GlobalWatchlistModuleResult` | `onGlobalWatchlistCompleted(_ result: GlobalWatchlistModuleResult)`     |
| [Government Validation](/sdk-reference/module-government-validation/) | `GovernmentValidationResult`  | `onGovernmentValidationCompleted(_ result: GovernmentValidationResult)` |
| [Process ID](/sdk-reference/module-process-id/)                       | `IdProcessResult`             | `onIdProcessed(_ result: IdProcessResult)`                              |

### Module-Specific Errors

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

- **Face Authentication**: `FaceAuthenticationError` is a dedicated face-authentication error enum, carried by the `error` field of `FaceAuthenticationResult`. Its cases include `spoofAttemptDetected(_:)`, `userIsNotRecognized(_:)`, `faceMaskDetected(_:)`, `deniedCameraPermissions`, `userCancelled`, and `error(_:)` (wrapping an `IncdError`). `FaceAuthenticationResult.videoRecordingError` separately reports non-fatal Deepsight recording problems. If the device has less than 15 MB of free storage, authentication continues without video and `videoRecordingError` is `insufficientStorageForVideoRecording`.

***

## Capture Signatures and Consent

These modules' errors surface on the shared `onError(_:)` path.

| Module                                                                                                      | Result Object                  | Delivered Via                                                               |
| ----------------------------------------------------------------------------------------------------------- | ------------------------------ | --------------------------------------------------------------------------- |
| [AES (Advanced Electronic Signature)](/sdk-reference/module-aes/)           | `AESResult`                    | `onAESCompleted(result: AESResult)`                                         |
| [Combined Consent](/sdk-reference/module-combined-consent/)                 | `CombinedConsentResult`        | `onCombinedConsentsGiven(_ result: CombinedConsentResult)`                  |
| [Machine Learning Consent](/sdk-reference/module-machine-learning-consent/) | `MachineLearningConsentResult` | `onMachineLearningConsentCompleted(_ result: MachineLearningConsentResult)` |
| [QES (Qualified Electronic Signature)](/sdk-reference/module-qes/)          | `QESResult`                    | `onQESCompleted(result: QESResult)`                                         |
| [Signature](/sdk-reference/module-signature/)                               | `SignatureFormResult`          | `onSignatureCollected(_ result: SignatureFormResult)`                       |
| [User Consent](/sdk-reference/module-user-consent/)                         | `UserConsentResult`            | `onUserConsentGiven(_ result: UserConsentResult)`                           |

***

## Add Human-Assisted Verification

This module's errors surface on the shared `onError(_:)` path.

| Module                                                                                | Result Object      | Delivered Via                                                                                                                                                                                                            |
| ------------------------------------------------------------------------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| [Video Conference](/sdk-reference/module-conference/) | No result payload. | `onVideoConferenceCompleted(_ success: Bool, _ error: VideoConferenceError?)`. Queue updates arrive through `onQueuePositionChanged(_ newQueuePosition: Int)` and `onEstimatedWaitingTime(_ waitingTimeInSeconds: Int)`. |

***

## Configure the User Experience

This module's errors surface on the shared `onError(_:)` path.

| Module                                                                                | Result Object      | Delivered Via                                                                                                                                                                                                                                                               |
| ------------------------------------------------------------------------------------- | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [Custom Module](/sdk-reference/module-custom-module/) | No result payload. | `onCustomModuleStarted(callbackName: String, onCustomModuleCompleted: @escaping (CustomModuleStatus) -> Void)`. You return a `CustomModuleStatus`: `ok`, `fail`, `warn`, or `unknown`. Completion is also reported through `onCustomModuleCompleted(_ result: IncdError?)`. |

***

## View Results

This module's errors surface on the shared `onError(_:)` path.

| Module                                                                    | Result Object | Delivered Via                             |
| ------------------------------------------------------------------------- | ------------- | ----------------------------------------- |
| [Results](/sdk-reference/module-results/) | `UserScore`   | `onUserScoreFetched(_ result: UserScore)` |

***

## Configure iOS-Specific Experiences

| Module                                                                      | Result Object      | Delivered Via                                                                                                                                                                                                |
| --------------------------------------------------------------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| [Approval](/sdk-reference/module-approval/) | `ApprovalResult`   | `onApproveCompleted(_ result: ApprovalResult)`                                                                                                                                                               |
| [Captcha](/sdk-reference/module-captcha/)   | `CaptchaResult`    | `onCaptchaCompleted(_ result: CaptchaResult)`                                                                                                                                                                |
| [Intro](/sdk-reference/module-intro/)       | No result payload. | On success, the flow advances to the next module with no callback. If the user dismisses the step, `userCancelledSession()` is called; any other failure surfaces through `onError(_ error: IncdFlowError)`. |

<br />