API Documentation
Explore endpoints, request/response contracts, and production-ready integration patterns.
Authentication
Authenticate server-side requests using the x-api-key header. Keep API keys private.
x-api-key: <your-api-key>
Content-Type: application/jsonBase URLs
https://YOUR_KERSHI_HOST/apiBank Fields
| Bank | Required | Fields |
|---|---|---|
cbe | Required | Reference number, Account suffix (last 8 digits) |
telebirr | Required | Transaction number |
dashen | Required | Reference number |
abyssinia | Required | Reference number, Account suffix (5 digits) |
cbebirr | Required | Receipt number, Phone (251XXXXXXXXX) |
awash | Required | Receipt URL or token |
mpesa | Required | Transaction number |
sinqe | Required | Receipt URL or token |
ebirr | Required | Receipt URL or token, Phone (optional) |
Settlement Matching
Settlement account matching verifies that a valid receipt was paid into the intended wallet or bank account.
Save the receiver once, then send its settlementAccountId. The full value is AES-GCM encrypted; API responses return only masked values. Ethiopian phone formats and bank-account suffixes are normalized before matching.
{
"provider": "cbe",
"reference": "FT26262VQ6GV",
"accountSuffix": "35207333",
"amountMinor": 13500,
"settlementAccountId": "<saved-account-id>"
}{
"verificationStatus": "verified",
"assurance": "authoritative",
"amountMatch": true,
"recipientMatch": true,
"reference": "FT••••GV",
"source": "bank_receipt"
}Endpoints
/api/v1/verificationsSubmit a verification
Submit or review a bank payment verification request.
curl -X POST 'https://YOUR_KERSHI_HOST/api/v1/verifications' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer $KERSHI_API_KEY' \
-H 'Idempotency-Key: <unique-request-id>' \
-d '{
"provider": "cbe",
"reference": "<receipt-reference>",
"accountSuffix": "<8-digits>",
"amountMinor": 13500,
"settlementAccountId": "<saved-account-id>"
}'200 · Completed 202 · Processing 400 · Invalid request
/api/v1/verifications/:requestIdRetrieve verification result
Submit or review a bank payment verification request.
curl -X POST 'https://YOUR_KERSHI_HOST/api/v1/verifications' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer $KERSHI_API_KEY' \
-H 'Idempotency-Key: <unique-request-id>' \
-d '{
"provider": "cbe",
"reference": "<receipt-reference>",
"accountSuffix": "<8-digits>",
"amountMinor": 13500,
"settlementAccountId": "<saved-account-id>"
}'200 · Completed 202 · Processing 400 · Invalid request
/api/v1/webhook-endpoints/:id/testTest a webhook endpoint
Sends a sample webhook payload to validate your endpoint.
{
"webhookUrl": "https://your-app.example/webhooks/verify",
"scenario": "success"
}200 · Completed 202 · Processing 400 · Invalid request
Webhooks
Delivered by the worker after a verification reaches a terminal state.
{
"event": "verification.completed",
"requestId": "sample-request-id",
"data": {
"processingStatus": "completed",
"status": "success",
"verified": true,
"bank": "cbe",
"amount": "1500",
"currency": "ETB",
"referenceNumber": "DEMO-12345678"
}
}See production integration settings.
See production integration settings.
See production integration settings.
See production integration settings.
See production integration settings.
See production integration settings.
Rate Limits & Credits
Requests consume the account’s verification credits and are subject to the configured rate limits.
{
"error": "rate_limit_exceeded",
"retryAfter": 60
}Permissions & Errors
Use permissions appropriate to your integration. Handle pending results, invalid fields, exhausted credits, and upstream errors.
{
"success": true,
"message": "API key created. Save this key - it will not be shown again.",
"data": {
"key": "KERSHI_your_key_here",
"apiKey": {
"name": "Production Key",
"enabled": true,
"permissions": {
"verification": [
"read",
"write"
],
"metrics": [
"read"
],
"uptime": [
"read"
]
}
}
}
}Other Endpoints
GET /api/metrics
GET /api/reports
GET /api/uptime
GET /api/public-uptime
GET /api/credits
GET /api/profile
GET /api/bank-accounts
GET /api/examples
GET /api/health
GET /api/prometheus