Software Licensing API for Developers
Two public endpoints — POST /validate and
POST /activate — and 6 official SDKs. No API key,
no OAuth, no secret to embed in a distributed binary. Just an HTTP call with the license
key, POST body so it never lands in an access log.
The problem with building this yourself
Every software vendor eventually needs to answer "is this a real, currently-valid license key." Rolling that yourself means a database schema, a hashing scheme that doesn't leak plaintext keys if the DB is stolen, race-condition-safe activation counting, rate limiting so the endpoint can't be brute-forced, and — if you ever sell direct — a checkout flow. Most of that is undifferentiated work that has nothing to do with the software you're actually trying to sell.
How it works
License keys are generated client-side and encrypted with AES-256-GCM before they ever reach the server — PermitCore stores ciphertext it structurally cannot decrypt. Validation and activation each receive the plaintext key transiently (that's how a stateless HTTP API works) but never store, log, or persist it — the server computes an HMAC-SHA256 hash and looks that up. A stolen database dump can't be used to forge or read license keys.
curl -X POST https://your-domain.com/api/v1/validate \
-H "Content-Type: application/json" \
-d '{"licenseKey":"PERMIT-A3K7-MN2P-QR9X-TZ5W"}'
# Response
{ "isValid": true, "productName": "Acme Video Editor Pro", "expiresAt": null }
Activation works the same shape, plus a nonce (GET /nonce
first) and it atomically increments the license's activation counter — PostgreSQL row-level
locking means two simultaneous activation calls for a seat-limited key can't both win the last
seat. See the full API reference for every
endpoint, error code, and language example.
What you get beyond the two endpoints
Start validating license keys today
Free tier available. No credit card required.