Virtual Banking API
A money transfer that fails halfway is worse than one that never starts. This project is about the halfway case.

The interface above is a presentation mockup of the product, not a screenshot captured from a running system. The interface compositions further down this page are built from the platform’s real module structure — these are private client and commercial platforms.
- Role
- Full-stack engineer
- Year
- 2025
- Status
- Independent build
- Category
- Backend
A fintech-style digital wallet — a client interface for accounts, cards and transfers, over an ASP.NET Core system with OTP authentication, multi-step KYC verification, a full transaction lifecycle with fund reservation and idempotency, fraud triggers, batch payroll and audit logging — built on a Clean Architecture codebase.
The problem
Financial software is judged entirely on its failure paths. A retry that charges twice, a transfer that debits without crediting, a fraud rule that only runs on the happy path — each is a correctness bug that costs real money.
The outcome
A transaction lifecycle that is explicit about every state it can be in, with idempotency keys and fund reservation making retries safe by construction.
Stack
- ASP.NET Core
- C#
- Clean Architecture
- EF Core
- SQL
- JWT
- REST API
The transaction lifecycle
The wallet screens are the easy half. What decides whether this works is the state machine underneath them — so that is what the case study spends its time on.
- 01
Pending
Created and validated. Funds are reserved against the source account so the same balance cannot be spent twice.
- 02
Processing
Executed under an idempotency key, so a retried request resolves to the same transaction rather than a second one.
- 03
Completed
Reservation is settled, balances are final, and the audit log records who and what.
- 04
Failed
Reservation is released and the account returns to a known state. Failure is a designed outcome, not an exception nobody handled.
Identity and controls
OTP and multi-step KYC
Onboarding is staged, with admin approval gating the transition from a registered identity to an operational account.
One account, many cards
Savings and regular card types carry different rule-based spending constraints against the same underlying balance.
Fraud triggers and freeze
Suspicious patterns can freeze an account, which stops activity without destroying the record needed to investigate it.
Batch and scheduled operations
Payroll batches and scheduled transfers reuse the same lifecycle, so a bulk run has the same correctness guarantees as a single transfer.
Architecture
Domain
Accounts, cards, transactions
- Entities
- State machine
- Spending rules
Application
Use cases and validation
- Transfer
- KYC
- Payroll batch
- Fraud evaluation
Infrastructure
Persistence, audit, exports
- EF Core
- Audit log
- CSV export
Next case study
- Client productAl-Tafawuq School SystemRead Case Study
- Hackathon projectDynamic Form BuilderRead Case Study
Building something in this space?
I am available for a limited number of projects. Tell me what you are working on.