Awash Bank
Detail page — public receipt URL, page structure, captured fields, and return shape.
Awash Bank's awashpay.awashbank.com:8225 is a server-rendered static HTML "VAT Invoice / Customer Receipt" page. We fetch it directly and scrape the structured tables into JSON.
URL format
| Part | Pattern | Example |
|---|---|---|
| host | literal | awashpay.awashbank.com |
| port | literal | :8225 |
<TOKEN> | leading dash + alphanumerics-and-dashes | -ABCD1234EF-1A2B3C |
The leading dash on the path is part of the URL — every Awash receipt link starts with one. The token interior carries one or more additional dashes.
What we actually hit
The URL is passed through unchanged — no SPA bypass, no API endpoint substitution. A direct GET returns the receipt HTML in ~250 ms.
Return type
receipt.source === "awash-html". The static company-info block (TIN 0000030100, VAT Reg 17264, etc.) is dropped — it's identical on every Awash receipt. We capture two sub-objects: customer (the receipt holder) and transaction (the payment itself).
Not every field is set on every receipt — Awash issues at least nine distinct layouts depending on transactionType, each carrying a different subset.
Supported transaction types
Awash uses synonym labels across receipt types (Sender Name / Customer Name / Name, Beneficiary Account / Phone Number / CA Number, etc.). The parser maps each synonym into the same typed field below. Type-specific labels we don't have first-class names for surface inside transaction.extra.
| transactionType | senderName source | beneficiaryName / …Account source | Lands in extra |
|---|---|---|---|
IPS Bank Transfer | Sender Name | Beneficiary Name + Account + Bank | — |
Telebirr Transfer | Customer Name | — / Phone Number | — |
Send Money | customer fallback | Recipient | — |
Bill Payment | Customer Name | — / CA Number | Invoice Number, Invoice Date |
Ethiotelecom Postpaid Bill | Customer Name | — / Service Number | — |
Bulk Payment | Sender | Recipient | — |
WITHDRAW | customer fallback | — | Branch, CBS Trans ID |
DEPOSIT | customer fallback | — | Branch, CBS Trans ID |
School Fees | customer fallback | Student Name | Student Code, Student Class, School, Payment Period |
senderName fallback
For receipt types where Awash doesn't include a separate sender field — WITHDRAW, DEPOSIT, Send Money, School Fees — the receipt-holder is implicitly the originating party, so transaction.senderName falls back to customer.customerName. This guarantees the validation rule below holds across all nine types; you can detect whether the fallback fired by comparing transaction.senderName === customer.customerName.
Samples
IPS Bank Transfer
Telebirr Transfer
School Fees (with extra)
WITHDRAW (with extra)
Quirks
- The receipt page is a static HTML render — no SPA hydration needed,
curlreturns the full page. The embedded QR code re-encodes the same URL the page was served from. - Amounts are strings with currency suffix —
"1800 ETB", not1800. Awash ships them this way; we preserve verbatim so the caller can decide whether to stripETBor keep it. - Duplicate field labels — "VAT Reg No" and "VAT Reg Date" appear in both the company-info section (dropped) and the customer-info section (captured). The parser slices by the second
<table class="info-table">to avoid the company's static17264shadowing the customer's-. - Multi-payee beneficiary names — Awash receipts for batch transfers contain
&-separated names (e.g."<NAME-1> &<NAME-2> &<NAME-3>"). HTML entities are decoded before return. - Two different masks for the same account — the receipt-holder's account on
customer.accountNocarries one mask shape (e.g.XXXXX******XXXX/BANKwith the/BANKsuffix), whiletransaction.senderAccountcarries a slightly different one (e.g.XXXXX*******XXX, no suffix). Awash masks them at the source; we don't unmask or re-mask. transaction.extrais type-specific — same parser, different layout pertransactionType. If you only consume the typed fields,extracan be ignored; if you need to render the full receipt faithfully, iterate overextraand render its(key, value)pairs alongside.- Validation rule — receipt is considered valid only when
transaction.transactionId,transaction.senderName, ANDtransaction.amountare all present. With the customer-fallback forsenderName, this passes for all nine receipt types whenever the upstream HTML is complete.