A TypeScript engine for verifying Ethiopian bank transfer receipts — supports CBE, Telebirr, Bank of Abyssinia, and E-Birr via receipt links, SMS, transaction references, and OCR screenshots. No framework dependencies
# @localpay/verification-engine
**Bank receipt verification engine for Ethiopian and East African banks**
Verify Ethiopian bank transfer receipts in real time.
Supports SMS, receipt links, transaction references, and OCR screenshots.
Zero framework dependencies — works in any Node.js project.
Installation · Quick Start · Supported Banks · Verification Methods · URL Validation · Proxy Support · Adding a Bank · NestJS
---
## Features
- 🏦 **5 Ethiopian banks** — CBE, Telebirr, Bank of Abyssinia, E-Birr, Awash Bank
- 🔗 **5 verification methods** — LINK, SMS, TRANSACTION_REF, OCR, SCREENSHOT
- 🛡️ **Automatic URL validation** — domain allowlist + structural checks before any network call
- 🌍 **Proxy support** — per-country routing via a simple interface
- ✅ **Amount matching** — configurable tolerance, strips currency symbols and commas automatically
- 🔌 **Zero framework lock-in** — plain TypeScript, no NestJS, no Prisma
- 🧩 **Extensible** — add any bank parser by implementing one interface
- 📦 **Tree-shakeable** — `sideEffects: false`
---
## Installation
```bash
npm install @localpay/verification-engine
```
> **Optional:** Install `puppeteer` only if you verify **Telebirr** or **Bank of Abyssinia**
> receipts — those banks serve JavaScript-rendered pages requiring a headless browser.
```bash
npm install puppeteer
```
Requires **Node.js ≥ 20**.
---
## Quick Start
```ts
import { VerificationEngine } from "@localpay/verification-engine";
const engine = new VerificationEngine();
const result = await engine.verify({
bank: "CBE",
amount: 500,
verMethod: "LINK",
rawProof: "
apps.cbe.com.et",
});
if (result.status === "SUCCESS") {
console.log(result.receipt.bank); // "CBE"
console.log(result.receipt.transactionNumber); // "FT26093JCD32..."
console.log(result.receipt.amount); // "500"
console.log(result.receipt.receiverAccount); // account number
console.log(result.receipt.receiverN …