Create a v2 transfer
Creates a v2 payout transfer and returns a hardcoded deposit address for the requested source_token/source_network combination. Unlike v1, the deposit address is fixed — no provider API call is made at initiation time.
v2 differences from v1:
- USDC only — USDT transfers must use
POST /api/payouts/transfer. - No expiry — there is no time window to send funds. The transfer remains open until you send USDC and call
POST /api/payouts/transfer/v2/confirm-transfer. - Two-phase confirmation — after sending USDC on-chain, you must call
POST /api/payouts/transfer/v2/confirm-transferwith thetransfer_idandtx_hashto trigger the payout pipeline. The platform matches the deposit to your transfer using the provided transaction hash.
Wallet compliance screening (conditional, per-account): when compliance screening is enabled for your account (the default), wallet_address is required, must be an EVM address (0x + 40 hex chars), and is screened before any other processing. A wallet that fails screening is rejected with 403. When screening is disabled for your account, wallet_address stays KYC-conditional (see below) and Solana addresses are accepted.
KYC wallet verification (conditional, per-account): if your account requires KYC verification, wallet_address is required and must be a KYC-verified wallet or the request is rejected with 403 (verify at kyc.madhousewallet.com); if KYC is not enabled for your account, wallet_address may be omitted (unless compliance screening requires it).
Workflow:
GET /api/payouts/quote→ savequoteId.POST /api/payouts/transfer/v2withquote_id,amount,recipientId,source_network(andwallet_address— required if compliance screening or KYC is enabled for your account) → receivedeposit_addressandtransfer_id.- Send exactly
amountUSDC todeposit_addressonsource_network. - Call
POST /api/payouts/transfer/v2/confirm-transferwithtransfer_idand the on-chaintx_hash. - The platform detects the deposit and automatically initiates the fiat payout — email confirmation sent.
Supported networks for v2 (USDC only): base, solana, polygon, arbitrum, avalanche, ethereum.
Rate limit: 20 requests/minute.
Authorizations
Pass your API key as a Bearer token: Authorization: Bearer mw_live_<keyId>_<secret>
Body
UUID returned by GET /api/payouts/quote. Must be used within 5 minutes.
"a1b2c3d4-e5f6-7890-abcd-ef1234567890"
USD amount to transfer (max 2 decimal places, must match the quoted amount ±$0.01).
500
Recipient account ID from GET /api/payouts/recipients or POST /api/payouts/recipients.
12345678
Source token. Only usdc is accepted on v2. Use POST /api/payouts/transfer for USDT.
usdc "usdc"
Network on which you will send USDC to the deposit address.
base, solana, polygon, arbitrum, avalanche, ethereum "base"
Your own UUID for this transfer — stored for audit and duplicate prevention. A duplicate UUID is rejected with 409.
"550e8400-e29b-41d4-a716-446655440000"
The address on source_network that will send USDC to the deposit address. Conditionally required: required if compliance screening or KYC verification is enabled for your account; may be omitted otherwise (stored and returned as an empty string). When compliance screening is enabled (the default), it must be an EVM address (0x + 40 hex chars) and is screened before processing — Solana addresses are rejected. When screening is disabled, both EVM (0x + 40 hex chars) and Solana (base58, 32–44 chars) addresses are accepted; if KYC is enabled it must be a KYC-verified wallet.
"0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B"
When true, the recipient is not automatically deleted after the transfer reaches a terminal state. Defaults to false.
false
Email address to receive payout status notifications (sent and failed). If omitted, notifications are sent to the authenticated account's email address.
"customer@example.com"
Response
Transfer created — deposit address returned
Unique transfer reference. Use this ID with POST /api/payouts/transfer/v2/confirm-transfer.
"507f1f77bcf86cd799439011"
The address to send USDC to on source_network. This is a fixed offloader wallet address.
"0xBC91bCF38e3c0DE1E3fD0cF50Be7c0e52D55D00e"
Token to send (always usdc on v2).
"usdc"
Network on which to send USDC.
"base"
USD amount to send.
500
Target payout currency.
"EUR"
Your sender address as supplied in the request. Empty string when omitted (KYC not enabled for your account).
"0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B"
Human-readable instructions for completing the transfer.
