stonk radar.

STONK RADAR API

StonkFun data,
ready for your app.

Use the normalized ecosystem graph behind the Stonk Radar terminal. Start with RuneScape / GP, follow child pairings such as Cracker, or query the full StonkFun index.

QUICK START
curl 'https://api.stonkradar.fun/v1/markets?ecosystem=runescape&sort=volume24h' \
  -H "Authorization: Bearer $STONK_RADAR_API_KEY"

Keep API keys on your server. The terminal’s browser proxy is for stonkradar.fun and is not a public client API.

Exact identityEvery market keeps token, quote mint and pool identity.
Honest nullsUnavailable values stay null; the UI renders them as —.
Source timestampsProvider, fetch time and source time remain separate.
Read-only v1Market discovery and analytics without swap execution.

ACCESS

Authentication

Send your key as a bearer token on every data request. Keys are issued with explicit read scopes and individual request limits.

Authorization: Bearer $STONK_RADAR_API_KEY
pairs:readRead the ecosystem and pairing directory.
tokens:readRead normalized token markets and analytics.

Do not put a key in browser JavaScript, query strings, source control, screenshots or logs. Use it from a server, worker or protected backend route.

TypeScript workspace client

import { StonkRadarClient } from '@stonk/contracts/client';

const radar = new StonkRadarClient({
  apiKey: process.env.STONK_RADAR_API_KEY!,
});

const markets = await radar.markets({
  ecosystem: 'runescape',
  sort: 'volume24h',
});

The typed client currently ships inside the Stonk Radar repository workspace and is not published to npm. External apps can use the REST endpoints and OpenAPI specification directly.

GET

/v1/ecosystems

Lists root ecosystems and their known descendant pairings. Each item includes its root mint, label, token and pairing counts, a depth-aware pairing graph, and a partial-coverage flag.

curl 'https://api.stonkradar.fun/v1/ecosystems?page=1&pageSize=100' \
  -H "Authorization: Bearer $STONK_RADAR_API_KEY"
pairs:readrequired scope

Single ecosystem

Use an exact root mint for one ecosystem. RuneScape’s root quote is GP.

curl 'https://api.stonkradar.fun/v1/ecosystems/HTmQz7My6MehV7bjhJ6jde8nDND1yvsz68d24LP7YgUQ' \
  -H "Authorization: Bearer $STONK_RADAR_API_KEY"

GET

/v1/markets

Returns a sortable page of token markets with quote identity, ecosystem roots, price, market cap, 24-hour volume, liquidity, lifecycle, graduation progress, reward distributions and freshness metadata.

curl 'https://api.stonkradar.fun/v1/markets?ecosystem=runescape&status=bonding&sort=progress&dir=desc&pageSize=50' \
  -H "Authorization: Bearer $STONK_RADAR_API_KEY"
tokens:readrequired scope
ecosystemUse runescape, all, or an exact ecosystem root mint.
quoteMintRestrict results to an exact quote/pair mint.
descendantsSet true to include markets below the selected root or quote.
qSearch token symbol, name or mint.
statusall, bonding, graduated, or unknown.
sortmarketCap, price, volume24h, liquidity, launched, or progress.
dirdesc or asc.
page / pageSizePositive page number; up to 100 results per page.

MODEL

Response shape

Collection endpoints use the same page envelope. Market responses also include aggregate summary data, normalized filters, and a human-readable coverage statement.

{
  "items": [
    {
      "mint": "…",
      "pool": "…",
      "quoteMint": "…",
      "quoteSymbol": "GP",
      "ecosystemRoots": ["HTmQz…YgUQ"],
      "lifecycle": "bonding",
      "graduation": {
        "progressPct": 72.4,
        "source": "StonkFun",
        "observedAt": "2026-09-24T16:00:00.000Z"
      },
      "rewards": {
        "quoteSymbol": "GP",
        "distributedTokens": 128400,
        "payoutCount": 42,
        "holderCount": 117,
        "lastPayoutAt": "2026-09-24T15:40:00.000Z"
      },
      "market": {
        "priceUsd": 0.0042,
        "marketCapUsd": 420000,
        "volume24hUsd": 18000,
        "liquidityUsd": null
      },
      "qualityFlags": [],
      "freshness": {
        "provider": "DexScreener",
        "sourceAt": null,
        "fetchedAt": "2026-09-24T16:00:03.000Z"
      }
    }
  ],
  "page": 1,
  "pageSize": 50,
  "total": 312,
  "totalPages": 7,
  "generatedAt": "2026-09-24T16:00:03.000Z",
  "summary": {
    "tokens": 312,
    "pools": 340,
    "excludedUnverifiedCaps": 0,
    "partial": true
  },
  "coverage": "…"
}

Fields that a provider does not supply remain null. Fetch time does not imply trade-time freshness, and a missing sourceAt remains missing. Valuations above $1 billion that also exceed both 24-hour volume and liquidity by more than 10,000× are flagged unverified_valuation and excluded from aggregate market cap while the raw row remains available for inspection.

OPERATIONS

Limits and freshness

Limits are attached to each key. Standard keys are commonly issued at 60 requests per minute, 10,000 per UTC day and 3 concurrent requests, but your key may differ. Read the response headers instead of assuming a fixed plan.

RateLimit-LimitYour per-minute limit.
RateLimit-RemainingRequests remaining in the current minute.
RateLimit-ResetSeconds until the minute resets.
Retry-AfterReturned with 429; wait before retrying.

Active terminal views receive faster refresh priority within bounded provider budgets. Historical and inactive pools may update more slowly, and upstream sources can omit a pool. Check each record’s freshness fields and the response coverage flags before presenting a value as current.

Need access or a different limit?Message @sokol_eth on Telegram with your app and expected traffic.