Features Use cases Developers Security Pricing Contact Try the demo
Developers

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.

Quickstart

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.
verify
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)
Trust, verified

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
response.json
{
  "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"
}
Management API

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.

Built-in tester

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.

app.innokeys.app
API call logs in InnoKEYS

Ready to integrate?

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