---
title: "Validate a bank account or VPA"
method: POST
path: "/fund_accounts/validations"
tags: ["X Account Validation"]
---

# Validate a bank account or VPA

`POST /fund_accounts/validations`

Three validation methods: (1) penny drop for bank accounts — sends Re.1 to verify; (2) penny drop for VPA — sends Re.1 to UPI address; (3) reverse penny drop — sends UPI intent URL to customer who initiates payment. Live-mode only, RazorpayX Lite account required. Composite validation (creates Contact + Fund Account inline) supported via validation_type field.

## Request body

- object
  - `account_type` 'bank_account' | 'vpa', required
  - `fund_account` object, required — For composite validation, include contact object instead of contact_id
  - `amount` integer — Penny drop amount in paise (typically 100)
  - `currency` string
  - `notes` object
  - `receipt` string
  - `validation_type` 'pennydrop' | 'penniless' | 'optimized' — penniless = reverse penny drop (UPI intent); optimized = system chooses best method

## Response `200`

Validation created

- FundAccountValidation — Bank/VPA account validation result. Live-mode only, RazorpayX Lite only.
  - `id` string — Validation ID (fav_*)
  - `entity` 'fund_account.validation'
  - `status` 'created' | 'completed' | 'failed'
  - `amount` integer — Penny drop amount in paise
  - `currency` string
  - `utr` string
  - `reference_id` string
  - `notes` object
  - `validated_account_type` string
  - `fund_account` object
    - `id` string
    - `account_type` string
    - `bank_account` object
    - `vpa` object
  - `validation_results` object
    - `account_status` string
    - `registered_name` string
    - `name_match_score` integer
    - `details` object
  - `status_details` object
  - `upi_intent` object — Present only for reverse penny drop (UPI intent flow)
    - `intent_url` string
    - `phonepe_url` string
    - `gpay_url` string
    - `paytm_url` string
    - `bhim_url` string
    - `encoded_qr_code` string
  - `created_at` integer

## Other responses

- `400` — Bad request. Invalid parameters or missing required fields.
- `401` — Authentication failed. Invalid or missing API key credentials.
- `429` — Rate limit exceeded. Implement exponential backoff with jitter before retrying.
- `500` — Internal server error.

---

[API](https://skmtc.net/razorpay/apis/razorpay-api.md) · [All operations](https://skmtc.net/razorpay/apis/razorpay-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/razorpay/razorpay-api/versions/824ca9e6faef/schema)
