Skip to content

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.


PropertyValue
OperatorLakiPay
TypePayment aggregator
CountryEthiopia
CurrencyETB, USD (CyberSource, if enabled on the account)
FlowsDirect STK/USSD (POST /api/v2/payment/direct) and hosted checkout (POST /api/v2/payment/checkout)
AuthX-API-Key: public_key:secret_key
WebhooksRSA-SHA256 (PKCS#1 v1.5) over a canonical payload string
Docslakipay.co/docs

Put these on the merchant provider config in the dashboard. Do not commit them.

FieldRequiredDescription
public_keyyesLakiPay public key (pk_...)
secret_keyyesLakiPay secret key (sk_...)
webhook_public_keynoPEM 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_mediumnoRail 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_....


  • Phone present → direct payment. Zirzir normalizes the number to 2519XXXXXXXX and sends medium (from metadata.medium, else default_medium, else TELEBIRR). USD forces CYBERSOURCE.
  • No phone → hosted checkout. Customer picks a rail on LakiPay’s page. payment_url is returned.

Webhook path: POST /api/v1/webhooks/lakipay. With server.public_url set, Zirzir sends this URL to LakiPay automatically.


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.


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"],
},
))

Terminal window
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 lakipay
zirzir charge --amount 1 --currency ETB --provider lakipay --phone 0911223344

If LAKIPAY_PUBLIC_KEY and LAKIPAY_SECRET_KEY are already exported, zirzir provider set lakipay picks them up.