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

Python
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()
Node.js
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
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.

  1. Stripe Dashboard → Developers → Webhooks → Add endpoint
  2. Paste your product's URL (sign in and create a product to get yours)
  3. Select event: checkout.session.completed
  4. Save. That's it — no server, no code.
  5. 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.

migrate.py
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.