> For the complete documentation index, see [llms.txt](https://docs.hyperswitch.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.hyperswitch.io/integrations/connectors-integrations/payouts/get-started-with-payouts/process-payouts-using-saved-payment-methods.md).

# Payouts with Saved Payment Methods

Store and reuse customer payment methods for payout processing using Hyperswitch's secure, PCI-compliant vault and token-based API flows.

Juspay Hyperswitch allows you to store payment method details in a secure, PCI-compliant card vault for subsequent payout processing. By utilizing stored credentials, you can programmatically list a customer's saved methods and retrieve a `payment_token` to initiate payouts without re-collecting sensitive information.

### Tokenizing Payment Methods

Payment methods are persisted in the [Hyperswitch Vault](https://docs.hyperswitch.io/explore-hyperswitch/workflows/vault) through two primary entry points:

* Pre-transaction storage: Create a payment method for a specific customer using the [/payment\_methods API](https://api-reference.hyperswitch.io/v1/payment-methods/paymentmethods--create). This action stores details directly in the secure locker.
* Post-transaction storage: Details are automatically vaulted following a successful transaction if specific flags are set:
  * For payments: Set `"setup_future_usage": "off_session"`.
  * For payouts: set `"recurring": true` **and send the customer**. Both are needed. The success handler at [`payouts.rs`](https://github.com/juspay/hyperswitch/blob/6fd72e5e6653326acaaf19b5f6aa76a524ff202e/crates/router/src/core/payouts.rs#L3123-L3142) saves to the locker only when `recurring` is set, no `payout_method_id` was supplied, and a `customer_id` is present.

    A payout with no customer still succeeds, and simply saves nothing. There is no error to catch, so the first sign of trouble is an empty list when you later go looking for the saved method. Send `customer` or `customer_id` on the create request whenever you intend to vault.

Reusing a vaulted method is the other half of this and is covered under [Recurring/Subsequent Payouts](#recurring-subsequent-payouts): pass the stored `payout_method_id` and set `confirm` to `true`. [`validate_create_request`](https://github.com/juspay/hyperswitch/blob/6fd72e5e6653326acaaf19b5f6aa76a524ff202e/crates/router/src/core/payouts/validator.rs#L77-L92) rejects a payout that supplies `payout_method_id` without `confirm: true`.

### Retrieving Saved Methods

To process a payout, fetch the identifiers for a customer's saved methods via the [List Payment Methods API](https://api-reference.hyperswitch.io/v1/payment-methods/payment-method--retrieve#payment-method-retrieve). The response includes a `payment_token`.

### Executing the Payout

The field names differ between the two calls. The list response calls it `payment_token`; [Payouts Create](https://api-reference.hyperswitch.io/v1/payouts/payouts--create#payouts-create) has no `payment_token` field. Send that value as **`payout_token`** instead.

There are two ways to reference a vaulted method, and they are mutually exclusive. [`validate_create_request`](https://github.com/juspay/hyperswitch/blob/6fd72e5e6653326acaaf19b5f6aa76a524ff202e/crates/router/src/core/payouts/validator.rs#L171-L200) rejects a request carrying both.

Either way the request needs customer context. Supplying `payout_token` with no customer or `customer_id` is rejected with a missing-field error naming exactly that ([`validator.rs`](https://github.com/juspay/hyperswitch/blob/6fd72e5e6653326acaaf19b5f6aa76a524ff202e/crates/router/src/core/payouts/validator.rs#L211-L218)), and the `payout_method_id` path additionally checks that the stored method's `customer_id` matches.

* **`payout_token`**, the value the list response returned as `payment_token` ([`PayoutCreateRequest`](https://github.com/juspay/hyperswitch/blob/6fd72e5e6653326acaaf19b5f6aa76a524ff202e/crates/api_models/src/payouts.rs#L169)).
* **`payout_method_id`** ([`PayoutCreateRequest`](https://github.com/juspay/hyperswitch/blob/6fd72e5e6653326acaaf19b5f6aa76a524ff202e/crates/api_models/src/payouts.rs#L209)), which additionally needs `confirm: true`. The validator looks the stored method up and rejects the payout if its `customer_id` does not match the customer on the request.

### Setup and Integration

Utilize the Hyperswitch Dashboard and the specialized Postman collection to test vaulted payout flows.

* Sandbox Endpoint: `https://sandbox.hyperswitch.io`
* Dashboard: [app.hyperswitch.io](https://app.hyperswitch.io)
* Technical Reference: [Payouts API Reference](https://api-reference.hyperswitch.io/v1/payouts/payouts--create)

### Prerequisites

Before implementing saved payment method workflows, ensure the following:

* [Payout processors](https://docs.hyperswitch.io/explore-hyperswitch/connectors/payouts/get-started-with-payouts) are configured and active.
* An API Key is generated in the [Developers section](https://www.google.com/search?q=/docs/dashboard/developers) of the dashboard.
* The Merchant ID is retrieved from your [Dashboard home page](https://app.hyperswitch.io).

### Step-by-Step Implementation

#### Import Testing Collection

Download and import the [Saved Payment Methods Postman Collection](https://www.postman.com/hs-payouts/hyperswitch/collection/us5vnwo/payout-using-saved-payment-methods).

<figure><img src="https://2522436862-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F47COcdNQRd7FH3TBRipx%2Fuploads%2Fgit-blob-8c6d8e906e48470f902a04d5d4c8d99b586a2ba4%2Fimage%20(8)%20(1).png?alt=media" alt=""><figcaption><p>Import Postman collection</p></figcaption></figure>

#### Configure Environment

In the Variables tab of the collection, define the following global parameters:

* `baseUrl`: `https://sandbox.hyperswitch.io`
* `merchant_id`: Your unique identifier.
* `api_key`: Your secret API key.

<figure><img src="https://2522436862-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F47COcdNQRd7FH3TBRipx%2Fuploads%2Fgit-blob-18550d39adaf0583772b06989253fd6877b632f0%2Fimage%20(67).png?alt=media" alt=""><figcaption><p>Updating env variables in Postman collection</p></figcaption></figure>

#### Direct Vaulting

Follow the sequence to create a payment method and immediately utilize the resulting token for a payout.

#### Recurring/Subsequent Payouts

Follow the sequence to list existing customer payment methods and process a payout using a previously stored token.

{% content-ref url="/pages/9DaWKBGUiGgPLNki9T8T" %}
[Smart Router for Payouts](/integrations/connectors-integrations/payouts/get-started-with-payouts/route-your-payout-transactions-using-smart-router.md)
{% endcontent-ref %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.hyperswitch.io/integrations/connectors-integrations/payouts/get-started-with-payouts/process-payouts-using-saved-payment-methods.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
