Suprnova Pools — Developer API Reference ======================================== Last updated: 2026-05-08 This document describes the public, read-only endpoints that miner programs (profit-switchers, dashboards, aggregators) can use to discover and monitor the pools running under suprnova.cc. Everything here is anonymous, no auth, no rate limit beyond a soft 30 req/min/IP on the aggregate endpoint. CORS is wide open (`Access-Control-Allow-Origin: *`). ------------------------------------------------------------------------ 1) AGGREGATE ENDPOINT — every pool, one request ------------------------------------------------------------------------ https://www.suprnova.cc/api.php This is the recommended entrypoint for profit-switchers. It returns a single JSON document covering every active pool. Data is refreshed every 5 minutes by a server-side fetcher (so don't poll faster — you'll just read the same cache). Optional query params: ?pretty=1 Pretty-printed JSON. ?coin=XXX Filter to a single coin symbol (case-insensitive), e.g. ?coin=XMR or ?coin=lpepe. Response shape: { "status": "ok", "name": "Suprnova", "website": "https://www.suprnova.cc", "twitter": "https://x.com/suprnovapools", "discord": "https://discord.gg/29RHZwvVPN", "support": "admin@suprnova.cc", "updated_at": "2026-05-06T14:02:57+00:00", // ISO-8601, cache time "pool_count": 20, "pools": [ { "id": "lpepe", // Internal pool key, stable "coin": { "symbol": "LPEPE", "name": "LuckyPepe", "algorithm": "YescryptR32" }, "urls": { "pool": "https://lpepe.suprnova.cc", // Web frontend "api": "https://lpepe.suprnova.cc/api/pools/lpepe" // Per-pool API }, "stats": { "workers": 48, "hashrate": { "pool": 387179.78, // Raw, in pool's // native unit "pool_formatted": "387.18 KH/s", // Human-readable "network": 1949166, // Raw network h/r "network_formatted": "1.95 MH/s" } }, "mining": { "pool_fee_percent": 1, // % fee taken by pool, or null "block_reward": 2000000, // Coin-units per block, or null "payout_scheme": "PPLNS", // PPLNS / prop / PPS / null "min_payout": 1000, // Minimum auto-payout, or null "last_block": 102587 // Last block height seen }, "featured": true, "badge": "New!", // Optional UI label "coming_soon": false, // Only set on pre-launch entries "stale": false, // True = cache served because // upstream fetch failed "last_updated": "2026-05-06T14:02:56+00:00" // Per-pool freshness }, ... ] } Cache headers: `Cache-Control: public, max-age=300`. The fetcher cron runs every 5 minutes; if a pool API is briefly unreachable the previous values stay in the response with `stale: true`. About the `mining` block: - Values come from the pool's own API where it exposes them. Where it doesn't, the field is `null` (most MPOS pools don't expose `block_reward` or `min_payout`, for example). For profit-switching, treat `null` as "unknown — fall back to your own coin/network data". - `pool_fee_percent` is a percent, not a fraction (1 means 1%, not 1.0). - `block_reward` is in the coin's smallest natural unit as reported by the pool — for miningcore-style pools this is typically the same unit as `urls.api` returns under `pool.blockReward`. Always cross-check. - `last_block` is informational (network tip the pool last saw); it does not imply the pool found that block. ------------------------------------------------------------------------ 2) PER-POOL API ENDPOINTS ------------------------------------------------------------------------ If you need fields the aggregate doesn't expose (per-block history, payment history, individual miner stats, recent shares), call each pool's own API. Two flavours exist on Suprnova: (a) MPOS-style pools URL: https://.suprnova.cc/index.php?page=api&action=public These return a flat JSON object: pool_name, hashrate, workers, shares_this_round, last_block, network_hashrate. A handful also expose `fee` and `payout`. Per-miner stats need an apikey — `&action=getuserstatus&id=` etc., documented inside the MPOS project. Active MPOS pools: ric — https://ric.suprnova.cc/index.php?page=api&action=public gap — https://gap.suprnova.cc/index.php?page=api&action=public vtc — https://vtc.suprnova.cc/index.php?page=api&action=public rvn — https://rvn.suprnova.cc/index.php?page=api&action=public rtm — https://rtm.suprnova.cc/index.php?page=api&action=public qtc — https://qtc.suprnova.cc/index.php?page=api&action=public grs — https://grs.suprnova.cc/index.php?page=api&action=public dgbq — https://dgbq.suprnova.cc/index.php?page=api&action=public pxc — https://pxc.suprnova.cc/index.php?page=api&action=public (b) Miningcore-style pools URL: https://[:]/api/pools/ Standard miningcore JSON: { "pool": { coin, ports, blockReward, poolFeePercent, paymentProcessing, poolStats, networkStats, ... } }. See https://github.com/oliverw/miningcore for the full schema. Active miningcore pools: xnt — https://xnt.suprnova.cc:4832/api/pools/xnt npt — https://npt.suprnova.cc:4932/api/pools/npt xel — https://xel.suprnova.cc:4030/?api/pools/xel xmr — https://xmr.suprnova.cc:4007/api/pools/xmr zec — https://zec.suprnova.cc:4008/api/pools/zec dcr — https://dcr.suprnova.cc:9030/api/pools/dcr juno — https://juno.suprnova.cc:4383/api/pools/juno c64 — https://c64.suprnova.cc:8064/api/pools/c64 lpepe — https://lpepe.suprnova.cc/api/pools/lpepe fair — https://fair.suprnova.cc/api/pools/fair The `urls.api` field in the aggregate response always points to the correct per-pool endpoint, so you don't need to hard-code these. Extension: `lastBlockFound` --------------------------- A few pools (fair, lpepe, c64 etc.) now expose a top-level `lastBlockFound` object on the per-pool response, sibling to `poolStats` / `networkStats`. It tells you the most recent block this pool found, with a Unix-seconds timestamp: "lastBlockFound": { "height": 2034, // pool's last find — null if never "foundAt": 1778255510 // Unix seconds — null if never } Use it to compute time-since-last-block (TSL) without a second round-trip: tslSeconds = Math.floor(Date.now() / 1000) - pool.lastBlockFound.foundAt; blocksBehind = pool.networkStats.blockHeight - pool.lastBlockFound.height; Notes: - `null` on both fields means the pool has never found a block (a fresh launch). Branch on null before doing TSL math. - Not filtered by status — if the most recent find is later orphaned, `foundAt` still reflects when the pool *did* submit it. That is the correct behaviour for a "how warm is this pool right now" signal. - This field is NOT (yet) propagated into the aggregate at api.php — call the per-pool endpoint directly to read it. - Not every pool carries it. If `lastBlockFound` is absent, fall back to the pool's `/api/pools//blocks` endpoint. ------------------------------------------------------------------------ 3) STRATUM ENDPOINTS ------------------------------------------------------------------------ The aggregate API does NOT publish stratum host/port lists. Stratum endpoints (and their vardiff config) are listed on each pool's "Getting Started" page on the pool website (urls.pool). For miningcore pools they're also returned under `pool.ports` in the per-pool API. Pool host names follow the pattern `.suprnova.cc`. ------------------------------------------------------------------------ 4) WHAT'S MISSING FOR PROFIT SWITCHING ------------------------------------------------------------------------ Coin price is intentionally not part of this API. Profit-switchers should pull spot prices from a market data source they trust (CoinGecko, CMC, exchange tickers). For coins where `mining.block_reward` is null (most MPOS pools), pull the current emission from a block-explorer or coin-RPC of your choice — the pool can't always know it. ------------------------------------------------------------------------ 5) CHANGELOG ------------------------------------------------------------------------ 2026-05-06: Added `mining` block (pool_fee_percent, block_reward, payout_scheme, min_payout, last_block) and per-pool `stale` / `last_updated` fields. 2026-05-08: Several pools (fair, lpepe, c64 etc.) now expose `lastBlockFound: { height, foundAt }` at the top level of the per-pool API response. See section 2(b) for details.