List Your Pool
Expose one JSON endpoint on your domain — we do the rest automatically.
✅ Fast, human review. Once your API endpoint passes our automatic check, we approve new pools by hand — usually within a day. We refresh data every 10 minutes directly from your API — no scraping, no Cloudflare issues.
How it works
Mining Scan reads pool data directly from your pool's API, not from screen-scraping. Your stats refresh on a ~10-minute cycle while our collectors are healthy — every number carries its own timestamp, and anything stale is labeled stale rather than shown as live. We support the industry-standard Miningcore API format, which is already built into popular pool software.
3 steps to listing
Expose GET /api/pools on your domain
If you run Miningcore, Ergo, or compatible software — you already have this. Otherwise implement the endpoint using our spec below. Takes ~30 minutes.
Submit your domain via our form
Tell us your domain and API URL. We automatically verify the endpoint is reachable and returns valid data.
Reviewed & listed
Verification passes → we review your submission and add your pool to the directory. We poll your /api/pools every 10 minutes to keep all stats fresh.
Requirements
- Your pool must be publicly reachable (not behind VPN or private network)
- The /api/pools endpoint must respond with HTTP 200 and valid JSON
- At least one coin must have a valid coin.type or coin.symbol
- Pool must have had mining activity in the last 30 days
- No fake or copied hashrate data — we cross-check against network stats
API Standard
We use the Miningcore API format — the most widely adopted standard in the mining pool industry. If your pool runs Miningcore, Abelian Pool, Ergo Pool, or any compatible software, you already comply.
GET /api/pools
The primary endpoint. Returns configuration and live stats for all coins your pool supports.
{
"pools": [
{
"id": "btc", // unique slug for this coin pool
"coin": {
"type": "BTC", // ticker symbol (REQUIRED)
"name": "Bitcoin", // full name (optional)
"algorithm": "SHA256" // mining algorithm (optional)
},
"ports": {
"3333": { "varDiff": true }, // stratum port(s)
"3334": { "varDiff": false, "difficulty": 512 }
},
"paymentProcessing": {
"enabled": true,
"minimumPayment": 0.001, // in coin units
"payoutScheme": "PPLNS" // PPLNS / PROP / SOLO / PPS / FPPS
},
"poolFeePercent": 1.0, // % fee (REQUIRED)
"address": "bc1q...", // pool wallet (optional)
"poolStats": {
"connectedMiners": 150, // active miners (REQUIRED)
"connectedWorkers": 310,
"poolHashrate": 15000000000000, // H/s (REQUIRED)
"sharesPerSecond": 42.5
},
"networkStats": {
"networkType": "mainnet",
"networkHashRate": 993000000000000000,
"networkDifficulty": 123456789012,
"blockHeight": 954578, // current block height (REQUIRED)
"connectedPeers": 42,
"rewardType": "POW"
},
"totalBlocks": 87, // all-time blocks found
"totalPaid": 1.305, // all-time paid out (coin units)
"lastPoolBlockTime": "2026-06-21T00:30:00Z" // ISO 8601
}
]
}
Required vs optional fields
| Field | Required | Description |
|---|---|---|
| coin.type | Required | Ticker symbol, uppercase (BTC, XMR, KAS…) |
| poolFeePercent | Required | Fee in percent, e.g. 1.0 for 1% |
| poolStats.connectedMiners | Required | Current active miners count |
| poolStats.poolHashrate | Required | Current pool hashrate in H/s |
| networkStats.blockHeight | Required | Current network block height |
| paymentProcessing.payoutScheme | Recommended | PPLNS / PROP / SOLO / PPS / FPPS |
| lastPoolBlockTime | Recommended | Timestamp of last block found by pool |
| totalBlocks | Optional | Total blocks found all-time |
| ports | Optional | Stratum ports configuration |
| address | Optional | Pool wallet address |
GET /api/pools/{id}/blocks
Optional but recommended — enables block history display on your pool page.
{
"pageCount": 5,
"items": [
{
"blockHeight": 954578,
"networkDifficulty": 123456789012,
"status": "confirmed", // pending / confirmed / orphaned
"effort": 0.94, // 0.94 = 94% effort
"reward": 3.125,
"miner": "bc1q...", // miner who found it (optional)
"created": "2026-06-21T00:30:00Z"
}
]
}
GET /api/pools/{id}/payments
Optional — enables payment history on your pool page.
{
"pageCount": 12,
"items": [
{
"coin": "BTC",
"address": "bc1q...",
"amount": 0.00315,
"transactionConfirmationData": "txhash...",
"created": "2026-06-21T01:00:00Z"
}
]
}
Simple format (alternative)
If you don't run Miningcore and implementing the full spec seems complex, you can use our minimal format instead. Just expose any URL that returns this JSON:
{
"pool_name": "My Awesome Pool",
"website": "https://mypool.com",
"coins": [
{
"symbol": "KAS",
"algorithm": "kHeavyHash",
"hashrate": 500000000000, // H/s
"miners": 42,
"fee_percent": 1.0,
"payout_scheme": "PPLNS",
"min_payout": 50.0,
"block_height": 465756033,
"last_block_found": "2026-06-21T00:30:00Z",
"stratum": "stratum+tcp://mypool.com:5555"
}
]
}
📌 Tip: You can host this as a static JSON file at https://yourpool.com/mining-scan.json — no server code needed. Just update it with a cron job every few minutes.
Verified-work services paid in a token
The Miningcore and simple formats above describe a native PoW coin whose own network has a block height. A reviewed verified-work service that pays a token on another chain is a separate listing type; do not invent a PoW height or copy the settlement chain tip into the reward token's fields.
{
"service": {
"type": "verified_work_token_reward",
"work": { "lane": "GPU", "algorithm": "KAWPOW-EUREKA-V1" },
"rewardAsset": {
"symbol": "EKNX",
"standard": "BEP-20",
"network": "BNB Smart Chain Mainnet",
"chainId": 56,
"contractAddress": "0xf54913a8d5e2aebd0b62c6411ccf1b5b4ab069c9",
"standalonePowBlockchain": false
}
},
"poolStats": {
"poolHashrate": 0, // a reported zero remains zero
"hashrateStatus": "reported",
"hashrateUnit": "H/s",
"estimated": true,
"windowSeconds": 900,
"sampleShares": 0,
"connectedMiners": 0,
"connectedWorkers": 0
},
"networkStats": {
"blockHeight": null,
"blockHeightStatus": "not_applicable"
}
}
- Use poolHashrate: null with hashrateStatus: "unavailable" when no value was reported. Do not turn missing data into zero.
- Use blockHeight: null and blockHeightStatus: "not_applicable" when the reward token has no independent PoW chain.
- Include the reward-token standard, settlement network, chain ID, and contract address so the token cannot be confused with a native coin sharing its ticker.
Mining Scan reviews these records as a service listing and keeps them out of the native mineable-coin and block-verification catalogues. Existing public APIs may be manually mapped; a new endpoint is not required when the supplied sources already provide these facts.
After the profile is accepted and collected, the service record is available at GET /pools/{domain}/service. That response keeps poolHashrate separate from hashrateStatus, and keeps networkStats.blockHeight null when its status is not_applicable.
Using Miningcore software
If you use Miningcore as your pool backend, you already have the /api/pools endpoint built in. It runs on port 4000 by default. Just make sure it's publicly accessible:
# Miningcore exposes the API on port 4000 by default
# Make sure nginx/caddy proxies it:
location /api/ {
proxy_pass http://127.0.0.1:4000;
proxy_set_header Host $host;
}
Example: https://smoozypool.es/api/pools — a real Miningcore-compatible endpoint already listed on Mining Scan.
Validate your endpoint
Before submitting, test that your endpoint returns valid data:
Submit your pool
Once your endpoint is working, submit your pool here →
After submission we verify your endpoint automatically. If it passes, we review your submission and list your pool.
Questions?
Use the contact form → for any questions, listing issues, or advertising inquiries.