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

# Virtual IBANs

export const IconGrayCross = <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 24.0095C18.6274 24.0147 24.0044 18.6464 24.0095 12.019C24.0149 5.39151 18.6465 0.0147133 12.019 0.00946425C5.39161 0.00424574 0.0148962 5.37259 0.00952515 12C0.0043982 18.6274 5.37281 24.0042 12 24.0095ZM9.9065 8.09626C9.40821 7.59726 8.59986 7.59653 8.10108 8.09464C7.60205 8.59275 7.60157 9.40107 8.09961 9.90006L10.2046 12.0083L8.09693 14.1128C7.5979 14.6109 7.59742 15.4192 8.09546 15.9182C8.59375 16.4172 9.4021 16.418 9.90113 15.9199L12.0088 13.8154L14.1138 15.9236C14.6121 16.4227 15.4202 16.4234 15.9192 15.9253C16.418 15.4272 16.4187 14.6189 15.9204 14.1198L13.8154 12.0116L15.9233 9.90717C16.4221 9.40906 16.4229 8.60074 15.9246 8.10172C15.4263 7.60273 14.6179 7.60199 14.1191 8.1001L12.0112 10.2045L9.9065 8.09626Z" fill="#D0D3D0" />
</svg>;

export const IconGreenCheck = <svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.0033 24.7159C18.6307 24.7211 24.0075 19.3528 24.0127 12.7254C24.018 6.09797 18.6496 0.721152 12.0222 0.715921C5.3948 0.710691 0.0179769 6.07903 0.0127468 12.7064C0.00751663 19.3339 5.37586 24.7107 12.0033 24.7159ZM16.8341 11.285C17.2648 10.8295 17.2653 10.0903 16.8352 9.63399C16.4052 9.1777 15.7074 9.17709 15.2767 9.63262L10.9099 14.2513L8.75197 11.9617C8.32192 11.5054 7.62415 11.5048 7.19345 11.9603C6.76276 12.4159 6.76223 13.155 7.19229 13.6113L10.1289 16.7271C10.5589 17.1834 11.2567 17.184 11.6874 16.7284L16.8341 11.285Z" fill="#89E481" />
</svg>;

<table>
  <tbody>
    <tr>
      <th class="header">Regions</th>

      <td class="table-content row-span" rowSpan={2}>
        See <a href="#iban-countries-and-currencies">IBAN countries and currencies</a>
      </td>
    </tr>

    <tr>
      <th class="header">Currencies</th>
    </tr>

    <tr>
      <th class="header">Refunds</th>

      <td class="table-content">
        Supported [via payouts](/guides/payouts/integration#refunds-using-payouts)
      </td>
    </tr>

    <tr>
      <th class="header">Disputes</th>

      <td class="table-content">
        Not supported
      </td>
    </tr>
  </tbody>
</table>

## Introduction

Mangopay enables you to create an IBAN or local account identifier attached to a wallet. Once created, any funds wired by the user to the dedicated account are credited automatically to the associated wallet, which simplifies reconciliation and improves the user experience.

In the API, the [Virtual Account](/api-reference/virtual-accounts/virtual-account-object) object allows you to create and manage dedicated virtual IBANs for your users' wallets. You can also see local and international pay-in capabilities available to your platform.

<Note>
  **Note - Replaces deprecated Banking Alias feature**

  The [Virtual Account](/api-reference/virtual-accounts/virtual-account-object) endpoints replace the deprecated [Banking Alias](/api-reference/banking-aliases/banking-alias-object) endpoints, which will be removed in **Q3 2026**.

  Platforms using Banking Aliases must plan to change their integration. Offering **User-Owned Accounts** on the Virtual Account endpoints requires your platform to sign the [VOP](/guides/vop) contract amendment.

  All Banking Alias objects are available via the [GET View a Virtual Account](/api-reference/banking-aliases/view-banking-alias) endpoint, using the Banking Alias `Id` and `WalletId` as path parameters.
</Note>

The Virtual Account endpoints bring many advantages over the Banking Alias feature:

* Extended country and currency coverage, including country-specific IBANs for EUR countries and expansion into new international markets
* Multiple accounts per wallet (so long as they are of the same [type](#types))
* Ability to open accounts in the name of the user thanks to User-Owned accounts (see [types](#types) below)
* Adherence to financial market standards (ISO 20022)
* Dedicated endpoint giving the countries and currencies available to your platform ([GET View Virtual Account availabilities](/api-reference/virtual-accounts/view-virtual-account-availabilities))

Any further product development or currency and country coverage will only be delivered on Virtual Accounts and not Banking Aliases.

### SCT Instant on FR accounts

On FR virtual accounts and banking aliases (`Country` is `FR`), Mangopay accepts EUR payments via the SEPA Instant Credit Transfer (SCT Inst) scheme from any SEPA country.

This means that when your users initiate the payment with their bank, they can use SCT Inst if it is offered by their bank, and funds should arrive in about 25 seconds.

### FPS on GB accounts

On GB virtual accounts and banking aliases (`Country` is `GB`), users can make payments via the UK's Faster Payment System, meaning funds typically arrive in a matter of seconds (possible delay up to 2 hours).

## How it works

As a payment method, virtual accounts allow a user to wire funds directly to their wallet. You should create the account first before inviting the user to wire the funds.

### Set up the account

The steps to set up the virtual account are:

<Steps>
  <Step title="Create a wallet for the account">
    Call the <a href="/api-reference/wallets/create-wallet">POST Create a Wallet</a> endpoint and specify its currency.

    <Warning>
      **Caution – Currency must be consistent**

      The currency of the wallet must match the currency of the account you intend to create. See [countries and currencies](#iban-countries-and-currencies) for details.
    </Warning>
  </Step>

  <Step title="Create the virtual account">
    Call the <a href="/api-reference/virtual-accounts/create-virtual-account">POST Create a Virtual Account</a> endpoint, specifying the `Country` and `VirtualAccountPurpose`, whether `COLLECTION` or `USER_OWNED` (see [types](#types) for details).

    The response shows the details of the account and its `Status`, which must be `ACTIVE` to receive funds.

    <Note>
      **Note – UK Confirmation of Payee (CoP)**

      For `GB` virtual accounts, it takes approximately 48 hours for the account to be fully recognized by all banks through the UK's Confirmation of Payee (CoP) scheme.

      Once the virtual account is `ACTIVE` it can technically receive funds. Depending on the user's bank, during the first 48 hours they may be shown a CoP alert but be able to ignore it, or be prevented from proceeding with the wire transfer.
    </Note>

    <Check>
      **Best practice – Set up webhook for active accounts**

      The account `Status` must be `ACTIVE` to receive funds, otherwise any funds sent to the account details are returned.

      Therefore, you are strongly advised to set up a <a href="/webhooks">webhook</a> for the `VIRTUAL_ACCOUNT_ACTIVE` event type to be notified that the account is ready for use.

      You should also set up the other [webhooks](#webhooks) for the other [status changes](#status).
    </Check>
  </Step>
</Steps>

### Collect payments

Once the Virtual Account is set up and its `Status` is `Active`, the user can wire funds to it.

The payment flow is as follows:

<Steps>
  <Step title="Obtain the account details and create a reference">
    Call the <a href="/api-reference/virtual-accounts/view-virtual-account">GET View a Virtual Account</a> endpoint to obtain the account details in international or local formats.

    You can also create a unique custom reference for the user to use for the payment.

    <Check>
      **Best practice – Retrieve account fields and values dynamically**

      For the `LocalAccountDetails` and `InternationalAccountDetails` objects, retrieve their sub-properties dynamically as well as the fields.

      This applies particularly to the `Account` sub-objects, which vary depending on the account `Country`. Mangopay may add new formats or modify local ones to improve localization as its coverage expands.
    </Check>

    <Warning>
      **Caution – Ensure account is `ACTIVE`**

      You must always ensure the account is `ACTIVE` before inviting a payment, otherwise the funds will be returned.

      See also the note about delayed [UK CoP recognition](#set-up-the-account) for `GB` accounts.
    </Warning>
  </Step>

  <Step title="Present the payment details to the user">
    Display the account details along with your custom reference.

    <Check>
      **Best practice – Display instructions, account holder name, and account number clearly to the user**

      As well as the account number or IBAN, ensure you display the `AccountOwner` clearly as well. For EUR SEPA payments, both data points are used for [Verification of Payee (VOP)](/guides/vop).

      Your user must understand that they need to initiate the bank wire transfer on their side with their bank.

      Ensure your messaging is clear and that the payment details are easy to copy and use.
    </Check>
  </Step>

  <Step title="Wait for the user to make the payment via online banking">
    The user requests the wire transfer via their online banking app, specifying the virtual account as the payee.
  </Step>

  <Step title="Handle webhook notification when Mangopay creates the pay-in and credits the wallet">
    On receipt of the funds, Mangopay automatically creates an <a href="">External Instruction Bank Wire PayIn</a>.

    Set up a <a href="/webhooks">webhook</a> for the `PAYIN_NORMAL_SUCCEEDED` event type to be notified of this.

    You can then use the <a href="/api-reference/virtual-accounts/view-payin-external-instruction">GET View a PayIn</a> endpoint to get the custom `WireReference` you provided to the user, as well as confirm the amount and status.

    The pay-in's `BankingAliasId` contains the unique identifier of the Virtual Account.
  </Step>
</Steps>

### Status

The `Status` of the Virtual Account can have the following values:

* `PENDING` – The account creation request is being processed and full account details may not yet be returned. Any funds sent to the account are returned (if account details exist). `PENDING` can transition to `ACTIVE` or `FAILED`.
* `ACTIVE` – The account is active and can receive funds (see note about delayed [UK CoP recognition](#set-up-the-account) for `GB` accounts). `ACTIVE` can transition to `BLOCKED` or `CLOSED`.
* `BLOCKED` – The account is blocked and is not active. Any funds sent to the account are returned. This temporary status may be used during processes relating to user verification or fraud screening. `BLOCKED` can transition to `ACTIVE` or `CLOSED`.
* `CLOSED` – The account has been deactivated and is closed. Any funds sent to the account are returned. This is a final state.
* `FAILED` – The account creation request failed or was rejected. This final state is rare. Any funds sent to the account are returned (if account details exist). Depending on when the failure occurred, the following fields may be `null`:
  * `AccountOwner`
  * `LocalAccountDetails.Address`
  * `LocalAccountDetails.Account`
  * `InternationalAccountDetails.Address`
  * `InternationalAccountDetails.Account`

The possible `Status` changes are summarized in this diagram:

{/* light mode */}

<div className="block dark:hidden">
  ```mermaid placement="bottom-left" theme={null}
  %%{
    init: {
      'theme': 'base',
      'themeVariables': {
        'primaryColor': '#FFFFFF',
        'primaryTextColor': '#2D0F37',
        'primaryBorderColor': '#2D0F37',
        'lineColor': '#2D0F37',
        'secondaryColor': '#FFFFFF',
        'tertiaryColor': '#FFFFFF',
        'fontSize': '32px',
        'fontFamily': 'Inter'
      }
    }
  }%%
  flowchart LR
      Start(["POST&nbsp;Create&nbsp;Virtual&nbsp;Account"]) --> PENDING
      PENDING --> FAILED
      PENDING --> ACTIVE
      ACTIVE["**ACTIVE** <br/>*Funds&nbsp;accepted*"] --> BLOCKED
      BLOCKED --> CLOSED
      ACTIVE --> CLOSED
      BLOCKED --> ACTIVE
      
      style Start fill:#2D0F37,color:#FFFFFF
      style ACTIVE fill:#89E481
      style PENDING fill:#FFD260
      style BLOCKED fill:#F5C1AE
      style CLOSED fill:#F5F3F5
      style FAILED fill:#E0DBE1
  ```
</div>

<div className="hidden dark:block">
  ```mermaid placement="bottom-left" theme={null}
  %%{
    init: {
      'theme': 'base',
      'themeVariables': {
        'primaryColor': "#090D0D",
        'primaryTextColor': "#2D0F37",
        'primaryBorderColor': "#FFFFFF",
        'lineColor': "#FFFFFF",
        'secondaryColor': "#090D0D",
        'tertiaryColor': "#090D0D",
        'fontSize': '32px',
        'fontFamily': 'Inter'
      }
    }
  }%%
  flowchart LR
      Start(["POST&nbsp;Create&nbsp;Virtual&nbsp;Account"]) --> PENDING
      PENDING --> FAILED
      PENDING --> ACTIVE
      ACTIVE["**ACTIVE** <br/>*Funds&nbsp;accepted*"] --> BLOCKED
      BLOCKED --> CLOSED
      ACTIVE --> CLOSED
      BLOCKED --> ACTIVE
      
      style Start fill:#FFFFFF,color:#2D0F37
      style ACTIVE fill:#89E481
      style PENDING fill:#FFD260
      style BLOCKED fill:#F5C1AE
      style CLOSED fill:#F5F3F5
      style FAILED fill:#E0DBE1
  ```
</div>

### Webhooks

You should set up <a href="/webhooks">webhook notifications</a> for the following event types to be notified when a Virtual Account changes status:

* `VIRTUAL_ACCOUNT_ACTIVE`
* `VIRTUAL_ACCOUNT_BLOCKED`
* `VIRTUAL_ACCOUNT_CLOSED`
* `VIRTUAL_ACCOUNT_FAILED`

There is no event type corresponding to the `PENDING` status.

### Functional errors

In most cases, the virtual account passes from `PENDING` to `ACTIVE` immediately or within a few seconds. You are strongly advised to rely on the `VIRTUAL_ACCOUNT_ACTIVE` webhook.

In some rare cases, a `USER_OWNED` Virtual Account object can be created (the POST endpoint returns 200) but then subsequently fail with the following `ResultCode` error because the user doesn't meet the requirements:

* <a href="/errors/codes/002703">002703</a> – User is not an Owner (for `USER_OWNED`)

## IBAN countries and currencies

Mangopay offers IBANs for the following countries, specified in the `Country` parameter of both the Virtual Account object and the legacy Banking Alias object.

When you create an account, the `Country` must correspond to the `Currency` of the account's Wallet. If a payment is attempted to the account in a different currency than the wallet currency, the payment is returned to the payer and the wallet is not credited.

The following tables summarize the account coverage available to platforms who have contracted with **Mangopay S.A. (in the EEA)** and **Mangopay UK Ltd. (in the UK)**. It also shows a comparison between the Virtual Account endpoints and the legacy Banking Alias (on which no further coverage changes are planned).

<Tabs>
  <Tab title="EEA">
    <table>
      <thead>
        <tr>
          <th class="header">IBAN country</th>
          <th class="header">Wallet currency</th>
          <th class="header">Virtual Account</th>
          <th class="header">Banking Alias</th>
        </tr>
      </thead>

      <tbody>
        <tr>
          <td class="table-content">AU - Australia</td>
          <td class="table-content">AUD</td>

          <td class="table-content">
            {IconGreenCheck}
          </td>

          <td class="table-content">
            {IconGrayCross}
          </td>
        </tr>

        <tr>
          <td class="table-content">CA - Canada</td>
          <td class="table-content">CAD</td>

          <td class="table-content">
            {IconGreenCheck}
          </td>

          <td class="table-content">
            {IconGrayCross}
          </td>
        </tr>

        <tr>
          <td class="table-content">CZ - Czechia</td>
          <td class="table-content">CZK</td>
          <td class="table-content">*Planned*</td>

          <td class="table-content">
            {IconGrayCross}
          </td>
        </tr>

        <tr>
          <td class="table-content">DK - Denmark</td>
          <td class="table-content">DKK</td>

          <td class="table-content">
            {IconGreenCheck}
          </td>

          <td class="table-content">
            {IconGreenCheck}
          </td>
        </tr>

        <tr>
          <td class="table-content">DE - Germany</td>
          <td class="table-content">EUR</td>

          <td class="table-content">
            {IconGreenCheck}
          </td>

          <td class="table-content">
            {IconGreenCheck}
          </td>
        </tr>

        <tr>
          <td class="table-content">ES - Spain</td>
          <td class="table-content">EUR</td>

          <td class="table-content">
            {IconGreenCheck}
          </td>

          <td class="table-content">
            {IconGreenCheck}
          </td>
        </tr>

        <tr>
          <td class="table-content">FR - France</td>
          <td class="table-content">EUR</td>

          <td class="table-content">
            {IconGreenCheck}
          </td>

          <td class="table-content">
            {IconGreenCheck}
          </td>
        </tr>

        <tr>
          <td class="table-content">GB - UK</td>
          <td class="table-content">GBP</td>

          <td class="table-content">
            {IconGreenCheck}
          </td>

          <td class="table-content">
            {IconGreenCheck}
          </td>
        </tr>

        <tr>
          <td class="table-content">HU - Hungary</td>
          <td class="table-content">HUF</td>
          <td class="table-content">*Planned*</td>

          <td class="table-content">
            {IconGrayCross}
          </td>
        </tr>

        <tr>
          <td class="table-content">LI - Lichtenstein</td>
          <td class="table-content">CHF</td>

          <td class="table-content">
            {IconGreenCheck}
          </td>

          <td class="table-content">
            {IconGrayCross}
          </td>
        </tr>

        <tr>
          <td class="table-content">LU - Luxembourg</td>
          <td class="table-content">EUR</td>

          <td class="table-content">
            {IconGreenCheck}
          </td>

          <td class="table-content">
            {IconGreenCheck}
          </td>
        </tr>

        <tr>
          <td class="table-content">NO - Norway</td>
          <td class="table-content">NOK</td>
          <td class="table-content">*Planned*</td>

          <td class="table-content">
            {IconGrayCross}
          </td>
        </tr>

        <tr>
          <td class="table-content">PL - Poland</td>
          <td class="table-content">PLN</td>
          <td class="table-content">*Planned*</td>

          <td class="table-content">
            {IconGrayCross}
          </td>
        </tr>

        <tr>
          <td class="table-content">SE - Sweden</td>
          <td class="table-content">SEK</td>
          <td class="table-content">*Planned*</td>

          <td class="table-content">
            {IconGrayCross}
          </td>
        </tr>

        <tr>
          <td class="table-content">US - USA</td>
          <td class="table-content">USD</td>

          <td class="table-content">
            {IconGreenCheck}
          </td>

          <td class="table-content">
            {IconGrayCross}
          </td>
        </tr>
      </tbody>
    </table>
  </Tab>

  <Tab title="UK">
    <table>
      <thead>
        <tr>
          <th class="header">IBAN country</th>
          <th class="header">Wallet currency</th>
          <th class="header">Virtual Account</th>
          <th class="header">Banking Alias</th>
        </tr>
      </thead>

      <tbody>
        <tr>
          <td class="table-content">AU - Australia</td>
          <td class="table-content">AUD</td>

          <td class="table-content">
            {IconGreenCheck}
          </td>

          <td class="table-content">
            {IconGrayCross}
          </td>
        </tr>

        <tr>
          <td class="table-content">CA - Canada</td>
          <td class="table-content">CAD</td>

          <td class="table-content">
            {IconGreenCheck}
          </td>

          <td class="table-content">
            {IconGrayCross}
          </td>
        </tr>

        <tr>
          <td class="table-content">CZ - Czechia</td>
          <td class="table-content">CZK</td>
          <td class="table-content">*Planned*</td>

          <td class="table-content">
            {IconGrayCross}
          </td>
        </tr>

        <tr>
          <td class="table-content">DK - Denmark</td>
          <td class="table-content">DKK</td>

          <td class="table-content">
            {IconGreenCheck}
          </td>

          <td class="table-content">
            {IconGreenCheck}
          </td>
        </tr>

        <tr>
          <td class="table-content">DE - Germany</td>
          <td class="table-content">EUR</td>

          <td class="table-content">
            {IconGrayCross}
          </td>

          <td class="table-content">
            {IconGrayCross}
          </td>
        </tr>

        <tr>
          <td class="table-content">ES - Spain</td>
          <td class="table-content">EUR</td>

          <td class="table-content">
            {IconGrayCross}
          </td>

          <td class="table-content">
            {IconGrayCross}
          </td>
        </tr>

        <tr>
          <td class="table-content">FR - France</td>
          <td class="table-content">EUR</td>

          <td class="table-content">
            {IconGrayCross}
          </td>

          <td class="table-content">
            {IconGrayCross}
          </td>
        </tr>

        <tr>
          <td class="table-content">GB - UK</td>
          <td class="table-content">GBP</td>

          <td class="table-content">
            {IconGreenCheck}
          </td>

          <td class="table-content">
            {IconGreenCheck}
          </td>
        </tr>

        <tr>
          <td class="table-content">HU - Hungary</td>
          <td class="table-content">HUF</td>
          <td class="table-content">*Planned*</td>

          <td class="table-content">
            {IconGrayCross}
          </td>
        </tr>

        <tr>
          <td class="table-content">LI - Lichtenstein</td>
          <td class="table-content">CHF</td>

          <td class="table-content">
            {IconGreenCheck}
          </td>

          <td class="table-content">
            {IconGrayCross}
          </td>
        </tr>

        <tr>
          <td class="table-content">LU - Luxembourg</td>
          <td class="table-content">EUR</td>

          <td class="table-content">
            {IconGreenCheck}
          </td>

          <td class="table-content">
            {IconGreenCheck}
          </td>
        </tr>

        <tr>
          <td class="table-content">NO - Norway</td>
          <td class="table-content">NOK</td>
          <td class="table-content">*Planned*</td>

          <td class="table-content">
            {IconGrayCross}
          </td>
        </tr>

        <tr>
          <td class="table-content">PL - Poland</td>
          <td class="table-content">PLN</td>
          <td class="table-content">*Planned*</td>

          <td class="table-content">
            {IconGrayCross}
          </td>
        </tr>

        <tr>
          <td class="table-content">SE - Sweden</td>
          <td class="table-content">SEK</td>
          <td class="table-content">*Planned*</td>

          <td class="table-content">
            {IconGrayCross}
          </td>
        </tr>

        <tr>
          <td class="table-content">US - USA</td>
          <td class="table-content">USD</td>

          <td class="table-content">
            {IconGreenCheck}
          </td>

          <td class="table-content">
            {IconGrayCross}
          </td>
        </tr>
      </tbody>
    </table>
  </Tab>
</Tabs>

Platforms can see what countries and currencies are available to them at any time using the [GET List Virtual Account availabilities](/api-reference/virtual-accounts/view-virtual-account-availabilities) endpoint.

### Legal Users in Denmark

Legal Users registered in Denmark (with `HeadquartersAddress.Country` of `DK`) are not allowed to create virtual accounts with `Country` of `DK`. This rule applies to all Legal User types and both [types](#types) of virtual account (`COLLECTION` and `USER_OWNED`).

### On-demand non-local currencies

In addition to the coverage above, Mangopay is able to offer virtual accounts in additional currencies by request of platforms.

* **Available currencies**: `AED`, `AUD`, `CAD`, `CHF`, `CNH`, `CZK`, `HKD`, `HUF`, `ILS`, `JPY`, `MXN`, `NOK`, `NZD`, `PLN`, `RON`, `SAR`, `SEK`, `SGD`, `TRY`, `USD`, `ZAR`
* **Payment rails**: SWIFT
* **Account format**: `DK` IBAN only
* **Available Virtual Account types**: `COLLECTION` and `USER_OWNED`
* **Limitations**: Available for payments from business accounts only (not personal ones)

Contact Mangopay <a href="https://hub.mangopay.com/" target="_blank">via the Dashboard</a> or <a href="https://mangopay.com/contact">Sales contact form</a> for more information.

### Account formats

The virtual account details are available in two response parameters:

* `LocalAccountDetails` – An object containing the `Address` and `Account` details in local format, based on the Virtual Account `Country`. Note that the properties of the `Account` object vary depending on the `Country`.
* `InternationalAccountDetails` – An array of objects containing the `Address` and `Account` in international format (typically IBAN/BIC but this may change). Where country-specific IBANs exist for the account, multiple objects are returned.

<Check>
  **Best practice – Retrieve fields and values dynamically**

  You should retrieve the child objects, properties and values of the `LocalAccountDetails` and `InternationalAccountDetails` to present to the user.

  The properties of these objects may vary, so dynamic retrieval allows you to ensure that details are always presented correctly.
</Check>

## Types

There are two types of virtual accounts, defined by the `VirtualAccountPurpose` on creation:

* `COLLECTION` – Owned by Mangopay and usable by platforms and/or users for the purpose of collecting and reconciling incoming funds paid by users. Payouts are generally prohibited from the associated wallet except for refunds. The user can be categorized as a Payer or an Owner. The `AccountOwner` is "MGP `PlatformTradingName`"
* `USER_OWNED` – Owned by the user owning the wallet, enabling them to accept and store funds and make payments. KYC verification is required and the user must be categorized as an Owner. The `AccountOwner` is Natural User's "`FirstName` `LastName`" or Legal User's "`Name`".

<Note>
  **Note – One account purpose per wallet**

  A wallet can only have either `COLLECTION` or `USED_OWNED` virtual accounts attached, but not both.

  It is, however, possible to attach multiple virtual accounts of the same `VirtualAccountPurpose` to a single wallet.
</Note>

The following table summarizes the differences between the two types:

<table>
  <thead>
    <tr>
      <th class="header" />

      <th class="header">Collection account</th>
      <th class="header">User-owned account</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <th class="header">Purpose</th>
      <td class="table-content">Collection and reconciliation of funds by the platform</td>
      <td class="table-content">User's acceptance and storing of funds</td>
    </tr>

    <tr>
      <th class="header">Account owner</th>
      <td class="table-content">Mangopay S.A. or Mangopay UK Ltd.</td>
      <td class="table-content">Wallet owner</td>
    </tr>

    <tr>
      <th class="header">Account holder name example</th>
      <td class="table-content">"MGP `PlatformTradingName`"</td>
      <td class="table-content">"`FirstName` `LastName`" (Natural user) or "`Name`" (Legal user)</td>
    </tr>

    <tr>
      <th class="header">Allowed user category</th>
      <td class="table-content">Owner or Payer</td>
      <td class="table-content">Owner</td>
    </tr>

    <tr>
      <th class="header">KYC verification</th>
      <td class="table-content">Not required</td>
      <td class="table-content">Required</td>
    </tr>

    <tr>
      <th class="header">Payouts</th>
      <td class="table-content">Prohibited from the associated  wallet, except for refunds returning funds to their origin</td>
      <td class="table-content">Authorized from the associated wallet</td>
    </tr>
  </tbody>
</table>

Note that in all both cases Mangopay is not the legal owner of funds but only holds them on behalf of its users.

<Note>
  **Note – User address data required for `USER_OWNED` account**

  User-owned virtual accounts require the following data to be provided in the corresponding User object:

  * `Address` for a Natural User
  * `LegalRepresentativeAddress` for a Legal User

  This address data is not required for the user to be an Owner or to be KYC validated, but it must be present to successfully create a `USER_OWNED` Virtual Account. This data is not required for `COLLECTION` accounts.
</Note>

### Collection accounts

Collection accounts allow users to wire funds to their wallet using a designated virtual IBAN. Once created, any funds received on the IBAN are automatically credited to the wallet. The IBAN is owned by Mangopay, and the name of the account reflects both Mangopay and the platform's name in the format “MGP PlatformTradingName”.

Collection accounts need to be attached to the wallet of the user making the pay-in, meaning that you need to create one Virtual Account object per user. This **first user** can be categorized as a Payer and they don't need to be KYC verified. In your workflow, you can trigger a transfer from the wallet to a **second user**, who must be categorized as an Owner to receive the transfer.

This type of account is mainly used for collecting and reconciling incoming funds, making it ideal for platforms that want to streamline these processes. Payouts are prohibited unless they're for a refund.

<img className="block dark:hidden" src="https://mintcdn.com/mangopay/Obs2Ic13_cH3fyzL/images/diagram_virtual_account_collection_light.svg?fit=max&auto=format&n=Obs2Ic13_cH3fyzL&q=85&s=757cca8680b74795d0effad7877d1c25" width="1188" height="492" data-path="images/diagram_virtual_account_collection_light.svg" />

<img className="hidden dark:block" src="https://mintcdn.com/mangopay/Obs2Ic13_cH3fyzL/images/diagram_virtual_account_collection_dark.svg?fit=max&auto=format&n=Obs2Ic13_cH3fyzL&q=85&s=d163a1d68e96b7b62c1a98e505b62b11" width="1188" height="492" data-path="images/diagram_virtual_account_collection_dark.svg" />

### User-owned accounts

User-owned accounts allow platforms to create a unique IBAN for a specific user. Once created, the IBAN can be used to receive pay-ins, and the wallet can be used to make transfers and payouts. Because this IBAN is owned by the user, they must be categorized as an Owner and be KYC verified. The account holder can collect and make payments and transfer funds with full functionality.

<img className="block dark:hidden" src="https://mintcdn.com/mangopay/Obs2Ic13_cH3fyzL/images/diagram_virtual_account_user_owned_light.svg?fit=max&auto=format&n=Obs2Ic13_cH3fyzL&q=85&s=85db56ccf4e325f7f8fc44a342a5cbd8" width="1188" height="492" data-path="images/diagram_virtual_account_user_owned_light.svg" />

<img className="hidden dark:block" src="https://mintcdn.com/mangopay/Obs2Ic13_cH3fyzL/images/diagram_virtual_account_user_owned_dark.svg?fit=max&auto=format&n=Obs2Ic13_cH3fyzL&q=85&s=c213a7d3422adf3c1ed4ea72aef1caa9" width="1187" height="492" data-path="images/diagram_virtual_account_user_owned_dark.svg" />

#### Top-up requires User-Owned Account

Collection Accounts are not intended for users making payments to themselves to top up their wallet: this scenario requires a User-Owned Account. For example, the following flow is not permitted:

* Pay-in to **Collection Account** attached to a Wallet held by an `OWNER` User
* Transfer to another Wallet held by the same User – this Transfer is blocked with the [008500](/errors/codes/008500) `ResultCode`

The correct implementation of this use case is:

* Pay-in to **User-Owned Account** attached to a Wallet held by an `OWNER` User

## Related resources

<CardGroup col={2}>
  <Card title="Endpoints" href="/api-reference/virtual-accounts/virtual-account-object">
    The Virtual Account object
  </Card>
</CardGroup>
