CashBook - Balance & Expense icon

CashBook staff UPI wallet and passbook data API

Obopay – Payment Wallet for Businesses · Payments

CashBook turns a shared cashbook into staff UPI wallets for Indian SMEs: owners keep the books while field staff receive float, pay vendors by Scan & Pay and request top-ups from their phones. It sits in India's small-business payments market, where phone OTP sign-in and prepaid staff wallets replace petty cash boxes and reimbursement chits.

As a data source, the app exposes both the money and the paperwork around it: wallet snapshots like walletBalance, closingBalance and perTransactionLimit, passbook rows carrying utr, rrn and payeeName plus the bookId each row was filed under, GSTIN verification results such as tradeName and mcc, and recharge requests keyed by rechargeRequestId and approvalStatus. Integrators build reconciliation against Tally or Zoho Books, owner-approval queues for disbursements and audit trails over staff UPI spend on top of it.

CashBook is an Indian SME cashbook from Obopay that pairs shared passbooks with staff UPI wallets for field teams. Used by small businesses across India, it records who spent what, from which book, and settles it over UPI. Behind the screens sits a rich dataset: staff wallet balances and spend limits, passbook entries carrying UPI references, GSTIN-verified business profiles, linked parties, and recharge approvals. That data serves accountants, operations teams and lenders building reconciliation, disbursement and spend-audit integrations for Indian SMEs.

Screenshots

  • CashBook - Balance & Expense screenshot 1
  • CashBook - Balance & Expense screenshot 2
  • CashBook - Balance & Expense screenshot 3
  • CashBook - Balance & Expense screenshot 4
  • CashBook - Balance & Expense screenshot 5
  • CashBook - Balance & Expense screenshot 6
  • CashBook - Balance & Expense screenshot 7

API surface

The endpoints and request/response examples below are reconstructed from the app's interface — illustrative, not a live capture.

  • Send staff-wallet OTP

    POST /v1/wallet/auth/otp/start openfinance

    Starts the staff-wallet login used before any balance, passbook or UPI call. The SMS OTP it sends is consumed by the OTP-verify call to open a session.

    Auth: Unauthenticated bootstrap. The phone number identifies the staff or owner wallet; signed-in calls later attach an Authorization Bearer identity token.

    • phoneNumber
    • deviceId
    • sessionId
    • status
    • phoneAuthRequestId
    POST /v1/wallet/auth/otp/start HTTP/1.1
    Content-Type: application/json
    
    {
      "phoneNumber": "9876543210",
      "deviceId": "a1b2c3d4e5f6"
    }
    {
      "status": "SENT",
      "sessionId": "otp-sess-9f2a",
      "phoneNumber": "9876543210",
      "phoneAuthRequestId": "par-44120"
    }
    • reconstructed from the app's phone-first wallet sign-in flow
    • matches the SMS auto-read capability requested during onboarding
  • Verify OTP and open wallet session

    POST /v1/wallet/auth/otp/verify openfinance

    Consumes the SMS OTP and returns the session tokens, KYC flags and digitalAccount id that gate staff-wallet balances and UPI pay/collect.

    Auth: Unauthenticated. The body carries phoneNumber plus the SMS otp; the returned accessToken and refreshToken are sent as Authorization Bearer on later wallet calls.

    • accessToken
    • refreshToken
    • idToken
    • kycStatus
    • minKyc
    • fullKyc
    • walletStatus
    • digitalAccount
    • role
    POST /v1/wallet/auth/otp/verify HTTP/1.1
    Content-Type: application/json
    
    {
      "phoneNumber": "9876543210",
      "otp": "482913",
      "deviceId": "a1b2c3d4e5f6"
    }
    {
      "accessToken": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.example",
      "refreshToken": "rt_7c11ab",
      "idToken": "id-token-example",
      "kycStatus": "MIN_KYC",
      "minKyc": true,
      "fullKyc": false,
      "walletStatus": "ACTIVE",
      "digitalAccount": "CBW-998877",
      "role": "STAFF"
    }
    • reconstructed from the OTP verification and session bootstrap
    • KYC flags mirror the business-KYC step in onboarding
  • Read staff UPI wallet balance

    GET /v1/wallets/staff/balance openbanking

    Returns the signed-in staff (or owner) prepaid wallet snapshot rendered on the wallet home: live balance, closing balance and per-day / per-transaction spend limits.

    Auth: Authorization Bearer accessToken from the OTP-verify call.

    • digitalAccount
    • walletBalance
    • accountBalance
    • closingBalance
    • currency
    • walletStatus
    • dailyLimit
    • perTransactionLimit
    • limitAmount
    • staffWallet
    GET /v1/wallets/staff/balance HTTP/1.1
    Authorization: Bearer <accessToken>
    {
      "digitalAccount": "CBW-998877",
      "walletBalance": "12500.00",
      "accountBalance": "12500.00",
      "closingBalance": "11840.50",
      "currency": "INR",
      "walletStatus": "ACTIVE",
      "dailyLimit": "50000.00",
      "perTransactionLimit": "10000.00",
      "limitAmount": "50000.00",
      "staffWallet": true
    }
    • reconstructed from the wallet home balance card
    • limit fields match the spend caps introduced during wallet onboarding
  • Read business wallet balance

    GET /v1/business/account/balance openbanking

    Reads the company-level digital account that funds staff wallets and bulk disbursements, including the merchant category code used for spend controls.

    Auth: Authorization Bearer accessToken from the OTP-verify call; scoped to the active businessId.

    • businessId
    • businessName
    • walletBalance
    • accountBalance
    • currency
    • walletStatus
    • mcc
    GET /v1/business/account/balance?businessId=biz-10482 HTTP/1.1
    Authorization: Bearer <accessToken>
    {
      "businessId": "biz-10482",
      "businessName": "Noida Packers",
      "walletBalance": "842300.00",
      "accountBalance": "842300.00",
      "currency": "INR",
      "walletStatus": "ACTIVE",
      "mcc": "4214",
      "checkPaymentsEnabled": true
    }
    • reconstructed from the business switcher and company wallet screens
  • List staff-wallet passbook transactions

    GET /v1/wallet/ledger/entries openbanking

    Pages the staff-wallet passbook that backs the cash-in / cash-out register, including UPI UTR/RRN, payee VPA, category and the book each row was copied into.

    Auth: Authorization Bearer accessToken from the OTP-verify call.

    • txnId
    • transactionId
    • txnAmount
    • amount
    • currency
    • txnStatus
    • entryType
    • paymentMode
    • payeeName
    • upiId
    • utr
    • rrn
    • remarks
    • categoryId
    • bookId
    • bookName
    • cashIn
    • cashOut
    GET /v1/wallet/ledger/entries?page=1&pageSize=20 HTTP/1.1
    Authorization: Bearer <accessToken>
    {
      "items": [
        {
          "txnId": "TXN-1789965001",
          "transactionId": "OBP-889900",
          "txnAmount": "499.00",
          "amount": "499.00",
          "currency": "INR",
          "txnStatus": "SUCCESS",
          "entryType": "CASH_OUT",
          "paymentMode": "UPI",
          "payeeName": "Metro Cash & Carry",
          "upiId": "metro@okicici",
          "utr": "609912345678",
          "rrn": "609912345678",
          "remarks": "Packaging material",
          "categoryId": "cat-ops",
          "bookId": "book-22",
          "bookName": "Petty cash — North"
        }
      ],
      "summary": {
        "cashIn": "15000.00",
        "cashOut": "499.00"
      }
    }
    • reconstructed from the passbook list and its cash-in/cash-out totals
    • copy-to-book behavior matches the entry actions offered in the app
  • Fetch a single wallet transaction

    GET /v1/wallet/ledger/entry openbanking

    Returns the full receipt for one passbook row — UPI identifiers, approval state, linked party and any virtual-account payout details shown on the entry screen.

    Auth: Authorization Bearer accessToken from the OTP-verify call.

    • txnId
    • transactionId
    • txnAmount
    • txnStatus
    • paymentMode
    • payeeName
    • upiId
    • utr
    • rrn
    • remarks
    • approvalStatus
    • categoryId
    • partyId
    • partyName
    • virtualAccountDetails
    • accountNumber
    • ifsc
    • bankName
    GET /v1/wallet/ledger/entry?txnId=TXN-1789965001 HTTP/1.1
    Authorization: Bearer <accessToken>
    {
      "txnId": "TXN-1789965001",
      "transactionId": "OBP-889900",
      "txnAmount": "499.00",
      "txnStatus": "SUCCESS",
      "paymentMode": "UPI",
      "payeeName": "Metro Cash & Carry",
      "upiId": "metro@okicici",
      "utr": "609912345678",
      "rrn": "609912345678",
      "remarks": "Packaging material",
      "approvalStatus": "AUTO_APPROVED",
      "categoryId": "cat-ops",
      "partyId": "pty-441",
      "partyName": "Metro Cash & Carry",
      "virtualAccountDetails": {
        "accountNumber": "502000112233",
        "ifsc": "HDFC0000123",
        "bankName": "HDFC Bank"
      }
    }
    • reconstructed from the entry detail and attachment viewer screens
  • Read UPI PPI account balance

    POST /v1/ppi/accounts/balance openbanking

    Reads the issuer-side prepaid (PPI) ledger that the app shows as the staff UPI wallet, distinct from the cashbook paper balance, including KYC and account-status flags.

    Auth: Bearer from the PPI token call after device binding; used alongside the wallet session for the prepaid account.

    • accountBalance
    • walletBalance
    • currency
    • walletStatus
    • custbalanceStatus
    • kycStatus
    • digitalAccount
    POST /v1/ppi/accounts/balance HTTP/1.1
    Authorization: Bearer <ppi-token>
    Content-Type: application/json
    
    {
      "digitalAccount": "CBW-998877",
      "deviceId": "a1b2c3d4e5f6"
    }
    {
      "accountBalance": "12500.00",
      "walletBalance": "12500.00",
      "currency": "INR",
      "walletStatus": "ACTIVE",
      "custbalanceStatus": "ACTIVE",
      "kycStatus": "MIN_KYC"
    }
    • reconstructed from the UPI wallet balance refresh flow
    • status flags line up with the KYC banners on the wallet screen
  • UPI transaction history

    POST /v1/ppi/upi/transactions openbanking

    Returns issuer-side UPI history for the bound device (pay and collect), including UTR/RRN used to match rows back into the passbook.

    Auth: Bearer from the PPI token call after device binding.

    • txnId
    • txnAmount
    • txnStatus
    • upiId
    • payeeName
    • utr
    • rrn
    • remarks
    • collectRequest
    POST /v1/ppi/upi/transactions HTTP/1.1
    Authorization: Bearer <ppi-token>
    Content-Type: application/json
    
    {
      "digitalAccount": "CBW-998877",
      "pageNo": 1,
      "pageSize": 20
    }
    {
      "txns": [
        {
          "txnId": "UPI-609912345678",
          "txnAmount": "499.00",
          "txnStatus": "SUCCESS",
          "upiId": "metro@okicici",
          "payeeName": "Metro Cash & Carry",
          "utr": "609912345678",
          "rrn": "609912345678",
          "remarks": "Packaging material",
          "collectRequest": false
        }
      ]
    }
    • reconstructed from the UPI history screen
    • UTR/RRN fields match the references shown on passbook rows
  • Read bound UPI profile

    POST /v1/ppi/upi/profile openfinance

    Returns the VPA, KYC level and UPI spend limits for the device-bound staff wallet after PIN setup on the issuer's UPI bridge page.

    Auth: Bearer from the PPI token call after device-token generation and binding verification.

    • vpa
    • upiId
    • kycStatus
    • minKyc
    • fullKyc
    • walletStatus
    • digitalAccount
    • perTransactionLimit
    • dailyLimit
    • deviceId
    • deviceToken
    POST /v1/ppi/upi/profile HTTP/1.1
    Authorization: Bearer <ppi-token>
    Content-Type: application/json
    
    {
      "deviceId": "a1b2c3d4e5f6",
      "deviceToken": "dev-tok-88"
    }
    {
      "vpa": "staff.neha@wallet",
      "upiId": "staff.neha@wallet",
      "kycStatus": "MIN_KYC",
      "minKyc": true,
      "fullKyc": false,
      "walletStatus": "ACTIVE",
      "digitalAccount": "CBW-998877",
      "perTransactionLimit": "10000.00",
      "dailyLimit": "50000.00"
    }
    • reconstructed from the device-binding and UPI PIN setup flow
  • Verify business GSTIN

    POST /v1/business/kyc/gstin/verify opendata

    Looks up a GSTIN during corporate registration so the app can attach a legal name, trade name and merchant category before wallet activation and staff disbursements.

    Auth: Authorization Bearer accessToken from the OTP-verify call.

    • gstin
    • businessName
    • tradeName
    • mcc
    • kycStatus
    POST /v1/business/kyc/gstin/verify HTTP/1.1
    Authorization: Bearer <accessToken>
    Content-Type: application/json
    
    {
      "gstin": "07AABCU9603R1ZX",
      "businessId": "biz-10482"
    }
    {
      "gstin": "07AABCU9603R1ZX",
      "businessName": "Noida Packers Private Limited",
      "tradeName": "Noida Packers",
      "mcc": "4214",
      "kycStatus": "MIN_KYC"
    }
    • reconstructed from the corporate registration GSTIN step
    • companions the business KYC document upload flow
  • List business parties

    GET /v1/business/parties opendata

    Returns vendors and staff already linked to the business — VPA, bank and GSTIN — so Scan & Pay and recharge requests can pick a counterparty without re-typing.

    Auth: Authorization Bearer accessToken from the OTP-verify call.

    • partyId
    • partyName
    • upiId
    • phoneNumber
    • gstin
    • ifsc
    • accountNumber
    • bankName
    • beneficiaryName
    GET /v1/business/parties?businessId=biz-10482 HTTP/1.1
    Authorization: Bearer <accessToken>
    {
      "parties": [
        {
          "partyId": "pty-441",
          "partyName": "Metro Cash & Carry",
          "upiId": "metro@okicici",
          "phoneNumber": "9810012345",
          "gstin": "07AABCU9603R1ZX",
          "ifsc": "HDFC0000123",
          "accountNumber": "502000112233",
          "bankName": "HDFC Bank",
          "beneficiaryName": "Metro Cash And Carry India"
        }
      ]
    }
    • reconstructed from the party picker behind Scan & Pay
    • bank detail fields match the beneficiary form
  • List staff recharge requests

    GET /v1/wallet/topups openfinance

    Lists pending and historical staff wallet top-ups that owners approve or reject; the same flow drives disbursement into the prepaid wallet.

    Auth: Authorization Bearer accessToken from the OTP-verify call. Owner/admin role required to approve.

    • rechargeRequestId
    • memberId
    • digitalAccount
    • amount
    • currency
    • approvalStatus
    • remarks
    • bookId
    • bookName
    GET /v1/wallet/topups?businessId=biz-10482&status=PENDING HTTP/1.1
    Authorization: Bearer <accessToken>
    {
      "requests": [
        {
          "rechargeRequestId": "RR-77881",
          "memberId": "usr-neha",
          "digitalAccount": "CBW-998877",
          "amount": "5000.00",
          "currency": "INR",
          "approvalStatus": "PENDING",
          "remarks": "Site visit — Gurugram",
          "bookId": "book-22",
          "bookName": "Petty cash — North"
        }
      ]
    }
    • reconstructed from the owner approval queue for staff top-ups
  • Process a UPI collect request

    POST /v1/ppi/upi/collect openfinance

    Accepts or pays a UPI collect against the staff wallet — the Scan & Pay / request-money path that posts into the passbook once the UTR confirms.

    Auth: Bearer from the PPI token call; the UPI PIN is entered on the issuer's bridge page.

    • upiId
    • txnAmount
    • remarks
    • deviceId
    • txnId
    • txnStatus
    • utr
    • rrn
    • collectRequest
    • payeeName
    POST /v1/ppi/upi/collect HTTP/1.1
    Authorization: Bearer <ppi-token>
    Content-Type: application/json
    
    {
      "upiId": "vendor@okhdfcbank",
      "txnAmount": "2500.00",
      "remarks": "Invoice 8821",
      "deviceId": "a1b2c3d4e5f6",
      "collectRequest": true
    }
    {
      "txnId": "UPI-609998877665",
      "txnStatus": "SUCCESS",
      "txnAmount": "2500.00",
      "utr": "609998877665",
      "rrn": "609998877665",
      "collectRequest": true,
      "payeeName": "Noida Packers"
    }
    • reconstructed from the request-money and Scan & Pay flows
    • matches the QR scanning widget bundled with the app
  • Issue UPI PPI API token

    POST /v1/ppi/auth/token openfinance

    Mints the prepaid-account token used by the UPI profile, history, balance and pay/collect calls after the staff wallet OTP session exists.

    Auth: Called after OTP wallet login. The body carries deviceId; the returned Bearer is required for the UPI and account-management calls.

    • accessToken
    • tokenType
    • digitalAccount
    • deviceId
    POST /v1/ppi/auth/token HTTP/1.1
    Content-Type: application/json
    Authorization: Bearer <accessToken>
    
    {
      "deviceId": "a1b2c3d4e5f6",
      "digitalAccount": "CBW-998877"
    }
    {
      "accessToken": "ppi-tok-88",
      "tokenType": "Bearer",
      "digitalAccount": "CBW-998877",
      "deviceId": "a1b2c3d4e5f6"
    }
    • reconstructed from the token exchange that follows wallet login
  • Read staff-wallet spend limits

    GET /v1/wallet/limits openbanking

    Returns the per-day and per-transaction prepaid caps shown on the staff-wallet limits screen, separate from the live balance snapshot.

    Auth: Authorization Bearer accessToken from the OTP-verify call.

    • digitalAccount
    • dailyLimit
    • perTransactionLimit
    • limitAmount
    • currency
    • walletStatus
    GET /v1/wallet/limits HTTP/1.1
    Authorization: Bearer <accessToken>
    {
      "digitalAccount": "CBW-998877",
      "dailyLimit": "50000.00",
      "perTransactionLimit": "10000.00",
      "limitAmount": "50000.00",
      "currency": "INR",
      "walletStatus": "ACTIVE"
    }
    • reconstructed from the wallet limits screen
  • Initiate staff-wallet UPI pay

    POST /v1/ppi/upi/pay openfinance

    Debits the staff prepaid wallet toward a VPA (Scan & Pay or a typed UPI ID), returning UTR/RRN that later land in the passbook.

    Auth: Bearer from the PPI token call after device binding; the UPI PIN is entered on the issuer's bridge page.

    • upiId
    • txnAmount
    • remarks
    • deviceId
    • digitalAccount
    • txnId
    • txnStatus
    • payeeName
    • utr
    • rrn
    POST /v1/ppi/upi/pay HTTP/1.1
    Authorization: Bearer <ppi-token>
    Content-Type: application/json
    
    {
      "upiId": "metro@okicici",
      "txnAmount": "499.00",
      "remarks": "Packaging material",
      "deviceId": "a1b2c3d4e5f6",
      "digitalAccount": "CBW-998877"
    }
    {
      "txnId": "UPI-609912345678",
      "txnStatus": "SUCCESS",
      "txnAmount": "499.00",
      "upiId": "metro@okicici",
      "payeeName": "Metro Cash & Carry",
      "utr": "609912345678",
      "rrn": "609912345678"
    }
    • reconstructed from the Scan & Pay confirmation flow
    • VPA validation mirrors the payee entry screen
  • Disburse funds into a staff wallet

    POST /v1/wallet/topups/disburse openfinance

    Moves company-wallet float into a staff prepaid wallet after a recharge request is approved — the owner-side counterpart of the top-up request list.

    Auth: Authorization Bearer accessToken from the OTP-verify call. Owner/admin role required.

    • businessId
    • memberId
    • digitalAccount
    • amount
    • currency
    • rechargeRequestId
    • remarks
    • txnStatus
    • approvalStatus
    POST /v1/wallet/topups/disburse HTTP/1.1
    Authorization: Bearer <accessToken>
    Content-Type: application/json
    
    {
      "businessId": "biz-10482",
      "memberId": "usr-neha",
      "digitalAccount": "CBW-998877",
      "amount": "5000.00",
      "currency": "INR",
      "rechargeRequestId": "RR-77881",
      "remarks": "Site visit — Gurugram"
    }
    {
      "rechargeRequestId": "RR-77881",
      "txnStatus": "SUCCESS",
      "amount": "5000.00",
      "currency": "INR",
      "digitalAccount": "CBW-998877",
      "approvalStatus": "APPROVED",
      "memberId": "usr-neha"
    }
    • reconstructed from the owner disbursement flow behind approved top-ups

Data categories

  • balances
  • transactions
  • upi
  • kyc
  • parties
  • wallets
  • recharge-requests

Where teams use this data

  • Reconcile staff UPI spend into the cashbook

    Nightly jobs read the staff wallet balance and page through passbook entries, then match utr, rrn and txnId onto Tally or Zoho Books lines so petty-cash books close without screenshot WhatsApps.

  • Onboard a GSTIN-verified business wallet

    Corporate KYC submits the business gstin for verification, then watches minKyc, fullKyc and the company wallet balance so finance issues staff wallets only after GSTIN and MCC are on file.

  • Approve field-staff recharge requests

    Ops dashboards list top-up requests still PENDING approval (rechargeRequestId, memberId, amount) and push the same ids into disbursement so site engineers receive UPI float without handling cash.

  • Mirror NPCI UPI history for audit

    Compliance pulls the device-bound UPI history and the wallet profile (vpa, dailyLimit, kycStatus) from the prepaid-account endpoints to evidence staff spend against the passbook.

Frequently asked questions

Which CashBook endpoints return wallet balances?

GET /v1/wallets/staff/balance returns the staff prepaid wallet (walletBalance, closingBalance, dailyLimit, perTransactionLimit). GET /v1/business/account/balance is the company digital account that funds those wallets. POST /v1/ppi/accounts/balance reads the issuer-side ledger for the same prepaid account, including kycStatus and custbalanceStatus.

How does CashBook authenticate payment calls?

The client first posts phoneNumber to POST /v1/wallet/auth/otp/start and confirms the SMS code at POST /v1/wallet/auth/otp/verify. The returned accessToken is sent as Authorization Bearer on wallet and business calls. UPI pay and collect additionally use a device-bound prepaid token from POST /v1/ppi/auth/token.

Can I get UPI transaction history, not just cashbook entries?

Yes. POST /v1/ppi/upi/transactions returns issuer-side rows (txnId, utr, rrn, upiId, collectRequest) for the bound device. GET /v1/wallet/ledger/entries is the passbook view of the same spend, adding bookName, categoryId and cash-in/cash-out totals.

Where does GSTIN verification happen?

During corporate registration the app posts gstin to POST /v1/business/kyc/gstin/verify and stores businessName, tradeName, mcc and kycStatus before wallet activation, so staff disbursements only start once the business identity is on file.

Apps similar to CashBook - Balance & Expense

  • Khatabook — Khatabook is an Indian digital-bookkeeping app that lets small businesses record customer credit (udhaar), billing and collections on a phone instead of a paper register.
  • OkCredit — OkCredit is a free digital ledger app for Indian businesses that replaces paper credit registers with phone-based udhaar tracking and payment reminders.
  • Vyapar Invoice GST Billing App — Vyapar is an Indian SME app for GST invoicing, accounting and inventory, named alongside OkCredit as a Khatabook rival in digital bookkeeping.
  • BharatPe for Business — BharatPe for Business is a merchant payments app that gives Indian shops a UPI QR code for accepting customer payments and tracking collections.
  • Paytm — Paytm is a major Indian UPI payments app that competes with PhonePe, Google Pay and BharatPe across consumer and merchant payments.
  • TallyPrime — TallyPrime is the long-established accounting software Indian small businesses use to maintain cash books, ledgers and GST records.

Topics

  • CashBook API
  • staff UPI wallet
  • Obopay PPI
  • passbook transactions
  • GSTIN verification
  • recharge requests
  • Indian SME cashbook

Need this app's data API integrated?

We deliver scoped integrations for any named app — from USD 500 with source-code handoff, or hosted access billed per call. Tell us the data you need.

  • NDA + SOW on every engagement
  • Delivery in 3–7 days
  • Payment only after acceptance
  • Work scoped to authorized use

Get a quote