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:

EndpointReturns
/api/export/poolsEvery pool with its coins, fee, hashrate, miners, block counts and per-row freshness timestamps.
/api/export/coinsEvery coin with its canonical asset key, slug, pool count, algorithm, network hashrate, miners and block activity.
/api/coin-exitsADDON-043.2 exit snapshot: coin identities, venues, trading pairs, verified exit routes and pool payout methods kept as separate metrics.
/coins · /pools · /profitCanonical JSON directory and profitability inputs used by the interactive site.

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:

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": {
    "api_version": "1",
    "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": [
    {
      "id": "pool-uuid", "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

FieldMeaning
idStable canonical pool UUID. Use it together with the normalized domain; do not use display name as identity.
domainPool's normalized domain (its public directory identity).
namePool name, or null if unknown.
statusDirectory status (e.g. confirmed, candidate).
coinsArray of coin symbols the pool mines.
fee / avg_feeMinimum and average pool fee percent across the pool's coins.
payout_schemesDistinct payout schemes seen (e.g. PPLNS, SOLO).
minersLive miner count (last 48h), or null.
best_hashrate / _unitHighest live pool hashrate and its unit (e.g. TH/s).
blocks_foundPool's own confirmed lifetime blocks; null if the pool publishes no block count.
blocks_24hBlocks reported in the last 24h by pools that publish only a rolling count.
last_metric_atWhen we last read live metrics for this pool (per-row freshness).
last_block_atWhen this pool last reported finding a block.

GET /pools/{domain}/coins

The public per-pool view used by the directory. Each coin row includes the recorded Stratum endpoints attached to that same pool/coin identity.

Stratum endpoint fields

FieldMeaning
stratum_endpointsArray of recorded endpoint objects; an empty array means no endpoint is recorded.
urlCanonical URI. IPv6 hosts are enclosed in brackets, for example stratum+tcp://[2001:db8::1]:3333.
protocol / host / portStored transport, host and TCP port.
tlstrue only for TLS Stratum; plain TCP is false.
address_familyipv4 or ipv6, derived from the stored host.
tls_healthCertificate/transport health when recorded; not_applicable is used for plain TCP.

GET /api/export/coins

The coin directory. Optional limit (default and max 1000) and format.

Coin fields

FieldMeaning
asset_key / slugStable canonical coin identity and URL key. A ticker is a display field and does not merge distinct projects with the same symbol.
symbol / coin_nameTicker and display name.
algorithmMost-reported mining algorithm for the coin.
pool_countNumber of pools in the directory mining this coin.
total_blocksSum of live pools' blocks for the coin; null where unknown.
blocks_48hBlocks found across pools in the last 48h.
total_minersLive miners across pools mining the coin.
network_hashrate / _unitLatest network hashrate as reported by a live pool.
last_block_atMost 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:

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.