An Etherscan-compatible read API for Robinhood Chain, plus native endpoints for the things no other explorer of this chain publishes: the proven tokenized-stock registry, the curated label directory, and per-address reputation with its evidence.
None. The apikey parameter is accepted and ignored, so a client written against Etherscan needs no edit.
No enforced quota and no paid tiers exist yet. Requests are edge cached. Please be reasonable: every uncached call lands on a public upstream index.
Reads only. There are no write, broadcast, or verification-submission endpoints.
Chain 4663 · Robinhood Chain · gas coin ETH · RPC https://rpc.mainnet.chain.robinhood.com. Chain data comes from the chain's Blockscout index at https://robinhoodchain.blockscout.com/api/v2. The stock registry and labels are ours.
Two surfaces. One imitates Etherscan so existing tools work unchanged. One is native and returns data that only exists here.
| Path | Surface | Cache |
|---|---|---|
| /api/v1 | Etherscan-compatible, module and action parameters | s-maxage=5 |
| /api/v2/stocks | Verified tokenized-stock registry | s-maxage=300 |
| /api/v2/labels | Curated address labels with evidence | s-maxage=3600 |
| /api/v2/reputation | Reputation verdict for one address | s-maxage=300 |
| /api/search | Search, exact ticker matches pinned to the front | s-maxage=15 |
Examples below use a shell variable for the host, since the launch domain is not fixed yet.
HOST="https://vladscan.xyz"Every /api/v1 response, success or failure, is the same three-field object. Failures return HTTP 200 with status 0, exactly as Etherscan does, because that is what existing clients parse.
{
"status": "1",
"message": "OK",
"result": "<balance in wei, decimal string>"
}Unix seconds as a decimal string. Never milliseconds, never ISO.
Decimal strings in base units. Wei for the gas coin, token base units for transfers. No floats, no pre-division.
List actions with no rows return status 0 and the message No transactions found with an empty array, matching Etherscan.
Point an existing Etherscan client at /api/v1 and these work. Anything not listed returns status 0 with a message naming what is supported.
Latest balance only. A tag other than latest returns status 0: historical balance lookups are not implemented.
curl "$HOST/api/v1?module=account&action=balance\
&address=0x4783C67b63dE2B358Ac5951a7D41F47A38F3C046&tag=latest"Newest first, one upstream page. offset caps the row count at up to 1000. Cursor pagination across pages is not wired yet, so page, startblock and endblock are not honoured.
curl "$HOST/api/v1?module=account&action=txlist\
&address=0x4783C67b63dE2B358Ac5951a7D41F47A38F3C046&offset=25"{
"blockNumber": "<decimal height>",
"timeStamp": "<unix seconds>",
"hash": "0x… (32 bytes)",
"nonce": "<decimal>",
"from": "0x… (20 bytes)",
"to": "0x… (20 bytes, empty on contract creation)",
"value": "<wei, decimal string>",
"gas": "<gas limit, decimal>",
"gasPrice": "<wei per gas, decimal>",
"gasUsed": "<decimal>",
"isError": "0 | 1",
"txreceipt_status": "1 | 0 | '' when unmined",
"input": "0x… (raw calldata)",
"contractAddress": "0x… when this call created a contract, else ''",
"confirmations": "<decimal, derived from the head block>",
"methodId": "0x… (4 bytes, '' when there is no calldata)",
"functionName": "transfer(address to, uint256 value)"
}ERC-20 and ERC-721 transfers with tokenName, tokenSymbol and tokenDecimal. The upstream transfer index does not carry per-row gas or block fields, so those keys are omitted rather than filled with zeros. Join on hash if you need them.
curl "$HOST/api/v1?module=account&action=tokentx&address=0x…"The ABI arrives as a JSON string inside result, not as an array. That is Etherscan's shape, so parse it twice. Unverified contracts return status 0 with Contract source code not verified.
curl "$HOST/api/v1?module=contract&action=getabi\
&address=0xaF3D76f1834A1d425780943C99Ea8A608f8a93f9"An array of one object with SourceCode, ABI, ContractName, CompilerVersion, OptimizationUsed, Proxy and Implementation. Proxy is 1 when the index resolved an implementation, which is the case for every official stock token on this chain.
curl "$HOST/api/v1?module=contract&action=getsourcecode&address=0x…"getstatus returns { isError, errDescription } with the revert reason when the index has one. gettxreceiptstatus returns { status }, empty for a transaction that has not been mined.
This chain issues no block subsidy, so the whole reward is the fees the sequencer collected. blockReward carries those fees in wei and is omitted when the index does not report them. uncles is always empty: Orbit chains have no uncle mechanism, so that is a structural fact, not missing data.
ethprice returns ethusd and ethusd_timestamp. The ethbtcpair is omitted: no BTC quote is published for this chain's gas coin, and inventing one would be worse than omitting it. ethsupply returns status 0 for the same reason. The gas coin is bridged from L1 and no supply figure is exposed upstream.
These POST a JSON-RPC call to https://rpc.mainnet.chain.robinhood.com and return the RPC result inside the standard envelope. Read result, not result.result. For raw JSON-RPC without the envelope, call the chain RPC directly.
curl "$HOST/api/v1?module=proxy&action=eth_blockNumber"
# => { "status": "1", "message": "OK", "result": "0x<head block height, hex>" }Plain REST, plain JSON, no envelope. These are the reason to integrate us instead of an upstream index.
The tokenized-stock registry. Membership is proven, not curated: a token is official only when all four issuance signals agree. Its name matches the • Robinhood Token pattern, it is a beacon proxy, it runs the canonical Stock implementation, and it was deployed by the canonical issuer. Filter with ?ticker=AAPL. Add ?include=impostors for the 1 tokens that carry the naming pattern but fail one or more checks.
curl "$HOST/api/v2/stocks?ticker=AAPL"{
"generatedAt": "2026-07-18T18:43:51.521Z",
"canonical": {
"implementation": "0xb35490d6f9163de4f80d88dc75c3516eb64c5ae2",
"issuer": "0x4783c67b63de2b358ac5951a7d41f47a38f3c046",
"nameSuffix": "• Robinhood Token"
},
"count": 1,
"items": [
{
"address": "0xaF3D76f1834A1d425780943C99Ea8A608f8a93f9",
"ticker": "AAPL",
"company": "Apple",
"priceUsd": 343.14,
"holders": 18914,
"issuer": "0x4783c67b63de2b358ac5951a7d41f47a38f3c046",
"implementation": "0xb35490d6f9163de4f80d88dc75c3516eb64c5ae2",
"signals": {
"nameMatches": true,
"isBeaconProxy": true,
"canonicalImplementation": true,
"canonicalIssuer": true
},
"signalsPassed": 4,
"signalsTotal": 4,
"status": "official"
}
]
}priceUsd is the on-chain price reported for the token. It is not a real-world equity quote and some of these diverge sharply from one. We have no equities quote feed wired up, so no premium or discount comparison is available and none should be computed from this field. Label it as an on-chain price wherever you show it.
Curated address labels, each with the evidence that justifies it. Filter with ?category=stablecoin. Names are never inferred from an unverified token name: this chain has impersonation tokens called Multicall3, WETH and Uniswap, so an upstream search hit is not evidence of identity.
{
"count": 10,
"items": [
{
"address": "0xA4b000000000000000000073657175656e636572",
"name": "Robinhood Chain: Sequencer",
"category": "infrastructure",
"note": "Produces every block on the chain. Address tail spells \"sequencer\" in ASCII.",
"evidence": "Fee recipient / miner on all sampled blocks via /api/v2/blocks"
}
]
}One verdict for one address, with the registry and label context behind it. States are official-stock, verified-project, neutral, suspect and flagged-scam. Heuristics stop at suspect. The flagged-scam state requires a human-confirmed label, which is what humanConfirmed reports. A missing or malformed address returns HTTP 400 with { error }.
curl "$HOST/api/v2/reputation?address=0x465834D5BA3af2169E49B70A139448e59e3CA492"{
"address": "0x465834D5BA3af2169E49B70A139448e59e3CA492",
"state": "flagged-scam",
"reason": "Uses the \"NVIDIA • Robinhood Token\" name but is not a beacon proxy, does not run the Stock implementation, and was deployed by an unrelated address.",
"humanConfirmed": true,
"registry": {
"status": "impostor",
"ticker": "NVDA",
"signalsPassed": 1,
"signalsTotal": 4,
"failedSignals": [
"isBeaconProxy",
"canonicalImplementation",
"canonicalIssuer"
]
}
}Returns { items }. An exact ticker match from the registry is pinned to the front, so a query for AAPL can never lead with a copycat. Errors return an empty array with HTTP 200 rather than failing.
Registry generated 2026-07-18T18:43:51.521Z. Rebuild with node scripts/build-stock-registry.mjs. Browse the same data at /stocks and /labels.
Being straight about this matters more than looking complete: we front reads only.
Verification submission is not implemented here. There is no verifysourcecodehandler that does anything, and calling it returns status 0 with a pointer to the chain's own verifier. Verify against Blockscout, then read the verified source back through getsourcecode or getabi on this API.
forge verify-contract \
--chain-id 4663 \
--verifier blockscout \
--verifier-url https://robinhoodchain.blockscout.com/api \
0xYourContractAddress \
src/YourContract.sol:YourContract# Shape of an Etherscan-style verify. Against our host this returns
# status "0" today: we front reads, not verification submission.
forge verify-contract \
--chain-id 4663 \
--verifier etherscan \
--verifier-url $HOST/api/v1 \
0xYourContractAddress \
src/YourContract.sol:YourContractA verification proxy that forwards an Etherscan-format submission to the Blockscout verifier is the intended next step, so the second command becomes real without a client-side change. It is not shipped, so do not build against it yet.