Verify any Ethiopian payment with one POST
No API key. No signup. No rate limit. The cheki API is free and open source. Just POST to /api/verify.
curl -X POST https://chekiapp.vercel.app/api/verify \
-H "Content-Type: application/json" \
-d '{
"bank": "cbe",
"reference": "FT26140P01YB",
"accountNumber": "1000560536171"
}'Response
{
"success": true,
"verified": true,
"bank": "Commercial Bank of Ethiopia",
"reference": "FT26140P01YB",
"amount": 20000,
"currency": "ETB",
"senderName": "Mr Mohammed Abdulwasi Reshid",
"receiverName": "SAMI ADIL ZEKARIA",
"date": "5/20/2026 7:29:00 PM",
"durationMs": 7782,
"sourceUrl": "https://apps.cbe.com.et:100/?id=FT26140P01YB60536171"
}API endpoints
POST
/api/verify
Verify a single receipt. Send bank code, reference, and (for CBE/BOA) account number.
POST
/api/verify/batch
Verify up to 50 receipts at once. Send an array of receipt objects.
GET
/api/banks
List all supported banks and their verification status.
GET
/api/health
Check API health and per-bank endpoint latency.
GET
/api/receipt
Download the raw receipt file (PDF/HTML) from the bank endpoint.
SDKs and libraries
npm install cheki-verify
import { Cheki } from "cheki";
const cheki = new Cheki();
const result = await cheki.verify("cbe", "FT...", {
accountNumber: "1000560536171"
});Self-hosting with Docker
git clone https://github.com/1RB/cheki.git
cd cheki
docker-compose up -d
# API available at http://localhost:3000/api/verify
# Self-hosting on an Ethiopian IP bypasses Telebirr/M-Pesa geo-blocksClean architecture
cheki v1.0 uses hexagonal architecture (ports & adapters). The core domain has zero runtime dependencies. Bank parsers are pluggable plugins. Configuration lives in a single JSON manifest.
Result types66 testsPluggable parsersManifest-drivenCLI toolCONTRIBUTING.md