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

# Bank accounts

> Confirm an account exists and read the name the bank holds against it.

Two methods answer the same question and return the same envelope. Both take the account in the
request body, and both report on the account rather than on a name.

|                    | Penny drop                               | Penny-less                 |
| ------------------ | ---------------------------------------- | -------------------------- |
| Path               | `POST /bank/v1/penny-drop`               | `POST /bank/v1/penny-less` |
| Moves money        | Credits one rupee to the account         | No                         |
| Customer statement | Shows the credit                         | Shows nothing              |
| Also returns       | `utr` for the credit, `amount_deposited` |                            |

Penny drop reaches accounts the network cannot answer for on its own, at the cost of a real transfer
the customer can see. Penny-less is the lighter check. A common pattern is penny-less first, falling
back to penny drop when it cannot answer.

```bash theme={null}
curl -X POST https://api.privue.ai/bank/v1/penny-less \
  -H "Authorization: Bearer $PRIVUE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "ifsc": "SBIN0061411",
    "account_number": "42090969996",
    "name": "John Doe"
  }'
```

```json theme={null}
{
  "code": 200,
  "timestamp": 1751975600361,
  "transaction_id": "3fd57890-2b90-4b41-ab10-1ffeaef85fb3",
  "data": {
    "message": null,
    "account_exists": true,
    "name_at_bank": "JOHN DOE"
  }
}
```

## Matching the name

`name_at_bank` is the name the bank holds, spelled as the bank spells it. Comparing it against an
expected name, at a threshold you choose, is your responsibility. Banks abbreviate, reorder and drop
middle names, so an exact string comparison rejects holders who are the right person.

`name` and `mobile` are optional and are passed to the source as sent. Neither changes the result,
and `name_at_bank` is returned either way.

The account number travels in the request body rather than the URL, keeping it out of access logs,
proxies and browser history.

## Reading the result

Read `message` first. When the account could not be checked at all, the call still returns `200` and
`message` is the only populated field:

```json theme={null}
{ "data": { "message": "Beneficiary bank offline" } }
```

Treat a missing `account_exists` as "not answered" rather than as "no". An offline bank, an
unavailable NPCI, a declining source bank and an NRE account all land here, and the same request may
succeed later or by the other method.

<Warning>
  Retrying a penny drop credits another rupee and is charged again. Retry it only when you received
  no response at all.
</Warning>

Invalid input, such as a malformed IFSC or an account number the network rejects outright, returns
`422`.
