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 neither key is sent.
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, payments and visitors, how many people are on the site right now, as { windowMinutes, activeVisitors, activeLookups }. 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 IP are refused with a 503, so do not fan out.
The same shape as /api/stats, except that miner and solo_miner are always sent, empty when no address was given. The request stays open for up to one stats cycle.
GET/api/stats_address
One miner: current and average hashrate, valid and stale shares, balance, amount paid, and the same figures per worker.
Enter address above to run this one. The command shows it because the pool answers with an error without it.
Answer
An object with stats (the miner totals), payments, charts, unlocked and workers, an array with one entry per worker named by its 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 that are no longer pending: paid out, or orphaned. status says which.
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.
status
Pass matured, solo or orphaned to get only those blocks. The reply then becomes { blocks, next }: blocks in the same format as without it, and next, the height to pass for the next page, or null when nothing older is left. A page can hold no block and still carry a next.
limit
With status, how many blocks to return, at most 100. Required with status.
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 solo block carries a score of s0 when it was paid or s1 when it was 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.
conversions
With address, pass 1 to also get the conversion record of every payout on the page that was converted to another coin. The reply then becomes { payments, conversions }. Ignored with format=parsed.
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 IP, 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, both alternating value and height like /api/get_blocks, plus totalMatched, offset, limit and hasMore. A matured block is in the /api/get_blocks format; a pending block is still waiting to mature and uses the longer pending format, so its fields are in a different order.
GET/api/get_blocks_search_config
Whether block search is switched on, and the bounds a query has to fit, so a search box can be set up before the first search.
{ enabled, minQueryLength, maxQueryLength, frontendCooldownMs }. The lengths are in characters, and frontendCooldownMs is how long to wait between two searches.
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. It is the notice the miner page shows for this address: 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.