> ## 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.

# Penny drop

> Verify an account by crediting one rupee to it, and report the name the bank holds it in.



## OpenAPI

````yaml /suite/api-reference/openapi.json post /bank/v1/penny-drop.1
openapi: 3.1.0
info:
  title: Privue API Suite
  version: 1.0.0
  description: >-
    Business, tax, registry, employment and identity verification against
    official Indian sources, a person's own documents read through DigiLocker
    with their consent, and an EPF member's passbook read with the OTP they
    receive.


    **Authentication.** Every request takes your API key as a bearer token:
    `Authorization: Bearer <your-key>`.


    **One envelope.** Every check returns the reasons behind a refusal and the
    record the source held, and an empty `reasons` means the check passed.
    Branch on `reasons` rather than on the status code, because a call the
    source answered returns `200` whatever it concluded.


    **DigiLocker and EPFO passbook.** A DigiLocker endpoint returns `details`
    alone: what it read, as the source holds it. So do submitting an EPFO
    passbook OTP and reading the passbook; sending the OTP answers like a check.


    **Versioning.** Each endpoint is versioned on its own, directly in its path.
    A new version of one endpoint never moves another, so no release requires
    migrating every integration at once.
servers:
  - url: https://api.privue.ai
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Checks
    description: One check on one subject, answered in the envelope every check shares.
  - name: DigiLocker
    description: >-
      A person's own documents, read through the consent they give at
      DigiLocker.
  - name: EPFO passbook
    description: >-
      A member's EPF passbook, read with the OTP sent to the mobile number on
      their account.
  - name: Orchestrated flows
    description: Every check on one business, asked and answered together in a single call.
  - name: Usage
    description: What you have called, and when.
paths:
  /bank/v1/penny-drop.1:
    post:
      tags:
        - Checks
      summary: Penny drop
      description: >-
        Verify an account by crediting one rupee to it, and report the name the
        bank holds it in.
      operationId: bank.penny-drop.1
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BankVerifyRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BankVerifyResponse'
              examples:
                verified:
                  summary: An account the bank confirmed
                  value:
                    reasons: []
                    details:
                      account_number: '50100123456789'
                      ifsc: HDFC0000123
                      outcome: account-valid
                      registered_name: EXAMPLE TECHNOLOGIES PRIVATE LIMITED
                      bank_name: HDFC Bank
                      branch: ANDHERI EAST
                unverified:
                  summary: An account the bank did not confirm
                  value:
                    reasons:
                      - code: bank-account-unverified
                        message: The bank did not confirm this account.
                    details:
                      account_number: '50100123456789'
                      ifsc: HDFC0000123
                      outcome: account-failed
                      registered_name: null
                      bank_name: HDFC Bank
                      branch: ANDHERI EAST
                unsettled:
                  summary: An account the banking network could not settle
                  value:
                    reasons:
                      - code: bank-account-unsettled
                        message: The banking network could not settle this account.
                    details:
                      account_number: '50100123456789'
                      ifsc: HDFC0000123
                      outcome: could-not-verify
                      registered_name: null
                      bank_name: HDFC Bank
                      branch: ANDHERI EAST
        '401':
          description: The API key is missing, malformed or not valid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuiteError'
        '403':
          description: The key is valid but is not entitled to this feature.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuiteError'
        '422':
          description: >-
            The request failed validation, or the source would not accept the
            details in it.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuiteError'
        '429':
          description: >-
            The key is not cleared for this feature, or is sending too many
            requests. Nothing was called.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuiteError'
        '503':
          description: >-
            The source could not be reached, or authentication is temporarily
            unavailable.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuiteError'
        default:
          description: The request failed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuiteError'
components:
  schemas:
    BankVerifyRequest:
      properties:
        account_number:
          type: string
          pattern: ^\d{5,20}$
          title: Account Number
          description: Bank account number to verify
        ifsc:
          type: string
          pattern: ^[A-Z]{4}0[A-Z0-9]{6}$
          title: Ifsc
          description: IFSC of the account's branch
      type: object
      required:
        - account_number
        - ifsc
      title: BankVerifyRequest
      description: The account to verify.
    BankVerifyResponse:
      properties:
        reasons:
          items:
            $ref: '#/components/schemas/Reason'
          type: array
          title: Reasons
          description: >-
            Why the check did not pass, worst first, each a stable code with the
            text for it. Empty when it passed
        details:
          $ref: '#/components/schemas/BankAccountDetails'
          description: The account as the bank reported it
      type: object
      required:
        - details
      title: BankVerifyResponse
      description: >-
        What the banking network answered for an account, and the name the bank
        holds it in.
    SuiteError:
      properties:
        code:
          type: integer
          title: Code
          description: HTTP status code of the response
        timestamp:
          type: integer
          title: Timestamp
          description: Unix millisecond timestamp of when the response was produced
        message:
          type: string
          title: Message
          description: What went wrong, in one sentence
      type: object
      required:
        - code
        - timestamp
        - message
      title: SuiteError
      description: Why a request failed.
    Reason:
      properties:
        code:
          $ref: '#/components/schemas/ReasonCode'
          description: Stable code to branch on
        message:
          type: string
          title: Message
          description: What the code means, in one sentence
      type: object
      required:
        - code
        - message
      title: Reason
      description: One machine-readable reason a check did not pass.
    BankAccountDetails:
      properties:
        account_number:
          type: string
          title: Account Number
          description: The account that was checked
        ifsc:
          type: string
          title: Ifsc
          description: IFSC of the account's branch
        outcome:
          type: string
          title: Outcome
          description: What the banking network answered for the account
        registered_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Registered Name
          description: The name the bank holds the account in, where it returned one
        bank_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Bank Name
          description: The bank behind the IFSC, where it was resolved
        branch:
          anyOf:
            - type: string
            - type: 'null'
          title: Branch
          description: The branch behind the IFSC, where it was resolved
      type: object
      required:
        - account_number
        - ifsc
        - outcome
      title: BankAccountDetails
      description: >-
        The account as the bank stated it.


        No name comparison is carried. The source is given no name to match
        against, so the registered name is reported as the bank spells it and
        the comparison is the caller's to make against whatever name they
        expected.
    ReasonCode:
      type: string
      enum:
        - cin-not-registered
        - gstin-not-registered
        - gstin-inactive
        - pan-inactive
        - pan-name-mismatch
        - pan-date-of-birth-mismatch
        - udyam-not-registered
        - udyam-not-registered-for-pan
        - udyam-cancelled
        - gst-not-registered-for-pan
        - company-not-registered-for-pan
        - epfo-member-not-found
        - uan-not-registered-for-pan
        - driving-licence-not-registered
        - driving-licence-details-mismatch
        - driving-licence-expired
        - uan-not-registered-for-mobile
        - passport-not-registered
        - passport-name-mismatch
        - source-unavailable
        - details-refused
        - bank-account-unverified
        - bank-account-unsettled
      title: ReasonCode
      description: >-
        Why a check did not pass, as the stable code a client branches on.


        Declared rather than written as strings so that every code a check can
        answer with reaches the published schema, and a client reads the whole
        set from the API reference.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: 'Your API key, sent as `Authorization: Bearer <your-key>`.'

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.