Payouts From Coinflow Wallet

How It Works

Sending payouts through Coinflow is straightforward:

1. Create a Withdrawer (KYC)

Every user must complete identity verification before their first payout. Choose from multiple KYC options including Coinflow’s built-in verification or your own provider.

2. Connect Payout Method

Users link their bank account, debit card, Venmo, PayPal, Interac, IBAN, or PIX account. Use our pre-built UI or integrate directly via API.

3. Get Quote

Fetch real-time quotes showing fees and final settlement amounts for different payout speeds.

4. Initiate Payout

Submit the payout request. Funds are instantly deducted from your Coinflow wallet and sent to the user’s connected account.

5. Track & Monitor

View all payouts in your merchant dashboard with real-time status updates via webhooks.


Getting Started

Complete these prerequisites before integration.

⚠️ Account Setup Required

  1. Register a sandbox merchant account or login
  2. Create a sandbox API key
  3. Add team members to your account
  4. Configure in-app Coinflow wallet as your settlement method
  5. Add funds to your wallet (contact Coinflow for the public key)

Developer Resources

Quick Reference

API Authentication

All API requests require these headers:

HeaderDescription
AuthorizationYour API key from the merchant dashboard
x-coinflow-auth-user-idUnique customer ID from your system
x-coinflow-auth-blockchainSet to solana

Implementation

Step 1: Create a Withdrawer (KYC)

Every user must complete identity verification before receiving their first payout. Users only need to verify once and can make unlimited payouts afterwards.

⚠️ Rate Limit: 3 failed KYC attempts per minute

Choose the KYC method that fits your business:

Let Coinflow handle the complete KYC process.

For U.S. Users
$curl --request POST \
> --url https://api-sandbox.coinflow.cash/api/withdraw/kyc \
> --header 'Authorization: YOUR_API_KEY' \
> --header 'content-type: application/json' \
> --header 'x-coinflow-auth-user-id: user123' \
> --data '{
> "info": {
> "email": "user@example.com",
> "firstName": "John",
> "surName": "Doe",
> "physicalAddress": "2800 N Damen Ave",
> "city": "Chicago",
> "state": "IL",
> "zip": "60625",
> "country": "US",
> "dob": "19901015",
> "ssn": "1234"
> }
> }'

Response:

1{
2 "withdrawer": {
3 "_id": "672400ead654e5cdd247b33f",
4 "currency": "USD",
5 "email": "user@example.com",
6 "verification": {
7 "status": "approved"
8 }
9 }
10}
For International Users (Non-U.S.)
$curl --request POST \
> --url https://api-sandbox.coinflow.cash/api/withdraw/kyc \
> --header 'Authorization: YOUR_API_KEY' \
> --header 'content-type: application/json' \
> --header 'x-coinflow-auth-user-id: user123' \
> --data '{
> "merchantId": "YOUR_MERCHANT_ID",
> "email": "user@example.com",
> "country": "GB"
> }'

Response:

1{
2 "withdrawer": {
3 "_id": "676091072cd3ae949702b0ea",
4 "currency": "GBP",
5 "email": "user@example.com",
6 "verification": {
7 "status": "approved"
8 }
9 }
10}

Option B: Use Your Own KYC Provider

Already have a KYC provider? Pass the verification data to Coinflow.

Pass KYC Documents

Upload ID documents directly from your KYC provider.

$curl --request POST \
> --url https://api-sandbox.coinflow.cash/api/withdraw/kyc-doc \
> --header 'content-type: multipart/form-data' \
> --header 'x-coinflow-auth-session-key: YOUR_SESSION_KEY' \
> --form email=user@example.com \
> --form country=US \
> --form idType=ID_CARD \
> --form idFront='@id_front.png' \
> --form idBack='@id_back.png' \
> --form merchantId=YOUR_MERCHANT_ID
Use Sumsub Integration

If you use Sumsub, you can share KYC data directly.

Prerequisites: Enter a tri-party agreement with Sumsub and Coinflow. Contact Coinflow with your Sumsub client ID to get started.

Implementation: First, call Sumsub’s Generate Share Token endpoint. Then pass the share token to Coinflow:

$curl --request POST \
> --url https://api-sandbox.coinflow.cash/api/withdraw/kyc/share-token \
> --header 'Authorization: YOUR_API_KEY' \
> --header 'content-type: application/json' \
> --header 'x-coinflow-auth-user-id: user123' \
> --data '{
> "vendor": "sumsub",
> "shareToken": "YOUR_SHARE_TOKEN",
> "country": "US",
> "merchantId": "YOUR_MERCHANT_ID",
> "email": "user@example.com"
> }'
KYC Reliance (Enterprise)

Use your own KYC provider with Coinflow’s compliance approval.

Prerequisites: You must receive approval from Coinflow Compliance team before using this method.

$curl --request POST \
> --url https://api-sandbox.coinflow.cash/api/withdraw/kyc/attested \
> --header 'Authorization: YOUR_API_KEY' \
> --header 'content-type: application/json' \
> --header 'x-coinflow-auth-user-id: user123' \
> --data '{
> "email": "user@example.com",
> "firstName": "John",
> "surName": "Doe",
> "physicalAddress": "201 E Randolph St",
> "city": "Chicago",
> "state": "IL",
> "zip": "60601",
> "country": "US",
> "dob": "10151990",
> "ssn": "1234"
> }'

Handling Additional Verification

If you receive a 451 response, the user needs to complete additional verification:

1{
2 "verificationLink": "https://verify.coinflow.cash/..."
3}

Redirect the user to this link where they’ll upload a photo ID and take a selfie. Then call Get Withdrawer to confirm their status.


Step 2: Get Withdrawer Details

Check the user’s verification status and view their linked payout methods.

$curl --request GET \
> --url https://api-sandbox.coinflow.cash/api/withdraw \
> --header 'Authorization: YOUR_API_KEY' \
> --header 'x-coinflow-auth-user-id: user123'

Response:

1{
2 "withdrawer": {
3 "_id": "672400ead654e5cdd247b33f",
4 "currency": "USD",
5 "email": "user@example.com",
6 "verification": {
7 "status": "approved"
8 },
9 "bankAccounts": [],
10 "cards": [],
11 "ibans": [],
12 "pixes": []
13 }
14}

Step 3: Connect Payout Method

Users must link a payout destination before receiving funds.

Use Our Pre-Built UI

Save development time by using Coinflow’s bank authentication UI for KYC and linking payout methods. You’ll only need to build the quote display and payout initiation.

Have your own Plaid or bank auth provider? Contact Coinflow - we can work with your existing integration to make this step easier.

Manual Integration Options

U.S. Users - Bank Account or Debit Card

Add Bank Account:

$curl --request POST \
> --url https://api-sandbox.coinflow.cash/api/withdraw/account \
> --header 'Authorization: YOUR_API_KEY' \
> --header 'content-type: application/json' \
> --header 'x-coinflow-auth-user-id: user123' \
> --data '{
> "type": "checking",
> "alias": "Primary Checking",
> "accountNumber": "1111222233330000",
> "routingNumber": "333333334"
> }'

Add Debit Card:

First tokenize the debit card, then:

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

Add Venmo:

$curl --request POST \
> --url https://api-sandbox.coinflow.cash/api/withdraw/venmo \
> --header 'Authorization: YOUR_API_KEY' \
> --header 'content-type: application/json' \
> --header 'x-coinflow-auth-user-id: user123' \
> --data '{
> "merchantId": "YOUR_MERCHANT_ID",
> "phoneNumber": "1234567890"
> }'

Add PayPal:

$curl --request POST \
> --url https://api-sandbox.coinflow.cash/api/withdraw/paypal \
> --header 'Authorization: YOUR_API_KEY' \
> --header 'content-type: application/json' \
> --header 'x-coinflow-auth-user-id: user123' \
> --data '{
> "phoneNumber": "1234567890",
> "merchantId": "YOUR_MERCHANT_ID"
> }'
Canada Users - Interac
$curl --request POST \
> --url https://api-sandbox.coinflow.cash/api/withdraw/interac \
> --header 'Authorization: YOUR_API_KEY' \
> --header 'content-type: application/json' \
> --header 'x-coinflow-auth-user-id: user123' \
> --data '{
> "phoneNumber": "1234567890",
> "merchantId": "YOUR_MERCHANT_ID"
> }'
EU/UK Users - IBAN Account
$curl --request POST \
> --url https://api-sandbox.coinflow.cash/api/withdraw/iban \
> --header 'Authorization: YOUR_API_KEY' \
> --header 'content-type: application/json' \
> --header 'x-coinflow-auth-user-id: user123' \
> --data '{
> "alias": "Primary Account",
> "number": "GB33BUKB20201555555555",
> "sortCode": "201234"
> }'
Brazil Users - PIX Account
$curl --request POST \
> --url https://api-sandbox.coinflow.cash/api/withdraw/pix \
> --header 'Authorization: YOUR_API_KEY' \
> --header 'content-type: application/json' \
> --header 'x-coinflow-auth-user-id: user123' \
> --data '{
> "pixKey": "user@example.com"
> }'

Response includes the payout method token:

1{
2 "withdrawer": {
3 "bankAccounts": [{
4 "token": "0dc36240-29fc-4708-81f6-bcab19e6e597",
5 "alias": "Primary Checking",
6 "last4": "0000",
7 "routingNumber": "333333334"
8 }]
9 }
10}

Save this token - you’ll need it to initiate payouts.


Step 4: Get Payout Quote

Fetch a quote showing fees and final settlement amounts for different payout speeds.

Token values:

  • Sandbox: 4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU
  • Production: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
$curl --request GET \
> --url 'https://api-sandbox.coinflow.cash/api/withdraw/quote?token=4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU&amount=100&merchantId=YOUR_MERCHANT_ID&usePermit=true' \
> --header 'Authorization: YOUR_API_KEY' \
> --header 'x-coinflow-auth-blockchain: solana' \
> --header 'x-coinflow-auth-user-id: user123'

Response:

1{
2 "quote": {
3 "cents": 10000,
4 "currency": "USD"
5 },
6 "same_day": {
7 "fee": { "cents": 50 },
8 "finalSettlement": { "cents": 9950 },
9 "limit": { "cents": 10000000 }
10 },
11 "standard": {
12 "fee": { "cents": 100 },
13 "finalSettlement": { "cents": 9900 },
14 "limit": { "cents": 10000000 }
15 },
16 "card": {
17 "fee": { "cents": 200 },
18 "finalSettlement": { "cents": 9800 },
19 "limit": { "cents": 5000000 }
20 }
21}

Display these options to your user so they can choose their preferred speed vs. cost.


Step 5: Initiate Payout

Submit the payout request using the connected payout method token from Step 3.

$curl --request POST \
> --url https://api-sandbox.coinflow.cash/api/merchant/withdraws/payout/delegated \
> --header 'Authorization: YOUR_API_KEY' \
> --header 'content-type: application/json' \
> --data '{
> "amount": {
> "cents": 10000
> },
> "speed": "same_day",
> "account": "0dc36240-29fc-4708-81f6-bcab19e6e597",
> "userId": "user123"
> }'

Speed options:

  • card - Instant debit card payout
  • asap - Instant RTP payout (Real-Time Payments)
  • same_day - Same-day ACH
  • standard - Standard ACH (1-3 business days)
  • venmo - Instant Venmo payout (US only)
  • paypal - Instant PayPal payout (US only)
  • interac - Instant Interac payout (Canada only)
  • iban - SEPA transfer (EU/UK)
  • pix - PIX instant transfer (Brazil)

Response:

1{
2 "signature": "4Cv4nbe6fkGpdSYcqhPHXkdndeiyTa8mhFoWW5x3vroxRibAUssrbXZ5VW4vxkPedcX3xTRKu7ZpkJXWKdJBCGuq"
3}

Funds are instantly deducted from your Coinflow wallet balance and sent to the user’s account.


Monitoring & Management

Check Wallet Balance

View your current Coinflow wallet balance:

$curl --request GET \
> --url https://api-sandbox.coinflow.cash/api/merchant/balance \
> --header 'Authorization: YOUR_API_KEY'

View Payouts in Dashboard

Track all payouts in real-time at your merchant dashboard.

Set Up Webhooks

Configure webhooks to receive real-time notifications about payout status changes:

  • Payout initiated
  • Payout completed
  • Payout failed
  • User verification status changed

Going to Production

Funding Your Production Wallet

When ready to go live, fund your Coinflow wallet by:

  1. Send USDC on Solana (contact Coinflow for your production wallet address)
  2. Wire transfer (contact Coinflow for wiring instructions)

Update API Endpoints

Switch from api-sandbox.coinflow.cash to api.coinflow.cash and update your token to the production value.


Frequently Asked Questions

What does a 451 response mean?

A 451 response means we need additional information to verify the user. Redirect them to the verificationLink provided in the response where they’ll upload a photo ID and take a selfie. Then call Get Withdrawer to confirm their approval status.

Why is bank authentication required?

Bank authentication verifies that users own the accounts they’re connecting. This is essential for preventing fraud, ensuring regulatory compliance, reducing payment failures, and protecting against chargebacks. It’s required by our AML policies before allowing withdrawals.

How do I tokenize debit cards?

Card tokenization is required for PCI compliance. We provide secure frontend components that capture and tokenize card details, so raw card data never touches your servers.

What if I already use Plaid or another bank auth provider?

Great! Contact the Coinflow team - we can work with your existing Plaid or bank authentication provider to streamline the payout method connection process.

Can I use Coinflow’s UI instead of building my own?

Yes! Coinflow provides a pre-built UI for bank authentication that handles both KYC and linking payout methods. This saves significant development time - you’ll only need to build the quote display and payout initiation screens.

How do I know if I have valid PCI DSS certification?

You should have an Attestation of Compliance (AOC) as proof of PCI DSS certification.

Example AOCs: Merchants | Service Providers

Service provider AOCs must be reviewed and approved by a Qualified Security Assessor (QSA).


Support

Need help? Contact the Coinflow team or check out the full documentation at docs.coinflow.cash.