Nkwa Pay simplifies integrating mobile money into your payment flows across Cameroon. Our API supports both collections (customer-to-business) and disbursements (business-to-customer) in an asynchronous, high-performance environment designed for reliability.
Standardized endpoints for initiating and querying payment status
24/7 operations monitoring with automatic suspension of underperforming MNOs
Built‑in reconciliation for any “pending” transactions when MNO systems degrade
Webhooks (callbacks) to notify you of final payment outcomes
Multiple language SDKs to accelerate your integration process
The following sections introduce important aspects of mobile money integration and working with Nkwa Pay’s API to help you build a high-quality payment experience.
Our 24/7 payment operations team monitors all Mobile Network Operators (MNOs) on our platform for instability and downtime.
We automatically stop accepting payments to those MNOs if the success rate drops below acceptable thresholds.
This information is accessible from our availability endpoint, which you can poll to adjust your application’s behavior accordingly.Sometimes MNO systems experience degraded performance. When that happens, their APIs might have trouble returning the final status of payments (stuck in pending).
In such cases, Nkwa Pay ensures these payments are reconciled manually. This means that when using Nkwa Pay, all payments are always reconciled to their final status.
This reconciliation process takes a little longer than processing during normal operations but guarantees payment status integrity.
Nkwa Pay’s API is fully asynchronous. This design is necessary to provide high performance and reliable payment infrastructure across unreliable mobile networks.When you create a payment (collection or disbursement), you’ll get an initial response that confirms whether the payment was accepted for processing. There are two ways to determine the final status of a payment:
Configure a callback URL in our portal to automatically receive notifications when a payment reaches its final status.
You’ll need to implement a callback handler in your application that can receive and process these notifications.Your endpoint must accept an HTTP POST request containing:Headers
ts — Timestamp: Milliseconds since Unix epoch. It indicates when the webhook event was generated on our servers.sig — Signature: A base64 encoded cryptographic signature used to verify the authenticity of the webhook.
function verifySignature(publicKey, message, signatureBase64): // Step 1: Decode the signature from Base64 signature = Base64Decode(signatureBase64) // Step 2: Compute the SHA-256 digest of the message digest = SHA256(message) // Step 3: Use your cryptography library to verify that // 'signature' is a valid signature of 'digest' // using the provided 'publicKey'. isValid = PublicKeyVerify( publicKey = publicKey, message = digest, signature = signature, algorithm = "RSA", hash = "SHA-256", padding = "PKCS#1 v1.5" )
Our public key can be found in the settings section of the merchant dashboard.
Use the corresponding Get payment/:id endpoint periodically to check if the payment has reached its final status.
While simpler to implement, this approach is less efficient and may introduce delays in payment status awareness.
Retry Logic: Design your application to handle temporary MNO unavailability gracefully
MNO Monitoring: Poll /availability regularly (e.g., once per hour) to detect MNO degradations and adjust customer messaging accordingly
Error Handling: Implement comprehensive error handling to manage various payment failure scenarios
Idempotency: Generate and store unique transaction references to prevent duplicate payments
Testing: Thoroughly test your integration in the sandbox environment before moving to production
Security: Protect API keys and follow security best practices for handling payment data
By following these implementation guidelines, you’ll create a robust and reliable mobile money payment experience for your customers using Nkwa Pay.
{"docsConfig":{"$schema":"https://mintlify.com/docs.json","theme":"mint","name":"Nkwa","colors":{"primary":"#09090b","light":"#EAE6E0","dark":"#18181b"},"favicon":"/logo/nkwa.png","logo":{"light":"https://mintcdn.com/nkwa/ABPvyqKx9GPzooC-/logo/nkwa.png?fit=max\u0026auto=format\u0026n=ABPvyqKx9GPzooC-\u0026q=85\u0026s=b00a6f8ae5684647aaabb2a74ef90e7f","dark":"https://mintcdn.com/nkwa/ABPvyqKx9GPzooC-/logo/nkwa.png?fit=max\u0026auto=format\u0026n=ABPvyqKx9GPzooC-\u0026q=85\u0026s=b00a6f8ae5684647aaabb2a74ef90e7f"},"background":{"decoration":null,"color":{"light":"#fafaf9","dark":"#0c0a09"}},"navbar":{"links":[{"label":"Support","href":"mailto:info@nkwa.com"}],"primary":{"type":"button","label":"Dashboard","href":"https://mynkwa.com"}},"footer":{"socials":{"x":"https://x.com/mynkwa","github":"https://github.com/nkwa","linkedin":"https://www.linkedin.com/company/nkwa-app"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"nkwa","hasAudioNarration":false,"actualSubdomain":"nkwa","customDomains":["docs.mynkwa.com"],"gitSource":{"type":"github","owner":"nkwa","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6a21a6a43d3709865082e4b8","collectionId":"e80ae8c6-b6de-4b87-a59f-89defeb3448b","schemaVersion":"v2"},"feedback":{"thumbs":false},"entitlements":{},"buildId":"6ae920ff380856db55842a29:success","clientVersion":"0.0.4076","searchFilterCounts":[{"language":"default","tag":"Documentation","count":24},{"language":"default","tag":"Nkwa Pay","count":14},{"language":"default","tag":"Get Started","count":10},{"language":"default","tag":"API Reference","count":6},{"language":"default","tag":"API Documentation","count":1},{"language":"default","tag":"Home","count":1}]},"assistantConfig":{},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"nkwapay/implementation","slug":"/nkwapay/implementation","pageMetadata":{"title":"Implementation Guide","description":"Learn how to integrate Nkwa Pay's mobile money payment infrastructure with our asynchronous API design, webhook system, and MNO stability features.","href":"/nkwapay/implementation","hidden":false},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Learn how to integrate Nkwa Pay’s mobile money payment infrastructure with our asynchronous API design, webhook system, and MNO stability features.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Tip,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`1`,id:`implementation-guide`,children:`Implementation Guide`}),`\n`,_jsx(_components.p,{children:`Nkwa Pay simplifies integrating mobile money into your payment flows across Cameroon. Our API supports both collections (customer-to-business) and disbursements (business-to-customer) in an asynchronous, high-performance environment designed for reliability.`}),`\n`,_jsx(Heading,{level:`2`,id:`key-features-and-architecture`,children:`Key Features and Architecture`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Standardized endpoints`}),` for initiating and querying payment status`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`24/7 operations monitoring`}),` with automatic suspension of underperforming MNOs`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Built‑in reconciliation`}),` for any “pending” transactions when MNO systems degrade`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Webhooks (callbacks)`}),` to notify you of final payment outcomes`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Multiple language SDKs`}),` to accelerate your integration process`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`The following sections introduce important aspects of mobile money integration and working with Nkwa Pay’s API to help you build a high-quality payment experience.`}),`\n`,_jsx(Heading,{level:`2`,id:`mno-stability-management`,children:`MNO Stability Management`}),`\n`,_jsx(_components.p,{children:`Our 24/7 payment operations team monitors all Mobile Network Operators (MNOs) on our platform for instability and downtime.\nWe automatically stop accepting payments to those MNOs if the success rate drops below acceptable thresholds.\nThis information is accessible from our availability endpoint, which you can poll to adjust your application’s behavior accordingly.`}),`\n`,_jsx(_components.p,{children:`Sometimes MNO systems experience degraded performance. When that happens, their APIs might have trouble returning the final status of payments (stuck in pending).\nIn such cases, Nkwa Pay ensures these payments are reconciled manually. This means that when using Nkwa Pay, all payments are always reconciled to their final status.\nThis reconciliation process takes a little longer than processing during normal operations but guarantees payment status integrity.`}),`\n`,_jsx(Heading,{level:`2`,id:`asynchronous-api-with-webhooks`,children:`Asynchronous API with Webhooks`}),`\n`,_jsx(_components.p,{children:`Nkwa Pay’s API is fully asynchronous. This design is necessary to provide high performance and reliable payment infrastructure across unreliable mobile networks.`}),`\n`,_jsx(_components.p,{children:`When you create a payment (collection or disbursement), you’ll get an initial response that confirms whether the payment was accepted for processing. There are two ways to determine the final status of a payment:`}),`\n`,_jsx(Heading,{level:`3`,id:`1-webhook-callbacks-recommended`,children:`1. Webhook Callbacks (Recommended)`}),`\n`,_jsx(_components.p,{children:`Configure a callback URL in our portal to automatically receive notifications when a payment reaches its final status.\nYou’ll need to implement a callback handler in your application that can receive and process these notifications.`}),`\n`,_jsx(_components.p,{children:`Your endpoint must accept an HTTP POST request containing:`}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Headers`})}),`\n`,_jsx(CodeBlock,{numberOfLines:`3`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`X-Signature: \u003csig>`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`X-Timestamp: \u003cts>`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Body`})}),`\n`,_jsxs(_components.p,{children:[`The request body contains the payment object. Refer to the `,_jsx(_components.a,{href:`https://docs.mynkwa.com/api-reference/endpoint/nkwapay/collect`,children:`Collection or Disbursement API reference`}),` for the full object definition.`]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Webhooks are currently not retried. Your endpoint must return a 200 response if the event is received successfully.`})}),`\n`,_jsx(Heading,{level:`4`,id:`understanding-the-webhook-fields`,children:`Understanding the Webhook Fields`}),`\n`,_jsx(_components.p,{children:`ts — Timestamp: Milliseconds since Unix epoch. It indicates when the webhook event was generated on our servers.`}),`\n`,_jsx(_components.p,{children:`sig — Signature: A base64 encoded cryptographic signature used to verify the authenticity of the webhook.`}),`\n`,_jsx(Heading,{level:`4`,id:`verify-signature`,children:`Verify signature`}),`\n`,_jsx(_components.p,{children:`Recompose the message`}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`msg = ts + your_callback_url + json_body`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`Then verify the message as`}),`\n`,_jsx(CodeBlock,{numberOfLines:`21`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`21`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`function verifySignature(publicKey, message, signatureBase64):`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` // Step 1: Decode the signature from Base64`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` signature = Base64Decode(signatureBase64)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` // Step 2: Compute the SHA-256 digest of the message`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` digest = SHA256(message)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` // Step 3: Use your cryptography library to verify that`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` // 'signature' is a valid signature of 'digest'`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` // using the provided 'publicKey'.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` isValid = PublicKeyVerify(`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` publicKey = publicKey,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` message = digest,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` signature = signature,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` algorithm = \"RSA\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` hash = \"SHA-256\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` padding = \"PKCS#1 v1.5\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` )`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`Our public key can be found in the settings section of the merchant dashboard.`})}),`\n`,_jsx(Heading,{level:`3`,id:`2-polling`,children:`2. Polling`}),`\n`,_jsxs(_components.p,{children:[`Use the corresponding `,_jsx(_components.code,{children:`Get payment/:id`}),` endpoint periodically to check if the payment has reached its final status.\nWhile simpler to implement, this approach is less efficient and may introduce delays in payment status awareness.`]}),`\n`,_jsx(Heading,{level:`2`,id:`implementing-webhooks`,children:`Implementing Webhooks`}),`\n`,_jsx(_components.p,{children:`When implementing your callback handler, consider the following best practices:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Public Accessibility`}),`: Your endpoint should be accessible to our platform`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`IP Whitelisting`}),`: If you use IP whitelisting, allow our sending IPs: `,_jsx(_components.code,{children:`[ip1, ip2, ip3]`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Authentication Exclusion`}),`: Exclude the callback endpoint from your application’s regular authentication system`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Idempotency`}),`: Your endpoint must be idempotent to handle potential duplicate callbacks`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`HTTP Method`}),`: Accept POST requests with the payment details in the request body`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Response Code`}),`: Return HTTP 200 OK to acknowledge receipt of the callback`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`SSL Security`}),`: Use SSL certificates from a trusted CA`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Retry Handling`}),`: We will attempt to deliver callbacks for 15 minutes, retrying every minute if we don’t receive a `,_jsx(_components.code,{children:`200 OK`})]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`integration-best-practices`,children:`Integration Best Practices`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Retry Logic`}),`: Design your application to handle temporary MNO unavailability gracefully`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`MNO Monitoring`}),`: Poll `,_jsx(_components.code,{children:`/availability`}),` regularly (e.g., once per hour) to detect MNO degradations and adjust customer messaging accordingly`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Error Handling`}),`: Implement comprehensive error handling to manage various payment failure scenarios`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Idempotency`}),`: Generate and store unique transaction references to prevent duplicate payments`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Testing`}),`: Thoroughly test your integration in the sandbox environment before moving to production`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Security`}),`: Protect API keys and follow security best practices for handling payment data`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`By following these implementation guidelines, you’ll create a robust and reliable mobile money payment experience for your customers using Nkwa Pay.`})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Implementation Guide","description":"Learn how to integrate Nkwa Pay's mobile money payment infrastructure with our asynchronous API design, webhook system, and MNO stability features.","href":"/nkwapay/implementation","hidden":false}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Implementation Guide","slug":"implementation-guide","depth":1,"children":[]},{"title":"Key Features and Architecture","slug":"key-features-and-architecture","depth":2,"children":[]},{"title":"MNO Stability Management","slug":"mno-stability-management","depth":2,"children":[]},{"title":"Asynchronous API with Webhooks","slug":"asynchronous-api-with-webhooks","depth":2,"children":[{"title":"1. Webhook Callbacks (Recommended)","slug":"1-webhook-callbacks-recommended","depth":3,"children":[]},{"title":"Understanding the Webhook Fields","slug":"understanding-the-webhook-fields","depth":4,"children":[]},{"title":"Verify signature","slug":"verify-signature","depth":4,"children":[]},{"title":"2. Polling","slug":"2-polling","depth":3,"children":[]}]},{"title":"Implementing Webhooks","slug":"implementing-webhooks","depth":2,"children":[]},{"title":"Integration Best Practices","slug":"integration-best-practices","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"nkwa","siteName":"Nkwa","title":"Implementation Guide - Nkwa","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2025-11-17T01:43:36.878Z","originalFileLocation":"nkwapay/implementation.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Learn how to integrate Nkwa Pay\u0026#x27;s mobile money payment infrastructure with our asynchronous API design, webhook system, and MNO stability features.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Nkwa\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/nkwa/BY3tx4Sf0Dj6R37z/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/nkwa/BY3tx4Sf0Dj6R37z/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/nkwa/BY3tx4Sf0Dj6R37z/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/nkwa/BY3tx4Sf0Dj6R37z/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/nkwa/BY3tx4Sf0Dj6R37z/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/nkwa/BY3tx4Sf0Dj6R37z/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/nkwa/BY3tx4Sf0Dj6R37z/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/nkwa/BY3tx4Sf0Dj6R37z/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/nkwa/BY3tx4Sf0Dj6R37z/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Implementation Guide - Nkwa\">\u003cmeta data-mint-head property=\"og:description\" content=\"Learn how to integrate Nkwa Pay\u0026#x27;s mobile money payment infrastructure with our asynchronous API design, webhook system, and MNO stability features.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Nkwa\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.mynkwa.com/nkwapay/implementation\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://nkwa.mintlify.site/_mintlify/api/og/v2?division=Nkwa+Pay\u0026amp;title=Implementation+Guide\u0026amp;description=Learn+how+to+integrate+Nkwa+Pay%27s+mobile+money+payment+infrastructure+with+our+asynchronous+API+design%2C+webhook+system%2C+and+MNO+stability+features.\u0026amp;theme=f73ca055bfbd6e3dfe46e38a\u0026amp;signature=47b16b90f2a905962e8986cf2dd00f33966f9cf73384cbcb9ad30c80de48c536\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Implementation Guide - Nkwa\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Learn how to integrate Nkwa Pay\u0026#x27;s mobile money payment infrastructure with our asynchronous API design, webhook system, and MNO stability features.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://nkwa.mintlify.site/_mintlify/api/og/v2?division=Nkwa+Pay\u0026amp;title=Implementation+Guide\u0026amp;description=Learn+how+to+integrate+Nkwa+Pay%27s+mobile+money+payment+infrastructure+with+our+asynchronous+API+design%2C+webhook+system%2C+and+MNO+stability+features.\u0026amp;theme=f73ca055bfbd6e3dfe46e38a\u0026amp;signature=47b16b90f2a905962e8986cf2dd00f33966f9cf73384cbcb9ad30c80de48c536\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/nkwa/BY3tx4Sf0Dj6R37z/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Nkwa\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#09090b\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.mynkwa.com/nkwapay/implementation\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/nkwapay/implementation.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.mynkwa.com/#organization\",\"name\":\"Nkwa\",\"url\":\"https://docs.mynkwa.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/nkwa/ABPvyqKx9GPzooC-/logo/nkwa.png?fit=max\u0026auto=format\u0026n=ABPvyqKx9GPzooC-\u0026q=85\u0026s=b00a6f8ae5684647aaabb2a74ef90e7f\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.mynkwa.com#website\",\"name\":\"Nkwa\",\"url\":\"https://docs.mynkwa.com\",\"publisher\":{\"@id\":\"https://docs.mynkwa.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.mynkwa.com/nkwapay/implementation#webpage\",\"url\":\"https://docs.mynkwa.com/nkwapay/implementation\",\"name\":\"Implementation Guide\",\"description\":\"Learn how to integrate Nkwa Pay's mobile money payment infrastructure with our asynchronous API design, webhook system, and MNO stability features.\",\"dateModified\":\"2025-11-17T01:43:36.878Z\",\"isPartOf\":{\"@id\":\"https://docs.mynkwa.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.mynkwa.com/nkwapay/implementation#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.mynkwa.com/nkwapay/implementation#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Get Started\",\"item\":\"https://docs.mynkwa.com/nkwapay/introduction\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Nkwa Pay\",\"item\":\"https://docs.mynkwa.com/nkwapay/introduction\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Implementation Guide\",\"item\":\"https://docs.mynkwa.com/nkwapay/implementation\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.mynkwa.com/nkwapay/implementation#article\",\"headline\":\"Implementation Guide\",\"name\":\"Implementation Guide\",\"description\":\"Learn how to integrate Nkwa Pay's mobile money payment infrastructure with our asynchronous API design, webhook system, and MNO stability features.\",\"url\":\"https://docs.mynkwa.com/nkwapay/implementation\",\"mainEntityOfPage\":{\"@id\":\"https://docs.mynkwa.com/nkwapay/implementation#webpage\"},\"dateModified\":\"2025-11-17T01:43:36.878Z\",\"publisher\":{\"@id\":\"https://docs.mynkwa.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.mynkwa.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Nkwa\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Nkwa","nav":{"global":null,"anchors":[{"anchor":"Documentation","icon":"book-open","tabs":[{"tab":"Documentation","groups":[{"group":"Get Started","pages":[{"group":"Nkwa Pay","pages":[{"title":"Introduction","description":"Nkwa Pay provides a unified API and customer portal to integrate mobile money payments across Cameroon into your applications, supporting both MTN and Orange mobile networks with real-time transaction monitoring.","href":"/nkwapay/introduction"},{"title":"Implementation Guide","href":"/nkwapay/implementation"},{"title":"Using the API","description":"Learn how to authenticate and use the Nkwa Pay API, including environment endpoints, API key management, and additional security features.","href":"/nkwapay/using-the-api"},{"title":"Collection","href":"/nkwapay/collection"},{"title":"Disbursement","href":"/nkwapay/disbursement"},{"title":"Refunds","href":"/nkwapay/refund"},{"title":"SDK","href":"/nkwapay/sdk"},{"title":"Example Integrations","href":"/nkwapay/examples"},{"title":"FAQ","href":"/nkwapay/faq"}]}]}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/api-reference/introduction"}]}]},{"anchor":"Home","icon":"book-open-cover","pages":[{"title":"Home","href":"/introduction"}]},{"anchor":"Blog \u0026 Tutorials","href":"https://mynkwa.medium.com","icon":"newspaper"},{"anchor":"GitHub","href":"https://github.com/nkwa","icon":"github"}]},"basePath":"","title":"Implementation Guide - Nkwa","buildId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","deploymentId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","dynamics":[],"chunks":[]}