API
Pool data as static JSON
Everything under /api/, /pool/ and /users/ is plain JSON that any script or dashboard can read. It is refreshed locally on a regular schedule and may be fetched from any origin (CORS is open). Poll about once a minute and use the timestamps to detect stale data. Amounts are in satoshis unless the field name says otherwise; hashrates are H/s; times are Unix seconds (UTC).
Pool
/api/pool.jsonThe whole pool in one document: total and per-mode (modes.solo, modes.cpplns) hashrate (1m … 7d), miners, workers, round stats; network (height, difficulty, network hashrate, block subsidy); blocks per mode (total, 24h, 7d, orphaned, last); instances[] — each local instance with its ports, start/min difficulty, fee, enabled/running state; coinbase_previews — for each cPPLNS instance, an estimate of the outputs its next block would pay.
/api/mps.jsonA flat summary meant for aggregators such as MiningPoolStats: hashrate, miners, workers, blocks_found, blocks_24h, last_block_height, last_block_time, fee_pct, network_* and the stratum endpoint list. The pool is one entry: enabled instances are summed once, even when an instance has several ports.
/pool/pool.statusThe three-line ckpool/CKpool format, aggregated over enabled instances, for tools that already read ckpool's pool.status. Line 3's diff/accepted are summed over every instance's current round.
/api/history.jsonSeries for charts: series.total|solo|cpplns with 24h (5-minute points) and 7d (hourly points) as [time, hashrate, miners]; Per-instance work and payout windows remain independent.
/api/stratums.jsonCompatibility endpoint containing one local entry. It does not describe remote servers; new clients should use pool.json's flat instances array.
/api/status.jsonPool health: when local statistics were published, which instances report, and how far the block scanner has progressed.
Miners
/api/miners.jsonsolo[] and cpplns[] lists of miners seen recently: address, hashrate (5m/1h/1d), workers, last share, active; SOLO rows carry blocks, cPPLNS rows carry window_pct_max and est_pay_sats (summed over instances).
/api/miner/<address>.jsonOne miner across local instances: totals, instances[] (each with host, port, mode, hashrate, workers, best shares and — for cPPLNS — pplns.window_pct, pplns.est_pay_sats, lifetime earned_sats), solo (blocks found, expected time to a block), cpplns (sums), and history.points for the last 24 h. 404 if the address has never submitted a share.
/users/<address>The ckpool per-user format (hashrate strings, worker[]), aggregated over instances, for miner-side dashboards that expect it.
/api/payouts/<address>.jsonRead from the blockchain: every pool block whose coinbase paid this address — height, time, mode, amount, status (immature/confirmed/orphaned) — and totals. It exists even for addresses no port currently sees.
Blocks
/api/blocks.jsonThe most recent pool blocks with their coinbase outputs (largest first, capped per block), status and confirmations, plus totals per mode.
/api/blocks-index.jsonEvery pool block, compact: h height, t time, m mode, r reward sats, w SOLO winner, n outputs, o orphaned, x hash.
/api/blocks-attrib.jsonHeight → the local instance, port and worker that found it (the chain does not know worker names).
/api/network.jsonThe XBT network as the pool sees it: height, difficulty, network hashrate, subsidy, tip hash and time.
How a block becomes a pool block
Every instance uses a configured coinbase tag that identifies this pool, its payout mode and the instance. The scanner matches those tags when it records blocks. The pool walks the XBT chain from its launch height, records every block with that tag, checks chain continuity so a reorg changes affected blocks to orphaned (and back if it returns), and uses each block's mature_depth to mark its coinbase spendable (normally 100 confirmations). XBT's temporary long-maturity interval is handled according to the block height. You can verify any of it on the explorer.
Example
curl -s https://xbtcpool.org/api/pool.json | jq '{h: .total.hashrate."5m", miners: .total.miners, blocks: .blocks.total.total}'
curl -s https://xbtcpool.org/api/miner/YOUR_ADDRESS.json | jq '.instances[] | {host, port, mode, hr: .hashrate."5m", slice: .pplns.window_pct}'
curl -s https://xbtcpool.org/pool/pool.status