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.
Result | Description |
---|---|
Matchmatch | Payee's name matches |
No matchno_match | Payee's name does not match |
Close matchclose_match | Payee's name is a close match |
Impossible to matchimpossible_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:
- Storing your QWAC certificate for PSP mutual authorisation
- Configuring and communicating your URI that other PSPs will request, along with your supported LEIs
- Supporting you in your integration of Numeral, depending on the integration method of your choice (see below)
- 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 mode | Description |
---|---|
Synchronised accounts | Numeral 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 systems | Numeral requests account holder information from your system, computes the result, and sends it to the requesting PSP |
Pass-through | Numeral 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:
- Numeral will respond with the ID of the outgoing VOP request, with
status
=created
- 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 - When the result is available, Numeral will update
status
toprocessed
andresult
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
Resources
Updated about 2 hours ago