NetherAPI

API Documentation

NetherAPI is a drop-in replacement for the Hypixel API. All endpoints work identically — just change the base URL and use your NetherAPI key.

Authentication

All requests require an API key. Include it in the API-Key header:

Bash
curl -X GET "https://netherapi.com/api/v2/player?uuid=..." \
     -H "API-Key: your-api-key"

You can also use the Authorization header with a Bearer token:

HTTP Header
Authorization: Bearer your-api-key

Rate Limits

Each API key has a rate limit (requests per 5 minutes). Check response headers:

X-RateLimit-LimitYour total limit per 5-minute window
X-RateLimit-RemainingRequests remaining in current window
X-RateLimit-ResetUnix timestamp when the window resets
X-RateLimit-Reset-AfterSeconds until the window resets
X-RateLimit-SurgePresent as 1 only when this request was served above your cap using spare shared capacity. Treat it as a one-off reprieve, not a raised limit — it can disappear on the next request

If you exceed your rate limit, you'll receive a 429 Too Many Requests response. Wait for the window to reset before making more requests.

Error Handling

All error responses follow this format:

JSON
{
  "success": false,
  "error": "Error message description"
}
401Invalid or missing API key
403API key is disabled
429Rate limit exceeded
502Failed to reach Hypixel API

Account Value

Get full SkyBlock account value in USD. Returns the calculated market value for an account.

Request

Bash
curl "https://netherapi.com/api/v2/account/value?username=Technoblade" \
     -H "API-Key: your-nether-api-key"

Parameters

usernameMinecraft IGN to look up (or uuid)
uuidMinecraft UUID (with or without dashes) — auto-converts to username

Note: Either username or uuid is required. If UUID is provided, it will be automatically converted to username via Mojang API.

Response

JSON
{
  "success": true,
  "username": "Technoblade",
  "uuid": "b876ec32e396476ba1158438d83c67d4",
  "currency": "USD",
  "profiles": [
    {
      "profile_name": "Tomato",
      "profile_id": "abc123...",
      "game_mode": "normal",
      "selected": true,
      "value": {
        "breakdown": {
          "catacombs": 45.50,
          "crimson": 5.00,
          "dungeon_classes": 4.00,
          "fairy_souls": 1.00,
          "farming": 5.00,
          "hotm": 2.00,
          "mining": 33.00,
          "networth": 120.00,
          "skills": 85.00,
          "skyblock_level": 8.00,
          "slayer": 1.20
        },
        "total": 309.70
      },
      "stats": {
        "catacombs": "Level 42.50",
        "mining": { "gemstone": "9", "glacite": "6", "mithril": "10" },
        "skills": "SA 52.30",
        "slayer": "Z9 S9 W9 E9 B9 V5"
      }
    }
  ],
  "total": 309.70
}

Response Fields

totalFull calculated account value in USD
profiles[]Array of all SkyBlock profiles with individual valuations
profiles[].value.breakdownValue breakdown by category (catacombs, slayer, networth, skills, etc.)
profiles[].statsHuman-readable stats (levels, powder amounts, etc.)

Account Lowball

Get conservative lowball estimate in USD. Returns the value ÷ divisors for a more conservative pricing.

Request

Bash
curl "https://netherapi.com/api/v2/account/lowball?username=Technoblade" \
     -H "API-Key: your-nether-api-key"

Parameters

usernameMinecraft IGN to look up (or uuid)
uuidMinecraft UUID (with or without dashes) — auto-converts to username

Note: Either username or uuid is required. If UUID is provided, it will be automatically converted to username via Mojang API.

Response

JSON
{
  "success": true,
  "username": "Technoblade",
  "uuid": "b876ec32e396476ba1158438d83c67d4",
  "currency": "USD",
  "profiles": [
    {
      "profile_name": "Tomato",
      "profile_id": "abc123...",
      "game_mode": "normal",
      "selected": true,
      "lowball": {
        "breakdown": {
          "catacombs": 25.28,
          "crimson": 2.78,
          "dungeon_classes": 2.22,
          "fairy_souls": 0.56,
          "farming": 2.78,
          "hotm": 1.11,
          "mining": 18.33,
          "networth": 66.67,
          "skills": 47.22,
          "skyblock_level": 4.44,
          "slayer": 0.67
        },
        "total": 172.06
      },
      "stats": {
        "catacombs": "Level 42.50",
        "mining": { "gemstone": "9", "glacite": "6", "mithril": "10" },
        "skills": "SA 52.30",
        "slayer": "Z9 S9 W9 E9 B9 V5"
      }
    }
  ],
  "total": 172.06
}

Response Fields

totalConservative lowball estimate in USD
profiles[]Array of all SkyBlock profiles with individual lowball valuations
profiles[].lowball.breakdownLowball breakdown by category
profiles[].statsHuman-readable stats (levels, powder amounts, etc.)

Account Valuation Errors

Both /v2/account/value and /v2/account/lowball share these error responses:

401Invalid or missing API key
400Missing username parameter
404Account not found or no SkyBlock data
502Failed to reach valuation service

Networth Prices

Returns the full item price table as a flat object of item id to price. One request gives you every price we have, so you can do your own item math locally instead of calling compute-bound endpoints per item. This route makes zero Hypixel calls and consumes no upstream key-pool quota — it only counts against your own key's rate limit.

Request

Bash
curl "https://netherapi.com/api/v2/networth/prices" \
     -H "API-Key: your-nether-api-key"

Parameters

None. This endpoint takes no query parameters — any you send are ignored.

Response

Truncated below. A real response carries roughly 14,000 entries and is around 744KB.

JSON
{
  "success": true,
  "updatedAt": "2026-07-19T03:02:16.346Z",
  "ageSec": 59,
  "stale": false,
  "count": 14113,
  "prices": {
    "HYPERION": 510000000,
    "NECRON_HANDLE": 168000000,
    "ENCHANTED_DIAMOND": 25400,
    "HOT_POTATO_BOOK": 210000
  }
}

Response Fields

successAlways true on a 200 response
updatedAtISO 8601 timestamp of when the refresh last stored the table, or null
ageSecInteger seconds since updatedAt, or null if updatedAt is null
staletrue once ageSec passes 10800 (3 hours); null if updatedAt is null
countNumber of entries in prices; null if the stored metadata is missing or unreadable
pricesFlat object mapping item id to price (number)

Freshness

The table is refreshed hourly from the upstream price source, which itself publishes roughly every 15 minutes. The stored copy has a 6 hour TTL, so the data survives several consecutive refresh failures.

stale flips to true past 3 hours. It is not an error — the endpoint keeps serving, and the flag is surfaced so you can decide your own tolerance.

Errors

401Invalid or missing API key
403API key is disabled
429Rate limit exceeded for your key — body includes throttle: true, Retry-After is set
503Price data unavailable — Retry-After: 30
500Failed to read price data
JSON
{
  "success": false,
  "error": "Price data unavailable"
}

A 503 means the refresh has never succeeded or the stored table's TTL expired. Wait the 30 seconds given by Retry-After and try again. This is deliberately a 503 rather than a 200 with an empty table: an empty table returned as a success would let you compute a networth of zero and believe it.

Unknown Paths

/v2/networth/prices is the only route in this namespace. Any other path under /v2/networth/ returns 404 with the body {"success":false,"error":"Unknown networth endpoint"} — for every method except the CORS preflight OPTIONS, which still answers 200 so browser clients get a normal preflight. That response is unauthenticated, so a typo fails fast rather than looking like an auth problem.

Endpoints

Base URL: https://netherapi.com/api

Account Valuation

GET/v2/account/value

Get full account value in USD

Parameters:username or uuid
GET/v2/account/lowball

Get conservative lowball estimate in USD

Parameters:username or uuid

Player Data

GET/v2/player

Get player data including game stats

Parameters:uuid
GET/v2/recentgames

Get recently played games

Parameters:uuid
GET/v2/status

Get online status

Parameters:uuid
GET/v2/guild

Get guild information

Parameters:id, player, or name

Resources

GET/v2/resources/games

Game information

GET/v2/resources/achievements

Achievements

GET/v2/resources/challenges

Challenges

GET/v2/resources/quests

Quests

GET/v2/resources/guilds/achievements

Guild achievements

GET/v2/resources/vanity/pets

Vanity pets

GET/v2/resources/vanity/companions

Vanity companions

SkyBlock

GET/v2/skyblock/collections

Collections data

GET/v2/skyblock/skills

Skills data

GET/v2/skyblock/items

Items data

GET/v2/skyblock/election

Election and Mayor

GET/v2/skyblock/bingo

Current Bingo event

GET/v2/skyblock/news

News

GET/v2/skyblock/auction

Specific auctions

Parameters:uuid, player, or profile
GET/v2/skyblock/auctions

Active auctions

Parameters:page
GET/v2/skyblock/auctions_ended

Recently ended auctions

GET/v2/skyblock/bazaar

Bazaar data

GET/v2/skyblock/profile

Profile by UUID

Parameters:profile
GET/v2/skyblock/profiles

All profiles for player

Parameters:uuid
GET/v2/skyblock/museum

Museum data

Parameters:profile
GET/v2/skyblock/garden

Garden data

Parameters:profile
GET/v2/skyblock/firesales

Active/upcoming fire sales

Networth

GET/v2/networth/prices

Full item price table — costs zero Hypixel quota

Housing

GET/v2/housing/active

Active public houses

GET/v2/housing/house

Specific house info

Parameters:house
GET/v2/housing/houses

Player houses

Parameters:player

Other

GET/v2/boosters

Active network boosters

GET/v2/counts

Current player counts

GET/v2/leaderboards

Current leaderboards

GET/v2/punishmentstats

Punishment statistics

Code Examples

JavaScript / Node.js — Player Data

JavaScript
const API_KEY = 'your-nether-api-key';
const BASE_URL = 'https://netherapi.com/api';

async function getPlayer(uuid) {
  const response = await fetch(
    `${BASE_URL}/v2/player?uuid=${uuid}`,
    { headers: { 'API-Key': API_KEY } }
  );

  if (!response.ok) {
    throw new Error(`HTTP ${response.status}`);
  }

  return response.json();
}

// Usage
const data = await getPlayer('069a79f4-44e9-4726-a5be-fca90e38aaf5');
console.log(data.player.displayname);

JavaScript / Node.js — Account Value

JavaScript
const API_KEY = 'your-nether-api-key';
const BASE_URL = 'https://netherapi.com/api';

async function getAccountValue(username) {
  const response = await fetch(
    `${BASE_URL}/v2/account/value?username=${username}`,
    { headers: { 'API-Key': API_KEY } }
  );

  if (!response.ok) {
    throw new Error(`HTTP ${response.status}`);
  }

  return response.json();
}

// Usage
const data = await getAccountValue('Technoblade');
console.log(`Total value: $${data.total}`);
for (const p of data.profiles) {
  console.log(`${p.profile_name}: $${p.value.total}`);
}

Python — Player Data

Python
import requests

API_KEY = 'your-nether-api-key'
BASE_URL = 'https://netherapi.com/api'

def get_player(uuid):
    response = requests.get(
        f'{BASE_URL}/v2/player',
        params={'uuid': uuid},
        headers={'API-Key': API_KEY}
    )
    response.raise_for_status()
    return response.json()

# Usage
data = get_player('069a79f4-44e9-4726-a5be-fca90e38aaf5')
print(data['player']['displayname'])

Python — Account Value

Python
import requests

API_KEY = 'your-nether-api-key'
BASE_URL = 'https://netherapi.com/api'

def get_account_value(username):
    response = requests.get(
        f'{BASE_URL}/v2/account/value',
        params={'username': username},
        headers={'API-Key': API_KEY}
    )
    response.raise_for_status()
    return response.json()

# Usage
result = get_account_value('Technoblade')
print(f"Total value: ${result['total']}")
for p in result['profiles']:
    print(f"{p['profile_name']}: ${p['value']['total']}")

cURL — Networth Prices

Bash
curl "https://netherapi.com/api/v2/networth/prices" \
     -H "API-Key: your-nether-api-key"

JavaScript / Node.js — Networth Prices

JavaScript
const API_KEY = 'your-nether-api-key';
const BASE_URL = 'https://netherapi.com/api';

async function getPrices() {
  const response = await fetch(
    `${BASE_URL}/v2/networth/prices`,
    { headers: { 'API-Key': API_KEY } }
  );

  if (response.status === 503) {
    throw new Error('Price data unavailable — retry after 30s');
  }

  if (!response.ok) {
    throw new Error(`HTTP ${response.status}`);
  }

  return response.json();
}

// Usage — one request gives you the whole table
const data = await getPrices();

// stale is null when the table is being served but its age is unknown, so
// check for that before treating false as "definitely fresh".
if (data.stale === null) {
  console.warn('Price age unknown — metadata unavailable');
} else if (data.stale) {
  console.warn(`Prices are ${data.ageSec}s old`);
}

// Look up a single item. count is null on that same metadata-missing path.
console.log(`${data.count ?? Object.keys(data.prices).length} items priced`);
console.log(`HYPERION: ${data.prices['HYPERION']}`);

// Price an inventory locally — no further requests
const inventory = { HYPERION: 1, NECRON_HANDLE: 2, ENCHANTED_DIAMOND: 320 };
const total = Object.entries(inventory).reduce(
  (sum, [id, qty]) => sum + (data.prices[id] ?? 0) * qty,
  0
);
console.log(`Inventory total: ${total}`);

Python — Networth Prices

Python
import requests

API_KEY = 'your-nether-api-key'
BASE_URL = 'https://netherapi.com/api'

def get_prices():
    response = requests.get(
        f'{BASE_URL}/v2/networth/prices',
        headers={'API-Key': API_KEY}
    )
    if response.status_code == 503:
        raise RuntimeError('Price data unavailable - retry after 30s')
    response.raise_for_status()
    return response.json()

# Usage - one request gives you the whole table
data = get_prices()

# stale is None when the table is being served but its age is unknown, so
# check for that before treating False as "definitely fresh".
if data['stale'] is None:
    print('Price age unknown - metadata unavailable')
elif data['stale']:
    print(f"Prices are {data['ageSec']}s old")

# Look up a single item. count is None on that same metadata-missing path.
count = data['count'] if data['count'] is not None else len(data['prices'])
print(f"{count} items priced")
print(f"HYPERION: {data['prices']['HYPERION']}")

# Price an inventory locally - no further requests
inventory = {'HYPERION': 1, 'NECRON_HANDLE': 2, 'ENCHANTED_DIAMOND': 320}
total = sum(data['prices'].get(item, 0) * qty for item, qty in inventory.items())
print(f'Inventory total: {total}')