> ## Documentation Index
> Fetch the complete documentation index at: https://developer.madhousewallet.com/llms.txt
> Use this file to discover all available pages before exploring further.

# v1 vs v2 transfers

> Compare the two transfer pipelines and choose the right one for your integration.

The API offers two transfer pipelines. Both start from a quote and deliver fiat to a recipient, but they differ in how the deposit address works and how the deposit is confirmed.

## At a glance

|                      | v1 — [`POST /api/payouts/transfer`](/api-reference/payouts/create-a-transfer) | v2 — [`POST /api/payouts/transfer/v2`](/api-reference/payouts/create-a-v2-transfer) |
| -------------------- | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- |
| Tokens               | USDC and USDT                                                                 | USDC only                                                                           |
| Deposit address      | Unique per transfer                                                           | Fixed per token/network                                                             |
| Expiry               | Send within the quote window                                                  | No expiry                                                                           |
| Deposit confirmation | Automatic on-chain detection                                                  | You submit the `tx_hash`                                                            |
| Sender address       | EVM only (compliance screened)                                                | EVM required when screening is on; Solana allowed when off                          |

## v1: automatic detection

The v1 endpoint returns a unique deposit address for each transfer. Send the USDC or USDT, and MW detects the deposit and starts the payout automatically — no further call is needed.

Use v1 when you want the simplest flow, need USDT, or rely on automated compliance screening of sender wallets you do not control.

```bash theme={null}
curl -X POST "$MW/api/payouts/transfer" \
  -H "Authorization: Bearer mw_live_<keyId>_<secret>" \
  -H "Content-Type: application/json" \
  -d '{ "quote_id": "...", "amount": 1000, "recipientId": 12345678,
        "customer_uuid": "...", "customer_email": "user@example.com",
        "source_token": "usdc", "source_network": "base",
        "wallet_address": "0xAb58...C9B" }'
```

## v2: two-phase confirmation

The v2 endpoint returns a fixed deposit address and never expires. After you send the USDC, you must link the on-chain transaction to your transfer with [`POST /api/payouts/transfer/v2/confirm-transfer`](/api-reference/payouts/confirm-a-v2-transfer).

<Steps>
  <Step title="Create the transfer">
    Call `POST /api/payouts/transfer/v2` to receive a `transfer_id` and `deposit_address`.
  </Step>

  <Step title="Send the USDC">
    Send exactly the quoted amount to the deposit address on the chosen network.
  </Step>

  <Step title="Confirm the deposit">
    Call `POST /api/payouts/transfer/v2/confirm-transfer` with the `transfer_id` and the `tx_hash`. The platform matches the deposit and starts the payout.
  </Step>
</Steps>

Supported networks for v2: `base`, `solana`, `polygon`, `arbitrum`, `avalanche`, `ethereum`.

<Warning>
  Each `tx_hash` may be used only once across the entire platform. Reusing a hash that is already linked to any transfer returns `409`. A repeat call with the same `transfer_id` and `tx_hash` is idempotent.
</Warning>

## Quoting for v2

When quoting before a v2 transfer, pass `v2_offloader=true` to [`GET /api/payouts/quote`](/api-reference/payouts/get-a-quote). The fee fields are calculated for the v2 pipeline: `serviceFeePercent` reflects your configured fee plus 20 bips, `serviceFeeFixed` is `0`, and `providerCharge` is absent. See [Quotes and fees](/concepts/quotes-and-fees).
