Transfers

A transfer moves money from a source payment method to a destination payment method, and every one follows the same arc: you create it, a payment rail moves it, the funds land, and for some time after that it can still be undone or come back. Plan your product around the whole arc, not just the API call.

Webhooks

    Start a transfer

    The source and destination payment methods you choose set the rail, and with it the cost, speed, and risk. See choose a payment method to compare them.

    Create a transfer with POST /accounts/{accountID}/transfers (API reference), where accountID is your partner account. Two rules apply to every transfer:

    • A 2xx response means Moov accepted the transfer, not that money moved. Don't ship goods or mark an invoice paid until the transfer reaches the status that matters for you. See create transfer responses.
    • Send an X-Idempotency-Key header. It's required, and it stops a retried request from creating a second transfer. See idempotency.

    Get transfer options

    Not every source and destination pair is valid, and what's available depends on each account's capabilities. The transfer options POST endpoint returns the valid combinations, accounting for network restrictions such as maximum amounts. Use it to show a payer or payee a menu of ways to move money.

    • Send an accountID for the source or destination to list its valid payment methods.
    • Add a paymentMethodID to narrow the results. For example, if you know the source is a card, the response lists the destinations that card can pay.
    curl -X POST "https://api.moov.io/accounts/{accountID}/transfer-options" \
      -H "Authorization: Bearer {token}" \
      -H "x-moov-version: v2026.07.00" \
      --data-raw '{
        "amount": {
          "value": 100,
          "currency": "USD"
        },
        "destination": {
          "accountID": "string"
        },
        "source": {
          "accountID": "string"
        }
      }'
    

    See payment methods for every valid combination and transfer limits.

    Track a transfer as it moves

    Each rail moves money on its own schedule:

    • Cards authorize in seconds, then settle overnight at the card brand's cutoff.
    • ACH moves in batches. A transfer waits for the next cutoff, and banking days are Monday through Friday.
    • Instant payments (RTP or FedNow) and push to card run in seconds or minutes, 24/7/365.

    A transfer has an overall status, and each leg has its own rail status, such as cardDetails.status or achDetails.status. Both change over time, and the transfer.updated webhook tells you when. Statuses & webhooks lists every status and when a payment counts as successful.

    Bank holidays

    Transfers created on a bank holiday process on the next banking day, and card settlement due on a holiday shifts to the next banking day. Instant payments (RTP or FedNow) and push to card run every day. The Dashboard shows a notice before an upcoming holiday, and the Federal Reserve publishes the full schedule.

    Federal Reserve holidays are New Year's Day, Martin Luther King Jr. Day, Presidents' Day, Memorial Day, Juneteenth, Independence Day, Labor Day, Columbus Day, Veterans Day, Thanksgiving Day, and Christmas Day.

    Where the money lands

    Money you collect lands in the receiving account's Moov wallet, not directly in a bank account. Card payments, pulls from cards, and ACH debits all credit a wallet. To get money to a bank account or card, you pay it out from the wallet, either one transfer at a time or automatically with a daily sweep.

    A wallet's availableBalance only counts incoming funds once their transfer completes, and money you send out leaves it right away. See wallet balance.

    The exception is a bank-to-bank ACH transfer. Moov debits one bank account and credits the other in a single transfer, and the funds pass through Moov without landing in a wallet you can spend from. Not every use case is eligible; see ACH.

    Moov may temporarily hold incoming funds for review, for example on a new account or on unusually high volume. See fund a wallet.

    Undo a payment

    A completed payment isn't always final. A payment is cancelable until it moves. After that, the options depend on the rail:

    Rail Before it moves After it moves
    Card A reversal cancels the authorization until settlement The same reversal becomes a refund, debited from the wallet right away
    ACH Cancel until the debit or credit originates No refunds; send a new transfer in the opposite direction
    Instant payments, push to card — Final once sent
    Wallet to wallet — Send a new transfer back

    Returns and disputes

    Some payments come back without you doing anything. A cardholder can dispute a card payment, and a bank can return an ACH debit or credit. Moov takes the money back from the wallet that received it, even if it has already been paid out, so the wallet can go negative. Keep listening for transfer.updated and dispute.created after a payment completes.

    Timing by rail

    The modeler uses this timing. Each rail's guide has the details.

    Rail Cutoff When funds arrive How to undo Can still come back
    Card payment Card brand settlement cutoff, early the next morning Next banking day by 1:00 PM ET Reversal cancels before settlement, refunds after Disputes, debited from the wallet when the chargeback arrives
    Pull from card None, 24/7/365 On authorization, for supported cards Refund Disputes
    ACH debit Same-day windows at 10:00 AM, 2:15 PM, and 4:15 PM ET Morning of the second banking day; same day with faster ACH Cancel until the debit originates Returns, usually within 2 banking days; unauthorized returns up to 60 days after settlement
    Daily sweep Sweep closes at 4:00 PM ET on banking days Same day by 6:00 PM ET (same-day ACH), next banking day (standard ACH), or seconds (instant) Not applicable; each payout is a transfer you can follow A failed payout pauses the sweep until a new bank account is verified
    Same-day ACH Same-day windows at 10:00 AM, 2:15 PM, and 4:15 PM ET Same banking day if created before the 4:15 PM ET cutoff Cancel until the credit originates The receiving bank can return it, usually within 2 banking days
    Standard ACH 5:30 PM ET Next banking day Cancel until the credit originates The receiving bank can return it, usually within 2 banking days
    Instant (RTP or FedNow) None, 24/7/365 Seconds Final once sent None after completion
    Push to card None, 24/7/365 Within 30 minutes for fast funds cards Final once the issuer approves it None after completion
    Wallet transfer None Immediately Send a new transfer back None after completion

    List transfers

    The list transfers endpoint returns up to count transfers per page, newest first. Offset pagination with skip is limited to a maximum skip of 200,000. To paginate through larger transfer histories, use a cursor instead.

    Request the first page without a cursor:

    curl -i "https://api.moov.io/accounts/{accountID}/transfers?status=completed&count=200" \
      -H "Authorization: Bearer {token}" \
      -H "x-moov-version: v2026.07.00"
    

    If more transfers are available, the response includes an X-Next-Cursor header:

    HTTP/1.1 200 OK
    X-Next-Cursor: eyJ2IjoxLCJ0IjoiMjAyNi0wOS0yNVQxMjowMDowMFoiLCJpZCI6IjAwMDAwMDAwLTAwMDAtNDAwMC04MDAwLTAwMDAwMDAwMDAwMSJ9
    

    To get the next page, pass that value as the cursor query parameter. Keep the other query parameters the same:

    curl -i "https://api.moov.io/accounts/{accountID}/transfers?status=completed&count=200&cursor=eyJ2IjoxLCJ0IjoiMjAyNi0wOS0yNVQxMjowMDowMFoiLCJpZCI6IjAwMDAwMDAwLTAwMDAtNDAwMC04MDAwLTAwMDAwMDAwMDAwMSJ9" \
      -H "Authorization: Bearer {token}" \
      -H "x-moov-version: v2026.07.00"
    

    Repeat until a response has no X-Next-Cursor header, which means you've reached the last page.

    • Use the same filters on every page. Changing filters between pages can skip or repeat transfers.
    • Treat the cursor as opaque. Don't parse, build, or modify it.
    • Don't combine cursor with skip. The request fails with a 422 error.
    • Transfers created after you fetch the first page don't appear on later pages.

    In the Dashboard

    The Transfers section of the Dashboard provides an overview of your account's transfer history. You can create and manage transfers, including reversals, refunds, and cancellations, and view and manage disputes.

    Transfer list view in Moov Dashboard

    Peek preview

    The peek preview shortcut gives you fast access to transfer status and details. Press the space key to toggle the preview on and off. You can move your cursor up and down the transfer list and the preview will update with the corresponding transfer details. The esc key will also dismiss the preview. Press c while the preview is open to copy the transferID to your clipboard.

    Create a transfer

    Create a transfer between any two Moov accounts by clicking New transfer and choosing Payout or Collect. You can also create a scheduled transfer or recurring transfers. See scheduling for more information.

    You'll need to input the following information to create a transfer:

    • A product or an amount
    • Source
    • Destination

    Optionally, you can enter:

    • Tax amount
    • Tip amount
    • Surcharge amount (credit card transactions)
    • Payout fees
    • Recipient fees (payouts)
    • Description
    • Metadata
    • ACH addenda (ACH transfers)

    New transfer form in Moov Dashboard

    Any business that intends to add a surcharge to credit card transactions must notify Moov 30 days before implementing surcharges. See the surcharges guide for more information.

    To pass a payout fee along to the recipient, look under Advanced settings when creating the transfer and find the Payout fee funding option. If not set, the source wallet pays the payout fee.

    Enable payout fees

    Transfer details

    Clicking any transfer will bring you to the Transfer details page, where you can manage and review information about a transfer and its current status.

    Transfer detail view in Moov Dashboard

    The transfer timeline shows information on each leg of the transfer to give transparency on where the funds are in the process. For example, if a transfer from a bank account to a Moov wallet is created, you'll see the ACH debit information followed by the funds availability in the wallet.

    Refund, reverse, or cancel a transfer

    On the Transfer details page, click Refund and choose a full or partial amount. This starts a reversal: if the transfer hasn't settled, Moov cancels it and the timeline shows Canceled; otherwise Moov issues a refund.

    Initiate a refund

    To cancel directly, click Cancel. Card cancellations fail once the network has settled, and ACH transfers can only be canceled inside the ACH cancellation window. Canceling one transfer in a transfer group cancels the transfers after it, but doesn't affect future scheduled transfers.

    Initiate a cancellation

    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.
    How do I retrieve a large number of transfers?
    The list transfers endpoint returns up to 200 transfers per page (set the page size with count). For large result sets, use cursor pagination: when more transfers are available, the response includes an X-Next-Cursor header. Pass its value as the cursor query parameter, with the same filters and count, to get the next page. Filters such as startDateTime and endDateTime, status, and accountIDs keep each page to the transfers you need.
    In this section