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

# Recipients and payouts

> How Verification of Payee (VOP) impacts recipients and payouts

In a payout scenario, as a Requesting PSP, Mangopay will be carrying out VOP checks on recipients and payouts and returning the result in the API response.

## Scope

VOP applies to EUR Recipients and Payouts using SCT or SCT Inst.

In terms of Recipient properties, this means:

* `Currency` is `EUR`
* `PayoutMethod` is `LocalBankTransfer`
* `Country` is a SEPA country

VOP does not apply to non-EUR payouts in SEPA countries, such as SEK payouts to a bank in Sweden (which uses the local scheme RIX). VOP also does not apply to international payouts, such as EUR to a non-SEPA country or, for example, SEK to a SEPA country that isn’t Sweden, both of which use SWIFT.

<Note>
  **Note – VOP on Recipients available for all platforms**

  The VOP checks on **Recipients** are available for all platforms for anti-fraud purposes.

  If your platform offers User-Owned Accounts to your users, their **payouts** are also impacted by VOP and may be blocked.
</Note>

## VOP result API fields

The following endpoints return the Verification of Payee information in the API response:

* [POST Create a Payout](/api-reference/payouts/create-payout), if the owner of the payout’s `RecipientId` or `BankAccountId` has at least one User-Owned Virtual Account
* [POST Create a Recipient](/api-reference/recipients/create-recipient) (for all platforms)
* [GET View a Recipient](/api-reference/recipients/view-recipient) (for all platforms)

These endpoints return an object parameter, `RecipientVerificationOfPayee`, containing:

* `RecipientVerificationId` – A unique identifier of the VOP check performed by Mangopay.
* `RecipientVerificationCheck` – The outcome of the VOP check performed by Mangopay, using the details in the Recipient object.
* `RecipientVerificationMessage` – The explanation of the check outcome.

For example:

```json VOP data in API response theme={null}
{
    //...
    "RecipientVerificationOfPayee": {
        "RecipientVerificationId": "623d1eff-f24e-4161-b4d2-1ce8385d1376",
        "RecipientVerificationCheck": "MATCH",
        "RecipientVerificationMessage": "Account name fully matches account identifier."
    }
    //...
}
```

The outcome of the check is given in fields give the result of the VOP check:

<table>
  <thead>
    <tr>
      <th class="header hug-content">Check result</th>
      <th class="header hug-content">Check message</th>
      <th class="header">Scenario</th>
      <th class="header">Recommendation</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td class="table-content hug-content">`MATCH`</td>
      <td class="table-content">`Account name fully matches account identifier.`</td>
      <td class="table-content">The account is valid and the account name matches the IBAN.</td>
      <td class="table-content">Proceed with the payout or recipient.</td>
    </tr>

    <tr>
      <td class="table-content hug-content">`CLOSE_MATCH`</td>
      <td class="table-content">`Account name partially matches account identifier. Name returned by check: FirstName LastName. Payment made to this account may not reach its intended counterparty.`</td>
      <td class="table-content">The account is valid but the name doesn’t match exactly.</td>
      <td class="table-content">Confirm details with your user before proceeding. Reregister the Recipient if required.</td>
    </tr>

    <tr>
      <td class="table-content hug-content">`NO_MATCH`</td>
      <td class="table-content">`Account name does not match account identifier. Payment made to this account may not reach its intended counterparty.`</td>
      <td class="table-content">This account likely belongs to a different owner.</td>
      <td class="table-content">Do not proceed until you confirm the account details with the user.</td>
    </tr>

    <tr>
      <td class="table-content hug-content" rowSpan={2}>`MATCH_NOT_POSSIBLE`</td>
      <td class="table-content">Temporary result: `Verification of payee check in progress`</td>
      <td class="table-content">The VOP check is ongoing ([see below](#temporary-result-for-asynchronous-processing)).</td>
      <td class="table-content">Retrieve final check result and message later using [GET View a Recipient](/api-reference/recipients/view-recipient) or [GET View a Payout](/api-reference/payouts/view-payout).</td>
    </tr>

    <tr>
      <td class="table-content">Final result: `Account name could not be verified. Payment made to this account may not reach its intended counterparty.`</td>
      <td class="table-content">Responding PSP’s verification service is unreachable. The check could not be completed.</td>
      <td class="table-content">Proceed only after confirming the account details with the user.</td>
    </tr>
  </tbody>
</table>

<Warning>
  **Caution – Risk of misdirected payouts**

  For any final result other than `MATCH`, there is a risk of the funds not reaching their intended destination. Funds sent to the wrong account may not be recoverable.
</Warning>

### Temporary result for asynchronous processing

Mangopay may temporarily return `MATCH_NOT_POSSIBLE` accompanied by the message `Verification of payee check in progress` and with an empty `RecipientVerificationId`. For example:

```json Non-final VOP result theme={null}
{
    //...
    "RecipientVerificationOfPayee": {
        "RecipientVerificationId": null,
        "RecipientVerificationCheck": "MATCH_NOT_POSSIBLE",
        "RecipientVerificationMessage": "Verification of payee check in progress"
    }
    //...
}
```

This non-final state resolves to one of two final states:

* A definitive `RecipientVerificationCheck` value (`MATCH`, `CLOSE_MATCH`, or `NO_MATCH`) with its accompanying message
* The final `MATCH_NOT_POSSIBLE` message: `Account name could not be verified. Payment made to this account may not reach its intended counterparty.`

On [POST Create a Recipient](/api-reference/recipients/create-recipient), this asynchronous behavior allows your platform to redirect the User to complete SCA without undue delay. The temporary message is only returned if no response is received from the Responding PSP within **2 seconds**.

To retrieve the final VOP result, call [GET View a Recipient](/api-reference/recipients/view-recipient).

The final outcome of the VOP check should be established within a matter of minutes, but it may take up to 24 hours in a worst-case scenario.

On [POST Create a Payout](/api-reference/payouts/create-payout), if a non-final result is returned, you can retrieve the final one via [GET View a Payout](/api-reference/payouts/view-payout).

## Implementation recommendations

1. Retrieve and display the `RecipientVerificationCheck` and `RecipientVerificationMessage` to your users. These data points are both returned in the `RecipientVerificationOfPayee` object on [GET View a Recipient](/api-reference/recipients/view-recipient), [POST Create a Recipient](/api-reference/recipients/create-recipient), and [POST Create a Payout](/api-reference/payouts/create-payout).
2. Check the VOP result of Recipients using [GET View a Recipient](/api-reference/recipients/view-recipient) before initiating payouts, to avoid funds being sent to the wrong account.

## Recipients

Mangopay performs a VOP check on the endpoints:

* [GET View a Recipient](/api-reference/recipients/view-recipient)
* [POST Create a Recipient](/api-reference/recipients/create-recipient)

VOP is only performed on Recipients where:

* `Currency` is `EUR`
* `PayoutMethod` is `LocalBankTransfer`
* `Country` is a SEPA country

<div min-height="470px">
  <div className="block dark:hidden">
    ```mermaid theme={null}
    %%{
      init: {
        'theme': 'base',
        'themeVariables': {
          'primaryColor': '#FFFFFF',
          'primaryTextColor': '#2D0F37',
          'primaryBorderColor': '#2D0F37',
          'lineColor': '#2D0F37',
          'secondaryColor': '#FFFFFF',
          'tertiaryColor': '#FFFFFF',
          'fontSize': '32px',
          'fontFamily': 'Inter',
          'noteBorderColor': "#E0DBE1",
          'noteBkgColor': "#E0DBE1",
          'noteTextColor': '#2D0F37'
        }
      }
    }%%
    sequenceDiagram
      actor Payee
      participant Platform
      participant Mangopay
      participant Responding PSP

    Payee ->> Platform: Register or view account <br/> or request payout
    Platform ->> Mangopay: POST Create Recipient <br/> or GET Recipient
    Mangopay ->> Responding PSP: Perform VOP
    Responding PSP -->> Mangopay: Return VOP result
    Mangopay -->> Platform: Return VOP result <br/> in API response
    Platform -->> Payee: Display result and <br/> handle user action
    Payee ->> Platform: Register new account <br/> or confirm payout
    ```
  </div>

  <div className="hidden dark:block">
    ```mermaid theme={null}
    %%{
      init: {
        'theme': 'base',
        'themeVariables': {
          'primaryColor': "#090D0D",
          'primaryTextColor': "#FFFFFF",
          'primaryBorderColor': "#FFFFFF",
          'lineColor': "#FFFFFF",
          'secondaryColor': "#090D0D",
          'tertiaryColor': "#090D0D",
          'fontSize': '32px',
          'fontFamily': 'Inter',
          'noteBorderColor': "#12282F",
          'noteBkgColor': "#090D0D",
          'noteTextColor': "#FFFFFF"
        }
      }
    }%%
    sequenceDiagram
      actor Payee
      participant Platform
      participant Mangopay
      participant Responding PSP

    Payee ->> Platform: Register or view account <br/> or request payout
    Platform ->> Mangopay: POST Create Recipient <br/> or GET Recipient
    Mangopay ->> Responding PSP: Perform VOP
    Responding PSP -->> Mangopay: Return VOP result
    Mangopay -->> Platform: Return VOP result <br/> in API response
    Platform -->> Payee: Display result and <br/> handle user action
    Payee ->> Platform: Register new account <br/> or confirm payout
    ```
  </div>
</div>

The [GET View a Recipient](/api-reference/recipients/view-recipient) and [POST Create a Recipient](/api-reference/recipients/create-recipient) endpoints return the VOP result in the `RecipientVerificationOfPayee` parameter of the API response:

```json API response - 200 OK expandable theme={null}
{
    "Id": "rec_01K3V3GWJQBZXQ3HKNWCQCJRXF",
    "Status": "ACTIVE",
    "CreationDate": 1756477551,
    "DisplayName": "ExampleBusinessName EUR FR account",
    "PayoutMethodType": "LocalBankTransfer",
    "RecipientType": "Business",
    "Currency": "EUR",
    "Country": "FR",
    "UserId": "user_m_01JH2Z9GXCCHGFN65T5HDZG4GB",
    "Tag": "Created using the Mangopay API Postman collection",
    "RecipientScope": "PAYOUT",
    "BusinessRecipient": {
        "BusinessName": "ExampleBusinessName",
        "Address": {
            "AddressLine1": "3929 Dickinson Streets",
            "AddressLine2": "Stamm Tunnel",
            "City": "Paris",
            "Region": "Ile de France",
            "PostalCode": "75001",
            "Country": "FR"
        }
    },
    "LocalBankTransfer": {
        "EUR": {
            "IBAN": "FR7630004000031234567890143",
            "BIC": "BNPAFRPPXXX"
        }
    },
		"RecipientVerificationOfPayee": {
			  "RecipientVerificationId": "123456789",
			  "RecipientVerificationCheck": "MATCH",
			  "RecipientVerificationMessage": "Account name fully matches account identifier."
    }
}
```

The [GET View a Recipient](/api-reference/recipients/view-recipient) endpoint returns the latest VOP check performed for that account. If no check has ever been performed (for existing Recipient objects and Bank Account objects), then a new check will be carried out.

The [GET View a Bank Account](/api-reference/bank-accounts/view-bank-account) endpoint will not trigger a VOP check nor return any VOP result. Ensure your platform uses [GET View a Recipient](/api-reference/recipients/view-recipient) object to retrieve account information.

The Recipient endpoint can be used to retrieve legacy Bank Account objects by using the Bank Account `Id` as the `RecipientId` path parameter.

## Payouts

Mangopay is introducing VOP checks when your platform requests a payout using [POST Create a Payout](/api-reference/payouts/create-payout) only if the owner of the payout’s `BankAccountId` has at least one User-Owned Virtual Account.

<Note>
  **Note – VOP only performed on payouts from users with User-Owned Accounts**

  On POST Create a Payout, the VOP check is only performed if the user has a User-Owned Virtual Account. If not, or if the payout does not use the SCT or SCT Inst rails, then VOP is not performed.

  The user must have at least one User-Owned Virtual Account from any of their wallets, not necessarily the one from which the payout is requested.
</Note>

<div min-height="230px">
  <div className="block dark:hidden">
    ```mermaid theme={null}
    %%{
      init: {
        'theme': 'base',
        'themeVariables': {
          'primaryColor': '#FFFFFF',
          'primaryTextColor': '#2D0F37',
          'primaryBorderColor': '#2D0F37',
          'lineColor': '#2D0F37',
          'secondaryColor': '#FFFFFF',
          'tertiaryColor': '#FFFFFF',
          'fontSize': '32px',
          'fontFamily': 'Inter',
          'noteBorderColor': "#E0DBE1",
          'noteBkgColor': "#E0DBE1",
          'noteTextColor': '#2D0F37'
        }
      }
    }%%
    sequenceDiagram
      actor Payee
      participant Platform
      participant Mangopay
      participant Responding PSP

    Payee ->> Platform: Request payout
    Platform ->> Mangopay: POST Payout
    Mangopay ->> Responding PSP: Perform VOP
    Responding PSP -->> Mangopay: Return VOP result
    Mangopay -->> Platform: Return VOP result <br/> in API response
    Mangopay -->> Responding PSP: Send (or block) payment
      Note right of Mangopay: Payout from UO account
    ```
  </div>

  <div className="hidden dark:block">
    ```mermaid theme={null}
    %%{
      init: {
        'theme': 'base',
        'themeVariables': {
          'primaryColor': "#090D0D",
          'primaryTextColor': "#FFFFFF",
          'primaryBorderColor': "#FFFFFF",
          'lineColor': "#FFFFFF",
          'secondaryColor': "#090D0D",
          'tertiaryColor': "#090D0D",
          'fontSize': '32px',
          'fontFamily': 'Inter',
          'noteBorderColor': "#12282F",
          'noteBkgColor': "#090D0D",
          'noteTextColor': "#FFFFFF"
        }
      }
    }%%
    sequenceDiagram
      actor Payee
      participant Platform
      participant Mangopay
      participant Responding PSP

    Payee ->> Platform: Request payout
    Platform ->> Mangopay: POST Payout
    Mangopay ->> Responding PSP: Perform VOP
    Responding PSP -->> Mangopay: Return VOP result
    Mangopay -->> Platform: Return VOP result <br/> in API response
    Mangopay -->> Responding PSP: Send (or block) payment
      Note right of Mangopay: Payout from UO account
    ```
  </div>
</div>

The steps are as follows:

1. Your platform calls [POST Create a Payout](/api-reference/payouts/create-payout).
2. Mangopay performs Verification of Payee (VOP) using the associated Recipient or Bank Account data (reference in the `BankAccountId`) by checking the IBAN and account holder name with the Responding PSP (which is the Payee’s bank).
3. Mangopay returns the VOP result in the API response (which may be a [temporary result](#temporary-result-for-asynchronous-processing)).
4. Mangopay proceeds with the payment, unless it is blocked as described in the scenarios below.

## Payout scenarios

### Match or close match

When Mangopay performs the VOP check with the Responding PSP, if the result is `MATCH` or `CLOSE_MATCH`, then the payout request continues.

<div min-height="465px">
  <div className="block dark:hidden">
    ```mermaid theme={null}
    %%{
      init: {
        'theme': 'base',
        'themeVariables': {
          'primaryColor': '#FFFFFF',
          'primaryTextColor': '#2D0F37',
          'primaryBorderColor': '#2D0F37',
          'lineColor': '#2D0F37',
          'secondaryColor': '#FFFFFF',
          'tertiaryColor': '#FFFFFF',
          'fontSize': '32px',
          'fontFamily': 'Inter',
          'noteBorderColor': "#E0DBE1",
          'noteBkgColor': "#E0DBE1",
          'noteTextColor': '#2D0F37'
        }
      }
    }%%
    sequenceDiagram
      participant Platform
      participant Mangopay
      participant Responding PSP

    Platform ->> Mangopay: POST Payout
    Mangopay ->> Responding PSP: Perform VOP
    Responding PSP -->> Mangopay: Result is MATCH <br/> or CLOSE_MATCH
    Mangopay -->> Platform: 200 OK with <br/>RecipientVerificationOfPayee <br/>data
    Mangopay ->> Responding PSP: Send payout
    ```
  </div>

  <div className="hidden dark:block">
    ```mermaid theme={null}
    %%{
      init: {
        'theme': 'base',
        'themeVariables': {
          'primaryColor': "#090D0D",
          'primaryTextColor': "#FFFFFF",
          'primaryBorderColor': "#FFFFFF",
          'lineColor': "#FFFFFF",
          'secondaryColor': "#090D0D",
          'tertiaryColor': "#090D0D",
          'fontSize': '32px',
          'fontFamily': 'Inter',
          'noteBorderColor': "#12282F",
          'noteBkgColor': "#090D0D",
          'noteTextColor': "#FFFFFF"
        }
      }
    }%%
    sequenceDiagram
      participant Platform
      participant Mangopay
      participant Responding PSP

    Platform ->> Mangopay: POST Payout
    Mangopay ->> Responding PSP: Perform VOP
    Responding PSP -->> Mangopay: Result is MATCH <br/> or CLOSE_MATCH
    Mangopay -->> Platform: 200 OK with <br/>RecipientVerificationOfPayee <br/>data
    Mangopay ->> Responding PSP: Send payout
    ```
  </div>
</div>

The [POST Create a Payout](/api-reference/payouts/create-payout) endpoint returns an HTTP 200 result containing the `RecipientVerificationOfPayee` fields:

```json API response - 200 OK expandable theme={null}
{
    "Id": "po_b_01K3GM8HWNCVDMACCRA0ZZPH02",
    "Tag": "Created using Mangopay API Postman Collection",
    "CreationDate": 1756126005,
    "AuthorId": "user_m_01K075ZBVXGFYAXM7529W2ZS5W",
    "CreditedUserId": null,
    "DebitedFunds": {
        "Currency": "EUR",
        "Amount": 1000
    },
    "CreditedFunds": {
        "Currency": "EUR",
        "Amount": 900
    },
    "Fees": {
        "Currency": "EUR",
        "Amount": 100
    },
    "Status": "CREATED",
    "ResultCode": null,
    "ResultMessage": null,
    "ExecutionDate": null,
    "Type": "PAYOUT",
    "Nature": "REGULAR",
    "CreditedWalletId": null,
    "DebitedWalletId": "wlt_m_01J9KQE9Z2S4G4R867C5H6W5ZV",
    "PaymentType": "BANK_WIRE",
    "BankAccountId": "rec_01K1ZWF7RJG9MEY8VQ0QE2RQ4D",
    "BankWireRef": "Example123",
    "ModeRequested": null,
    "ModeApplied": "PENDING_RESPONSE",
    "FallbackReason": null,
    "EndToEndId": "3b891fba337d45ec874646ac48565964",
    "PaymentRef": null,
    "RecipientVerificationOfPayee": {
      "RecipientVerificationId": "123456789",
      "RecipientVerificationCheck": "MATCH",
      "RecipientVerificationMessage": "Account name fully matches account identifier."
    }
}
```

Note that the POST request may return a [temporary VOP result](#temporary-result-for-asynchronous-processing).

### No match or match not possible

If the final result of the VOP check is `NO_MATCH` or `MATCH_NOT_POSSIBLE`, then the behavior depends on whether or not your platform has signed the VOP contract amendment. The VOP contract amendment is only applicable to platforms that offer User-Owned Accounts to their users, and **payout** VOP checks are only performed for these platforms.

#### If amendment signed

<div min-height="440px">
  <div className="block dark:hidden">
    ```mermaid theme={null}
    %%{
      init: {
        'theme': 'base',
        'themeVariables': {
          'primaryColor': '#FFFFFF',
          'primaryTextColor': '#2D0F37',
          'primaryBorderColor': '#2D0F37',
          'lineColor': '#2D0F37',
          'secondaryColor': '#FFFFFF',
          'tertiaryColor': '#FFFFFF',
          'fontSize': '32px',
          'fontFamily': 'Inter',
          'noteBorderColor': "#E0DBE1",
          'noteBkgColor': "#E0DBE1",
          'noteTextColor': '#2D0F37'
        }
      }
    }%%
    sequenceDiagram
      participant Platform
      participant Mangopay
      participant Responding PSP

    Platform ->> Mangopay: POST Payout
    Mangopay ->> Responding PSP: Perform VOP
    Responding PSP -->> Mangopay: If result is NO_MATCH or <br/>MATCH_NOT_POSSIBLE
    Mangopay -->> Platform: 200 OK with <br/>RecipientVerificationOfPayee <br/>data
    Mangopay ->> Responding PSP: Send payout
    ```
  </div>

  <div className="hidden dark:block">
    ```mermaid theme={null}
    %%{
      init: {
        'theme': 'base',
        'themeVariables': {
          'primaryColor': "#090D0D",
          'primaryTextColor': "#FFFFFF",
          'primaryBorderColor': "#FFFFFF",
          'lineColor': "#FFFFFF",
          'secondaryColor': "#090D0D",
          'tertiaryColor': "#090D0D",
          'fontSize': '32px',
          'fontFamily': 'Inter',
          'noteBorderColor': "#12282F",
          'noteBkgColor': "#090D0D",
          'noteTextColor': "#FFFFFF"
        }
      }
    }%%
    sequenceDiagram
      participant Platform
      participant Mangopay
      participant Responding PSP

    Platform ->> Mangopay: POST Payout
    Mangopay ->> Responding PSP: Perform VOP
    Responding PSP -->> Mangopay: If result is NO_MATCH or <br/>MATCH_NOT_POSSIBLE
    Mangopay -->> Platform: 200 OK with <br/>RecipientVerificationOfPayee <br/>data
    Mangopay ->> Responding PSP: Send payout
    ```
  </div>
</div>

If the amendment is signed, the payout continues and the `NO_MATCH` or `MATCH_NOT_POSSIBLE` result is returned in the `RecipientVerificationOfPayee` object.

This behavior can serve as a warning to your platform or the user. The `NO_MATCH` result means that payment may not reach its intended payee, and your platform should inform the user accordingly. In these cases, the user should check their account details and re-register the Recipient if necessary.

#### If amendment not signed

<div min-height="450px">
  <div className="block dark:hidden">
    ```mermaid theme={null}
    %%{
      init: {
        'theme': 'base',
        'themeVariables': {
          'primaryColor': '#FFFFFF',
          'primaryTextColor': '#2D0F37',
          'primaryBorderColor': '#2D0F37',
          'lineColor': '#2D0F37',
          'secondaryColor': '#FFFFFF',
          'tertiaryColor': '#FFFFFF',
          'fontSize': '32px',
          'fontFamily': 'Inter',
          'noteBorderColor': "#E0DBE1",
          'noteBkgColor': "#E0DBE1",
          'noteTextColor': '#2D0F37'
        }
      }
    }%%
    sequenceDiagram
      participant Platform
      participant Mangopay
      participant Responding PSP

    Platform ->> Mangopay: POST Payout
    Mangopay ->> Responding PSP: Perform VOP
    Responding PSP -->> Mangopay: If result is NO_MATCH or <br/>MATCH_NOT_POSSIBLE
    Mangopay -->> Platform: 200 OK but Payout <br/>FAILED (121030)
    	Note right of Mangopay: Payout blocked
    ```
  </div>

  <div className="hidden dark:block">
    ```mermaid theme={null}
    %%{
      init: {
        'theme': 'base',
        'themeVariables': {
          'primaryColor': "#090D0D",
          'primaryTextColor': "#FFFFFF",
          'primaryBorderColor': "#FFFFFF",
          'lineColor': "#FFFFFF",
          'secondaryColor': "#090D0D",
          'tertiaryColor': "#090D0D",
          'fontSize': '32px',
          'fontFamily': 'Inter',
          'noteBorderColor': "#12282F",
          'noteBkgColor': "#090D0D",
          'noteTextColor': "#FFFFFF"
        }
      }
    }%%
    sequenceDiagram
      participant Platform
      participant Mangopay
      participant Responding PSP

    Platform ->> Mangopay: POST Payout
    Mangopay ->> Responding PSP: Perform VOP
    Responding PSP -->> Mangopay: If result is NO_MATCH or <br/>MATCH_NOT_POSSIBLE
    Mangopay -->> Platform: 200 OK but Payout <br/>FAILED (121030)
    	Note right of Mangopay: Payout blocked
    ```
  </div>
</div>

If the amendment is **not** signed, then the payout fails if the final VOP result is `NO_MATCH` or `MATCH_NOT_POSSIBLE`.

While the [POST Create a Payout](/api-reference/payouts/view-payout) endpoint may return a 200 OK response, the payout subsequently fails with the `ResultCode` [121030](/errors/codes/121030) – `Verification of Payee failed: account name and IBAN do not match. Please provide matching details to proceed with the payout`.

<Note>
  **Note – Block only applies to UO account holders**

  The block is only applied to users who hold a User-Owned Account. For these users, all payouts are blocked regardless of which wallet they are debited from (determined by the owner of the payout’s `BankAccountId`).

  The block also only applies to EUR payments via SCT and SCT Inst.

  Payouts authored by users without User-Owned Accounts will not be VOP checked and therefore not be blocked because of VOP.

  On Recipients, VOP checks are applied and available to all platforms, regardless of whether they offer User-Owned Accounts or not.
</Note>

## Testing

In Sandbox, Mangopay provides testing data to allow you to simulate different VOP results when you call [POST Create a Recipient](/api-reference/recipients/create-recipient).

<Note>
  **Note – You must use test data to simulate VOP check**

  Mangopay does not perform VOP checks in Sandbox, so you must use the test IBANs and account names below to simulate the different responses.

  In Sandbox, any Recipient (or legacy Bank Account) created with a different IBAN and account holder name combination always returns `MATCH_NOT_POSSIBLE`, and the `RecipientVerificationId` is `null`, indicating that the check was not attempted.
</Note>

<Check>
  **Tip - Try in Postman**

  Mangopay's Sandbox API collection contains a dedicated <a href="https://www.postman.com/mgp-productstars/workspace/mangopay-sandbox/folder/15344095-8d14f571-9c5b-47ce-9f54-2cc54bc8af7a" target="_blank">Recipients VOP testing</a> folder with the VOP testing data ready for you to see how it works. For more about setting up your Postman environment, see the [Postman](/postman) guide.
</Check>

### FR business recipient

<table>
  <thead>
    <tr>
      <th class="header">IBAN</th>
      <th class="header">`BusinessName`</th>
      <th class="header">VOP result</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td class="table-content" rowSpan={3}>
        `FR7630001007941234567890185`
      </td>

      <td class="table-content">
        `EuroCorp`
      </td>

      <td class="table-content">
        `MATCH`
      </td>
    </tr>

    <tr>
      <td class="table-content">
        `EuroCarp`
      </td>

      <td class="table-content">
        `CLOSE_MATCH`
      </td>
    </tr>

    <tr>
      <td class="table-content">
        Any other value
      </td>

      <td class="table-content">
        `NO_MATCH`
      </td>
    </tr>
  </tbody>
</table>

Insert the data above in the relevant fields when you call [POST Create a Recipient](/api-reference/recipients/create-recipient), ensuring you follow the schema for a `LocalBankTransfer` payout method with the `Country` set to `FR` and the `Currency` in `EUR`.

#### API request

<CodeGroup>
  ```json MATCH expandable theme={null}
  {
      "DisplayName": "EuroCorp EUR FR account",
      "PayoutMethodType": "LocalBankTransfer",
      "RecipientType": "Business",
      "Currency": "EUR",
      "Country": "FR",
      "Tag": "Created using the Mangopay API Postman collection",
      "RecipientScope": "PAYOUT",
      "BusinessRecipient": {
          "BusinessName": "EuroCorp", 
          "Address": {
              "AddressLine1": "6 rue de la Cité",
              "AddressLine2": "Appartement 3",
              "City": "Paris",
              "Region": "île-de-France",
              "PostalCode": "75003",
              "Country": "FR"
          }
      },
      "LocalBankTransfer": {
          "EUR": {        
              "IBAN": "FR7630001007941234567890185"
          }
      }
  }
  ```

  ```json CLOSE_MATCH expandable theme={null}
  {
      "DisplayName": "EuroCorp EUR FR account",
      "PayoutMethodType": "LocalBankTransfer",
      "RecipientType": "Business",
      "Currency": "EUR",
      "Country": "FR",
      "Tag": "Created using the Mangopay API Postman collection",
      "RecipientScope": "PAYOUT",
      "BusinessRecipient": {
          "BusinessName": "EuroCarp", // Name misspelled with A
          "Address": {
              "AddressLine1": "6 rue de la Cité",
              "AddressLine2": "Appartement 3",
              "City": "Paris",
              "Region": "île-de-France",
              "PostalCode": "75003",
              "Country": "FR"
          }
      },
      "LocalBankTransfer": {
          "EUR": {        
              "IBAN": "FR7630001007941234567890185"
          }
      }
  }
  ```

  ```json NO_MATCH expandable theme={null}
  {
      "DisplayName": "EuroCorp EUR FR account",
      "PayoutMethodType": "LocalBankTransfer",
      "RecipientType": "Business",
      "Currency": "EUR",
      "Country": "FR",
      "Tag": "Created using the Mangopay API Postman collection",
      "RecipientScope": "PAYOUT",
      "BusinessRecipient": {
          "BusinessName": "InterCorp", // Or any other name
          "Address": {
              "AddressLine1": "6 rue de la Cité",
              "AddressLine2": "Appartement 3",
              "City": "Paris",
              "Region": "île-de-France",
              "PostalCode": "75003",
              "Country": "FR"
          }
      },
      "LocalBankTransfer": {
          "EUR": {        
              "IBAN": "FR7630001007941234567890185"
          }
      }
  }
  ```
</CodeGroup>

#### API response

<CodeGroup>
  ```json MATCH expandable theme={null}
  {
      "Id": "rec_01K6CYKD6MW45X0TFXS8GSMNWH",
      "Status": "PENDING",
      "CreationDate": 1759223854,
      "DisplayName": "EuroCorp EUR FR account",
      "PayoutMethodType": "LocalBankTransfer",
      "RecipientType": "Business",
      "Currency": "EUR",
      "Country": "FR",
      "UserId": "user_m_01K6ATMK6BA01BHGF14P7M1Q95",
      "RecipientScope": "PAYOUT",
      "Tag": "Created using the Mangopay API Postman collection",
      "BusinessRecipient": {
          "BusinessName": "EuroCorp",
          "Address": {
              "AddressLine1": "6 rue de la Cité",
              "AddressLine2": "Appartement 3",
              "City": "Paris",
              "Region": "île-de-France",
              "PostalCode": "75003",
              "Country": "FR"
          }
      },
      "LocalBankTransfer": {
          "EUR": {
              "IBAN": "FR7630001007941234567890185",
              "BIC": "BDFEFRPPCCT"
          }
      },
      "PendingUserAction": {
          "RedirectUrl": "https://sca.sandbox.mangopay.com/?token=sca_019999e9b6f97eb49e77af2505f5a816"
      },
      "RecipientVerificationOfPayee": {
          "RecipientVerificationId": "383db3d8-2bdd-480d-bed8-28bf5be275a9",
          "RecipientVerificationCheck": "MATCH",
          "RecipientVerificationMessage": "Account name fully matches account identifier."
      }
  }
  ```

  ```json CLOSE_MATCH expandable theme={null}
  {
      "Id": "rec_01K6CYMN7FTBKKQMP8TYM06CJS",
      "Status": "PENDING",
      "CreationDate": 1759223895,
      "DisplayName": "EuroCorp EUR FR account",
      "PayoutMethodType": "LocalBankTransfer",
      "RecipientType": "Business",
      "Currency": "EUR",
      "Country": "FR",
      "UserId": "user_m_01K6ATMK6BA01BHGF14P7M1Q95",
      "RecipientScope": "PAYOUT",
      "Tag": "Created using the Mangopay API Postman collection",
      "BusinessRecipient": {
          "BusinessName": "EuroCarp",
          "Address": {
              "AddressLine1": "6 rue de la Cité",
              "AddressLine2": "Appartement 3",
              "City": "Paris",
              "Region": "île-de-France",
              "PostalCode": "75003",
              "Country": "FR"
          }
      },
      "LocalBankTransfer": {
          "EUR": {
              "IBAN": "FR7630001007941234567890185",
              "BIC": "BDFEFRPPCCT"
          }
      },
      "PendingUserAction": {
          "RedirectUrl": "https://sca.sandbox.mangopay.com/?token=sca_019999ea569f77f79ecbee7dfaba41d6"
      },
      "RecipientVerificationOfPayee": {
          "RecipientVerificationId": "fb72cf37-c468-48fe-afda-4c747d94cec3",
          "RecipientVerificationCheck": "CLOSE_MATCH",
          "RecipientVerificationMessage": "Account name partially matches account identifier. Name returned by check: EuroCorp. Payment made to this account may not reach its intended counterparty."
      }
  }
  ```

  ```json NO_MATCH expandable theme={null}
  {
      "Id": "rec_01K6CYNBD687FB7AZ71VCH29SR",
      "Status": "PENDING",
      "CreationDate": 1759223917,
      "DisplayName": "EuroCorp EUR FR account",
      "PayoutMethodType": "LocalBankTransfer",
      "RecipientType": "Business",
      "Currency": "EUR",
      "Country": "FR",
      "UserId": "user_m_01K6ATMK6BA01BHGF14P7M1Q95",
      "RecipientScope": "PAYOUT",
      "Tag": "Created using the Mangopay API Postman collection",
      "BusinessRecipient": {
          "BusinessName": "InterCorp",
          "Address": {
              "AddressLine1": "6 rue de la Cité",
              "AddressLine2": "Appartement 3",
              "City": "Paris",
              "Region": "île-de-France",
              "PostalCode": "75003",
              "Country": "FR"
          }
      },
      "LocalBankTransfer": {
          "EUR": {
              "IBAN": "FR7630001007941234567890185",
              "BIC": "BDFEFRPPCCT"
          }
      },
      "PendingUserAction": {
          "RedirectUrl": "https://sca.sandbox.mangopay.com/?token=sca_019999eaaf667626a742b929d1473822"
      },
      "RecipientVerificationOfPayee": {
          "RecipientVerificationId": "54ad763c-d10b-4e36-b3ae-efd6d54afcf8",
          "RecipientVerificationCheck": "NO_MATCH",
          "RecipientVerificationMessage": "Account name does not matches account identifier. Payment made to this account may not reach its intended counterparty."
      }
  }
  ```
</CodeGroup>

### DE individual recipient

<table>
  <thead>
    <tr>
      <th class="header">IBAN</th>
      <th class="header">`FirstName`</th>
      <th class="header">`LastName`</th>
      <th class="header">VOP result</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td class="table-content" rowSpan={3}>
        `DE75512108001245126199`
      </td>

      <td class="table-content">
        `John`
      </td>

      <td class="table-content">
        `Doe`
      </td>

      <td class="table-content">
        `MATCH`
      </td>
    </tr>

    <tr>
      <td class="table-content">
        `John`
      </td>

      <td class="table-content">
        `Dae`
      </td>

      <td class="table-content">
        `CLOSE_MATCH`
      </td>
    </tr>

    <tr>
      <td class="table-content">
        Any other value
      </td>

      <td class="table-content">
        Any other value
      </td>

      <td class="table-content">
        `NO_MATCH`
      </td>
    </tr>
  </tbody>
</table>

Insert the data above in the relevant fields when you call [POST Create a Recipient](/api-reference/recipients/create-recipient), ensuring you follow the schema for a `LocalBankTransfer` payout method with the `Country` set to `DE` and the `Currency` in `EUR`.

Follow the examples below.

#### API request

<CodeGroup>
  ```json MATCH expandable theme={null}
  {
      "DisplayName": "John Doe EUR DE account",
      "PayoutMethodType": "LocalBankTransfer",
      "RecipientType": "Individual",
      "Currency": "EUR",
      "Country": "DE",
      "Tag": "Created using the Mangopay API Postman collection",
      "RecipientScope": "PAYOUT",
      "IndividualRecipient": {
          "FirstName": "John",
          "LastName": "Doe",
          "Address": {
              "AddressLine1": "Oranienburger Str. 87",
              "City": "Berlin",
              "PostalCode": "10178",
              "Country": "DE"
          }
      },
      "LocalBankTransfer": {
          "EUR": {        
              "IBAN": "DE75512108001245126199"
          }
      }
  }
  ```

  ```json CLOSE_MATCH expandable theme={null}
  {
      "DisplayName": "John Doe EUR DE account",
      "PayoutMethodType": "LocalBankTransfer",
      "RecipientType": "Individual",
      "Currency": "EUR",
      "Country": "DE",
      "Tag": "Created using the Mangopay API Postman collection",
      "RecipientScope": "PAYOUT",
      "IndividualRecipient": {
          "FirstName": "John",
          "LastName": "Dae", // Name misspelled with A
          "Address": {
              "AddressLine1": "Oranienburger Str. 87",
              "City": "Berlin",
              "PostalCode": "10178",
              "Country": "DE"
          }
      },
      "LocalBankTransfer": {
          "EUR": {        
              "IBAN": "DE75512108001245126199"
          }
      }
  }
  ```

  ```json NO_MATCH expandable theme={null}
  {
      "DisplayName": "John Doe EUR DE account",
      "PayoutMethodType": "LocalBankTransfer",
      "RecipientType": "Individual",
      "Currency": "EUR",
      "Country": "DE",
      "Tag": "Created using the Mangopay API Postman collection",
      "RecipientScope": "PAYOUT",
      "IndividualRecipient": {
          "FirstName": "Jane", // Or any other first name
          "LastName": "Doe", // Or any other last name
          "Address": {
              "AddressLine1": "Oranienburger Str. 87",
              "City": "Berlin",
              "PostalCode": "10178",
              "Country": "DE"
          }
      },
      "LocalBankTransfer": {
          "EUR": {        
              "IBAN": "DE75512108001245126199"
          }
      }
  }
  ```
</CodeGroup>

#### API response

<CodeGroup>
  ```json MATCH expandable theme={null}
  {
      "Id": "rec_01K6CYKD6MW45X0TFXS8GSMNWH",
      "Status": "PENDING",
      "CreationDate": 1759223854,
      "DisplayName": "EuroCorp EUR FR account",
      "PayoutMethodType": "LocalBankTransfer",
      "RecipientType": "Business",
      "Currency": "EUR",
      "Country": "FR",
      "UserId": "user_m_01K6ATMK6BA01BHGF14P7M1Q95",
      "RecipientScope": "PAYOUT",
      "Tag": "Created using the Mangopay API Postman collection",
      "BusinessRecipient": {
          "BusinessName": "EuroCorp",
          "Address": {
              "AddressLine1": "6 rue de la Cité",
              "AddressLine2": "Appartement 3",
              "City": "Paris",
              "Region": "île-de-France",
              "PostalCode": "75003",
              "Country": "FR"
          }
      },
      "LocalBankTransfer": {
          "EUR": {
              "IBAN": "FR7630001007941234567890185",
              "BIC": "BDFEFRPPCCT"
          }
      },
      "PendingUserAction": {
          "RedirectUrl": "https://sca.sandbox.mangopay.com/?token=sca_019999e9b6f97eb49e77af2505f5a816"
      },
      "RecipientVerificationOfPayee": {
          "RecipientVerificationId": "383db3d8-2bdd-480d-bed8-28bf5be275a9",
          "RecipientVerificationCheck": "MATCH",
          "RecipientVerificationMessage": "Account name fully matches account identifier."
      }
  }
  ```

  ```json CLOSE_MATCH expandable theme={null}
  {
      "Id": "rec_01K6CZ7Q1357HZ1FY8CY0MKE85",
      "Status": "PENDING",
      "CreationDate": 1759224519,
      "DisplayName": "John Doe EUR DE account",
      "PayoutMethodType": "LocalBankTransfer",
      "RecipientType": "Individual",
      "Currency": "EUR",
      "Country": "DE",
      "UserId": "user_m_01K6ATMK6BA01BHGF14P7M1Q95",
      "RecipientScope": "PAYOUT",
      "Tag": "Created using the Mangopay API Postman collection",
      "IndividualRecipient": {
          "FirstName": "John",
          "LastName": "Dae",
          "Address": {
              "AddressLine1": "Oranienburger Str. 87",
              "City": "Berlin",
              "PostalCode": "10178",
              "Country": "DE"
          }
      },
      "LocalBankTransfer": {
          "EUR": {
              "IBAN": "DE75512108001245126199",
              "BIC": "SOGEDEFFXXX"
          }
      },
      "PendingUserAction": {
          "RedirectUrl": "https://sca.sandbox.mangopay.com/?token=sca_019999f3de167bc19fbbd7b13292e87b"
      },
      "RecipientVerificationOfPayee": {
          "RecipientVerificationId": "50a8f8be-46c4-467b-b820-d5957e9eea92",
          "RecipientVerificationCheck": "CLOSE_MATCH",
          "RecipientVerificationMessage": "Account name partially matches account identifier. Name returned by check: John Doe. Payment made to this account may not reach its intended counterparty."
      }
  }
  ```

  ```json NO_MATCH expandable theme={null}
  {
      "Id": "rec_01K6CZ5KVFHDTK9H9R78F5ZPX7",
      "Status": "PENDING",
      "CreationDate": 1759224450,
      "DisplayName": "John Doe EUR DE account",
      "PayoutMethodType": "LocalBankTransfer",
      "RecipientType": "Individual",
      "Currency": "EUR",
      "Country": "DE",
      "UserId": "user_m_01K6ATMK6BA01BHGF14P7M1Q95",
      "RecipientScope": "PAYOUT",
      "Tag": "Created using the Mangopay API Postman collection",
      "IndividualRecipient": {
          "FirstName": "Jane",
          "LastName": "Doe",
          "Address": {
              "AddressLine1": "Oranienburger Str. 87",
              "City": "Berlin",
              "PostalCode": "10178",
              "Country": "DE"
          }
      },
      "LocalBankTransfer": {
          "EUR": {
              "IBAN": "DE75512108001245126199",
              "BIC": "SOGEDEFFXXX"
          }
      },
      "PendingUserAction": {
          "RedirectUrl": "https://sca.sandbox.mangopay.com/?token=sca_019999f2d0ed7bdbabd6f6d96f2acbf5"
      },
      "RecipientVerificationOfPayee": {
          "RecipientVerificationId": "22e3f171-abbe-42ad-8ab0-1f52b61f7a21",
          "RecipientVerificationCheck": "NO_MATCH",
          "RecipientVerificationMessage": "Account name does not matches account identifier. Payment made to this account may not reach its intended counterparty."
      }
  }
  ```
</CodeGroup>

### Technical error cases

The following IBANs allow you to simulate error cases with any account holder name.

<table>
  <thead>
    <tr>
      <th class="header">IBAN</th>
      <th class="header">VOP result</th>
      <th class="header">Description</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td class="table-content">
        `FR1420041010050500013M02606`
      </td>

      <td class="table-content">
        `MATCH_NOT_POSSIBLE`
      </td>

      <td class="table-content">
        Simulates a technical error. A `RecipientVerificationId` value is returned, which generally indicates that Mangopay was able to attempt the check but that a technical error occurred.
      </td>
    </tr>

    <tr>
      <td class="table-content">
        `FR7630006000011234567890189`
      </td>

      <td class="table-content">
        `MATCH_NOT_POSSIBLE`
      </td>

      <td class="table-content">
        Simulates a PSP not responding, with delayed response. The `RecipientVerificationId` is `null`, which generally indicates that Mangopay was not able to attempt the check.
      </td>
    </tr>
  </tbody>
</table>

### View a Recipient

If you use the testing data above, the [GET View a Recipient](/api-reference/recipients/view-recipient) returns the VOP check that was performed at creation, with the same `RecipientVerificationId`.

Otherwise, in Sandbox, the [GET View a Recipient](/api-reference/recipients/view-recipient) for a legacy Bank Account or Recipient created before VOP always returns:

```json Recipient or Bank Account not using test data theme={null}
{
//...
    "RecipientVerificationOfPayee": {
        "RecipientVerificationId": null,
        "RecipientVerificationCheck": "MATCH_NOT_POSSIBLE",
        "RecipientVerificationMessage": "Account name could not be verified. Payment made to this account may not reach its intended counterparty."
    }
//...
}
```

In Production, Mangopay performs a VOP check on all active Recipients and legacy Bank Accounts (unless one was already performed at creation or retrieval). The check result is returned on the [GET View a Recipient](/api-reference/recipients/view-recipient) (but not the legacy [GET View a Bank Account](/api-reference/bank-accounts/view-bank-account)).

### Payouts

If you use the testing data above, the [POST Create a Payout](/api-reference/payouts/create-payout) returns the VOP check that was performed at recipient creation, with the same `RecipientVerificationId`.

Otherwise, in Sandbox, the [POST Create a Payout](/api-reference/payouts/create-payout) returns a nulled object:

```json Payout created with Recipient not using test data theme={null}
{
//...
    "RecipientVerificationOfPayee": null,
//...
}
```
