Verification of Payee (VOP)

Overview

Verification of Payee (VoP) is a real-time verification service that confirms whether a provided name or company identifier matches the actual bank account holder of a given IBAN. By validating beneficiary identity before payment execution, VoP helps prevent fraud, reduce payment errors, and build trust in financial transactions.

Want to explore the API right away? But don't skip the rest of this guide that contains important information. No TL;DR is accepted! 😉

Key Benefits

Prevent fraud and misdirected payments before they occur Reduce operational costs by eliminating manual document collection and verification Increase trust and transparency in financial transactions Automate IBAN verification within your existing workflows Improve payment success rates and reduce exception handling Ensure regulatory compliance with the EU Instant Payments Regulation (when applicable)

Regulatory Context

As of October 9, 2025, VoP verification becomes mandatory for regulated entities (banks and payment institutions) under the EU Instant Payment Regulation. However, VoP's value extends beyond compliance—it's a powerful risk mitigation and automation tool for any organization handling payments, onboarding processes, or sensitive financial flows.

How It Works

Verification Process

  1. Request: Your system calls our VoP REST API with:
    • Payee's name OR an identifier (e.g., VAT number)
    • IBAN to verify
  2. Routing: we call our supplier who route the request to the relevant financial institution via the Routing & Verification Mechanism (RVM)
  3. Verification: the IBAN-issuing financial institution performs the verification
  4. Response: you receive one of four possible results:
    • MATCH - Perfect match found
    • CLOSE_MATCH - Near match found (minor differences)
    • NO_MATCH - No match found
    • NO_AP - Verification not applicable/available

Each response includes:

  • Our unique internal id of the request for tracking/support
  • The remote id of our supplier
  • Timestamp header for audit trails/support
  • Bank name and BIC of the verifying institution

Integration points

VoP can be integrated at various stages of your payment lifecycle:

During Onboarding or Data Capture

Validate account ownership immediately when customers, suppliers, or beneficiaries provide their IBAN. This prevents incorrect or fraudulent data from entering your systems.

Before Payment Initiation

Execute a final verification before releasing funds, especially critical for:

  • High-value payments
  • Bulk payment runs
  • Updates to existing beneficiary details

As a Regulatory Control Layer

  • Regulated entities: Automatic execution before instant payments
  • Non-regulated entities: Voluntary adoption of bank-grade verification standards

Within Automated Decision Flows

Build intelligent workflows based on VoP responses:

  • MATCH → Proceed automatically
  • CLOSE_MATCH → Request confirmation or apply internal rules
  • NO_MATCH → Block payment or trigger manual review

Use Cases

SEPA Direct Debit Mandate Verification

Verify in real-time that the provided IBAN belongs to the customer creating a SEPA mandate. The verification runs silently in the background without disrupting the user experience.

Customer and Supplier Onboarding

Confirm IBAN ownership during onboarding or when payment details are updated. This reduces fraud risk and avoids costly corrections later.

Beneficiary Verification for Payouts

Ensure IBANs belong to intended beneficiaries before executing:

  • Refunds
  • Payroll
  • Insurance claims
  • Loan disbursements
  • Compensation payments
  • Other allocations

Technical integration

This service is integrated in our Docker API. No need to connect to another API. You simply have to call the "/ob/vop" endpoint.

curl --location 'https://<your docker address>/ob/vop' \
--header 'X-Request-ID: 4408e740-e27d-4cf2-bc80-ef7a774dc704' \
--header 'Content-Type: application/json' \
--data '{
  "vop": {
    "iban": "BE12345678901234",
    "name": "John Doe"
  }
}'

Verification Methods

Name-Based Verification (Recommended)

Verify account ownership using the account holder's name.

Match example response

curl --location 'https://<your docker address>/ob/vop' \
--header 'X-Request-ID: 4408e740-e27d-4cf2-bc80-ef7a774dc704' \
--header 'Content-Type: application/json' \
--data '{
  "vop": {
    "iban": "BE12345678901234",
    "name": "John Doe"
  }
  }'

Response

{
    "id": "12345678-a78c-4df9-8166-019c08c3f312",
    "remoteId": "12345678-ee40-4e6d-ba15-f7f843256fdb",
    "vopResult": {
        "vopMatchResult": {
            "result": "MATCH"
        },
        "bankAccountHolder": {
            "name": "John Doe",
            "identifier": null
        },
        "bank": {
            "bic": "GEBABEBB",
            "name": "BNP Paribas Fortis"
        }
    }
}

Close match response

curl --location 'https://<your docker address>/ob/vop' \
--header 'X-Request-ID: 4408e740-e27d-4cf2-bc80-ef7a774dc704' \
--header 'Content-Type: application/json' \
--data '{
  "vop": {
    "iban": "BE12345678901234",
    "name": "Jon Doe"
  }
  }'

Response

{
    "id": "12345678-a78c-4df9-8166-019c08c3f312",
    "remoteId": "12345678-ee40-4e6d-ba15-f7f843256fdb",
    "vopResult": {
        "vopMatchResult": {
            "result": "CLOSE_MATCH"
        },
        "bankAccountHolder": {
            "name": "John Doe",
            "identifier": null
        },
        "bank": {
            "bic": "GEBABEBB",
            "name": "BNP Paribas Fortis"
        }
    }
}

No match response

curl --location 'https://<your docker address>/ob/vop' \
--header 'X-Request-ID: 4408e740-e27d-4cf2-bc80-ef7a774dc704' \
--header 'Content-Type: application/json' \
--data '{
  "vop": {
    "iban": "BE12345678901234",
    "name": "Jane Doe"
  }
  }'

Response

{
    "id": "12345678-a78c-4df9-8166-019c08c3f312",
    "remoteId": "12345678-ee40-4e6d-ba15-f7f843256fdb",
     "vopResult": {
        "vopMatchResult": {
            "result": "NO_MATCH"
        },
        "bankAccountHolder": null,
        "bank": {
            "bic": "GEBABEBB",
            "name": "BNP Paribas Fortis"
        }
    }
}

Identifier-Based Verification

🚧

Identifier-based verification shows varying results and consistency across different banks. We recommend using name-based verification when possible.

Verify account ownership using standardized identifiers.

Supported Identifier Types

TypeDescriptionExample
LEILegal Entity Identifier9845000A44AB9CA60605
BICBank Identifier CodeDIGEBEB2
TXIDTax Identification Number (VAT)BE0630675588
CINCCertificate of Incorporation NumberCompany registration number
DUNSData Universal Numbering SystemD-U-N-S number
SRENSIREN (France)French business ID
SRETSIRET (France)French establishment ID

View all supported identifier types

Verification Example (VAT)

curl --location 'https://docker.bankingsdk.com/ob/vop' \
--header 'X-Request-ID: b5db3df5-88b1-4467-b261-752ffcd3df3a' \
--header 'X-GwRoute: preprod' \
--header 'Content-Type: application/json' \
--data '{
  "vop": {
    "iban": "BE03130000000184",
    "identifier": {
      "type": "TXID",
      "value": "BE0630675588"
    }
  }
}'

Response

{
    "id": "12345678-a78c-4df9-8166-019c08c3f312",
    "remoteId": "12345678-ee40-4e6d-ba15-f7f843256fdb",
     "vopResult": {
        "vopMatchResult": {
            "result": "MATCH"
        },
        "bankAccountHolder": {
            "name": null,
            "identifier": {
                "type": "TXID",
                "value": "BE0630675588"
            }
        },
        "bank": {
            "bic": "DIGEBEB2",
            "name": "DIGITEAL SA"
        }
    }
}

Response codes

ResultDescriptionRecommended action
MATCHPerfect match between provided data and account holderProceed with payment
CLOSE_MATCHMinor differences detected (e.g., missing suffix, typos)Review differences or request confirmation
NO_MATCHSignificant mismatchBlock payment or require manual verification
NO_APVerification not available for this accountApply alternative verification methods
ERRORTechnical or processing errorRetry or contact support

Error handling

If an error happens, be sure to save the information to share it with our support.

🚧

In any case, please save the headers to be able to go to support with it:

Date: Thu, 29 Jan 2026 08:39:37 GMT X-Request-ID: 496437e1-698a-4493-8fef-947301ef5cd4 X-BSDK-VERSION: 4.0.60.0 X-Operation-ID: d238bc62e04a1495c355b8bb2341c0b6,preprod;rev=1,info02:False X-GWAPI-VERSION: 4.0.60.0 X-Correlation-ID: 6edad987-f7fd-4398-b33b-019c08e87677,preprod;rev=1

Note that the X-Request-ID is the one you sent us.

Validation error

{
    "exceptionType": "ValidationException",
    "message": "{\"Property\":\"Vop.Iban\",\"Message\":\"The Iban field is required.\"}",
    "userContext": null,
    "log": null,
    "innerException": null,
    "statusCode": null,
    "callId": null,
    "sdkStatus": null,
    "innerMostMessage": null,
    "innerMostErrorType": null,
    "referenceId": null
}

Error coming from the supplier

{
    "exceptionType": "GatewayException",
    "message": "THE MESSAGE OF THE SUPPLIER",
    "userContext": null,
    "log": null,
    "innerException": null,
    "statusCode": null,
    "callId": "12345678-a78c-4df9-8166-019c08c3f312",
    "sdkStatus": null,
    "innerMostMessage": null,
    "innerMostErrorType": null,
    "referenceId": null
}

TppContext

Here also you can add the TPP Context in all the calls. They will be saved in our storage. You can find explanation of it in this article.


curl --location 'https://<your docker address>/ob/vop' \
--header 'X-Request-ID: 4408e740-e27d-4cf2-bc80-ef7a774dc704' \
--header 'Content-Type: application/json' \
--data '{
  "tppContext": {
    "tppId": "xx",
    "app": "xx",
    "flow": "xx",
    "transaction": "xx",
    "unit": "xx"
  },
  "vop": {
    "iban": "BE12345678901234",
    "name": "John Doe"
  }
}'