ETHQR Payments

Accept payments from any Ethiopian bank account. One QR code, 32+ banks, instant settlement. The simplest way to get paid in Ethiopia.

32+
Banks Supported
0.1%
Starting Fee
T+0
Settlement Time
24/7
Availability

Why choose ETHQR?

32+ Banks Connected

Customers pay from any major Ethiopian bank. CBE, Awash, Dashen, Abyssinia, and more — all through one integration.

Instant Settlement

Money hits your account in real-time. No waiting days for settlement — get paid as soon as the customer completes payment.

Lowest Fees

Just 0.1% to 0.3% per transaction. Compare that to 5%+ for international card payments. Keep more of what you earn.

Bank-Level Security

Built on EthSwitch infrastructure, regulated by the National Bank of Ethiopia. Your customers' money is safe.

How it works

1

Customer selects ETHQR at checkout

Your app displays ETHQR as a payment option alongside other methods.

2

You generate a QR code

Call our API to create a payment request. We return a QR code your customer can scan.

3

Customer scans with their bank app

Using any Ethiopian bank's mobile app, they scan the QR code and approve the payment.

4

You receive instant notification

Our webhook notifies your server the moment payment completes. Issue the receipt and fulfill the order.

Integration example

Here's all the code you need to accept ETHQR payments:

from mor_sdk import MorClient

client = MorClient(api_key="your_api_key")

# Create a payment request
payment = client.payments.create(
    amount=500.00,
    currency="ETB",
    method="ETHQR",
    description="Order #1234",
    callback_url="https://yoursite.com/webhook"
)

# Display the QR code to your customer
print(f"QR Code URL: {payment.qr_code_url}")
print(f"Expires in: {payment.expires_in_seconds} seconds")

# The customer scans with their bank app...
# When they pay, your webhook receives:
# {
#   "event": "payment.completed",
#   "payment_id": "pay_abc123",
#   "amount": 500.00,
#   "status": "completed"
# }

Handling the webhook

When a customer completes payment, we send a notification to your server. Here's how to handle it:

from flask import Flask, request
from mor_sdk import MorClient

app = Flask(__name__)
client = MorClient(api_key="your_api_key")

@app.route("/webhook", methods=["POST"])
def handle_webhook():
    # Verify the webhook signature
    signature = request.headers.get("X-MOR-Signature")
    payload = request.get_data()
    
    if not client.webhooks.verify(payload, signature):
        return "Invalid signature", 400
    
    event = request.json
    
    if event["event"] == "payment.completed":
        payment_id = event["payment_id"]
        
        # Create a receipt for the completed payment
        receipt = client.receipts.create(
            payment_id=payment_id,
            items=[{"name": "Order #1234", "price": 500.00}]
        )
        
        # Fulfill the order
        fulfill_order(payment_id, receipt.fiscal_code)
    
    return "OK", 200
Important: Always verify webhook signatures before processing. This prevents attackers from sending fake payment confirmations.

Supported banks

Your customers can pay from any of these banks — and more join the network regularly:

Commercial Bank of Ethiopia
Awash Bank
Dashen Bank
Bank of Abyssinia
Wegagen Bank
United Bank
Nib International Bank
Cooperative Bank of Oromia
Lion International Bank
Zemen Bank
Oromia Bank
Bunna Bank
Berhan Bank
Abay Bank
Addis International Bank
Debub Global Bank
+ 16 more banks

Fee comparison

Payment MethodFeeSettlementCoverage
ETHQR
0.1% - 0.3%Instant (T+0)32+ banks
Telebirr
1% - 2%Same dayTelebirr users
CBE Birr
1%Same dayCBE customers
International Cards
5%2-3 daysVisa, Mastercard

Testing ETHQR payments

In sandbox mode, you can simulate successful and failed payments without real money:

Simulate Success

Use any amount ending in 00 or 50

amount: 100.00 → success

Simulate Failure

Use any amount ending in 99

amount: 100.99 → declined

Questions about ETHQR? Check our payments FAQ or contact our payments team.