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-blocks

Clean 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
Full API docs GitHub repoContributing guide