License keys
Single or bulk generation with your own key format, lifetime, subscription and trial types.
Issue license keys, authenticate users, bind devices and ship updates. Every check runs on the server, where it can't be patched out of your binary.
// Your app sends the key and a device fingerprintPOST /v1/auth/license{ "key": "SAUTH-7Q2KD-M4XNP-R8C1V-ZT6HB", "hwid": "b41f…9e2c" }// The server decides — and signs the answer200 OK signature: ed25519 ✓{ "status": "ACTIVE", "tier": "Premium", "expiresAt": "2027-11-01" }How it works
The client only asks. Every decision is made and signed by the server, so patching a jump instruction gets an attacker nothing.
Step 1
Your app opens a session with its public application id and version. Nothing secret ships in the binary.
Step 2
Timestamp and nonce defeat replays. IP, ASN and device blocklists are applied before any credential is read.
Step 3
License key, username and password, or token. The server checks status, expiry, device policy and subscription tier.
Step 4
Every response is signed with your application’s Ed25519 key. The SDK rejects anything it cannot verify.
Step 5
Heartbeats keep the session honest. Revoke a key or ban a user and the next heartbeat ends the session.
Everything in one place
Licenses, users, devices, files, updates and team workflows — isolated per application and per organization.
Single or bulk generation with your own key format, lifetime, subscription and trial types.
Tiers your application defines, granted by keys and enforced on every request.
Let partners generate keys from a credit balance, with scoped server-side keys.
Username/password, license-only or token login for your end users.
Single- or multi-device policies with self-service or approved resets.
See every active session and end any of them instantly.
Global, application and per-user values, encrypted at rest.
Versioned downloads served through short-lived signed URLs.
Force updates, block versions and verify binary hashes.
Developer experience
Initialize with your public application id, call one method, and read a verified result. SDKs handle signatures, nonces, retries and sessions.
#include <sauth/sauth.hpp>
int main() {
sauth::Client app{"app_9f3k2m", "1.4.0", SAUTH_PUBLIC_KEY};
app.init();
auto result = app.license(read_key_from_user());
if (!result.ok()) {
std::cerr << result.message() << '\n';
return 1;
}
std::cout << "Welcome, tier " << result.tier() << '\n';
}Preview of the SDK interface. SDKs are published alongside the public authentication API.
Security model
Anything in a shipped client can be read and patched. SAUTH is designed around that fact instead of hoping obfuscation holds.
License state, expiry, device policy, bans and tiers are decided server-side on every request. Clients only display the result.
Responses are signed per application with Ed25519. A fake local auth server or a tampered response fails verification.
Requests carry a timestamp and single-use nonce. Recorded traffic cannot be played back.
PostgreSQL row-level security and integrity triggers keep each organization’s data separate even if application code has a bug.
Argon2id for passwords, keyed hashes for tokens and HWIDs, AES-256-GCM for license keys, TOTP seeds and signing keys.
Hardware IDs are client-supplied, so we treat them as a sharing deterrent — never as proof of identity.
No licensing system makes software uncrackable, and we won't claim otherwise. SAUTH makes cracking expensive, keeps entitlements under your control, and lets you revoke access the moment abuse appears.
REST API
Generate keys from your store, sync customers from your backend, or build your own tooling. The dashboard uses the same API.
POST /api/v1/applications/{id}/licenses
Authorization: Bearer sk_live_••••
Idempotency-Key: order-10482
{
"type": "SUBSCRIPTION",
"durationDays": 30,
"tier": "Premium",
"quantity": 25,
"format": "PRO-*****-*****-*****"
}{
"batchId": "0193a6c2-…",
"count": 25,
"keys": [
"PRO-K7Q2D-M4XNP-R8C1V",
"PRO-ZT6HB-9WQ3L-2FJ8A",
"…"
]
}Breaking changes ship as a new version. /v1 keeps working.
Branch on LICENSE_EXPIRED, not on message strings.
Every response and error carries one for tracing.
Retry key generation safely with Idempotency-Key.
Pricing
Every plan includes the full security model. Limits grow with your business.
Default plan for new organizations. Adjust limits in the admin panel.
Free
FAQ
Move entitlement decisions to a server you control, and keep the controls in one dashboard.