Integrate licensing in minutes, not weeks
A simple HTTP API to verify licenses, deliver downloads and enforce rules β with Ed25519-signed responses you can validate offline. No SDK required.
Verify a license
POST the license code to the public verify endpoint from any language. That's the whole integration.
- POST /licenses/verifySend the code (and optionally a hostname or e-mail). No auth needed.
- Instant answerGet back validity, license details, download URLs and a signature.
- Enforced server-sideStatus, expiry, activations, seats, domain and e-mail are all checked for you.
const res = await fetch('https://app.innokeys.app/licenses/verify', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ code: 'PROD-6H2K-9F3M-QW8T', hostname: os.hostname() }) }); const license = await res.json(); if (license.valid) unlock(app);
$res = file_get_contents('https://app.innokeys.app/licenses/verify', false, stream_context_create(['http' => [ 'method' => 'POST', 'header' => 'Content-Type: application/json', 'content' => json_encode(['code' => $code]), ]])); $license = json_decode($res, true); if ($license['valid']) unlock();
import requests, socket r = requests.post('https://app.innokeys.app/licenses/verify', json={ 'code': 'PROD-6H2K-9F3M-QW8T', 'hostname': socket.gethostname(), }) license = r.json() if license['valid']: unlock(app)
Every answer is Ed25519-signed
A patched local cache or a fake server can't fool your app. Each verify response for a real license is signed with a server-only Ed25519 key, so you can confirm the answer genuinely came from InnoKEYS β offline, with the public key you pinned.
- signature, signatureKeyId and signedAt in every response
- Fetch the public key from GET /licenses/signing-key to pin and rotate
- Verify locally so a blocked network never becomes a bypass
{
"valid": true,
"license": {
"code": "PROD-6H2K-9F3M-QW8T",
"status": "ACTIVE",
"seats": 10,
"expiresAt": "2027-01-31"
},
"downloadUrls": ["https://app.innokeys.app/β¦"],
"termsUrl": "https://app.innokeys.app/terms/β¦",
"signature": "base64(ed25519)",
"signatureKeyId": "key-2026-01",
"signedAt": "2026-07-16T10:12:00Z"
}
Automate everything with scoped API keys
Create, sync and manage licenses programmatically. API keys are hashed, expirable, rate-limited and restricted to explicit scopes β deny-by-default.
licenses:read / write / delete
Full CRUD and bulk create, plus hostname management and sync.
license-types:*
Manage your reusable products and their settings.
dashboard:read
Pull statistics and revenue figures into your own tools.
audit-logs / api-logs:read
Stream change history and API traffic for compliance.
Webhooks
Receive an outbound POST to your endpoint when key events happen, and let InnoKEYS receive inbound webhooks from Mollie, PayPal and Moneybird β every delivery is idempotent and logged.
One-line install scripts
Give customers a curl β¦ | sh command that redirects to a short-lived, signed download β great for CI, servers and terminals.
Try the API before you write a line of code
The demo administration includes a live "Test license" page and an API-logs view, so you can watch every request, its resolved hostname, status and timing.

Ready to integrate?
Grab a demo license, hit the verify endpoint, and see the signed response for yourself.