Public data endpoints

The dapp's Worker exposes a few read-only endpoints backed by Robinhood Chain. They are public, cached at the edge, and rate-limited per IP. Base URL: https://dapp.intelena.app.

GET /api/prices

Chainlink oracle midpoints for every listed asset, read in one batched eth_call.

{
  "prices": { "ETH": 2516.6, "USDG": 0.99995, "TSLA": 365.9, "…": 0 },
  "updatedAt": { "ETH": "2026-09-13T05:18:40.000Z" },
  "sources": { "ETH": "chainlink" },
  "block": 61224585,
  "at": "2026-09-13T05:19:02.111Z"
}

Cached 30 s. 503 when the oracle key is not configured, 502 when every feed failed to decode.

GET /api/history?range=24h|7d

Rolling oracle history: one tick per asset every ~5 minutes (cron) plus any cache-miss price read, 7 days kept. Series are thinned to ≤ 96 points.

{
  "range": "24h",
  "series": { "ETH": [{ "at": 1789266000000, "price": 2510.2 }] },
  "change": { "ETH": 0.26 },
  "low": { "ETH": 2498.1 },
  "high": { "ETH": 2531.7 },
  "at": "2026-09-13T05:19:16.288Z"
}

change is percent from the first to the last tick in the range. Cached 2 min.

GET /api/token-meta

Token metadata (name, symbol, decimals, logo when the provider has one) for every listed asset. Cached 24 h.

POST /api/rpc

JSON-RPC proxy to Robinhood Chain for the app's own reads (eth_*, eth_sendRawTransaction, alchemy_getToken*; batches ≤ 100, bodies ≤ 256 KB). It exists so the browser never talks to a third-party RPC directly. Limits: 600 requests / minute per IP, 12,000 / minute globally → 429 with Retry-After.

Chain reference

Chain id4663 (Arbitrum Orbit)
Public RPChttps://rpc.mainnet.chain.robinhood.com
Explorerhttps://robinhoodchain.blockscout.com
AssetsETH, USDG (6 dec), TSLA, NVDA, AAPL, MSFT, AMZN, GOOGL, META, COIN, SPY, QQQ (18 dec)
Price sourceChainlink feed proxies (8 dec)
Public liquidityUniswap v3 (QuoterV2 / SwapRouter02 / UniversalRouter)

Contract addresses are in the dapp source: app/lib/chain.ts.