Integrating Monnify

Connect your platform and go live with ease.

Must Read: Your Pre-Integration Checklist


Integrating Monnify is straightforward, but jumping straight into code without a clear plan can cause delayed launches.

To help your team begin production on time, we've broken the pre-integration process into three focused steps:

  1. Step 1: Account Setup
  2. Step 2: Plan With the Documentation
  3. Step 3: Incorporate the Code Integration Guidelines


Step 1: Account Setup

Before you begin coding, you need a properly configured Monnify account.

  1. Complete Your KYC Verification: Sign up on Monnify and submit your business details. Not sure what documents you need? See the KYC Checklist.
  2. Retrieve Your Credentials: For API integrations, you'll need your unique identifiers. On your Monnify dashboard menu, navigate to Developers to copy your API Key, Secret Key, and Contract Code.


Step 2: Plan With the Documentation

Don't just build, build the right thing for your business.

  1. Map Your Payment Use Case: Are you assigning virtual accounts to returning customers (reserved accounts)? Building a checkout page? Automating bulk payouts to vendors? Defining your use case upfront helps you select the right integration method and avoid rework later.
  2. Read What’s relevant to You: You don’t need to read the entire API Docs, but you must read the guide for the specific feature you’re implementing. Security requirements vary by feature; for example, our Disbursement (Payout) API requires OTPs to protect your funds.
  3. Understand Your Environments: Always begin in Test Mode (Sandbox). Understand the key differences between the sandbox and live (production) environments before you begin processing real transactions.


Step 3: Incorporate the Code Integration Guidelines

When integrating Monnify, your engineering team should integrate the following guidelines to protect your revenue:

  1. Secure Every Request: All calls to the Monnify API must be authenticated using an OAuth 2.0 Bearer Token.
  2. Use Unique Payment References: To initialize a payment, your backend will call the Initialize Transaction endpoint, then pass the amount, customer details, and a paymentReference. Your paymentReference must be strictly unique for every payment attempt. Reusing the same reference is a common cause of failed API calls.
  3. Leverage Webhooks: Most payment methods are asynchronous (confirmation doesn't happen in real time), so do not fulfil an order based solely on a client-side success message. Instead, configure a Webhook URL so Monnify can notify your server the moment a payment is confirmed. Always verify the payment status on the server.
  4. Test Beyond the “Happy Path”: The happy path (a customer pays, everything works) is only one scenario. Before going live, test for real-world edge cases such as expired accounts, partial payments, duplicate webhooks, and network delays. Handling these gracefully in Test mode (Sandbox) mode means your system is ready when they happen in Live mode (Production).


Ready to start building?

With your foundation in place, choose your next step:

  1. Need a plan? Check our Payment Collection guides or Disbursement guides to find the right fit for your business. Or start with our overview: Monnify Products and Services.
  2. Need the technical details? Visit the Monnify API Docs to begin implementing your chosen feature.
  3. Setting up your environments? Read our guide on Sandbox vs. Production Environments
Last Updated on : 5/19/2026

Monnify Integration methods and How to Choose Yours

Not sure which integration method fits your team? Merchants and developers often choose their path based on technical capacity, customization needs, and desired speed to market.


Choose the path that best fits your current setup:

1. No-Code: Payment Links

  1. Best for: Non-technical team, simple service businesses, or teams that want to start collecting payments immediately
  2. How It Works: Maximum speed, zero coding required. You generate links directly from your dashboard and share them with customers via WhatsApp, other social media platforms, or email


2. Code: Mobile SDKs, Web SDKs, Plugins, Direct APIs

  1. Best for: Technical teams who want flexibility, custom checkout UIs, or backend services.
  2. How It Works: You build exactly what you want, and Monnify securely processes the funds in the background.
Last Updated on : 4/6/2026

No-Code Integration: Payment Links

Last Updated on : 4/6/2026

Integrating Via Code: APIs, SDKs and Plugins

Build your own native experience.

If your platform requires flexibility, our options for integrating give you the keys to the engine. You get to offer your customers access to pay via Bank Transfer, Cards, USSD, and Phone Number.


Choose Your Code Integration Stack

Choose the tool that fits your platform:

  1. Direct APIs: For backend control and custom UIs.
  2. Mobile SDKs (Native & Cross-Platform): Accept payments directly inside your mobile app without moving users to a web browser.
  3. Android SDK: Native performance for your Android apps.
  4. iOS SDK: Seamless Apple integration via CocoaPods.
  5. Flutter SDK: Cross-platform efficiency. Write once, collect payments everywhere.

3. Web SDK & Framework Wrappers:

  1. Vanilla Web SDK: The classic, lightweight <script> drop-in for any HTML/JS site.
  2. Modern Wrappers: We maintain official wrappers for Javascript and TypeScript on NPM, ensuring your integration plays perfectly with your modern front-end framework like React.

4. CMS & E-Commerce Plugins:

  1. WooCommerce/ WordPress Plugin: Turn your blog or store into a payment powerhouse instantly.
  2. WHMCS: Automate your web hosting or IT billing effortlessly.


Ready to Build?

  1. Grab your API Key and Contract Code from your Monnify Dashboard.
  2. Ensure your dashboard toggle on the top-right corner is set to Test Mode (Orange toggle).
  3. Dive into our Developer Documentation to read the doc for your specific stack.
  4. Test directly on our interactive API Reference site.


Last Updated on : 4/6/2026

Sandbox vs Production Environments

To build safely and test edge cases, you will start your integration in our Test (Sandbox) environment. Ensure your codebase points to the correct Base URL:

  1. Test Environment (Sandbox): https://sandbox.monnify.com
  2. Live Environment (Production): https://api.monnify.com


Developer Note: One of the most common errors is using Sandbox API Keys while pointing your code to the Live Base URL. Always double-check your environment variables.

Last Updated on : 4/6/2026

Secure Your API With IP Whitelisting

Last Updated on : 5/19/2026

How to Automate Bulk Payouts Without OTPs


By default, Monnify requires an OTP (One-Time Password) for every payout (disbursement) attempt. This provides an excellent layer of manual security for businesses doing occasional transfers.

However, if your team is building an automated system like a payroll processor or a bulk vendor disbursement flow, requiring a manual OTP for every transaction will break your automation.


The Fix: Send an email to our Integration Support team requesting that we waive OTPs for your account.


Email Template for Requesting an OTP Waiver

Note: For security reasons, an OTP waiver must be requested directly by the business owner or the primary technical admin.


Using the template below, send an email from the email address linked to your Monnify account:

  1. Send to: [email protected]
  2. Subject: Request for Payout OTP Waiver: [Your Business Name]
  3. Body:

Hello Monnify Compliance & Support Team,

We are currently integrating the Monnify Disbursement API and we are officially requesting a waiver for the Payout OTP requirement on our account.

Here are our details for verification:

  1. Registered Business Name: [Your Business Name]
  2. Contract Code: [Your Contract Code]
  3. Whitelisted IP Address: [Your Server IP Address]


We confirm that we have implemented server-side IP Whitelisting.

We understand and accept that removing the OTP layer means any disbursement requests originating from our whitelisted IP address and authenticated with our API keys will be processed automatically.

We also indemnify Monnify for usage and misuse of the feature.

Kindly let us know once the waiver has been applied so our engineering team can finalize the live integration.


Best regards,

[Your Name]

[Your Role/Title]


Last Updated on : 5/19/2026

How to Resolve Payments Made to an Expired Account


Dynamic virtual accounts and one-time invoices are built for speed and security, and that comes with a strict validity window. When a customer misses that window and pays after expiry, it can feel like a lost sale.


Here is how Monnify handles late payments, and how to resolve them cleanly.

What Happens to the Transaction?

When a customer pays after the expiry of a Monnify virtual account or dynamic invoice, the payment is treated as invalid. Here's what that means:

  1. The payment is not recognised as successful. Since the account number is no longer active, the system treats the transaction as failed.
  2. No value is delivered. Because the invoice is already closed, your system will not fulfil the order; the customer will not receive their goods or services.
  3. The funds are reversed. In most cases, the banking network rejects the transfer outright and the funds are automatically returned to the customer's source account.

To complete the order, the customer needs to generate a new invoice or payment link. Do not ask them to retry the expired account, it will not work.


Best Practices to Prevent Expired Payments

Stop late payments before they happen by optimizing your checkout flow:

  1. Communicate the Urgency: Add a visible warning to your checkout flow: "This account number expires in 30 minutes. Do not save it for later use."
  2. Switch Repeat Customers to Reserved Accounts.: If you have customers who pay you regularly, assign them Reserved Accounts (a virtual account tied to a customer’s profile and doesn’t expire). For more information, read more about Reserved Accounts.
  3. Connect with Your Webhooks: Ensure your backend is actively listening for the EXPIRED webhook status. When this event comes in, your frontend should immediately hide the expired account number and prompt the user to generate a new payment method.


Last Updated on : 5/19/2026

References and Statuses: Payment Collections

Last Updated on : 5/19/2026

References and Statuses: Payouts (Disbursements)


When making payouts, understanding your payout references and transaction states keep your operations accurate and your automation reliable.


The References IDs

Every payout on Monnify carries two unique identifiers; one from you and one from Monnify.

  1. Reference: This is the internal tracking number your system creates before initiating a payout. It must be strictly unique for every payout attempt.
  2. transactionReference: This is generated by Monnify. Once your payout enters the Monnify system, we assign this identifier and return it in the API response. Use this when querying payout status or escalating an issue with the Monnify team.


The reference is how you track the payout. The transactionReference is how Monnify tracks it.


Status: What It Means and Who It's For

Status tells you exactly where a payout is in its lifecycle, from the moment it is initiated to the moment it lands (or doesn't). It is visible on your Monnify Dashboard and is the key field your engineering and finance teams will rely on for payout reconciliation and automation.

A status of SUCCESS confirms that funds have left your account and reached the recipient. Any other state means the payout is still in progress, awaiting authorisation, or requires attention.


The full list of valid Statuses for payouts:

SUCCESS · FAILED · PENDING · IN_PROGRESS · REVERSED · PENDING_AUTHORIZATION · PENDING_BATCH_AUTHORIZATION


Quick Summary: Collections vs. Payouts identifiers



Collections

Payouts (Disbursements)

Merchant-generated ID

paymentReference

reference

Monnify-generated ID

transactionReference

transactionReference

Status

Payment Status

Status

Field name in API / Webhook

paymentStatus

status

Success value

PAID

SUCCESS

Visible on Dashboard?

Yes

Yes

All valid values

PAID, OVERPAID, PARTIALLY_PAID, PENDING, ABANDONED, CANCELLED, FAILED, REVERSED, EXPIRED

SUCCESS, FAILED, PENDING, IN_PROGRESS, REVERSED, PENDING_AUTHORIZATION, PENDING_BATCH_AUTHORIZATION


Last Updated on : 5/19/2026

Monnify Webhooks: Events, Security, Timeout and Indempotency


Your server shouldn't use up resources continuously polling Monnify if a transaction is completed. Instead, Monnify uses Webhooks to notify your server directly the moment a transaction is executed.


Supported Webhook Events

An “event” refers to the change in status of a request. Monnify will push real-time responses to your server for the following events:

  1. Successful Payment
  2. Payouts (Disbursements): Successful Disbursement, Failed Disbursement, Reversed Disbursement
  3. Refunds: Successful Refund, Failed Refund
  4. Settlements & Wallets: Settlement Completion (successful transfers to your bank account), Wallet Activity Notification (credits and debits to your Main or Sub-Wallets)
  5. Mandate Status Changes (e.g., from PENDING to ACTIVATED, FAILED, or CANCELLED)


Security When Dealing With Webhooks

When your server receives a webhook, you must verify that it originated from Monnify before processing anything of value. Two security layers are required:

  1. Verify the Webhook Signature: Every valid Monnify webhook includes a signature header. Hash the payload using your Client Secret Key and confirm it matches the signature in the header. Reject any mismatch immediately.
  2. Whitelist Monnify's IP Address: To prevent bad actors from sending fraudulent requests to your webhook URL, whitelist Monnify’s IP address on your server. Monnify webhook notifications will only originate from: 35.242.133.146. Drop requests from a different origin.


Acknowledgement And Timeouts

When Monnify sends a webhook, we expect your server to acknowledge receipt promptly.

  1. Return a 200 OK response to confirm the webhook was received.
  2. Respond before the timeout. If your server performs heavy processing (such as querying slow databases) before sending the 200 OK response, the request may time out on our end.
  3. If there is no response, the request will retry. Expect retries if we do not receive the expected response, we assume you did not receive the webhook and will retry every 5 minutes, up to 12 times.

Best Practice: Receive the webhook, verify its authenticity, return the 200 OK response, then handle any heavy processing asynchronously in the background.


Idempotency: Handling Duplicate Webhooks

Network fluctuations can occasionally cause your server to receive duplicate webhook notifications for the same transaction. Here’s how to handle such:

  1. When a webhook arrives, always check whether that event has already been processed.
  2. If it has, discard it, but still return the expected status code so Monnify knows to stop retrying.


Developer Tip: Cache your processed notifications or maintain a dedicated "Processed Transactions" log in your database. This makes duplicate checks fast and keeps your integration resilient under load.

Last Updated on : 5/19/2026