# Refunds

> Issue full or partial refunds on card payments with Moov's refunds endpoint, and learn when to use the more flexible reversals endpoint instead.

> AI agents: search and read all Moov docs with the docs MCP server at https://docs.moov.io/mcp (no API key). Setup: https://docs.moov.io/guides/developer-tools/mcp-ai/docs-mcp/index.md

The refunds endpoint sends a full or partial credit back to the card used for a payment. For most cases, use [reversals](/guides/accept-payments/cards/reversals/index.md) instead: it cancels the payment if it hasn't settled, which is cheaper and faster, and refunds it if it has.

Use the refunds endpoint directly when you need a partial refund on a payment with a [surcharge](/guides/accept-payments/cards/surcharges/index.md). Refunds apply to card payments only; ACH transfers can be [canceled](/guides/money-movement/ach/cancellations/index.md) before they originate.

## Refund rules

A refund immediately debits the destination wallet balance of the original transfer and returns either full or partial funds to the source card used in the transaction. Once a refund is initiated, Moov submits the credit information to the customer's card issuer. Typically, customers should immediately see a pending credit to their card that posts within 5-7 business days, although the actual timing may vary by bank.

- Only one refund can be initiated at a time per transfer
- You cannot refund more than the original transfer amount
- Refunds cannot be canceled after they are issued
- To avoid a potential double charge, do not attempt to refund a payment that has been disputed by the cardholder
- If the refund fails, you are able to initiate the refund again, for the same transfer

## Create a refund

### Full refund

Call the refunds `POST` [endpoint](/api/money-movement/refunds/create/index.md) without a request body.

**cURL**

```zsh
curl -X POST "https://api.moov.io/accounts/{accountID}/transfers/{transferID}/refunds" \
  -H "Authorization: Bearer {token}" \
  -H "x-idempotency-key: UUID" \
  -H "X-Wait-For: rail-response" \
  -H "x-moov-version: v2026.07.00"
```

**Go SDK**

```go
mc, _ := moov.NewClient()

var accountID string
var transferID string

mc.RefundTransfer(ctx, accountID, transferID, moov.CreateRefund{
    Amount: 1700,
})
```

### Partial refund

Include an `amount` in the request body.

**cURL**

```zsh
curl -X POST "https://api.moov.io/accounts/{accountID}/transfers/{transferID}/refunds" \
  -H "Authorization: Bearer {token}" \
  -H "x-idempotency-key: UUID" \
  -H "X-Wait-For: rail-response" \
  -H "x-moov-version: v2026.07.00" \
  --data-raw '{
    "amount": 1000
  }'
```

You can also refund from the [Dashboard](/guides/money-movement/overview/index.md#refund-reverse-or-cancel-a-transfer).

## Track the refund

The refund's `status` is `pending`, `completed`, or `failed`, and `cardDetails.status` gives the rail detail. Subscribe to `refund.created` and `refund.updated`, or call the [retrieve a refund](/api/money-movement/refunds/get/index.md) endpoint. Status definitions are in [reversals](/guides/accept-payments/cards/reversals/index.md#track-the-outcome).

