API penulis modpack: kode aktivasi dan pembaruan
Bagaimana penulis modpack berbayar dapat menerbitkan kode aktivasi dan mempublikasikan pembaruan melalui API Millida Hosting: versi modpack, unggah arsip, publikasi, rollback, status kode, dan webhook.
Diperbarui 6 September 2026
Anda tidak perlu menulis kode. Semua yang dijelaskan di bawah ini kini tersedia sebagai tombol juga: jika modpack Anda tertaut ke akun Millida Anda, tab "Modpack saya" muncul di profil Anda — di sana Anda mengunggah versi, mengedit kartu, dan membuat landing page. Belum tertaut — hubungi kami dan kami akan menautkannya. API ditujukan untuk mereka yang melakukan deploy dari CI mereka sendiri.
Artikel ini untuk penulis modpack berbayar yang menjualnya sendiri dan menyerahkan instalasi server kepada kami. Pembeli tidak perlu mengunduh apa pun: mereka memasukkan kode dan mendapatkan modpack yang sudah ter-deploy. Untuk melihat tampilannya dari sisi mereka, baca Modpack berbayar via kode aktivasi.
Yang Anda butuhkan untuk memulai
- Kirimkan kepada kami arsip server modpack Anda —
.zipdenganmods/di root (tanpa pembungkus sepertiServer Files/) atau.mrpack. Arsip disimpan di penyimpanan privat kami, dan tautannya tidak pernah dibagikan ke luar. - Beri tahu kami core, versi game, dan memori minimum — wizard menggunakannya untuk menyaring paket yang tidak dapat menjalankan modpack.
- Dapatkan kunci modpack (
key, misalnyaarcania) dan token penerbitan dari kami — situs Anda menggunakannya untuk membuat kode.
Token hanya ditampilkan sekali: kami hanya menyimpan sidik jarinya. Jika Anda kehilangannya, minta kami menerbitkannya ulang — token lama akan berhenti berfungsi.
Cara skema ini bekerja
- Anda menerima pembayaran sendiri, di sisi Anda.
- Setelah pembayaran, situs Anda memanggil API kami dan mendapatkan kode aktivasi.
- Anda memberikan kode kepada pembeli — lewat email, bot, atau di halaman "terima kasih".
- Pembeli memasukkan kode di sisi kami dan mendapatkan server dengan modpack pada paket berbayar.
- File modpack di server terkunci:
modstidak dapat diunduh dari panel atau melalui SFTP.
Secara fisik, pembeli tidak pernah mendapatkan modpack server di tangan mereka — hanya server yang berfungsi.
Endpoint dan otorisasi
Base URL — https://millida.net/v2/hosting.
Token dikirim melalui header X-Pack-Token. Ini bukan JWT atau Bearer token — ini secret terpisah untuk modpack Anda.
X-Pack-Token: mpk_pack_XXXXXXXXXXXXXXXX
Content-Type: application/json
Token disimpan di server Anda — simpan di environment variable, bukan di kode frontend.
Menerbitkan kode
POST /v2/hosting/packs/{key}/keys
| Field | Tipe | Default | Fungsinya |
|---|---|---|---|
count | number 1–200 | 1 | Berapa banyak kode yang dibuat per panggilan |
note | string hingga 120 | — | Catatan Anda: nomor pesanan, nickname pembeli |
maxServers | number 1–20 | 1 | Berapa banyak server yang dapat mengaktifkan satu kode |
expiresAt | tanggal ISO | — | Tanggal kedaluwarsa kode |
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"]
}
Field code adalah kode pertama dalam batch, dipertahankan untuk kompatibilitas; saat count > 1, gunakan codes.
Kode hanya dikembalikan di sini dan tidak di tempat lain. Kami menyimpan hash-nya — seperti password. Jika Anda kehilangan kode, kami tidak dapat memulihkannya: terbitkan kode baru dan cabut yang lama.
Batasnya 30 permintaan per menit per modpack. Batch hingga 200 kode per panggilan ada khusus untuk penjualan: buatlah secara massal daripada satu kode per permintaan.
Apa yang terjadi pada kode
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"
}
]
Kode itu sendiri tidak ada dalam respons dan tidak mungkin ada. codeHint adalah awal dari kode — gunakan untuk mencocokkan baris dengan pesanan Anda.
Status: free — belum digunakan, spent — sudah digunakan, expired — kedaluwarsa, revoked — dicabut oleh Anda.
Memeriksa satu kode
POST /v2/hosting/packs/{key}/keys/status, body {"code": "A7K2-9MHD-4RTP-QW38"}.
Responsnya adalah baris yang sama seperti di daftar. Kode dikirim di body, bukan di URL: URL berakhir di log proxy dan riwayat browser, dan sebelum aktivasi kode adalah kunci yang berfungsi.
Tanda hubung dan huruf besar/kecil tidak berpengaruh: a7k29mhd4rtpqw38 akan ditemukan sama seperti A7K2-9MHD-4RTP-QW38.
Mencabut kode
POST /v2/hosting/packs/{key}/keys/revoke, body {"code": "..."}.
Gunakan untuk refund, penerbitan yang keliru, atau sengketa. Pencabutan memblokir aktivasi di masa depan tetapi tidak menghapus modpack yang sudah ter-deploy — pembeli yang telah mengaktifkannya tetap memiliki server yang berfungsi.
Webhook aktivasi
Jika Anda memberikan URL webhook kepada kami, kami akan memanggilnya saat kode ditukarkan:
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"
}
Panggilan ini tidak ditandatangani: Anda dapat memverifikasinya dengan token yang sama melalui keys/status — menggunakan codeHint Anda akan menemukan baris Anda dan melihat state: "spent". Dengan begitu Anda tidak perlu menyimpan secret kedua.
Webhook dikirim tanpa menunggu respons dan tidak dicoba ulang: jika server Anda sedang down, aktivasi tetap berhasil, dan Anda dapat melihatnya di daftar kode. URL harus publik — kami tidak memanggil alamat internal atau lokal. Redirect tidak diikuti.
Kartu modpack
GET /v2/hosting/packs/{key} bersifat publik, tidak perlu token. Ini mengembalikan apa yang dilihat pembeli: nama, core, versi, memori minimum, daftar paket, dan flag perlindungan. Tidak ada tautan arsip dalam respons.
Berguna untuk halaman "Beli" di situs Anda: persyaratan paket berasal dari satu sumber dan tidak akan berbeda dari yang dikatakan wizard kami.
Anda mengedit field storefront kartu Anda sendiri: PATCH /v2/hosting/packs/{key} dengan token menerima name, authorName, authorUrl, iconUrl, webhookUrl. Syarat penjualan (paidOnly, requireKey, lockFiles, planCodes), pengaktifan modpack di storefront, dan flag peluncuran JVM tidak dapat diubah dengan token — itu adalah kesepakatan kami dengan Anda dan node kami, jadi hubungi kami tentang hal itu.
Pembaruan modpack
Sebelumnya pembaruan berarti mengirim email kepada kami dan menunggu. Sekarang Anda menerbitkan versi sendiri, dan pemilik server memilihnya di panel mereka.
Poin kuncinya: kami tidak pernah memperbarui siapa pun secara diam-diam. Berpindah antar versi modpack bisa jadi tidak kompatibel dengan world, dan pemilik server yang mengambil keputusan. Versi yang diterbitkan adalah yang didapat server baru dan yang kami tawarkan ke server yang sudah ter-deploy; versi sebelumnya tetap ada di daftar, dan Anda dapat tetap menggunakannya atau melakukan rollback.
Bagaimana siklusnya
# 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"
Versi
| Field | Tipe | Fungsinya |
|---|---|---|
label | string maksimal 40 | Nomor versi: huruf Latin, angka, titik, tanda hubung, garis bawah. Tidak dapat diubah: label yang sama dengan file berbeda membuat investigasi keluhan jadi menebak-nebak |
changelog | string maksimal 4000 | Apa yang berubah — pemilik server membaca ini sebelum memperbarui |
core, gameVersion | string | Jika konfigurasi server berpindah ke core atau versi game lain |
loaderBuild, javaVersion | string | Patokan untuk build loader dan Java, jika versi tersebut memerlukannya |
minRamMb | number | Batas bawah memori untuk versi ini. Siapa pun yang memorinya kurang akan melihat alasannya dan tidak kehilangan dunianya |
archiveSha256 | hex 64 | Kami verifikasi sebelum parsing: lebih baik menolak arsip yang tidak diterima utuh daripada mengekstraknya setengah jalan |
Unggah
POST /v2/hosting/packs/{key}/versions/{label}/archive?offset=N, body — potongan .zip, Content-Type: application/octet-stream. Potongan maksimal 32 MB, arsip keseluruhan maksimal 4 GB.
Potongan dialamatkan berdasarkan offset, bukan "tambahkan ke akhir": potongan yang terputus di tengah sudah sebagian masuk ke file, dan percobaan ulang akan menambahkan byte yang sama untuk kedua kalinya — arsip akan tiba dalam keadaan rusak tanpa disadari. Respons mengembalikan uploadedBytes, yang dipakai untuk melanjutkan unggahan setelah gangguan.
Parsing
POST .../finish merespons seketika (status: "processing"), sementara parsing berjalan di latar belakang: mengekstrak konfigurasi server berukuran gigabyte butuh beberapa menit. Baca statusnya dari GET .../versions/{label}: processing → ready atau failed dengan teks alasan di error.
Apa yang harus lolos dari arsip:
- ini paket server: setelah menghapus satu wrapper (
Server Files/dan sejenisnya),mods/atauplugins/berada di root. Paket client di server menghasilkan dunia kosong, jadi kami menolaknya daripada memasangnya; - tidak ada
.., path absolut, atau pemisah Windows pada nama di dalam arsip; - tidak ada password, tidak ada metode kompresi eksotis (hanya store dan deflate);
- batas: 60.000 file, 12 GB setelah diekstrak, rasio kompresi hingga 200×.
Kegagalan tidak memengaruhi versi yang sudah dipublikasikan: client Anda tetap menjalankan versi sebelumnya, dan Anda mengunggah ulang. Draf yang belum selesai: maksimal tiga per konfigurasi server, yang terbengkalai dibersihkan otomatis setelah sehari.
Publikasi, rollback, dan penghapusan
| Request | Fungsinya |
|---|---|
POST .../versions/{label}/publish | Jadikan versi ini terpublikasi. Ini juga cara melakukan rollback: publikasikan versi sebelumnya — server baru akan mendapatkannya lagi |
POST .../versions/{label}/archive-version | Hapus versi dari pilihan. Yang sudah memilikinya tetap menyimpannya |
PATCH .../versions/{label} | Edit deskripsi versi yang sudah dibuat: changelog dan minRamMb. File versi tidak dapat diubah, jadi core, loader, dan Java tidak berubah |
DELETE .../versions/{label} | Hapus versi beserta filenya. Anda tidak bisa menghapus versi yang terpublikasi atau yang ada di setidaknya satu server |
GET .../versions | Versi yang tersedia untuk dipilih (publik, tanpa token) |
GET .../versions/all | Semua milik Anda, termasuk draf dan yang gagal |
GET .../versions/rollout | Berapa banyak server di versi mana — Anda bisa melihat bagaimana pembaruan berjalan |
Publikasi memindahkan core, versi game, patokan loader, Java, dan batas bawah memori versi tersebut ke kartu konfigurasi server: server baru mendapatkannya tanpa tindakan tambahan dari Anda.
Apa yang dilihat pemilik server
Di panel, pada blok konfigurasi server premium: versi mana yang terpasang, versi mana yang sudah dirilis, changelog Anda, dan daftar versi dengan tombol "Ganti". Pembaruan tidak memengaruhi dunia — hanya file konfigurasi server yang diganti, dan kami membuat salinannya sebelum penggantian. Mod kustom, jika Anda mengizinkannya, harus ditambahkan lagi setelah berganti: konfigurasi server berpindah sebagai satu kesatuan, dan separuh versi lama di mods/ berarti crash saat startup.
Jika paket pemilik tidak sanggup menjalankan suatu versi, kami menampilkannya beserta alasannya alih-alih menyembunyikannya: orang harus melihat apa yang dibutuhkannya, bukan menebak mengapa konfigurasi servernya tidak diperbarui.
Halaman konfigurasi server Anda sendiri
Anda membangun landing page untuk konfigurasi server Anda sendiri di akun Anda (profil → "Konfigurasi server saya" → "Halaman konfigurasi server"): layar pertama, fitur, tangkapan layar, tanya jawab, warna Anda. Paket dan daftar versi diisi dengan data kami agar tidak basi.
Halaman yang sudah jadi tersedia di millida.net/sborka/<alamat-anda> — halaman situs web biasa, terindeks mesin pencari dan disertakan dalam sitemap kami. Drafnya tidak terlihat oleh siapa pun kecuali Anda.
Gambar diunggah di tempat yang sama, di akun Anda: halaman disajikan dari domain kami, dan filenya disimpan bersama kami — jika hosting Anda mati, halaman tetap utuh.
Halaman tidak dapat diedit melalui API: ini layar, bukan rollout.
Kode respons
| Kode | Kapan | Apa yang harus dilakukan |
|---|---|---|
403 | Token penerbitan tidak valid | Periksa X-Pack-Token. Token terikat pada satu konfigurasi server: tidak berfungsi dengan key milik orang lain |
404 | Konfigurasi server dinonaktifkan, tidak terhubung ke penerbitan, atau versi tersebut tidak ada | Hubungi kami |
400 | Tanggal expiresAt tidak dapat di-parse, label versi salah, potongan kosong atau terlalu besar | Lihat teks error |
409 | Versi sudah dibuat, sudah di-parse, terpublikasi, atau terpasang di server | Label tidak dapat diubah: rilis versi berikutnya |
429 | Lebih dari 30 request per menit (unggah — 600) | Kirim dalam batch, dan kirim potongan yang lebih besar |
Cara menguji semuanya sebelum berjualan
Minta beberapa kode uji kepada kami: terbitkan kode melalui API, aktifkan di server Anda pada hosting kami, lihat apa yang masuk ke webhook dan apa yang ditampilkan keys/status. Dengan begitu Anda akan melihat seluruh alur pembeli sebelum pelanggan berbayar pertama melewatinya.
