RH INTELlog in

API documentation

Public page. Auth for the API itself is an X-API-Key header; keys are issued per consumer.

Read API

endpointreturns
GET /v1/wallet/{address}/scoretier, hit_rate, realized_pnl_usd, closed_positions, median_multiple, weights_version, computed_ts
GET /v1/wallet/{address}class, first_seen, funder, flags, tx_count
GET /v1/token/{address}status, labels[], age_seconds, deployer, initial/last mcap, pools[]
GET /v1/token/{address}/clusterdistinct_buyers, sum_quote_usd, buyers[], funding_cluster, window_start
GET /v1/candles/{pool}?interval=1m&from=&to=own candles — quote-asset stamped
GET /v1/leaderboard?window=7dranked by realized PnL (closed, scam-excluded)
GET /v1/signals?type=&token=&wallet=&limit=signal history with full state snapshots
GET /v1/healthingest lag, stream lengths, gap counts, last reconciliation
WS /v1/streamlive signals, fixed predicate schema evaluated server-side

Answers come from precomputed Redis state and target < 5 ms server-side. If an answer is not cached the response is {"status":"not_indexed"} — the API never falls through to the database on the read path, which is what keeps consumer traffic off the pipeline. /v1/signals is the one documented exception: signal history is the record, not a cached answer.

Stream API — fixed predicate schema

Subscribe with named fields and operators only. There are no expressions and nothing from client input is evaluated beyond this schema. Predicates are checked server-side, one pass per event. An unknown field is rejected at subscribe time rather than ignored — a filter you mistyped must fail loudly, not silently firehose you.

fieldtypeoperatorsnotes
wallet_setstringin / == / !=named server-side list, e.g. list:james_tracked
min_wallet_tiernumber>= <= > < == !=satisfied by the BEST wallet in the cluster
min_quote_usd_eachnumber>= <= > < == !=satisfied by the SMALLEST buy — every buy must clear it
sum_quote_usdnumber>= <= > < == !=total quote value across the window
distinct_buyersnumber>= <= > < == !=distinct wallets, not trades
token_age_secondsnumber>= <= > < == !=since first sighting
mcap_usdnumber>= <= > < == !=derived from pool price × supply
funding_clusterboolean== !=two or more buyers share a funding parent
wallet_tx_count_maxnumber>= <= > < == !=satisfied by the BUSIEST wallet; from the on-chain nonce
deployer_flagboolean== !=
venuestring== != inv2 | v3 | v4
quote_assetstring== != inregistry address

Subscribe frame

{
  "action": "subscribe",
  "id": "james-cluster-1",
  "event_types": ["cluster_buy", "fresh_cluster", "serial_deployer_launch",
                  "rug_warning", "insider_distribution", "narrative_cluster",
                  "token_deployed", "first_liquidity"],
  "filters": [
    { "field": "wallet_set",          "op": "in",  "value": "list:james_tracked" },
    { "field": "min_wallet_tier",     "op": ">=",  "value": 2 },
    { "field": "min_quote_usd_each",  "op": ">=",  "value": 50 },
    { "field": "distinct_buyers",     "op": ">=",  "value": 3 },
    { "field": "token_age_seconds",   "op": "<=",  "value": 21600 },
    { "field": "mcap_usd",            "op": "<=",  "value": 500000 },
    { "field": "funding_cluster",     "op": "==",  "value": false },
    { "field": "wallet_tx_count_max", "op": "<=",  "value": 10 }
  ]
}

Delivery guarantees