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 id | 4663 (Arbitrum Orbit) |
| Public RPC | https://rpc.mainnet.chain.robinhood.com |
| Explorer | https://robinhoodchain.blockscout.com |
| Assets | ETH, USDG (6 dec), TSLA, NVDA, AAPL, MSFT, AMZN, GOOGL, META, COIN, SPY, QQQ (18 dec) |
| Price source | Chainlink feed proxies (8 dec) |
| Public liquidity | Uniswap v3 (QuoterV2 / SwapRouter02 / UniversalRouter) |
Contract addresses are in the dapp source: app/lib/chain.ts.