> ## 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 Transfer

<Warning>
  **Caution - ScaContext default value changing**

  On this endpoint, the default value for `ScaContext` is changing to `USER_PRESENT` on **Dec 15, 2025** (Dec 1 in Sandbox).

  From this date, if the `PendingUserAction.RedirectUrl` value is returned, then you need to redirect the user to perform SCA.

  With approval from Mangopay, your platform may be able to use the `USER_NOT_PRESENT` value provided you also have a legal proxy in place with the user and the user's consent to initiate transfers on their behalf (read more about [proxy management](/guides/sca/proxy-management)).
</Warning>

<Note>
  **Note – SCA may be triggered by this endpoint**

  When a user with `UserCategory` `OWNER` initiates a transfer to another `OWNER` they are required to [authenticate the transfer with SCA](/guides/sca/transfers), unless Mangopay applies a [low-amount or low-risk exemption](/guides/sca#exemptions-available-to-mangopay) to the transfer (or unless your platform is using a [proxy and user consent](/guides/sca/proxy-management)).

  To let the user complete the SCA session on the Mangopay-hosted webpage, your platform needs to retrieve the returned `PendingUserAction.RedirectUrl`, add an encoded `returnUrl` query parameter, and redirect the user. Read more about how to redirect them in the [SCA session](/guides/sca/session) guide.

  In Sandbox, you can bypass SCA by including the word `accept` in the `Email` value of the [Natural User](/api-reference/users/natural-user-object-sca) or the `LegalRepresentative.Email` value of the [Legal User](/api-reference/users/legal-user-object-sca) – for example `accept@example.com` or `john.doe+accept@example.com`.
</Note>

### Body parameters

<ParamField body="ScaContext" type="string">
  **Possible values:** `USER_PRESENT`, `USER_NOT_PRESENT`

  The SCA context of the request, which is **required** if the debited wallet owner's `UserCategory` is `OWNER`:

  * `USER_PRESENT` – The user is taking the SCA-triggering action of initiating a transfer. The platform must [redirect the user](/guides/sca/session) using the `PendingUserAction.RedirectUrl` returned so that the user can complete the SCA session (unless Mangopay applied an exemption for low-amount and low-risk transfers, so no redirection link was returned).
  * `USER_NOT_PRESENT` – The platform is taking the action under proxy from the user and the user has previously given consent to Mangopay (via the SCA hosted experience) to allow the action. If the user has not given (or has revoked) their consent, then `USER_NOT_PRESENT` returns a 403 error.

  Read more about [managing proxy and user consent](/guides/sca/proxy-management) **→**

  **Note:** For existing platforms, the parameter is technically optional if the debited wallet owner's `UserCategory` is `OWNER`, and the default value will become `USER_PRESENT` from **Dec 15, 2025** (Dec 1 in Sandbox)
</ParamField>

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

<ParamField body="DebitedFunds" type="object" required>
  Information about the debited funds.

  <Expandable title="properties">
    <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>

    <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>
  </Expandable>
</ParamField>

<ParamField body="Fees" type="object" required>
  Information about the fees taken by the platform for this transaction (and hence transferred to the Fees Wallet).

  <Expandable title="properties">
    <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 fees.
    </ParamField>

    <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>
  </Expandable>
</ParamField>

<ParamField body="CreditedWalletId" type="string" required>
  The unique identifier of the credited wallet.
</ParamField>

<ParamField body="DebitedWalletId" type="string" required>
  The unique identifier of the debited wallet.
</ParamField>

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

  Custom data that you can add to this object.
</ParamField>

### Responses

<Accordion title="200">
  <ResponseField name="ScaContext" type="string">
    **Possible values:** `USER_PRESENT`, `USER_NOT_PRESENT`

    The SCA context of the request, which is **required** if the debited wallet owner's `UserCategory` is `OWNER`:

    * `USER_PRESENT` – The user is taking the SCA-triggering action of initiating a transfer. The platform must [redirect the user](/guides/sca/session) using the `PendingUserAction.RedirectUrl` returned so that the user can complete the SCA session (unless Mangopay applied an exemption for low-amount and low-risk transfers, so no redirection link was returned).
    * `USER_NOT_PRESENT` – The platform is taking the action under proxy from the user and the user has previously given consent to Mangopay (via the SCA hosted experience) to allow the action. If the user has not given (or has revoked) their consent, then `USER_NOT_PRESENT` returns a 403 error.

    Read more about [managing proxy and user consent](/guides/sca/proxy-management) **→**

    **Note:** For existing platforms, the parameter is technically optional if the debited wallet owner's `UserCategory` is `OWNER`, and the default value will become `USER_PRESENT` from **Dec 15, 2025** (Dec 1 in Sandbox)
  </ResponseField>

  <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.
  </ResponseField>

  <ResponseField name="DebitedFunds" type="object">
    Information about the debited funds.

    <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 debited 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="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">
    Information about the fees taken by the platform for this transaction (and hence transferred to the Fees Wallet).

    <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 fees.
      </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="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="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="PendingUserAction" type="object">
    Object containing the link needed for SCA redirection if triggered by the API call (otherwise returned `null`).

    <Expandable title="properties" defaultOpen>
      <ResponseField name="RedirectUrl" type="string">
        The URL to which to redirect the user to perform strong customer authentication (SCA) via a Mangopay-hosted webpage. This value is a variable and should not be hardcoded.

        The SCA session link expires 10 minutes after it's generated.

        **Caution:** Before redirecting the user on this URL, you must add the query parameter `ReturnUrl`  with the percent-encoded URL to which you want the SCA session to return the user after authentication (whether successful or not).

        For more details, see [How to redirect a user for an SCA session](/guides/sca/session#how-to-redirect-a-user-for-sca).
      </ResponseField>
    </Expandable>
  </ResponseField>
</Accordion>

<Accordion title="400 - Currency incompatibility">
  ```json theme={null}
  {
      "Message": "Error: multi-currency usage is not authorized",
      "Type": "currency_incompatibility",
      "Id": "0c23333c-a0ef-468a-8d33-7bd7ced6e7d4#1661495038",
      "Date": 1661495039.0,
      "errors": {
          "currency": "The Debited Wallet's currency EUR and the Credited Wallet's currency GBP must be the same"
      }
  }  
  ```
</Accordion>

<Accordion title="400 - Author must be debited wallet owner">
  ```json theme={null}
  {
      "Message": "Author should be the Debited wallet owner",
      "Type": "param_error",
      "Id": "3cc18d56-5aab-4271-87aa-7baee84a78a0",
      "Date": 1756456857.0,
      "errors": null
  }
  ```
</Accordion>

<ResponseExample>
  ```json 200 - SCA required theme={null}
  {
      "ScaContext": "USER_PRESENT",
      "Id": "xfer_c_01JRSHQFG2337DBQ4NS8XPYCK7",
      "CreationDate": 1744614179,
      "DebitedWalletId": "wlt_m_01JRJM7ASZN7YP4MBDVBT0HZF1",
      "CreditedWalletId": "wlt_m_01JRHSTW2NP4MDB45WQMDNS23C",
      "AuthorId": "user_m_01JRJM5RR5NYQDN0S6QWJJDRMR",
      "CreditedUserId": "user_m_01JRHSS3B18H86QA0C467RVK07",
      "DebitedFunds": {
          "Currency": "EUR",
          "Amount": 3001
      },
      "CreditedFunds": {
          "Currency": "EUR",
          "Amount": 3001
      },
      "Fees": {
          "Currency": "EUR",
          "Amount": 0
      },
      "Type": "TRANSFER",
      "Nature": "REGULAR",
      "Status": "CREATED",
      "Tag": "Created using Mangopay API Postman Collection",
      "ResultCode": null,
      "ResultMessage": null,
      "ExecutionDate": null,
      "PendingUserAction": {
          "RedirectUrl": "https://sca.sandbox.mangopay.com/?token=sca_0196331bc1247e3fa33be6f9c797abd7"
      }
  }
  ```

  ```json 200 - SCA not required theme={null}
  {
      "ScaContext": "USER_PRESENT",
      "Id": "xfer_c_01JRSHXFS5YX0HVCXZFQ4J2XMH",
      "CreationDate": 1744614375,
      "DebitedWalletId": "wlt_m_01JRHSTW2NP4MDB45WQMDNS23C",
      "CreditedWalletId": "wlt_m_01JRJM7ASZN7YP4MBDVBT0HZF1",
      "AuthorId": "user_m_01JRHSS3B18H86QA0C467RVK07",
      "CreditedUserId": "user_m_01JRJM5RR5NYQDN0S6QWJJDRMR",
      "DebitedFunds": {
          "Currency": "EUR",
          "Amount": 1000
      },
      "CreditedFunds": {
          "Currency": "EUR",
          "Amount": 1000
      },
      "Fees": {
          "Currency": "EUR",
          "Amount": 0
      },
      "Type": "TRANSFER",
      "Nature": "REGULAR",
      "Status": "SUCCEEDED",
      "Tag": "Created using Mangopay API Postman Collection",
      "ResultCode": "000000",
      "ResultMessage": "Success",
      "ExecutionDate": 1744614375,
      "PendingUserAction": null
  }
  ```
</ResponseExample>

<RequestExample>
  ```json REST   theme={null}
  {
      "ScaContext": "USER_PRESENT", 
      "AuthorId": "user_m_01JRJM5RR5NYQDN0S6QWJJDRMR",
      "DebitedFunds": {
          "Currency": "EUR",
          "Amount": 3001 
      },
      "Fees": {
          "Currency": "EUR",
          "Amount": 0
      },   
      "DebitedWalletId": "wlt_m_01JRJM7ASZN7YP4MBDVBT0HZF1",
      "CreditedWalletId": "wlt_m_01JRHSTW2NP4MDB45WQMDNS23C",
      "Tag": "Created using Mangopay API Postman Collection"
  }
  ```

  ```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 {
      $transfer = new \MangoPay\Transfer();
      $transfer->AuthorId = 'user_m_01JYEJ86451TKDK9BZAXRT4RTS';
      $transfer->DebitedFunds = new \MangoPay\Money();
      $transfer->DebitedFunds->Currency = 'EUR';
      $transfer->DebitedFunds->Amount = 100;
      $transfer->Fees = new \MangoPay\Money();
      $transfer->Fees->Currency = 'EUR';
      $transfer->Fees->Amount = 0;
      $transfer->DebitedWalletId = 'wlt_m_01JYEJCS18438SEW2773PSNWCV';
      $transfer->CreditedWalletId = 'wlt_m_01JY53GESY8V2HBV7EBD6J8FKX';
      $transfer->ScaContext = 'USER_PRESENT';

      $response = $api->Transfers->Create($transfer);

      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 = {
    ScaContext: "USER_PRESENT",
    AuthorId: "user_m_01JYEJ86451TKDK9BZAXRT4RTS",
    Tag: "Created using Mangopay NodeJS SDK",
    DebitedFunds: {
      Currency: "EUR",
      Amount: 5000,
    },
    Fees: {
      Currency: "EUR",
      Amount: 0,
    },
    DebitedWalletId: "wlt_m_01JYEJCS18438SEW2773PSNWCV",
    CreditedWalletId: "wlt_m_01JY53GESY8V2HBV7EBD6J8FKX",
  };

  const createTransfer = async (transfer) => {
    return await mangopay.Transfers.create(transfer)
      .then((response) => {
        console.info(response);
        return response;
      })
      .catch((err) => {
        console.log(err);
        return false;
      });
  };

  createTransfer(myTransfer);
  ```

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

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

  def createTransfer(transfer)
    begin
      response = MangoPay::Transfer.create(transfer)
      puts response
      return response
    rescue MangoPay::ResponseError => error
      puts "Failed to create Transfer: #{error.message}"
      puts "Error details: #{error.details}"
      return false
    end
  end

  myTransfer = {
    ScaContext: 'USER_PRESENT',
    AuthorId: 'user_m_01JYEJ86451TKDK9BZAXRT4RTS',
    DebitedWalletId: 'wlt_m_01JYEJCS18438SEW2773PSNWCV',
    CreditedWalletId: 'wlt_m_01JY53GESY8V2HBV7EBD6J8FKX',
    DebitedFunds: { Currency: 'EUR', Amount: 50001 },
    Fees: { Currency: 'EUR', Amount: 0 },
    Tag: 'Created using the Mangopay Ruby SDK'
  }

  createTransfer(myTransfer)
  ```

  ```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.Transfer;

  public class CreateTransfer {
          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 debitedUserId = "user_m_01HQK25M6KVHKDV0S36JY9NRKR";
          var debitedrWalletId = "wlt_m_01HQT6422EER2N7FPRXWTSDCSV";

          var creditedUserId = "user_m_01HT2NFK7Z2BRQNGNHMY30VVTT";
          var creditedWalletId = "wlt_m_01HTF5S9MG0XXBZ8A0550MED3Z";

          Transfer transfer = new Transfer();
          transfer.setAuthorId(debitedUserId);
          transfer.setDebitedWalletId(debitedrWalletId);
          transfer.setCreditedUserId(creditedUserId);
          transfer.setCreditedWalletId(creditedWalletId);
          transfer.setDebitedFunds(new Money(CurrencyIso.EUR, 1000));
          transfer.setFees(new Money(CurrencyIso.EUR, 0));
          transfer.setTag("Created using the Mangopay Java SDK"); 

          Transfer createTransfer = mangopay.getTransferApi().create(transfer);

          Gson pprint = new GsonBuilder().setPrettyPrinting().create();
          String prettyJson = pprint.toJson(createTransfer);

          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 NaturalUserSca, Wallet, Transfer
  from mangopay.utils import Money

  credited_natural_user_wallet = Wallet.get('wlt_m_01JY53GESY8V2HBV7EBD6J8FKX')
  credited_natural_user = NaturalUserSca.get('user_m_01K88BVCEQ1JW91DEVN3AR6MT9')

  debited_natural_user_wallet = Wallet.get('wlt_m_01JYEJCS18438SEW2773PSNWCV')
  debited_natural_user = NaturalUserSca.get('user_m_01JYEJ86451TKDK9BZAXRT4RTS')

  transfer = Transfer(
      author=debited_natural_user,
      debited_funds=Money(amount=1000, currency='EUR'),
      fees=Money(amount=0, currency='EUR'),
      debited_wallet=debited_natural_user_wallet,
      credited_wallet=credited_natural_user_wallet,
      credited_user=credited_natural_user,
      sca_context='USER_PRESENT',
  )

  create_transfer = transfer.save()

  pprint(create_transfer)
  ```

  ```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 debitedWalletId  = "wlt_m_01J30991BXBB7VF28PBS82EWD3";
          var creditedWalletId = "wlt_m_01J3D02K6ETV3BDP88C7PD2NDB";

          var transfer = new TransferPostDTO(userId, userId,
              new Money { Amount = 50001, Currency = CurrencyIso.EUR },
              new Money { Amount = 0, Currency = CurrencyIso.EUR },
              debitedWalletId, 
              creditedWalletId
          ) {
              Tag = "Created using the Mangopay .NET SDK"
              ScaContext = "USER_PRESENT"
          };

          var createTransfer = await api.Transfers.CreateAsync(transfer);

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