ドキュメント

SublimeKeysをあなたのアプリに組み込むために必要なすべて。閲覧にアカウントは不要です。

$SUBLIMEKEYS_API_KEY

以下のすべてのリクエストは、これをあなたの実際のキーのプレースホルダーとして使用しています。 サインイン (無料、カード登録不要)して自分のキーを取得し、これらの例が自分のプロダクトで埋められた状態を見てみましょう。

クイックスタート — 3回の呼び出し

1. プロダクトを登録 (プロダクトで1回だけ実施)

curl -X POST https://api.sublimearts.io/v1/products \
  -H "Authorization: Bearer $SUBLIMEKEYS_API_KEY" \
  -d '{"slug":"my-app","key_prefix":"MYAPP"}'

2. 販売のたびにキーを発行

curl -X POST https://api.sublimearts.io/v1/licenses \
  -H "Authorization: Bearer $SUBLIMEKEYS_API_KEY" \
  -d '{"product":"my-app","email":"buyer@mail.com","max_activations":3}'

→ {"key":"MYAPP-K3F7Q-9WZ2M-P8RT4-XN5CB", ...}
product必須 — ステップ1のプロダクトスラッグ
email任意 — ダッシュボードのライセンス一覧に表示されます
max_activations任意、デフォルトは1 — この1つのキーが同時にアクティブになれる異なるmachine_idの数。自分の価格設定が約束する内容に合わせて設定してください(例:「個人利用、3台まで」プランなら3)。上限はエンドカスタマーのプランではなくあなた自身のSublimeKeysプランによって決まります — Freeは5、Proは25、Businessは100(料金を参照)。
expires_at任意 — ISO形式の日付。永久キーの場合は省略してください
notes任意 — 自由記述、あなた自身の参考用です

またはこの呼び出し自体を完全に省略することも可能です — 下記のAUTOMATEを参照。

3. アプリ内で検証

Python — 公式SDK(推奨)
# pip install sublimekeys
from sublimekeys import SublimeKeysClient

client = SublimeKeysClient(product_id="my-app")
result = client.activate(license_key=key)   # first run
result = client.verify(license_key=key)     # every launch after — offline-first,
                                             # verifies a signed lease locally,
                                             # zero network calls for up to 7 days
if result.valid:
    unlock_full_version()
Node.js / Electron — 公式SDK(推奨)
// npm install sublimekeys
import { SublimeKeysClient } from "sublimekeys";

const client = new SublimeKeysClient("my-app");
const activated = await client.activate(key);     // first run
const result = await client.verify(key);          // every launch after — offline-first,
                                                   // verifies a signed lease locally,
                                                   // zero network calls for up to 7 days
if (result.valid) unlockFullVersion();

PythonやNode.jsを使っていない、または生のAPIを自分で呼び出したいですか? PyPI上のPython SDK · npm上のNode.js SDK または下記のエンドポイントを直接使用してください。

Python — 生のAPI
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 — 生のAPI
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"}'
▸ 初めてですか?これらの呼び出しがアプリ内で実際にどこに入るか

上記の例は /activate 単体しか示していません — 実際のアプリでは、異なるタイミングで異なるエンドポイントを呼び出します:

アプリ起動
├─ まだライセンスキーが保存されていない(初回起動)
│    → 「ライセンスキーを入力」画面を表示
│    → ユーザーが送信 → 一度だけ /activate を呼び出す → 結果をローカルに保存
│
├─ すでにライセンスキーが保存されている(それ以降の毎回の起動)
│    → 代わりに /verify を呼び出す(再度 /activate ではない)— このマシン上で
│      まだ有効かどうかを確認
│
├─ APIに到達できない(ユーザーがオフライン)
│    → /activate と /verify のどちらも署名付きの「リース」(7日間有効)を返す
│    → 最後の結果を盲目的に信頼するのではなく、その署名をローカルで検証する
│      — PythonとNode.jsのSDKはこれを自動的に行う。他の
│      言語では、Ed25519署名を自分で検証できる(公開鍵は
│      GET /public-keyで取得)
│
└─ ユーザーがアンインストール/サインアウト(任意)
     → /deactivate を呼び出し、枠を別のマシンのために解放する

PythonまたはNode.js/Electronでは、公式SDK(PyPInpm)がこれをすでに処理してくれます — オフラインリースの実際の暗号検証も含めてです。下記の生のバージョンはそのステップを省略します(オフライン時は単に最後に保存された結果を信頼するだけです)— よりシンプルですが、暗号学的には検証されていません。Python/Node.jsを使っていない場合、または完全な制御が欲しい場合に使用してください。

Python — アプリ起動時の完全なフロー(生のAPI、SDKなし)
import requests, json, os

STATE_FILE = "license_state.json"

def check_license(machine_id):
    saved = json.load(open(STATE_FILE)) if os.path.exists(STATE_FILE) else None

    try:
        if saved is None:
            # first run — ask the user for their key once
            key = prompt_for_license_key()
            r = requests.post("https://api.sublimearts.io/activate", json={
                "license_key": key, "machine_id": machine_id, "product_id": "my-app",
            }, timeout=5)
        else:
            # every later launch — re-check the saved key, don't ask again
            r = requests.post("https://api.sublimearts.io/verify", json={
                "license_key": saved["license_key"], "machine_id": machine_id, "product_id": "my-app",
            }, timeout=5)

        result = r.json()
        json.dump(result, open(STATE_FILE, "w"))
        return result["valid"]

    except requests.RequestException:
        # offline — trust the last known result instead of locking the user out
        return saved["valid"] if saved else False

すでにこの概念に慣れていますか?これは飛ばしてください — 上記の呼び出しだけで十分です。

公式SDK

🐍 Python — sublimekeys

API全体をラップし、オフライン検証を代わりに処理します — ローカルで検証される署名付きリースによりactivate/verify/deactivateを行うため、ほとんどの起動でネットワーク呼び出しがゼロになり、オフライン期間を乗り越えられるトライアルチェックも備えています。ターミナルから統合をテストするためのsublimekeys CLIもインストールされます。

pip install sublimekeys
PyPIで見る →

⚡ Node.js / Electron — sublimekeys

同じくオフライン対応の設計で、ランタイム依存はゼロ — Ed25519検証にはNode組み込みのcryptoを使うため、Electronのasarパッケージングが躓く要素はありません。

npm install sublimekeys
npmで見る →

他の言語も今後のロードマップに含まれています。それまでは、以下のすべてのエンドポイントは単純なREST呼び出しです — HTTPSリクエストを送れるものであれば何からでも呼び出せます。

エンドポイントリファレンス — パブリック(あなたのアプリから呼び出される)

POST /activate

body: { "license_key", "machine_id", "product_id" }

▸ 詳細

初回実行 — ライセンスキーをmachine_idに紐付けます。同じマシンで再度呼び出しても安全です — 別のアクティベーション枠を消費することはありません。できない場合(例:別のマシンでアクティベーション上限に達している場合)はメッセージ付きでvalid:falseを返します。成功時には、レスポンスのleaseフィールドに署名付きリース(7日間のオフライン信頼ウィンドウ)も返されます — Python SDKは、以降の起動時に毎回APIを呼び出す代わりに、これをローカルで検証します。

POST /verify

body: { "license_key", "machine_id", "product_id" }

▸ 詳細

それ以降の毎回の起動時 — キーがこのマシン上でまだ有効であることを確認します。アクティベーション数には影響しないため、何度でも自由に呼び出せます。成功するたびに署名付きリース(/activateを参照)も更新されます。

POST /deactivate

body: { "license_key", "machine_id", "product_id" }

▸ 詳細

ユーザーがサインアウト/アンインストール — 別のマシンのために枠を解放します。

POST /trial/start

body: { "machine_id", "product_id" }

▸ 詳細

マシンに対して7日間のトライアルを取得または作成します。冪等です — 再インストールしても時計がリセットされることはありません。

POST /trial/status

body: { "machine_id", "product_id" }

▸ 詳細

読み取り専用のトライアル確認です — トライアルを開始することはありません。

これらにはAuthorizationヘッダーは不要です — license_key自体が認証情報です。完全なアカウントスコープのAPI(create/list/revoke)は /v1/* 以下にあります。ダッシュボードを参照してください。

⚡ AUTOMATE — バックエンド不要のキー配信

上記のステップ2を完全に省略できます。決済プロバイダーのWebhookをあなたのプロダクトのURLに向ければ、販売のたびに自動でキーが発行され、購入者にメール送信されます。

  1. Stripeダッシュボード → Developers → Webhooks → Add endpoint
  2. あなたのプロダクトのURLを貼り付けてください (サインインしてプロダクトを作成すると取得できます)
  3. イベントを選択: checkout.session.completed
  4. 保存してください。以上です — サーバーもコードも不要です。
  5. 任意ですが推奨:Stripeはこの直後にSigning secretを表示します — これをプロダクトページの「Signature verification」に貼り付けることで、このURLを知っているだけの誰かではなく、本物のStripeからのものだけを受け付けるようになります。

🔔 販売のたびに自分自身にもメールが欲しいですか?プロダクトページのこのブロックの隣にある「Notify me」を切り替えてください。

GUMROAD、KEYGEN、または自前のサーバーから移行

既存の顧客を email 列を1つ持つCSVにエクスポートし、これをプロダクトごとに一度実行してください。行ごとに、あなたのブランドをプレフィックスとした新しいSublimeKeysライセンスを一括発行します。

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"])

これは完全に新しいキーを発行するものです — 古いキー文字列は保持されません(設計上、カスタムのキー値は受け付けていません)。顧客に新しいキーをメールで送るか、旧システムを廃止するまでの移行期間中、アプリ内で両方のチェックを並行して実行してください。

プランの上限

FREE

1プロダクト · 100キー · 5デバイス/キー

PRO

5プロダクト · 1,000キー · 25デバイス/キー

BUSINESS

プロダクト・キー数無制限 · 100デバイス/キー

上限に達しても既存のキーが壊れることは決してありません — 永久に検証され続けます。アップグレードするまで新しいキーを発行できなくなるだけです。ダウングレードや解約でも、何かが削除されることは決してありません。