Providers overview
Every supported receipt host, the source tag each one stamps on its receipt, and the shape it returns.
links.et resolves an inbound URL or reference into an upstream call against
one of these hosts, parses the response, and returns a provider-tagged receipt
object. The source field on the receipt tells you which schema you are
looking at, so switch on that rather than on the host.
17 banks and wallets, plus one point-of-sale format.
| Provider | Source tag | Hosts | Return shape |
|---|---|---|---|
telebirr-html | transactioninfo.ethiotelecom.et | HTML scraped | |
cbe-pdf | apps.cbe.com.et | PDF parsed | |
mb-json | mb.cbe.com.et · mbreciept.cbe.com.et | JSON re-mapped | |
cbebirr-pdf | cbepay1.cbe.com.et · cbepay2.cbe.com.et | PDF parsed | |
boa-json | cs.bankofabyssinia.com | JSON envelope flattened | |
zemen-pdf | share.zemenbank.com | PDF parsed | |
awash-html | awashpay.awashbank.com:8225 | HTML scraped | |
dashen-pdf | receipts.dashenbanksc.com | PDF parsed | |
dashen-html | receipt.dashensuperapp.com · api.dashensuperapp.com | HTML scraped | |
mpesa-pdf | m-pesabusiness.safaricom.et | PDF parsed | |
| COOPay Ebirr | ebirr-html | receipt.ebirr.com/coopay/… | HTML scraped |
| Kaafi Ebirr | ebirr-html | receipt.ebirr.com/kaafimf/… | HTML scraped |
amhara-json | receipt.amharabank.com.et · transaction.amharabank.com.et | JSON re-mapped | |
| Abay Bank | abay-html | abaymobile.com.et | HTML scraped |
berhan-pdf | transactioninfo.berhanonline.et | PDF parsed | |
| Oromia Bank | oromia-pdf | obinfo.oromiabank.com | PDF parsed |
ahadu-pdf | receipt.ahadubank.com | PDF parsed | |
| Siinqee Bank | siinqee-pdf | receipts.siinqeebank.com:871 | PDF parsed |
| ZamZam Bank | zamzam-json | receipt.zamzambank.com.et | JSON re-mapped |
| HuluBeje (point of sale) | hulubeje-dxxrdv | et.hulubeje.com | Export parsed |
Both Ebirr brands share one host and one parser, and are told apart by the
first path segment. coopay and kaafi are separate providers on the receipt.
Two things to remember:
- Reference numbers shown in these docs are placeholders (
ABCD1234EF,FT00000000, and so on). Substitute your own when testing. - Receipts are immutable once issued, so we cache them forever. The second
hit on the same URL returns from cache and carries
x-cache: HIT. Cache hits never count against your plan's verification cap.
Screenshots, and the one provider that is different
POST /api/verify-image reads a screenshot, finds the reference or the QR, and
then verifies it upstream the normal way, so the receipt you get back is the
bank's copy rather than anything read off the image.
Bank of Abyssinia is the exception. Its slip page encrypts the receipt fields
into the QR instead of linking to a page we could fetch, and the 12-character
reference it prints will not resolve on its own. There the QR payload is the
answer, and the upstream object says so plainly:
attempted: false means nothing was fetched from the bank. Those fields came
out of the image. Treat them as weaker evidence than any other receipt here: a
QR is tamper-evident, not signed, so editing the amount in a screenshot leaves
the QR disagreeing with it, but anyone can mint a matching code. Account numbers
arrive already masked by the bank, so the QR reveals nothing the screenshot did
not already show.
Siinqee has a five-view meter
receipts.siinqeebank.com allows about five requests per receipt reference,
globally rather than per caller, and counts failed attempts too. Once a link
is spent, nobody can open it again, including the customer.
We hold to that budget: a Siinqee link is fetched once per verification with no egress retry, and a failure is cached for 24 hours rather than the usual 30 minutes, so retries spread over days instead of burning the budget in an afternoon. Your side of the bargain is to not poll a Siinqee reference. Ask once, then read the cached answer as often as you like, since cache hits never touch the bank.
Availability
Provider hosts go down on their own schedule, and a receipt that will not
verify is usually the bank rather than us. apps.cbe.com.et (the CBE PDF host)
has been unreachable since July 2026, so CBE receipts resolve through the JSON
host instead. The status page probes every host on this list every
few minutes and shows the current state.