Documentation
How the Robinhood Universe data platform works, what the numbers mean, and how to read them honestly.
Overview
The Universe Index is a decoded, serving layer above the chain’s retained raw store. It does not replace raw data — it links every value to its source evidence, publishes defined measurements, and preserves the exact revisions a decision used so results can be replayed.
It covers one network (Arbitrum-Nitro-style), decoding Uniswap-V3 swaps and native/bonding-curve trades into source-linked buys and sells, then builds 1-minute bars and r1/r5 momentum on top.
Quickstart
Base URL: https://data.amonhen.com/app/api. All responses are JSON. The API is authorized-only — passAuthorization: Bearer <API_KEY> on every request (request a key via pricing).
KEY="<your-api-key>" H="Authorization: Bearer $KEY" # chain-wide stats curl -H "$H" .../stats # top tokens by 24h volume curl -H "$H" ".../tokens?col=volume&dir=desc&limit=20" # one token + its holders and swaps curl -H "$H" .../token/0xaaaa...aaaa curl -H "$H" .../token/0xaaaa...aaaa/holders # markets, minute bars and momentum curl -H "$H" .../market/1/minutes curl -H "$H" .../market/1/momentum # live updates (Server-Sent Events; key as query token) curl -N ".../stream?token=$KEY"
See the API reference for every endpoint, parameter and response field.
Authentication & keys
The API is authorized-only. Every request carries an API key as a bearer token: Authorization: Bearer <API_KEY>. Unauthenticated API calls receive 401; browser pages redirect to sign-in.
Keys look like rhu_…. An admin creates and revokes them from the API keys page — a key is shown once at creation and stored only as a hash, so keep it secret and rotate it by revoking and creating a new one. Request access via pricing.
The live SSE stream can't set headers from a browser, so it takes the key as a query token: /stream?token=<API_KEY>.
# REST / SQL — Authorization header
curl -H "Authorization: Bearer <API_KEY>" \
"https://data.amonhen.com/app/api/tokens?col=volume&limit=10"
# Live stream — key as a query token
new EventSource("https://data.amonhen.com/app/api/stream?token=<API_KEY>")Data model
The index is built on eight core tables plus supporting evidence records:
- blocks — network-qualified block/time/hash lookup with a raw-store reference.
- tokens — metadata cache: decimals (with a status), supply, discovery/first-seen.
- pools — factory-created pools: token pair, fee, creation evidence.
- transfers — decoded ERC-20 transfer ledger (raw integer values + source identity).
- swaps — V3 and native trades with signed amounts, quote-unit price, price/adapter status.
- balances — running wallet balances with a generation + honest coverage status.
- token_stats — current display/analytics cache (price, volume, holders, …).
- cursor — stream position: contiguous-complete vs highest-seen, kept separate.
Supporting records (runs, coverage, publications, issues, metadata/market/minute/momentum versions, decision/quote/ledger/outcome) carry the evidence and let any output be traced and replayed.
Semantics & honesty
The platform is deliberate about not presenting guesses as facts:
- Verified decimals only. A failed metadata read yields
unknown, never a default 18; price is withheld (null), not guessed. - Quote-unit prices. Prices are quote-per-base. USD is shown on a named USDG-1:1 basis — not a validated USD feed.
- Adapter status. Native/bonding-curve prices are tagged
DISABLED_FOR_INTERPRETATION(adapter unapproved) — provisional evidence, not an approved price. - Balance coverage. Balances reflect transfers from the indexing coverage start only; provably-incomplete rows are flagged
NEGATIVE_INCOMPLETE, never clamped to zero. - Immutable revisions. Corrections append a new revision; conflicting payloads are quarantined — the serving row is never silently overwritten.
- Momentum. r1/r5 use the last eligible trade strictly before each anchor; a stale/missing anchor yields
nullwith a reason, never a substitute.
Anywhere a value is unknown, the API returns null and the UI shows “—”.
Freshness & limits
The indexer publishes on each block and the SSE stream pushes within ~1 second. Rolling windows (e.g. 24h volume) use exact elapsed time anchored to the processed watermark.
API access is authorized-only: every request needs a key and rate limits apply per tier. The web explorer on this site is free to browse; programmatic access to the raw endpoints requires a key.
Errors & pagination
Standard HTTP status codes:
200— success.400— a malformed request, or a rejected query (writes, DDL and multi-statement SQL are refused).401— missing or invalid API key.429— your plan's rate limit was exceeded.5xx— a server/index error; safe to retry with backoff.
List endpoints paginate with limit and offset (each endpoint's cap is in the API reference). The SQL query endpoint enforces a statement timeout and a hard row cap of 10,000 regardless of plan; a truncated result sets capped: true. Anywhere a value is unknown the API returns null — never a guess.