Bank Account Verification (Penny-less)
Banking & CreditConfirm an account and holder name without moving any money.
Verify that an account number and IFSC belong to an active account and return the holder name for matching, using the banking network's name-lookup rails instead of a one-rupee transfer.
Endpoint
POST
https://app.emver.io/api/sandbox/v1/bank-account-pennyless
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
Accept: application/json
Request parameters
| Field | Type | Description |
|---|---|---|
account_number
required
|
string | Account number |
ifsc
required
|
string | IFSC |
name
optional
|
string | Name to match |
Example request
cURL
curl -X POST https://app.emver.io/api/sandbox/v1/bank-account-pennyless \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"account_number": "string",
"ifsc": "string",
"name": "string"
}'
import requests
response = requests.post(
"https://app.emver.io/api/sandbox/v1/bank-account-pennyless",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Accept": "application/json",
},
json={
"account_number": "string",
"ifsc": "string",
"name": "string"
},
timeout=60,
)
response.raise_for_status()
data = response.json()
const response = await fetch("https://app.emver.io/api/sandbox/v1/bank-account-pennyless", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Accept": "application/json",
},
body: JSON.stringify({
"account_number": "string",
"ifsc": "string",
"name": "string"
}),
});
const data = await response.json();
$response = Http::withToken('YOUR_API_KEY')
->acceptJson()
->post('https://app.emver.io/api/sandbox/v1/bank-account-pennyless', {
"account_number": "string",
"ifsc": "string",
"name": "string"
});
$data = $response->json();
Replace YOUR_API_KEY and the placeholder values. Use the switch above to see production URLs.
Response
Structure · 200
{
"status": INTEGER,
"message": STRING,
"data": {
"account_exists": BOOLEAN,
"account_holder": STRING,
"name_match_score": NUMBER,
"method": STRING
}
}
Example · 200
{
"status": 200,
"message": "string",
"data": {
"account_exists": true,
"account_holder": "string",
"name_match_score": 0,
"method": "string"
}
}
Error · 4xx / 5xx
{
"status": INTEGER,
"message": STRING
}
See Errors & status codes for what each status means and which calls are billed.
About this API
Faster and cheaper than penny drop, with no credit hitting the customer's account. Falls back to penny drop automatically when a bank does not support name lookup, so your integration stays a single call.
Typical uses
- Payout onboarding. Verify beneficiary accounts for gig, vendor and refund payouts.
- Loan disbursal. Confirm the borrower owns the disbursal account.
Questions
- When does it fall back to penny drop?
- Whenever the bank does not answer a name lookup. The method field tells you which route produced the answer.