๐Ÿฆ CBS Mock Stub

Mock Core Banking System for UPP integration testing. Type a "magic" account number into UPP to get a behaviour with zero setup.

Magic account-number prefixes

PrefixBehaviour
INV*Account not found (404)
FRZ*Debit freeze (DR) โ†’ payment rejected
CRF*Credit freeze (CR) โ†’ reject when used as beneficiary
LOW*Tiny balance (1) โ†’ insufficient funds โ†’ RJCT
ZERO*Zero balance โ†’ IGNR for split-% scheduled instructions (poller gets 0, skips autoPayments). For immediate instructions use fund-then-drain instead.
RJCT*Always RJCT
PARK*Always PARK (409)
FAIL2*, FAIL3*Fail N times (500) then succeed
anything elseHealthy ACTIVE account, large balance

Valid values

Freeze codes: DR, CR, FULL
Payment outcomes: ACSC, ACSP, REVW, PARK, RJCT

UPP-facing routes

GET /api/v1/accounts?accountNumber=Balance check
GET /diy-accounts-proxyAccount onboarding
POST /api/autoPaymentsPayment execution

Admin / tester routes

GET/POST/PATCH/DELETE /admin/accounts[/:id]Account CRUD
POST /admin/accounts/bulkCreate many accounts at once
POST /admin/accounts/:id/outcomeSet payment outcome / failCount
GET/DELETE /admin/transactionsAudit log of payments UPP sent
GET /admin/snapshot ยท POST /admin/snapshot/restoreSave / restore full account state
GET /admin/scenarios ยท POST /admin/scenarios/:name/loadLoad a named preset
GET /admin/validations ยท POST /admin/validations/:id/toggleList / toggle IL validation rules
GET /healthHealth check

IL Validation routes

POST /api/v1/validateValidate a payment โ€” body: { payments:[...], type:"quick"|"full", isImmediate:true }
POST /api/v1/validate/bulkValidate a batch โ€” same body shape, balance check enabled
POST /api/v1/lookupEnrich payment with CBS account details

Payment field reference (by payment mode)

FieldPath in payloadNEFTRTGSIMPSIFTSWIFT
Payment modePaymentDetails.paymentModeNEFTRTGSIMPSIFTSWIFT
Amountamtโœ…โœ…โœ…โœ…โœ…
CurrencycurrencyINRINRINRINRany
Sender accountfrom.idโœ…โœ…โœ…โœ…โœ…
Beneficiary accountPaymentDetails.toโœ…โœ…โœ…โœ…โœ…
Beneficiary namePaymentDetails.accountNameโœ…โœ…โœ…โœ…โœ…
IFSCPaymentDetails.ifscCoderequiredrequiredโœ…โŒโŒ
SWIFT BICPaymentDetails.swiftCodeโŒโŒโŒโŒrequired
Sender LEIPaymentDetails.leiUniqueIdโ‰ฅโ‚น50crโ‰ฅโ‚น50crโŒโŒโŒ
Receiver LEIPaymentDetails.beneficiaryLeiUniqueIdโ‰ฅโ‚น50crโ‰ฅโ‚น50crโŒโŒโŒ
Debit narrationdebitNarrationโœ…โœ…โœ…โœ…โœ…
Credit narrationcreditNarrationโœ…โœ…โœ…โœ…โœ…
Beneficiary countryPaymentDetails.beneficiaryCountryININININany
IBANPaymentDetails.ibanโŒโŒโŒโŒโœ…

How to request a new validation rule

Tell Claude (via MCP) using this template โ€” no code needed, Claude writes it for you:

RULE NAME:       UPPER_SNAKE_CASE name

DESCRIPTION:     What this rule checks and why (plain English)

APPLIES TO:
  Path:          Quick (A) | Full (B) | Both
  Payment mode:  All | NEFT | RTGS | IMPS | IFT | SWIFT

CONDITION TO FAIL:
  - Field to check: (see field reference above)
  - Fails when:
  - Exceptions: (e.g. "only when amount > X", "not for reversals")

ERROR MESSAGE:   Message shown when the rule fails

EXAMPLE PASS:    { amt: 100, PaymentDetails: { paymentMode: "NEFT", ifscCode: "HDFC0001234" } }
EXAMPLE FAIL:    { amt: 100, PaymentDetails: { paymentMode: "NEFT", ifscCode: "" } }

Claude calls add_validation โ†’ rule is live immediately, no redeploy needed.
Use list_validations to see all rules ยท toggle_validation to switch any on/off.