technical · 6 min read
Ethiopian Bank Receipt Formats: A Complete Reference
Every Ethiopian bank receipt reference format, endpoint URL, and response type in one place. CBE, Telebirr, BOA, M-Pesa, Dashen, Awash, Zemen, CBE Birr, Siinqee, eBirr.
This is a complete technical reference for every Ethiopian bank and mobile wallet receipt system. If you're building a verification system, integrating payments, or just want to understand how Ethiopian bank receipts work, this is your reference.
CBE (Commercial Bank of Ethiopia)
CBE has two receipt systems. The new system (mbreciept) is preferred for its clean JSON response.
New system (mbreciept.cbe.com.et)
| Field | Value |
|---|---|
| URL format | https://mbreciept.cbe.com.et/{SHORT_ID} |
| API endpoint | https://Mb.cbe.com.et/api/v1/transactions/public/transaction-detail/{SHORT_ID} |
| Required headers | X-App-ID, X-App-Version |
| Response format | JSON |
| Input needed | Short URL or QR code scan |
| Account number required | No |
| Geo-blocked | No |
Old system (apps.cbe.com.et)
| Field | Value |
|---|---|
| URL format | https://apps.cbe.com.et:100/?id={FT_REFERENCE}{LAST_8_DIGITS} |
| Response format | |
| Input needed | FT reference (starts with FT) + last 8 digits of receiving account |
| Account number required | Yes (last 8 digits) |
| Geo-blocked | No |
Reference format: FT followed by 10 alphanumeric characters. Example: FT26140P01YB
# Old CBE URL construction
FT_REFERENCE = 'FT26140P01YB'
ACCOUNT = '1000560536171'
LAST_8 = ACCOUNT[-8:] # '60536171'
URL = f'https://apps.cbe.com.et:100/?id={FT_REFERENCE}{LAST_8}'
# https://apps.cbe.com.et:100/?id=FT26140P01YB60536171Telebirr (Ethio Telecom)
| Field | Value |
|---|---|
| URL format | https://transactioninfo.ethiotelecom.et/receipt/{REFERENCE} |
| Response format | HTML |
| Input needed | Transaction reference only |
| Account number required | No |
| Geo-blocked | Yes (Ethiopian IPs only) |
Reference format: 2-3 letter prefix followed by 6-8 alphanumeric characters. Common prefixes:
| Prefix | Transaction type |
|---|---|
| DET | Person-to-person transfer (most common) |
| CHQ | Cheque-related transaction |
| DAB | Bank account transfer |
| DEL | Merchant payment |
| ADQ | Additional transaction types |
# Telebirr URL construction
REFERENCE = 'DET8FJGUJ4'
URL = f'https://transactioninfo.ethiotelecom.et/receipt/{REFERENCE}'Geo-blocking
Telebirr's endpoint blocks all non-Ethiopian IP addresses at the network level. Cloud servers (AWS, Vercel, Cloudflare) cannot reach it. Self-host cheki on an Ethiopian server or use the fallback URL feature.
Bank of Abyssinia (BOA)
| Field | Value |
|---|---|
| URL format | https://cs.bankofabyssinia.com/api/onlineSlip/getDetails/?id={REFERENCE}{LAST_5_DIGITS} |
| QR format | AES-256-CBC encrypted CSV (decrypts to source, amount, reference, date, receiver) |
| Response format | JSON |
| Input needed | Transaction reference + last 5 digits of receiving account, OR the QR payload |
| Account number required | Yes (last 5 digits), skipped if QR payload is provided |
| Geo-blocked | No |
Reference format: Alphanumeric, typically starts with 2 letters. Example: AB12345678 or FT26167ZVPCJ
QR verification works for inter-bank transfers
BOA's online slip API does not recognize inter-bank transfer references (e.g., FT... sent to CBE). However, the QR code on the receipt is an AES-256-CBC encrypted payload that contains the full transaction details. cheki decrypts it server-side with the key exposed in BOA's receipt web app, so QR-based verification works even when the JSON API returns 'Invalid reference number'. See our BOA QR code breakdown for encryption parameters and security analysis.
No Selenium needed
Unlike the ethiobank_receipts library which requires Chrome WebDriver for BOA, cheki uses BOA's JSON API directly. This works in serverless environments without browser dependencies.
M-Pesa Ethiopia (Safaricom)
| Field | Value |
|---|---|
| URL format | https://m-pesabusiness.safaricom.et/api/receipt/getReceipt?trxNo={REFERENCE} |
| Response format | JSON |
| Input needed | Transaction reference only |
| Account number required | No |
| Geo-blocked | Yes (Ethiopian IPs only) |
Reference format: Alphanumeric Safaricom transaction reference.
Dashen Bank
| Field | Value |
|---|---|
| URL format | https://receipt.dashensuperapp.com/receipt/{REFERENCE} |
| Response format | |
| Input needed | Transaction reference only |
| Account number required | No |
| Geo-blocked | No |
Reference format: Alphanumeric Dashen transaction reference. Use the Transaction Reference, not the Transfer Reference. Works for both within-Dashen and Other Bank Transfer (inter-bank) receipts.
Awash Bank
Awash Bank receipts are public HTML pages on awashpay.awashbank.com, served by a Java backend called MoonlightMBanking behind an F5 BIG-IP WAF. We have fully reverse-engineered the share-link structure using 18 real samples collected from SMS messages, GitHub repos, and community contributions. The share link is sent automatically via SMS after every transaction.
| Field | Value |
|---|---|
| URL format | https://awashpay.awashbank.com:8225/-{TX_ID_BASE36}-{COUNTER_BASE36} |
| Part 1 (TX_ID_BASE36) | Numeric Transaction ID encoded in base-36 (case-insensitive) |
| Part 2 (COUNTER_BASE36) | Server-side counter, 6 chars base-36, strictly validated |
| Response format | HTML |
| Input needed | Full Awash share link (from SMS or app) |
| Account number required | No |
| Geo-blocked | No |
| Backend | Java (MoonlightMBanking), nginx, F5 BIG-IP ASM WAF |
| App package | com.sc.awashpay (AwashBirr Pro) |
| SMS delivery | Share link sent automatically in SMS after every transaction |
Transaction ID structure
The numeric Transaction ID is not random. Since 2026, it has a fixed structure: YYMMDDHHMM followed by a 5-digit per-minute sequence number. For example, Transaction ID 260607112275735 breaks down as:
| Component | Digits | Value | Meaning |
|---|---|---|---|
| YY | 2 | 26 | Year (2026) |
| MM | 2 | 06 | Month (June) |
| DD | 2 | 07 | Day (7th) |
| HH | 2 | 11 | Hour (11) |
| MI | 2 | 22 | Minute (22) |
| SEQ | 5 | 75735 | Per-minute sequence number |
This means the Transaction ID itself encodes the transaction date and time down to the minute. The 5-digit sequence resets each minute and is not globally monotonic. We verified this against all 13 new-format samples. Transactions before 2026 use a different hex-like format (e.g. E3BF28E4B8C1) that does not follow this structure.
URL structure breakdown
Example share link: https://awashpay.awashbank.com:8225/-2KDL95Z0NR...
| Segment | Base-36 value | Decimal value | Meaning |
|---|---|---|---|
| Part 1 | 2KDL95Z0NR | 260607112275735 | Transaction ID (YYMMDDHHMM + 5-digit seq) |
| Part 2 | 4U61O6 | 292535286 | Server counter (increases with time) |
We verified this with 18 real Awash receipts spanning April 2025 to June 2026, covering transaction types including Send To Bank, IPS Bank Transfer, Send to Wallet, Telebirr Transfer, Merchant Payment, and Other Bank Transfer. In every case, converting part 1 from base-36 to decimal produced the exact Transaction ID. The URL is case-insensitive (lowercase works).
Counter analysis (18 samples)
Part 2 is not a hash of the Transaction ID. We tested and ruled out: CRC32, Adler32, MD5/SHA1/SHA256 truncation, Java hashCode, DJB2, FNV-1a, HMAC, affine functions, modulo operations, and bit manipulation. It is a monotonically increasing counter with an accelerating rate that correlates with time.
| Date | Counter (decimal) | Rate since previous | Source |
|---|---|---|---|
| 2025-04-10 | 78,960,518 | — | GitHub |
| 2025-07-26 | 120,823,236 | 4.4/sec | SMS |
| 2025-08-04 | 124,196,936 | 5.4/sec | GitHub |
| 2025-11-04 | 167,318,568 | 5.4/sec | SMS |
| 2026-01-28 | 214,318,325 | 6.4/sec | GitHub SMS |
| 2026-02-11 | 222,463,161 | 6.7/sec | SMS |
| 2026-03-08 | 236,606,890 | 6.6/sec | SMS |
| 2026-03-14 | 240,498,506 | 7.5/sec | SMS |
| 2026-04-01 | 251,165,242 | ~7.1/sec (interpolated) | Brute-forced |
| 2026-04-02 | 251,958,281 | ~7.2/sec | SMS |
| 2026-04-17 | 261,177,944 | 7.1/sec | SMS |
| 2026-05-14 | 277,774,515 | 7.2/sec | Original samples |
| 2026-06-07 | 292,535,286 | 7.2/sec | Original samples |
| 2026-06-22 | 302,458,159 | 7.5/sec | Community |
The counter rate is accelerating: 4.4/sec in mid-2025, 6.4/sec by January 2026, and 7.5/sec by June 2026. A quadratic model fits with R-squared = 0.9999 and maximum residual of ±1M. For dates bracketed by nearby samples, local linear interpolation gives predictions within ±100K.
The server strictly validates both segments. Replacing part 2 with a nearby value returns 'Mistmatch / invalid receipt id'. Omitting it returns 'Invalid receipt id'. Part 2 must be exactly 6 base-36 characters (5 or 7 chars returns mismatch). Extra dashes or special characters are rejected by the WAF.
Server architecture
The Awash receipt server runs a Java application called MoonlightMBanking (revealed by the JSESSIONID cookie path). It sits behind nginx and an F5 BIG-IP ASM WAF that blocks all paths except the /-{part1}-{part2} receipt URL pattern. A merchant API exists at /awashbirrpro/merchant-api/ but is also WAF-blocked. The receipt HTML contains no client-side token generation logic: the share URL is pre-baked in the HTML and only used to render a QR code.
| Component | Details |
|---|---|
| Backend app | MoonlightMBanking (Java, Jetty/Tomcat) |
| Web server | nginx |
| WAF | F5 BIG-IP ASM (blocks all non-receipt paths) |
| Load balancer | F5 BIG-IP (TS01121d40 persistence cookie) |
| App name | AwashBirr Pro (com.sc.awashpay) |
| Merchant API | /awashbirrpro/merchant-api/DebitRequest/ (WAF-blocked) |
| Dev API | /awashpaytest/Rest/ (separate endpoint) |
| Client-side JS | Only QRCode generation, no token logic |
| SMS delivery | Receipt link included in SMS automatically after transaction |
Brute-force proof of concept (2 successes)
We have proven that a valid share URL can be constructed from a Transaction ID alone, without the Awash app or SMS, by brute-forcing the counter. We did this successfully twice:
| Target date | Transaction ID | Predicted P2 | Actual P2 | Offset | URLs scanned | Time |
|---|---|---|---|---|---|---|
| 2026-05-14 | 260514120752793 | 277,659,280 | 277,776,101 | +116,821 | 116,820 | 18.3 min |
| 2026-04-01 | 260401182242481 | 251,236,520 | 251,165,242 | -71,278 | 65,243 | 16.5 min |
Both scans ran at 66-106 req/sec with zero WAF blocks and less than 0.01% error rate. The server did not rate-limit or block the probing. The April 1 scan was especially efficient because we had a nearby sample from April 2 (just 1 day away) to anchor the prediction.
What this means
Given a Transaction ID, cheki can construct the share URL by: (1) converting the txID to base-36 for part 1, (2) extracting the timestamp from the txID structure, (3) predicting the counter using our 18-sample model, and (4) brute-forcing the remaining uncertainty. With nearby anchor samples, the scan takes 15-20 minutes. With 50+ samples, it could drop to under 1 minute.
What we still need to figure out
- Is the counter global across all Awash transactions, or per branch / per sender / per channel?
- Why did one Transaction ID (March 28) resist brute-forcing across 8M+ URLs? Was the counter outside our model range, or is there a different explanation?
- What is the relationship between the old hex-format txIDs (pre-2026) and the new YYMMDDHHMM format?
- Can the counter prediction be improved with more samples from underrepresented time periods?
Help us improve the counter model
We have 18 samples but need more from underrepresented periods (especially March 2026, September-December 2025, and pre-July 2025). If you have Awash SMS messages with receipt links, please share the two-part token (e.g. 2KDL95Z0NR-4U61O6) and the transaction date/time on GitHub. Each sample narrows the prediction window and reduces brute-force time.
Privacy note
If you share Awash links, the receipts already contain the transaction details. If you want to help without exposing real data, paste just the two-part token (e.g. 2KDL95Z0NR-4U61O6) and the transaction date/time from the SMS. Do not include the full URL if you are not comfortable sharing it.
How to verify Awash with cheki
Paste the full share link from your Awash SMS or app into cheki. The parser will extract the Transaction ID, receiver, amount, date, and other fields from the official HTML receipt. cheki handles all receipt variants (Transfer successful, Transaction successful, Transaction Details, Telebirr Transfer) including IPS bank transfers, merchant payments, send-to-wallet, and other-bank transfers.
Zemen Bank
| Field | Value |
|---|---|
| URL format | https://share.zemenbank.com/rt/{REFERENCE}/pdf |
| Response format | |
| Input needed | Transaction reference only |
| Account number required | No |
| Geo-blocked | No |
CBE Birr
| Field | Value |
|---|---|
| URL format | https://apps.cbebirr.com.et/receipt/{REFERENCE}?phone={PAYER_PHONE} |
| Response format | HTML |
| Input needed | Transaction reference + payer phone number |
| Account number required | No (phone instead) |
| Geo-blocked | No |
Siinqee Bank
| Field | Value |
|---|---|
| URL format | https://siinqeebank.com/receipt/{REFERENCE} |
| Response format | HTML |
| Input needed | Transaction reference only |
| Account number required | No |
| Geo-blocked | No |
eBirr (Nib, Wegagen, Ahadu, KAAFI)
eBirr is a mobile money platform connecting 5 Ethiopian financial institutions through a single receipt endpoint. Each partner bank has its own tenant code in the URL.
| Field | Value |
|---|---|
| URL format | https://receipt.ebirr.com/{tenant}/{token} |
| Tenant codes | nib (Nib International), wegagen (Wegagen), ahadu (Ahadu), kaafimf (KAAFI Microfinance) |
| Response format | HTML |
| Input needed | Full receipt URL or tenant/token string (e.g., nib/abc123) |
| Account number required | No |
| Geo-blocked | No |
The user shares the receipt from the eBirr app to get a receipt.ebirr.com/{tenant}/{token} URL. cheki auto-detects the tenant and maps it to the correct partner bank. Invalid tokens return a 'Not Found Page' (HTTP 200 with red H1).
eBirr vs Telebirr
eBirr and Telebirr are completely different services. Telebirr is Ethio Telecom's mobile wallet. eBirr is a separate mobile money platform that partners with multiple banks (Nib, Wegagen, Ahadu, KAAFI, Siinqee/Coopbank).
Other Ethiopian banks (researching)
The following 18 banks are licensed in Ethiopia but do not yet have confirmed public receipt verification endpoints. cheki lists them as 'in development' and is actively researching their receipt systems:
| Bank | Established | Branches | Status |
|---|---|---|---|
| Abay Bank | 2010 | 279 | Researching |
| Addis International Bank | 2011 | 146 | Researching |
| Amhara Bank | 2022 | 320 | Researching |
| Berhan International Bank | 2009 | - | Researching |
| Bunna International Bank | 2009 | - | Researching |
| Enat Bank | 2013 | - | Researching (women-focused) |
| Global Bank Ethiopia | 2012 | - | Researching |
| Lion International Bank | 2006 | - | Researching (aka Anbessa) |
| Oromia International Bank | 2008 | - | Researching |
| Hibret Bank | 1998 | - | Researching (formerly United Bank) |
| ZamZam Bank | 2021 | - | Researching (Islamic) |
| Hijra Bank | 2021 | - | Researching (Islamic) |
| Shabelle Bank | 2021 | - | Researching |
| Goh Betoch Bank | 2021 | - | Researching (housing/mortgage) |
| Tsedey Bank | 2022 | - | Researching |
| Gadaa Bank | 2022 | - | Researching |
| Rammis Bank | 2022 | - | Researching |
| Development Bank of Ethiopia | 1901 | - | State development bank (no retail) |
Help us add more banks
If you have a receipt from any of these banks with a QR code or receipt URL, contact us on GitHub. We'll investigate the endpoint and add it to cheki for free.
Auto-detection patterns
cheki auto-detects the bank from the reference format. Here are the detection rules:
| Pattern | Bank |
|---|---|
| Starts with FT | CBE |
| Starts with DET, CHQ, DAB, DEL, ADQ, DEP, CHG | Telebirr |
| 2 letters + digits (general) | BOA |
| 2 letters + 6+ digits | M-Pesa |
| awashpay.awashbank.com:8225/-{A}-{B} | Awash Bank |
| receipt.ebirr.com/{tenant}/{token} | eBirr |
| tenant/token (nib/, wegagen/, ahadu/, kaafimf/) | eBirr |
URL auto-detection
cheki also detects the bank from pasted URLs. If you paste a mbreciept.cbe.com.et link, it knows it's CBE. If you paste a transactioninfo.ethiotelecom.et link, it knows it's Telebirr. If you paste an awashpay.awashbank.com:8225/-... link, it knows it's Awash. No manual bank selection needed.