Skip to main content
If your product doesn’t run on the JVM (or you want full control), NMKey is just a signed HTTP endpoint. Anything that can POST JSON can validate a key. All endpoints are public — the license key itself is the credential, no API key is needed.

Base URL

POST /validate

Checks a key and claims (or refreshes) this server’s license slot. Call on boot and periodically as a heartbeat.
The response is always HTTP 200 — the verdict is in the body:
Non-valid responses include a human-readable message.

Verifying the signature

When signing is enabled, signature is a base64url Ed25519 signature over this pipe-delimited canonical string, which you rebuild from values you already know plus the returned status / issuedAt:
Verify it (raw message, no pre-hash) against the public key from GET /public-key. Embed that public key in your plugin rather than fetching it at runtime from the same host you’re distrusting — otherwise a rerouted API could serve both a fake “valid” and a matching fake key.

POST /release

Frees this server’s seat on graceful shutdown, so the buyer can move hosts instantly instead of waiting for the seat to go stale.
Returns { "ok": true } when a seat was released.

GET /public-key

Returns the Ed25519 public key as SPKI PEM (text/plain). 404 when response signing is not enabled on the server.

GET /health

Reachability check plus integration hints:
heartbeatMs is the recommended re-validation interval; a seat that hasn’t validated for staleAfterMs is considered stale and can be claimed by another server.