---
updatedAt: 2026-08-28T07:28:05.000Z
agentTools:
  projectIndex: https://docs.fiatrepublic.com/llms.txt
---

# Verification of Payee (VoP) for SEPA EUR Payments

To comply with new regulations and improve payment safety, we’re adding a **Verification of Payee (VoP)** step.

The VoP verification determines whether a payment can proceed:

* `MATCH` - the payee details match exactly. The verification is automatically accepted and the payment can proceed.
* `CLOSE_MATCH` or `NO_MATCH` - customer review is required before the payment can proceed.
* `EXEMPT` - the payee is exempt from the VoP requirement. No customer approval is required and the payment can proceed.

## Scope

This feature is initially available only for **SEPA EUR** payments. We plan to extend this to other payment schemes later.

Please note that payments made via the `EAGLE_NET` scheme are **not** subject to the Verification of Payee (VoP) requirement.

Some payees may receive an `EXEMPT` verification status when the VoP requirement does not apply.

An `EXEMPT` verification is valid for payment assignment and does not require customer approval.

***

## Verification Flow

###

### Step 1 - Start verification

Create the Payee as you normally would. Then start the Verification of Payee check:

**Endpoint:** `POST /payees/{payeeId}/verification`

The response contains two separate pieces of information:

* `matchResult.matchLevel` — the result of the Verification of Payee check.
* `status` — the current lifecycle status of the verification.

Example:

```json
{
  "id": "pvn_pjbyge1ljdn7d9z8ks",
  "payeeId": "pye_p9mnzv0p8n6l1ya85b",
  "assignedToId": null,
  "status": "PENDING_CUSTOMER_REVIEW",
  "type": "VERIFICATION_OF_PAYEE",
  "matchResult": {
    "matchLevel": "NO_MATCH",
    "description": null,
    "accountHolder": null
  }
}
```

### Verification status vs. VoP result

The `status` and `matchResult.matchLevel` fields represent different things:

| Field                    | Meaning                                                                                                          |
| ------------------------ | ---------------------------------------------------------------------------------------------------------------- |
| `status`                 | The current lifecycle state of the verification. It determines whether the verification can be used for payment. |
| `matchResult.matchLevel` | The result of the VoP check.                                                                                     |

For example:

```json
{
  "status": "PENDING_CUSTOMER_REVIEW",
  "matchResult": {
    "matchLevel": "NO_MATCH"
  }
}
```

In this example, `NO_MATCH` is the result of the VoP check, while `PENDING_CUSTOMER_REVIEW` means that the customer must explicitly accept or reject the result before the payment can proceed.

### Step 2 - Handle the verification result

The next action depends on the result of the VoP check.

#### MATCH

A `MATCH` result means that the payee details exactly match the account holder information returned by the payee's bank.

* The verification is automatically accepted and its status becomes `ACCEPTED`.
* No customer review is required.
* The `payeeVerificationId` can be used directly to proceed with one payment.

#### CLOSE\_MATCH or NO\_MATCH

A `CLOSE_MATCH` or `NO_MATCH` result means that the payee details do not exactly match the information returned by the payee's bank.

* The verification enters `PENDING_CUSTOMER_REVIEW`.
* The customer must explicitly accept or reject the result using:

  **Endpoint:** `POST /payees/verifications/{verificationId}/review`

**Accept:**

```json Accept payload
{
  "accepted": true
}
```

**Decline:**

```json Decline payload
{
  "accepted": false
}
```

After the customer accepts the verification, its status becomes `ACCEPTED` and the `payeeVerificationId` can be used for one payment.

<Callout icon="❗️" theme="error">
  ### Important

  You cannot use the payeeVerificationId while the verification is in `PENDING_CUSTOMER_REVIEW`.
</Callout>

#### EXEMPT

An `EXEMPT` status means that the payee is exempt from the Verification of Payee requirement.

* No customer review or explicit acceptance is required.
* The payeeVerificationId can be used directly to proceed with one payment.

```json
{
  "id": "pvn_pjbyge1ljdn7d9z8kl",
  "payeeId": "pye_p9mnzv0p8n6l1ya85o",
  "assignedToId": null,
  "status": "EXEMPT",
  "type": "VERIFICATION_OF_PAYEE",
  "matchResult": null
}
```

<Callout icon="⚠️" theme="warn">
  ### **Payment eligibi**l**ity**

  A payment can proceed only when the VoP verification status is `ACCEPTED` or `EXEMPT`.

  - `MATCH` → automatically becomes `ACCEPTED` → payment can proceed.
  - `CLOSE_MATCH` / `NO_MATCH` → `PENDING_CUSTOMER_REVIEW` → customer must accept → `ACCEPTED` → payment can proceed.
  - `EXEMPT` → no customer approval required → payment can proceed.
</Callout>

### Step 3 - Send the payment

Once the verification is in an eligible status, attach the `payeeVerificationId` to your payout request.

A verification can be used for payment assignment only when its status is:

* `ACCEPTED`
* `EXEMPT`
* `MATCH` results are automatically accepted and therefore result in an `ACCEPTED` verification.

For `CLOSE_MATCH` or `NO_MATCH`, the customer must first accept the verification and change its status to `ACCEPTED`.

Example:

```json
{
  "fromId": "fac_4dbv611zb251v3orMg",
  "toId": "pye_eaxp4n74j5127l58vm",
  "payeeVerificationId": "pvn_vkoep8y1d57rmnba1g",
  "reference": "test payout SCT",
  "amount": "6",
  "paymentScheme": "SCT"
}
```

## Lifecycle & constraints

* **Single use.** A `payeeVerificationId` authorizes one payment. After successful use, its status becomes `ASSIGNED` and it cannot be reused.

* **Statuses allowed for payment.** A `payeeVerificationId` can be used for payment assignment only when its verification status is `ACCEPTED` or `EXEMPT`.

* **MATCH.** A `MATCH` result is automatically accepted. No customer action is required.

* **Customer review.** A verification in `PENDING_CUSTOMER_REVIEW` cannot be used for payment assignment. The customer must explicitly accept the verification first.

* **EXEMPT.** A verification in `EXEMPT` status does not require customer approval and can be used directly for payment assignment.

* **Expiry.** Any verification in `PENDING_CUSTOMER_REVIEW` or `ACCEPTED` that is older than 10 minutes automatically transitions to `EXPIRED`. Start a new verification if it expires.

### Verification statuses and payment eligibility

| Verification status       | Typical VoP result                             |       Customer action required | Payment can proceed |
| ------------------------- | ---------------------------------------------- | -----------------------------: | ------------------: |
| `ACCEPTED`                | `MATCH` or accepted `CLOSE_MATCH` / `NO_MATCH` |                             No |                 Yes |
| `EXEMPT`                  | VoP exempt                                     |                             No |                 Yes |
| `PENDING_CUSTOMER_REVIEW` | `CLOSE_MATCH` / `NO_MATCH`                     |                            Yes |                  No |
| `ASSIGNED`                | Already used                                   |                             No |                  No |
| `EXPIRED`                 | Verification expired                           | Yes - start a new verification |                  No |

## Interpreting VoP Verification Responses

The VoP check can return a result in `matchResult.matchLevel`. This result is separate from the verification `status`, which determines what action is required.

#### ✅ `MATCH`

A `MATCH` result means that the payee details exactly match the account holder information returned by the payee's bank.

* The verification is automatically accepted and its status becomes `ACCEPTED`.
* No customer review is required and the payment can proceed.

#### ⚠️ `CLOSE_MATCH` or `NO_MATCH`

A `CLOSE_MATCH` or `NO_MATCH` result means that the payee details do not exactly match the information returned by the payee's bank.

* The verification enters `PENDING_CUSTOMER_REVIEW`.
* The customer must explicitly accept or reject the result before the payment can proceed.

#### ℹ️ `EXEMPT`

An `EXEMPT` verification means that the payee is exempt from the Verification of Payee requirement.

* No customer review or explicit acceptance is required.
* The payment can proceed directly using the `payeeVerificationId`.

#### ⚠️ Verification error

If the VoP verification itself cannot be completed, the API returns an error and no usable verification is created.

This can occur when, for example:

* the payee's bank is not available on the VoP network;
* the account is not available for verification;
* the account type is not supported.

In these cases, retry once the underlying issue has been resolved.

<br />