This page collects the most frequent questions from developers and business teams integrating LigdiCash. Each answer points to the detailed documentation for follow-up reading.Documentation Index
Fetch the complete documentation index at: https://developers.ligdicash.com/llms.txt
Use this file to discover all available pages before exploring further.
Account and access
How do I create a LigdiCash merchant account?
How do I create a LigdiCash merchant account?
How do I get my API keys?
How do I get my API keys?
Apikey and API_TOKEN are then available in the Dashboard.See API project and Authentication.Can I have multiple API projects on the same account?
Can I have multiple API projects on the same account?
Is there a sandbox to test without paying?
Is there a sandbox to test without paying?
Technical integration
What's the difference between hosted payin and direct payin?
What's the difference between hosted payin and direct payin?
- Hosted payin: the customer is sent to a payment page hosted by LigdiCash. Simple integration, UI managed by LigdiCash, less control.
- Direct payin: the merchant fully owns the interface and submits the payment via API. More UX control, but more complex integration and operator-specific.
Can I show the payment page in an iframe?
Can I show the payment page in an iframe?
Why must the customer field stay empty in hosted payin?
Why must the customer field stay empty in hosted payin?
customer, LigdiCash filters the payment page to show only the operators tied to that number, hiding the other options. Leave customer: "" so your customer can freely pick their operator.See Hosted payin pitfalls.My payment popup is blocked by the browser. How do I work around it?
My payment popup is blocked by the browser. How do I work around it?
window.open('about:blank') at the moment of the user click (before the await fetch), then navigate to the payment URL once the response is received.See Redirect the customer.How do I identify my transaction in the callback if the token changes?
How do I identify my transaction in the callback if the token changes?
token present in the callback is different from the token returned at creation. Don’t rely on it to look up your order. The reliable method is to inject your own order identifier into custom_data at creation, then look it up via keyof_customdata === "transaction_id" in the callback.See The transaction_id pattern and Parse custom_data.Why is my callback called twice for the same transaction?
Why is my callback called twice for the same transaction?
application/x-www-form-urlencoded and one as application/json. The content is identical. Implement deduplication (check whether the transaction is already processed in your database before acting).See Callback idempotency.How do I secure my callback endpoint?
How do I secure my callback endpoint?
confirm endpoint with the token you stored at invoice creation.See Callback security.Is the withdrawal/confirm endpoint GET or POST?
Is the withdrawal/confirm endpoint GET or POST?
GET /pay/v01/withdrawal/confirm/ endpoint is called with GET and the token in the query string. There’s an inconsistency in the existing documentation.See Verify payout status.What's the difference between wallet payout and direct mobile money payout?
What's the difference between wallet payout and direct mobile money payout?
/withdrawal/create: sends to the recipient’s LigdiCash wallet. The funds can stay in the wallet (top_up_wallet: 1) or be automatically transferred to their linked mobile money (top_up_wallet: 0)./straight/payout: sends directly to the mobile money number, no intermediate wallet. Slower, but doesn’t require the recipient to have a LigdiCash account.
How do I handle the different validation modes per operator?
How do I handle the different validation modes per operator?
- USSD OTP — the customer generates an OTP by dialing a USSD code before you submit. One API request.
- USSD Push — you submit with
otp: "", the operator sends a USSD push screen to the customer, who confirms with their PIN. One API request. - Guided USSD — you submit with
otp: "", the operator sends an SMS with instructions and a USSD code to dial. One API request. - SMS OTP — you first submit with
otp: "", the operator sends an OTP by SMS, you resubmit with the entered OTP. Two API requests.
Security
How do I protect my API keys?
How do I protect my API keys?
- Never expose
ApikeyandAuth Tokenon the client side (browser, mobile app). - Always make LigdiCash calls from your backend.
- Use environment variables, never constants in source code.
- Regenerate keys immediately from the Dashboard if compromised.
What do I do if my API keys are compromised?
What do I do if my API keys are compromised?
How do I avoid duplicate transactions?
How do I avoid duplicate transactions?
- Callback deduplication: before processing a callback, check in your database whether the
transaction_idis already processed. - Systematic re-verification: call the
confirmendpoint with the creation token to validate the real state, rather than trusting the received callback payload.
Business and operations
Which countries and operators are supported?
Which countries and operators are supported?
What currency does the API use?
What currency does the API use?
What are the minimum and maximum transaction amounts?
What are the minimum and maximum transaction amounts?
What are the settlement delays to my bank account?
What are the settlement delays to my bank account?
How do I integrate LigdiCash on a WooCommerce store?
How do I integrate LigdiCash on a WooCommerce store?
Are there official SDKs for my language?
Are there official SDKs for my language?
How do I go live after testing?
How do I go live after testing?
- You complete your integration and tests on the temporary account.
- The LigdiCash technical team runs validation tests on your integration.
- A formal record (PV) is signed between you and LigdiCash to officially close the integration phase.
- The technical team enables your production project. Only your keys change — the code stays the same.
