# Robinhood Chain explorer

Source: https://www.scanner.net/docs/api/reference/rh-explorer

> Transactions, addresses, transfers, holdings, origin of funds, tokens, trades, charts, blocks, network stats and search resolution on Robinhood Chain.

The Robinhood Chain side of the [Explorer](/docs/explorer), as JSON. Every explorer route is free.

16 routes, all under `/rh/explorer`. Every path below is served under `https://api.scanner.net`, and every request carries the key header, so those two are not repeated per route. Shared errors, limits and response formats are in [Requests and errors](/docs/api/reference/conventions).

* **Response shape:** every route returns `{ "success": true, "data": ... }`. The response sections below describe `data`.
* **Per-IP limit:** 60 requests per minute per client IP, counted apart from the Solana explorer. See [Per-IP limits](/docs/api/reference/conventions#per-ip-limits).
* **Addresses:** `0x` plus 40 hex characters, either case. Responses use lowercase.
* **Cursors:** paged routes return `nextPageParams` (or `nextCursor` for trades), a JSON object. Send it back URL-encoded in `page` (or `cursor`) exactly as you received it. A malformed cursor starts again from the first page.
* **Route errors:** besides the errors below, any route can return `502 UPSTREAM_ERROR` when the chain indexer is unavailable.

Transaction [#transaction]

```http
GET /rh/explorer/tx/{hash}
```

One transaction, decoded and labelled.

| Parameter | In    | Type   | Required | Notes                                                                                                        |
| --------- | ----- | ------ | -------- | ------------------------------------------------------------------------------------------------------------ |
| `hash`    | path  | string | yes      | `0x` plus 64 hex characters.                                                                                 |
| `raw`     | query | string | no       | `1` or `true` adds `raw`, with the transaction, internal transactions and logs as the indexer returned them. |

```bash
curl "https://api.scanner.net/rh/explorer/tx/0xTX_HASH" \
  -H "x-api-key: $SCANNER_API_KEY"
```

**Response:** a `RobinhoodExplorerTransactionDetail`. Key fields: `txHash`, `blockNumber`, `blockTime` (or `null` while pending), `status`, `error`, `from`, `to`, `createdContract`, `value`, `valueUsd`, `fee`, `feeUsd`, `gasUsed`, `method`, `decodedInput`, `actions`, `tokenTransfers`, `nativeTransfers`, `internalTxs`, `logs`, `balanceChanges`, `tokens` and `identities`.

| Status | Code            | When                          |
| ------ | --------------- | ----------------------------- |
| 400    | `INVALID_INPUT` | Not a valid transaction hash. |
| 404    | `NOT_FOUND`     | Transaction not found.        |

Address [#address]

```http
GET /rh/explorer/address/{address}
```

A summary of any Robinhood Chain address.

| Parameter | In   | Type   | Required | Notes         |
| --------- | ---- | ------ | -------- | ------------- |
| `address` | path | string | yes      | `0x` address. |

```bash
curl "https://api.scanner.net/rh/explorer/address/0xADDRESS" \
  -H "x-api-key: $SCANNER_API_KEY"
```

**Response:** `address`, `ethBalance`, `ethUsdValue`, `detection` (`isToken`, `isContract`, `isWallet`, `contractName`), `identity`, `isVerified`, `token` when it is a token, `txCount` and `cachedScan`.

| Status | Code              | When                |
| ------ | ----------------- | ------------------- |
| 400    | `INVALID_ADDRESS` | Not a `0x` address. |

Address transactions [#address-transactions]

```http
GET /rh/explorer/address/{address}/txs
```

An address's transactions, newest first.

| Parameter   | In    | Type    | Required | Notes                                             |
| ----------- | ----- | ------- | -------- | ------------------------------------------------- |
| `address`   | path  | string  | yes      | `0x` address.                                     |
| `limit`     | query | integer | no       | 1 to 100. Default 25.                             |
| `page`      | query | string  | no       | `nextPageParams` from the previous page, as JSON. |
| `direction` | query | string  | no       | `in` or `out`.                                    |

```bash
curl "https://api.scanner.net/rh/explorer/address/0xADDRESS/txs?limit=50" \
  -H "x-api-key: $SCANNER_API_KEY"
```

**Response:** `transactions` (each with `txHash`, `blockNumber`, `blockTime`, `from`, `to`, `value`, `fee`, `method`, `status` and `direction`) and `nextPageParams` (`null` at the end).

| Status | Code              | When                                                            |
| ------ | ----------------- | --------------------------------------------------------------- |
| 400    | `INVALID_ADDRESS` | Not a `0x` address.                                             |
| 409    | `CONFLICT`        | The cursor is no longer valid. Start again from the first page. |

Address transfers [#address-transfers]

```http
GET /rh/explorer/address/{address}/transfers
```

ERC-20 transfers in and out of an address, about 50 per page.

| Parameter   | In    | Type   | Required | Notes                                                     |
| ----------- | ----- | ------ | -------- | --------------------------------------------------------- |
| `address`   | path  | string | yes      | `0x` address.                                             |
| `page`      | query | string | no       | `nextPageParams` from the previous page, as JSON.         |
| `direction` | query | string | no       | `in` or `out`.                                            |
| `token`     | query | string | no       | Only this token's `0x` address.                           |
| `from`      | query | string | no       | Comma-separated senders, at most 20. `-` prefix excludes. |
| `to`        | query | string | no       | Comma-separated recipients, same rules.                   |
| `amount`    | query | string | no       | Token amount range, `min-max`.                            |

```bash
curl "https://api.scanner.net/rh/explorer/address/0xADDRESS/transfers?direction=in" \
  -H "x-api-key: $SCANNER_API_KEY"
```

**Response:** `transfers` (each with `txHash`, `blockNumber`, `blockTime`, `token` (`address`, `symbol`, `name`, `decimals`, `priceUsd`), `amount`, `from`, `to` and `direction`) and `nextPageParams`.

| Status | Code              | When                                                            |
| ------ | ----------------- | --------------------------------------------------------------- |
| 400    | `INVALID_ADDRESS` | Not a `0x` address.                                             |
| 409    | `CONFLICT`        | The cursor is no longer valid. Start again from the first page. |

Address holdings [#address-holdings]

```http
GET /rh/explorer/address/{address}/holdings
```

The tokens an address holds now.

| Parameter | In   | Type   | Required | Notes         |
| --------- | ---- | ------ | -------- | ------------- |
| `address` | path | string | yes      | `0x` address. |

```bash
curl "https://api.scanner.net/rh/explorer/address/0xADDRESS/holdings" \
  -H "x-api-key: $SCANNER_API_KEY"
```

**Response:** `holdings` (each with `token`, `amount`, `priceUsd` and `usdValue`) and `totalUsdValue`.

| Status | Code              | When                |
| ------ | ----------------- | ------------------- |
| 400    | `INVALID_ADDRESS` | Not a `0x` address. |

Address origin [#address-origin]

```http
GET /rh/explorer/address/{address}/origin
```

Where an address's money came from, walked back to the first labelled entity, up to 10 hops. It works like the [Solana origin](/docs/api/reference/explorer#address-origin), including the per-IP budget for traces that aren't cached.

| Parameter | In   | Type   | Required | Notes         |
| --------- | ---- | ------ | -------- | ------------- |
| `address` | path | string | yes      | `0x` address. |

```bash
curl "https://api.scanner.net/rh/explorer/address/0xADDRESS/origin" \
  -H "x-api-key: $SCANNER_API_KEY"
```

**Response:** the same fields as the Solana origin, with three differences: hops carry `txHash` instead of `signature`, `terminalReason` is never `loop`, and `label` can be `E`, `PE` or `Proxy`.

| Status | Code              | When                                                       |
| ------ | ----------------- | ---------------------------------------------------------- |
| 400    | `INVALID_ADDRESS` | Not a `0x` address.                                        |
| 429    | `RATE_LIMITED`    | The trace isn't cached and the IP's trace budget is spent. |

Cached origins [#cached-origins]

```http
POST /rh/explorer/origins
```

Cached origin labels for up to 30 addresses. It never starts a trace. Same body and response as the [Solana route](/docs/api/reference/explorer#cached-origins), with `0x` addresses.

```bash
curl -X POST "https://api.scanner.net/rh/explorer/origins" \
  -H "x-api-key: $SCANNER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"addresses":["0xADDRESS"]}'
```

| Status | Code            | When                                                    |
| ------ | --------------- | ------------------------------------------------------- |
| 400    | `INVALID_INPUT` | The body has no non-empty `addresses` array of strings. |

Token [#token]

```http
GET /rh/explorer/token/{address}
```

A token's metadata, market stats, security flags, pools and top holders.

| Parameter | In   | Type   | Required | Notes               |
| --------- | ---- | ------ | -------- | ------------------- |
| `address` | path | string | yes      | Token `0x` address. |

```bash
curl "https://api.scanner.net/rh/explorer/token/0xTOKEN_ADDRESS" \
  -H "x-api-key: $SCANNER_API_KEY"
```

**Response:** a `RobinhoodExplorerTokenOverview`: `address`, `metadata`, `stats` (including `priceUsd`, `priceEth` and `liquidityBasis`), `security` (`isVerified`, `isStockToken`, `isMintable`, `hasOwner`, `ownerAddress`, `totalSupply`, `top10HolderPct`, `risks`), `pools`, `creator`, `createdAt`, `topHolders` (up to 100) and `cachedContractScan`.

| Status | Code           | When                |
| ------ | -------------- | ------------------- |
| 400    | `INVALID_MINT` | Not a `0x` address. |

Token transfers [#token-transfers]

```http
GET /rh/explorer/token/{address}/transfers
```

Transfers of one token, about 50 per page.

| Parameter | In    | Type   | Required | Notes                                                     |
| --------- | ----- | ------ | -------- | --------------------------------------------------------- |
| `address` | path  | string | yes      | Token `0x` address.                                       |
| `page`    | query | string | no       | `nextPageParams` from the previous page, as JSON.         |
| `from`    | query | string | no       | Comma-separated senders, at most 20. `-` prefix excludes. |
| `to`      | query | string | no       | Comma-separated recipients, same rules.                   |
| `amount`  | query | string | no       | Token amount range, `min-max`.                            |

```bash
curl "https://api.scanner.net/rh/explorer/token/0xTOKEN_ADDRESS/transfers" \
  -H "x-api-key: $SCANNER_API_KEY"
```

**Response:** the same shape as [Address transfers](#address-transfers).

| Status | Code           | When                                                            |
| ------ | -------------- | --------------------------------------------------------------- |
| 400    | `INVALID_MINT` | Not a `0x` address.                                             |
| 409    | `CONFLICT`     | The cursor is no longer valid. Start again from the first page. |

Token trades [#token-trades]

```http
GET /rh/explorer/token/{address}/trades
```

Buys and sells of a token, newest first, about 50 per page.

| Parameter | In    | Type   | Required | Notes                                             |
| --------- | ----- | ------ | -------- | ------------------------------------------------- |
| `address` | path  | string | yes      | Token `0x` address.                               |
| `cursor`  | query | string | no       | `nextCursor` from the previous page, as returned. |
| `side`    | query | string | no       | `buy` or `sell`.                                  |
| `minUsd`  | query | number | no       | Smallest trade in USD.                            |
| `maxUsd`  | query | number | no       | Largest trade in USD.                             |
| `wallet`  | query | string | no       | Only this wallet's trades.                        |

```bash
curl "https://api.scanner.net/rh/explorer/token/0xTOKEN_ADDRESS/trades?side=sell" \
  -H "x-api-key: $SCANNER_API_KEY"
```

**Response:** `trades` (each with `txHash`, `wallet`, `type`, `amountToken`, `quote`, `amountUsd`, `priceUsd` and `time` in unix milliseconds), `nextCursor` and `stillMore`.

| Status | Code            | When                                                            |
| ------ | --------------- | --------------------------------------------------------------- |
| 400    | `INVALID_MINT`  | Not a `0x` address.                                             |
| 400    | `INVALID_INPUT` | `minUsd` is greater than `maxUsd`.                              |
| 409    | `CONFLICT`      | The cursor is no longer valid. Start again from the first page. |

Token chart [#token-chart]

```http
GET /rh/explorer/token/{address}/chart
```

Price candles for a token.

| Parameter  | In    | Type    | Required | Notes                                                 |
| ---------- | ----- | ------- | -------- | ----------------------------------------------------- |
| `address`  | path  | string  | yes      | Token `0x` address.                                   |
| `interval` | query | string  | no       | `1m`, `5m`, `15m`, `1h`, `4h` or `1d`. Default `15m`. |
| `from`     | query | integer | no       | Start, unix seconds. Default 24 hours ago.            |
| `to`       | query | integer | no       | End, unix seconds.                                    |

```bash
curl "https://api.scanner.net/rh/explorer/token/0xTOKEN_ADDRESS/chart?interval=1h" \
  -H "x-api-key: $SCANNER_API_KEY"
```

**Response:** `{ "interval", "points": [{ "t", "open", "high", "low", "close", "volume" }] }`, with `t` in unix seconds.

| Status | Code           | When                |
| ------ | -------------- | ------------------- |
| 400    | `INVALID_MINT` | Not a `0x` address. |

Block [#block]

```http
GET /rh/explorer/block/{number}
```

A block and one page of its transactions.

| Parameter  | In    | Type    | Required | Notes                 |
| ---------- | ----- | ------- | -------- | --------------------- |
| `number`   | path  | integer | yes      | Block number.         |
| `page`     | query | integer | no       | Default 1.            |
| `pageSize` | query | integer | no       | 1 to 100. Default 25. |

```bash
curl "https://api.scanner.net/rh/explorer/block/BLOCK_NUMBER?pageSize=50" \
  -H "x-api-key: $SCANNER_API_KEY"
```

**Response:** `blockNumber`, `blockHash`, `parentHash`, `blockTime`, `miner`, `gasUsed`, `gasLimit`, `baseFeeGwei`, `txCount`, `transactions` (this page), `page`, `pageSize`, `totalPages`, and `truncated` when not every transaction could be loaded.

| Status | Code            | When                      |
| ------ | --------------- | ------------------------- |
| 400    | `INVALID_INPUT` | Not a valid block number. |
| 404    | `NOT_FOUND`     | Block not found.          |

Network [#network]

```http
GET /rh/explorer/network
```

Current Robinhood Chain network stats. No parameters.

```bash
curl "https://api.scanner.net/rh/explorer/network" \
  -H "x-api-key: $SCANNER_API_KEY"
```

**Response:** `blockNumber`, `avgBlockTimeMs`, `gasPriceGwei`, `tps`, `ethPriceUsd`, `totalTransactions`, `totalAddresses`, `recentBlocks` and `history`.

| Status | Code             | When                           |
| ------ | ---------------- | ------------------------------ |
| 503    | `INTERNAL_ERROR` | Network stats are unavailable. |

Live blocks and activity [#live-blocks-and-activity]

```http
GET /rh/explorer/network/blocks
GET /rh/explorer/network/activity
```

The 5 latest blocks, and up to 50 latest blocks with recent transactions. No parameters. Responses aren't cached.

```bash
curl "https://api.scanner.net/rh/explorer/network/activity" \
  -H "x-api-key: $SCANNER_API_KEY"
```

**Response:** `/network/blocks` returns a list of recent blocks. `/network/activity` returns `{ blocks, transactions, tps }`.

Resolve a search [#resolve-a-search]

```http
GET /rh/explorer/resolve
```

Works out what a search string is.

| Parameter | In    | Type   | Required | Notes                                                                                                            |
| --------- | ----- | ------ | -------- | ---------------------------------------------------------------------------------------------------------------- |
| `q`       | query | string | yes      | 1 to 100 characters: a transaction hash, address, block number or truncated address. ENS names are not resolved. |

```bash
curl "https://api.scanner.net/rh/explorer/resolve?q=0xADDRESS" \
  -H "x-api-key: $SCANNER_API_KEY"
```

**Response:** `{ "kind", "value" }`. `kind` is `tx`, `address`, `token`, `block`, `partial` (look it up with the [wallet finder](/docs/api/reference/lookups#wallet-finder)) or `unknown`.

| Status | Code            | When                               |
| ------ | --------------- | ---------------------------------- |
| 400    | `INVALID_INPUT` | `q` is missing, empty or too long. |
