Data API
Programmatic access to the proprietary layer — role-classified insider flow, cost-basis ladders, exchange-flow attribution and our signal engine. This is derived analysis, not a chain-data mirror: prices and pool depth are available from any block explorer, and this is the part they cannot show.
API access is a paid product — choose a plan on pricing (each one includes full web access as well), then create a key in your account and send it as a bearer token. The key is shown once — we store only a hash and cannot recover it. One active key per account: to rotate, revoke the old one and create a replacement. Your monthly quota follows the account, not the key, so rotating does not reset it — or extend it.
curl
curl https://subnetstats.app/api/v1/screener \
-H "Authorization: Bearer sk_live_YOUR_KEY"
Insider classification is registration-block aware. A wallet only counts as an insider for trades it made while actually running a registered neuron on that subnet — which is what separates this from naive address tagging.
python
import requests
r = requests.get(
"https://subnetstats.app/api/v1/screener",
headers={"Authorization": "Bearer sk_live_YOUR_KEY"},
timeout=30,
)
r.raise_for_status()
payload = r.json()
for row in payload["data"][:5]:
print(row["netuid"], row["name"], "heat:", row["heat"], "psp:", row["psp"])
print("quota:", payload["quota"])
javascript
const res = await fetch("https://subnetstats.app/api/v1/screener", {
headers: { Authorization: "Bearer sk_live_YOUR_KEY" },
})
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`)
const { data, quota } = await res.json()
console.log(`${data.length} subnets, ${quota.remaining} requests left`)
Rate-limited requests do not consume monthly quota. A client stuck in a retry loop cannot burn a month of budget in minutes. Every response carries X-RateLimit-Remaining and X-Quota-Remaining — read them rather than guessing.
A 503 is never an empty array. If we cannot serve real data we say so with an error status; an empty result always means genuinely no rows, never a failure upstream.
Responses are cacheable (Cache-Control: s-maxage) because the underlying data is written once daily — caching on your side costs you nothing in quota.