iceFetch exposes a small free JSON API to check a Minecraft Bedrock NetherNet server's status and read the ICE candidates it advertises — the same thing the on-site tool does.

Endpoints

EndpointDoes
GET /api/info?host=&port=&tls=Returns the server's /v1/join status JSON (name, version, players, …).
POST /api/offerSends a signaling offer and returns { candidates[], answer, iceUfrag, … }.
# status
curl "https://icefetch.tools.kt04.com/api/info?host=play.example.net&port=19132"

# candidates
curl -X POST https://icefetch.tools.kt04.com/api/offer \
  -H 'content-type: application/json' \
  -d '{"host":"play.example.net","port":19132}'

/api/offer body: host (required), port (default 19132), networkId (optional decimal uint64), tls (auto; true/false to force), fresh (bypass the 120 s cache).

Request & response types

// GET /api/info  — query string
host   : string            // required — hostname or IP
port   : number            // optional, default 19132
tls    : "true" | "false"  // optional — auto-detected if omitted

// 200 →
{ ok: boolean, status: number, tls: boolean, info: object | null }


// POST /api/offer  — Content-Type: application/json
{
  host      : string,   // required
  port?     : number,   // default 19132
  networkId?: string,   // decimal uint64 (1–20 digits); random if omitted
  tls?      : boolean,  // auto-detected if omitted
  fresh?    : boolean   // true = bypass the 120 s cache
}

// 200 →
{
  ok: boolean,
  answer: string,             // raw SDP answer
  candidates: Candidate[],
  answerFingerprint: string,
  iceUfrag: string,
  exhausted: boolean,         // 200 but 0 candidates = server UDP port pool drained
  cached?: boolean, stale?: boolean
}

Candidate = {
  raw: string, foundation: string, component: number, transport: string,
  priority: number, address: string, port: number, type: string,
  relatedAddress?: string, relatedPort?: number
}

On error both endpoints return { ok: false, error: … } — error is a string or an object such as { httpStatus, body } — with a 4xx/5xx status.

Rate limits

Three limits apply, independently:

Anonymous (per IP)With an API key
/api/info2,000 / month20,000 / month
/api/offer200 / month2,000 / month

Every API response carries the current quota in headers:

X-RateLimit-Scope:     ip | key
X-RateLimit-Limit:     <monthly limit>
X-RateLimit-Remaining: <calls left this month>
X-RateLimit-Reset:     <unix time when the quota resets>

When a quota is exhausted the API returns HTTP 429 with a Retry-After header.

Using your API key

Send the key with either header:

X-API-Key: ice_xxxxxxxx
# or
Authorization: Bearer ice_xxxxxxxx
Sign in with GitHub below to get a key. We only read your GitHub username and id (scope read:user) to create the account — no repository access, and we never post anything.

Get an API key

Sign in with GitHub to create a free account and get your API key.

Sign in with GitHub

ToolLearnArticlesAPIPrivacyTerms · iceFetch is not affiliated with Mojang or Microsoft.