> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.coinflow.cash/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.coinflow.cash/_mcp/server.

# How To: Implement User Self-Custodial Wallet Payouts

> **Warning**
>
> **This page is for advanced / cryptocurrency-native companies.** If that's not you, head back to the [Quickstart](/guides/getting-started/quickstart) for the standard flows.

# User Self-Custodial Wallet Payout Guide

## Overview

This guide enables end-users to withdraw funds directly from their self-custodial crypto wallet to their bank account. You can implement this using either our React SDK for a pre-built UI or our API for a custom integration.

**Supported chains:** Solana, Ethereum, Base, Polygon, Arbitrum, Stellar

Stellar withdrawals support both USDC and token swaps (any Stellar asset swapped to USDC via the Stellar DEX, then converted to fiat).

---

## Prerequisites

#### User's Self-Custodial Wallet

End-user must have their own crypto wallet as the source of funds

#### Wallet Connection Capability

Ability to connect and interact with user wallets (e.g., via Web3 provider)

#### Transaction Signing

User wallet must be able to sign and send blockchain transactions

#### Choose Implementation Method

Select either React SDK (pre-built UI) or API (custom UI) implementation

---

## Implementation Guide

Choose your preferred implementation method:

### Option 1: React SDK Implementation (Recommended)

Use our pre-built React component for the fastest implementation with a complete UI.

### Step 1: Install Coinflow Package

Install the Coinflow React package:

```bash
npm i @coinflowlabs/react
```

### Step 2: Implement the CoinflowWithdraw Component

Add the `CoinflowWithdraw` component to your application:

```javascript
<CoinflowWithdraw
  wallet={{
    publicKey: new PublicKey('<Wallet Public Key>'),
    sendTransaction: (transaction: Transaction) => Promise<string>,
    signMessage: (message: string) => Promise<string>
  }}
  merchantId={"YOUR_MERCHANT_ID"} // This is the merchant Id you registered an account with
  env={"sandbox || prod"}
  onSuccess={(...args) => console.log('Withdraw Success', args)} // Function to run when the withdraw is successful
  blockchain={"solana"}
  email={"user-email@email.com"} // User's email (this will be prefilled)
	amount={1}
/>

```

### Step 3: Configure Webhooks

Configure withdraw webhooks to receive notifications when users complete KYC or any withdraw events. [View webhook reference](/guides/developer-resources/webhooks)

View all webhook activity from your merchant dashboard's 'Webhook Activity' tab.

---

### Option 2: API Implementation

Build a custom UI with full control over the user experience.

### Step 1: Generate a Session Key

[Generate a session key for the withdrawer](/api-reference/api-reference/authentication/get-session-key)

**Endpoint:** `GET /api/auth/session-key`

**`Request`**

```curl Request
curl --request GET \
     --url https://api-sandbox.coinflow.cash/api/auth/session-key \
     --header 'Authorization: YOUR_API_KEY' \
     --header 'accept: application/json' \
     --header 'x-coinflow-auth-blockchain: solana' \
     --header 'x-coinflow-auth-wallet: J97rU7NN7PvAqxsEMkjSchVs2HNrUT7SNXg54HQhpqqS'
```

**`Response`**

```json Response
{
  "key": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ3YWxsZXQiOiJKOTdyVTdOTjdQdkFxeHNFTWtqU2NoVnMySE5yVVQ3U05YZzU0SFFocHFxUyIsImJsb2NrY2hhaW4iOiJzb2xhbmEiLCJtZXJjaGFudElkIjoidGVzdHRlc3QiLCJpYXQiOjE3Mzc2NjU5NDcsImV4cCI6MTczNzc1MjM0N30.orgoNHZtQP25-sq2aACzDBwv9j0t0_DS7wvEKhR0nr8"
}
```

### Step 2: KYC/KYB Verification for Withdrawers

To complete a payout/withdraw, **every Withdrawer must complete verification** before they can proceed with a payout through Coinflow. Withdrawers only need to KYC the first time they withdraw and do not need to KYC again for any subsequent withdrawals.

**Choose your KYC implementation method:**

<details>
  <summary>
    **1. I want to use Coinflow for KYC**
  </summary>

  Merchants who want to use Coinflow for KYC should call [Register User](/api-reference/api-reference/withdraw/create-kyc).

  <details>
    <summary>
      U.S. Withdrawers
    </summary>

    **Endpoint:** `POST /api/withdraw/kyc`

    ```curl Request
    curl --location 'https://api-sandbox.coinflow.cash/api/withdraw/kyc' \
    --header 'Authorization: YOUR_API_KEY' \
    --header 'accept: application/json' \
    --header 'content-type: application/json' \
    --header 'x-coinflow-auth-user-id: usher' \
    --data-raw '{
      "info": {
        "email": "usher@atl.com",
        "firstName": "usher",
        "surName": "raymond",
        "physicalAddress": "2800 N Damen Ave",
        "city": "Chicago",
        "state": "IL",
        "zip": "60625",
        "country": "US",
        "dob": "19761014",
        "ssn": "1234"
      }
    }'
    ```

    ```json Response
    {
        "withdrawer": {
            "_id": "672400ead654e5cdd247b33f",
            "currency": "USD",
            "email": "usher@atl.com",
            "verification": {
                "status": "approved"
            }
        }
    }
    ```
  </details>

  <details>
    <summary>
      Non-U.S. Withdrawers
    </summary>

    **Endpoint:** `POST /api/withdraw/kyc`

    ```curl Request
    curl --request POST \
    --url https://api-sandbox.coinflow.cash/api/withdraw/kyc \
    --header 'Authorization: YOUR_API_KEY' \
    --header 'accept: application/json' \
    --header 'content-type: application/json' \
    --header 'x-coinflow-auth-user-id: dwaynejohnsongb123' \
    --data '{
      "merchantId": "testtest",
      "email": "dwaynejohnsongb@gmail.com",
      "country": "GB"
    }'
    ```

    ```json Response
    {
        "withdrawer": {
            "_id": "676091072cd3ae949702b0ea",
            "currency": "GBP",
            "email": "dwaynejohnsongb@gmail.com",
            "verification": {
                "status": "approved"
            }
        }
    }
    ```
  </details>
</details>

<details>
  <summary>
    **2. I am using my own KYC provider and I want to pass KYC data to Coinflow**
  </summary>

  Merchants who want to pass KYC data from their existing KYC provider can call our [Register User via Document](/api-reference/api-reference/withdraw/create-kyc-document) endpoint.

  **`Request`**

  ```curl Request
  curl --request POST \
  --url https://api-sandbox.coinflow.cash/api/withdraw/kyc-doc \
  --header 'accept: application/json' \
  --header 'content-type: multipart/form-data' \
  --header 'x-coinflow-auth-session-key: YOUR_SESSION_KEY' \
  --form email=dwaynejohnsonus@gmail.com \
  --form country=US \
  --form idType=ID_CARD \
  --form idFront='@1128061-ID_front.png' \
  --form idBack='@012e6a1-ID_back.png' \
  --form merchantId=testtest
  ```

  **`Response`**

  ```json Response
  {
    "withdrawer": {
      "_id": "67449b17d654e5cdd2925f1c",
      "currency": "USD",
      "email": "testtasha@coinflowlabs.app",
      "verification": {
        "status": "approved"
      }
    }
  }
  ```
</details>

<details>
  <summary>
    **3. I use Sumsub as my KYC provider and I want to share KYC data with Coinflow**
  </summary>

  Merchants who want to share Sumsub data with Coinflow will need to [enter a tri-party agreement](https://docs.sumsub.com/docs/reusable-kyc#enable-reusable-kyc-for-sdk) with Sumsub and Coinflow. **Reach out to the Coinflow team with your Sumsub client ID to get started.**

  Once this agreement has been signed, follow these steps:

  1. Call Sumsub's [Generate Share Token endpoint](https://docs.sumsub.com/api/generate-share-token) to obtain a token.
  2. Call our [Register User Via Share Token endpoint](/api-reference/api-reference/withdraw/create-kyc-share-token) to pass KYC data.

  **`Request`**

  ```curl Request
  curl --request POST \
  --url https://api-sandbox.coinflow.cash/api/withdraw/kyc/share-token \
  --header 'Authorization: YOUR_API_KEY' \
  --header 'accept: application/json' \
  --header 'content-type: application/json' \
  --header 'x-coinflow-auth-user-id: user123' \
  --data '{
    "vendor": "sumsub",
    "shareToken": "YOUR_SHARE_TOKEN",
    "country": "US",
    "merchantId": "testtest",
    "email": "testuser@test.com"
  }'
  ```

  **`Response`**

  ```json Response
  {
    "withdrawer": {
      "_id": "67449b17d654e5cdd2925f1c",
      "currency": "USD",
      "email": "testtasha@coinflowlabs.app",
      "verification": {
        "status": "approved"
      }
    }
  }
  ```
</details>

<details>
  <summary>
    **4. I have my own KYC provider and will complete KYC reliance process with Coinflow.**
  </summary>

  Merchants must [receive approval from the Coinflow Compliance team](/api-reference/api-reference/withdraw/create-kyc-attested) regarding approval of your KYC attestation program. Once you've receive approval, follow these implementation steps.

  **`Request`**

  ```curl Request
  curl --request POST \
       --url https://api-sandbox.coinflow.cash/api/withdraw/kyc/attested \
       --header 'Authorization: YOUR_API_KEY' \
       --header 'accept: application/json' \
       --header 'content-type: application/json' \
       --header 'x-coinflow-auth-user-id: user-id' \
       --data '
  {
    "email": "djohnson051972@gmail.com",
    "firstName": "Dwayne",
    "surName": "Johnson",
    "physicalAddress": "201 E Randolph St",
    "city": "Chicago",
    "state": "IL",
    "zip": "60601",
    "country": "US",
    "dob": "05021972",
    "ssn": "1234"
  }
  '
  ```

  **`Response`**

  ```json Response
  {
    "withdrawer": {
      "_id": "685d8a89e36b426f2df64069",
      "__v": 0,
      "availability": {
        "status": "Functional",
        "reason": "Initial",
        "editor": "system",
        "updatedAt": "2025-06-26T17:59:37.451Z"
      },
      "currency": "USD",
      "email": "djohnson051972@gmail.com",
      "merchant": "6840bca9c7cb21ee5baaae76",
      "originalCurrency": "USD",
      "riskScoreOverride": false,
      "user": true,
      "verification": {
        "hash": "ce749aa83c2efab20c4e1bfeca602f0674e1cf1b",
        "vendor": "persona",
        "reference": "ver_R6E6KrEK5rZN36Hd8d7gPaKg1cms",
        "status": "attested"
      },
      "wallets": [
        {
          "wallet": "user-id",
          "blockchain": "user"
        }
      ],
      "watchlistExempt": "Unknown"
    }
  }
  ```
</details>

### Step 3: Get Withdrawer Details

Call this endpoint after KYC to ensure the withdrawer's `verification.status = approved`. They must be approved before they can proceed further!

**Endpoint:** `GET /api/withdraw`

**`Request`**

```curl Request
curl --request GET \
     --url https://api-sandbox.coinflow.cash/api/withdraw \
     --header 'accept: application/json' \
     --header 'x-coinflow-auth-session-key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ3YWxsZXQiOiJKOTdyVTdOTjdQdkFxeHNFTWtqU2NoVnMySE5yVVQ3U05YZzU0SFFocHFxUyIsImJsb2NrY2hhaW4iOiJzb2xhbmEiLCJtZXJjaGFudElkIjoidGVzdHRlc3QiLCJpYXQiOjE3Mzc2NjU5NDcsImV4cCI6MTczNzc1MjM0N30.orgoNHZtQP25-sq2aACzDBwv9j0t0_DS7wvEKhR0nr8'
```

**`Response`**

```Text Response
{
  "withdrawer": {
    "_id": "6792ade0b59c605e85d20d2c",
    "__v": 0,
    "currency": "USD",
    "email": "hotstreakwithdrawer@gmail.com",
    "isBlocked": false,
    "merchant": "66311727a26b3cb28faaf97d",
    "originalCurrency": "USD",
    "riskScoreOverride": false,
    "user": true,
    "verification": {
      "hash": "2145ba11-38c3-4647-bbda-36c57a15c0e5",
      "vendor": "sumsub",
      "reference": "6792addd2d56406f20124132",
      "status": "approved"
    },
    "wallets": [
      {
        "wallet": "J97rU7NN7PvAqxsEMkjSchVs2HNrUT7SNXg54HQhpqqS",
        "blockchain": "solana"
      }
    ],
    "watchlistExempt": false,
    "bankAccounts": [],
    "cards": [],
    "ibans": [],
    "pixes": [],
    "rtpDisabled": false,
    "cardDisabled": false
  }
}
```

### Step 4: Add Payout Destinations

Enable end-users to link their bank accounts or payment methods. Choose the appropriate endpoint based on the user's location:

**For U.S. Users - Add Bank Account**

**Endpoint:** `POST /api/withdraw/account`

**`Request`**

```curl Request
curl --request POST \
     --url https://api-sandbox.coinflow.cash/api/withdraw/account \
     --header 'Authorization: YOUR_API_KEY' \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --header 'x-coinflow-auth-blockchain: solana' \
     --header 'x-coinflow-auth-wallet: J97rU7NN7PvAqxsEMkjSchVs2HNrUT7SNXg54HQhpqqS' \
     --data '
{
  "type": "checking",
  "address": {
    "address1": "85 E Wacker St",
    "city": "Chicago",
    "state": "IL",
    "zip": "60601"
  },
  "routingNumber": "888889999888",
  "accountNumber": "99999888899",
  "alias": "Test Account"
}
'
```

**`Response`**

```Text Response
{
  "withdrawer": {
    "_id": "6792ade0b59c605e85d20d2c",
    "__v": 0,
    "currency": "USD",
    "email": "hotstreakwithdrawer@gmail.com",
    "isBlocked": false,
    "merchant": "66311727a26b3cb28faaf97d",
    "originalCurrency": "USD",
    "riskScoreOverride": false,
    "user": true,
    "verification": {
      "hash": "2145ba11-38c3-4647-bbda-36c57a15c0e5",
      "vendor": "sumsub",
      "reference": "6792addd2d56406f20124132",
      "status": "approved"
    },
    "wallets": [
      {
        "wallet": "J97rU7NN7PvAqxsEMkjSchVs2HNrUT7SNXg54HQhpqqS",
        "blockchain": "solana"
      }
    ],
    "watchlistExempt": false,
    "bankAccounts": [
      {
        "alias": "Test Account",
        "token": "e19eb25f-e9bf-45f1-9ae4-9a0b054dac2e",
        "routingNumber": "888889999888",
        "last4": "8899",
        "accountHash": "7c1c26af59e155d3d7f54a1df3946f92cb9529c4",
        "rtpEligible": false,
        "reference": "6792ae57a35ccc72ba4ebdab"
      }
    ],
    "cards": [],
    "ibans": [],
    "pixes": [],
    "rtpDisabled": false,
    "cardDisabled": false
  }
}
```

**For U.S. Users - Add Debit Card (Push to Card)**

> **Info**
>
> **Tokenize Debit Cards First**
>
> Before adding a debit card for payouts, you must tokenize it. Follow our [Tokenize Debit Cards for Withdraws](/recipes/recipes/tokenize-debit-cards-for-withdraws) guide.

**Endpoint:** `POST /api/withdraw/debit-card`

**`Request`**

```curl Request
curl --request POST \
     --url https://api-sandbox.coinflow.cash/api/withdraw/debit-card \
     --header 'Authorization: <YOUR_API_KEY>' \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --header 'x-coinflow-auth-user-id: usher' \
     --data '
{
  "cardToken": "411111YJM5TX1111",
  "expMonth": "10",
  "expYear": "29"
}
'
```

**`Response`**

```Text Response
411111YJM5TX1111
```

**For U.S. Users - Add Bank Account for USD Payouts**

ACH, Same Day ACH or RTP (Real Time Payments) are available.

**Endpoint:** `POST /api/withdraw/account`

**`Request`**

```curl Request
curl --location 'https://api-sandbox.coinflow.cash/api/withdraw/account' \
--header 'Authorization: <YOUR_API_KEY>' \
--header 'accept: application/json' \
--header 'content-type: application/json' \
--header 'x-coinflow-auth-user-id: usher' \
--data '
{
  "type": "checking",
  "alias": "Ushers Account 1",
  "accountNumber": "1111222233330000",
  "routingNumber": "333333334"
}
'
```

**`Response`**

```Text Response
{
    "withdrawer": {
        "_id": "672400ead654e5cdd247b33f",
        "__v": 0,
        "currency": "USD",
        "email": "usher@atl.com",
        "isBlocked": false,
        "merchant": "6723f186b2f506b29dbee63d",
        "originalCurrency": "USD",
        "user": true,
        "verification": {
            "hash": "02154e69e0f38f2b31dec3b658535fa1cc283063",
            "vendor": "persona",
            "reference": "ver_DisMcS9M3HftnJYPpFSowNEWHyjT",
            "status": "approved"
        },
        "wallets": [
            {
                "wallet": "usher",
                "blockchain": "user"
            }
        ],
        "watchlistExempt": false,
        "bankAccounts": [
          {
            "alias": "Ushers Savings 1",
            "token": "0dc36240-29fc-4708-81f6-bcab19e6e597",
            "routingNumber": "333333334",
            "last4": "0000",
            "accountHash": "cb20055931a543bcfe3183541f335f031452055a",
            "rtpEligible": false,
            "reference": "67240124b2f506b29dbef137",
            "isDeleted": false
          }
        ],
        "cards": [
            {
                "last4": "1111",
                "type": "VISA",
                "disbursementStatus": "Immediate",
                "token": "411111YJM5TX1111",
                "createdAt": "2024-10-31T22:13:56.435Z"
            }
        ],
        "ibans": [],
        "pixes": [],
        "rtpDisabled": false,
        "cardDisabled": false
    }
}
```

**For EU Users - Add European Bank Account (IBAN)**

For Euro (EUR) payouts via SEPA.

**Endpoint:** `POST /api/withdraw/iban`

**`Request`**

```curl Request
curl --location 'https://api-sandbox.coinflow.cash/api/withdraw/iban' \
--header 'Authorization: <YOUR_API_KEY>' \
--header 'accept: application/json' \
--header 'content-type: application/json' \
--header 'x-coinflow-auth-user-id: usher' \
--data '
{
  "alias": "Ushers Account 1",
  "number": "<Iban number>",
}
'

```

**`Response`**

```json Response
{
    "withdrawer": {
        "_id": "672400ead654e5cdd247b33f",
        "__v": 0,
        "currency": "USD",
        "email": "usher@atl.com",
        "isBlocked": false,
        "merchant": "6723f186b2f506b29dbee63d",
        "originalCurrency": "USD",
        "user": true,
        "verification": {
            "hash": "02154e69e0f38f2b31dec3b658535fa1cc283063",
            "vendor": "persona",
            "reference": "ver_DisMcS9M3HftnJYPpFSowNEWHyjT",
            "status": "approved"
        },
        "wallets": [
            {
                "wallet": "usher",
                "blockchain": "user"
            }
        ],
        "watchlistExempt": false,
        "bankAccounts": [],
        "cards": [],
        "ibans": [{
            "alias": "Ushers Savings 1",
            "token": "0dc36240-29fc-4708-81f6-bcab19e6e597",
            "last4": "0000",
            "accountHash": "cb20055931a543bcfe3183541f335f031452055a",
            "reference": "67240124b2f506b29dbef137",
            "isDeleted": false
          }],
        "pixes": [],
        "rtpDisabled": false,
        "cardDisabled": false
    }
}
```

**For UK Users - Add UK Bank Account (IBAN with Sort Code)**

For GBP payouts via UK Faster Payments.

**Endpoint:** `POST /api/withdraw/iban`

**`Request`**

```curl Request
curl --location 'https://api-sandbox.coinflow.cash/api/withdraw/iban' \
--header 'Authorization: <YOUR_API_KEY>' \
--header 'accept: application/json' \
--header 'content-type: application/json' \
--header 'x-coinflow-auth-user-id: usher' \
--data '
{
  "alias": "Ushers Account 1",
  "number": "<Iban number>",
  "sortCode": "<UK Sort Code>"
}
'

```

**`Response`**

```Text Response
{
    "withdrawer": {
        "_id": "672400ead654e5cdd247b33f",
        "__v": 0,
        "currency": "USD",
        "email": "usher@atl.com",
        "isBlocked": false,
        "merchant": "6723f186b2f506b29dbee63d",
        "originalCurrency": "USD",
        "user": true,
        "verification": {
            "hash": "02154e69e0f38f2b31dec3b658535fa1cc283063",
            "vendor": "persona",
            "reference": "ver_DisMcS9M3HftnJYPpFSowNEWHyjT",
            "status": "approved"
        },
        "wallets": [
            {
                "wallet": "usher",
                "blockchain": "user"
            }
        ],
        "watchlistExempt": false,
        "bankAccounts": [],
        "cards": [],
        "ibans": [{
            "alias": "Ushers Savings 1",
            "token": "0dc36240-29fc-4708-81f6-bcab19e6e597",
            "last4": "0000",
            "accountHash": "cb20055931a543bcfe3183541f335f031452055a",
            "reference": "67240124b2f506b29dbef137",
            "sortCode": "XXXXXX",
            "isDeleted": false
          }],
        "pixes": [],
        "rtpDisabled": false,
        "cardDisabled": false
    }
}
```

**For Brazilian Users - Add PIX Account**

For BRL (Brazilian Real) payouts via PIX.

**Endpoint:** `POST /api/withdraw/pix`

**`Request`**

```curl Request
curl --request POST \
     --url https://api-sandbox.coinflow.cash/api/withdraw/pix \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --data '{"pixKey":"1234"}'
```

**`Response`**

```Text Response
{
    "withdrawer": {
        "_id": "672400ead654e5cdd247b33f",
        "__v": 0,
        "currency": "USD",
        "email": "usher@atl.com",
        "isBlocked": false,
        "merchant": "6723f186b2f506b29dbee63d",
        "originalCurrency": "USD",
        "user": true,
        "verification": {
            "hash": "02154e69e0f38f2b31dec3b658535fa1cc283063",
            "vendor": "persona",
            "reference": "ver_DisMcS9M3HftnJYPpFSowNEWHyjT",
            "status": "approved"
        },
        "wallets": [
            {
                "wallet": "usher",
                "blockchain": "user"
            }
        ],
        "watchlistExempt": false,
        "bankAccounts": [],
        "cards": [],
        "ibans": [],
        "pixes": [ {
            "key" : "1234",
            "accountHash" : "ef501efc395b66692b1fe5aa6ad1d3f4a0af48d7",
            "token" : "7ab01310-66b1-4b13-8d80-868bd31a6f8e"
        }],
        "rtpDisabled": false,
        "cardDisabled": false
    }
}
```

### Step 5: Get a Quote for the Withdraw

Display the quote for the withdraw by calling the [Get Quote endpoint](/api-reference/api-reference/withdraw/get-quote)

**Token Values by Environment:**

* **Sandbox:** `4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU`
* **Production:** `EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v`

**Endpoint:** `GET /api/withdraw/quote`

```curl
  curl --request GET \
       --url 'https://api-sandbox.coinflow.cash/api/withdraw/quote?token=4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU&amount=200&merchantId=testtest&usePermit=true' \
       --header 'accept: application/json' \
       --header 'x-coinflow-auth-session-key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ3YWxsZXQiOiJKOTdyVTdOTjdQdkFxeHNFTWtqU2NoVnMySE5yVVQ3U05YZzU0SFFocHFxUyIsImJsb2NrY2hhaW4iOiJzb2xhbmEiLCJtZXJjaGFudElkIjoidGVzdHRlc3QiLCJpYXQiOjE3Mzc2NjU5NDcsImV4cCI6MTczNzc1MjM0N30.orgoNHZtQP25-sq2aACzDBwv9j0t0_DS7wvEKhR0nr8'
```

```json
{
  "quote": {
    "cents": 20000,
    "currency": "USD"
  },
  "gasFees": {
    "gasFees": {
      "cents": 0,
      "currency": "USD"
    },
    "gasFeesWei": "0"
  },
  "asap": {
    "fee": {
      "cents": 0,
      "currency": "USD"
    },
    "finalSettlement": {
      "cents": 20000,
      "currency": "USD"
    },
    "limit": {
      "cents": 1000000,
      "currency": "USD"
    },
    "expectedDeliveryDate": "in a few minutes",
    "expectedDeliveryDateISO": "2026-04-09T16:45:00.000Z"
  },
  "same_day": {
    "fee": {
      "cents": 0,
      "currency": "USD"
    },
    "finalSettlement": {
      "cents": 20000,
      "currency": "USD"
    },
    "limit": {
      "cents": 1000000,
      "currency": "USD"
    },
    "expectedDeliveryDate": "in a day",
    "expectedDeliveryDateISO": "2026-04-10T20:00:00.000Z"
  },
  "standard": {
    "fee": {
      "cents": 0,
      "currency": "USD"
    },
    "finalSettlement": {
      "cents": 20000,
      "currency": "USD"
    },
    "limit": {
      "cents": 1000000,
      "currency": "USD"
    },
    "expectedDeliveryDate": "in 3 days",
    "expectedDeliveryDateISO": "2026-04-14T20:00:00.000Z"
  },
  "card": {
    "fee": {
      "cents": 0,
      "currency": "USD"
    },
    "finalSettlement": {
      "cents": 20000,
      "currency": "USD"
    },
    "limit": {
      "cents": 5000000,
      "currency": "USD"
    },
    "expectedDeliveryDate": "in a few minutes",
    "expectedDeliveryDateISO": "2026-04-09T16:45:00.000Z"
  }
}
```

### Step 6: Create Transaction and Have User Sign

Call our [Create a transaction](/api-reference/api-reference/withdraw/get-transaction) endpoint, then have the user sign and send the transaction returned.

> **Info**
>
> **Getting the Account Token**
>
> When calling this endpoint, `account` should be the `bankAccounts[0]['token']` or `cards[0]['token']` value returned from calling our [Get Withdrawer endpoint](/api-reference/api-reference/withdraw/get-withdrawer)

**Endpoint:** `POST /api/withdraw/transaction`

**`Request`**

```curl Request
curl --request POST \
     --url https://api-sandbox.coinflow.cash/api/withdraw/transaction \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --header 'x-coinflow-auth-session-key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ3YWxsZXQiOiJKOTdyVTdOTjdQdkFxeHNFTWtqU2NoVnMySE5yVVQ3U05YZzU0SFFocHFxUyIsImJsb2NrY2hhaW4iOiJzb2xhbmEiLCJtZXJjaGFudElkIjoidGVzdHRlc3QiLCJpYXQiOjE3Mzc2NjU5NDcsImV4cCI6MTczNzc1MjM0N30.orgoNHZtQP25-sq2aACzDBwv9j0t0_DS7wvEKhR0nr8' \
     --data '
{
  "speed": "same_day",
  "amount": 200,
  "merchantId": "testtest",
  "account": "e19eb25f-e9bf-45f1-9ae4-9a0b054dac2e"
}
'
```

**`Response`**

```json Response
{
  "transactions": [
    "8vuS2C3AinK4AWdjHUtLDK7ZUiFK8QMkioNQz2KqsnoaJm2nHdPnE6xu6h3iLv6yEQ3jtBvB3vi4RdLtxCvoX2Xhs47vDk5CmSZFfaimeQgTomEfrmW5Y1vR5bwXUCde4Yojns3ECazh8XPQW2K1H58paV3AZQEV9Rv6pXSyjfRq58k9FGR4gCf44XzS4vkaj1LPjZbp8ZWhU78Gc5Q3L5gYWriRvu9h3sejaaBbtUy3dkRePrhQJnY5eSeTTShkHwnExqWC9Ki36qQfEo2TbVnDaHUYCTdKTFS8MV4rQc8LA9S1u5j2gzhoBHMWcauFd9eqRQamW33uruJNpvS6DwRU5fkGkMLFDgog8CUT8UGzrUZyWtcmgF8ogpb2n5F8drvgyKZxgh2APw2x5daSwd98rGNDKrtE3nGdJrj2GLa9oEbHWzDunF3R6E98eRKxGRnp96C1sTZSCpPrjLRkZQ5gSE1uzb8Lqy7YoT7Q6dGBYhfJea4wKdWk8f9zoiPUSFFiPTjdFarcG7yXQFE1caVJbZVXNUx1YptTa94hhguye5bsgQzDQdy8QxhVRutVRJBJZUVe2TcGWhS1pyQX6ibvZ95rPTeEyBRbu4WLvZdMZzgQXzFwxE7mL5rtw4RZPcXC1bGJSzU93wVcxfRtTeoyBDGpizxpucSXvEgwRvfMgGXk71zufD637rndZsaN4qBN75zDQhvMED7j9q2soGAK14nSqYi23o7ynUczY"
  ]
}
```

### Step 7: Sign and Send Transaction

Have the withdrawer's wallet sign and send the transaction.

### Step 8: Monitor Withdrawals (Optional)

* **Get withdrawal history:** [Get all past withdraws for a specific withdrawer](/api-reference/api-reference/withdraw/get-withdrawer-history)
* **View in dashboard:** Log into your admin dashboard > Withdraws to see initiated withdrawals

---

## Next Steps

Now that you've implemented user self-custodial wallet payouts, here's what to do next:

1. Test your integration in sandbox environment
2. [Configure webhook notifications](/guides/developer-resources/webhooks)
3. Review [common payout errors](/guides/payouts/beyond-payouts/common-payout-errors) and troubleshooting
4. Test with different payout methods (bank accounts, debit cards, etc.)
5. Contact Coinflow team when ready to go live