মডপ্যাক লেখক API: অ্যাক্টিভেশন কোড এবং আপডেট
একজন পেইড মডপ্যাক লেখক কীভাবে Millida Hosting API-এর মাধ্যমে অ্যাক্টিভেশন কোড ইস্যু করতে এবং আপডেট প্রকাশ করতে পারেন: মডপ্যাক ভার্সন, আর্কাইভ আপলোড, প্রকাশ, রোলব্যাক, কোড স্ট্যাটাস এবং ওয়েবহুক।
আপডেট: ৬ সেপ্টেম্বর, ২০২৬
আপনাকে কোড লিখতে হবে না। নিচে বর্ণিত সবকিছু এখন বোতাম হিসেবেও পাওয়া যায়: আপনার মডপ্যাক যদি আপনার Millida অ্যাকাউন্টের সাথে লিংক করা থাকে, তাহলে আপনার প্রোফাইলে একটি “My modpacks” ট্যাব দেখা যায় — সেখানে আপনি ভার্সন আপলোড করুন, কার্ড এডিট করুন এবং ল্যান্ডিং পেজ বানান। লিংক করা না থাকলে — আমাদের লিখুন, আমরা লিংক করে দেব। API তাদের জন্য, যারা নিজেদের CI থেকে ডিপ্লয় করেন।
এই আর্টিকেলটি পেইড মডপ্যাকের লেখকদের জন্য, যারা নিজেরাই সেগুলো বিক্রি করেন এবং সার্ভার ইনস্টলেশন আমাদের হাতে ছেড়ে দেন। ক্রেতাকে কিছু ডাউনলোড করতে হয় না: তিনি একটি কোড দেন এবং ডিপ্লয় করা মডপ্যাক পান। তাঁর দিক থেকে এটি কেমন দেখায় তা জানতে পড়ুন অ্যাক্টিভেশন কোডের মাধ্যমে পেইড মডপ্যাক।
শুরু করতে যা দরকার
- আমাদের কাছে আপনার মডপ্যাকের সার্ভার আর্কাইভ পাঠান — রুটে
mods/সহ একটি.zip(Server Files/-এর মতো র্যাপার ছাড়া) অথবা একটি.mrpack। আর্কাইভটি আমাদের প্রাইভেট স্টোরেজে রাখা হয়, এবং লিংক কখনো বাইরে শেয়ার করা হয় না। - আমাদের কোর, গেম ভার্সন এবং সর্বনিম্ন মেমোরি জানান — উইজার্ড এগুলো দিয়ে সেই প্ল্যানগুলো ফিল্টার করে, যেগুলোতে মডপ্যাক চলবে না।
- আমাদের কাছ থেকে একটি মডপ্যাক কী (
key, উদাহরণস্বরূপarcania) এবং একটি ইস্যুয়িং টোকেন নিন — আপনার সাইট এটি দিয়ে কোড জেনারেট করে।
টোকেনটি শুধু একবারই দেখানো হয়: আমরা শুধু তার ফিঙ্গারপ্রিন্ট সংরক্ষণ করি। এটি হারালে আমাদের রি-ইস্যু করতে বলুন — পুরোনোটি কাজ করা বন্ধ করে দেবে।
স্কিমটি কীভাবে কাজ করে
- আপনি নিজেই পেমেন্ট নেন, নিজের দিকে।
- পেমেন্টের পর আপনার সাইট আমাদের API কল করে এবং একটি অ্যাক্টিভেশন কোড পায়।
- আপনি কোডটি ক্রেতাকে দেন — ইমেইলে, বটে, বা “ধন্যবাদ” পেজে।
- ক্রেতা আমাদের দিকে কোডটি দেন এবং পেইড প্ল্যানে মডপ্যাকসহ একটি সার্ভার পান।
- সার্ভারে মডপ্যাকের ফাইলগুলো লক করা থাকে: প্যানেল থেকে বা SFTP-এর মাধ্যমে
modsডাউনলোড করা যায় না।
বাস্তবে ক্রেতার হাতে সার্ভারের মডপ্যাক কখনো আসে না — শুধু একটি কাজ করা সার্ভার পান।
এন্ডপয়েন্ট এবং অথরাইজেশন
বেস URL — https://millida.net/v2/hosting।
টোকেনটি X-Pack-Token হেডারে পাঠানো হয়। এটি JWT বা Bearer টোকেন নয় — এটি আপনার মডপ্যাকের জন্য আলাদা একটি সিক্রেট।
X-Pack-Token: mpk_pack_XXXXXXXXXXXXXXXX
Content-Type: application/json
টোকেনটি আপনার সার্ভারে থাকে — এটি ফ্রন্টএন্ড কোডে নয়, এনভায়রনমেন্ট ভেরিয়েবলে রাখুন।
কোড ইস্যু করুন
POST /v2/hosting/packs/{key}/keys
| ফিল্ড | টাইপ | ডিফল্ট | কী করে |
|---|---|---|---|
count | number 1–200 | 1 | প্রতি কলে কতগুলো কোড জেনারেট হবে |
note | string সর্বোচ্চ 120 | — | আপনার নোট: অর্ডার নম্বর, ক্রেতার নিকনেম |
maxServers | number 1–20 | 1 | একটি কোড কতগুলো সার্ভারে অ্যাক্টিভেট করা যাবে |
expiresAt | ISO date | — | কোডের মেয়াদ শেষের তারিখ |
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 ব্যবহার করুন।
কোড শুধু এখানেই ফেরত দেওয়া হয়, আর কোথাও নয়। আমরা তাদের হ্যাশ সংরক্ষণ করি — পাসওয়ার্ডের মতো। কোড হারালে আমরা তা পুনরুদ্ধার করতে পারি না: নতুন একটি ইস্যু করুন এবং পুরোনোটি রিভোক করুন।
সীমা হলো প্রতি মডপ্যাকে প্রতি মিনিটে ৩০টি রিকোয়েস্ট। প্রতি কলে ২০০ কোড পর্যন্ত ব্যাচ শুধু বিক্রির জন্যই আছে: প্রতি রিকোয়েস্টে একটি কোডের বদলে বাল্কে জেনারেট করুন।
কোডগুলোর কী হলো
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": "..."}।
রিফান্ড, ভুল করে ইস্যু করা বা বিরোধের ক্ষেত্রে এটি ব্যবহার করুন। রিভোক করা ভবিষ্যতের অ্যাক্টিভেশন ব্লক করে কিন্তু আগেই ডিপ্লয় করা মডপ্যাক সরিয়ে দেয় না — যে ক্রেতা এটি অ্যাক্টিভেট করেছেন, তিনি একটি কাজ করা সার্ভারই রাখেন।
অ্যাক্টিভেশন ওয়েবহুক
আপনি যদি আমাদের একটি ওয়েবহুক 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" দেখবেন। এভাবে আপনাকে দ্বিতীয় কোনো সিক্রেট রাখতে হবে না।
ওয়েবহুকটি রেসপন্সের জন্য অপেক্ষা না করেই পাঠানো হয় এবং রিট্রাই করা হয় না: আপনার সার্ভার ডাউন থাকলেও অ্যাক্টিভেশন হয়ে যায়, আর আপনি তা কোড লিস্টে দেখতে পাবেন। URL-টি পাবলিক হতে হবে — আমরা ইন্টারনাল বা লোকাল অ্যাড্রেসে কল করি না। রিডাইরেক্ট ফলো করা হয় না।
মডপ্যাক কার্ড
GET /v2/hosting/packs/{key} পাবলিক, টোকেন লাগে না। এটি ফেরত দেয় যা ক্রেতা দেখেন: নাম, কোর, ভার্সন, সর্বনিম্ন মেমোরি, প্ল্যান লিস্ট এবং প্রোটেকশন ফ্ল্যাগ। রেসপন্সে আর্কাইভ লিংক থাকে না।
আপনার সাইটের “Buy” পেজের জন্য সুবিধাজনক: প্ল্যানের প্রয়োজনীয়তা একটিমাত্র সোর্স থেকে আসে এবং আমাদের উইজার্ড যা বলে তার সাথে মিলবে না — এমন হবে না।
আপনি আপনার কার্ডের স্টোরফ্রন্ট ফিল্ডগুলো নিজেই এডিট করেন: টোকেনসহ PATCH /v2/hosting/packs/{key} গ্রহণ করে name, authorName, authorUrl, iconUrl, webhookUrl। বিক্রয়ের শর্তগুলো (paidOnly, requireKey, lockFiles, planCodes), স্টোরফ্রন্টে মডপ্যাক চালু করা এবং JVM লঞ্চ ফ্ল্যাগ টোকেন দিয়ে পরিবর্তন করা যায় না — সেগুলো আপনার সাথে আমাদের চুক্তি এবং আমাদের নোড, তাই সেগুলো নিয়ে আমাদের লিখুন।
মডপ্যাক আপডেট
আগে আপডেট মানে ছিল আমাদের ইমেইল করা এবং অপেক্ষা করা। এখন আপনি নিজেই একটি ভার্সন পাবলিশ করেন, এবং সার্ভার মালিকরা তাদের প্যানেলে সেটি বেছে নেন।
মূল কথা: আমরা কখনো কারো অজান্তে আপডেট করি না। মডপ্যাক ভার্সনগুলোর মধ্যে যাওয়া-আসা ওয়ার্ল্ডের সাথে ইনকম্প্যাটিবল হতে পারে, আর সিদ্ধান্তটি সার্ভার মালিকই নেন। পাবলিশ করা ভার্সনটিই নতুন সার্ভারগুলো পায় এবং ইতিমধ্যে ডিপ্লয় করা সার্ভারগুলোকে আমরা সেটিই অফার করি; আগের ভার্সনগুলো লিস্টে থাকে, আর আপনি সেগুলোতে থাকতে পারেন বা রোলব্যাক করতে পারেন।
চক্রটি কেমন দেখায়
# 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 | ৪০ পর্যন্ত স্ট্রিং | সংস্করণ নম্বর: ল্যাটিন অক্ষর, সংখ্যা, ডট, হাইফেন, আন্ডারস্কোর। অপরিবর্তনীয়: একই লেবেলের সাথে ভিন্ন ফাইল থাকলে অভিযোগ তদন্ত অনুমানে পরিণত হয় |
changelog | ৪০০০ পর্যন্ত স্ট্রিং | কী পরিবর্তন হয়েছে — সার্ভার মালিক আপডেট করার আগে এটি পড়েন |
core, gameVersion | স্ট্রিং | যদি সার্ভার সেটআপ ভিন্ন কোর বা গেম সংস্করণে চলে যায় |
loaderBuild, javaVersion | স্ট্রিং | লোডার বিল্ড এবং Java পিন করুন, যদি সংস্করণের প্রয়োজন হয় |
minRamMb | সংখ্যা | এই নির্দিষ্ট সংস্করণের জন্য মেমরি সীমা। যার যথেষ্ট নেই সে কারণ দেখবে এবং তার ওয়ার্ল্ড হারাবে না |
archiveSha256 | হেক্স ৬৪ | পার্স করার আগে আমরা যাচাই করি: অসম্পূর্ণভাবে আসা আর্কাইভ প্রত্যাখ্যান করা ভালো, অর্ধেক আনপ্যাক করার চেয়ে |
আপলোড
POST /v2/hosting/packs/{key}/versions/{label}/archive?offset=N, বডি — .zip এর একটি চাঙ্ক, Content-Type: application/octet-stream। চাঙ্ক ৩২ MB পর্যন্ত, সম্পূর্ণ আর্কাইভ ৪ GB পর্যন্ত।
একটি চাঙ্ক অফসেট দ্বারা ঠিকানা করা হয়, "শেষে যোগ করুন" দ্বারা নয়: মাঝপথে বাধাপ্রাপ্ত চাঙ্ক ইতিমধ্যে ফাইলে আংশিকভাবে পৌঁছে গেছে, এবং পুনরায় চেষ্টা করলে একই বাইট দ্বিতীয়বার যোগ হবে — আর্কাইভ নীরবে ক্ষতিগ্রস্ত হবে। প্রতিক্রিয়া uploadedBytes ফেরত দেয়, যা বাধার পরে আপলোড পুনরায় শুরু করতে ব্যবহৃত হয়।
পার্সিং
POST .../finish সাথে সাথে প্রতিক্রিয়া দেয় (status: "processing"), যখন পার্সিং ব্যাকগ্রাউন্ডে চলে: গিগাবাইট আকারের সার্ভার সেটআপ আনপ্যাক করতে কয়েক মিনিট লাগে। GET .../versions/{label} থেকে অবস্থা পড়ুন: processing → ready বা failed সাথে error-এ কারণের টেক্সট।
আর্কাইভকে কী পাস করতে হবে:
- এটি একটি সার্ভার প্যাক: একক র্যাপার (
Server Files/এবং অনুরূপ) সরানোর পরে,mods/বাplugins/রুটে থাকে। সার্ভারে ক্লায়েন্ট প্যাক খালি ওয়ার্ল্ড তৈরি করে, তাই আমরা এটি ইনস্টল করার পরিবর্তে প্রত্যাখ্যান করি; - আর্কাইভের ভিতরে নামে
.., অ্যাবসোলিউট পাথ, বা Windows সেপারেটর নেই; - পাসওয়ার্ড নেই, বিদেশী কম্প্রেশন পদ্ধতি নেই (শুধু store এবং deflate);
- সীমা: ৬০,০০০ ফাইল, ১২ GB আনপ্যাক করা, কম্প্রেশন অনুপাত ২০০× পর্যন্ত।
ব্যর্থতা প্রকাশিত সংস্করণকে প্রভাবিত করে না: আপনার ক্লায়েন্টরা আগেরটি চালিয়ে যায়, এবং আপনি আবার আপলোড করেন। অসমাপ্ত ড্রাফট: প্রতি সার্ভার সেটআপে তিনটির বেশি নয়, পরিত্যক্তগুলো একদিন পরে স্বয়ংক্রিয়ভাবে পরিষ্কার হয়।
প্রকাশ, রোলব্যাক, এবং অপসারণ
| অনুরোধ | এটি কী করে |
|---|---|
POST .../versions/{label}/publish | সংস্করণ প্রকাশিত করুন। এভাবেই রোলব্যাক করা হয়: আগেরটি প্রকাশ করুন — নতুন সার্ভার আবার এটি পায় |
POST .../versions/{label}/archive-version | নির্বাচন থেকে সংস্করণ সরান। যাদের ইতিমধ্যে আছে তারা এটি রাখে |
PATCH .../versions/{label} | ইতিমধ্যে তৈরি সংস্করণের বিবরণ সম্পাদনা করুন: changelog এবং minRamMb। সংস্করণ ফাইল অপরিবর্তনীয়, তাই কোর, লোডার, এবং Java পরিবর্তন হয় না |
DELETE .../versions/{label} | সংস্করণ এবং এর ফাইল মুছুন। আপনি একটি প্রকাশিত সংস্করণ বা অন্তত একটি সার্ভারে থাকা সংস্করণ মুছতে পারবেন না |
GET .../versions | নির্বাচনের জন্য উপলব্ধ সংস্করণ (পাবলিক, টোকেন ছাড়া) |
GET .../versions/all | আপনার সবকিছু, ড্রাফট এবং ব্যর্থতা সহ |
GET .../versions/rollout | কতগুলো সার্ভার কোন সংস্করণে আছে — আপডেট কীভাবে রোল আউট হচ্ছে তা দেখতে পারেন |
প্রকাশ করা কোর, গেম সংস্করণ, লোডার পিন, Java, এবং সংস্করণের মেমরি সীমা সার্ভার সেটআপ কার্ডে স্থানান্তর করে: নতুন সার্ভার আপনার পক্ষ থেকে কোনো অতিরিক্ত কাজ ছাড়াই এটি পায়।
সার্ভার মালিক কী দেখেন
প্যানেলে, প্রিমিয়াম সার্ভার সেটআপ ব্লকে: কোন সংস্করণ ইনস্টল করা আছে, কোনটি প্রকাশিত হয়েছে, আপনার changelog, এবং "Switch" বোতাম সহ সংস্করণের তালিকা। আপডেট ওয়ার্ল্ডকে প্রভাবিত করে না — শুধু সার্ভার সেটআপ ফাইল প্রতিস্থাপিত হয়, এবং প্রতিস্থাপনের আগে আমরা একটি কপি নিই। কাস্টম মড, যদি আপনি অনুমতি দেন, স্যুইচ করার পরে আবার যোগ করতে হবে: সার্ভার সেটআপ একটি সম্পূর্ণ হিসাবে চলে, এবং mods/-এ পুরনো সংস্করণের অর্ধেক মানে স্টার্টআপে ক্র্যাশ।
যদি মালিকের প্ল্যান একটি সংস্করণ সামলাতে না পারে, আমরা লুকানোর পরিবর্তে কারণসহ দেখাই: ব্যক্তির দেখা উচিত তার কী প্রয়োজন, অনুমান করা নয় কেন সার্ভার সেটআপ আপডেট হচ্ছে না।
আপনার নিজের সার্ভার সেটআপ পেজ
আপনি আপনার অ্যাকাউন্টে আপনার সার্ভার সেটআপের ল্যান্ডিং পেজ নিজেই তৈরি করেন (প্রোফাইল → "My server setups" → "Server setup pages"): প্রথম স্ক্রিন, ফিচার, স্ক্রিনশট, প্রশ্নোত্তর, আপনার রঙ। প্ল্যান এবং সংস্করণ তালিকা আমাদের ডেটা দিয়ে পূরণ করা হয় যাতে সেগুলো পুরনো না হয়।
সম্পূর্ণ পেজটি millida.net/sborka/<your-address>-এ থাকে — একটি নিয়মিত ওয়েবসাইট পেজ, সার্চ ইঞ্জিন দ্বারা ইনডেক্স করা এবং আমাদের সাইটম্যাপে অন্তর্ভুক্ত। ড্রাফট আপনি ছাড়া কেউ দেখতে পায় না।
ছবি একই জায়গায়, আপনার অ্যাকাউন্টে আপলোড করা হয়: পেজটি আমাদের ডোমেইন থেকে পরিবেশন করা হয়, এবং এর ফাইল আমাদের সাথে সংরক্ষিত থাকে — যদি আপনার হোস্টিং ডাউন হয়, পেজ অক্ষত থাকে।
পেজ API-এর মাধ্যমে সম্পাদনা করা যায় না: এটি একটি স্ক্রিন, রোলআউট নয়।
প্রতিক্রিয়া কোড
| কোড | কখন | কী করতে হবে |
|---|---|---|
403 | অবৈধ issuance টোকেন | X-Pack-Token পরীক্ষা করুন। টোকেন একটি সার্ভার সেটআপের সাথে আবদ্ধ: এটি অন্য কারো কী-এর সাথে কাজ করে না |
404 | সার্ভার সেটআপ নিষ্ক্রিয়, issuance-এর সাথে সংযুক্ত নয়, বা এমন কোনো সংস্করণ নেই | আমাদের লিখুন |
400 | expiresAt তারিখ পার্স করা যায় না, খারাপ সংস্করণ লেবেল, খালি বা অতিরিক্ত বড় চাঙ্ক | ত্রুটির টেক্সট দেখুন |
409 | সংস্করণ ইতিমধ্যে তৈরি, ইতিমধ্যে পার্স করা, প্রকাশিত, বা সার্ভারে ইনস্টল করা | লেবেল অপরিবর্তনীয়: পরেরটি প্রকাশ করুন |
429 | প্রতি মিনিটে ৩০টির বেশি অনুরোধ (আপলোড — ৬০০) | ব্যাচে পাঠান, এবং বড় চাঙ্ক পাঠান |
বিক্রয়ের আগে সবকিছু কীভাবে পরীক্ষা করবেন
আমাদের কাছ থেকে কয়েকটি টেস্ট কোড চান: API-এর মাধ্যমে একটি কোড ইস্যু করুন, আমাদের হোস্টিংয়ে আপনার সার্ভারে এটি সক্রিয় করুন, দেখুন ওয়েবহুকে কী এসেছে এবং keys/status কী দেখায়। এভাবে আপনি প্রথম পেইং কাস্টমার যাওয়ার আগে ক্রেতার সম্পূর্ণ পথ দেখতে পাবেন।
