CraftersMC REST API & Calendar Engine
Developer documentation for the CraftersMC Public HTTP REST API (v1-5eb3568) and the SkyBlock Event Timing Engine (@craftersmc/calendarjs). All endpoints strictly require authentication via the X-API-Key request header.
Authentication & API Key Enforcement
How the mandatory X-API-Key request header and SkyBlock player privacy scopes work.
Mandatory X-API-Key Header Across ALL Endpoints
Every endpoint on the CraftersMC Public REST API strictly requires the X-API-Key HTTP request header. Any request sent without a valid API key will immediately be rejected by the server with HTTP 401 Unauthorized or HTTP 403 Forbidden.
X-API-Key: YOUR_API_KEY
Player API Privacy Scopes
When querying detailed player profiles and SkyBlock inventories (e.g. GET /v1/skyblock/profile/{profileId}), data availability is further restricted by individual in-game player settings (Banking API, Inventory API, Skills API, Collections API):
- If a player disables an API permission, the corresponding nested fields will be returned as
nullor omitted. - In strictly protected endpoints, the server responds with
403 Forbiddenand{"success": false, "error": "Missing required API scope"}.
X-API-Key in environment variables (e.g. process.env.CMC_API_KEY or os.getenv("CMC_API_KEY")). Never expose secret API keys in client-side bundles or public GitHub repositories.
Rate Limits & Error Contracts
Standard response envelopes, rate limiting rules, and status codes implemented across all routes.
Unified Error Response Envelope (ApiErrorReply)
All non-200 responses return a consistent JSON error schema:
{
"success": false,
"error": "Rate limit exceeded",
"message": "You are making too many requests. Please slow down and respect the rate limit."
}
| Status Code | HTTP Reason | Description & Mitigation |
|---|---|---|
| 200 OK | Success | The request completed successfully and returned the requested payload envelope. |
| 400 Bad Request | Invalid Parameter | Malformed identifier, invalid UUID format, or invalid pagination page index. |
| 401 / 403 | Unauthorized / Forbidden | Missing, invalid, or expired X-API-Key, or target player turned off API scope in-game. |
| 404 Not Found | Resource Not Found | The requested player, profile ID, auction UUID, or bazaar item does not exist. |
| 429 Rate Limit | Too Many Requests | Request threshold exceeded. Implement exponential backoff or caching. |
| 503 Unavailable | Service Unavailable | Data list has not finished warming up or database sync is in progress. |
SkyBlock Calendar Engine & Event Timings (CraftersMC/calendarjs)
Mathematical formulas, time conversions, and deterministic Java Random RNG algorithms used to predict server events.
SkyBlock Time Multiplier & Epoch Architecture
In CraftersMC SkyBlock, time runs 72 times faster than real life. A full 24-hour SkyBlock day passes in exactly 20 real-world minutes (1,200 seconds). A SkyBlock year consists of 4 seasons of 93 days each, totaling 372 SkyBlock days (124 real hours = 5 days and 4 hours).
| Constant | Value | Definition / Meaning |
|---|---|---|
START_OF_TIMES | 1648800000 | Unix epoch in seconds corresponding to Year 1, Spring 1, 00:00:00 (April 1, 2022 08:00:00 UTC). |
TIME_MULTIPLIER | 72 | 1 real second = 72 SkyBlock seconds (20 real minutes per SkyBlock day). |
SEASON_LENGTH | 93 days | Days per season (Early, Standard, and Late sub-seasons of 31 days each). |
DAYS_PER_YEAR | 372 days | Total SkyBlock days per SkyBlock year (4 seasons × 93 days). |
1. Real-World Timestamp to SkyBlock Date Algorithm
To convert any real-world timestamp (or Date.now()) into SkyBlock Year, Season, Day, Hour, and Minute:
// Convert real-world Unix timestamp to SkyBlock Year, Season, Day & Time
function unixToSkyBlockTime(unixTimestampSeconds = Math.floor(Date.now() / 1000)) {
const START_OF_TIMES = 1648800000;
const TIME_MULTIPLIER = 72;
const SECONDS_PER_SB_DAY = 86400 / TIME_MULTIPLIER; // 1200 seconds (20 mins)
const elapsedRealSeconds = unixTimestampSeconds - START_OF_TIMES;
const totalDays = Math.floor(elapsedRealSeconds / SECONDS_PER_SB_DAY) + 1;
const totalSeasons = Math.floor((totalDays - 1) / 93);
const year = Math.floor(totalSeasons / 4) + 1;
const seasonIndex = totalSeasons % 4; // 0: Spring, 1: Summer, 2: Autumn, 3: Winter
const dayOfSeason = ((totalDays - 1) % 93) + 1;
const secondsIntoDay = elapsedRealSeconds % SECONDS_PER_SB_DAY;
const hour = Math.floor((secondsIntoDay / SECONDS_PER_SB_DAY) * 24);
const minute = Math.floor(((secondsIntoDay / SECONDS_PER_SB_DAY) * 1440) % 60);
const SEASONS = ["Spring", "Summer", "Autumn", "Winter"];
return {
totalDays,
year,
season: SEASONS[seasonIndex],
dayOfSeason,
hour,
minute,
formattedTime: `${hour.toString().padStart(2, '0')}:${minute.toString().padStart(2, '0')}`
};
}
2. How to Calculate the Travelling Zoo
The Travelling Zoo visits the hub twice every SkyBlock year:
- Early Summer: Summer Days 1, 2, and 3 (lasts 1 real hour = 3 SkyBlock days).
- Early Winter: Winter Days 1, 2, and 3 (lasts 1 real hour = 3 SkyBlock days).
The calculation follows a 4-step deterministic pipeline:
- Derive the Seed: Because the zoo happens every 2 seasons, the seed is
Math.floor(seasonsSinceEpoch / 2). - Determine Legendary Pet: The 5 pets rotate sequentially:
['elephant', 'giraffe', 'tiger', 'lion', 'monkey']. The legendary index isseed % 5. - Roll Remaining 2 Pets: An instance of
JavaRandom(seed)picks 2 distinct non-legendary pets usingrng.nextInt(5). - Assign Rarities: The legendary pet is locked to
LEGENDARY. The other 2 pets roll a random rarity from['COMMON', 'UNCOMMON', 'RARE', 'EPIC']usingrarities[rng.nextInt(4)].
function getTravellingZooStock(totalDays) {
const PET_TYPES = ['elephant', 'giraffe', 'tiger', 'lion', 'monkey'];
const RARITIES = ['COMMON', 'UNCOMMON', 'RARE', 'EPIC'];
const daysSinceEpoch = totalDays - 1;
const seasonsSinceEpoch = Math.floor(daysSinceEpoch / 93);
const seed = Math.floor(seasonsSinceEpoch / 2);
// 1. Guaranteed Legendary Pet in Fixed Rotation
const legendaryIndex = seed % PET_TYPES.length;
const picked = [legendaryIndex];
const rng = new JavaRandom(seed);
// 2. Roll 2 additional distinct pets
while (picked.length < 3) {
const idx = rng.nextInt(PET_TYPES.length);
if (!picked.includes(idx)) picked.push(idx);
}
// 3. Assign rarities
const pets = picked.map((idx) => {
const name = PET_TYPES[idx];
const rarity = (idx === legendaryIndex) ? 'LEGENDARY' : RARITIES[rng.nextInt(RARITIES.length)];
return { name, rarity };
});
return {
seed,
legendaryPet: pets[0],
allPets: pets
};
}
3. How to Calculate Ethan's Farming Contest Crops
Ethan's Farming Contests occur every 3 SkyBlock days (daysSinceEpoch % 3 === 0), which is exactly every 60 real minutes (since 1 SkyBlock day = 20 real minutes).
- Calculate Event ID:
eventId = Math.floor(daysSinceEpoch / 3). - Generate 48-bit Seed with Golden Ratio: The event ID is bitwise XORed with the 64-bit Golden Ratio integer
0x9E3779B97F4A7C15nand masked to 48 bits. - Fisher-Yates Shuffle over 10 Crops: The 10 available crops (
WHEAT,SUGAR_CANE,CARROT,POTATO,MELON,PUMPKIN,COCOA_BEANS,CACTUS,MUSHROOM,BEETROOT) are shuffled deterministically and the top 3 are selected.
function getFarmingContestCrops(eventId) {
const CROPS = ['WHEAT', 'SUGAR_CANE', 'CARROT', 'POTATO', 'MELON', 'PUMPKIN', 'COCOA_BEANS', 'CACTUS', 'MUSHROOM', 'BEETROOT'];
const GOLDEN = 0x9E3779B97F4A7C15n;
const seed64 = (BigInt(eventId) ^ GOLDEN) & ((1n << 48n) - 1n);
const rng = new JavaRandom(Number(seed64));
const list = CROPS.slice();
for (let i = list.length - 1; i > 0; i--) {
const j = rng.nextInt(i + 1);
[list[i], list[j]] = [list[j], list[i]];
}
return list.slice(0, 3); // Active 3 crops for this contest
}
4. Deterministic Java 48-bit Linear Congruential Generator (LCG)
Because Minecraft servers run on Java, random outcomes rely on java.util.Random. To match server-side logic in web apps or bots without backend requests, calendarjs replicates Java's LCG:
// Java Linear Congruential Generator (LCG) Random Implementation
class JavaRandom {
constructor(seedVal) {
this.MUL = 0x5DEECE66Dn;
this.ADD = 0xBn;
this.MASK48 = (1n << 48n) - 1n;
this.seed = (BigInt(seedVal) ^ this.MUL) & this.MASK48;
}
next(bits) {
this.seed = (this.seed * this.MUL + this.ADD) & this.MASK48;
return Number(this.seed >> (48n - BigInt(bits)));
}
nextInt(bound) {
if ((bound & (bound - 1)) === 0) {
return Math.floor(bound * (this.next(31) / 2147483648));
}
let bits, val;
do {
bits = this.next(31);
val = bits % bound;
} while (bits - val + (bound - 1) < 0);
return val;
}
}
5. SkyBlock Server Events Schedule Reference
| Event Name | SkyBlock Calendar Date | Real-World Recurrence & Duration | Mechanics & Calculation |
|---|---|---|---|
| Travelling Zoo | Summer 1–3 & Winter 1–3 | Every ~31 real hours (lasts 1 real hour) | Seed: Math.floor(seasonsSinceEpoch / 2). Fixed legendary cycle + 2 random pets. |
| Ethan's Farming Contest | Every 3rd SkyBlock Day | Every 1 real hour (lasts 20 real minutes) | Seed: eventId ^ 0x9E3779B97F4A7C15n. Shuffles 10 crops, picks top 3. |
| Spooky Festival | Autumn 60, 61, 62 | Every 124 real hours (~5.16 days), lasts 1 hr | Triggered when season === 2 && dayOfSeason >= 60 && dayOfSeason <= 62. |
| New Year Celebration | Winter 91, 92, 93 | Every 124 real hours (~5.16 days), lasts 1 hr | New Year Cake Bag item dispenser. Triggered when season === 3 && dayOfSeason >= 91. |
| Season of the Pig | Spring 1–93 (every 4th SB year) | Every ~20.6 real days (lasts 31 real hours) | Active when season === 0 && (year - 1) % 4 === 0. |
6. Real-Time UI Engine & Lifecycle (SkyCalendar Implementation)
The live interactive SkyCalendar UI runs on a decoupled client-side architecture consisting of a pure mathematical engine and a 2-tier timer loop:
-
31-Day Pagination Sheets (
renderGrid): The calendar displays 31 days per page (representing Early, Mid, or Late season sheets). It pre-caches the current and next page in a memory map (pagesDataCache) so page flipping is instantaneous with zero re-calculation overhead. -
1-Second Event Countdown Loop:
Maintains an array of target timestamps for all upcoming server events. Every 1,000ms, it computes
msLeft = event.targetTime - Date.now()and dynamically formats countdown labels (0d 0h 0m 0s). -
20-Minute Day Advance Detector:
Every second, the loop checks if
todaySkyblock !== newSkyblockDay. When the 20-minute mark hits and the SkyBlock day advances, the engine automatically updates the date banner (e.g. Today: Year X, Summer, Day Y), flips pagination to the active page if necessary, and re-seeds upcoming events. - Interactive Day Modal & Deep Inspection: Clicking any day on the 31-day grid opens a detailed inspection modal that displays the exact countdown timer to that day, all active server events, specific Travelling Zoo pets, and Ethan's Farming Contest crops for that date.
// SkyCalendar Real-Time Ticker & Day Transition Engine
class SkyCalendarController {
constructor() {
this.currentDay = 0;
this.upcomingEvents = [];
}
start() {
this.refreshTime();
// 1. Ticker: Update event countdowns every second
setInterval(() => {
this.upcomingEvents.forEach((ev) => {
const msLeft = ev.targetTime - Date.now();
ev.countdownText = this.formatCountdown(msLeft);
});
}, 1000);
// 2. Day Advancer: Check for 20-minute SkyBlock day rollover
setInterval(() => {
const timeData = unixToSkyBlockTime();
if (this.currentDay !== timeData.totalDays) {
this.currentDay = timeData.totalDays;
console.log(`SkyBlock Day Rollover: Year ${timeData.year}, ${timeData.season}, Day ${timeData.dayOfSeason}`);
this.refreshEvents();
}
}, 1000);
}
formatCountdown(ms) {
if (ms <= 0) return "Active Now";
const s = Math.floor(ms / 1000), m = Math.floor(s / 60), h = Math.floor(m / 60), d = Math.floor(h / 24);
return `${d}d ${h % 24}h ${m % 60}m ${s % 60}s`;
}
}
NBT & Binary Data Decoding Guide
Complete guide for decoding Base64 GZIP Minecraft Named Binary Tag (NBT) blobs across Node.js, Python, Java, and Go.
Understanding CraftersMC NBT Data Storage
In CraftersMC SkyBlock, all items and storage containers are stored as Base64-encoded, GZIP-compressed Named Binary Tag (NBT) compound byte streams.
A typical encoded NBT string begins with the Base64 GZIP magic prefix H4sI.... To extract item names, lore descriptions, custom attributes, enchantments, and stats, your application must:
- Decode Base64 into a raw binary byte buffer.
- Decompress GZIP into an uncompressed NBT byte stream.
- Parse NBT Compound Tag into a structured object/dictionary.
- Extract ExtraAttributes (e.g.
enchantments,id,rarity_upgrades,slayer_kills,originTag).
All 15 CraftersMC NBT Storage Containers
The API exposes 15 distinct Base64 NBT compounds across member profiles and auctions:
| NBT Field Location | Payload Type | Description & Contents |
|---|---|---|
member.inventoryContents | Base64 GZIP NBT | Player's main 36 inventory slots (hotbar + storage). |
member.enderContents | Base64 GZIP NBT | Ender Chest storage slots. |
member.armorContents | Base64 GZIP NBT | 4 equipped armor slots (Helmet, Chestplate, Leggings, Boots). |
member.accessoryBag | Base64 GZIP NBT | Accessory / Talisman Bag storage compound. |
member.quiver | Base64 GZIP NBT | Quiver storage holding various arrow types and stacks. |
member.newYearCakeBag | Base64 GZIP NBT | New Year Cake Bag container storing numbered century cakes. |
member.petInventory | Base64 GZIP NBT | All player SkyBlock pets with levels, held pet items, candies, and XP. |
member.otherInventories.wardrobe_inventory | Base64 GZIP NBT | Wardrobe slots storing saved armor loadout sets. |
member.otherInventories.extra_equipment | Base64 GZIP NBT | Equipped equipment pieces (Necklace, Cloak, Belt, Gloves). |
member.otherInventories.medal_inventory | Base64 GZIP NBT | Ethan's Farming Contest medals storage (Bronze, Silver, Gold). |
member.otherInventories.seeds_inventory | Base64 GZIP NBT | Basket of Seeds item storage container. |
member.otherInventories.saved_effects | Base64 GZIP NBT | Active potion effects, Booster Cookie, and God Potion buffs. |
member.otherInventories.trick_or_treat_bag | Base64 GZIP NBT | Spooky Festival Trick or Treat Bag storing green and purple candy. |
member.otherInventories.pumpkin_launcher_ammo | Base64 GZIP NBT | Pumpkin Launcher ammo storage compound. |
auction.itemData | Base64 GZIP NBT | Full NBT compound for any active or ended Auction House listing. |
prismarine-nbt and Node.js built-in zlib:const nbt = require('prismarine-nbt');
const zlib = require('zlib');
async function decodeNBT(base64Data) {
if (!base64Data) return null;
const buffer = Buffer.from(base64Data, 'base64');
const decompressed = zlib.gunzipSync(buffer);
const { parsed } = await nbt.parse(decompressed);
return nbt.simplify(parsed);
}
nbtlib with Python standard gzip and base64:import base64, gzip, io, nbtlib
def decode_nbt(base64_str):
if not base64_str:
return None
raw_bytes = base64.b64decode(base64_str)
decompressed = gzip.decompress(raw_bytes)
nbt_file = nbtlib.File.parse(io.BytesIO(decompressed))
return nbt_file
import com.github.querz.nbt.io.NBTInputStream;
import com.github.querz.nbt.tag.CompoundTag;
import java.io.ByteArrayInputStream;
import java.util.Base64;
import java.util.zip.GZIPInputStream;
public CompoundTag decodeNBT(String base64Data) throws Exception {
byte[] bytes = Base64.getDecoder().decode(base64Data);
GZIPInputStream gzip = new GZIPInputStream(new ByteArrayInputStream(bytes));
return (CompoundTag) new NBTInputStream(gzip).readTag(256).getTag();
}
go-nbt parser:import (
"bytes"
"compress/gzip"
"encoding/base64"
"github.com/THeZet/go-nbt"
)
func DecodeNBT(base64Str string) (map[string]interface{}, error) {
data, err := base64.StdEncoding.DecodeString(base64Str)
if err != nil { return nil, err }
gzReader, err := gzip.NewReader(bytes.NewReader(data))
if err != nil { return nil, err }
return nbt.Parse(gzReader)
}
Mapping Decoded Numerical Item IDs to Vanilla Names
When you decode NBT inventory blobs (such as inventoryContents, armorContents, or enderContents), individual item slot objects store their base Minecraft item as a numerical ID integer / short (e.g. id: 347, id: 1, id: -10) per the official Bedrock Wiki Numerical Item IDs Standard:
- Positive IDs (
1to828): Vanilla Minecraft items and weapons (e.g.347=diamond_sword,310=baked_potato,4=cobblestone). - Negative IDs (
-1to-1125): Block entities and modern item definitions (e.g.-10=stripped_oak_log,-159=turtle_egg). - Namespaced Enchantments (
tag.ench): Unlike item models, enchantments are stored undertag.enchas namespaced string objects (e.g.minecraft:sharpness,minecraft:protection,trpixel:growth,trpixel:telekinesis) with an integer levellvl. - Custom SkyBlock Identifiers: The custom CraftersMC item type is located inside
tag.ExtraAttributes.idor custom tag properties (e.g.PIGMAN_SWORD,ASPECT_OF_THE_DRAGONS), whileidprovides the vanilla item base model.
// Example decoded slot compound from live NBT
const slotData = {
Slot: 0,
id: 347, // Bedrock Numerical Item ID (347 = diamond_sword)
Count: 1,
Damage: 0,
tag: {
display: {
Name: "§6Sharp Aspect of the Dragons",
Lore: ["§7Damage: §c+225", "§7Strength: §c+100"]
},
// Enchantments stored as namespaced strings with lvl
ench: [
{ id: "minecraft:sharpness", lvl: 5 },
{ id: "minecraft:fire_aspect", lvl: 2 },
{ id: "trpixel:scavenger", lvl: 3 },
{ id: "trpixel:critical", lvl: 5 },
{ id: "trpixel:telekinesis", lvl: 1 }
],
pixelReforge: "SHARP"
}
};
// Map numerical item ID to vanilla name while reading string enchantments
async function mapDecodedItem(slot) {
const itemMap = await fetch('/better-api-docs/numerical-item-ids.json').then(r => r.json());
const vanillaItemName = itemMap[slot.id] || `unknown_${slot.id}`;
const customSkyblockId = slot.tag?.ExtraAttributes?.id || null;
return {
slotIndex: slot.Slot,
amount: slot.Count,
vanillaIdentifier: `minecraft:${vanillaItemName}`,
skyblockItemId: customSkyblockId,
displayName: slot.tag?.display?.Name || vanillaItemName,
reforge: slot.tag?.pixelReforge || null,
enchantments: (slot.tag?.ench || []).map(e => ({
identifier: e.id,
level: e.lvl
}))
};
}
Interactive Numerical Item ID Lookup Tool
Search over 1,900 Bedrock item and block IDs directly in this live reference table:
| Numerical ID | Vanilla Minecraft Identifier | Type |
|---|
Complete Endpoints Reference (11 Routes)
Exhaustive technical documentation, parameter tables, response dictionaries, and multi-language code snippets with mandatory X-API-Key enforcement.
Network Status
| Header | Type | Required | Description |
|---|---|---|---|
X-API-Key | string | Required | Your CraftersMC developer API secret key. |
Accept | string | Optional | application/json |
ServerStatusReply object:
| Field | Type | Description |
|---|---|---|
success | boolean | Indicates if the request completed successfully (always true on 200). |
playerCount | integer (int32) | Total number of players currently connected across the network. |
maxPlayerCount | integer (int32) | Configured player connection limit for the entire network (e.g. 750). |
fullMaintenance | boolean | Whether the entire network is in full maintenance mode. |
plannedMaintenance | boolean | Whether a scheduled maintenance window is pending. |
whitelistRank | enum (PlayerRank) | Minimum rank required to join during maintenance (e.g. DEFAULT). |
games | object (map) | Game cluster map (SKYBLOCK, HUB, LIMBO) with nested sub-instance counts under modes. |
curl -X GET "https://api.craftersmc.net/v1/network/status" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Accept: application/json"{
"success": true,
"games": {
"LIMBO": {
"modes": {
"limbo": 8
}
},
"SKYBLOCK": {
"modes": {
"hub": 53,
"dynamic": 80,
"the_park": 10,
"sb_the_end": 10,
"mining_1": 9
}
},
"HUB": {}
},
"playerCount": 170,
"maxPlayerCount": 750,
"fullMaintenance": false,
"whitelistRank": "DEFAULT",
"plannedMaintenance": false
}
Vote List
| Header | Type | Required | Description |
|---|---|---|---|
X-API-Key | string | Required | Your CraftersMC developer API secret key. |
VotersReply object:
| Field | Type | Description |
|---|---|---|
success | boolean | Request execution state. |
month | string | Current tracking month code formatted as YYYYMM (e.g. 202608). |
count | integer (int32) | Total number of voter entries in the active leaderboard. |
fetchedAt | integer (int64) | Unix epoch timestamp (ms) of the voting list cache refresh. |
voters | array of VoterEntry | Array of objects containing nickname (string) and votes (int32). |
curl -X GET "https://api.craftersmc.net/v1/network/voters" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Accept: application/json"{
"success": true,
"month": "202608",
"fetchedAt": 1788029134683,
"count": 1000,
"voters": [
{ "nickname": "ZoroNoman", "votes": 30 },
{ "nickname": "AAAgamer6034", "votes": 29 },
{ "nickname": "aamorin", "votes": 29 },
{ "nickname": "AA_Dhruv_op", "votes": 29 },
{ "nickname": "ZNXayush4102", "votes": 29 }
]
}
Player Profile
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
X-API-Key | header | string | Required | Your CraftersMC developer API secret key. |
identifier | path | string | Required | Player IGN (e.g. Notch), 32-hex UUID, or numeric Pixel ID. |
| Field | Type | Description |
|---|---|---|
name | string | Current Minecraft in-game username (IGN). |
nameHistory | array of string | Previous usernames used on the network. |
pixelId | string | Internal network account hex identifier (e.g. a69ebe768). |
uuid | string (UUID) | Dashed 36-character player UUID. |
selectedRank | enum (PlayerRank) | Active player rank: DEFAULT, VOTER, GOLD, DIAMOND, EMERALD, YOUTUBER, ADMIN, OWNER. |
networkExp | integer (int64) | Cumulative network experience points. |
networkCoins | integer (int64) | Cosmetics and arcade coins balance. |
stats.skyBlock.profileId | string | 32-hex UUID of the player's currently active SkyBlock profile. |
stats.skyBlock.profiles | object (map) | Map of profile UUIDs to { cuteName: string, profileId: string } (e.g. PLUM, PEACH, KIWI). |
totalPlaytime | integer (int64) | Total network playtime in milliseconds. |
playtimePerGame | object (map) | Playtime breakdown in ms across game types (SKYBLOCK, HUB, LIMBO). |
firstLogin / lastLogin | string (ISO 8601) | ISO timestamp strings of player connection milestones. |
unlockedCollectables | array of string | Array of unlocked cosmetic identifiers (pets, suits, gadgets, particle trails). |
sbClaimedCakes | array of integer | List of SkyBlock New Year Cake edition numbers claimed by the player. |
curl -X GET "https://api.craftersmc.net/v1/player/NetworkPg" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Accept: application/json"{
"name": "NetworkPg",
"nameHistory": [],
"pixelId": "d34f76fd5",
"uuid": "ac6fca9d-0771-3960-aa85-fd21cb53f18e",
"selectedRank": "DEFAULT",
"networkExp": 60657,
"networkCoins": 5693,
"stats": {
"skyBlock": {
"profileId": "7da2465cd78141c0b0669a5eb48f250c",
"profiles": {
"7da2465cd78141c0b0669a5eb48f250c": {
"cuteName": "PLUM",
"profileId": "7da2465cd78141c0b0669a5eb48f250c"
}
}
}
},
"totalPlaytime": 1169586,
"playtimePerGame": {
"SKYBLOCK": 1095731,
"LIMBO": 67658,
"HUB": 5117
},
"firstLogin": "2024-02-11T10:32:12+03:00",
"lastLogin": "2026-08-28T13:27:27.361Z"
}
Bazaar Item Catalog
| Header | Type | Required | Description |
|---|---|---|---|
X-API-Key | string | Required | Your CraftersMC developer API secret key. |
Accept | string | Optional | application/json |
BazaarItemListReply object:
| Field | Type | Description |
|---|---|---|
success | boolean | Indicates successful execution (always true on 200). |
items | array of string | List of valid item IDs (e.g. ENCHANTED_PORK, HOT_POTATO_BOOK) tradeable on the Bazaar. |
curl -X GET "https://api.craftersmc.net/v1/resources/skyblock/bazaar/items" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Accept: application/json"{
"success": true,
"items": [
"mite_gel",
"enchanted_diamond",
"super_compactor_3000",
"summoning_eye",
"cropie",
"revenant_flesh",
"squash",
"fermento"
]
}
Bazaar Item Market Depth
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
X-API-Key | header | string | Required | Your CraftersMC developer API secret key. |
itemId | path | string | Required | Target Bazaar item ID (e.g. enchanted_diamond, super_compactor_3000). |
BazaarItemReply object:
| Field | Type | Description |
|---|---|---|
success | boolean | Request success status. |
itemId | string | The unique item ID identifier. |
buyVolume | integer (int64) | Total quantity of items requested in active buy orders (Instant Sell demand). |
sellVolume | integer (int64) | Total quantity of items listed in active sell offers (Instant Buy supply). |
weeklyAveragePrice | number (double) | Volume-weighted moving average price over the last 7 days. |
buyTopEntries | array of BazaarEntry | Top buy offers (highest price first): array of { price: number, quantity: integer, orderCount: integer }. |
sellTopEntries | array of BazaarEntry | Top sell offers (lowest price first): array of { price: number, quantity: integer, orderCount: integer }. |
curl -X GET "https://api.craftersmc.net/v1/skyblock/bazaar/enchanted_diamond/details" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Accept: application/json"{
"success": true,
"itemId": "enchanted_diamond",
"buyVolume": 105634,
"sellVolume": 78200,
"weeklyAveragePrice": 1248.5,
"buyTopEntries": [
{ "price": 1251.8, "quantity": 1425, "orderCount": 1 },
{ "price": 1251.7, "quantity": 5907, "orderCount": 1 }
],
"sellTopEntries": [
{ "price": 1253.2, "quantity": 1024, "orderCount": 1 },
{ "price": 1253.3, "quantity": 256, "orderCount": 1 }
]
}
Auction Details & NBT
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
X-API-Key | header | string | Required | Your CraftersMC developer API secret key. |
auctionId | path | string | Required | 32-hex character auction UUID (no dashes). |
AuctionReply wrapping auction (ApiAuctionEntry) and bids (array of ApiBidEntry):
| Field | Type | Description |
|---|---|---|
auction.id | string | 32-hex unique auction UUID. |
auction.createdAt | integer (int64) | Creation epoch timestamp in milliseconds. |
auction.endsAt | integer (int64) | Auction expiration epoch timestamp in milliseconds. |
auction.itemData | string (Base64 NBT) | Base64 GZIP-compressed NBT compound containing item enchantments, lore, and extra attributes. |
auction.itemId | string | Item identifier (e.g. PIGMAN_SWORD, ASPECT_OF_THE_DRAGONS, trpixel:obsidian_chestplate). |
auction.tier | enum (ItemRarity) | Rarity tier: COMMON, UNCOMMON, RARE, EPIC, LEGENDARY, MYTHIC, SPECIAL, VERY SPECIAL. |
auction.category | enum (AuctionCategory) | Category: WEAPONS, ARMORS, ACCESSORIES, CONSUMABLES, PETS, TOOLS, COSMETICS, MISCELLANEOUS. |
auction.ownerUniqueId / ownerName | string | Seller's 32-hex player UUID and Minecraft username. |
auction.startingPrice | number (double) | Starting bid amount in coins. |
auction.highestBidAmount | number (double) | Current winning bid in coins (or 0 if no bids placed). |
auction.bids | integer (int32) | Total number of bids placed. |
auction.ended | boolean | Whether the auction timer has finished or was buyout completed. |
bids[].bidderUuid | string | 32-hex UUID of the bidder. |
bids[].amount | number (double) | Bid amount placed in coins. |
bids[].timestamp | integer (int64) | Epoch timestamp (ms) when the bid was registered. |
curl -X GET "https://api.craftersmc.net/v1/skyblock/auction/6a9093c7145fed4df1832fbc" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Accept: application/json"{
"success": true,
"auction": {
"id": "6a9093c7145fed4df1832fbc",
"createdAt": 1787859911,
"endsAt": 1788032711,
"quantity": 1,
"itemData": "H4sICAAA...",
"itemId": "trpixel:obsidian_chestplate",
"tier": "EPIC",
"category": "ARMORS",
"type": "NORMAL",
"ownerUniqueId": "7b5183d0-3649-3bf8-b3fe-54752ca28665",
"ownerProfileId": "e526b6e994d04268b689990d58448260",
"ownerName": "EdgyHarmony2986",
"startingPrice": 120000,
"highestBidAmount": 0,
"bids": 0,
"ended": false
},
"bids": []
}
Active Auctions (Paginated)
| Parameter | In | Type | Required | Default | Description |
|---|---|---|---|---|---|
X-API-Key | header | string | Required | - | Your CraftersMC developer API secret key. |
page | query | integer (int32) | Optional | 0 | Zero-indexed page number (0 to totalPages - 1). |
AuctionPageReply object:
| Field | Type | Description |
|---|---|---|
success | boolean | Request execution state. |
page | integer (int32) | Current zero-indexed page number returned. |
totalPages | integer (int32) | Total available pages for active listings. |
totalAuctions | integer (int32) | Total number of active auctions across all pages. |
lastUpdated | integer (int64) | Unix epoch timestamp (ms) of the cache refresh. |
auctions | array of ApiAuctionEntry | Array of active auction objects containing full item metadata and NBT strings. |
curl -X GET "https://api.craftersmc.net/v1/skyblock/auctions?page=0" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Accept: application/json"{
"success": true,
"page": 0,
"totalPages": 2,
"totalAuctions": 1154,
"lastUpdated": 1788032079008,
"auctions": [
{
"id": "6a9093c7145fed4df1832fbc",
"createdAt": 1787859911,
"endsAt": 1788032711,
"itemId": "trpixel:obsidian_chestplate",
"tier": "EPIC",
"category": "ARMORS",
"startingPrice": 120000,
"highestBidAmount": 0,
"ownerName": "EdgyHarmony2986",
"itemData": "H4sICAAA...",
"ended": false
}
]
}
Recently Ended Auctions
| Header | Type | Required | Description |
|---|---|---|---|
X-API-Key | string | Required | Your CraftersMC developer API secret key. |
AuctionPageReply object:
| Field | Type | Description |
|---|---|---|
success | boolean | Request execution state. |
lastUpdated | integer (int64) | Timestamp when ended auctions cache was generated. |
auctions | array of ApiAuctionEntry | Auctions finalized in the last 60s, including highestBidAmount, ownerName, cancelReason, and itemData. |
curl -X GET "https://api.craftersmc.net/v1/skyblock/auctions/ended" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Accept: application/json"{
"success": true,
"lastUpdated": 1788032084999,
"auctions": [
{
"id": "6a92f249558a95b32b7f8a5d",
"itemId": "trpixel:pigman_sword",
"tier": "LEGENDARY",
"category": "WEAPONS",
"type": "BIN",
"ownerName": "Darkness44121",
"startingPrice": 7000000,
"highestBidAmount": 0,
"ended": true,
"cancelReason": "OWNER"
}
]
}
Player Auction Listings
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
X-API-Key | header | string | Required | Your CraftersMC developer API secret key. |
uuid | path | string | Required | Target player's 32-hex UUID. |
profileId | query | string | Optional | Filter auctions to a specific SkyBlock profile. |
AuctionsReply object:
| Field | Type | Description |
|---|---|---|
success | boolean | Request execution state. |
auctions | array of ApiAuctionEntry | All active and completed listings created by the specified player UUID. |
curl -X GET "https://api.craftersmc.net/v1/skyblock/auctions/player/7b5183d0-3649-3bf8-b3fe-54752ca28665" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Accept: application/json"{
"success": true,
"auctions": [
{
"id": "6a9093c7145fed4df1832fbc",
"itemId": "trpixel:obsidian_chestplate",
"startingPrice": 120000,
"highestBidAmount": 0,
"ended": false
}
]
}
SkyBlock Profile & Member Data
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
X-API-Key | header | string | Required | Your CraftersMC developer API secret key. |
profileId | path | string | Required | 32-hex character SkyBlock profile UUID (no dashes). |
SkyBlockProfileReply wrapping a profile object:
| Field | Type | Description |
|---|---|---|
profile.id | string | 32-hex unique profile UUID. |
profile.createdAt | integer (int64) | Creation epoch timestamp in seconds. |
profile.ownerUniqueId | string | 32-hex player UUID of the profile leader. |
profile.ownerLastName / ownerLastRank | string | Username and rank of profile owner (e.g. KaosTheChaos, EMERALD). |
profile.banking.balance | number (double) | Co-op bank coin balance. |
profile.banking.highestBalance / tier | number / string | Bank capacity ceiling and tier badge (e.g. ELITE). |
profile.members[uuid].coinPurse | number (double) | Member's purse coin balance. |
profile.members[uuid].skills | object (map) | Key-value map of skill XP numbers (combat, farming, mining, foraging, fishing, enchanting, alchemy, taming, carpentry, runecrafting, social). |
profile.members[uuid].slayerData | object | Slayer boss XP and tier levels for zombie, spider, and wolf. |
profile.members[uuid].visitedZones | array of string | Island areas discovered (e.g. the_park.acacia, end.dragons_nest). |
profile.members[uuid].deaths / kills | object (map) | Lifetime death and kill counters by mob and damage type. |
profile.members[uuid].inventoryContents | string (Base64 NBT) | 36 player inventory slots as a GZIP NBT compound blob. |
profile.members[uuid].enderContents | string (Base64 NBT) | Ender chest item storage as a GZIP NBT compound blob. |
profile.members[uuid].armorContents | string (Base64 NBT) | 4 equipped armor slots (Helmet, Chestplate, Leggings, Boots). |
profile.members[uuid].accessoryBag | string (Base64 NBT) | Accessory / Talisman Bag storage compound. |
profile.members[uuid].quiver | string (Base64 NBT) | Quiver storage holding various arrow types and stacks. |
profile.members[uuid].newYearCakeBag | string (Base64 NBT) | Stored New Year Cakes in the player's cake bag. |
profile.members[uuid].petInventory | string (Base64 NBT) | All SkyBlock pets with levels, held pet items, candies, and XP. |
profile.members[uuid].otherInventories | object (map of NBT) | Map of sub-inventories: wardrobe_inventory, extra_equipment, medal_inventory, seeds_inventory, saved_effects, trick_or_treat_bag, and pumpkin_launcher_ammo (all Base64 GZIP NBT). |
curl -X GET "https://api.craftersmc.net/v1/skyblock/profile/7da2465cd78141c0b0669a5eb48f250c" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Accept: application/json"{
"success": true,
"profile": {
"id": "7da2465cd78141c0b0669a5eb48f250c",
"createdAt": 1707641453,
"ownerUniqueId": "ac6fca9d07713960aa85fd21cb53f18e",
"ownerLastName": "NetworkPg",
"ownerLastRank": "VOTER",
"banking": {
"balance": 35950322.53,
"highestBalance": 50000000,
"tier": "BASIC"
},
"members": {
"ac6fca9d07713960aa85fd21cb53f18e": {
"coinPurse": 6203650.72,
"skills": {
"farming": 1508242.97,
"mining": 8148856.46,
"combat": 11442420.02,
"foraging": 578625.55,
"enchanting": 25839701.03,
"taming": 5261734.76
},
"slayerData": {
"zombie": 86220,
"wolf": 6230,
"zombieTier": 4,
"wolfTier": 4
},
"accessoryBag": "H4sICAAA...",
"armorContents": "H4sICAAA...",
"inventoryContents": "H4sICAAA...",
"quiver": "H4sICAAA...",
"petInventory": "H4sICAAA...",
"otherInventories": {
"medal_inventory": "H4sICAAA...",
"wardrobe_inventory": "H4sICAAA..."
}
}
}
}
}
SkyBlock Global Settings & Banners
| Header | Type | Required | Description |
|---|---|---|---|
X-API-Key | string | Required | Your CraftersMC developer API secret key. |
Accept | string | Optional | application/json |
SkyBlockSettingsReply object containing active and evergreen banner queues:
| Field | Type | Description |
|---|---|---|
success | boolean | Request execution status (always true on 200). |
settings.menuBannerQueue | array of MenuBanner | Ordered list of promotional banner image objects displayed at the top of the in-game SkyBlock Menu. |
menuBannerQueue[].expireAt | integer (int64) | Unix epoch timestamp in seconds when the banner expires. A value of 0 signifies an evergreen fallback banner. |
menuBannerQueue[].images | object (map) | Key-value map of language codes (english, german, spanish, turkish, french) to image descriptor objects. |
images[locale].type | string | Resource type identifier (e.g. URL). |
images[locale].path | string (URL) | Direct CDN link to the localized promotional PNG banner (hosted on cdn.craftersmc.net). |
curl -X GET "https://api.craftersmc.net/v1/skyblock/settings" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Accept: application/json"{
"success": true,
"settings": {
"menuBannerQueue": [
{
"images": {
"english": {
"type": "URL",
"path": "https://cdn.craftersmc.net/h/skyblock/skyblock_menu/banner/summer_sale_2026/english.png"
},
"german": {
"type": "URL",
"path": "https://cdn.craftersmc.net/h/skyblock/skyblock_menu/banner/summer_sale_2026/german.png"
},
"spanish": {
"type": "URL",
"path": "https://cdn.craftersmc.net/h/skyblock/skyblock_menu/banner/summer_sale_2026/spanish.png"
},
"turkish": {
"type": "URL",
"path": "https://cdn.craftersmc.net/h/skyblock/skyblock_menu/banner/summer_sale_2026/turkish.png"
},
"french": {
"type": "URL",
"path": "https://cdn.craftersmc.net/h/skyblock/skyblock_menu/banner/summer_sale_2026/french.png"
}
},
"expireAt": 1787346000
},
{
"images": {
"english": {
"type": "URL",
"path": "https://cdn.craftersmc.net/h/skyblock/skyblock_menu/banner/v051/english.png"
},
"german": {
"type": "URL",
"path": "https://cdn.craftersmc.net/h/skyblock/skyblock_menu/banner/v051/german.png"
},
"spanish": {
"type": "URL",
"path": "https://cdn.craftersmc.net/h/skyblock/skyblock_menu/banner/v051/spanish.png"
},
"turkish": {
"type": "URL",
"path": "https://cdn.craftersmc.net/h/skyblock/skyblock_menu/banner/v051/turkish.png"
},
"french": {
"type": "URL",
"path": "https://cdn.craftersmc.net/h/skyblock/skyblock_menu/banner/v051/french.png"
}
},
"expireAt": 0
}
]
}
}
Data Schemas & Models
Complete JSON schema definitions for all core data models.
GET /v1/network/status{
"success": true,
"games": {
"SKYBLOCK": { "modes": { "hub": 53, "dynamic": 80, "the_park": 10 } },
"LIMBO": { "modes": { "limbo": 8 } }
},
"playerCount": 170,
"maxPlayerCount": 750,
"fullMaintenance": false,
"whitelistRank": "DEFAULT",
"plannedMaintenance": false
}
GET /v1/player/{identifier}{
"name": "NetworkPg",
"pixelId": "d34f76fd5",
"uuid": "ac6fca9d-0771-3960-aa85-fd21cb53f18e",
"selectedRank": "DEFAULT",
"networkExp": 60657,
"networkCoins": 5693,
"stats": {
"skyBlock": {
"profileId": "7da2465cd78141c0b0669a5eb48f250c",
"profiles": { "7da2465cd78141c0b0669a5eb48f250c": { "cuteName": "PLUM" } }
}
},
"totalPlaytime": 1169586
}
GET /v1/skyblock/bazaar/{itemId}/details{
"success": true,
"itemId": "enchanted_diamond",
"buyVolume": 105634,
"sellVolume": 78200,
"weeklyAveragePrice": 1248.5,
"buyTopEntries": [{ "price": 1251.8, "quantity": 1425, "orderCount": 1 }],
"sellTopEntries": [{ "price": 1253.2, "quantity": 1024, "orderCount": 1 }]
}
GET /v1/skyblock/auction/{auctionId}{
"success": true,
"auction": {
"id": "6a9093c7145fed4df1832fbc",
"createdAt": 1787859911,
"endsAt": 1788032711,
"itemId": "trpixel:obsidian_chestplate",
"tier": "EPIC",
"category": "ARMORS",
"startingPrice": 120000,
"highestBidAmount": 0,
"ownerName": "EdgyHarmony2986",
"itemData": "H4sICAAA...",
"ended": false
},
"bids": []
}
Enums Reference Dictionary
Comprehensive enumeration constant sets across player ranks, item rarities, server types, and profile modes.