API
Pool data as JSON, refreshed every minute
Everything under /api/, /pool/ and /users/ is plain JSON that any script or dashboard can read. It is rebuilt about once a minute, may be fetched from any origin (CORS is open) and can be polled as often as you like. 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); stratums[] — every location with its ports, start/min difficulty, fee, running state and node height; coinbase_previews — for each cPPLNS port, 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: every location is summed.
/pool/pool.statusThe three-line ckpool/CKpool format, aggregated over every port and location, for tools that already read ckpool's pool.status. Line 3's diff/accepted are summed over every port'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]; stratums.<name> likewise per location.
/api/stratums.jsonPer-location detail only (same objects as pool.json's stratums).
/api/status.jsonPool health: which locations reported, when, and how far along the chain the block record is.
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 ports).
/api/miner/<address>.jsonOne miner across every port: 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 every port, 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 location, port and worker that found it (the chain does not know worker names).
/api/network.jsonThe BC3 network as the pool sees it: height, difficulty, network hashrate, subsidy, tip hash and time.
How a block becomes a pool block
Every block the pool works on carries /bc3pool.org/SOLO/ or /bc3pool.org/cPPLNS/ in its coinbase. The pool walks the BC3 chain from its launch height, records every block with that tag, keeps re-checking the last 50 heights so a reorg flips a block to orphaned (and back if it returns), and treats a block as confirmed at 100 confirmations — the coinbase maturity depth. You can verify any of it on the explorer.
Example
curl -s https://bc3pool.org/api/pool.json | jq '{h: .total.hashrate."5m", miners: .total.miners, blocks: .blocks.total.total}'
curl -s https://bc3pool.org/api/miner/bc1q.../.json | jq '.instances[] | {host, port, mode, hr: .hashrate."5m", slice: .pplns.window_pct}'
curl -s https://bc3pool.org/pool/pool.status