LakiPay
LakiPay is an Ethiopian payment aggregator. One merchant account can collect via Telebirr, CBE Birr, M-Pesa, Awash, Kacha, EthSwitch, and a hosted checkout page.
Overview
Section titled “Overview”| Property | Value |
|---|---|
| Operator | LakiPay |
| Type | Payment aggregator |
| Country | Ethiopia |
| Currency | ETB, USD (CyberSource, if enabled on the account) |
| Flows | Direct STK/USSD (POST /api/v2/payment/direct) and hosted checkout (POST /api/v2/payment/checkout) |
| Auth | X-API-Key: public_key:secret_key |
| Webhooks | RSA-SHA256 (PKCS#1 v1.5) over a canonical payload string |
| Docs | lakipay.co/docs |
Credentials
Section titled “Credentials”Put these on the merchant provider config in the dashboard. Do not commit them.
| Field | Required | Description |
|---|---|---|
public_key | yes | LakiPay public key (pk_...) |
secret_key | yes | LakiPay secret key (sk_...) |
webhook_public_key | no | PEM from Settings → Security → Security Keys. If set, inbound webhook signatures are verified. Otherwise each callback is re-verified with LakiPay’s status API before the payment changes. |
default_medium | no | Rail used for direct charges when metadata does not override it. Default TELEBIRR. |
You can also pass a pre-joined api_key of the form pk_...:sk_....
How Zirzir charges
Section titled “How Zirzir charges”- Phone present → direct payment. Zirzir normalizes the number to
2519XXXXXXXXand sendsmedium(frommetadata.medium, elsedefault_medium, elseTELEBIRR). USD forcesCYBERSOURCE. - No phone → hosted checkout. Customer picks a rail on LakiPay’s page.
payment_urlis returned.
Webhook path: POST /api/v1/webhooks/lakipay. With server.public_url set, Zirzir sends this URL to LakiPay automatically.
Server mode
Section titled “Server mode”const zirzir = new Zirzir({ baseUrl: 'http://localhost:8080', apiKey: process.env.ZIRZIR_API_KEY!,})
await zirzir.charge({ amount: 100, txRef: 'ORD-1001', phone: '0911223344', provider: 'lakipay', metadata: { medium: 'TELEBIRR' },})Configure the lakipay provider on the merchant with your LakiPay keys first.
Standalone SDK
Section titled “Standalone SDK”const zirzir = new Zirzir({ provider: 'lakipay', credentials: { publicKey: process.env.LAKIPAY_PUBLIC_KEY!, secretKey: process.env.LAKIPAY_SECRET_KEY!, },})client = Zirzir(StandaloneConfig( provider="lakipay", credentials={ "public_key": os.environ["LAKIPAY_PUBLIC_KEY"], "secret_key": os.environ["LAKIPAY_SECRET_KEY"], },))zirzir login --server http://localhost:8080
zirzir provider set lakipay \ --public-key "$LAKIPAY_PUBLIC_KEY" \ --secret-key "$LAKIPAY_SECRET_KEY"
# Hosted checkout (no phone) or direct STK (with --phone)zirzir charge --amount 1 --currency ETB --provider lakipayzirzir charge --amount 1 --currency ETB --provider lakipay --phone 0911223344If LAKIPAY_PUBLIC_KEY and LAKIPAY_SECRET_KEY are already exported, zirzir provider set lakipay picks them up.