Zindua.Sdk 1.0.1

dotnet add package Zindua.Sdk --version 1.0.1
                    
NuGet\Install-Package Zindua.Sdk -Version 1.0.1
                    
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="Zindua.Sdk" Version="1.0.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Zindua.Sdk" Version="1.0.1" />
                    
Directory.Packages.props
<PackageReference Include="Zindua.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 Zindua.Sdk --version 1.0.1
                    
#r "nuget: Zindua.Sdk, 1.0.1"
                    
#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 Zindua.Sdk@1.0.1
                    
#: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=Zindua.Sdk&version=1.0.1
                    
Install as a Cake Addin
#tool nuget:?package=Zindua.Sdk&version=1.0.1
                    
Install as a Cake Tool

Zindua.Sdk

Official .NET 8 SDK for Zindua — send transactional email and WhatsApp OTP from ASP.NET Core.

Server-side only. Never put ZINDUA_API_KEY in Blazor WebAssembly, SPA, or mobile apps.

Install

dotnet add package Zindua.Sdk

Quick start (ASP.NET Core)

using Zindua;
using Zindua.DependencyInjection;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddZindua(builder.Configuration);

var app = builder.Build();

app.MapPost("/auth/otp", async (IZinduaClient zindua, OtpRequest req) =>
{
    var result = await zindua.SendAsync(new ZinduaSendOptions
    {
        To = req.Email,
        Template = "otp-login",
        Channel = "email",
        Lang = "en",
        Variables = new Dictionary<string, string>
        {
            ["code"] = req.Code,
            ["appName"] = "MyApp",
        },
    });
    return Results.Ok(new { result.LogId });
});

app.Run();

record OtpRequest(string Email, string Code);

appsettings.json:

{
  "Zindua": {
    "ApiKey": "znd_test_xxxxxxxxxxxxxxxxxxxxxxxx"
  }
}

Or environment variable:

export ZINDUA_API_KEY=znd_test_xxxxxxxxxxxxxxxxxxxxxxxx

WhatsApp

await zindua.SendAsync(new ZinduaSendOptions
{
    To = "+243812345678",
    Channel = "whatsapp",
    Template = "otp-login",
    Variables = new Dictionary<string, string> { ["code"] = "482910" },
});

WhatsApp anti-ban robot (required)

Zindua’s anti-ban robot enforces a ≥ 3 second gap between WhatsApp sends to protect your linked number from bans. Burst / simultaneous OTP looks like spam.

  • Server returns RATE_LIMIT_EXCEEDED / wait messages if you ignore the gap.
  • SDK defaults AutoPaceWhatsapp = true: waits on this client and writes a warning to stderr.
  • Your app should still use a queue or resend countdown in production.

Guide: WhatsApp OTP anti-ban pacing

builder.Services.Configure<ZinduaClientOptions>(o =>
{
    o.ApiKey = builder.Configuration["Zindua:ApiKey"]!;
    // o.AutoPaceWhatsapp = false; // only if you already queue OTP yourself
});

Other methods

var project = await zindua.GetProjectAsync();
var templates = await zindua.GetTemplatesAsync();
var log = await zindua.GetLogAsync(result.LogId);

Without DI

using var client = new ZinduaClient(new ZinduaClientOptions
{
    ApiKey = Environment.GetEnvironmentVariable("ZINDUA_API_KEY")!,
});

await client.SendAsync(new ZinduaSendOptions
{
    To = "user@example.com",
    Template = "otp-login",
});

Docs

License

MIT

Product Compatible and additional computed target framework versions.
.NET 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 was computed.  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.1 36 7/21/2026
1.0.0 89 7/18/2026