---
title: "Create a refund"
method: POST
path: "/transfer/refund/create"
tags: ["plaid"]
---

# Create a refund

`POST /transfer/refund/create`

Use the `/transfer/refund/create` endpoint to create a refund for a transfer. A transfer can be refunded if the transfer was initiated in the past 180 days.

Processing of the refund will not occur until at least 4 business days following the transfer's settlement date, plus any hold/settlement delays. This 3-day window helps better protect your business from regular ACH returns. Consumer initiated returns (unauthorized returns) could still happen for about 60 days from the settlement date. If the original transfer is canceled, returned or failed, all pending refunds will automatically be canceled. Processed refunds cannot be revoked.

## Request body

- TransferRefundCreateRequest — Defines the request schema for `/transfer/refund/create`
  - `client_id` string — Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body.
  - `secret` string — Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body.
  - `transfer_id` string, required — The ID of the transfer to refund.
  - `amount` string, required — The amount of the refund (decimal string with two digits of precision e.g. "10.00").
  - `idempotency_key` string, required — A random key provided by the client, per unique refund. Maximum of 50 characters. The API supports idempotency for safely retrying requests without accidentally performing the same operation twice. For example, if a request to create a refund fails due to a network connection error, you can retry the request with the same idempotency key to guarantee that only a single refund is created.

## Response `200`

OK

- TransferRefundCreateResponse — Defines the response schema for `/transfer/refund/create`
  - `refund` TransferRefund, required — Represents a refund within the Transfers API.
    - `id` string, required — Plaid’s unique identifier for a refund.
    - `transfer_id` string, required — The ID of the transfer to refund.
    - `amount` string, required — The amount of the refund (decimal string with two digits of precision e.g. "10.00").
    - `status` 'pending' | 'posted' | 'cancelled' | 'failed' | 'settled' | 'returned', required — The status of the refund. `pending`: A new refund was created; it is in the pending state. `posted`: The refund has been successfully submitted to the payment network. `settled`: Credits have been refunded to the Plaid linked account. `cancelled`: The refund was cancelled by the client. `failed`: The refund has failed. `returned`: The refund was returned.
    - `failure_reason` TransferRefundFailure, nullable, required — The failure reason if the event type for a refund is `"failed"` or `"returned"`. Null value otherwise.
      - `ach_return_code` string, nullable — The ACH return code, e.g. `R01`. A return code will be provided if and only if the refund status is `returned`. For a full listing of ACH return codes, see [Transfer errors](https://plaid.com/docs/errors/transfer/#ach-return-codes).
      - `description` string — A human-readable description of the reason for the failure or reversal.
    - `created` string, date-time, required — The datetime when this refund was created. This will be of the form `2006-01-02T15:04:05Z`
    - `network_trace_id` string, nullable — The trace identifier for the transfer based on its network. This will only be set after the transfer has posted. For `ach` or `same-day-ach` transfers, this is the ACH trace number. For `wire` transfers, this will be in the format of `<IMAD>/<OMAD>`. The field will remain null for transfers on other rails.
  - `request_id` string, required — A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive.

## Other responses

- `default` — Error response

## Changes

- **2024-02-21** `5de70cc1e6ca` — 5 warning, 12 info
  - removed the optional property `error_code_reason` from the response with the `default` status
  - removed the optional property `provided_account_subtypes` from the response with the `default` status
  - removed the optional property `refund/failure_reason/failure_code` from the response with the `200` status
  - removed the optional property `refund/ledger_id` from the response with the `200` status
  - …13 more

[Change history](https://skmtc.dev/plaid/apis/the-plaid-api/changes/transfer/refund/create/post.md)

---

[API](https://skmtc.dev/plaid/apis/the-plaid-api.md) · [All operations](https://skmtc.dev/plaid/apis/the-plaid-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/plaid/the-plaid-api/revisions/5de70cc1e6ca/schema)
