---
title: "Card verification"
slug: "card-verification"
updated: 2026-07-08T03:26:12Z
published: 2026-07-08T03:26:12Z
canonical: "docs.xendit.co/card-verification"
---

> ## Documentation Index
> Fetch the complete documentation index at: https://docs.xendit.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Card verification

## Payment Method Verification (`VERIFY_PAYMENT_METHOD`)

### Purpose

Allows merchants to verify and vault a customer's card details without charging them (e.g., during recurring subscription setup or user onboarding). Xendit automatically abstracts processor-specific mechanics, such as native $0 authorizations or automatic micro-charge voids behind a single, clean interface.

### Key Characteristics

- **No Amount Required:** `request_amount` and `capture_method` are ignored if passed.
- **No Charge Lifecycle:** Because no funds are moved, this request cannot be captured, canceled, or refunded.
- **New Terminal State:** Reaches a final status of `VERIFIED` upon success.

---

## Create a Payment Method Verification

### Endpoint

POST request - ` /v3/payment_requests`

### Required Fields for Verification

- `type`: Must be set to `VERIFY_PAYMENT_METHOD`.
- `channel_code`: Must be set to `CARDS` (currently supported channel).
- `channel_properties.card_details`: Full card PAN details are required.

### Request Sample

POST request - `/v3/payment_requests`

```
{
  "reference_id": "verify_card_cust_789",
  "type": "VERIFY_PAYMENT_METHOD",
  "country": "SG",
  "currency": "SGD",
  "customer_id": "cust-12515215",
  "channel_code": "CARDS",
  "channel_properties": {
    "card_details": {
      "card_number": "4000000000001091",
      "cvn": "123",
      "expiry_month": "09",
      "expiry_year": "2027",
      "cardholder_first_name": "Shopper",
      "cardholder_last_name": "The hopper",
      "cardholder_email": "shopper@example.com",
      "cardholder_phone_number": "+65123456789"
    },
    "card_on_file_type": "MERCHANT_UNSCHEDULED",
    "success_return_url": "[https://merchant.co/verify/success](https://merchant.co/verify/success)",
    "failure_return_url": "[https://merchant.co/verify/failure](https://merchant.co/verify/failure)",
    "skip_three_ds": true
  },
  "description": "Card verification — no charge"
}
```

### Response Sample

If the card requires 3D Secure (3DS) validation, the request returns a `REQUIRES_ACTION` status alongside a redirect URL. Otherwise, it returns `VERIFIED` immediately.

POST response - `/v3/payment_requests`

```
{
   "payment_request_id": "pr-aa974469-8be9-8527-831a-f363fd8bddcd",
   "status": "VERIFIED",
   "type": "VERIFY_PAYMENT_METHOD",
   "channel_code": "CARDS",
   "business_id": "69xxxxxx62cfa43",
   "country": "SG",
   "reference_id": "verify_card_cust_789",
   "currency": "SGD",
   "capture_method": "MANUAL",
   "request_amount": 0,
   "created": "2026-07-08T02:18:09.076Z",
   "updated": "2026-07-08T02:18:09.087Z",
   "channel_properties": {
       "card_details": {
           "masked_card_number": "400000XXXXXX1091",
           "expiry_month": "09",
           "expiry_year": "2027",
           "fingerprint": "6320100aea3d99001aad04b7",
           "type": "CREDIT",
           "network": "VISA",
           "country": "ID",
           "issuer": "BRI",
           "cardholder_first_name": "Budi",
           "cardholder_last_name": "Santoso",
           "cardholder_email": "budi@example.com",
           "cardholder_phone_number": "+628123456789"
       },
       "success_return_url": "[https://merchant.co/verify/success](https://merchant.co/verify/success)",
       "failure_return_url": "[https://merchant.co/verify/failure](https://merchant.co/verify/failure)",
       "skip_three_ds": true
   },
   "description": "Card verification — no charge",
   "latest_payment_id": "py-aa974469-8be9-8527-831a-f363fd8bddcd",
   "actions": []
}
```

---

## Status Lifecycle

Verification requests move through the following states:

| Status | Terminal State? | Description |
| --- | --- | --- |
| `PENDING` | No | Request created; awaiting upstream processor response. |
| `REQUIRES_ACTION` | No | 3DS challenge required; cardholder must complete authentication. |
| `VERIFIED` | Yes (Success) | Card authenticated and vaulted successfully. No further actions allowed. |
| `FAILED` | Yes (Failure) | Verification failed due to 3DS failure or issuer decline. |

---

## Webhook Notification

To receive real-time asynchronous updates when a verification is successful, you must configure a [webhook](/v1/docs/webhook-events) URL in your [Xendit Dashboard](https://dashboard.xendit.co/) to listen for the verification event.

When a payment request successfully completes authentication and vaults, Xendit triggers the `payment.verified` event.

### Event Name

`payment.verified`

### Event Name

`payment.verified`

### Webhook Payload Sample

```
{
  "event": "payment.verified",
  "business_id": "5f27a14axxxxx",
  "created": "2026-07-30T10:05:22Z",
  "data": {
    "id": "pr-abc123xyz",
    "reference_id": "verify_card_cust_789",
    "type": "VERIFY_PAYMENT_METHOD",
    "status": "VERIFIED",
    "country": "SG",
    "currency": "SGD",
    "customer_id": "cust-abc123",
    "channel_code": "CARDS",
    "metadata": {},
    "created": "2026-04-30T10:00:00Z",
    "updated": "2026-04-30T10:05:22Z"
  }
}
```
