Notifizz Java SDK reference
com.notifizz:notifizz-java is the JVM SDK for tracking events. It exposes track() overloads, a hashed-token helper for widget auth, and works the same from Java or Kotlin. The package is published to Maven Central.
TL;DR
new NotifizzClient(authSecretKey, sdkSecretKey)— two-argument constructor (nowebhookSigningSecret, since the JVM SDK doesn’t expose enrichers).client.track(eventName, properties)— emits one event; throwsIOExceptionon transient failures after retries.client.track(eventName, properties, idempotencyKey)— overload for retried jobs.- Each
track()retries twice (1s, then 2s) before bubblingIOException. - The enricher subsystem is Node-only today — Java backends consume enriched data normally, but cannot host enrichers.
Installation
- Maven
- Gradle (Kotlin DSL)
- Gradle (Groovy)
Constructor
| Parameter | Type | Description |
|---|---|---|
authSecretKey | String | Used by generateHashedToken() for widget backend-token auth. |
sdkSecretKey | String | Used as the Bearer token on the tracking API and posted in the body. |
client.track(eventName, properties)
Emits a single event. Notifizz resolves campaigns by eventName and runs each campaign’s orchestrator server-side to build the recipient list — there is no client-side workflow or recipient targeting.
client.track(eventName, properties, idempotencyKey)
Overload with an explicit idempotency key. Use this when the same logical emit may run twice (retry, dedupe).
Parameters
| Parameter | Type | Description |
|---|---|---|
eventName | String | Canonical event name. Must match the event you registered in the dashboard. |
properties | Map<String, Object> | Arbitrary key-value data passed to campaigns. null is treated as an empty map. |
idempotencyKey | String | Caller-supplied dedupe key. null generates a UUID. Only on the 3-arg overload. |
Behaviour
- Posts
{ eventName, properties, sdkSecretKey, idempotencyKey }toPOST /v1/events/track. - Sends
Authorization: Bearer <sdkSecretKey>andX-Idempotency-Key: <idempotencyKey>. - Retries transient failures twice (1s, then 2s) — three total attempts.
- Throws
java.io.IOExceptionif all attempts fail or the response status is>= 400.
Kotlin
The SDK works naturally with Kotlin — the sameMap.of / mapOf interop applies:
client.generateHashedToken(userId)
Generates the SHA-256 of userId + authSecretKey. Pass it to your frontend so the Notification Center widget can authenticate in backendToken mode.
| Parameter | Type | Description |
|---|---|---|
userId | String | The user’s unique identifier — must match the userId you pass to the widget. |
String, hex-encoded SHA-256.
See backend tokens for the widget side.
client.config(opts)
Overrides default options. Currently only baseUrl is configurable.
| Option | Default | Description |
|---|---|---|
baseUrl | https://eu.api.notifizz.com/v1 | Base URL for all SDK API calls. |
Enrichers — Node-only today
The enricher subsystem (registering server-side resolvers that the orchestrator calls back via HMAC-signed webhooks) ships only with the Node SDK today. A Java backend can still consume enriched data normally — campaigns receive enriched inputs the same way regardless of where the enricher is hosted. If your campaigns need server-side enrichment, host the enrichers from a Node service alongside your Java application. Java parity is on the roadmap. See the enrichers protocol reference for the wire format if you decide to implement an enricher endpoint manually in Java.Error handling
track() declares throws IOException. Wrap it where you need a custom log line:
IOException is rethrown — the SDK does not silently swallow failures.
The full error catalogue (including HTTP status mappings) is in error catalogue.
FAQ
Why does `track()` throw `IOException`?
Why does `track()` throw `IOException`?
Tracking is a network call to
POST /v1/events/track. After the SDK exhausts its 3 retry attempts, the underlying IOException (or a wrapped one for >= 400 HTTP statuses) is rethrown. Always handle it — silent network failures are a foot-gun.Should I generate the idempotency key myself?
Should I generate the idempotency key myself?
Yes when the same logical emit may be retried (queued jobs, scheduler, retry middleware). Use a deterministic key derived from your domain —
order-shipped:{orderId} is better than UUID.randomUUID() from outside the SDK, which generates a new key per attempt and defeats the dedupe.Can I host an enricher from my Java service?
Can I host an enricher from my Java service?
Not via the SDK today. The enricher subsystem ships only with
@notifizz/nodejs. If you need an enricher right now, host a small Node service alongside your Java app (the enrichers tutorial walks through it). If you’re comfortable implementing the wire protocol manually, see the enrichers protocol reference — it’s a plain HTTP+HMAC contract.Is `track()` blocking?
Is `track()` blocking?
Yes —
track() is synchronous and the SDK retries failures with 1s + 2s delays, so a degraded backend can stall the calling thread for up to ~3s. Run it on an ExecutorService or virtual thread when latency matters.How do I configure a custom base URL for staging?
How do I configure a custom base URL for staging?
Call
client.config(Map.of("baseUrl", "...")) after construction. The SDK reads the option on every track() call. Use this for local mocks, regional endpoints, or staging environments — production is https://eu.api.notifizz.com/v1.Can I batch several events in one call?
Can I batch several events in one call?
Not today. Each
track() call is one event. Fire them in parallel with an executor when batching matters; idempotency keys ensure retries dedupe at the backend.See also
Event Tracking reference
HTTP wire format, idempotency contract, error shapes.
Backend quickstart
Send your first event in under five minutes.
Event Tracking overview
Cross-language feature matrix.
Notification Center widget
Display the notifications your events drive.