> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mangopay.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Create a Refund for a Transfer

You can do a partial refund by providing a debited funds `Amount` value lower than the initial transaction amount. The debited funds amount must be 1 or more, if it is included.

[Read more about transfer refunds](/guides/refunds#transfer-refunds) **→**

### Path parameters

<ParamField path="TransferId" type="string" required>
  The unique identifier of the transfer.
</ParamField>

### Body parameters

<ParamField body="Tag" type="string">
  Max. length: 255 characters

  Custom data that you can add to this object.\
  For transactions (pay-in, transfer, payout), you can use this parameter to identify corresponding information regarding the user, transaction, or payment methods on your platform.
</ParamField>

<ParamField body="AuthorId" type="string" required>
  The unique identifier of the user at the source of the initial transaction.
</ParamField>

<ParamField body="DebitedFunds" type="object">
  **Default value:** The amount and currency values of the debited funds of the initial transaction.

  Required if the `Fees` parameter is included in the call.

  Information about the debited funds. Debited funds:

  * Takes by default the amount and currency values of the initial transaction when left empty.
  * Must be entered manually to perform a partial refund.
  * Cannot exceed the initial transaction `CreditedFunds` value when entered manually. This also applies to the sum of debited funds when making multiple partial refunds.

  <Expandable title="properties">
    <ParamField body="Amount" type="integer" required>
      An amount of money in the smallest sub-division of the currency (e.g., EUR 12.60 would be represented as `1260` whereas JPY 12 would be represented as just `12`).
    </ParamField>

    <ParamField body="Currency" type="string" required>
      **Allowed values:** The three-letter <a href="/api-reference/overview/data-formats" target="_blank">ISO 4217 code</a> (EUR, GBP, etc.) of a <a href="/guides/currencies" target="_blank">supported currency</a> (depends on feature, contract, and activation settings).

      The currency of the debited funds.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="Fees" type="object">
  **Default value:** The amount and currency values of the fees of the initial transaction.

  Required if the `DebitedFunds` parameter is included in the call.

  Information about the fees. This value:

  * Should be preceded by a minus sign (-) to refund the fees, otherwise more fees will be taken.
  * Takes by default the amount and currency values of the fees of the initial transaction when left empty (preceded by a -).
  * Cannot exceed the initial transaction fees amount when entered manually. This also applies to the sum of the amount of the fees when making multiple partial refunds.

  <Expandable title="properties">
    <ParamField body="Amount" type="integer" required>
      An amount of money in the smallest sub-division of the currency (e.g., EUR 12.60 would be represented as `1260` whereas JPY 12 would be represented as just `12`).
    </ParamField>

    <ParamField body="Currency" type="string" required>
      **Allowed values:** The three-letter <a href="/api-reference/overview/data-formats" target="_blank">ISO 4217 code</a> (EUR, GBP, etc.) of a <a href="/guides/currencies" target="_blank">supported currency</a> (depends on feature, contract, and activation settings).

      The currency of the debited funds.
    </ParamField>
  </Expandable>
</ParamField>

### Responses

<Accordion title="200">
  <ResponseField name="Id" type="string">
    Max length: 128 characters (see [data formats](/api-reference/overview/data-formats) for details)

    The unique identifier of the object.
  </ResponseField>

  <ResponseField name="Tag" type="string">
    Max. length: 255 characters

    Custom data that you can add to this object.\
    For transactions (pay-in, transfer, payout), you can use this parameter to identify corresponding information regarding the user, transaction, or payment methods on your platform.
  </ResponseField>

  <ResponseField name="CreationDate" type="Unix timestamp">
    The date and time at which the object was created.
  </ResponseField>

  <ResponseField name="AuthorId" type="string">
    The unique identifier of the user at the source of the initial transaction.
  </ResponseField>

  <ResponseField name="CreditedUserId" type="string">
    **Default value:** The unique identifier of the owner of the credited wallet.

    The unique identifier of the user whose wallet is credited.
  </ResponseField>

  <ResponseField name="DebitedFunds" type="object">
    **Default value:** The amount and currency values of the debited funds of the initial transaction.

    Information about the debited funds. Debited funds:

    * Takes by default the amount and currency values of the initial transaction when left empty.
    * Must be entered manually to perform a partial refund.
    * Cannot exceed the initial transaction `CreditedFunds` value when entered manually. This also applies to the sum of debited funds when making multiple partial refunds.

    <Expandable title="properties">
      <ResponseField name="Amount" type="integer">
        An amount of money in the smallest sub-division of the currency (e.g., EUR 12.60 would be represented as `1260` whereas JPY 12 would be represented as just `12`).
      </ResponseField>

      <ResponseField name="Currency" type="string">
        **Returned values:** The three-letter <a href="/api-reference/overview/data-formats" target="_blank">ISO 4217 code</a> (EUR, GBP, etc.) of a <a href="/guides/currencies" target="_blank">supported currency</a> (depends on feature, contract, and activation settings).

        The currency of the debited funds.
      </ResponseField>
    </Expandable>
  </ResponseField>

  <ResponseField name="CreditedFunds" type="object">
    Information about the credited funds (`CreditedFunds` = `DebitedFunds` - `Fees`).

    <Expandable title="properties">
      <ResponseField name="Currency" type="string">
        **Returned values:** The three-letter <a href="/api-reference/overview/data-formats" target="_blank">ISO 4217 code</a> (EUR, GBP, etc.) of a <a href="/guides/currencies" target="_blank">supported currency</a> (depends on feature, contract, and activation settings).

        The currency of the credited funds.
      </ResponseField>

      <ResponseField name="Amount" type="integer">
        An amount of money in the smallest sub-division of the currency (e.g., EUR 12.60 would be represented as `1260` whereas JPY 12 would be represented as just `12`).
      </ResponseField>
    </Expandable>
  </ResponseField>

  <ResponseField name="Fees" type="object">
    **Default value:** The amount and currency values of the fees of the initial transaction.

    Information about the fees. This value:

    * Should be preceded by a minus sign (-) to refund the fees, otherwise more fees will be taken.
    * Takes by default the amount and currency values of the fees of the initial transaction when left empty (preceded by a -).
    * Cannot exceed the initial transaction fees amount when entered manually. This also applies to the sum of the amount of the fees when making multiple partial refunds.

    <Expandable title="properties">
      <ResponseField name="Amount" type="integer">
        An amount of money in the smallest sub-division of the currency (e.g., EUR 12.60 would be represented as `1260` whereas JPY 12 would be represented as just `12`).
      </ResponseField>

      <ResponseField name="Currency" type="string">
        **Returned values:** The three-letter <a href="/api-reference/overview/data-formats" target="_blank">ISO 4217 code</a> (EUR, GBP, etc.) of a <a href="/guides/currencies" target="_blank">supported currency</a> (depends on feature, contract, and activation settings).

        The currency of the debited funds.
      </ResponseField>
    </Expandable>
  </ResponseField>

  <ResponseField name="Status" type="string">
    **Returned values:** `CREATED`, `SUCCEEDED`, `FAILED`

    The status of the transaction.
  </ResponseField>

  <ResponseField name="ResultCode" type="string">
    The code indicating the result of the operation. This information is mostly used to <a href="/errors/codes">handle errors</a> or for filtering purposes.
  </ResponseField>

  <ResponseField name="ResultMessage" type="string">
    The explanation of the result code.
  </ResponseField>

  <ResponseField name="ExecutionDate" type="Unix timestamp">
    The date and time at which the status changed to `SUCCEEDED`, indicating that the transaction occurred. The statuses `CREATED` and `FAILED` return an `ExecutionDate` of `null`.
  </ResponseField>

  <ResponseField name="Type" type="string">
    **Returned values:** `PAYIN`, `TRANSFER`, `CONVERSION`, `PAYOUT`

    The type of the transaction.
  </ResponseField>

  <ResponseField name="Nature" type="string">
    **Returned values:** `REGULAR`, `REPUDIATION`, `REFUND`, `SETTLEMENT`

    The nature of the transaction, providing more information about the context in which the transaction occurred:

    * `REGULAR` – Relative to most of the transactions (pay-ins, payouts, and transfers) in a usual workflow.
    * `REPUDIATION` – Automatic withdrawal of funds from the platform’s repudiation wallet as part of the dispute process (when the user has requested a chargeback).
    * `REFUND` – Reimbursement of a transaction to the user (pay-in refund), to a wallet (transfer refund), or of a payout (payout refund, only initiated by Mangopay).
    * `SETTLEMENT` – Transfer made to the repudiation wallet by the platform to settle a lost dispute.
  </ResponseField>

  <ResponseField name="InitialTransactionId" type="string">
    The unique identifier of the initial transaction being refunded.
  </ResponseField>

  <ResponseField name="InitialTransactionType" type="string">
    **Returned values:** `PAYIN`, `TRANSFER`, `PAYOUT`

    The type of the initial transaction being refunded.
  </ResponseField>

  <ResponseField name="InitialTransactionNature" type="string">
    **Returned values:** `REGULAR`, `REPUDIATION`, `REFUND`, `SETTLEMENT`

    The nature of the initial transaction being refunded, providing more information about the context in which the transaction occurred:

    * REGULAR – Relative to most of the transactions (pay-ins, payouts, and transfers) in a usual workflow.
    * REPUDIATION – Automatic withdrawal of funds from the platform’s repudiation wallet as part of the dispute process (when the user requested a chargeback).
    * REFUND – Reimbursement of a transaction to the user (pay-in refund), to a wallet (transfer refund), or of a payout (payout refund, only initiated by Mangopay).
    * SETTLEMENT – Transfer made to the repudiation wallet by the platform to settle the credit from a repudiation following a lost dispute.
  </ResponseField>

  <ResponseField name="DebitedWalletId" type="string">
    The unique identifier of the debited wallet.
  </ResponseField>

  <ResponseField name="CreditedWalletId" type="string">
    The unique identifier of the credited wallet.
  </ResponseField>

  <ResponseField name="RefundReason" type="object">
    Information about the reasons for the refund.

    <Expandable title="properties">
      <ResponseField name="RefundReasonMessage" type="string">
        Max. length: 255 characters

        Message explaining the reason for the refusal.
      </ResponseField>

      <ResponseField name="RefundReasonType" type="string">
        **Returned values:** `INITIALIZED_BY_CLIENT`, `BANKACCOUNT_INCORRECT`, `OWNER_DO_NOT_MATCH_BANKACCOUNT`, `BANKACCOUNT_HAS_BEEN_CLOSED`, `WITHDRAWAL_IMPOSSIBLE_ON_SAVINGS_ACCOUNTS`, `OTHER`

        The type of reason for the refund.
      </ResponseField>
    </Expandable>
  </ResponseField>
</Accordion>

<Accordion title="400 - Initial transfer already refunded">
  ```json theme={null}
  {
      "Message": "One or several required parameters are missing or incorrect. An incorrect resource ID also raises this kind of error.",
      "Type": "param_error",
      "Id": "1b89213a-a294-46b8-b52d-f3ab83637e7b",
      "Date": 1749200669.0,
      "errors": {
          "TransferId": "Original transaction has already been successfully refunded"
      }
  }
  ```
</Accordion>

<Accordion title="400 - Refund debited amount higher than transfer credited amount">
  ```json theme={null}
  {
      "Message": "One or several required parameters are missing or incorrect. An incorrect resource ID also raises this kind of error.",
      "Type": "param_error",
      "Id": "7ab5e4dd-769f-4d0a-82c6-d0139bcf24dd#1748866860",
      "Date": 1748866861,
      "errors": {
          "DebitedFunds": "DebitedFunds cannot be higher than CreditedFunds of the initial transfer"
      }
  }
  ```
</Accordion>

<Accordion title="400 - Incorrect AuthorId">
  ```json theme={null}
  {
      "Message": "One or several required parameters are missing or incorrect. An incorrect resource ID also raises this kind of error.",
      "Type": "param_error",
      "Id": "7daa662f-0fe0-4ddf-8865-450fe0217798",
      "Date": 1690287917.0,
      "errors": {
          "AuthorId": "Author of the refund is not the author of the initial transfer"
      }
  }  
  ```
</Accordion>

<ResponseExample>
  ```json 200 theme={null}
  {
      "Id":"155586343",
      "Tag":"custom meta",
      "CreationDate":1667916816,
      "AuthorId":"146476890",
      "CreditedUserId":null,
      "DebitedFunds":{
          "Currency":"EUR",
          "Amount":1100
      },
      "CreditedFunds":{
          "Currency":"EUR",
          "Amount":1120
      },
      "Fees":{
          "Currency":"EUR",
          "Amount":-20
      },
      "Status":"SUCCEEDED",
      "ResultCode":"000000",
      "ResultMessage":"Success",
      "ExecutionDate":1667916816,
      "Type":"TRANSFER",
      "Nature":"REFUND",
      "InitialTransactionId":"155585643",
      "InitialTransactionType":"TRANSFER",
      "InitialTransactionNature":"REGULAR",
      "DebitedWalletId":"152161320",
      "CreditedWalletId":"148968396",
      "RefundReason":{
          "RefundReasonMessage":null,
          "RefundReasonType":"OTHER"
      }
  }  
  ```
</ResponseExample>

<RequestExample>
  ```json REST   theme={null}
  {
      "Tag":"custom meta",
      "AuthorId":"146476890"
  }
    
  ```

  ```php PHP theme={null}
  <?php 

  require_once 'vendor/autoload.php';

  use MangoPay\MangoPayApi;
  use MangoPay\Libraries\ResponseException as MGPResponseException;
  use MangoPay\Libraries\Exception as MGPException;

  $api = new MangoPayApi();

  $api->Config->ClientId = 'your-client-id';
  $api->Config->ClientPassword = 'your-api-key';
  $api->Config->TemporaryFolder = 'tmp/';

  try {
      $transferId = '199132726';

      $refund = new \MangoPay\Refund();
      $refund->AuthorId = '146476890';
      $refund->DebitedFunds = new \MangoPay\Money();
      $refund->DebitedFunds->Amount = 500;
      $refund->DebitedFunds->Currency = 'EUR';
      $refund->Fees = new \MangoPay\Money();
      $refund->Fees->Amount = 0;
      $refund->Fees->Currency = 'EUR';
      $refund->Tag = 'Created using Mangopay PHP SDK';
      
      $response = $api->Transfers->CreateRefund($transferId, $refund);

      print_r($response);
  } catch(MGPResponseException $e) {
      print_r($e);
  } catch(MGPException $e) {
      print_r($e);
  }  
  ```

  ```javascript NodeJS   theme={null}
  const mangopayInstance = require('mangopay4-nodejs-sdk')
  const mangopay = new mangopayInstance({
    clientId: 'your-client-id',
    clientApiKey: 'your-api-key',
  })

  let myTransfer = {
    Id: '180974208',
  }

  let myRefund = {
    AuthorId: '170853400',
    Tag: 'Created using Mangopay Node.js SDK',
  }

  const createRefund = async (transferId, refund) => {
    return await mangopay.Transfers.createRefund(transferId, refund)
      .then((response) => {
        console.info(response)
        return response
      })
      .catch((err) => {
        console.log(err)
        return false
      })
  }

  createRefund(myTransfer.Id, myRefund)  
  ```

  ```ruby Ruby   theme={null}
  require 'mangopay'

  MangoPay.configure do |client|
      client.preproduction = true
      client.client_id = 'your-client-id'
      client.client_apiKey = 'your-api-key'
      client.log_file = File.join(Dir.pwd, 'mangopay.log')
  end

  def createTransferRefund(transferId, refundObject)
      begin
          response = MangoPay::Transfer.refund(transferId, refundObject)
          puts response
          return response
      rescue MangoPay::ResponseError => error
          puts "Failed to create Refund: #{error.message}"
          puts "Error details: #{error.details}"
          return false
      end
  end

  myTransfer = {
      Id: '194579950'
    }

  myRefund = {
      AuthorId: '194579896',
      Tag: 'Created with Mangopay Ruby SDK'
    }

  createTransferRefund(myTransfer[:Id], myRefund)  
  ```

  ```java Java theme={null}
  import com.google.gson.Gson;
  import com.google.gson.GsonBuilder;
  import com.mangopay.MangoPayApi;
  import com.mangopay.core.Money;
  import com.mangopay.core.enumerations.CurrencyIso;
  import com.mangopay.entities.Refund;

  public class CreateTransferRefund {
      public static void main(String[] args) throws Exception {
          MangoPayApi mangopay = new MangoPayApi();
          mangopay.getConfig().setClientId("your-client-id");
          mangopay.getConfig().setClientPassword("your-api-key");

          var authorId = "user_m_01HQK25M6KVHKDV0S36JY9NRKR";
          var transferId = "xfer_m_01J1WJCSBG0S4637BR54YYJX0Z";

          Refund refund = new Refund();
          refund.setAuthorId(authorId);
          refund.setDebitedFunds(new Money(CurrencyIso.EUR, 500));
          refund.setFees(new Money(CurrencyIso.EUR, 0));
          refund.setTag("Created using the Mangopay Java SDK");

          Refund createPayinRefund = mangopay.getTransferApi().createRefund(transferId, refund);

          Gson prettyPrint = new GsonBuilder().setPrettyPrinting().create();
          String prettyJson = prettyPrint.toJson(createPayinRefund);

          System.out.println(prettyJson);
      }
  }
  ```

  ```python Python   theme={null}
  from pprint import pprint
  import mangopay

  mangopay.client_id='your-client-id'
  mangopay.apikey='your-api-key'

  from mangopay.api import APIRequest
  handler = APIRequest(sandbox=True)

  from mangopay.resources import NaturalUser, TransferRefund, Transfer

  natural_user = NaturalUser.get('211918806')

  user_transfer = Transfer.get('214568995')

  transfer_refund = TransferRefund(
      author = natural_user,
      transfer = user_transfer
  )

  create_transfer_refund = transfer_refund.save()

  pprint(create_transfer_refund)  
  ```

  ```csharp .NET  theme={null}
  using MangoPay.SDK;
  using MangoPay.SDK.Core.Enumerations;
  using MangoPay.SDK.Entities;
  using MangoPay.SDK.Entities.POST;
  using Newtonsoft.Json;

  class Program
  {
      static async Task Main(string[] args)
      {
          MangoPayApi api = new MangoPayApi();

          api.Config.ClientId = "your-client-id";
          api.Config.ClientPassword = "your-api-key";

          var userId = "user_m_01J2TZ261WZNDM0ZDRWGDYA4GN";
          var transferId = "xfer_m_01J3ZG49W215VVZRJS394DKM00";

          var refund = new RefundTransferPostDTO(userId);

          var createRefund = await api.Transfers.CreateRefundAsync(transferId, refund);

          string prettyPrint = JsonConvert.SerializeObject(createRefund, Formatting.Indented);
          Console.WriteLine(prettyPrint);
      }
  }
  ```
</RequestExample>
