Every HeroMiners pool answers the same set of read-only HTTP endpoints. There is no key, no account and no sign-up: request a URL and you get JSON back, with Access-Control-Allow-Origin: * set so a page in a browser can call it directly. Use it to build a rig monitor, a payout notifier, a dashboard of your own, or to pull the pool into a spreadsheet.
Each coin has its own pool with its own numbers and its own address format, so pick the coin first and enter an address for that coin. Nothing you type here is sent anywhere but the pool itself, and only when you press Run.
Base URL
https://alephium.herominers.com
Endpoints
GET/api/stats
Everything the pool knows about itself right now: pool and network hashrate, connected miners and workers, the last block, fees, ports and the payout settings.
Query
address
A payout address. Adds that miner under miner, and under solo_miner if they also mine solo. Omit it and both come back empty.
This is the endpoint to start from. The pool page, the miners page and every chart on this site are built from it.
Request
curl "https://alephium.herominers.com/api/stats"
Answer
An object with pool, network, config, charts, lastblock and payments. Recomputed once per stats cycle, so polling faster than that returns the same numbers.
GET/api/live_stats
The same payload as /api/stats, but held open until the next stats cycle finishes and then answered. One request per update instead of polling on a timer.
Query
address
Include a miner in the payload, as with /api/stats.
Open one connection and reopen it when it answers. Several open at once from the same address are refused with a 503, so do not fan out.
Enter address above to run this one. The command shows it because the pool answers with an error without it.
Answer
The miner totals plus a workers object keyed by worker name. An address that has never mined here answers with an error rather than an empty miner.
GET/api/get_blocks
Blocks the pool has found and already paid out.
Query
heightrequired
Return blocks below this height. Pass a number far above the tip for the newest page, then the lowest height you received to page backwards.
The finder address is masked before it leaves the pool, so this endpoint cannot be used to harvest addresses. time is Unix seconds, reward is in the coin’s smallest unit, and a score ending in 0 or 1 marks a solo block that was paid or orphaned.
Payments the pool has sent, either pool-wide or for one address.
Query
timerequired
Return payments before this Unix timestamp in seconds. Use the current time for the newest page, then the oldest timestamp you received to page backwards.
address
Restrict to one payout address. Omit for every payment the pool has made.
limit
How many to return. Clamped to the pool’s own page size, so a larger number simply returns that.
format
Pass parsed to get { tx, amount, time } objects instead of the raw array.
Without format, a flat array alternating value and timestamp, each value being txid:amount. Amounts are strings in the coin’s smallest unit and must stay strings: parsing one as a number loses precision on a chain with 18 decimals.
GET/api/get_miners_stats
The ten largest miners on the pool, plus the mining-software and regional breakdowns behind the miners page.
An object with miners, agents, regions, regionHistory and statsDisplay. Addresses are masked. When a panel is not enabled its array comes back empty and statsDisplay says so.
GET/api/get_blocks_search
Search the pool’s blocks by height, block hash or finder address, across both pending and paid blocks at once.
Query
qrequired
A height, a block hash or an address.
offset
Skip this many results. The reply carries hasMore so you know whether to ask again.
Search is rate limited per address, and going over it returns rateLimited with the exact wait in retryMs rather than a bare error. Call /api/get_blocks_search_config first to learn the length bounds and whether search is switched on at all.
Enter q above to run this one. The command shows it because the pool answers with an error without it.
Answer
An object with pending and matured, in the same alternating format as /api/get_blocks, plus totalMatched, offset, limit and hasMore.
GET/api/get_miner_payout_level
The payout threshold currently set for an address, in whole coins.
Query
addressrequired
The payout address.
The matching /api/set_miner_payout_level writes it, and it is not open to anyone: the request has to come from the address’s own mining IP. That check, and the rate limit in front of it, are described on the settings tab of the dashboard rather than here.
Enter address above to run this one. The command shows it because the pool answers with an error without it.
Answer
{ banned, minerMessage }, and when banned also blockMining, blockPayments and reason. Reports whether the address is currently blocked from mining, from being paid, or neither. minerMessage is the operator’s message to this address, as { message, type, createdAt, expiresAt }, or null when there is none.
Using it well
Poll on the pool's own clock. The numbers are recomputed once per stats cycle, and config.updateInterval in the /api/stats reply says how long that is in seconds. Asking more often than that returns the same answer and costs both of us bandwidth.
Prefer /api/live_stats to a fast timer. It answers the moment there is something new, which is both quicker for you and lighter on the pool than polling.
Keep amounts as strings. Rewards and balances come back in the coin's smallest unit. On a chain with 18 decimals those integers run past what a JavaScript number can hold exactly, so parsing one silently rounds a payout.
Expect addresses to be masked. Public listings hide the middle of every address. Your own full address is only ever needed by you, and only where you supply it.
Handle a rate limit as a wait, not a failure. Where a limit applies the reply carries retryMs. Back off for that long and retry rather than hammering.
Say who you are. A User-Agent naming your tool is not required, but it means we can tell you about a change instead of guessing what broke.