Get started
About ten minutes, and nothing to install. You need a phone number that can receive an MTN MoMo or Orange Money prompt β in sandbox that can be any number, because nothing real is charged.
-
Create your account
Sign up at new.app.kwiknkap.com with your phone number and email, then create your business profile: name, category, and the phone number money settles to.
You can build immediately. Sandbox works the moment the account exists β verification is not a gate on development, only on live money.
Start identity and business verification now anyway, because it takes days rather than minutes and it is what unlocks
kn_sk_live_keys. Doing it in parallel with your integration means you are not waiting on it at the end.β You should now see the dashboard, with a Developers section in the sidebar.
-
Get a sandbox API key
In Developers β API keys, create a key. Choose the scopes it needs and nothing more β for a checkout server that is
payments:writeandpayments:read, which is enough to take money and read back status, and not enough to touch invoices or send anything. See Scopes.The key is shown once. Put it in your server's environment straight away:
CodeYour key's prefix is the environment.
kn_sk_test_reaches sandbox;kn_sk_live_reaches live and moves real money. There is no environment header to get wrong β see Environments and API keys.A secret key is a bearer credential. Never put it in a mobile app, a browser bundle, or a repository. Anything prefixed
VITE_orNEXT_PUBLIC_is compiled into the client bundle, which is the most common way a key becomes public.β You should now see a key beginning
kn_sk_test_, stored somewhere your server can read and your repository cannot. -
Collect your first payment
Charge a wallet. The
Idempotency-Keymeans a network retry cannot charge twice β why that matters.CodeCodePENDINGis the correct answer, and it is not "paid". The customer has been prompted on their phone and has not decided yet. Read How a payment works before you write the code that acts on this β it is the single most expensive misunderstanding in this API.β You should now see a
201withstatus: PENDINGand an id beginningknpay_test_. -
Find out what happened
Poll while you are developing:
CodeIn production, take the outcome from a webhook instead: it arrives the moment the payment resolves, is signed so you can trust it, and is retried for three days if your endpoint is down.
A
FAILEDpayment carries afailure_codeyou can act on.insufficient_fundsis worth retrying after the customer tops up;customer_account_issueis not.β You should now see the payment settle to
SUCCESSorFAILED, with a failure code if it failed. -
Go live
Before switching the prefix:
- Verification approved β no
kn_sk_live_key exists until it is. - You fulfil on the transition into
SUCCESS, never on seeing it, so a duplicate webhook cannot ship twice. How. - Every create call sends an
Idempotency-Key. - Your webhook endpoint verifies signatures and answers
2xxin under a few seconds. - You have triggered a real failure in sandbox and shown your customer something useful. Testing.
- Live keys are scoped to what that consumer actually does, and are not in your repository.
Then mint a
kn_sk_live_key, swap the environment variable, and deploy. Nothing else changes: same URL, same payloads, same codes. - Verification approved β no
Where to go next
- How a payment works β the concept everything else depends on
- Choosing how to collect β direct charge, payment link, invoice or storefront
- Managing API keys β rotation, revocation and IP allowlisting
- Build with an AI agent β if you are integrating with Claude Code, Codex or Cursor

