---
title: User Journeys
description: Multi-step capture sessions orchestrated by the SDK based on the configured flow, such as selfie, document capture, and signature in a single session.
canonical: https://developer.unico.io/dual-api/developers/sdks-and-tools/ios/capture-flow/capture-types/user-journeys
locale: en
generated_by: markdown-export
---

User Journeys are multi-step capture sessions orchestrated by the SDK in conjunction with the configured flow. For example, a flow with Liveness + Risk Score + Document Capture + Electronic Signature executes selfie, document capture, and signature in a single session.

:::secondary[Products]
The available journeys depend on the flow configured for your integration. Refer to [Products](/products) for the full mapping of product → flow → capability.
:::

## How it works

The SDK:

1. Reads the flow configuration provided during initialization.
2. Orchestrates the sequence of captures required for the flow (selfie, document, signature).
3. Returns a `processId` via `onSuccess` when the journey completes. For the selfie step, image data (`base64` / `encrypted`) is also returned via `onSuccessSelfie`. Document and signature captures are processed internally by the SDK — no per-step artifact is exposed to the client.

The orchestration is handled entirely by the SDK — you do not need to implement the step sequence in your app.

## Starting a User Journey

****Step 2** — Implement `AcessoBioSelfieDelegate`**

Override the methods to handle the journey capture result callbacks:

  | Method | Description |
  |---|---|
  | `onSuccessSelfie(result)` | Image captured successfully — returns `SelfieResult` for subsequent REST API calls |
  | `onSuccess(result)` | Journey completed successfully — returns a `processId` used to query validation results |
  | `onErrorSelfie(errorBio)` | Capture failed — returns an `ErrorBio` with error details |

  ### Swift

    ```swift
    class ViewController: UIViewController, AcessoBioManagerDelegate,
      SelfieCameraDelegate, AcessoBioSelfieDelegate {

      func onSuccessSelfie(_ result: SelfieResult!) { }
      func onSuccess(_ result: SuccessResult!) { }
      func onErrorSelfie(_ errorBio: ErrorBio!) { }
    }
    ```

### Objective-C

    ```objectivec
    @interface ViewController: UIViewController <AcessoBioManagerDelegate,
      SelfieCameraDelegate, AcessoBioSelfieDelegate>
    @end

    @implementation ViewController
    - (void)onSuccessSelfie:(SelfieResult *)result { }
    - (void)onSuccess:(SuccessResult *)result { }
    - (void)onErrorSelfie:(ErrorBio *)errorBio { }
    @end
    ```

****Step 3** — Call `prepareSelfieCamera` and `open`**

Call `prepareSelfieCamera` passing the SDK config. When the camera is ready, the `onCameraReady` event is triggered — open the camera through the `open()` method, passing the `webAppToken`:

  :::info[webAppToken]
  The `webAppToken` is the `process.webAppToken` field returned by `POST /client/v1/process` when creating the process on your backend. See [Create Process](/dual-api/developers/api-reference/web-sdk/post-process).
  :::

  - `onCameraReady(cameraOpener)` — camera is ready; call `open(self, webAppToken:)`.
  - `onCameraFailed(message)` — camera preparation failed (`ErrorPrepare` is an extension of `ErrorBio`).

  ### Swift

    ```swift
    @IBAction func openCamera(_ sender: Any) {
      unicoCheck.build().prepareSelfieCamera(self, config: YourUnicoConfigClass())
    }

    func onCameraReady(_ cameraOpener: AcessoBioCameraOpenerDelegate!) {
      cameraOpener.open(self, webAppToken: "your_web_app_token")
    }

    func onCameraFailed(_ message: ErrorPrepare!) { }
    ```

### Objective-C

    ```objectivec
    - (IBAction)openCamera:(UIButton *)sender {
        [[unicoCheck build] prepareSelfieCamera:self config:[YourUnicoConfigClass new]];
    }

    - (void)onCameraReady:(id)cameraOpener {
        [cameraOpener open:self webAppToken:@"your_web_app_token"];
    }

    - (void)onCameraFailed:(ErrorPrepare *)message { }
    ```

For the full result handling, see [Receiving the result](/developers/sdks-and-tools/ios/capture-flow/receiving-the-result).