R

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 null with 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.