Transfers overview

Understand how funds flow through Moov when choosing different source and destination payment methods.

All transfers facilitated with Moov involve money moving in, out, through, or within the Moov platform. Since all funds flow through Moov, a single transfer can take advantage of multiple payment rails which allows you to tailor the cost, speed, and risk of each payment to your particular use case.

Source
Bank accounts
Debit / credit cards
Wallets
right_key
Destination
Bank accounts
Wallets

Get transfer options

When initiating a transfer, you’ll need to know what payment methods are available to use since not all payment method combinations are valid. Some payment methods can only be used as the source, and some can only be used as the destination. Available payment methods also depend on the enabled capabilities of the source and destination accounts.

You can use our API to request valid transfer source and destination combinations between accounts. The transfer options POST endpoint takes valid payment method combinations and network-specific restrictions such as maximum payment amounts into account. In practice, transfer options can be used to present a menu of different options for how and where you want money to move.

If you provide an accountID, this endpoint will return you a list of valid payment methods for the source or destination. If you submit an accountID along with paymentmethodID, we will return you a list of valid payment methods based on what you provided. For example, if you’re looking to make a transfer with a specific account and you know the source is a card, you can learn what destination options are available using this endpoint.

In the example below, the information provided will list payment methods filtered on the capabilities of the transfer participants.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
curl -X POST "https://api.moov.io/transfer-options" \
  -H "Authorization: Bearer {token}" \
  --data-raw '{
    "amount": {
      "value": 100,
      "currency": "USD"
    }
    "destination": {
      "accountID": "UUID"
    },
    "source": {
      "accountID": "UUID"
    }
  }'\
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
mc, _ := moov.NewClient()

mc.TransferOptions(ctx, moov.CreateTransferOptions{
  Amount: moov.Amount{
    Currency: "USD",
    Value:    100,
  },
  Source: moov.CreateTransferOptionsTarget{
    AccountID: "UUID",
  },
  Destination: moov.CreateTransferOptionsTarget{
    AccountID: "UUID",
  },
})
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
const moov = new Moov(credentialsObject);

const transferOptions = {
  amount: {
    value: 100, 
    currency: "USD"
  },
  destination: {
    accountID: UUID
  },
  source: {
    accountID: UUID
  }
}

const options = await moov.transfers.getTransferOptions(transferOptions);

See the payment methods guide for detailed information on what payment method combinations are valid.

Idempotency

To prevent duplicate transfers, every POST /transfers request requires an X-Idempotency-Key header. You are responsible for generating a version 4 UUID idempotency key. If you try to create a transfer with the same idempotency key twice, your second attempt will result in a 409 error response indicating that a transfer was previously created with that idempotency key.

Bank holidays

Bank holidays can cause delays in transfers. If you’re creating a transfer on a bank holiday, it will be processed on the next business day. Settlement from the prior day’s card sales will be delayed when the settlement day is a bank holiday. The Moov Dashboard will show a notice if a bank holiday is coming up. You can also check the Federal Reserve website for a full list of bank holidays.

Holidays observed by the Federal Reserve System include:

  • New Year’s Day
  • Martin Luther King Jr. Day
  • Presidents’ Day
  • Memorial Day
  • Juneteenth
  • Independence Day
  • Labor Day
  • Columbus Day
  • Veterans Day
  • Thanksgiving Day
  • Christmas Day

FAQ

Why did a transfer fail?
Transfers can fail for a number of reasons related to the source or destination, or due to insufficient funds. Read our transfer failures guide to learn more.
Can I re-start a transfer that never completed?
Depending on the status of the transfer, you may be able to replay that transfer. Transfers in a “non-terminal” state (such as a child transfer stuck in queued) can be replayed by Moov, but transfers with the failed status are in a “terminal state,” meaning they cannot be replayed in our system. For reinitiating transfers that were in a terminal state, you will need to create a brand new transfer with the same details.
Why is my LIST transfers request taking so long?
When you run a LIST transfers request, you retrieve 200 transfers at a time. You can advance past a results set of 200 transfers by using the skip parameter (for example, if you set skip= 10, you will see a results set of 200 transfers after the first 2000). However, if you are searching a high volume of transfers, the request will likely process slowly. To get faster performance, restrict the data as much as you can by using the StartDateTime and EndDateTime parameters for a limited period of time. You can run multiple requests in smaller time window increments until you’ve retrieved all the transfers you need.
Summary Beta