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.

Depending on what type of payment method list you’d like to retrieve, you’ll need to provide certain information in your request:

  • To return a list of available payment methods, supply a single accountID in the source or destination object.
  • To return a list of payment methods filtered on the capabilities of the transfer participants, supply an accountID for both the source and destination object.
  • To return a list of valid payment methods for the account ID, supply one paymentMethodID and one accountID.

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
15
16
17
18
const moov = new Moov(credentialsObject);

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

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