Data API
Download the live mining pool & coin directory as JSON or CSV — free, no key required.
✅ Read-only and free. No sign-up, no API key. Every response carries a freshness and coverage marker so you always know how current the data is — and blank never means zero.
Overview
Mining Scan tracks a directory of mining pools and the coins they mine, refreshed directly from each pool's own API. The Data API exposes that same directory for programmatic use — the identical data shown on the site, wrapped in a small envelope that states, on every response, how fresh and how trustworthy it is right now.
Two endpoints, both GET, both returning json (default) or csv via ?format=csv:
| Endpoint | Returns |
|---|---|
| /api/export/pools | Every pool with its coins, fee, hashrate, miners, block counts and per-row freshness timestamps. |
| /api/export/coins | Every coin with its pool count, algorithm, network hashrate, miners and block activity. |
How we keep it honest
This directory is only useful if you can trust the numbers — so the API refuses to dress up stale or missing data as live:
- One honesty number, everywhere. The meta.honesty_index (0–100) and meta.state on every response are the same figures shown on our public Status page. The API can never claim the data is healthier than our own live status says.
- Stale is labelled, not hidden. If our last rescan is older than 30 minutes, meta.stale is true and meta.scanner_age_human tells you how old. You decide whether that is fresh enough for your use.
- Blank means "not reported" — never zero. Where a pool publishes nothing for a field, the value is null in JSON and an empty cell in CSV. We do not invent a 0.
- If our database is unreachable, the API returns 503 with meta.state: "down" — it does not hand you an empty or cached list pretending to be current.
- Downloads stay honest offline. A CSV carries its generation date in the filename, per-row timestamps, and X-Mining-Scan-* headers, so a saved file can't quietly go stale on you.
See the raw honesty report any time at /api/status.
GET /api/export/pools
The full pool directory. Optional limit (default and max 5000) and format (json|csv).
# JSON
curl -s "https://mining-scan.com/api/export/pools" | jq '.meta.honesty_index, (.data | length)'
# CSV, saved to a dated file
curl -sJO "https://mining-scan.com/api/export/pools?format=csv"
Response envelope (JSON)
{
"meta": {
"generated_at": "2026-07-24T09:31:07Z",
"honesty_index": 100, // same 0-100 as /status
"state": "operational", // operational | partial | impaired | down
"stale": false, // true if last rescan > 30 min ago
"scanner_age_sec": 154,
"scanner_age_human": "2 min ago",
"row_count": 874,
"coverage_boundary": {
"pools_seen_48h": 821, "with_block_detail": 140,
"aggregate_only": 45, "no_block_data": 636, "note": "..."
},
"flags": [],
"caveat": "Blank/null fields mean the pool did not report that value — never zero.",
"source": "https://mining-scan.com",
"terms": "Free for any use with attribution to mining-scan.com.",
"status_url": "https://mining-scan.com/status"
},
"data": [
{
"domain": "smoozypool.es", "name": "SmoozyPool", "status": "confirmed",
"coin_count": 2, "coins": ["KAS", "XEL"],
"fee": 1.0, "avg_fee": 1.0, "payout_schemes": ["PPLNS"],
"miners": 34, "best_hashrate": 12.4, "best_hashrate_unit": "TH/s",
"blocks_found": 12, "blocks_24h": 3,
"last_metric_at": "2026-07-24T09:29:41Z",
"last_scan_at": "2026-07-24T09:29:41Z", "last_block_at": "2026-07-24T08:02:10Z"
}
]
}
Pool fields
| Field | Meaning |
|---|---|
| domain | Pool's normalized domain (its identity in the directory). |
| name | Pool name, or null if unknown. |
| status | Directory status (e.g. confirmed, candidate). |
| coins | Array of coin symbols the pool mines. |
| fee / avg_fee | Minimum and average pool fee percent across the pool's coins. |
| payout_schemes | Distinct payout schemes seen (e.g. PPLNS, SOLO). |
| miners | Live miner count (last 48h), or null. |
| best_hashrate / _unit | Highest live pool hashrate and its unit (e.g. TH/s). |
| blocks_found | Pool's own confirmed lifetime blocks; null if the pool publishes no block count. |
| blocks_24h | Blocks reported in the last 24h by pools that publish only a rolling count. |
| last_metric_at | When we last read live metrics for this pool (per-row freshness). |
| last_block_at | When this pool last reported finding a block. |
GET /api/export/coins
The coin directory. Optional limit (default and max 1000) and format.
Coin fields
| Field | Meaning |
|---|---|
| symbol / coin_name | Ticker and display name. |
| algorithm | Most-reported mining algorithm for the coin. |
| pool_count | Number of pools in the directory mining this coin. |
| total_blocks | Sum of live pools' blocks for the coin; null where unknown. |
| blocks_48h | Blocks found across pools in the last 48h. |
| total_miners | Live miners across pools mining the coin. |
| network_hashrate / _unit | Latest network hashrate as reported by a live pool. |
| last_block_at | Most recent block time seen for the coin. |
CSV format
Add ?format=csv. The response is a plain, header-first CSV (arrays such as coins are ;-joined). An unknown value is an empty cell, never 0. The file is self-dating:
- Filename carries the UTC generation time: mining-scan-pools_2026-07-24T0931Z.csv
- Each row keeps its own last_metric_at timestamp.
- Response headers: X-Mining-Scan-Honesty-Index, X-Mining-Scan-State, X-Mining-Scan-Generated-At, X-Mining-Scan-Scanner-Age-Sec.
Rate limits & terms
Up to 300 requests per day per IP across the export endpoints. The dataset only changes about every 10 minutes, so one pull every few minutes is plenty. Over the limit returns HTTP 429 with a Retry-After header.
The data is free for any use — commercial or not — with attribution to mining-scan.com (a link back is appreciated). Advertising on the site never affects the numbers or ordering in this export; sponsored placement is separate and clearly marked on the site. Need a higher limit, historical data, or a keyed feed? Get in touch — those are on the roadmap.