Docs
Everything you need to wire SublimeKeys into your app. No account needed to read this.
$SUBLIMEKEYS_API_KEY
Every request below uses this as a placeholder for your real key. Sign in (free, no card) to get yours and see these examples filled in with your own product.
QUICKSTART — 3 CALLS
1. Register your product (done once, in Products)
curl -X POST https://api.sublimearts.io/v1/products \
-H "Authorization: Bearer $SUBLIMEKEYS_API_KEY" \
-d '{"slug":"my-app","key_prefix":"MYAPP"}'2. Issue a key on every sale
curl -X POST https://api.sublimearts.io/v1/licenses \
-H "Authorization: Bearer $SUBLIMEKEYS_API_KEY" \
-d '{"product":"my-app","email":"buyer@mail.com"}'
→ {"key":"MYAPP-K3F7Q-9WZ2M-P8RT4-XN5CB", ...}Or skip this call entirely — see AUTOMATE below.
3. Verify inside your app
import requests
r = requests.post("https://api.sublimearts.io/activate", json={
"license_key": key,
"machine_id": machine_id,
"product_id": "my-app",
})
if r.json()["valid"]:
unlock_full_version()const r = await fetch("https://api.sublimearts.io/activate", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ license_key, machine_id, product_id: "my-app" }),
});
const { valid } = await r.json();
if (valid) unlockFullVersion();curl -X POST https://api.sublimearts.io/activate \
-d '{"license_key":"...","machine_id":"...","product_id":"my-app"}'ENDPOINT REFERENCE — PUBLIC (called by your app)
POST /activate
First run — binds a license key to a machine_id. Returns valid:false with a message if it can't.
body: { "license_key", "machine_id", "product_id" }
POST /verify
Every subsequent launch — confirms the key is still valid on this machine.
body: { "license_key", "machine_id", "product_id" }
POST /deactivate
User signs out / uninstalls — frees the seat for another machine.
body: { "license_key", "machine_id", "product_id" }
POST /trial/start
Get-or-create a 7-day trial for a machine. Idempotent — reinstalling never resets the clock.
body: { "machine_id", "product_id" }
POST /trial/status
Read-only trial check — never starts one.
body: { "machine_id", "product_id" }
No Authorization header on these — the license_key itself is the credential. Full account-scoped API (create/list/revoke) lives under /v1/*, see the dashboard.
⚡ AUTOMATE — ZERO-BACKEND KEY DELIVERY
Skip step 2 above entirely. Point your payment provider's webhook at your product's URL and every sale issues a key and emails it to your buyer — automatically.
- Stripe Dashboard → Developers → Webhooks → Add endpoint
- Paste your product's URL (sign in and create a product to get yours)
- Select event: checkout.session.completed
- Save. That's it — no server, no code.
- Optional but recommended: Stripe shows a Signing secretright after — paste it into "Signature verification" on the Products page, so we reject anything that isn't genuinely from Stripe (not just anyone who has this URL).
🔔 Want an email yourself on every sale, too? Toggle "Notify me" next to this block on the Products page.
MIGRATE FROM GUMROAD, KEYGEN OR YOUR OWN SERVER
Export your existing customers to a CSV with one email column, then run this once per product. It bulk-issues one fresh SublimeKeys license per row, prefixed with your brand.
import csv, os, requests
API_KEY = os.environ["SUBLIMEKEYS_API_KEY"]
PRODUCT = "my-app"
with open("customers.csv") as f:
for row in csv.DictReader(f):
r = requests.post("https://api.sublimearts.io/v1/licenses",
headers={"Authorization": f"Bearer {API_KEY}"},
json={"product": PRODUCT, "email": row["email"]})
print(row["email"], "->", r.json()["key"])This issues brand-new keys — it does not preserve your old key strings (we don't accept custom key values, by design). Email customers their new key, or run both checks side by side in your app for a transition window before retiring the old system.
PLAN LIMITS
FREE
1 product · 25 keys
PRO
5 products · 1,000 keys
BUSINESS
unlimited
Hitting a limit never breaks existing keys — they keep verifying forever. You just can't issue new ones until you upgrade. Downgrading or canceling never deletes anything, either.