Bank of Abyssinia
Detail page — public SPA URL, underlying API endpoint, token format, and return shape.
Bank of Abyssinia's cs.bankofabyssinia.com/slip/ is a React SPA that fetches its data from a same-origin JSON endpoint. We bypass the SPA entirely and hit the underlying API directly.
URL format
Public slip URL (what users share)
| Part | Pattern | Example |
|---|---|---|
| host | literal | cs.bankofabyssinia.com |
<TOKEN> | FT[A-Z0-9]{15} (17 chars total) | FT00000000000000A |
What we actually hit
Token anatomy
The 17-char URL token is approximately <12-char reference><5-char suffix>. The reference echoed inside the receipt body (transactionReference) is just the leading 12 chars; the trailing 5 look like a channel/branch suffix. The API wants the full 17, not the inner reference.
Return type
receipt.source === "boa-json". Amounts are numbers.
Sample (placeholder values)
Quirks
- The slip page is a 456-byte React shell —
curlagainst the public URL returns the empty SPA; the receipt data only lands after the JS bundle fetches the API. We avoid that round trip entirely by going to the API directly. - No payer fields are exposed — unlike telebirr or CBE, BoA's public slip never includes the sender's name or account. Only the receiver side is visible.
- Envelope has a
headerwrapper — the raw upstream returns{ header: { status, audit, … }, body: [ { ...receipt } ] }. We unwrap to a single object and liftheader.statustoupstreamStatus. - Amount strings include the currency — some upstream fields like
amountDebitedWithCurrencyarrive as"ETB10.50". Our parser strips the optional 3-letter prefix.