API version 2026-09-21
APIリファレンス外部システム連携(Management API)
販売管理、請求、CRM、サポートなど、すでにお使いのシステムとUsakeyをつなぐためのAPIです。このページではそれらをまとめて「自社システム」と呼びます。
このページの読み方
分かること
- 自社システムからライセンスを発行・変更する方法
- Usakeyで起きた変化を、自社システムが受け取る方法
- APIキーの権限設計と、通知の署名検証
- AIアシスタント(MCP)から会話で操作する方法
前提
- 管理画面で製品と利用ルールを登録済みであること
- APIを呼ぶ処理を、自社サーバー側で実装できること
- 通知を受け取る場合は、公開HTTPSのURLを用意できること
最短の進め方
製品アプリ側へ認証を組み込む手順は、製品アプリ組み込み(Runtime API)のページにあります。
外部連携の全体像
連携には2つの方向があります。自社システムからUsakeyを操作する方向と、Usakeyから自社システムへ変化を知らせる方向です。前者にAPIキー、後者にWebhook通知を使います。
販売・請求・CRM
契約の成立や変更
受注、入金、更新、解約など、自社システムが正式に管理する情報を使って処理を始めます。
APIキーで操作
顧客とライセンスを同期
必要な操作権限だけを持つAPIキーで、発行・更新・停止・再開・取消を行います。
Usakey
契約条件を製品へ反映
製品アプリからの次回確認時に、現在のライセンス状態を返します。
Webhook通知
変化を自社システムへ通知
発行、期限切れ、一時停止、端末認証などを署名付きJSONで知らせます。
自社システム → Usakey
APIキーの使い方
APIキーは、自社システムがUsakeyへ安全に操作を依頼するための認証情報です。管理画面の「APIキー」で作成し、連携先ごとに必要最小限の操作だけを許可します。
- 作成場所
- 管理画面の「開発・連携」→「APIキー」→「APIキーを作成」。作成と失効の前には、直近10分以内の本人確認(2段階認証を登録していれば確認コード、登録していなければパスワード)を求めます。
- 保存場所
- 自社サーバーのシークレット管理機能へ保存します。ブラウザや、顧客へ配布するアプリには入れません。
- 送信方法
Authorization: Bearer <APIキー>をHTTPヘッダーへ指定します。- 権限
- 例: ライセンスを見る
licenses:read、発行・変更するlicenses:write。用途ごとにキーを分けます。全権限は下の表のとおりです。 - 環境と有効期限
- キーはtest(動作確認用)かlive(本番)のどちらかの環境に属します。liveのキーを作るには、作成する人の2段階認証の登録が必要です。有効期限も設定できるので、連携先ごとに期限を決め、更新の手順を用意してください。
| 権限 | できること |
|---|---|
products:read | 製品情報を見る登録済み製品の情報を取得します。 |
products:write | 製品を登録・変更する製品の作成、更新、アーカイブを許可します。 |
policies:read | 利用ルールを見る端末数や期限などの設定を取得します。 |
policies:write | 利用ルールを登録・変更するライセンスの利用条件を管理します。 |
customers:read | 顧客情報を見る顧客台帳を取得します。 |
customers:write | 顧客を登録・変更する顧客・顧客組織・販売店・ライセンスユーザーを登録・変更します(エンドユーザーのサインイン設定は含みません)。 |
licenses:read | ライセンスを見る発行状況や有効期限を取得します。 |
licenses:write | ライセンスを発行・変更する発行、更新、停止、再開、取消を行います。 |
activations:delete | 端末の認証を解除する紛失端末などをライセンスから解除します。 |
webhooks:read | Webhook設定を見る登録済みの通知先設定を取得します。 |
webhooks:write | Webhook設定を変更する通知先の登録、変更、無効化を行います。 |
events:read | 操作履歴を見る管理操作や端末認証の記録を取得します。 |
reports:read | 利用状況を集計するライセンスと端末の利用件数を取得します。 |
sso:read | サインイン設定を見る顧客ポータルのサインインに使うOIDC接続(IdP)の設定を取得します。 |
sso:write | サインイン設定を変更するOIDC接続(IdP)の発行者・エンドポイント・公開鍵の取得先などを変更します。顧客ポータルに誰がサインインできるかが変わるため、必要な連携だけに付けてください。 |
顧客ポータルのOIDC接続(サインイン設定)の操作には、sso:read / sso:write が必要です。 以前は customers:read / customers:write で扱えましたが、IdPを差し替えられる権限を顧客台帳の権限から分けました。OIDC接続を扱う既存のAPIキーは、新しい権限を付けるまで SCOPE_REQUIRED(HTTP 403)になります。APIキーの権限は作成後に変えられないため、sso:read / sso:write を付けたキーを作り直して連携先を切り替え、古いキーは取り消してください。
連携先ごとの使い分け
請求システム
入金後にライセンスを発行
顧客情報を登録し、購入した製品・利用ルール・期限を指定して自動発行します。
契約管理
更新・停止・再開を同期
契約の変更をUsakeyへ反映し、製品アプリの次回確認で新しい状態を届けます。
CRM・サポート
契約と端末の状況を確認
問い合わせを受けたときに、ライセンス状態・期限・認証済み端末を確認できます。
運用レポート
利用状況を集計
製品別・契約別の利用状況を取得し、更新案内や顧客支援へ活用します。
自社システム → Usakey
ライセンスを操作する
ライセンスの発行・更新・停止・再開・取消は、/mgmt/v1/ で始まるAPIで行います。通信仕様やOpenAPI上では、これらをManagement APIと表記します。次は、請求システムで入金を確認したあと、製品・利用ルール・顧客を指定してライセンスを発行する例です。
作成のリクエスト(POST)には、Idempotency-Key ヘッダーを付けてください。次の操作では必須で、付けずに送ると IDEMPOTENCY_KEY_REQUIRED で拒否されます: ライセンスの発行とトライアルの変換、顧客・製品・利用ルール・販売店・顧客組織・組織グループ・グループへの所属・ライセンスユーザー・OIDC接続・ライセンスの割当の作成。Webhook通知先の作成では任意ですが、付けると同じように二重の作成を防げます。変更(PATCH)と削除(DELETE)には不要です。
POST /mgmt/v1/licenses
Authorization: Bearer usk_live_…
Idempotency-Key: 7e2c4d5a-6f44-4b8f-90f4-4ee9b34d66e2
Content-Type: application/json
{
"product_id": "prod_01K123EXAMPLE",
"policy_id": "pol_01K123EXAMPLE",
"customer_id": "cus_01K123EXAMPLE",
"expires_at": "2027-08-24T00:00:00Z",
"entitlements": { "export_pdf": true }
}- product_id
- どの製品のライセンスかを指定します。管理画面の製品詳細に表示されます。
- policy_id
- 端末数や通信断時の動作を決めた利用ルールです。管理画面の「利用ルール」で作成します。
- customer_id
- 発行先の顧客です。省略した場合、ライセンスは顧客へひも付きません。
- expires_at
- 契約期限です。ISO 8601で指定し、時間帯を省略した場合は日本時間として解釈します。買い切りでは指定しません。検証プランでは必須で、発行時刻から1時間以内である必要があります(期限なしの買い切りも発行できません)。旧名の
expiryも当面受け付けますが、非推奨です。 - entitlements
- 製品アプリ側で機能を出し分けるための権利名です。この例は「PDF出力を利用できる」を表します。
この操作には「ライセンスを発行・変更する」権限(licenses:write)が必要です。
Idempotency-Key)は、新しい作成操作ごとに一意なUUIDを生成します。 通信結果が分からず同じ操作を再試行するときだけ、同じ値を使ってください。同じキーに違う本文を送ると IDEMPOTENCY_CONFLICT になります。署名シークレットの更新(Webhook・OIDC)とオフライン利用ファイルの発行は、冪等キーに対応していません。Webhookの署名シークレットの更新で結果が分からなかったときは、送り直すと予約済みとして WEBHOOK_SECRET_ROTATION_INVALID になるため、予約を取り消して(DELETE)からやり直してください。オフライン利用ファイルは、同じ要求ファイルと同じ指定内容で再試行します。なお、ここでいうキーは、製品アプリがRuntime APIの初回端末認証で使うものや、Stripe連携のライセンスキー受け取りで使うものとは別で、混ぜて使わないでください。PRODUCT_SIGNING_KEY_PENDING と retryable: true が返った場合は、数分待ち、同じ本文と同じ Idempotency-Key で再試行してください。製品IDやSDKの設定変更は不要です。毎秒のポーリングは行わないでください。 Management APIの呼び出しには、次の3つの上限があります。
- APIキー1つあたり: 30回/分・300回/時(全プラン共通)
- 契約組織のAPIキー全体: 検証 30回/分・300回/時/個人 30回/分・300回/時/チーム 120回/分・5,000回/時/大規模 600回/分・20,000回/時。検証・個人では、キーを増やしても全体の枠は増えません。
- 同じ接続元IPアドレスから: 120回/分
変化の検知にはWebhook通知を使い、HTTP 429を受け取った場合はRetry-After秒待ってから再試行してください。429の応答にはRateLimit-Limit、RateLimit-Remaining、RateLimit-Resetも付きます。
製品アプリからメール確認付きで試用を始められるようにする設定(試用に使う利用ルールと、24時間の受付上限)は、管理画面の製品の編集のほか、GET/PATCH /mgmt/v1/products/{product_id}/trial-signup(products:read/products:write)でも読み書きできます。確認は管理画面と同じで、利用ルールを選ぶにはトライアルを含む契約プランが必要です。
製品のファイルの暗号化(同梱するファイルを、ライセンスが有効な端末でだけ開けるようにする機能)は、管理画面の製品の詳細のほか、GET/POST /mgmt/v1/products/{product_id}/sealed-files(products:read/products:write)でも状態を読み、有効にできます。POST は本文なしで、何度送っても同じ結果です(Idempotency-Key は使いません)。有効にした後は無効に戻せません。チームプラン以上が必要で、プランに含まれなければ PLAN_ENTITLEMENT_REQUIRED です。有効にするとすぐに current_key が返ります。暗号化用の鍵に一時的につながらないときは 503 SEALED_FILES_KEY_UNAVAILABLE なので、時間をおいて送り直します。current_key.sealing_key は暗号化ツールに渡す1行の公開鍵で、秘密ではありません。ファイル本体はUsakeyに送りません。暗号化しても、ライセンスが有効な端末の管理者は、アプリが開いた後のデータを取り出せます。また暗号化はファイルを作った人を証明しないので、差し替えを防ぎたいファイルはアプリでハッシュを確かめます。
顧客、利用ルール、端末認証、監査ログなど、そのほかの操作と全項目の定義はAPIリファレンスにまとまっています。
自社システム → Usakey
AIアシスタントから操作する(MCP)
Claude Code、CodexなどのAIアシスタントから、このページのAPIを会話で操作できます。MCP(Model Context Protocol)は、AIアシスタントが外部のサービスを呼び出すための共通の仕組みです。UsakeyはMCPサーバー https://usakey.jp/mcp を公開しており、AIアシスタントに追加してブラウザでログインすると、「このライセンスを一時停止して」のような依頼を受けて、AIがAPIを呼び出します。同じ接続で、製品アプリへの組み込み用のスキルも読めます。
依頼の例
- 期限が切れたライセンスを一覧して
- 顧客「株式会社サンプル」を登録して、標準の利用ルールでライセンスを発行して
- このライセンスを、支払い遅延の理由で一時停止して
- このライセンスの端末一覧を見せて。古いPCの認証を解除して
- 直近30日の利用状況と、今日の変更履歴を教えて
- UsakeyのMCPのスキルを使って、このアプリにライセンス認証を組み込んで
操作できる範囲
- AIが実行できるのは、ブラウザの確認画面で許可した範囲の操作だけです。許可していない操作のツールは、AIに表示されません。
- 製品、利用ルール、顧客、ライセンス、端末認証、監査ログ、利用状況、Webhook通知、ユーザー単位ライセンス、顧客ポータルのサインイン設定(OIDC接続)を扱えます。組み込み用の接続設定、プランの上限と今月の使用数、端末の定期確認の状況、自社Stripe連携の状態も確かめられます。製品アプリからの試用の受付も、
get_product_trial_signup/update_product_trial_signupで確かめ・変更できます。製品のファイルの暗号化は、get_product_sealed_filesで状態と暗号化用の公開鍵を確かめ、enable_product_sealed_filesで有効にできます(無効に戻すツールはありません)。 - 製品アプリへの認証の組み込みは、同じMCPで届くAI開発者用スキルが担います。
- 製品の削除と、OIDC接続の作成・Client Secretの変更は、管理画面から行います(IdPの秘密情報を会話に残さないため)。
導入の流れ
- AIアシスタントに、MCPサーバー
https://usakey.jp/mcpを追加します(指示文をAIに渡すか、下のコマンドを実行します)。 - ブラウザでUsakeyにログインし、確認画面で契約組織と許可する範囲を選びます。管理操作を許可する場合は、まず動作確認用(test)、必要な範囲だけにしてください。プロダクション用と両方で「日常の運用を許可する」以上を許可するには、許可する人の2段階認証の登録が必要です。
- AIアシスタントに日本語で依頼します。ログインの状態はAIアシスタントが保持し、自動で更新します。
# Claude Code(追加後、/mcp で usakey を選んで Authenticate)
claude mcp add --transport http --scope user usakey https://usakey.jp/mcp
# Codex(追加するとブラウザが開いてログインが始まります)
codex mcp add usakey --url https://usakey.jp/mcpAIに頼む場合の指示文と、確認画面の選び方は製品アプリ組み込み(Runtime API)のクイックスタートにあります。接続は、管理画面のAIアシスタントの接続からいつでも取り消せます。
許可する範囲と、使えるAPIの権限
- スキルだけ使う
- スキルを読むだけです。管理ツールはありません。どの役割でも選べます。
- 参照だけ許可する
products:readpolicies:readcustomers:readlicenses:readevents:readreports:read- 日常の運用を許可する
- 上に加えて
customers:writelicenses:writeactivations:delete。顧客登録、ライセンスの発行・停止・再開・取消、端末の認証解除ができます。 - 製品・利用ルール・Webhook通知の設定も許可する
- 上に加えて
products:writepolicies:writewebhooks:readwebhooks:write。製品・利用ルールの作成と変更、Webhook通知先の登録・変更・署名シークレットの切り替えができます。 - ユーザー単位ライセンスのツール
- 確認画面で「ユーザー単位ライセンス(販売店・組織・グループ・ライセンスユーザー)のツールも使う」を選ぶと、販売店・顧客組織・グループ・ライセンスユーザー・割当のツールも表示します(上の範囲の
customers:read/customers:writeの中で動きます)。使えるプラン(個人以上)では最初からチェックされています。個人プランでは、顧客組織と販売店は使えません(チーム以上)。 - サインイン設定のツール
- 確認画面でサインイン設定(顧客ポータルのOIDC接続・IdP)のツールを選ぶと、
sso:readが付き、OIDC接続の一覧と詳細を見られます。「製品・利用ルール・Webhook通知の設定も許可する」のときはsso:writeも付き、変更・停止もできます。顧客ポータルに誰がサインインできるかが変わるため、必要なときだけ選んでください(最初は外れています。チーム以上のプランで選べます)。
管理操作を許可できるのは、契約組織のオーナーと管理者です。許可すると、その範囲の権限と環境を持つ、接続専用のAPIキーを作ります(キーの値はどこにも表示しません)。許可した人が契約組織を離れたり、管理操作を許可できない役割に変わったりすると、その接続は使えなくなります。確認画面の既定の選択は、アプリの発行元を確かめられ、あなたの役割で管理操作を許可できる場合は「参照だけ許可する」、それ以外は「スキルだけ使う」です。
操作する環境と「両方」
管理操作を許可するときは、確認画面で操作する環境を選びます。
- 動作確認用(テスト環境の製品だけを操作します)
- プロダクション用(顧客へ配布した製品のライセンスが変わります)
- 両方(動作確認用とプロダクション用の製品を操作します)
「両方」の接続は、同じ権限のAPIキーを環境ごとに1つずつ持ちます。管理画面の「APIキー」には、1つの接続のキーが2つ並びます。2段階認証の条件はプロダクション用と同じです。AIのツールを呼ぶたびに、次の順でどちらのキーを使うかを決めます。
- ツールの引数
environment(testかlive)。「両方」の接続でだけ表示する引数で、APIへは送りません。 - IDで指した対象の環境(ライセンス → 端末認証 → 利用ルール → 製品の順に調べます)。
environmentと対象の環境が食い違うときは、APIを呼ばずに止め、ENVIRONMENT_REQUIREDとヒントを返します。 - IDを指定しない一覧(
list_products・list_policies・list_licenses・list_runtime_events)は、environmentを省略すると両方を順に呼んでまとめ、各項目にenvironmentを付けて返します。この場合は月間回数を2回使います。続きのページは、環境ごとの位置を持つcursorで取ります。 - 製品の作成(
create_product)はenvironmentが必須です。製品名と製品コードはtestとliveをまたいで一意なので、同じ製品を両方に作るときは名前とコードを分けます。 - 利用状況の集計(
get_usage_report)はenvironmentかproduct_idが必要です。testとliveの数は合算しません。 - 環境で分かれていないもの(顧客・ユーザー単位ライセンス・サインイン設定・Webhook通知・監査ログ・プラン・自社Stripe連携)は、プロダクション用のキーで扱います。
管理画面の操作履歴では、実行者に使ったキーの環境が添えられます(例「MCP: Codex / …(プロダクションのキー)」)。環境・許可する範囲・ツールの種類は、あとから管理画面のAIアシスタントの接続の「設定を編集」で変えられます(保存の前に、直近10分以内の本人確認を求めます)。動作確認用から両方へ広げるときは今のキーをそのまま使い、外した環境のキーと権限が変わるキーは作り直して、古いキーを失効させます。
利用状況(get_usage_report)の active_machines は、期間内に認証して解除していない端末の数です。一時停止中・期限切れのライセンスの端末も含むため、いま製品を使える台数ではありません。
プランで選べない項目は、確認画面で薄く表示され、次の理由が添えられます。
- この契約組織のプランではプロダクション用の製品を作れないため、「プロダクション用」と「両方」は選べません(個人プラン以上)。
- この契約組織のプランでは、ユーザー単位ライセンスを使えません(個人プラン以上)。
- この契約組織のプランでは、顧客組織と販売店を使えません(チームプラン以上)。
- この契約組織のプランでは、顧客ポータルのサインイン設定(OIDC)を使えません(チームプラン以上)。
安全に使うために
- 変更系のツールは自動で承認しないでください。特にライセンスの取消(
revoke_license)は元に戻せません。各ツールには参照・追加・変更の区別を付けて、AIアシスタントへ伝えています。 - 元に戻せない操作は、対象の確認が一致したときだけ実行します。ライセンスの取消はキーの末尾4文字(
confirm_key_last4)、利用ルールの廃止(retire_policy)と顧客のアーカイブ(archive_customer)は名前(confirm_name)です。AIが利用者に確かめた値かどうかを、承認の前に見てください。 - 顧客名、メモ、metadataなど、Usakeyから取得したデータにAIへの指示が紛れ込む可能性があります。変更の承認は人が行い、許可する範囲を必要最小限にしてください。
- スキルに同梱のスクリプト(SDKの取得)をAIが実行するときは、AIアシスタントの確認画面で内容を確かめてから承認してください。
reveal_key: false を指定するよう伝えてください。応答からキーが除かれ、全文は管理画面のライセンス詳細で表示できます。Webhook署名シークレットは作成時の応答でしか取得できないため、会話に残したくない場合は管理画面から作成してください。get_plan_limits と、入力の誤り・状態の不一致・署名鍵の準備待ちなど何も変えずに断られた呼び出しは、月間回数に数えません。スキルを読むだけなら消費しません)。プランごとの回数は料金ページに記載しています。一覧の既定は20件です(AIが最大200件を指定することがあります)。全件を自動で読み進めることはしません。対応している仕様
- MCP 2026-07-28(Streamable HTTP。セッションを持たず、要求ごとに
_metaとMCP-Protocol-Version・Mcp-Method・Mcp-Nameヘッダーを送る方式、server/discover)と、2025-03-26〜2025-11-25のinitializeを行う方式 - スキル拡張
io.modelcontextprotocol/skills(skills/list・skills/get・resources/directory/read)と、skill://のリソース - OAuth 2.1の認可コード(PKCE S256必須)とリフレッシュトークンのローテーション、Protected Resource Metadata(RFC 9728)、認可サーバーメタデータ(RFC 8414)、Client ID Metadata Document、動的クライアント登録(RFC 7591)、
resource(RFC 8707)、iss(RFC 9207)
APIキーで使うローカル版(オプション)
公式SDKには、自分のコンピューターで動かすMCPサーバー(usakey-sdk/mcp/)も同梱しています。ブラウザでのログインの代わりにAPIキーを使うので、CIなどブラウザを開けない環境で使えます。オフライン認証ファイルの発行や、ライセンスキーを会話に出さずにファイルへ保存する操作は、このローカル版だけが行えます。スキルは提供しないため、スキルは上のMCPかZIPで導入してください。
導入の流れ
- Node.js 20.3以上を用意します。MCPサーバーに追加のパッケージは不要です。
- 公式SDKをダウンロードし、チェックサムを照合して展開します。MCPサーバーは
usakey-sdk/mcp/にあります。 - 管理画面の「開発・連携」→「APIキー」で、MCP専用のAPIキーを作成します。まずtest環境で、必要な権限だけにしてください。キーは自分だけが読めるファイルに保存します。
- 接続を確認してから、お使いのAIアシスタントへ登録します。
次はLinux / macOSで、ホームフォルダへ展開する例です。read の行ではAPIキーを貼り付けてEnterを押します(画面と履歴には残りません)。WindowsではPowerShellの Get-FileHash -Algorithm SHA256 でチェックサムを照合してください。
cd ~
curl -fSLO https://usakey.jp/downloads/usakey-sdk.zip
curl -fSLO https://usakey.jp/downloads/usakey-sdk.zip.sha256
sha256sum -c usakey-sdk.zip.sha256 # macOSでは shasum -a 256 -c
unzip -q usakey-sdk.zip
mkdir -p ~/.usakey && chmod 700 ~/.usakey
read -rs USAKEY_KEY
(umask 077 && printf '%s\n' "$USAKEY_KEY" > ~/.usakey/api-key)
unset USAKEY_KEY
USAKEY_API_URL=https://usakey.jp \
USAKEY_MANAGEMENT_API_KEY_FILE=$HOME/.usakey/api-key \
node ~/usakey-sdk/mcp/bin/usakey-mcp.mjs --check結果: 接続できました。APIキーは有効です と表示されれば準備完了です。終了コードは、APIキーが有効なら0、接続に失敗したら1です。この確認で、Management APIを1回呼び出します。
AIアシスタントへ登録する
claude mcp add usakey --scope user \
-e USAKEY_API_URL=https://usakey.jp \
-e USAKEY_MANAGEMENT_API_KEY_FILE=$HOME/.usakey/api-key \
-- node $HOME/usakey-sdk/mcp/bin/usakey-mcp.mjsclaude mcp get usakey で ✔ Connected と表示されれば登録できています。リポジトリの .mcp.json でチームに共有する場合は、APIキーの場所を "${USAKEY_MANAGEMENT_API_KEY_FILE}" のように各自の環境変数から読み込み、設定ファイルに秘密情報を書かないでください。
claude_desktop_config.json(Settings → Developer → Edit Config)に追加し、Claude Desktopを再起動します。パスは絶対パスで書きます。
{
"mcpServers": {
"usakey": {
"command": "node",
"args": ["/Users/<ユーザー名>/usakey-sdk/mcp/bin/usakey-mcp.mjs"],
"env": {
"USAKEY_API_URL": "https://usakey.jp",
"USAKEY_MANAGEMENT_API_KEY_FILE": "/Users/<ユーザー名>/.usakey/api-key"
}
}
}
}Windowsではパスの \ を \\ と書きます。起動しない場合は、node を絶対パスに置き換えてください。Claude Desktopでの動作は、まだUsakeyで確認していません。
codex mcp add usakey \
--env USAKEY_API_URL=https://usakey.jp \
--env USAKEY_MANAGEMENT_API_KEY_FILE=$HOME/.usakey/api-key \
-- node $HOME/usakey-sdk/mcp/bin/usakey-mcp.mjscodex mcp list に usakey が表示されれば登録できています。
APIキーの権限の選び方
- 状況の確認だけ
products:readpolicies:readcustomers:readlicenses:readevents:readreports:read。あわせてUSAKEY_MCP_READ_ONLY=trueを設定すると、変更系のツールを表示しません。- 日常の運用
- 上に加えて
customers:writelicenses:writeactivations:delete。顧客登録、ライセンスの発行・停止・再開、端末の認証解除ができます。 - 製品と利用ルールの設定も任せる
- 上に加えて
products:writepolicies:write。 - Webhook通知・ユーザー単位ライセンス・サインイン設定
USAKEY_MCP_TOOLSETS=core,webhooks,directory,ssoのように必要なツールを追加し、Webhook通知にはwebhooks:read/webhooks:write、ユーザー単位ライセンス(販売店・顧客組織・グループ・ライセンスユーザー)にはcustomers:read/customers:write、サインイン設定(OIDC接続)にはsso:read/sso:writeの権限を付けます。OIDC接続はcustomers:writeでは扱えません。
ローカル版を安全に使うために
- 変更系のツールは自動で承認しないでください。特にライセンスの取消(
revoke_license)は元に戻せません。各ツールには参照・追加・変更の区別を付けて、AIアシスタントへ伝えています。 - 顧客名、メモ、metadataなど、Usakeyから取得したデータにAIへの指示が紛れ込む可能性があります。変更の承認は人が行い、APIキーの権限を必要最小限にしてください。
- MCPサーバーがこのコンピューターのファイルを読むのは、オフライン認証の要求ファイル(.usakeyreq)を指定したときだけです。それ以外の形式のファイルは、送信する前に拒否します。
~/keys/sample.key に保存して」のように保存先を伝えてください。キーは所有者だけが読めるファイルへ書き込まれ、AIへの応答からは除かれます。全ツールの一覧、設定項目、うまくいかないときの確認方法は、SDKに同梱の usakey-sdk/mcp/README.md にあります。
Usakey → 自社システム
Webhook通知
ライセンスの発行・期限切れ・一時停止・再開・取消や、新しい端末の認証を、自社システムへ自動で知らせます。通知を受け取った自社システムは、CRMの更新、担当者への連絡、更新案内などの後続処理を始められます。通常は、定期的にUsakeyへ問い合わせる必要はありません(送信回数の上限は後述)。
Usakey
出来事を検知
ライセンス発行、期限切れ、一時停止、端末認証などの変化を検知します。
署名付き通知
登録したHTTPS URLへ送信
通知ID、送信時刻、JSON本文、改ざん確認用の署名を送ります。
自社システム
署名と重複を確認
本文を処理する前に署名を検証し、通知IDで二重処理を防ぎます。
後続業務
受信を記録して2xxを返す
CRM・通知・台帳への反映は、2xxを返したあとに非同期で行います。30秒以内に2xxが返らない通知は再送されます。
通知先には、自社システム(署名付きJSON)のほか、Slack・Microsoft Teams・Google Chat・Chatworkを選べます。チャットへの通知には署名が付かないため、業務処理の起点には自社システムへの通知を使ってください。
設定と受信の手順
- 管理画面の「開発・連携」→「Webhook通知」で、公開HTTPSの受信URLと、通知する出来事を登録します。あとで通知先を変更・削除したり、署名シークレットを切り替えたりするときは、直近10分以内の本人確認を求めます。
- 一度だけ表示される署名シークレットを、自社サーバーの安全な保存領域へ保存します。
- 受信したJSONを解析する前に、受信したままの本文とヘッダーで署名を確認します。
X-Usakey-Event-Idを記録して重複処理を防ぎ、すぐにHTTP 2xxを返します。CRMの更新などの後続の処理は、2xxを返したあとに非同期で行います。
Usakeyは、30秒以内に2xxが返らない配信を失敗として再送します。重い処理を終えてから応答すると、時間切れで同じ通知が何度も届きます。
同じ通知が複数回届くことがあります。 接続エラー、HTTP 408・425・429、HTTP 5xxでは最大24時間再送するためです。そのほかのHTTP 4xxは、再送しても直らない応答として扱い、再送しません。
Webhookの送信は、契約プランの月間回数を消費します。 1回送信するごとに1回と数え、再送も1回ずつ数えます。管理画面の「テスト送信」と「もう一度送る」も1回ずつ数えます。月間回数は検証100回・個人2,000回・チーム20,000回・大規模200,000回です(日本時間の毎月1日に数え直します)。月間回数に達すると、その月のそれ以降の通知は送信も再送もされず、管理画面の「操作履歴」に上限に達したことが記録されるだけです。受信側の障害で再送が続くと早く使い切るため、重要な処理は、Management APIの一覧とも1日1回程度照合してください。Webhook配信の追加枠は現在販売していないため、回数を増やすには上位のプランへの変更が必要です。
通知の署名検証
自社システムへの通知には、次のヘッダーが付きます(チャットへの通知には署名のヘッダーは付きません)。
- X-Usakey-Event-Id
- 通知を一意に識別するIDです。再送でも変わらないため、重複処理の防止に使います。
- X-Usakey-Delivery-Id
- 配信1回ごとのIDです。再送では変わるため、重複の判定には使いません。
- X-Usakey-Timestamp
- 通知を送信したUnix時刻(秒)です。
- X-Usakey-Signature
- 送信元と、改ざんの有無を確認するための署名です。
- User-Agent
Usakey-Webhook/1.0
HMAC-SHA256 は、Usakeyと受信側だけが知る共通シークレットから照合値を作る方式です。署名対象は timestamp.event_id.raw_body、結果は v1=<小文字の16進数> です。raw_body は、空白・改行・キー順を含めた「受信した本文そのもの」を指します。JSONを解析して組み立て直す前に検証してください。署名の鍵には、作成時に表示された署名シークレットの文字列をそのまま(UTF-8のバイト列として)使います。Base64URLとして復号しないでください。
X-Usakey-Timestamp が現在時刻から5分を超えてずれた通知は拒否してください(推奨値です。Usakeyの側で受信側の許容幅は決めていません)。署名シークレットの更新中は、切り替え時刻を境に新しいシークレットで署名されます。切り替え時刻の前後は、新旧どちらのシークレットで作った署名も受け付けてください。
検証コードの例
Ruby
require "openssl"
# raw_body: 受信したままの本文(JSONを解析する前の文字列)
# secrets: 署名シークレットの文字列の配列(更新中は新旧の2つ)
def valid_usakey_signature?(raw_body, headers, secrets, now: Time.now.to_i)
timestamp = headers.fetch("X-Usakey-Timestamp")
event_id = headers.fetch("X-Usakey-Event-Id")
signature = headers.fetch("X-Usakey-Signature")
return false if (now - Integer(timestamp, 10)).abs > 300 # 5分を超えてずれた通知は拒否する
signed = "#{timestamp}.#{event_id}.".b + raw_body.b
secrets.any? do |secret|
expected = "v1=" + OpenSSL::HMAC.hexdigest("SHA256", secret, signed)
OpenSSL.secure_compare(expected, signature)
end
endNode.js
import { createHmac, timingSafeEqual } from "node:crypto";
// rawBody: 受信したままの本文(Buffer)。JSON.parse の前に確かめる
// secrets: 署名シークレットの文字列の配列(更新中は新旧の2つ)
export function isValidUsakeySignature(rawBody, headers, secrets, now = Math.floor(Date.now() / 1000)) {
const timestamp = headers["x-usakey-timestamp"] ?? "";
const eventId = headers["x-usakey-event-id"] ?? "";
const signature = Buffer.from(headers["x-usakey-signature"] ?? "");
if (!/^\d+$/.test(timestamp) || Math.abs(now - Number(timestamp)) > 300) return false; // 5分を超えてずれた通知は拒否する
const signed = Buffer.concat([Buffer.from(`${timestamp}.${eventId}.`), rawBody]);
return secrets.some((secret) => {
const expected = Buffer.from(`v1=${createHmac("sha256", secret).update(signed).digest("hex")}`);
return expected.length === signature.length && timingSafeEqual(expected, signature);
});
}通知される出来事と本文
画面や業務設計では日本語名を使います。JSONの type と各IDの項目名は、受信プログラムが判定に使う固定値のため、英語のまま送られます。
lic_01K456EXAMPLE、製品 prod_01K123EXAMPLE です。{
"id": "evt_01K789EXAMPLE",
"type": "activation.created",
"api_version": "2026-08-24",
"created_at": "2026-08-25T10:30:00.000+09:00",
"tenant_id": "ten_01K000EXAMPLE",
"data": {
"activation_id": "act_01KABCEXAMPLE",
"license_id": "lic_01K456EXAMPLE",
"product_id": "prod_01K123EXAMPLE"
}
}api_version はWebhook本文の形式の版で、APIの版とは別に管理しています。
| 通知する出来事 | プログラム用の固定値 |
|---|---|
| 新しい端末がライセンス認証されたときサポート対応や不正利用の確認に使えます。 | 識別子を表示activation.createdactivation_id, license_id, product_id |
| 端末の接続元・端末情報が変わったときIP、User-Agent、OS、アプリやSDKの変化を確認できます。同じ端末の通知は、UTCの毎時0分から1時間に1回までです。その間に変わった項目は次の通知にまとめて伝えます。 | 識別子を表示activation.device_changedactivation_id, license_id, product_id, observation_id, changed_fields, observed_at |
| 端末のリスク判定でライセンス認証が停止されたときVM検出や時計改ざんなど、端末リスクによる自動停止を確認できます。 | 識別子を表示activation.risk_blockedactivation_id, license_id, observation_id, score, signals, action |
| ライセンスが発行されたとき受注管理やCRMへ発行完了を反映できます。 | 識別子を表示license.createdlicense_id, product_id, customer_id |
| ライセンスの有効期限が切れたとき更新案内や利用停止の後続処理を開始できます。 | 識別子を表示license.expiredlicense_id, expired_at, reason |
| ライセンスが一時停止されたとき支払い状況やサポート判断を自社システムへ反映できます。 | 識別子を表示license.suspendedlicense_id, status, reason |
| ライセンスの利用が再開されたとき復旧通知や契約状態の同期に使えます。 | 識別子を表示license.resumedlicense_id, status, reason |
| ライセンスが取り消されたとき解約後のアクセス停止や台帳更新に使えます。 | 識別子を表示license.revokedlicense_id, status, reason |
*(すべての出来事を通知する)を選ぶと、今後追加される種類も含めてすべて受け取ります。リスク規則で端末の認証を止めたときは activation.risk_blocked、ライセンスを一時停止したときは license.suspended が届きます。
customer_id は、顧客を割り当てずに発行した場合 null になります。今後の項目追加に備え、受信側は知らない項目を無視してください。