ETHQR Payments
Accept payments from any Ethiopian bank account. One QR code, 32+ banks, instant settlement. The simplest way to get paid in Ethiopia.
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
Customer selects ETHQR at checkout
Your app displays ETHQR as a payment option alongside other methods.
You generate a QR code
Call our API to create a payment request. We return a QR code your customer can scan.
Customer scans with their bank app
Using any Ethiopian bank's mobile app, they scan the QR code and approve the payment.
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", 200Supported banks
Your customers can pay from any of these banks — and more join the network regularly:
Fee comparison
| Payment Method | Fee | Settlement | Coverage |
|---|---|---|---|
ETHQR | 0.1% - 0.3% | Instant (T+0) | 32+ banks |
Telebirr | 1% - 2% | Same day | Telebirr users |
CBE Birr | 1% | Same day | CBE customers |
International Cards | 5% | 2-3 days | Visa, 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 → successSimulate Failure
Use any amount ending in 99
amount: 100.99 → declinedNext steps
Questions about ETHQR? Check our payments FAQ or contact our payments team.