Product
販売するソフトウェア本体です。例: デスクトップアプリ、プラグイン、開発ツール。1つの Product に価格、説明、サポート先、アクティベーション上限が紐づきます。
Invite-only closed beta / Stripe test mode
Activatist は、開発者が自分のソフトウェアのライセンスキーを販売し、購入後にアプリ内で検証・有効化できるようにするAPIです。このページはプログラム初学者でも実装できるように、用語、流れ、主要言語のコード例を日本語でまとめています。
POST /v1/licenses/activate
Content-Type: application/json
{
"product_id": "prod_123",
"license_key": "LIC1-XXXX-XXXX-XXXX-XXXX",
"device_fingerprint": "device-abc"
}
Choose Your Path
Concepts
販売するソフトウェア本体です。例: デスクトップアプリ、プラグイン、開発ツール。1つの Product に価格、説明、サポート先、アクティベーション上限が紐づきます。
購入後に発行されるキーです。ユーザーがアプリに入力し、アプリが Activatist API に送って検証します。ログに出してはいけません。
「この端末で使い始める」操作です。同じ端末の再アクティベーションは冪等で、別端末は activation_limit を超えると拒否されます。
端末を見分けるためのアプリ側IDです。メールアドレスや氏名などの個人情報を入れず、安定したランダムIDを使います。
Before You Start
https://license.souko.workLIC1-XXXX-XXXX-XXXX-XXXXQuickstart
Lifecycle
| タイミング | 呼ぶAPI | 理由 |
|---|---|---|
| 初回ライセンス入力 | activate | この端末を利用枠として登録します。 |
| アプリ起動時 | validate | seatを増やさず、revoke/refund/expiredを確認します。 |
| 24時間に1回程度 | validate | 状態変化を反映しつつ、過剰なAPI呼び出しを避けます。 |
| ユーザーが端末解除 | deactivate | ポリシーが許す場合に利用枠を空けます。 |
| ネットワーク不通 | 短いgrace | 最後の成功状態を短時間だけ使い、復旧後にvalidateします。 |
Device Fingerprint
推奨は、アプリごとにランダムUUIDを生成し、OSの安全な保存先に保存する方式です。メール、氏名、電話番号、IPアドレス、raw hardware serial は使いません。
Application Support 配下、可能なら Keychain。ファイル保存なら権限を絞ります。
AppData 配下、可能なら Credential Manager / DPAPI を検討します。
XDG config 配下に保存し、権限は `0600` 相当にします。
Keychain / Keystore / Secure Storage を使います。
`app.getPath("userData")` と OS secure storage を組み合わせます。
localStorage は消える可能性があります。web-only appではseat管理に注意します。
Activation Deep Dive
アクティベーションは「ライセンスキーが正しいか」だけでなく、「この端末を利用枠として登録できるか」も確認します。
アプリの設定画面や初回起動画面で受け取ります。
個人情報を含まない安定IDをローカル保存します。
product_id、license_key、device_fingerprint を送ります。
valid=true なら有料機能を有効にします。
Runtime Endpoints
/v1/licenses/validate起動時や定期チェックで使います。activation_count は増えません。
/v1/licenses/activate初回認証や端末登録で使います。activation_limit を超えた別端末は `409 conflict` になります。
/v1/licenses/deactivate端末の解除で使います。ポリシー上許可されている場合、利用枠を空けます。
Code Samples
下のタブで言語を切り替えられます。TypeScript / Go / Python は実運用寄り、その他は最小例として読んでください。
ブラウザやElectronで使いやすい fetch の例です。
Errors
| HTTP | 意味 | アプリ側の表示例 |
|---|---|---|
| 400 | 入力が不足、形式が不正 | 入力内容を確認してください。 |
| 403 | キーが使えない状態 | このライセンスは利用できません。 |
| 404 | 対象が見つからない | ライセンス情報が見つかりません。 |
| 409 | アクティベーション上限超過 | 利用可能な端末数の上限に達しました。 |
| 429 | 短時間にリクエストが多すぎる | 少し待ってから再試行してください。 |
GET /v1/public/products/{slug}POST /v1/public/products/{slug}/checkoutPOST /v1/purchases/completePOST /v1/purchases/files/{file_id}/download-intentPOST /v1/licenses/validatePOST /v1/licenses/activatePOST /v1/licenses/deactivatePOST /v1/sellersPOST /v1/sellers/stripe/account-linkPOST /v1/productsPOST /v1/products/{product_id}/submit-reviewPOST /v1/products/{product_id}/files/upload-intentPOST /v1/products/{product_id}/files/{file_id}/finalizeGET /v1/admin/sellersPATCH /v1/admin/products/{product_id}/reviewGET /v1/admin/product-filesPATCH /v1/admin/products/{product_id}/files/{file_id}/reviewPOST /v1/stripe/webhookGET /readyzChecklist
Safety Rules
ライセンスキー、completion token、buyer email、Firebase token、Bearer token、Stripe/Resend/R2/Cloudflare の秘密情報、presigned URL はログや共有メモに出さないでください。
device_fingerprint にメールアドレス、氏名、電話番号、住所などを入れないでください。ランダムIDを作って端末内に保存する方式が扱いやすいです。
起動時チェックは validate、端末登録は activate、端末解除は deactivate と役割を分けると、ユーザー体験とサーバー負荷が安定します。
Activatist は first-party software license 用です。ギフトカード、ポイント、第三者キー転売、C2C resale には使えません。