> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://docs.coinflow.cash/guides/payouts/source-of-funds-for-payouts/advanced/user-self-custodial-wallet/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 '), sendTransaction: (transaction: Transaction) => Promise, signMessage: (message: string) => Promise }} 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:**
**1. I want to use Coinflow for KYC** Merchants who want to use Coinflow for KYC should call [Register User](/api-reference/api-reference/withdraw/create-kyc).
U.S. Withdrawers **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" } } } ```
Non-U.S. Withdrawers **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" } } } ```
**2. I am using my own KYC provider and I want to pass KYC data to Coinflow** 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" } } } ```
**3. I use Sumsub as my KYC provider and I want to share KYC data with Coinflow** 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" } } } ```
**4. I have my own KYC provider and will complete KYC reliance process with Coinflow.** 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" } } ```
### 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: ' \ --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: ' \ --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: ' \ --header 'accept: application/json' \ --header 'content-type: application/json' \ --header 'x-coinflow-auth-user-id: usher' \ --data ' { "alias": "Ushers Account 1", "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: ' \ --header 'accept: application/json' \ --header 'content-type: application/json' \ --header 'x-coinflow-auth-user-id: usher' \ --data ' { "alias": "Ushers Account 1", "number": "", "sortCode": "" } ' ``` **`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