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.
| Endpoint | Does |
|---|---|
GET /api/info?host=&port=&tls= | Returns the server's /v1/join status JSON (name, version, players, …). |
POST /api/offer | Sends 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).
// 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.
Three limits apply, independently:
429. This smooths spikes and is separate from the monthly quota.host:port) is probed at most twice per minute on a cache miss, so /api/offer can never drain a server's NetherNet UDP port pool. Repeated lookups of the same server within 120 s are served from cache; if a target is throttled and nothing is cached, the response is { ok: false, error: "target throttled …" } (send fresh:true only when you truly need a live probe).| Anonymous (per IP) | With an API key | |
|---|---|---|
/api/info | 2,000 / month | 20,000 / month |
/api/offer | 200 / month | 2,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.
Send the key with either header:
X-API-Key: ice_xxxxxxxx
# or
Authorization: Bearer ice_xxxxxxxx
read:user) to create the account — no repository access, and we never post anything.Sign in with GitHub to create a free account and get your API key.
Sign in with GitHubToolLearnArticlesAPIPrivacyTerms · iceFetch is not affiliated with Mojang or Microsoft.