> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.coinflow.cash/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.coinflow.cash/_mcp/server.

# Batch Refunds

Merchants can refund several transactions at once. Every transaction in a batch is refunded independently, so a transaction that cannot be refunded is reported back on its own without stopping the others.

> **Warning**
>
> Batch refunds are always for the **full remaining amount** of each transaction. To refund part of a transaction, refund it on its own - see [Partial Refunds](/guides/checkout/payment-scenarios/refunds/partial-refunds).

### Refund from Dashboard

To refund several transactions from the dashboard:

1. On the merchant dashboard, navigate to the **Payments** tab.
2. Select the checkbox at the left of each transaction to refund. The checkbox in the header row selects every refundable transaction currently loaded.
3. Select **Refund transactions** above the table. The button stays disabled until at least one transaction is selected.
4. Enter the refund reason, which applies to every transaction in the batch, and confirm.

Transactions that are not in a refundable state have a disabled checkbox. Payment methods that need extra details supplied for each individual refund are also excluded, and must be refunded one at a time.

Progress is reported as a single notification while the refunds are processed, and each refund then appears on the **Refunds** tab like any other.

### Refund API

Merchants can call Coinflow's [Batch Refund Payments endpoint](/api-reference/api-reference/merchant/batch-refund-payments) with up to 100 payment ids per request. The response reports the outcome for each payment individually: `jobId` when the refund was queued, or `error` explaining why it was not.

A result marked `skipped` is one this endpoint can never process, whatever its state — refund it on its own rather than retrying the batch. Payments needing a destination supplied for each refund are always skipped, so they are counted separately from `failed`.

**`Request`**

```curl Request
// Example of how to refund several payments in full with one request.


curl --request PUT \
     --url https://api-sandbox.coinflow.cash/api/merchant/payments/refunds/batch \
     --header 'Authorization: YOUR_API_KEY' \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --data '
{
  "paymentIds": [
    "10475192-95e4-4065-bafd-61e564468129",
    "2a9f4c31-7b18-4e02-9c55-1d3f8ab27e64",
    "7c1e5d80-3f42-4a96-8b21-6e90cf5713da"
  ],
  "refundReason": "failedFulfillment"
}
'
```

**`Response`**

```json Response
{
  "queued": 1,
  "failed": 1,
  "skipped": 1,
  "results": [
    {
      "paymentId": "10475192-95e4-4065-bafd-61e564468129",
      "success": true,
      "jobId": "RefundPipeline10475192-95e4-4065-bafd-61e564468129"
    },
    {
      "paymentId": "2a9f4c31-7b18-4e02-9c55-1d3f8ab27e64",
      "success": false,
      "error": "Not in refundable state"
    },
    {
      "paymentId": "7c1e5d80-3f42-4a96-8b21-6e90cf5713da",
      "success": false,
      "skipped": true,
      "error": "Payments must be refunded individually when each refund needs its own destination"
    }
  ]
}
```

To view the refund details for any payment in the batch, call the [View Refund Information for Payment](/api-reference/api-reference/refund/get-refund-via-payment-id) endpoint with that payment id.