Modパック作者向けAPI:アクティベーションコードと更新
有料Modパックの作者がMillida Hosting APIを通じてアクティベーションコードを発行し、更新を公開する方法:Modパックのバージョン、アーカイブのアップロード、公開、ロールバック、コードの状態、Webhookについて説明します。
更新日 2026年9月6日
コードを書く必要はありません。 以下で説明する内容はすべてボタンからも実行できます。あなたのModパックがMillidaアカウントに連携されていれば、プロフィールに**「マイModパック」**タブが表示され、そこでバージョンのアップロード、カードの編集、ランディングページの作成ができます。連携されていない場合は、お問い合わせいただければ連携します。APIは、独自のCIからデプロイする方向けのものです。
この記事は、有料Modパックを自ら販売し、サーバーのインストールを当社に任せる作者向けです。購入者は何もダウンロードする必要がありません。コードを入力するだけで、展開済みのModパックを入手できます。購入者側からどのように見えるかを確認するには、有効化コード経由の有料Modパックをお読みください。
はじめに必要なもの
- Modパックのサーバーアーカイブをお送りください。ルートに
mods/がある.zip(Server Files/のようなラッパーフォルダーなし)または.mrpackです。アーカイブは当社のプライベートストレージに保存され、リンクが外部に共有されることはありません。 - コア、ゲームバージョン、最小メモリをお知らせください。ウィザードはこれらを使って、Modパックが動作しないプランを除外します。
- 当社からModパックキー(
key、例えばarcania)と発行トークンを受け取ります。あなたのサイトはこれを使ってコードを生成します。
トークンは一度しか表示されません。当社はそのフィンガープリントのみを保存します。紛失した場合は再発行をご依頼ください。古いトークンは動作しなくなります。
仕組みの流れ
- 支払いはあなたの側で受け付けます。
- 支払い後、あなたのサイトが当社のAPIを呼び出し、有効化コードを取得します。
- 購入者にコードを渡します。メール、ボット、「ありがとうございました」ページなどで。
- 購入者は当社側でコードを入力し、有料プランでModパック入りのサーバーを入手します。
- サーバー上のModパックファイルはロックされます。
modsはコントロールパネルやSFTPからダウンロードできません。
物理的には、購入者がサーバー用Modパックを手に入れることはありません。手に入るのは動作するサーバーだけです。
エンドポイントと認証
ベースURL — https://millida.net/v2/hosting。
トークンはX-Pack-Tokenヘッダーで渡します。JWTやBearerトークンではなく、あなたのModパック専用のシークレットです。
X-Pack-Token: mpk_pack_XXXXXXXXXXXXXXXX
Content-Type: application/json
トークンはあなたのサーバー上に保管してください。フロントエンドのコードではなく、環境変数に置きます。
コードの発行
POST /v2/hosting/packs/{key}/keys
| フィールド | 型 | デフォルト | 内容 |
|---|---|---|---|
count | 数値 1〜200 | 1 | 1回の呼び出しで生成するコードの数 |
note | 文字列 最大120 | — | あなた用のメモ:注文番号、購入者のニックネーム |
maxServers | 数値 1〜20 | 1 | 1つのコードを有効化できるサーバー数 |
expiresAt | ISO日付 | — | コードの有効期限 |
curl -X POST https://millida.net/v2/hosting/packs/arcania/keys \
-H "X-Pack-Token: $PACK_TOKEN" \
-H "Content-Type: application/json" \
-d '{"count": 1, "note": "order 4821"}'
{
"code": "A7K2-9MHD-4RTP-QW38",
"codes": ["A7K2-9MHD-4RTP-QW38"]
}
codeフィールドはバッチ内の最初のコードで、互換性のために残されています。count > 1の場合はcodesを使用してください。
コードが返されるのはここだけです。 当社はパスワードと同様にそのハッシュを保存します。コードを紛失した場合、復元できません。新しいコードを発行し、古いコードを無効化してください。
制限はModパックごとに1分あたり30リクエストです。1回の呼び出しで最大200コードのバッチが用意されているのは、販売向けです。1リクエストにつき1コードではなく、まとめて生成してください。
コードの状況
GET /v2/hosting/packs/{key}/keys?limit=100
[
{
"codeHint": "A7K29MHD",
"note": "order 4821",
"maxServers": 1,
"usedCount": 1,
"state": "spent",
"expiresAt": null,
"revokedAt": null,
"createdAt": "2026-08-03T12:20:11.000Z"
}
]
コード自体はレスポンスに含まれず、含めることもできません。codeHintはコードの先頭部分です。これを使って行をあなたの注文と照合してください。
状態:free — 未使用、spent — 使用済み、expired — 期限切れ、revoked — あなたによって無効化済み。
単一コードの確認
POST /v2/hosting/packs/{key}/keys/status、ボディは{"code": "A7K2-9MHD-4RTP-QW38"}。
レスポンスは一覧と同じ行です。コードはURLではなくボディに入れます。URLはプロキシのログやブラウザの履歴に残り、有効化前のコードは有効なキーだからです。
ハイフンと大文字小文字は区別されません。a7k29mhd4rtpqw38はA7K2-9MHD-4RTP-QW38と同様に見つかります。
コードの無効化
POST /v2/hosting/packs/{key}/keys/revoke、ボディは{"code": "..."}。
返金、誤発行、紛争の際に使用します。無効化すると今後の有効化がブロックされますが、すでに展開済みのModパックは削除されません。有効化した購入者は動作するサーバーを保持し続けます。
有効化Webhook
Webhook URLをお知らせいただければ、コードが使用された瞬間に当社がそれを呼び出します。
POST <your-address>
X-Millida-Pack: arcania
Content-Type: application/json
{
"event": "pack.activated",
"packKey": "arcania",
"codeHint": "A7K29MHD",
"serverId": "cm4x...",
"activatedAt": "2026-08-04T09:14:02.000Z"
}
この呼び出しは署名されません。同じトークンを使ってkeys/statusで検証できます。codeHintを使えば該当する行を見つけ、state: "spent"を確認できます。こうすれば2つ目のシークレットを保存する必要がありません。
Webhookはレスポンスを待たずに送信され、再試行されません。あなたのサーバーがダウンしていた場合でも有効化は完了しており、コード一覧で確認できます。URLは公開されている必要があります。当社は内部アドレスやローカルアドレスを呼び出しません。リダイレクトは追跡しません。
Modパックカード
GET /v2/hosting/packs/{key}は公開されており、トークンは不要です。購入者に見える内容を返します。名前、コア、バージョン、最小メモリ、プラン一覧、保護フラグです。レスポンスにアーカイブのリンクは含まれません。
あなたのサイトの「購入」ページに便利です。プランの要件が単一の情報源から取得され、当社のウィザードが示す内容と食い違うことがありません。
カードのストアフロント項目はご自身で編集できます。トークン付きのPATCH /v2/hosting/packs/{key}はname、authorName、authorUrl、iconUrl、webhookUrlを受け付けます。販売条件(paidOnly、requireKey、lockFiles、planCodes)、ストアフロントでのModパックの有効化、JVM起動フラグはトークンでは変更できません。これらは当社とあなたの合意、および当社のノードに関わるため、お問い合わせください。
Modパックの更新
以前は、更新といえば当社にメールして待つことでした。今はご自身でバージョンを公開し、サーバー所有者がコントロールパネルでそれを選択します。
重要な点:当社が誰かの環境を無断で更新することは決してありません。Modパックのバージョン間の移行はワールドと互換性がない場合があり、判断するのはサーバー所有者です。公開されたバージョンは新規サーバーが入手するものであり、すでに展開済みのサーバーにもご案内するものです。以前のバージョンは一覧に残り、そのまま使い続けることもロールバックすることもできます。
サイクルの流れ
# 1. Create a version
curl -X POST https://millida.net/v2/hosting/packs/arcania/versions \
-H "X-Pack-Token: $PACK_TOKEN" -H "Content-Type: application/json" \
-d '{"label":"1.5.0","changelog":"Updated Create to 0.5.1, fixes crash on portals","minRamMb":10240}'
# 2. Upload the archive in chunks (32 MB each), addressing by offset
curl -X POST "https://millida.net/v2/hosting/packs/arcania/versions/1.5.0/archive?offset=0" \
-H "X-Pack-Token: $PACK_TOKEN" -H "Content-Type: application/octet-stream" \
--data-binary @part0.bin
# 3. Say the archive is finished, and publish after parsing
curl -X POST https://millida.net/v2/hosting/packs/arcania/versions/1.5.0/finish \
-H "X-Pack-Token: $PACK_TOKEN" -H "Content-Type: application/json" \
-d '{"archiveSha256":"<sha256 of archive>","publish":true}'
# 4. Wait for parsing
curl https://millida.net/v2/hosting/packs/arcania/versions/1.5.0 -H "X-Pack-Token: $PACK_TOKEN"
バージョン
| フィールド | 型 | 役割 |
|---|---|---|
label | 40文字までの文字列 | バージョン番号: ラテン文字、数字、ドット、ハイフン、アンダースコア。変更不可: 同じラベルに異なるファイルを割り当てると、不具合調査が推測頼みになります |
changelog | 4000文字までの文字列 | 変更内容 — サーバーオーナーは更新前にこれを読みます |
core, gameVersion | 文字列 | サーバー構成を別のコアやゲームバージョンへ移行した場合に使用 |
loaderBuild, javaVersion | 文字列 | バージョンが要求する場合のローダービルドと Java の固定 |
minRamMb | 数値 | このバージョン固有のメモリ下限。不足している人には理由が表示され、ワールドを失うことはありません |
archiveSha256 | 16進数64桁 | 解析前に検証します。途中までしか届かなかったアーカイブを展開するより、拒否する方が安全です |
アップロード
POST /v2/hosting/packs/{key}/versions/{label}/archive?offset=N、ボディは .zip のチャンク、Content-Type: application/octet-stream。チャンクは最大 32 MB、アーカイブ全体は最大 4 GB です。
チャンクは**「末尾に追加」ではなくオフセットで**指定します。途中で中断されたチャンクはすでにファイルの一部として書き込まれており、再試行すると同じバイト列が二重に追加され、アーカイブが気づかないうちに破損してしまうからです。レスポンスは uploadedBytes を返すので、中断後のアップロード再開に利用できます。
解析
POST .../finish は即座に応答し(status: "processing")、解析はバックグラウンドで実行されます。ギガバイト級のサーバー構成の展開には数分かかります。状態は GET .../versions/{label} で確認してください: processing → ready または failed(理由のテキストは error に入ります)。
アーカイブが満たすべき条件:
- サーバーパックであること: 単一のラッパー(
Server Files/など)を除去した後、mods/またはplugins/がルートにあること。サーバーにクライアントパックを入れると空のワールドが生成されるため、インストールせずに拒否します; - アーカイブ内の名前に
..、絶対パス、Windows の区切り文字が含まれないこと; - パスワードなし、特殊な圧縮方式なし(store と deflate のみ);
- 制限: 60,000 ファイル、展開後 12 GB、圧縮率は最大 200 倍。
失敗は公開済みバージョンには影響しません: クライアントは以前のバージョンを動かし続け、あなたは再度アップロードできます。未完了の下書き: サーバー構成ごとに最大 3 つまでで、放置されたものは 1 日後に自動的に削除されます。
公開、ロールバック、削除
| リクエスト | 役割 |
|---|---|
POST .../versions/{label}/publish | バージョンを公開します。ロールバックも同じ方法で行います: 以前のバージョンを公開すれば、新しいサーバーは再びそれを受け取ります |
POST .../versions/{label}/archive-version | バージョンを選択肢から外します。すでに導入済みのサーバーはそのまま使い続けます |
PATCH .../versions/{label} | 作成済みバージョンの説明を編集します: changelog と minRamMb。バージョンのファイルは変更不可なので、コア、ローダー、Java は変わりません |
DELETE .../versions/{label} | バージョンをファイルごと削除します。公開済みのバージョン、または 1 台以上のサーバーで使用中のバージョンは削除できません |
GET .../versions | 選択可能なバージョン(公開、トークン不要) |
GET .../versions/all | 下書きや失敗を含む、あなたのすべてのバージョン |
GET .../versions/rollout | どのバージョンに何台のサーバーがいるか — 更新の展開状況を確認できます |
公開すると、コア、ゲームバージョン、ローダーの固定、Java、バージョンのメモリ下限がサーバー構成カードに反映されます。新しいサーバーはあなた側で追加の操作をすることなくそれを受け取ります。
サーバーオーナーに表示されるもの
コントロールパネルのプレミアムサーバー構成ブロックに、インストール済みのバージョン、公開済みのバージョン、あなたの changelog、そして「切り替え」ボタン付きのバージョン一覧が表示されます。更新はワールドに影響しません — 置き換わるのはサーバー構成のファイルのみで、置き換え前にコピーを取得します。許可した場合のカスタム MOD は、切り替え後に再度追加する必要があります。サーバー構成はひとまとまりとして移行されるため、mods/ に旧バージョンの一部が残ると起動時にクラッシュします。
オーナーのプランがバージョンに対応できない場合は、隠さず理由とともに表示します。ユーザーは何が必要なのかを見るべきであり、サーバー構成が更新されない理由を推測すべきではありません。
自分のサーバー構成ページ
サーバー構成のランディングページは、アカウント内(プロフィール → 「マイサーバー構成」 → 「サーバー構成ページ」)で自分で作成します: ファーストビュー、機能、スクリーンショット、Q&A、配色。プランとバージョン一覧は私たちのデータで自動的に入力されるので、古くなることはありません。
完成したページは millida.net/sborka/<your-address> に配置されます — 通常のウェブサイトページで、検索エンジンにインデックスされ、私たちのサイトマップにも含まれます。下書きはあなた以外には見えません。
画像も同じ場所、アカウント内でアップロードします。ページは私たちのドメインから配信され、そのファイルは私たちの側で保存されるため、あなたのホスティングが落ちてもページはそのまま残ります。
ページは API では編集できません。これは画面であり、ロールアウトではないからです。
レスポンスコード
| コード | 発生条件 | 対処 |
|---|---|---|
403 | 発行トークンが無効 | X-Pack-Token を確認してください。トークンは 1 つのサーバー構成に紐づくため、他人のキーでは機能しません |
404 | サーバー構成が無効、発行に接続されていない、または該当バージョンが存在しない | お問い合わせください |
400 | expiresAt の日付を解析できない、バージョンラベルが不正、チャンクが空または大きすぎる | エラーテキストを確認してください |
409 | バージョンがすでに作成済み、解析済み、公開済み、またはサーバーにインストール済み | ラベルは変更不可です: 次のバージョンをリリースしてください |
429 | 1 分あたり 30 リクエスト超(アップロードは 600) | バッチで送信し、チャンクを大きくしてください |
販売前にすべてをテストする方法
テストコードをいくつかお申し付けください。API でコードを発行し、私たちのホスティング上のあなたのサーバーで有効化し、Webhook に何が届き、keys/status が何を示すかを確認できます。こうすれば、最初の有料顧客が通る前に、購入者の道のり全体を把握できます。
