Send funds tutorial
Creating payouts and sending funds to an account with Moov is done through payment links or transfers. Both methods allow the creation of line items and recipient fees.
This guide covers how to pay out funds to other accounts and how to send funds to yourself.
- Payouts to employees, gig workers, and contractors
- Facilitating transfers between accounts
- Send funds to yourself
- Payouts for a transfer group
Payment methods
In a payout, the source account pushes to a payment method owned by the destination account (recipient). Before you create a payout, you'll need to determine which payment methods and which capabilities the destination and source accounts have.
In addition to a Moov wallet, the following payment methods are available to the destination account for receiving funds:
rtp-creditinstant-bank-creditpush-to-cardpush-to-apple-paypush-to-google-payach-credit-same-dayach-credit-standard
instant-bank-credit and rtp-credit both provide instant payments on the RTP rail, Moov strongly suggests using instant-bank-credit, which supports both the RTP and FedNow rails.
For each payment method, the destination account (recipient) only needs the transfers capability, which is automatically enabled. The source account will need to have the following capabilities per destination payment method:
| Destination payment method (recipient) | Source capability requirement |
|---|---|
ach-credit-standard, ach-credit-same-day |
send-funds.ach |
instant-bank-credit, rtp-credit |
send-funds.instant-bank |
push-to-card, push-to-apple-pay, push-to-google-pay |
send-funds.push-to-card or money-transfer.push-to-card |
For full details, see the capabilities, enablement, and payment methods guides.
Send funds to a recipient
The following steps walk you through finding an account and its available payment methods, and creating a payout.
Payout fees
When you send a payout via payment link or transfer, the funding wallet has the option to pass along the payout fee to the recipient. Choose which payment methods the recipient pays the fee for, and if no method is selected, the funding wallet (source) will pay the fee.
Set the PayoutFeePaidByKey to destination or source. If not set, the default is source (funding wallet).
{
"feePaidBy": {
"instant-push-to-card": "destination",
"deferred-push-to-card": "destination",
"instant-bank-credit": "destination"
}
}
PayoutFeePaidByKey options:
instant-push-to-carddeferred-push-to-cardinstant-push-to-apple-paydeferred-push-to-apple-paypush-to-google-payrtp-creditach-credit-same-dayach-credit-standard
Set payout to destination or source. If not set, the default is source (funding wallet).
{
"feePaidBy": {
"payout": "destination"
}
}
Get accountID
Retrieve the accountID for the Moov account you want to use as a source. Repeat the step for the destination account. You'll use the accountID to retrieve the payment methods in the next step.
Get payment methods
Get the paymentMethodID for both the source and destination accounts.
Create a payment link or transfer
To send a payout, create a payment link or transfer from a sender (source) to a recipient (destination).
Payment link
curl -X POST "https://api.moov.io/accounts/{accountID}/payment-links" \
-H "Authorization: Bearer {token}" \
-H "x-moov-version: v2026.07.00" \
--data-raw '{
"accountID": "c197cd40-7745-4413-8f3b-ec962d1b5225",
"merchantPaymentMethodID": "3afc7533-7095-43bb-b21a-5c4dc5568451",
"partnerAccountID": "d290f1ee-6c54-4b01-90e6-d701748f0851",
"amount": {
"currency": "USD",
"value": 10000
},
"maxUses": 0,
"expiresOn": "2026-08-24T14:15:22Z",
"display": {
"title": "string",
"description": "Payment for service",
"callToAction": "confirm"
},
"payout": {
"allowedPaymentMethods": [
"push-to-card",
"instant-bank-credit",
"deferred-push-to-card"
],
"recipient": {
"phone": {
"number": "5555555555",
"countryCode": "1"
}
},
"feePaidBy": {
"push-to-card": "destination",
"instant-bank-credit": "destination",
"deferred-push-to-card": "destination"
}
}
}'\
mc, _ := moov.NewClient()
var accountID string
mc.CreateTransfer(ctx, accountID, moov.CreateTransfer{
Source: moov.CreateTransfer_Source{
PaymentMethodID: "string",
},
Destination: moov.CreateTransfer_Destination{
PaymentMethodID: "string",
},
Amount: moov.Amount{
Value: 315, // $3.15
Currency: "USD",
},
Description: "Optional description of transaction",
})
Transfer
curl -X POST "https://api.moov.io/accounts/{accountID}/transfers" \
-H "Authorization: Bearer {token}" \
-H "X-Idempotency-Key: UUID" \
-H "X-Wait-For: rail-response" \
-H "x-moov-version: v2026.07.00" \
--data-raw '{
"source": {
"paymentMethodID": "string"
},
"destination": {
"paymentMethodID": "string"
},
"amount": {
"value": 10000, // $100.00
"currency": "USD"
},
"feePaidBy": {
"payout": "destination"
},
"description": "General contractor service"
}'\
mc, _ := moov.NewClient()
var accountID string
mc.CreateTransfer(ctx, accountID, moov.CreateTransfer{
Source: moov.CreateTransfer_Source{
PaymentMethodID: "string",
},
Destination: moov.CreateTransfer_Destination{
PaymentMethodID: "string",
},
Amount: moov.Amount{
Value: 315, // $3.15
Currency: "USD",
},
Description: "Optional description of transaction",
})
Line items
Line items allow you to list items within the transaction, each with their own distinct name, description, image, options, and price modifier. For tracking purposes, you can give each item a unique identifier using the productID field.
The total amount of the transfer must account for any and all costs associated with a line item's base price and price modifiers as well as sales tax:
amount = lineItems + salesTaxAmount
The shape of line items is the same for payment links and transfers, and can be added to both requests.
{
"lineItems": {
"item": {
"basePrice": {
"currency": "USD",
"valueDecimal": "100.00"
},
"name": "General contractor service",
"productID": "5afv22245-7095-24ba-b21a-5c4dc993737",
"quantity": 1
}
},
}
Send funds using a transfer group
When creating a transfer, you also have the option to use transfers groups. 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 "source": {
3 "transferID": "transferID"
4 },
5 "destination": {
6 "paymentMethodID": "string"
7 },
8 "amount": {
9 "value": 315, // $3.15
10 "currency": "USD"
11 },
12 "description": "Optional description of transaction"
13}
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.
Send funds to yourself
This guide covers how transfer funds to yourself. Some examples of self-to-self transfers include:
- A company transferring funds between accounts at two separate banks
- A contractor moving money from their Moov wallet to their bank account
- A platform adding funds from their bank account to their Moov wallet
In this guide, we'll use an example where you're performing a transfer from your wallet to your bank account. For the purposes of this guide, we'll assume that you've created a Moov account and gotten your API keys. For more detailed instructions, see our quick start guide.
Set up the account
Start by creating your Moov account. Request at least one send-funds capability for the account. You will need to submit specific data about the user to Moov for verification before the capability is enabled. See our capabilities guide for a list of required information.
curl -X POST "https://api.moov.io/accounts" \
-H "Authorization: Bearer {token}" \
-H "x-moov-version: v2024.01.00" \
--data-raw '{
"accountType": "individual",
"profile": {
"individual": {
"email": "julesjacksonyoga@moov.io",
"name": {
"firstName": "Jules",
"lastName": "Jackson",
}
},
"capabilities": ["send-funds"],
"foreignID": "unique-correlation-id"
}
}'\
mc, _ := moov.NewClient()
mc.CreateAccount(ctx, moov.CreateAccount{
Type: moov.AccountType_Business,
Profile: moov.CreateProfile{
Business: &moov.CreateBusinessProfile{
Name: "Whole Body Fitness LLC",
Type: moov.BusinessType_Llc,
},
},
RequestedCapabilities: []moov.CapabilityName{
moov.CapabilityName_SendFundsACH,
},
ForeignID: "unique-correlation-id",
})
Add bank account
Next, link your bank account account to your Moov account.
curl -X POST "https://api.moov.io/accounts/{accountID}/bank-accounts" \
-H "Authorization: Bearer {token}" \
-H "x-moov-version: v2024.01.00" \
--data-raw '{
"account": {
"accountNumber": "0004321567000",
"bankAccountType": "checking",
"holderName": "Jules Jackson",
"holderType": "individual",
"routingNumber": "123456789"
}
}'\
mc, _ := moov.NewClient()
var accountID string
mc.CreateBankAccount(ctx, accountID, moov.WithBankAccount(moov.BankAccountRequest{
AccountNumber: "0004321567000",
AccountType: moov.BankAccountType_Checking,
HolderName: "Jules Jackson",
HolderType: moov.HolderType_Individual,
RoutingNumber: "123456789",
}), moov.WaitForPaymentMethod())
Get payment methods
First, get a list of the available payment methods from the generate transfer options POST endpoint. Specify your account ID as both the source and the destination. You will get a list that includes all the payment methods you can use to make a self-to-self transfer. The payment method for the source of the transfer will be moov-wallet, while the payment method for the destination will be ach-credit-standard or ach-credit-same-day.
curl -X POST "https://api.moov.io/accounts/{accountID}/transfer-options" \
-H "Authorization: Bearer {token}" \
-H "x-moov-version: v2024.01.00" \
--data-raw '{
"amount": {
"value": 100,
"currency": "USD"
}
"destination": {
"accountID": "string"
},
"source": {
"accountID": "string"
}
}'\
mc, _ := moov.NewClient()
// your partner accountID
var accountID string
mc.TransferOptions(ctx, accountID, moov.CreateTransferOptions{
Source: moov.CreateTransferOptionsTarget{
AccountID: "string",
},
Destination: moov.CreateTransferOptionsTarget{
AccountID: "string",
},
Amount: moov.Amount{
Currency: "USD",
Value: 1,
},
})
Initiate the transfer
Once you've selected your payment methods, you can initiate a transfer from your bank account to your wallet, using the payment method IDs you got earlier in the transfer options request.
curl -X POST "https://api.moov.io/accounts/{accountID}/transfers" \
-H "Authorization: Bearer {token}" \
-H "X-Idempotency-Key: UUID" \
-H "X-Wait-For: rail-response" \
-H "x-moov-version: v2024.01.00" \
--data-raw '{
"amount": {
"value": 100,
"currency": "USD"
},
"destination": {
"paymentMethodID": "string"
},
"source": {
"paymentMethodID": "string"
},
"description": "Optional transaction description."
}'\
mc, _ := moov.NewClient()
var accountID string // Partner account
mc.CreateTransfer(ctx, accountID, moov.CreateTransfer{
Amount: moov.Amount{
Currency: "USD",
Value: 100, // $1.00
},
Destination: moov.CreateTransfer_Destination{
PaymentMethodID: "string",
},
Source: moov.CreateTransfer_Source{
PaymentMethodID: "string",
},
Description: "Optional transaction description.",
})