Documentation
Everything you need to verify a payment receipt from your own backend.
Authentication
Every request needs an API key created from your dashboard. Send it as a bearer token:
Authorization: Bearer mela_live_xxxxxxxxxxxxxxxxxxxx
Keys have a configurable daily request limit. Exceeding it returns HTTP 429.
POST /api/v1/verify
Verify a receipt by its transaction reference.
POST https://verifypayment.tec.et/api/v1/verify
Content-Type: application/json
Authorization: Bearer mela_live_...
{
"bank": "cbe", // required, see /banks for codes
"reference": "FT24123ABCDE",// required
"account_suffix": "12345", // required for banks that need it (see /banks)
"phone": "0911223344", // required for banks that need it
"expected_amount": 1500 // optional — flags a mismatch, doesn't hard-fail
}Response on success (HTTP 200):
{
"verified": true,
"bank": "cbe",
"reference": "FT24123ABCDE",
"receipt": {
"payer_name": "Abebe Kebede",
"receiver_name": "Kaleab Store",
"amount": 1500,
"currency": "ETB",
"date": "2026-08-10"
},
"amount_matches": true
}Response on failure (HTTP 404/400/429):
{
"verified": false,
"bank": "cbe",
"reference": "FT24123ABCDE",
"error": "No receipt found for this reference",
"error_code": "not_found"
}Possible error_code values: unknown_bank, invalid_reference, not_found, bank_disabled, relay_not_configured, upstream_error, parse_error.
POST /api/v1/verify/image
Verify from a receipt screenshot instead of typing the reference. Mela first tries to decode a QR code in the image; if there isn't one, it falls back to OCR.
POST https://verifypayment.tec.et/api/v1/verify/image Content-Type: multipart/form-data Authorization: Bearer mela_live_... image: <file> // required bank: cbe // optional — helps when OCR/QR can't tell which bank expected_amount: 1500 // optional
The response is the same shape as /verify, plus a `detected` object showing what was read from the image.
GET /api/v1/banks
No authentication required. Lists every bank Mela currently supports and their requirements.
curl https://verifypayment.tec.et/api/v1/banks
Rate limits & errors
Each API key has a daily request limit set when it's created (default 2,000/day). Requests over the limit get HTTP 429. Revoked keys get HTTP 401 immediately.