> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.redpincompany.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.redpincompany.com/_mcp/server.

# SEPA Verification of Payee (VoP) Regulations

This guide explains how to handle [Verification of Payee (VoP)](https://www.europeanpaymentscouncil.eu/what-we-do/other-schemes/verification-payee) mismatch errors for EUR payments in the SEPA region.

VoP checks serve as a vital safeguard for verifying account names, ensuring that payments within the EUR market (SEPA region) are routed to the correct recipients.

The goal is to ensure your application can:

* Detect when a VoP mismatch occurs
* Guide the end user with clear instructions
* Safely retry the request using the details returned in the error response.

---

## Where VoP Checks Apply

VoP checks are automatically triggered for **EUR recipients in the SEPA region** in the following API flows:

* [**Create Recipient API**](/api-reference/customers/api-integration/recipients/add-a-new-recipient) -
  Runs a VoP check with the recipient’s bank when a new EUR (SEPA) recipient is added.

* [**Update Recipient API**](/api-reference/customers/api-integration/recipients/update-a-recipients-account) -
  Re-validates details whenever an existing EUR (SEPA) recipient is updated.

* [**Create Payment API**](/api-reference/customers/api-integration/payments/create-payment) -
  With the new regulation, in addition to verifying EUR (SEPA) recipient details when a recipient is created or updated, we are also required to repeat the Verification of Payee (VoP) check when a payment is created.

> **Note:** VoP checks apply only to **EUR recipients in the SEPA region**. Other recipients are **not affected by VoP**; for UK recipients, see the [CoP guide](/api-guide/regulatory-guides/cop-guide).

---

## Resolve a Verification of Payee Mismatch

Anytime we run a Verification of Payee check and a mismatch occurs, an error is returned. In most cases, you will be able to resolve the issue by asking the user for feedback - more details below.

Based on the type of error, you need to display the error to the user, ask them for the best course of action, and then repeat the initial request using the request_identifier and event_id provided with the error payload.

Here is a sample error payload:

**`Create/Update Recipient Response`**

```json title="Create/Update Recipient Response"
{
    "code": "NMTC",
    "description": "Payee's Bank has performed the matching and confirms it is not a match.",
    "recipient_check": {
        "request_identifier": "FR4010096000402181369432U54",
        "event_id": "AG-1757583881611"
    }
}
```

**`Create Payment Response`**

```json title="Create Payment Response"
{
    "code": "550e8400-e29b-41d4-a716-446655440091",
    "description": "Recipient Verification Error",
    "details": {
        "recipients": [
            {
                "code": "NMTC",
                "description": "Payee's Bank has performed the matching and confirms it is not a match.",
                "recipient_id": "REC-001",
                "recipient_check": {
                    "request_identifier": "FR4010096000402181369432U54",
                    "event_id": "AG-1757583881611"
                }
            },
            {
                "code": "CMTC",
                "description": "Payee's Bank has performed the matching and confirms it is a close match.",
                "recipient_id": "REC-001",
                "recipient_check": {
                    "request_identifier": "FR4010096000402181369432U55",
                    "event_id": "AG-1757583881612",
                    "suggested_recipient_name": "Olivier Bernard",
                }
            }
        ]
    }
}
```

Details of each case are outlined below. Depending on the user’s selected action (`override` or `update`), the appropriate follow up request should be constructed as described in the following sections.

The sections below outline the details of each type of mismatch and how to handle it.

### Case 1: No Match

Error code: NMTC

**Sample response:**

```json
{
    "code": "NMTC",
    "description": "Payee's Bank has performed the matching and confirms it is not a match.",
    "recipient_check": {
        "request_identifier": "FR4010096000402181369432U54",
        "event_id": "AG-1757583881611"
    }
}
```

**How to handle it:**

You must display the error message to the user. The user has the option to continue anyway, or to update the details.

If the user chooses to continue anyway, repeat the request as described below, with `confirm_recipient.customer_action: "override"`

New request body for customer_action: "override"

**`Create/Update Recipient Request`**

```json title="Create/Update Recipient Request"
{
  "... previous payload ...",
  "confirm_recipient": {
    "customer_action": "override",
    "request_identifier": "FR4010096000402181369432U54",
    "event_id": "AG-1757583881611"
  }
}
```

**`Create Payment Request`**

```json title="Create Payment Request"
{
  "... previous payload ...",
  "recipient_details": [
    {
      "recipient_id": "REC-001",
      "amount": { "currency": "EUR", "value": 50000 },
      "payment_reference": "PROPERTY_DOWN_PAYMENT",
      "confirm_recipient": {
        "customer_action": "override",
        "request_identifier": "FR4010096000402181369432U54",
        "event_id": "AG-1757583881611"
      }
    }
  ]
}
```

If the user updates the details, repeat the flow from the beginning

### Case 2: Close Match

Error code: CMTC

**Sample response:**

```json
{
    "code": "CMTC",
    "description": "Payee's Bank has performed the matching and confirms it is a close match.",
    "recipient_check": {
        "request_identifier": "FR4010096000402181369432U54",
        "suggested_recipient_name": "Olivier Bernard",
        "event_id": "AG-1757583918308"
    }
}
```

**How to handle it:**

You must display the suggestion to the user. The user has the option to accept the suggestion, or continue with the original details they provided:

When calling the Create Recipient or Update Recipient endpoints, setting confirm_recipient.customer_action to "update" and name to the `suggested_recipient_name` from the response will accept the suggestion without performing another VOP check.

This option is not available in the Create Payment API, recipients which receive this response can be updated using the Update Recipient call.

New request body for customer_action: "update"

**`Create/Update Recipient Request`**

```json title="Create/Update Recipient Request"
{
  "... previous payload ...",
  "name": "Olivier Bernard",
  "confirm_recipient": {
    "customer_action": "update",
    "request_identifier": "FR4010096000402181369432U54",
    "event_id": "AG-1757583918308"
  }
}
```

If the user chooses to continue anyway, repeat the request as described below, with `confirm_recipient.customer_action: "override"`

New request body for customer_action: "override"

**`Create/Update Recipient Request`**

```json title="Create/Update Recipient Request"
{
  "... previous payload ...",
  "confirm_recipient": {
    "customer_action": "override",
    "request_identifier": "FR4010096000402181369432U54",
    "event_id": "AG-1757583918308"
  }
}
```

**`Create Payment Request`**

```json title="Create Payment Request"
{
  "... previous payload ...",
  "recipient_details": [
    {
      "recipient_id": "REC-001",
      "amount": { "currency": "EUR", "value": 50000 },
      "payment_reference": "PROPERTY_DOWN_PAYMENT",
      "confirm_recipient": {
        "customer_action": "override",
        "request_identifier": "FR4010096000402181369432U54",
        "event_id": "AG-1757583918308"
      }
    }
  ]
}
```

### Case 3: Not Applicable / VoP Check Not Possible

Error code: NOAP

**Sample response:**

```json
{
    "code": "NOAP",
    "description": "Verification Check not possible.",
    "recipient_check": {
        "request_identifier": "FR4010096000402181369432U54",
        "event_id": "AG-1757584072094"
    }
}
```

**How to handle it:**

The user should be informed that verification check is not possible. The user has the option to update the details, or continue with the original details they provided:

If the user chooses to continue anyway, repeat the request as described below, with `confirm_recipient.customer_action: "override"`

New request body for customer_action: "override"

**`Create/Update Recipient Request`**

```json title="Create/Update Recipient Request"
{
  "... previous payload ...",
  "confirm_recipient": {
    "customer_action": "override",
    "request_identifier": "FR4010096000402181369432U54",
    "event_id": "AG-1757584072094"
  }
}
```

**`Create Payment Request`**

```json title="Create Payment Request"
{
  "... previous payload ...",
  "recipient_details": [
    {
      "recipient_id": "REC-001",
      "amount": { "currency": "EUR", "value": 50000 },
      "payment_reference": "PROPERTY_DOWN_PAYMENT",
      "confirm_recipient": {
        "customer_action": "override",
        "request_identifier": "FR4010096000402181369432U54",
        "event_id": "AG-1757584072094"
      }
    }
  ]
}
```

If the user updates the details, repeat the flow from the beginning