> ## Documentation Index
> Fetch the complete documentation index at: https://primer.io/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# startPaymentFlow

Starts the payment flow for the vaulted payment method. You can get the `id` from any instance of `PrimerVaultedPaymentMethod`
returned by [fetchVaultedPaymentMethods](/sdk/android/v2.x.x/primer-headless-checkout/vault-manager/fetchVaultedPaymentMethods).

Upon a successful invocation of this function, the SDK will automatically trigger the standard payment [callbacks](/sdk/android/v2.x.x/primer-headless-checkout/listeners/PrimerHeadlessUniversalCheckoutListener).

## Without additional data

```kotlin KOTLIN theme={"dark"}
suspend fun startPaymentFlow(vaultedPaymentMethodId: String): Result<Unit>
```

### Parameters

<Expandable title="Parameters" defaultOpen>
  <ResponseField name="vaultedPaymentMethodId" type="String" required>
    The `id` of a `PrimerVaultedPaymentMethod` previously retrieved with [fetchVaultedPaymentMethods](/sdk/android/v2.x.x/primer-headless-checkout/vault-manager/fetchVaultedPaymentMethods).
  </ResponseField>
</Expandable>

## With additional data

In certain cases, you can pass `additional data` when starting a payment flow. For example,
you might need to pass CVV which can be recommended to increase auth rates.

Make sure that `additionalData` is [validated](/sdk/android/v2.x.x/primer-headless-checkout/vault-manager/validate) before being passed to this method.

```kotlin KOTLIN theme={"dark"}
suspend fun startPaymentFlow(
    vaultedPaymentMethodId: String,
    additionalData: PrimerVaultedPaymentMethodAdditionalData
): Result<Unit>
```

### Parameters

<Expandable title="Parameters" defaultOpen>
  <ResponseField name="vaultedPaymentMethodId" type="String" required>
    The `id` of a `PrimerVaultedPaymentMethod` previously retrieved with [fetchVaultedPaymentMethods](/sdk/android/v2.x.x/primer-headless-checkout/vault-manager/fetchVaultedPaymentMethods).
  </ResponseField>

  <ResponseField name="additionalData" type="PrimerVaultedPaymentMethodAdditionalData" required>
    <Expandable title="Direct Subclasses">
      <ResponseField name="PrimerVaultedCardAdditionalData">
        <Expandable title="Properties" defaultOpen>
          <ResponseField name="cvv" type="String" required>
            CVV value associated with the vaulted card.
          </ResponseField>
        </Expandable>
      </ResponseField>
    </Expandable>
  </ResponseField>
</Expandable>

## Returns

The `startPaymentFlow` method initiates the payment process using the provided `vaultedPaymentMethodId`.
This method is responsible for beginning the payment flow associated with a specific payment method stored in the vault.
Returns a result object of type [Result](https://kotlinlang.org/api-reference/latest/jvm/stdlib/kotlin/-result/).

The Result class represents the outcome of the operation, indicating `success` or `failure`.

By inspecting the returned Result object, you can determine the success or failure of the starting payment process for the vaulted payment method.
This allows you to handle different scenarios based on the result.

<Expandable title="Results" defaultOpen>
  <ResponseField name="success">
    In case of successful operation result, SDK will return `Unit`.
  </ResponseField>

  <ResponseField name="failure">
    In case of unsuccessful operation result, as part of `Result` object SDK will return:

    <Expandable title="Exceptions" defaultOpen>
      <ResponseField name="InvalidVaultedPaymentMethodIdException">
        In case the id passed does not match any payment method previously retrieved by [fetchVaultedPaymentMethods](/sdk/android/v2.x.x/primer-headless-checkout/vault-manager/fetchVaultedPaymentMethods).
      </ResponseField>
    </Expandable>
  </ResponseField>
</Expandable>

## Example

Refer to the following example for [fetching](/sdk/android/v2.x.x/primer-headless-checkout/vault-manager/fetchVaultedPaymentMethods) vaulted payment methods.

### Without additional data

```kotlin KOTLIN theme={"dark"}
private fun startPaymentFlow(
  vaultedPaymentMethodId: String,
) {
  // 👇 start payment flow calling suspend function within the scope
  scope.launch {
    vaultManager.startPaymentFlow(vaultedPaymentMethodId).onSuccess {
      // listen to SDK callbacks
    }.onFailure { throwable ->
      // handle error
    }
  }
}
```

### With additional data

Refer to the following example for [validation](/sdk/android/v2.x.x/primer-headless-checkout/vault-manager/validate)
of the vaulted payment method additional data.

```kotlin KOTLIN theme={"dark"}
private fun startPaymentFlow(
  vaultedPaymentMethodId: String,
  additionalData: PrimerVaultedPaymentMethodAdditionalData
) {
  // 👇 start payment flow calling suspend function within the scope
  scope.launch {
    vaultManager.startPaymentFlow(vaultedPaymentMethodId, additionalData).onSuccess {
      // listen to SDK callbacks
    }.onFailure { throwable ->
      // handle error
    }
  }
}
```
