open source ยท 5 min read
How to Add a New Bank to cheki (Community Guide)
cheki supports 31 Ethiopian banks but only 9 are live. Here's how you can help add the rest. No coding required, just share a receipt. For developers: how to write a parser and submit a PR.
cheki lists 31 Ethiopian banks and wallets, but only 9 are live. The remaining 22 are listed as 'in development' because we haven't confirmed their public receipt endpoints yet. This is where the community comes in.
No coding required
The most valuable contribution is a receipt. If you use a bank we don't support yet, share a receipt screenshot or URL and we'll do the technical work.
Option 1: Share a receipt (easiest)
If you have a receipt from a bank marked 'In development' on cheki, here's what we need:
- A screenshot of the full receipt (or the receipt URL if the bank has a share feature)
- The QR code on the receipt (if there is one), scan it with any QR reader and send us the decoded text
- The transaction reference number
- The bank name
Send it via GitHub (open an issue with the 'new-bank' label) or via Telegram. We'll reverse-engineer the endpoint and add the bank to cheki, usually within a day.
Privacy
Redact or blur sensitive information like full account numbers before sharing. We only need the receipt structure, the reference number, and the QR code payload, not your full account details.
Option 2: Write a parser (for developers)
If you can code, you can add a bank yourself. cheki's architecture is hexagonal. Each bank is a self-contained parser module. Here's the process:
Fork the repo
Go to github.com/1RB/cheki, click Fork, clone your fork locally.
Create a parser file
Create src/lib/parsers/{bankcode}.ts. Extend BaseParser and implement buildUrl() and parse(). Look at telebirr.ts or dashen.ts for examples.
Register the parser
Add your parser to src/lib/parsers/index.ts. It takes one import and one registerParser() call.
Add the bank to banks.ts
Add a bank entry with code, name, endpoint, description, FAQ, and SEO metadata. Set status to 'live' if the endpoint works.
Write tests
Create tests/parsers/{bankcode}.test.ts. Test buildUrl(), parse() with sample data, and edge cases (not found, empty response).
Submit a PR
Push to your fork and open a pull request. Include the receipt URL format in the PR description so we can verify.
The parser interface is simple:
class MyBankParser extends BaseParser {
readonly bankId = "mybank";
readonly bankName = "My Bank";
readonly responseType = "html" as const; // or "json" or "pdf"
readonly requiresAccount = false;
readonly requiresPhone = false;
buildUrl(ref: string, account?: string): string {
return `https://mybank.com/receipt/${ref}`;
}
parse(data: string | Buffer, contentType: string): ParsedReceipt {
// Parse the HTML/JSON/PDF response
// Return { verified: true, senderName, receiverName, amount, ... }
}
}Option 3: Report broken endpoints
Banks occasionally change their receipt URL formats. If you notice that a bank that used to work on cheki is now returning errors, open a GitHub issue with:
- The bank name
- The error message you see
- The reference number you tried (so we can test)
- What the receipt looks like in the bank's own app (screenshot if possible)
Because cheki is open source, anyone can submit a fix, not just the original developers. This is the advantage of community-built tools over closed services like check.et and verify.et.
Current coverage status
| Status | Count | Banks |
|---|---|---|
| Live | 9 | CBE, Telebirr, BOA, M-Pesa, Dashen, Zemen, CBE Birr, Siinqee, eBirr |
| Via eBirr (ready) | 4 | Nib International, Wegagen, Ahadu, KAAFI |
| Researching | 18 | Abay, Addis, Amhara, Berhan, Bunna, Enat, Global, Lion, Oromia Int'l, Hibret, ZamZam, Hijra, Shabelle, Goh Betoch, Tsedey, Gadaa, Rammis, DBE |
Why community matters for Ethiopian fintech
Ethiopia has 30+ licensed banks, but most receipt verification services (check.et, verify.et, qbirr, tinaverify) only support 6-10. The long tail of smaller and newer banks gets ignored because it's not profitable enough for paid services.
Open source changes this. Every contribution, whether it's a receipt screenshot or a full parser, helps cover a bank that paid services won't bother with. The community can move faster than any single company.
Every receipt counts
Even one receipt from a bank we don't support can unlock verification for every cheki user. You don't need to write code to make a difference.