Monnify.SDK 1.0.0

dotnet add package Monnify.SDK --version 1.0.0
                    
NuGet\Install-Package Monnify.SDK -Version 1.0.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Monnify.SDK" Version="1.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Monnify.SDK" Version="1.0.0" />
                    
Directory.Packages.props
<PackageReference Include="Monnify.SDK" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Monnify.SDK --version 1.0.0
                    
#r "nuget: Monnify.SDK, 1.0.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Monnify.SDK@1.0.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Monnify.SDK&version=1.0.0
                    
Install as a Cake Addin
#tool nuget:?package=Monnify.SDK&version=1.0.0
                    
Install as a Cake Tool

Monnify .NET SDK

A comprehensive .NET SDK for the Monnify payment gateway. Supports collections, disbursements, reserved accounts, webhooks, and more.

Installation

dotnet add package Monnify.SDK

Quick Start

1. Register services

// From appsettings.json
builder.Services.AddMonnify(builder.Configuration.GetSection("Monnify"));

// Or inline
builder.Services.AddMonnify(opts =>
{
    opts.ApiKey = "MK_TEST_...";
    opts.SecretKey = "...";
    opts.ContractCode = "...";
    opts.Environment = MonnifyEnvironment.Sandbox;
    opts.SourceAccountNumber = "..."; // For disbursements
});

// Add webhook validation (optional)
builder.Services.AddMonnifyWebhooks("your-secret-key");

2. appsettings.json

{
  "Monnify": {
    "ApiKey": "MK_TEST_...",
    "SecretKey": "...",
    "ContractCode": "...",
    "Environment": "Sandbox",
    "SourceAccountNumber": "..."
  }
}

3. Use the client

public class PaymentService
{
    private readonly IMonnifyClient _monnify;

    public PaymentService(IMonnifyClient monnify) => _monnify = monnify;

    // Create a virtual account for receiving payments
    public async Task CreateVirtualAccount()
    {
        var result = await _monnify.ReservedAccounts.CreateAsync(new CreateReservedAccountRequest
        {
            AccountReference = "student-001",
            AccountName = "John Doe School Fees",
            CustomerEmail = "john@example.com",
            CustomerName = "John Doe",
            Bvn = "12345678901",
            GetAllAvailableBanks = true
        });

        if (result.IsSuccess)
        {
            foreach (var account in result.ResponseBody!.Accounts!)
                Console.WriteLine($"{account.BankName}: {account.AccountNumber}");
        }
    }

    // Verify a bank account (name enquiry)
    public async Task<string?> VerifyAccount(string accountNumber, string bankCode)
    {
        var result = await _monnify.Verification.ValidateAccountAsync(accountNumber, bankCode);
        return result.ResponseBody?.AccountName;
    }

    // Send money to a bank account
    public async Task SendMoney()
    {
        var result = await _monnify.Disbursements.InitiateSingleTransferAsync(new SingleTransferRequest
        {
            Amount = 50000,
            Reference = $"TXN-{Guid.NewGuid():N}",
            Narration = "Salary payment",
            DestinationBankCode = "058",
            DestinationAccountNumber = "0123456789",
            DestinationAccountName = "John Doe"
        });

        Console.WriteLine($"Status: {result.ResponseBody?.Status}, Fee: {result.ResponseBody?.TotalFee}");
    }

    // Send money in bulk
    public async Task BulkTransfer()
    {
        var result = await _monnify.Disbursements.InitiateBulkTransferAsync(new BulkTransferRequest
        {
            Title = "October Payroll",
            BatchReference = $"BATCH-{DateTime.UtcNow:yyyyMMdd}",
            Narration = "Salary",
            OnValidationFailure = "CONTINUE",
            TransactionList = new List<BulkTransferItem>
            {
                new() { Amount = 50000, Reference = "ref-001", Narration = "Salary - John",
                         DestinationBankCode = "058", DestinationAccountNumber = "0123456789",
                         DestinationAccountName = "John Doe" },
                new() { Amount = 75000, Reference = "ref-002", Narration = "Salary - Jane",
                         DestinationBankCode = "044", DestinationAccountNumber = "9876543210",
                         DestinationAccountName = "Jane Smith" }
            }
        });
    }
}

Webhook Handling

app.MapPost("/webhooks/monnify", async (HttpContext ctx, IWebhookValidator validator) =>
{
    // Read raw body
    using var reader = new StreamReader(ctx.Request.Body);
    var body = await reader.ReadToEndAsync();
    var signature = ctx.Request.Headers["monnify-signature"].FirstOrDefault();

    // Validate and parse
    var webhookEvent = validator.ParseAndValidate(body, signature!);

    switch (webhookEvent.EventType)
    {
        case WebhookEventTypes.SuccessfulTransaction:
            var txn = webhookEvent.GetData<TransactionEventData>();
            // Handle inflow...
            break;

        case WebhookEventTypes.SuccessfulDisbursement:
            var disbursement = webhookEvent.GetData<DisbursementEventData>();
            // Handle successful payout...
            break;

        case WebhookEventTypes.FailedDisbursement:
            var failed = webhookEvent.GetData<DisbursementEventData>();
            // Handle failed payout...
            break;
    }

    return Results.Ok();
});

Features

Feature Status
OAuth2 token management (auto-refresh) Yes
Reserved accounts (virtual bank accounts) Yes
Transaction initialization & status Yes
Single bank transfers Yes
Bulk bank transfers (up to 5,000/batch) Yes
Transfer OTP authorization (MFA) Yes
Account validation (name enquiry) Yes
Bank listing Yes
Webhook signature validation (HMAC-SHA512) Yes
Typed webhook event models Yes
Refund management Yes
Sub-account management Yes
Polly retry + circuit breaker Yes
Circuit breaker notifications Yes
Structured logging Yes
Multi-TFM (net6.0-net9.0) Yes

Configuration

Option Default Description
ApiKey required Monnify API key
SecretKey required Monnify secret key
ContractCode required Monnify contract code
Environment Sandbox Sandbox or Live
SourceAccountNumber - Disbursement wallet account number
Timeout 30s HTTP request timeout
RetryCount 3 Retry attempts for transient failures
EnableLogging true Enable HTTP request/response logging
LogRequestBodies false Include bodies in logs (sensitive!)

License

MIT

Product Compatible and additional computed target framework versions.
.NET net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 is compatible.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.0 143 5/27/2026