Server-side only
ZINDUA_API_KEY in env or a secrets manager. Never in Swing, JavaFX, a browser bundle, or an Android APK.

One official package on Maven Central: run.zindua:zindua-sdk v1.0.1. Spring Boot, Quarkus, Micronaut, Jakarta, Maven, or Gradle. Same JAR. Backend only.
implementation("run.zindua:zindua-sdk:1.0.1")<dependency>Spring Boot is the common case, not a different product.
One JAR on Maven Central. Spring Boot is the common case, not a different product.
Spring Boot
The usual case. Same artifact: there is no zindua-spring-boot-starter. Register ZinduaClient as a @Bean and inject it.
ZINDUA_API_KEY in env or a secrets manager. Never in Swing, JavaFX, a browser bundle, or an Android APK.

Email, E.164 WhatsApp, and template slugs validated locally before calling the API.

One send() method for both channels. Same templates as Node, PHP, and .NET.

run.zindua:zindua-sdk on Maven Central. JDK HttpClient + Jackson. No extra HTTP client to add.
No second package. One @Bean in Spring Boot. Quarkus or Micronaut construct the same client by hand.

Every send() returns a logId. Confirm delivery in Dashboard → Logs before you ship.

Gradle or Maven to first OTP. Pick a use case. The Java snippet updates.
Install SDK
GradleOne Maven Central package. Gradle or Maven. Spring Boot, Quarkus, or plain Java.
build.gradle.kts
1implementation("run.zindua:zindua-sdk:1.0.1")2 3# or Maven4<dependency>5 <groupId>run.zindua</groupId>6 <artifactId>zindua-sdk</artifactId>7 <version>1.0.1</version>8</dependency>9 10# .env11ZINDUA_API_KEY=znd_test_your_key_hereFrom Maven Central to dashboard logs.
Maven Central install to dashboard log confirmation.
Create a Zindua project
Sign up at zindua.run, create a project, copy the API key. Connect email and/or WhatsApp in the dashboard.
Methods and environment variables.
Parity with @zindua/sdk on Node. Includes PushMirror createChallenge.
send()
Queue email or WhatsApp message
Spring Boot uses this JAR. Android and desktop call your backend.
import io.zindua.sdk.ZinduaClient;import io.zindua.sdk.ZinduaSendOptions; public class Main { public static void main(String[] args) { ZinduaClient zindua = new ZinduaClient(System.getenv("ZINDUA_API_KEY")); var result = zindua.send(ZinduaSendOptions.builder() .to("user@example.com") .template("otp-verification") .variable("code", "482910") .build()); System.out.println(result.getLogId()); }}Spring Boot
import io.zindua.sdk.ZinduaClient;import io.zindua.sdk.ZinduaClientOptions;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration; @Configurationclass ZinduaConfig { @Bean ZinduaClient zinduaClient() { return new ZinduaClient( ZinduaClientOptions.builder() .apiKey(System.getenv("ZINDUA_API_KEY")) .build()); }}Desktop / Android
// WRONG: never put the project key in Swing, JavaFX, or an APK// new ZinduaClient("znd_live_..."); // RIGHT: desktop / Android / browser call YOUR backendPOST https://your-api.example/auth/otp{ "to": "user@example.com" } // YOUR Spring service holds the key and calls Zinduazindua.send(ZinduaSendOptions.builder() .to(req.to()) .template("otp-verification") .variable("code", code) .build());Same templates and logs across Node, PHP, Python, .NET, and Java.