POST /api/verify
Fetch + parse a single receipt URL across all supported providers.
No receipt URL? See
POST /api/verify-image— extracts a receipt from a screenshot via AI OCR and chains back here for the upstream confirmation when the screenshot is from a supported provider.
Request
| Field | Type | Description |
|---|---|---|
url | string | Full receipt URL. Works for every supported provider. |
reference | string | Shorthand — telebirr-only. Equivalent to transactioninfo.ethiotelecom.et/receipt/<ref>. |
Exactly one of the two is required. URLs and references shown below are placeholders — substitute one from a receipt you control.
Response envelope
Every success returns the same envelope. The shape of receipt varies by provider; use the source field (or its absence) to dispatch.
Telebirr
receipt.source === "telebirr-html". Scraped from the bilingual HTML.
CBE PDF (apps.cbe.com.et and dashed mbreciept.cbe.com.et)
receipt.source === "cbe-pdf". Amounts are numbers, not strings.
Zemen Bank (share.zemenbank.com)
receipt.source === "zemen-pdf". Amounts are numbers; currency is always ETB on these receipts. The URL has the shape share.zemenbank.com/rt/<token>/pdf where <token> is 24 alphanumeric characters (an 8-char prefix followed by the 16-char reference).
Bank of Abyssinia (cs.bankofabyssinia.com)
receipt.source === "boa-json". The public /slip/ page is a React SPA — we
bypass it and hit the same /api/onlineSlip/getDetails/?id=<trx> endpoint the
bundle does, then normalize the response. Amounts are numbers.
Awash Bank (awashpay.awashbank.com:8225)
receipt.source === "awash-html". Scraped from a server-rendered static HTML
receipt page. The static company-info block (TIN, VAT Reg, etc.) is dropped —
it's identical on every receipt — and we surface customer + transaction
sub-objects. Amounts are strings with a ETB suffix (Awash ships them that
way; we keep verbatim).
Awash issues at least nine receipt layouts depending on transactionType
(IPS Bank Transfer, Telebirr Transfer, Send Money, Bill Payment, Ethiotelecom
Postpaid Bill, Bulk Payment, WITHDRAW, DEPOSIT, School Fees). The parser
maps each variant's synonym labels (Sender Name / Customer Name,
Beneficiary Account / Phone Number / CA Number, etc.) into the same
typed fields below. Labels we don't have first-class names for — Branch,
CBS Trans ID, Student Code, Invoice Number, etc. — appear inside
transaction.extra. See Awash Bank provider page for
the full variant matrix.
CBE JSON (mb.cbe.com.et and plain mbreciept.cbe.com.et)
receipt.source === "mb-json". Richer than the PDF — includes commissions, taxes, and processing dates as an array.
502 — parsed but invalid
The upstream answered with 200 but the body didn't carry enough to validate as a real receipt (no reference, or telebirr lacked receiptNo/payerName/transactionStatus). The partial receipt is still returned so you can inspect what was extracted.
GET /api/verify
Returns { ok: true, ts }. No auth — used by uptime monitors.