Create a transfer
Creates a payout transfer and returns a unique deposit address on the network specified by source_network. Send USDC from wallet_address to that address — MW handles the rest of the conversion and delivery pipeline automatically.
Wallet verification: Before any other processing, wallet_address must be a KYC-verified wallet. Unverified wallets are rejected with 403 — verify your wallet at kyc.madhousewallet.com.
Compliance screening: The supplied wallet_address is also screened against a third-party risk database. Wallets that fail the screen are rejected with a 403. The screener supports EVM addresses only, so wallet_address is currently restricted to the EVM format (0x + 40 hex chars). Solana and Tron addresses are temporarily not accepted on this endpoint.
Prerequisites:
- Your account must have a deployed Safe wallet.
- Call
GET /api/payouts/quotewithin the last 5 minutes — pass the returnedquoteIdasquote_id. - The
recipientIdmust be a recipient belonging to your account.
Concurrent transfers: Multiple transfers can be in flight simultaneously — each gets a unique deposit address and is settled independently.
Workflow:
GET /api/payouts/quote→ savequoteId.POST /api/payouts/transferwithquote_id,amount,recipientId,source_network,wallet_address→ receivedeposit_addressandtransfer_id.- Send exactly
amountUSDC fromwallet_addresstodeposit_addressonsource_network. - MW detects the deposit and automatically initiates the fiat payout to your recipient — email confirmation sent.
Rate limit: 20 requests/minute.
Authorizations
Pass your API key as a Bearer token: Authorization: Bearer mw_live_<keyId>_<secret>
Body
The quoteId returned by GET /api/payouts/quote (valid for 5 minutes; single-use)
"3f7a2b1c-4d5e-6f7a-8b9c-0d1e2f3a4b5c"
USD amount to transfer (max 2 decimal places, must match the quoted amount ±$0.01)
100
Recipient account ID (must belong to your account)
12345678
Your own UUID for this transfer — stored for audit and support lookups. Must be globally unique across all transfers; a duplicate UUID is rejected with 409.
"550e8400-e29b-41d4-a716-446655440000"
Email address of the end user. Used to send transfer status notifications.
"user@example.com"
Token to send. Supported values: usdc, usdt. Use GET /api/payouts/deposit-options to retrieve the full list of supported token/network combinations.
"usdc"
Network to send from: arbitrum, avalanche, base, ethereum, polygon, solana, tron.
"base"
The address on source_network that will send USDC or USDT to the deposit address. Currently restricted to EVM addresses only (0x + 40 hex chars) because every transfer is pre-screened for compliance and the screener supports Ethereum-family addresses only. Solana and Tron addresses are temporarily rejected on this endpoint. The deposit address returned will be on the same network as source_network.
"0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B"
When true, the recipient account is not automatically deleted after the transfer reaches a terminal state (completed or failed). Use this for saved/reusable recipients that you manage yourself. Defaults to false — recipients are deleted automatically after each transfer.
false
Response
Transfer created — send USDC to deposit_address to trigger the payout pipeline
Wrapper returned by both POST /api/payouts/transfer and GET /api/payouts/transfer/:id
