Bank of Abyssinia is having issues right now.Status →
CBE PDF receipts unavailable (16 days). Known, ongoing.Status →
links.et

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

https://awashpay.awashbank.com:8225/-<TOKEN>
PartPatternExample
hostliteralawashpay.awashbank.com
portliteral: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).

interface AwashReceipt {
  source: 'awash-html';
 
  customer: {
    customerName?: string;             // e.g. "<customer name>"
    accountNo?: string;                // masked: "XXXXX******XXXX/BANK"
    city?: string;                     // e.g. "Addis Ababa"
    vatRegNo?: string;                 // "-" when the customer isn't VAT-registered
    vatRegDate?: string;
    tinTaxId?: string;                 // labelled "TIN (TAX ID)" on the receipt
    branch?: string;                   // e.g. "<branch name>"
  };
 
  transaction: {
    transactionTime?: string;          // "YYYY-MM-DD HH:MM:SS AM|PM"
    transactionType?: string;          // see "Supported transaction types" below
    amount?: string;                   // string with currency: "<amount> ETB"
    vat?: string;                      // string with currency: "<vat> ETB"
    charge?: string;                   // service charge; present on wallet/bill receipts
    senderName?: string;
    senderAccount?: string;            // masked: "XXXXX*******XXX"
    beneficiaryName?: string;
    beneficiaryAccount?: string;
    beneficiaryBank?: string;          // e.g. "Commercial Bank of Ethiopia"
    reason?: string;                   // e.g. "Transfer"
    transactionId?: string;            // 15-digit numeric (placeholder: "000000000000000")
 
    // Any label found in the transaction table that didn't map to one of the
    // typed fields above, e.g. "Branch", "CBS Trans ID" on WITHDRAW/DEPOSIT;
    // "Student Code", "Student Class", "School" on School Fees. Absent when
    // every label resolved to a typed field (IPS Bank Transfer, etc.).
    extra?: Record<string, string>;
  };
}

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.

transactionTypesenderName sourcebeneficiaryName / …Account sourceLands in extra
IPS Bank TransferSender NameBeneficiary Name + Account + Bankn/a
Telebirr TransferCustomer Namen/a / Phone Numbern/a
Send Moneycustomer fallbackRecipientn/a
Bill PaymentCustomer Namen/a / CA NumberInvoice Number, Invoice Date
Ethiotelecom Postpaid BillCustomer Namen/a / Service Numbern/a
Bulk PaymentSenderRecipientn/a
WITHDRAWcustomer fallbackn/aBranch, CBS Trans ID
DEPOSITcustomer fallbackn/aBranch, CBS Trans ID
School Feescustomer fallbackStudent NameStudent 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

{
  "source": "awash-html",
  "customer": {
    "customerName": "<customer name>",
    "accountNo": "XXXXX******XXXX/BANK",
    "city": "Addis Ababa",
    "vatRegNo": "-",
    "vatRegDate": "-",
    "tinTaxId": "-",
    "branch": "<branch>"
  },
  "transaction": {
    "transactionTime": "2026-01-01 00:00:00 AM",
    "transactionType": "IPS Bank Transfer",
    "amount": "100 ETB",
    "vat": "0.09 ETB",
    "senderName": "<sender name>",
    "senderAccount": "XXXXX*******XXX",
    "beneficiaryName": "<beneficiary name>",
    "beneficiaryAccount": "1000000000000",
    "beneficiaryBank": "Commercial Bank of Ethiopia",
    "reason": "Transfer",
    "transactionId": "000000000000000"
  }
}

Telebirr Transfer

{
  "source": "awash-html",
  "customer": {
    "customerName": "<customer name>",
    "accountNo": "XXXXX******XXXX/BANK",
    "city": "Addis Ababa",
    "branch": "<branch>"
  },
  "transaction": {
    "transactionTime": "2026-01-01 00:00:00 AM",
    "transactionType": "Telebirr Transfer",
    "amount": "100 ETB",
    "vat": "0.09 ETB",
    "charge": "1 ETB",
    "senderName": "<customer name>",
    "senderAccount": "XXXXX*******XXX",
    "beneficiaryAccount": "251********",
    "reason": "Transfer",
    "transactionId": "000000000000000"
  }
}

School Fees (with extra)

{
  "source": "awash-html",
  "customer": { "customerName": "<customer name>", "branch": "<branch>" },
  "transaction": {
    "transactionTime": "2026-01-01 00:00:00 AM",
    "transactionType": "School Fees",
    "amount": "100 ETB",
    "senderName": "<customer name>",
    "beneficiaryName": "<student name>",
    "transactionId": "000000000000000",
    "extra": {
      "Student Code": "<student code>",
      "Student Class": "<student class>",
      "School": "<school name>",
      "Payment Period": "<payment period>"
    }
  }
}

WITHDRAW (with extra)

{
  "source": "awash-html",
  "customer": { "customerName": "<customer name>", "branch": "<branch>" },
  "transaction": {
    "transactionTime": "2026-01-01 00:00:00 AM",
    "transactionType": "WITHDRAW",
    "amount": "100 ETB",
    "senderName": "<customer name>",
    "senderAccount": "XXXXX*******XXX",
    "transactionId": "000000000000000",
    "extra": {
      "Branch": "<branch>",
      "CBS Trans ID": "<trans id>"
    }
  }
}

Quirks

  • The receipt page is a static HTML render: no SPA hydration needed, curl returns 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", not 1800. Awash ships them this way; we preserve verbatim so the caller can decide whether to strip ETB or 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 static 17264 shadowing the customer's -.
  • Multi-payee beneficiary names: Awash receipts for batch transfers contain &amp;-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.accountNo carries one mask shape (e.g. XXXXX******XXXX/BANK with the /BANK suffix), while transaction.senderAccount carries a slightly different one (e.g. XXXXX*******XXX, no suffix). Awash masks them at the source; we don't unmask or re-mask.
  • transaction.extra is type-specific: same parser, different layout per transactionType. If you only consume the typed fields, extra can be ignored; if you need to render the full receipt faithfully, iterate over extra and render its (key, value) pairs alongside.
  • Validation rule: receipt is considered valid only when transaction.transactionId, transaction.senderName, AND transaction.amount are all present. With the customer-fallback for senderName, this passes for all nine receipt types whenever the upstream HTML is complete.

On this page