Send funds

Follow this step by step guide to send funds using our API or SDKs.

This guide covers how to send funds. This covers multiple use cases, including:

  • Payouts to employees, gig workers, and contractors
  • Facilitating transfers between accounts on a platform

The examples below provide step by step instructions on setting up a single transfer, as well as instructions for payouts in a transfer group.

For more detailed information, see the payment methods and transfer groups guides.

Get accountID

Retrieve the accountID for the Moov account you want to use as a source. Repeat the step for the destination(s). You’ll use the accountID to retrieve the payment methods in the next step.

List account reference

1
2
curl -X GET "https://api.moov.io/accounts/" \
  -H "Authorization: Bearer {token}" \

List account reference

1
2
3
mc := moov.NewClient()

mc.ListAccounts(ctx)

List account reference

1
2
3
const moov = new Moov(credentialsObject);

moov.accounts.list();

Get payment methods

Get the paymentMethodID for both the source and destination accounts.

List payment methods reference

1
2
3
4
5
curl -X GET "https://api.moov.io/accounts/{accountID}/payment-methods \
  -H "Authorization: Bearer {token}" \
  --data-raw '{
    "accountID"
  }'\

List payment methods reference

1
2
3
mc := moov.NewClient()

mc.ListPaymentMethods(ctx, account.AccountID)

List payment methods reference

1
2
3
const moov = new Moov(credentialsObject);
const accountID = "accountID";
moov.accounts.paymentMethods.list({accountID});

List payment methods reference

1
2
3
const moov = Moov(token);
const accountID = "accountID";
moov.accounts.paymentMethods.list({accountID});

A successful response will return an array of payment method types. A source can be one of the following types:

  • ach-debit-fund
  • moov-wallet

A destination can be one of the following types:

  • ach-debit-collect
  • ach-credit-standard
  • ach-credit-same-day
  • moov-wallet
  • rtp-credit (beta)

See the payment methods guide for information on what source and destination types are compatible.

Create the transfer

To send a payout, create a transfer from a sender (source) to a recipient (destination).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
curl -X POST "https://api.moov.io/transfers" \
  -H "Authorization: Bearer {token}" \
  -H "X-Idempotency-Key: UUID" \
  -H "X-Wait-For: rail-response" \
  --data-raw '{
    "source": {
      "paymentMethodID": "UUID"
    },
    "destination": {
      "paymentMethodID": "UUID"
    },
    "amount": {
      "value": 315, // $3.15
      "currency": "USD"
    },
    "description": "Optional description of transaction"
  }'\
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
mc := moov.NewClient()

mc.CreateTransfer(ctx, moov.CreateTransfer{
  Source: moov.CreateTransfer_Source{
    PaymentMethodID: UUID, 
  },
  Destination: moov.CreateTransfer_Destination{
    PaymentMethodID: UUID,
  },
  Amount: moov.Amount{
    Value: 315, // $3.15
    Currency: "USD",
  },
  Description: "Optional description of transaction",
)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
const moov = new Moov(credentialsObject);

const transfer = await moov.transfers.create({
  destination: {
    paymentMethodID: "UUID"
  },
  source: {
    paymentMethodID: "UUID"
  },
  amount: {
    value: 315, // $3.15
    currency: "USD"
  },
  description: "Optional description of transaction"
});

Send funds using a transfer group

You have the option to use transfer groups when sending payouts. To create a transfer group, provide the transferID (of the immediate preceding transfer) as the source. Transfers that belong to a group must have an amount less than or equal to the amount of the source transfer. See the transfer groups guide for more detailed information.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{
  "source": {
    "transferID": "transferID"
  },
  "destination": {
    "paymentMethodID": "UUID"
  },
  "amount": {
    "value": 315, // $3.15
    "currency": "USD"
  },
  "description": "Optional description of transaction"
}

Track the transfer

You have the option of subscribing to the transfer.updated webhook event. This will notify you of transfer stage updates (rail specific granular updates will also trigger the event).

See the diagram below for examples of ACH same-day transfer timing. The payment is processed the same day, then funds will be made available later to account for possible returns or processing issues.

ACH same-day processing flow diagram

Next steps

Summary Beta