Sell your desktop app.
We handle the keys.
Generate, activate and verify license keys with one tiny API — machine-locked activations, trials, revocations. Built by an indie developer who needed it. Now open to every indie developer.
$ curl -X POST api.sublimearts.io/v1/licenses -d '{"product":"my-app"}'
MYAPP-·····-·····-·····-·····
HOW IT WORKS
Three calls. That's the whole integration.
Register your product
One call. Pick a slug and a key prefix — done.
curl -X POST api.sublimearts.io/v1/products \
-H "Authorization: Bearer $SUBLIMEKEYS_API_KEY" \
-d '{"slug":"my-app","key_prefix":"MYAPP"}'Issue a key on every sale
Call it from your Stripe or Gumroad webhook — the key comes back ready to email. (Or skip this call entirely — see AUTOMATE in the docs.)
curl -X POST api.sublimearts.io/v1/licenses \
-H "Authorization: Bearer $SUBLIMEKEYS_API_KEY" \
-d '{"product":"my-app","email":"buyer@mail.com"}'
→ "MYAPP-K3F7Q-9WZ2M-P8RT4-XN5CB"Verify inside your app
Machine-locked activation, offline verification via a signed lease (no network needed for up to 7 days), revoke on refund.
from sublimekeys import SublimeKeysClient
client = SublimeKeysClient(product_id="my-app")
result = client.verify(license_key=key)
if result.valid:
unlock_full_version()Python? pip install sublimekeys — official SDK, handles the offline verification for you. View on PyPI → · Node.js / Electron? npm install sublimekeys View on npm →
PRICING
Start free. Upgrade when it pays for itself.
1 product · 100 keys · 5 devices/key
5 products · 1,000 keys · 25 devices/key
unlimited products & keys · 100 devices/key
FAQ
The questions that matter.
What happens to my licenses if SublimeKeys shuts down?
Your data is never hostage: every key and activation is exportable via the API (GET /v1/licenses) at any moment, no permission needed. If we ever sunset the service, paying customers get 12 months of notice and a full export. And since this same API powers our own products — ReelNox Studio, BackDrop_, TimePeek — keeping it alive is existential for us too.
Do my users need to be online?
Only for the first activation and roughly once a week after that. Every /activate and /verify call returns a cryptographically signed lease valid for 7 days — verify it locally with no network call, no blind trust. The official Python and Node.js/Electron SDKs handle this automatically; other languages can verify the Ed25519 signature themselves (see the docs).
What if I hit my plan limit?
Nothing breaks. Existing keys keep activating and verifying forever — you just can't issue new ones until you upgrade. Your customers never notice anything.
What happens if I downgrade or cancel my subscription?
Nothing is ever deleted, suspended, or revoked — not your products, not a single license key. Everything keeps working exactly as before, forever, for you and for every customer who already bought a key from you. The only change: you can't create new products or keys beyond your new plan's limits until you upgrade again. Your customers' software should never break because of a decision you made on your end.
Where does my data live?
In the EU — on dedicated infrastructure in Nuremberg, Germany, HTTPS everywhere. Your API key is stored only as a SHA-256 hash: we physically cannot read it back.
How do I revoke a key?
Products → pick the product → Manage keys. Find the key (by email or the key itself) and hit Revoke — it's immediate and irreversible, exactly like a refund should work. Under the hood it's DELETE /v1/licenses/{key}, scoped so you can only ever touch your own keys.
How many devices can one license activate on?
Whatever you decide, up to your plan's ceiling. Pass max_activations when you issue a key via POST /v1/licenses (it defaults to 1 if you don't). Sell "personal use, 3 devices"? Set it to 3. The per-key ceiling itself scales with your SublimeKeys plan — 5 on Free, 25 on Pro, 100 on Business — so a single leaked key can never fan out further than that, whatever plan you're on. See the docs for the full field list.
Can I migrate from Gumroad, Keygen or my own server?
Yes. Bulk-issue keys for your existing customers with a real, ten-line script — see MIGRATE in the docs for the exact code. Key prefixes are configurable, so the new keys match your brand from day one. It re-keys your customers rather than preserving old key strings — the docs explain the tradeoff.