Send funds tutorial

Follow this step by step guide to send payouts via payment links or transfers.

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-credit
  • instant-bank-credit
  • push-to-card
  • push-to-apple-pay
  • push-to-google-pay
  • ach-credit-same-day
  • ach-credit-standard
While 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-card
  • deferred-push-to-card
  • instant-push-to-apple-pay
  • deferred-push-to-apple-pay
  • push-to-google-pay
  • rtp-credit
  • ach-credit-same-day
  • ach-credit-standard

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.

List account reference

curl -X GET "https://api.moov.io/accounts" \
  -H "Authorization: Bearer {token}"
  -H "x-moov-version: v2026.07.00"

Get payment methods

Get the paymentMethodID for both the source and destination accounts.

List payment methods reference

curl -X GET "https://api.moov.io/accounts/{accountID}/payment-methods" \
  -H "Authorization: Bearer {token}" \
  -H "x-moov-version: v2026.07.00" \

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

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"
      }
    }
  }'\

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"
  }'\

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.

ACH same-day processing flow diagram

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"
    }
  }'\

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"
    }
  }'\

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"
    }
  }'\

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."
  }'\