Verification of Payee (VOP)

Comply with the Verification of Payee EU regulation with Numeral

ℹ️

Numeral's VOP solution is based on currently available information and technical documentation from the European Payments Council (EPC), including the Verification Of Payee Scheme Rulebook, the Verification Of Payee Inter-PSP API Specifications, and the API Security Framework.

Numeral is still waiting for the publication of critical EPC documentations, including the EPC's Directory Services documentation to finalise and launch its VOP solution.

Numeral has expressed its intent to participate as a routing and verification mechanism (RVM) via the EPC's call for interest and is listed as a compliant RVM.

Numeral actively participates in the EPC's RVM information sessions and intends to participate in the EPC's pilot phases.

About VOP

What is VOP?

Verification of Payee (VOP) is part of the European Union's Instant Payments Regulation (Regulation (EU) 2024/886) designed to prevent payment errors and fraud by enabling payment service providers (PSPs) to check if the payee's name matches their account details before a payment is made. This helps protect customers from accidental errors and fraud by verifying the payee's information.

How does it work?

When asked by its end user (the requester), the PSP holding the end user's account (the requesting PSP) sends a VOP request to the the PSP holding the payee's account (the responding PSP).

This verification can be based on:

  • Identification code / IBAN for legal persons
  • Name / IBAN for legal and natural persons

When receiving a request, the responding PSP must compare the payee's name in the request with the payee's name in its records and respond with one of the following 4 results.

ResultDescription
Match
match
Payee's name matches
No match
no_match
Payee's name does not match
Close match
close_match
Payee's name is a close match
Impossible to match
impossible_to_match
Responding PSP did not manage to match data`

Onboarding and setup

Numeral will assist you in the VOP scheme onboarding process and VOP solution setup, including:

  1. Storing your QWAC certificate for PSP mutual authorisation
  2. Configuring and communicating your URI that other PSPs will request, along with your supported LEIs
  3. Supporting you in your integration of Numeral, depending on the integration method of your choice (see below)
  4. Performing penny tests to validate your integration with Numeral and VOP compliance

Once completed, you will be all set to send and receive VOP requests.

Supported integration modes

To comply with the VOP regulation, PSPs must be able to respond to VOP requests received. Numeral supports 3 integration modes:

Integration modeDescription
Synchronised accountsNumeral stores your customer accounts, including holder name / identifier and IBAN, runs the matching algorithm, computes the result, and sends it to the requesting PSP
Real-time calls to your core systemsNumeral requests account holder information from your system, computes the result, and sends it to the requesting PSP
Pass-throughNumeral acts as a secure gateway between the requesting PSP and your system, handling the technical communication layer while leaving the business logic to you

API

Sending a VOP request

To send a VOP request, send the required information about the payee you want to verify:

POST /outgoing_vop_requests

{
  "party_name": "Jean Dupont",
  "party_account": "FR5012739000308682265435N36"
}
POST /outgoing_vop_requests

{
  "party_identification_type": "lei",
  "party_identification": "123456789",
  "party_account": "FR5012739000308682265435N36"
}

The process is asynchronous:

  1. Numeral will respond with the ID of the outgoing VOP request, with status = created
  2. Numeral will check if the payee's PSP is a participant to VOP and supports the provided party identification type. If so, Numeral will send the query to the payee's PSP and a corresponding outgoing_vop_request.sent event
  3. When the result is available, Numeral will update status to processed and result and create the related event
{
  "object": "outgoing_vop_request",
  "id": "20c75a77-de31-460d-a321-4f2421805943",
  "status": "created",
  "status_details": null,
  "party_name": "Jean Dupont",
  "party_identification_type": null,
  "party_identification": null,
  "party_account": "FR5012739000308682265435N36",
  "party_agent": "BANKFRPP",
  "unstructured_remittance_information":null,
  "result": null,
  "created_at": "2025-01-28T15:26:36Z",
  "metadata": null,
  "bank_data": {
    "X-Request-ID": "c3d79e5a-2058-4301-8b36-353cb9eb0ca5",
    "X-RequestTimestamp": null,
    "X-ResponseTimestamp": null
  }
}
{
  "object": "outgoing_vop_request",
  "id": "20c75a77-de31-460d-a321-4f2421805943",
  "status": "sent",
  "status_details": null,
  "party_name": "Jean Dupont",
  "party_identification_type": null,
  "party_identification": null,
  "party_account": "FR5012739000308682265435N36",
  "party_agent": "BANKFRPP",
  "unstructured_remittance_information":null,
  "result": null,
  "created_at": "2025-01-28T15:26:36Z",
  "metadata": null,
  "bank_data": {
    "X-Request-ID": "c3d79e5a-2058-4301-8b36-353cb9eb0ca5",
    "X-RequestTimestamp": "2025-01-26T13:51:10Z",
    "X-ResponseTimestamp": null
  }
}
{
  "object": "outgoing_vop_request",
  "id": "20c75a77-de31-460d-a321-4f2421805943",
  "status": "processed",
  "status_details": null,
  "party_name": "Jean Dupont",
  "party_identification_type": null,
  "party_identification": null,
  "party_account": "FR5012739000308682265435N36",
  "party_agent": "BANKFRPP",
  "unstructured_remittance_information":null,
  "result": {
    "value": "match",
    "suggested_name": null,
  },
  "created_at": "2025-01-28T15:26:36Z",
  "metadata": null,
  "bank_data": {
    "X-Request-ID": "c3d79e5a-2058-4301-8b36-353cb9eb0ca5",
    "X-RequestTimestamp": "2025-01-26T13:51:10Z",
    "X-ResponseTimestamp": "2025-01-26T13:51:15Z"
  }
}

The result will be a match, close_match, no_match, or impossible_match.

{
  "object": "outgoing_vop_request",
  "id": "20c75a77-de31-460d-a321-4f2421805943",
  "status": "processed",
  "status_details": null,
  "party_name": "Jean Dupont",
  "party_identification_type": null,
  "party_identification": null,
  "party_account": "FR5012739000308682265435N36",
  "party_agent": "BANKFRPP",
  "unstructured_remittance_information":null,
  "result": {
    "value": "match",
    "suggested_name": null,
  },
  "created_at": "2025-01-28T15:26:36Z",
  "metadata": null,
  "bank_data": {
    "X-Request-ID": "c3d79e5a-2058-4301-8b36-353cb9eb0ca5",
    "X-RequestTimestamp": "2025-01-26T13:51:10Z",
    "X-ResponseTimestamp": "2025-01-26T13:51:15Z"
  }
}
{
  "object": "outgoing_vop_request",
  "id": "20c75a77-de31-460d-a321-4f2421805943",
  "status": "processed",
  "status_details": null,
  "party_name": "Jean Dupont",
  "party_identification_type": null,
  "party_identification": null,
  "party_account": "FR5012739000308682265435N36",
  "party_agent": "BANKFRPP",
  "unstructured_remittance_information":null,
  "result": {
    "value": "close_match",
    "suggested_name": "Jean Dupond",
  },
  "created_at": "2025-01-28T15:26:36Z",
  "metadata": null,
  "bank_data": {
    "X-Request-ID": "c3d79e5a-2058-4301-8b36-353cb9eb0ca5",
    "X-RequestTimestamp": "2025-01-26T13:51:10Z",
    "X-ResponseTimestamp": "2025-01-26T13:51:15Z"
  }
}
{
  "object": "outgoing_vop_request",
  "id": "20c75a77-de31-460d-a321-4f2421805943",
  "status": "processed",
  "status_details": null,
  "party_name": "Jean Dupont",
  "party_identification_type": null,
  "party_identification": null,
  "party_account": "FR5012739000308682265435N36",
  "party_agent": "BANKFRPP",
  "unstructured_remittance_information":null,
  "result": {
    "value": "no_match",
    "suggested_name": null,
  },
  "created_at": "2025-01-28T15:26:36Z",
  "metadata": null,
  "bank_data": {
    "X-Request-ID": "c3d79e5a-2058-4301-8b36-353cb9eb0ca5",
    "X-RequestTimestamp": "2025-01-26T13:51:10Z",
    "X-ResponseTimestamp": "2025-01-26T13:51:15Z"
  }
}
{
  "object": "outgoing_vop_request",
  "id": "20c75a77-de31-460d-a321-4f2421805943",
  "status": "processed",
  "status_details": null,
  "party_name": "Jean Dupont",
  "party_identification_type": null,
  "party_identification": null,
  "party_account": "FR5012739000308682265435N36",
  "party_agent": "BANKFRPP",
  "unstructured_remittance_information":null,
  "result": {
    "value": "impossible_match",
    "suggested_name": null,
  },
  "created_at": "2025-01-28T15:26:36Z",
  "metadata": null,
  "bank_data": {
    "X-Request-ID": "c3d79e5a-2058-4301-8b36-353cb9eb0ca5",
    "X-RequestTimestamp": "2025-01-26T13:51:10Z",
    "X-ResponseTimestamp": "2025-01-26T13:51:15Z"
  }
}

Answering a VOP request

Synchronised accounts

To respond to incoming VOP requests, you can create internal accounts in Numeral through API or file upload. Numeral will use this data to compute the result and return it to the requesting PSP.

{
  "object": "incoming_vop_request",
  "id": "20c75a77-de31-460d-a321-4f2421805943",
  "status": "received",
  "status_details": null,
  "party_name": "Mr. John  Döe",
  "party_name_cleaned": null,
  "party_identification_type": null,
  "party_identification": null,
  "party_account": "FR5012739000308682265435N36",
  "party_agent": "YOURBICXXX",
  "unstructured_remittance_information":["Mr. John  Döe and Ms. Elma John"],
  "result": null,
  "created_at": "2025-01-28T15:26:36Z",
  "bank_data": {
    "X-Request-ID": "c3d79e5a-2058-4301-8b36-353cb9eb0ca5",
    "X-RequestTimestamp": "2025-01-26T13:51:10Z",
    "X-ResponseTimestamp": null
  }
}
{
  "object": "incoming_vop_request",
  "id": "20c75a77-de31-460d-a321-4f2421805943",
  "status": "received",
  "status_details": null,
  "party_name": "Mr. John  Döe",
  "party_name_cleaned": "John Doe",
  "party_identification_type": null,
  "party_identification": null,
  "party_account": "FR5012739000308682265435N36",
  "party_agent": "YOURBICXXX",
  "unstructured_remittance_information":["Mr. John  Döe and Ms. Elma John"],
  "result":{
    "value": "match",
    "suggested_name": null
  },
  "created_at": "2025-01-28T15:26:36Z",
  "bank_data": {
    "X-Request-ID": "c3d79e5a-2058-4301-8b36-353cb9eb0ca5",
    "X-RequestTimestamp": "2025-01-26T13:51:10Z",
    "X-ResponseTimestamp": "2025-01-26T13:51:15Z"
  }
}

The matching algorithm complies with the Instant Payments Regulation and EPC's VOP scheme rulebook and recommendations.

Real-time calls to your core systems

In this approach, upon receiving a VOP request and after having verified its validity, Numeral will request account holder information from your system using the IBAN received. This can be done with a call to an API endpoint or webhooks. Using this data, Numeral will compute the result and send it to the requesting PSP.

Pass-through integration

Numeral will perform checks on incoming requests, including:

  • Requesting PSP's participation to VOP
  • Support of the requested organisation identifier type

When successful, the Numeral platform will send a incoming_vop_request.pending event to your webhook so you can calculate and share the result to be forwarded to the requesting PSP.

POST /incoming_vop_requests/20c75a77-de31-460d-a321-4f2421805943

{
  "value": "close_match",
  "suggested_name": "John Doe"
}

Dashboard

Using Numeral dashboard, you will be able to:

  • Monitor VOP requests sent and received
  • Access the list of VOP participants
Outgoing VOP requests

Outgoing VOP requests

Details of an outgoing VOP request

Details of an outgoing VOP request

Events of an outgoing VOP request

Events of an outgoing VOP request

Resources